commit 577060bc7869216166775845f67c9d76acf9357c Author: Neo Yang Date: Thu Sep 10 09:42:09 2026 +0800 chore: 首次簽入 Thinkyu ASP.NET 專案 - 加入 Visual Studio / ASP.NET .gitignore - 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3d66f9c --- /dev/null +++ b/.gitignore @@ -0,0 +1,73 @@ +# ------------------------------ +# Visual Studio / ASP.NET +# ------------------------------ +# 建置結果 +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ +[Dd]ebug/ +[Rr]elease/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Pp]ublish/ +PrecompiledWeb/ + +# Visual Studio 使用者設定 +.vs/ +*.user +*.rsuser +*.suo +*.docstates.suo +*.userosscache +*.sln.docstates +*.userprefs + +# NuGet +packages/ +*.nupkg +*.snupkg +!**/packages/build/ +!**/packages/repositories.config +*.nuget.props +*.nuget.targets + +# 其他 IDE +.idea/ +.run/ +*.DotSettings.user + +# Subversion (此專案曾用 SVN) +.svn/ + +# ASP.NET / IIS +*.Cache +*.dll.refresh +*.pdb.refresh +*.cache +project.lock.json +project.fragment.lock.json +ClientBin/ +_UpgradeReport_Files/ +UpgradeLog*.XML +App_Data/*.mdf +App_Data/*.ldf +App_Data/Logs/ + +# 大型安裝檔(體積過大,不簽入版控) +Web/report/*.msi + +# 暫存與備份 +*.tmp +*.temp +*.bak +*.orig +*~ +*.log +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ diff --git a/BackupClient/BackupClient.csproj b/BackupClient/BackupClient.csproj new file mode 100644 index 0000000..280c8b4 --- /dev/null +++ b/BackupClient/BackupClient.csproj @@ -0,0 +1,91 @@ + + + + + Debug + AnyCPU + {B0221818-B149-4848-925B-C9FE63E3B727} + Exe + BackupClient + BackupClient + v3.5 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + True + True + Settings.settings + + + True + True + Reference.map + + + + + + + + + + + Dynamic + Web References\BackupService\ + http://thinkyustaff.com/backup/backupservice.asmx + + + + + Settings + BackupClient_BackupService_BackupService + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + MSDiscoCodeGenerator + Reference.cs + + + + \ No newline at end of file diff --git a/BackupClient/Program.cs b/BackupClient/Program.cs new file mode 100644 index 0000000..7179f6e --- /dev/null +++ b/BackupClient/Program.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BackupClient +{ + class Program + { + static void Main(string[] args) + { + var service = new BackupService.BackupService(); + + string[] files = service.GetFiles(@"h:\root\home\thinkyu-001\www\thinkyu\card\uploadedpicture\rpar_attachment\"); + + foreach (var file in files) + { + Console.WriteLine(file); + } + + Console.ReadLine(); + } + } +} diff --git a/BackupClient/Properties/AssemblyInfo.cs b/BackupClient/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..17f1467 --- /dev/null +++ b/BackupClient/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 組件的一般資訊是由下列的屬性集控制。 +// 變更這些屬性的值即可修改組件的相關 +// 資訊。 +[assembly: AssemblyTitle("BackupClient")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BackupClient")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 將 ComVisible 設為 false 可對 COM 元件隱藏 +// 組件中的類型。若必須從 COM 存取此組件中的類型, +// 的類型,請在該類型上將 ComVisible 屬性設定為 true。 +[assembly: ComVisible(false)] + +// 下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID +[assembly: Guid("b0221818-b149-4848-925b-c9fe63e3b727")] + +// 組件的版本資訊由下列四個值所組成: +// +// 主要版本 +// 次要版本 +// 組建編號 +// 修訂 +// +// 您可以指定所有的值,也可以使用 '*' 將組建和修訂編號 +// 設為預設,如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BackupClient/Properties/Settings.Designer.cs b/BackupClient/Properties/Settings.Designer.cs new file mode 100644 index 0000000..49aff06 --- /dev/null +++ b/BackupClient/Properties/Settings.Designer.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +//------------------------------------------------------------------------------ + +namespace BackupClient.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.1.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.WebServiceUrl)] + [global::System.Configuration.DefaultSettingValueAttribute("http://thinkyustaff.com/backup/backupservice.asmx")] + public string BackupClient_BackupService_BackupService { + get { + return ((string)(this["BackupClient_BackupService_BackupService"])); + } + } + } +} diff --git a/BackupClient/Properties/Settings.settings b/BackupClient/Properties/Settings.settings new file mode 100644 index 0000000..3f12c9f --- /dev/null +++ b/BackupClient/Properties/Settings.settings @@ -0,0 +1,9 @@ + + + + + + http://thinkyustaff.com/backup/backupservice.asmx + + + \ No newline at end of file diff --git a/BackupClient/Web References/BackupService/Reference.cs b/BackupClient/Web References/BackupService/Reference.cs new file mode 100644 index 0000000..5eb358b --- /dev/null +++ b/BackupClient/Web References/BackupService/Reference.cs @@ -0,0 +1,150 @@ +//------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +//------------------------------------------------------------------------------ + +// +// 原始程式碼已由 Microsoft.VSDesigner 自動產生,版本 4.0.30319.42000。 +// +#pragma warning disable 1591 + +namespace BackupClient.BackupService { + using System; + using System.Web.Services; + using System.Diagnostics; + using System.Web.Services.Protocols; + using System.Xml.Serialization; + using System.ComponentModel; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.7.3062.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Web.Services.WebServiceBindingAttribute(Name="BackupServiceSoap", Namespace="http://thinkyustaff.com/")] + public partial class BackupService : System.Web.Services.Protocols.SoapHttpClientProtocol { + + private System.Threading.SendOrPostCallback GetFilesOperationCompleted; + + private bool useDefaultCredentialsSetExplicitly; + + /// + public BackupService() { + this.Url = global::BackupClient.Properties.Settings.Default.BackupClient_BackupService_BackupService; + if ((this.IsLocalFileSystemWebService(this.Url) == true)) { + this.UseDefaultCredentials = true; + this.useDefaultCredentialsSetExplicitly = false; + } + else { + this.useDefaultCredentialsSetExplicitly = true; + } + } + + public new string Url { + get { + return base.Url; + } + set { + if ((((this.IsLocalFileSystemWebService(base.Url) == true) + && (this.useDefaultCredentialsSetExplicitly == false)) + && (this.IsLocalFileSystemWebService(value) == false))) { + base.UseDefaultCredentials = false; + } + base.Url = value; + } + } + + public new bool UseDefaultCredentials { + get { + return base.UseDefaultCredentials; + } + set { + base.UseDefaultCredentials = value; + this.useDefaultCredentialsSetExplicitly = true; + } + } + + /// + public event GetFilesCompletedEventHandler GetFilesCompleted; + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://thinkyustaff.com/GetFiles", RequestNamespace="http://thinkyustaff.com/", ResponseNamespace="http://thinkyustaff.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string[] GetFiles(string path) { + object[] results = this.Invoke("GetFiles", new object[] { + path}); + return ((string[])(results[0])); + } + + /// + public void GetFilesAsync(string path) { + this.GetFilesAsync(path, null); + } + + /// + public void GetFilesAsync(string path, object userState) { + if ((this.GetFilesOperationCompleted == null)) { + this.GetFilesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetFilesOperationCompleted); + } + this.InvokeAsync("GetFiles", new object[] { + path}, this.GetFilesOperationCompleted, userState); + } + + private void OnGetFilesOperationCompleted(object arg) { + if ((this.GetFilesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetFilesCompleted(this, new GetFilesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + public new void CancelAsync(object userState) { + base.CancelAsync(userState); + } + + private bool IsLocalFileSystemWebService(string url) { + if (((url == null) + || (url == string.Empty))) { + return false; + } + System.Uri wsUri = new System.Uri(url); + if (((wsUri.Port >= 1024) + && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) { + return true; + } + return false; + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.7.3062.0")] + public delegate void GetFilesCompletedEventHandler(object sender, GetFilesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.7.3062.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetFilesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetFilesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string[])(this.results[0])); + } + } + } +} + +#pragma warning restore 1591 \ No newline at end of file diff --git a/BackupClient/Web References/BackupService/Reference.map b/BackupClient/Web References/BackupService/Reference.map new file mode 100644 index 0000000..0a1e62a --- /dev/null +++ b/BackupClient/Web References/BackupService/Reference.map @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/BackupClient/Web References/BackupService/backupservice.disco b/BackupClient/Web References/BackupService/backupservice.disco new file mode 100644 index 0000000..0c2a8ae --- /dev/null +++ b/BackupClient/Web References/BackupService/backupservice.disco @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/BackupClient/Web References/BackupService/backupservice.wsdl b/BackupClient/Web References/BackupService/backupservice.wsdl new file mode 100644 index 0000000..e6d71de --- /dev/null +++ b/BackupClient/Web References/BackupService/backupservice.wsdl @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BackupClient/app.config b/BackupClient/app.config new file mode 100644 index 0000000..7310dc3 --- /dev/null +++ b/BackupClient/app.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + http://thinkyustaff.com/backup/backupservice.asmx + + + + \ No newline at end of file diff --git a/BackupService/BackupService.asmx b/BackupService/BackupService.asmx new file mode 100644 index 0000000..a5af2d6 --- /dev/null +++ b/BackupService/BackupService.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="BackupService.asmx.cs" Class="BackupService.BackupService" %> diff --git a/BackupService/BackupService.asmx.cs b/BackupService/BackupService.asmx.cs new file mode 100644 index 0000000..3ef9c3f --- /dev/null +++ b/BackupService/BackupService.asmx.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Web; +using System.Web.Services; +using System.Data.SqlClient; +using System.Web.Script.Services; +using System.Data; +using System.Text; +using System.IO.Compression; + + +namespace BackupService +{ + /// + ///BackupService 的摘要描述 + /// + [WebService(Namespace = "https://thinkyustaff.com/")] + [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] + [System.ComponentModel.ToolboxItem(false)] + [System.Web.Script.Services.ScriptService] + public class BackupService : System.Web.Services.WebService + { + + [WebMethod] + public string BackupTable() + { + string filePath = Server.MapPath("~/SQL"); + Directory.CreateDirectory(filePath); + BackupWorker worker = new BackupWorker(); + worker.DataPath = filePath; + worker.Begin(); + + return "OK"; + } + + [WebMethod] + public string BackupOneTable(string tableName) + { + string filePath = Server.MapPath("~/SQL"); + Directory.CreateDirectory(filePath); + BackupWorker worker = new BackupWorker(); + worker.DataPath = filePath; + worker.BackupOneTable(tableName); + + return "OK"; + } + + [WebMethod] + [ScriptMethod] + public List GetFileList(string path) + { + var result = new List(); + ListFiles(path, result); + return result; + } + + + private void ListFiles(string path, List fileLists) + { + var newPath = new FileList(); + newPath.Path = path; + foreach (var file in Directory.GetFiles(path)) + { + newPath.FileNames.Add(Path.GetFileName(file)); + } + fileLists.Add(newPath); + + foreach (var dir in Directory.GetDirectories(path)) + { + ListFiles(dir, fileLists); + } + } + + + [WebMethod] + [ScriptMethod] + public string GetFile(string path) + { + return Convert.ToBase64String(File.ReadAllBytes(path)); + } + + [Serializable] + public class FileList + { + public string Path { get; set; } + public List FileNames { get; set; } + + public FileList() + { + FileNames = new List(); + } + } + + public class TableItem + { + public string TableName { get; set; } + public bool HasIdentity { get; set; } + } + } +} diff --git a/BackupService/BackupService.csproj b/BackupService/BackupService.csproj new file mode 100644 index 0000000..b7be5f2 --- /dev/null +++ b/BackupService/BackupService.csproj @@ -0,0 +1,113 @@ + + + + Debug + AnyCPU + + + 2.0 + {A42DA595-C6E4-4658-8790-F6364DF91F84} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + BackupService + BackupService + v3.5 + true + + + + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + Web.config + + + Web.config + + + + + + + + + + BackupService.asmx + Component + + + + + Global.asax + + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + True + True + 49336 + / + http://localhost:49336/ + False + False + + + False + + + + + + \ No newline at end of file diff --git a/BackupService/BackupWorker.cs b/BackupService/BackupWorker.cs new file mode 100644 index 0000000..a236aa3 --- /dev/null +++ b/BackupService/BackupWorker.cs @@ -0,0 +1,254 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Timers; +using System.IO; +using System.Data.SqlClient; +using static BackupService.BackupService; +using System.Text; +using System.Data; +using System.IO.Compression; + +namespace BackupService +{ + public class BackupWorker + { + private string dataPath = null; + private Timer timer = null; + private string fromTable = null; + + public BackupWorker() + { + timer = new Timer(); + timer.AutoReset = false; + timer.Interval = 1000; + timer.Enabled = false; + timer.Elapsed += new ElapsedEventHandler(DoWork); + } + + public string DataPath + { + get { return dataPath; } + set { dataPath = value; } + } + + public void Begin(string fromTable = null) + { + this.fromTable = fromTable; + timer.Start(); + } + + public void BackupOneTable(string tableName) + { + var nowtime = DateTime.UtcNow.AddHours(8); + + try + { + using (var conn = new SqlConnection("Data Source=sql5060.site4now.net;Initial Catalog=DB_A48A46_thinkyu;Persist Security Info=True;User ID=DB_A48A46_thinkyu_admin;Password=VUPm4ej03xu3")) + { + conn.Open(); + var cmd = new SqlCommand(); + var da = new SqlDataAdapter(); + cmd.Connection = conn; + cmd.CommandText = @"SELECT INFORMATION_SCHEMA.TABLES.TABLE_NAME, Count(sys.identity_columns.Column_ID) as HAS_IDENTITY + FROM INFORMATION_SCHEMA.TABLES + LEFT JOIN sys.identity_columns on OBJECT_NAME(object_id) = INFORMATION_SCHEMA.TABLES.TABLE_NAME + WHERE TABLE_TYPE <> 'VIEW' and INFORMATION_SCHEMA.TABLES.TABLE_NAME = @TABLE_NAME + GROUP BY INFORMATION_SCHEMA.TABLES.TABLE_NAME"; + cmd.Parameters.AddWithValue("TABLE_NAME", tableName); + + var tableList = new List(); + + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + tableList.Add(new TableItem() { TableName = Convert.ToString(reader["TABLE_NAME"]), HasIdentity = Convert.ToInt32(reader["HAS_IDENTITY"]) == 1 }); + } + } + + foreach (var table in tableList) + { + var output = new StringBuilder(); + var columnnames = new List(); + cmd.CommandText = "select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@TABLE_NAME order by ORDINAL_POSITION "; + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("TABLE_NAME", table.TableName); + da.SelectCommand = cmd; + var columns = new DataTable(); + da.Fill(columns); + foreach (DataRow row in columns.Rows) + { + columnnames.Add(string.Format("[{0}]", row["COLUMN_NAME"])); + } + var columnlist = string.Join(", ", columnnames.ToArray()); + + output.AppendFormat("-- BACKUP DATE {0:yyyy/MM/dd HH:mm}\r\n", nowtime); + output.AppendFormat("-- TABLE [{0}]\r\n", table.TableName); + + if (table.HasIdentity) + output.AppendFormat("set identity_insert [{0}] on;\r\n", table.TableName); + + cmd.CommandText = string.Format("select * from [{0}]", table.TableName); + cmd.CreateParameter(); + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + var sql = string.Format("insert into [{0}] ({1}) values (", table.TableName, columnlist); + var values = new List(); + foreach (DataRow col in columns.Rows) + { + var colname = Convert.ToString(col["COLUMN_NAME"]); + var datatype = Convert.ToString(col["DATA_TYPE"]).ToLower(); + var value = reader[colname]; + + if (value == DBNull.Value) + values.Add("null"); + else if (datatype == "char" || datatype == "varchar") + values.Add(string.Format("'{0}'", value)); + else if (datatype == "nvarchar" || datatype == "nchar") + values.Add(string.Format("N'{0}'", value)); + else if (datatype == "nvarchar" || datatype == "datetime") + values.Add(string.Format("'{0:yyyy/MM/dd HH:mm:ss.fff}'", value)); + else if (datatype == "bit") + values.Add(string.Format("{0}", value)); + else + values.Add(string.Format("{0}", value)); + } + sql += string.Join(", ", values.ToArray()) + ");"; + output.AppendLine(sql); + } + } + + if (table.HasIdentity) + output.AppendFormat("set identity_insert [{0}] off;\r\n", table.TableName); + + var buffer = Encoding.UTF8.GetBytes(output.ToString()); + + using (FileStream stream = new FileStream(string.Format("{0}/{1}.gz", dataPath, table.TableName), FileMode.Create, FileAccess.Write)) + { + using (GZipStream gZip = new GZipStream(stream, CompressionMode.Compress)) + { + gZip.Write(buffer, 0, buffer.Length); + } + } + } + } + } + catch (Exception ex) + { + ErrorLogger.WriteException(ex); + } + } + + private void DoWork(object sender, ElapsedEventArgs e) + { + var nowtime = DateTime.UtcNow.AddHours(8); + + try + { + using (var conn = new SqlConnection("Data Source=sql5060.site4now.net;Initial Catalog=DB_A48A46_thinkyu;Persist Security Info=True;User ID=DB_A48A46_thinkyu_admin;Password=VUPm4ej03xu3")) + { + conn.Open(); + var cmd = new SqlCommand(); + var da = new SqlDataAdapter(); + cmd.Connection = conn; + cmd.CommandText = @"SELECT INFORMATION_SCHEMA.TABLES.TABLE_NAME, Count(sys.identity_columns.Column_ID) as HAS_IDENTITY + FROM INFORMATION_SCHEMA.TABLES + LEFT JOIN sys.identity_columns on OBJECT_NAME(object_id) = INFORMATION_SCHEMA.TABLES.TABLE_NAME + WHERE TABLE_TYPE <> 'VIEW' + GROUP BY INFORMATION_SCHEMA.TABLES.TABLE_NAME"; + + var tableList = new List(); + + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + string tableName = Convert.ToString(reader["TABLE_NAME"]); + bool hasIdentity = Convert.ToInt32(reader["HAS_IDENTITY"]) == 1; + + if (string.IsNullOrEmpty(this.fromTable) || tableName.CompareTo(this.fromTable) >= 0) { + tableList.Add(new TableItem() { TableName = tableName, HasIdentity = hasIdentity }); + } + } + } + + foreach (var table in tableList) + { + var output = new StringBuilder(); + var columnnames = new List(); + cmd.CommandText = "select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@TABLE_NAME order by ORDINAL_POSITION "; + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("TABLE_NAME", table.TableName); + da.SelectCommand = cmd; + var columns = new DataTable(); + da.Fill(columns); + foreach (DataRow row in columns.Rows) + { + columnnames.Add(string.Format("[{0}]", row["COLUMN_NAME"])); + } + var columnlist = string.Join(", ", columnnames.ToArray()); + + output.AppendFormat("-- BACKUP DATE {0:yyyy/MM/dd HH:mm}\r\n", nowtime); + output.AppendFormat("-- TABLE [{0}]\r\n", table.TableName); + + if (table.HasIdentity) + output.AppendFormat("set identity_insert [{0}] on;\r\n", table.TableName); + + cmd.CommandText = string.Format("select * from [{0}]", table.TableName); + cmd.CreateParameter(); + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + var sql = string.Format("insert into [{0}] ({1}) values (", table.TableName, columnlist); + var values = new List(); + foreach (DataRow col in columns.Rows) + { + var colname = Convert.ToString(col["COLUMN_NAME"]); + var datatype = Convert.ToString(col["DATA_TYPE"]).ToLower(); + var value = reader[colname]; + + if (value == DBNull.Value) + values.Add("null"); + else if (datatype == "char" || datatype == "varchar") + values.Add(string.Format("'{0}'", value)); + else if (datatype == "nvarchar" || datatype == "nchar") + values.Add(string.Format("N'{0}'", value)); + else if (datatype == "nvarchar" || datatype == "datetime") + values.Add(string.Format("'{0:yyyy/MM/dd HH:mm:ss.fff}'", value)); + else if (datatype == "bit") + values.Add(string.Format("{0}", value)); + else + values.Add(string.Format("{0}", value)); + } + sql += string.Join(", ", values.ToArray()) + ");"; + output.AppendLine(sql); + } + } + + if (table.HasIdentity) + output.AppendFormat("set identity_insert [{0}] off;\r\n", table.TableName); + + var buffer = Encoding.UTF8.GetBytes(output.ToString()); + + using (FileStream stream = new FileStream(string.Format("{0}/{1}.gz", dataPath, table.TableName), FileMode.Create, FileAccess.Write)) + { + using (GZipStream gZip = new GZipStream(stream, CompressionMode.Compress)) + { + gZip.Write(buffer, 0, buffer.Length); + } + } + } + } + } + catch (Exception ex) + { + ErrorLogger.WriteException(ex); + } + } + } +} \ No newline at end of file diff --git a/BackupService/ErrorLogger.cs b/BackupService/ErrorLogger.cs new file mode 100644 index 0000000..8e242f6 --- /dev/null +++ b/BackupService/ErrorLogger.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace BackupService +{ + public class ErrorLogger + { + private const string Message1 = @"錯誤類別:{0} +錯誤來源:{1} +錯誤訊息:{2} +堆疊內容: +{3} + +"; + + private const string Message2 = @"以上的錯誤發生的原因是: +錯誤類別:{0} +錯誤來源:{1} +錯誤訊息:{2} +堆疊內容: +{3} + +"; + + private static string logPath = null; + + public static string LogPath + { + get { return ErrorLogger.logPath; } + set { ErrorLogger.logPath = value; } + } + + + public static void WriteException(Exception ex) + { + // 發生未處理錯誤時執行的程式碼 + string Message = ""; + + Message += String.Format(ErrorLogger.Message1, + ex.GetType().FullName, + ex.Source, + ex.Message, + ex.StackTrace); + + ex = ex.InnerException; + while (ex != null) + { + Message += String.Format(ErrorLogger.Message2, + ex.GetType().FullName, + ex.Source, + ex.Message, + ex.StackTrace); + ex = ex.InnerException; + } + + //寫入文字檔 + string fileName = DateTime.UtcNow.AddHours(8).ToString("yyyyMMdd_HHmmss"); + System.IO.File.AppendAllText(string.Format(@"{0}/{1}.txt", ErrorLogger.logPath, fileName), Message); + } + } +} \ No newline at end of file diff --git a/BackupService/Global.asax b/BackupService/Global.asax new file mode 100644 index 0000000..abbcd43 --- /dev/null +++ b/BackupService/Global.asax @@ -0,0 +1 @@ +<%@ Application Codebehind="Global.asax.cs" Inherits="BackupService.Global" Language="C#" %> diff --git a/BackupService/Global.asax.cs b/BackupService/Global.asax.cs new file mode 100644 index 0000000..6520d7e --- /dev/null +++ b/BackupService/Global.asax.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.SessionState; + +namespace BackupService +{ + public class Global : System.Web.HttpApplication + { + + protected void Application_Start(object sender, EventArgs e) + { + string logPath = Server.MapPath("~/LOG"); + Directory.CreateDirectory(logPath); + ErrorLogger.LogPath = logPath; + } + + protected void Session_Start(object sender, EventArgs e) + { + + } + + protected void Application_BeginRequest(object sender, EventArgs e) + { + + } + + protected void Application_AuthenticateRequest(object sender, EventArgs e) + { + + } + + + protected void Application_Error(object sender, EventArgs e) + { + ErrorLogger.WriteException(Server.GetLastError()); + Server.ClearError(); + } + + protected void Session_End(object sender, EventArgs e) + { + + } + + protected void Application_End(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/BackupService/Properties/AssemblyInfo.cs b/BackupService/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0310a74 --- /dev/null +++ b/BackupService/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 組件的一般資訊是由下列的屬性集 +// 控制。變更這些屬性值可修改與組件關聯的 +// 資訊。 +[assembly: AssemblyTitle("BackupService")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BackupService")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 將 ComVisible 設定為 false 會使得這個組件中的型別 +// 對 COM 元件而言為不可見。如果您需要從 COM 存取此組件中 +// 的型別,請在該型別上將 ComVisible 屬性設定為 true。 +[assembly: ComVisible(false)] + +// 下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID +[assembly: Guid("a42da595-c6e4-4658-8790-f6364df91f84")] + +// 組件的版本資訊是由下列四項值構成: +// +// 主要版本 +// 次要版本 +// 組建編號 +// 修訂編號 +// +// 您可以指定所有的值,也可以依照以下的方式,使用 '*' 將修訂和組建編號 +// 指定為預設值: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BackupService/Properties/PublishProfiles/FolderProfile.pubxml b/BackupService/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..6c0d59d --- /dev/null +++ b/BackupService/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,18 @@ + + + + + FileSystem + FileSystem + Release + Any CPU + + True + False + D:\VS.NET\Thinkyu\BackupServiceRelease + False + + \ No newline at end of file diff --git a/BackupService/SQL/RLOG.gz b/BackupService/SQL/RLOG.gz new file mode 100644 index 0000000..41c2972 Binary files /dev/null and b/BackupService/SQL/RLOG.gz differ diff --git a/BackupService/Web.Debug.config b/BackupService/Web.Debug.config new file mode 100644 index 0000000..a791836 --- /dev/null +++ b/BackupService/Web.Debug.config @@ -0,0 +1,31 @@ + + + + + + + + + + \ No newline at end of file diff --git a/BackupService/Web.Release.config b/BackupService/Web.Release.config new file mode 100644 index 0000000..1aa1329 --- /dev/null +++ b/BackupService/Web.Release.config @@ -0,0 +1,32 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/BackupService/Web.config b/BackupService/Web.config new file mode 100644 index 0000000..25cdb86 --- /dev/null +++ b/BackupService/Web.config @@ -0,0 +1,109 @@ + + + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BackupServiceRelease/BackupService.asmx b/BackupServiceRelease/BackupService.asmx new file mode 100644 index 0000000..a5af2d6 --- /dev/null +++ b/BackupServiceRelease/BackupService.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="BackupService.asmx.cs" Class="BackupService.BackupService" %> diff --git a/BackupServiceRelease/Global.asax b/BackupServiceRelease/Global.asax new file mode 100644 index 0000000..abbcd43 --- /dev/null +++ b/BackupServiceRelease/Global.asax @@ -0,0 +1 @@ +<%@ Application Codebehind="Global.asax.cs" Inherits="BackupService.Global" Language="C#" %> diff --git a/BackupServiceRelease/Web.config b/BackupServiceRelease/Web.config new file mode 100644 index 0000000..1a22c22 --- /dev/null +++ b/BackupServiceRelease/Web.config @@ -0,0 +1,110 @@ + + + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DB/BRML.mdb b/DB/BRML.mdb new file mode 100644 index 0000000..85a1b6e Binary files /dev/null and b/DB/BRML.mdb differ diff --git a/DB/BWCP.mdb b/DB/BWCP.mdb new file mode 100644 index 0000000..88b0623 Binary files /dev/null and b/DB/BWCP.mdb differ diff --git a/DB/BWCP1.mdb b/DB/BWCP1.mdb new file mode 100644 index 0000000..f4679bb Binary files /dev/null and b/DB/BWCP1.mdb differ diff --git a/DB/DELETE ALL DATA.sql b/DB/DELETE ALL DATA.sql new file mode 100644 index 0000000..cd8f19a --- /dev/null +++ b/DB/DELETE ALL DATA.sql @@ -0,0 +1,16 @@ +DELETE FROM BPAA; +DELETE FROM BPAB; +DELETE FROM BPAC; +DELETE FROM BPJA; +DELETE FROM BPJB; +DELETE FROM BPSN; +DELETE FROM BPRJ; +DELETE FROM BPRP; +DELETE FROM BPSN; +DELETE FROM RASN; +DELETE FROM RPAR; +DELETE FROM RPFE; +DELETE FROM RPIR; +DELETE FROM RSAJ; +DELETE FROM SACD; +DELETE FROM SSMS; \ No newline at end of file diff --git a/DB/SQL 暫存.txt b/DB/SQL 暫存.txt new file mode 100644 index 0000000..370792d --- /dev/null +++ b/DB/SQL 暫存.txt @@ -0,0 +1,21 @@ +--oȤMסB~ױM׽sBHsY + +SELECT A.BPPNM, B.BPPYN, C.RANUM +FROM BPRJ A + INNER JOIN BPAA B ON A.BPPNM=B.BPPNM + INNER JOIN RASN C ON B.BPPYN=C.RAPYN +WHERE B.BPYER=97 + + +-- d [Z ֿnɥ +select RPREN AS [Z渹, RPRDT AS , RPRTM AS }lɶ, RPETM AS ɶ, RPDOC Ƶ, RPTCT ɼ, RPUST wR +from RPAR WHERE RPTYP='11' AND RPNUM='00989' + +-- d а ɥ +select RPREN AS а渹, RPRDT AS , RPRTM AS }lɶ, RPETM AS ɶ, RPDOC Ƶ, RPTCT ɼ, RPUST wR +from RPAR WHERE RPTYP='00' AND RPNUM='00989' + +-- d Rɥ +SELECT RPREN AS а渹, RPREX AS [Z渹, RPTCT AS RPɼ FROM RPAC WHERE RPREN= '2012061090' +SELECT RPREN AS а渹, RPREX AS [Z渹, RPTCT AS RPɼ FROM RPAC WHERE RPREN= '2012071108' +SELECT RPREN AS а渹, RPREX AS [Z渹, RPTCT AS RPɼ FROM RPAC WHERE RPREN= '2012071235' \ No newline at end of file diff --git a/DB/SQL.txt b/DB/SQL.txt new file mode 100644 index 0000000..a334768 --- /dev/null +++ b/DB/SQL.txt @@ -0,0 +1,2209 @@ +-- 2/4 +ALTER TABLE BPAB ADD BPDOC NVARCHAR(100) NULL ; +ALTER TABLE SACD ADD SADOC NVARCHAR(100) NULL ; + +-- 2/5 +ALTER TABLE BPAA ADD BPMSD DATETIME NULL; + +-- 2/12 +ALTER TABLE BPSN ADD BPSWY INT DEFAULT 0 ; +ALTER TABLE BPSN ADD BPBNK INT DEFAULT 0 ; +ALTER TABLE BPSN ADD BPACC INT DEFAULT 0 ; + +CREATE TABLE ROWK +(TRDAT DATETIME NULL +,TRMOD VARCHAR( 12) NULL +,TRUSR VARCHAR( 10) NULL +,ROENO NVARCHAR( 10) not NULL +,ROYMM DATETIME not NULL +,ROPYN NVARCHAR( 10) NULL +,ROT01 INT DEFAULT 0 +,ROT02 INT DEFAULT 0 +,ROT03 INT DEFAULT 0 +,ROA01 INT DEFAULT 0 +,ROA02 INT DEFAULT 0 +,ROA03 INT DEFAULT 0 +,APPNO INT DEFAULT 0 +); +ALTER TABLE ROWK ADD CONSTRAINT PK_ROWK PRIMARY KEY (ROENO,ROYMM); + +-- 2/15 +ALTER TABLE BPSN ADD BPDPT VARCHAR( 10) NULL ; + +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0040750', BPACC='075004824095' WHERE BPENO='00010' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060081', BPACC='0081765980739' WHERE BPENO='00011' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060620', BPACC='0620872110958' WHERE BPENO='00012' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0040875', BPACC='087004703596' WHERE BPENO='00013' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060110', BPACC='0110872282157' WHERE BPENO='00014' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065207', BPACC='012004745003' WHERE BPENO='00015' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060100', BPACC='0100765188215' WHERE BPENO='00016' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0050197', BPACC='019005542998' WHERE BPENO='00017' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060580', BPACC='0580765346327' WHERE BPENO='00018' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060120', BPACC='0120765592254' WHERE BPENO='00019' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060992', BPACC='0992765622762' WHERE BPENO='00020' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065311', BPACC='5311765806350' WHERE BPENO='00181' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060210', BPACC='0210872168944' WHERE BPENO='00183' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065207', BPACC='5207765901610' WHERE BPENO='00214' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061025', BPACC='0914765725676' WHERE BPENO='00215' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065436', BPACC='5436872499378' WHERE BPENO='00021' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061379', BPACC='0151765645334' WHERE BPENO='00022' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065436', BPACC='5436765479216' WHERE BPENO='00023' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0040417', BPACC='041008114683' WHERE BPENO='00024' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065447', BPACC='5447765961397' WHERE BPENO='00025' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061243', BPACC='1243765712797' WHERE BPENO='00026' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065632', BPACC='5632765227326' WHERE BPENO='00027' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061313', BPACC='1313765545228' WHERE BPENO='00028' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061243', BPACC='1243765552820' WHERE BPENO='00029' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065528', BPACC='5528765646017' WHERE BPENO='00030' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060187', BPACC='0180765700904' WHERE BPENO='00031' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065528', BPACC='5528765643735' WHERE BPENO='00032' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060039', BPACC='0030765874340' WHERE BPENO='00178' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061210', BPACC='1210872331717' WHERE BPENO='00185' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060190', BPACC='0190765996612' WHERE BPENO='00186' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060170', BPACC='0170765539563' WHERE BPENO='00198' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060150', BPACC='0150872130936' WHERE BPENO='00199' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065528', BPACC='5528765724271' WHERE BPENO='00202' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220872138951' WHERE BPENO='00033' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220872140646' WHERE BPENO='00034' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0040303', BPACC='030004632339' WHERE BPENO='00035' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061139', BPACC='1139765274933' WHERE BPENO='00036' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060210', BPACC='0210765736492' WHERE BPENO='00037' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060250', BPACC='0250765465903' WHERE BPENO='00038' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240872059751' WHERE BPENO='00040' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060230', BPACC='0230872096049' WHERE BPENO='00182' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060570', BPACC='0570765456577' WHERE BPENO='00196' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065850', BPACC='5850765299278' WHERE BPENO='00210' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065207', BPACC='5207765901253' WHERE BPENO='00212' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065436', BPACC='5436765479348' WHERE BPENO='00179' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0077017', BPACC='70151082961' WHERE BPENO='00180' +UPDATE BPSN SET BPDPT='X', BPSWY='2', BPBNK='', BPACC='' WHERE BPENO='00184' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065436', BPACC='5436765480010' WHERE BPENO='00187' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065436', BPACC='5436765502391' WHERE BPENO='00188' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060170', BPACC='0170765540669' WHERE BPENO='00206' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0040107', BPACC='010008006605' WHERE BPENO='00041' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065160', BPACC='5160765550276' WHERE BPENO='00042' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230872096049' WHERE BPENO='00044' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061173', BPACC='1173765093746' WHERE BPENO='00177' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220872140875' WHERE BPENO='00195' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065160', BPACC='5160765553275' WHERE BPENO='00234' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060230', BPACC='0230766009439' WHERE BPENO='00235' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220765082544' WHERE BPENO='00236' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0063029', BPACC='3029872005471' WHERE BPENO='00039' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220765082102' WHERE BPENO='00043' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061438', BPACC='1438872067611' WHERE BPENO='00133' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220872138871' WHERE BPENO='00134' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061715', BPACC='1715765601455' WHERE BPENO='00135' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065160', BPACC='5160765549316' WHERE BPENO='00136' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065160', BPACC='5160765549324' WHERE BPENO='00137' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065160', BPACC='5160765549332' WHERE BPENO='00138' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065160', BPACC='5160765549308' WHERE BPENO='00139' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220872138498' WHERE BPENO='00140' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065160', BPACC='5160765549286' WHERE BPENO='00141' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220765516579' WHERE BPENO='00142' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220872138447' WHERE BPENO='00143' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061128', BPACC='1128872003941' WHERE BPENO='00144' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065160', BPACC='5160765549294' WHERE BPENO='00145' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060578', BPACC='0570765457191' WHERE BPENO='00146' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060578', BPACC='0570765457158' WHERE BPENO='00147' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060578', BPACC='0570765457182' WHERE BPENO='00148' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060578', BPACC='0570765457174' WHERE BPENO='00149' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061656', BPACC='1656872208263' WHERE BPENO='00150' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060578', BPACC='0570765457166' WHERE BPENO='00151' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065540', BPACC='5540872001819' WHERE BPENO='00152' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060210', BPACC='0210872127717' WHERE BPENO='00153' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060202', BPACC='0200872039880' WHERE BPENO='00154' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210872127636' WHERE BPENO='00155' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210872188031' WHERE BPENO='00156' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210872127709' WHERE BPENO='00157' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210872127644' WHERE BPENO='00158' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872100098' WHERE BPENO='00159' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872100161' WHERE BPENO='00160' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872100403' WHERE BPENO='00161' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872102546' WHERE BPENO='00162' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872099715' WHERE BPENO='00163' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210765121471' WHERE BPENO='00164' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230872096502' WHERE BPENO='00165' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230765266781' WHERE BPENO='00166' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230872096022' WHERE BPENO='00167' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230872096014' WHERE BPENO='00168' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061139', BPACC='1139872015851' WHERE BPENO='00169' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230872095981' WHERE BPENO='00170' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765476438' WHERE BPENO='00171' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065609', BPACC='5609765548562' WHERE BPENO='00172' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765476471' WHERE BPENO='00173' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765476501' WHERE BPENO='00174' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061184', BPACC='1184765300743' WHERE BPENO='00175' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765476519' WHERE BPENO='00176' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220765956102' WHERE BPENO='00191' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765477965' WHERE BPENO='00192' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065610', BPACC='5610872001345' WHERE BPENO='00213' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060570', BPACC='0570765460493' WHERE BPENO='00216' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220872149511' WHERE BPENO='00217' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060210', BPACC='0210765767584' WHERE BPENO='00218' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060250', BPACC='0250872100098' WHERE BPENO='00219' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060690', BPACC='0690765667689' WHERE BPENO='00220' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065562', BPACC='5562765516109' WHERE BPENO='00221' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065160', BPACC='5160765553313' WHERE BPENO='00222' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220872149325' WHERE BPENO='00223' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060690', BPACC='0690765767110' WHERE BPENO='00224' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065540', BPACC='5540766022301' WHERE BPENO='00225' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060250', BPACC='0250872109575' WHERE BPENO='00226' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0062033', BPACC='2033765212564' WHERE BPENO='00227' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060250', BPACC='0250872109605' WHERE BPENO='00228' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061140', BPACC='1140872020578' WHERE BPENO='00229' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0063029', BPACC='3029872009832' WHERE BPENO='00230' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765552983' WHERE BPENO='00231' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060570', BPACC='0570872829785' WHERE BPENO='00237' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765145032' WHERE BPENO='00238' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060693', BPACC='0690765755324' WHERE BPENO='00045' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065171', BPACC='5171765378475' WHERE BPENO='00046' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061162', BPACC='1162765226108' WHERE BPENO='00047' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0062044', BPACC='2044765015531' WHERE BPENO='00048' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061128', BPACC='1128765237513' WHERE BPENO='00049' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061438', BPACC='1438765117266' WHERE BPENO='00050' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061438', BPACC='1438765608260' WHERE BPENO='00051' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060693', BPACC='0690766024374' WHERE BPENO='00052' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061807', BPACC='1807765177116' WHERE BPENO='00053' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220872138722' WHERE BPENO='00054' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061494', BPACC='1494765803540' WHERE BPENO='00055' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061070', BPACC='1070765302368' WHERE BPENO='00056' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065551', BPACC='5551765027611' WHERE BPENO='00057' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220872138714' WHERE BPENO='00058' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061162', BPACC='1162765233210' WHERE BPENO='00059' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061601', BPACC='1601717279899' WHERE BPENO='00060' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220765618754' WHERE BPENO='00061' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060578', BPACC='0570872828797' WHERE BPENO='00062' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060578', BPACC='0570872065297' WHERE BPENO='00063' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060578', BPACC='0570765378908' WHERE BPENO='00064' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065942', BPACC='5942765074871' WHERE BPENO='00065' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060578', BPACC='0570765419205' WHERE BPENO='00066' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060202', BPACC='0200872126146' WHERE BPENO='00067' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060202', BPACC='0200872126162' WHERE BPENO='00068' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0062077', BPACC='2077765709784' WHERE BPENO='00069' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060202', BPACC='0200872126171' WHERE BPENO='00070' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061715', BPACC='1715872533071' WHERE BPENO='00071' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065540', BPACC='5540766006151' WHERE BPENO='00072' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060202', BPACC='0200872126189' WHERE BPENO='00073' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210765857966' WHERE BPENO='00074' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210872128161' WHERE BPENO='00075' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210872127903' WHERE BPENO='00076' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210765120891' WHERE BPENO='00077' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061715', BPACC='1715872533021' WHERE BPENO='00078' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061715', BPACC='1715872533039' WHERE BPENO='00079' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210717038481' WHERE BPENO='00080' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210872086395' WHERE BPENO='00081' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210872128179' WHERE BPENO='00082' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210765718371' WHERE BPENO='00083' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065562', BPACC='5562765540409' WHERE BPENO='00084' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210765588361' WHERE BPENO='00085' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210872128993' WHERE BPENO='00086' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060213', BPACC='0210872128187' WHERE BPENO='00087' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220872119205' WHERE BPENO='00088' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061438', BPACC='1438765697149' WHERE BPENO='00089' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230765695011' WHERE BPENO='00090' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230872096251' WHERE BPENO='00091' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230765937880' WHERE BPENO='00092' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230765643738' WHERE BPENO='00093' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0063029', BPACC='3029765057182' WHERE BPENO='00094' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230765451928' WHERE BPENO='00095' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230765678086' WHERE BPENO='00096' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0063395', BPACC='3395765032241' WHERE BPENO='00097' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230872096201' WHERE BPENO='00098' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0063395', BPACC='3395765032283' WHERE BPENO='00099' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0063029', BPACC='3029765801124' WHERE BPENO='00100' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060235', BPACC='0230765981277' WHERE BPENO='00101' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061139', BPACC='1139765169340' WHERE BPENO='00102' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061139', BPACC='1139765275263' WHERE BPENO='00103' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061139', BPACC='1139765502901' WHERE BPENO='00104' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060693', BPACC='0690765139127' WHERE BPENO='00105' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765499489' WHERE BPENO='00106' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765476683' WHERE BPENO='00107' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765499519' WHERE BPENO='00108' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765499543' WHERE BPENO='00109' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765499497' WHERE BPENO='00110' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065621', BPACC='5621765083268' WHERE BPENO='00111' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765499535' WHERE BPENO='00112' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065609', BPACC='5609765614000' WHERE BPENO='00113' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061184', BPACC='1184765300859' WHERE BPENO='00114' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765499551' WHERE BPENO='00115' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061184', BPACC='1184765300832' WHERE BPENO='00116' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765476675' WHERE BPENO='00117' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240765476713' WHERE BPENO='00118' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872099863' WHERE BPENO='00119' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065573', BPACC='5573765428210' WHERE BPENO='00120' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872099928' WHERE BPENO='00121' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872099855' WHERE BPENO='00122' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060707', BPACC='0700717600080' WHERE BPENO='00123' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872099910' WHERE BPENO='00124' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872094667' WHERE BPENO='00125' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872099871' WHERE BPENO='00126' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872099880' WHERE BPENO='00127' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872099839' WHERE BPENO='00128' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250765418832' WHERE BPENO='00129' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872099901' WHERE BPENO='00130' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060707', BPACC='0700765260282' WHERE BPENO='00131' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060257', BPACC='0250872099847' WHERE BPENO='00132' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061070', BPACC='1070765619779' WHERE BPENO='00189' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060210', BPACC='0210717091251' WHERE BPENO='00190' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061726', BPACC='1726766001119' WHERE BPENO='00194' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060220', BPACC='0220765081921' WHERE BPENO='00201' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065621', BPACC='5621872081189' WHERE BPENO='00203' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060230', BPACC='0230765610848' WHERE BPENO='00204' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061184', BPACC='1184765302169' WHERE BPENO='00205' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060200', BPACC='0200872014291' WHERE BPENO='00207' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060210', BPACC='0210872184630' WHERE BPENO='00208' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0060240', BPACC='0240872072552' WHERE BPENO='00209' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0061025', BPACC='1025765112253' WHERE BPENO='00211' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0062055', BPACC='2055765231635' WHERE BPENO='00233' +UPDATE BPSN SET BPDPT='X', BPSWY='1', BPBNK='0065414', BPACC='5414765556853' WHERE BPENO='00197' +UPDATE BPSN SET BPDPT='TY', BPSWY='1', BPBNK='0065344', BPACC='5344765169410' WHERE BPENO='00003' +UPDATE BPSN SET BPDPT='TY', BPSWY='2', BPBNK='', BPACC='' WHERE BPENO='00008' +UPDATE BPSN SET BPDPT='TY', BPSWY='1', BPBNK='0040668', BPACC='066004969354' WHERE BPENO='00009' +UPDATE BPSN SET BPDPT='TY', BPSWY='1', BPBNK='0060450', BPACC='0450765344871' WHERE BPENO='00193' +UPDATE BPSN SET BPDPT='TY1', BPSWY='1', BPBNK='0060811', BPACC='0811765694343' WHERE BPENO='00004' +UPDATE BPSN SET BPDPT='TY2', BPSWY='1', BPBNK='0065447', BPACC='5447765961885' WHERE BPENO='00002' +UPDATE BPSN SET BPDPT='TY2', BPSWY='1', BPBNK='0060165', BPACC='0160872152650' WHERE BPENO='00005' +UPDATE BPSN SET BPDPT='TY3', BPSWY='1', BPBNK='0061405', BPACC='1405872979623' WHERE BPENO='00001' +UPDATE BPSN SET BPDPT='TY3', BPSWY='1', BPBNK='0060220', BPACC='0220872139001' WHERE BPENO='00006' +UPDATE BPSN SET BPDPT='TY3', BPSWY='1', BPBNK='0065160', BPACC='5160765422073' WHERE BPENO='00007' +UPDATE BPSN SET BPDPT='TY3', BPSWY='1', BPBNK='0060220', BPACC='0220872118381' WHERE BPENO='00232' + +CREATE TABLE [dbo].[BRML] ( + [BCNUM] [varchar] (13) NOT NULL , + [BCNAM] [varchar] (47) NULL , + [BCSNM] [varchar] (13) NULL , + [BCCJ5] [varchar] (7) NULL , + [BCCOD] [varchar] (9) NULL , + [BCADR] [varchar] (49) NULL , + [BCTEL] [varchar] (40) NULL , + [BLOCK] [varchar] (8) NULL , + [BCENA] [varchar] (50) NULL , + [BCENM] [varchar] (50) NULL , + [BCEAD] [varchar] (100) NULL , + [BCSWI] [varchar] (20) NULL , + [BCBNT] [varchar] (16) NULL , + [BCBUS] [varchar] (16) NULL , + [BCBJP] [varchar] (16) NULL , + [BCBEP] [varchar] (16) NULL , + [TRDAT] [datetime] NULL , + [TRUSR] [varchar] (10) NULL , + [TRMOD] [varchar] (12) NULL +) ON [PRIMARY] + +INSERT INTO BDPT (BDNUM, BDNAM, BDSNM) VALUES ('TY','x_`q','x_') +INSERT INTO BDPT (BDNUM, BDNAM, BDSNM) VALUES ('TY1','_q','_') +INSERT INTO BDPT (BDNUM, BDNAM, BDSNM) VALUES ('TY2','q','') +INSERT INTO BDPT (BDNUM, BDNAM, BDSNM) VALUES ('TY3','xq','x') +INSERT INTO BDPT (BDNUM, BDNAM, BDSNM) VALUES ('X','L','L') + +-- 2/19 suƻȦN~ +UPDATE BPSN SET BPBNK = '0061324' WHERE BPBNK = '0060081' +UPDATE BPSN SET BPBNK = '0060109' WHERE BPBNK = '0060100' +UPDATE BPSN SET BPBNK = '0060121' WHERE BPBNK = '0060120' +UPDATE BPSN SET BPBNK = '0060154' WHERE BPBNK = '0060150' +UPDATE BPSN SET BPBNK = '0060176' WHERE BPBNK = '0060170' +UPDATE BPSN SET BPBNK = '0060198' WHERE BPBNK = '0060190' +UPDATE BPSN SET BPBNK = '0060202' WHERE BPBNK = '0060200' +UPDATE BPSN SET BPBNK = '0060213' WHERE BPBNK = '0060210' +UPDATE BPSN SET BPBNK = '0060224' WHERE BPBNK = '0060220' +UPDATE BPSN SET BPBNK = '0060235' WHERE BPBNK = '0060230' +UPDATE BPSN SET BPBNK = '0060246' WHERE BPBNK = '0060240' +UPDATE BPSN SET BPBNK = '0060257' WHERE BPBNK = '0060250' +UPDATE BPSN SET BPBNK = '0060453' WHERE BPBNK = '0060450' +UPDATE BPSN SET BPBNK = '0060578' WHERE BPBNK = '0060570' +UPDATE BPSN SET BPBNK = '0060589' WHERE BPBNK = '0060580' +UPDATE BPSN SET BPBNK = '0060626' WHERE BPBNK = '0060620' +UPDATE BPSN SET BPBNK = '0060693' WHERE BPBNK = '0060690' + +-- 2/19 sOAאּK +UPDATE BCLS SET BSSCR = 'L' WHERE BSPAR = 'BPSNDIS' AND BSCLS = '0' +UPDATE BCLS SET BSSCR = '25%' WHERE BSPAR = 'BPSNDIS' AND BSCLS = '1' +UPDATE BCLS SET BSSCR = '50%' WHERE BSPAR = 'BPSNDIS' AND BSCLS = '2' +UPDATE BCLS SET BSSCR = '100%' WHERE BSPAR = 'BPSNDIS' AND BSCLS = '3' +DELETE BCLS WHERE BSPAR = 'BPSNDIS' AND BSCLS = '4' + +-- 2/19 [OW[T +ALTER TABLE RPIR ADD RPFM1 INT DEFAULT 0; +ALTER TABLE RPIR ADD RPFM2 INT DEFAULT 0; +ALTER TABLE RPIR ADD RPFM3 INT DEFAULT 0; +UPDATE RPIR SET RPFM1=0, RPFM2=0, RPFM3=0; + +-- 2/22 W[ BPRM TABLE +CREATE TABLE BPRM +(TRDAT DATETIME NULL +,TRMOD VARCHAR( 12) NULL +,TRUSR VARCHAR( 10) NULL +,BPPNM NVARCHAR( 10) not NULL +,BPENO NVARCHAR( 10) not NULL +,APPNO INT DEFAULT 0 +); +ALTER TABLE BPRM ADD CONSTRAINT PK_BPRM PRIMARY KEY (BPPNM,BPENO); + +-- 2/25 ROWK W[ +ALTER TABLE ROWK ADD ROT04 INT DEFAULT 0 ; +UPDATE ROWK SET ROT04=0; + +-- 2/25 SSMS W[ +ALTER TABLE SSMS ADD SSC01 NVARCHAR(254) NULL ; +ALTER TABLE SSMS ADD SSC02 NVARCHAR(254) NULL ; +ALTER TABLE SSMS ADD SSC03 NVARCHAR(254) NULL ; +ALTER TABLE SSMS ADD SSC04 NVARCHAR(254) NULL ; +ALTER TABLE SSMS ADD SSC05 NVARCHAR(254) NULL ; +ALTER TABLE SSMS ADD SSC06 NVARCHAR(254) NULL ; +ALTER TABLE SSMS ADD SSC07 NVARCHAR(254) NULL ; +ALTER TABLE SSMS ADD SSC08 NVARCHAR(254) NULL ; +ALTER TABLE SSMS ADD SSC09 NVARCHAR(254) NULL ; +ALTER TABLE SSMS ADD SSC10 NVARCHAR(254) NULL ; + +-- 2/27 W[ BFRT ֧Q TABLE +CREATE TABLE BFRT +(TRDAT DATETIME NULL +,TRMOD VARCHAR( 12) NULL +,TRUSR VARCHAR( 10) NULL +,BFIDN VARCHAR( 4) not NULL +,BFRTE INT DEFAULT 0 +,BFSDT DATETIME NULL +,BFEDT DATETIME NULL +,APPNO INT DEFAULT 0 +); +ALTER TABLE BFRT ADD CONSTRAINT PK_BFRT PRIMARY KEY (BFIDN); + +INSERT INTO BFRT (TRDAT, TRMOD, TRUSR, BFIDN, BFRTE, BFSDT, BFEDT, APPNO) +VALUES ('2008/2/1', 'INSERT', 'X002', '0001', 5, '2008/2/1', NULL, 1) + +-- 3/4 W[O +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPSNSWY', '1', 'Ȧb') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPSNSWY', '2', '{') + +-- 3/14 BPSN RPIR [Ƶ +ALTER TABLE BPSN ADD BPDOC NVARCHAR(254) NULL ; +ALTER TABLE RPIR ADD RPDOC NVARCHAR(254) NULL ; + +-- 3/28 RPIR W[ +ALTER TABLE RPIR ADD RPDIH VARCHAR( 1) NULL ; +UPDATE RPIR SET RPDIH=RPDIS; + +-- 4/3 RPIR W[ +ALTER TABLE RPIR ADD RPSLY INT DEFAULT 0 ; +UPDATE RPIR SET RPSLY=RPAMT; + +-- 4/3 W[ RPIB +CREATE TABLE RPIB +(TRDAT DATETIME NULL +,TRMOD VARCHAR( 12) NULL +,TRUSR VARCHAR( 10) NULL +,RPREN NVARCHAR( 10) not NULL +,RPITM INT not NULL +,RPENO NVARCHAR( 10) NULL +,RPBDT DATETIME NULL +,RPSDT DATETIME NULL +,RPEDT DATETIME NULL +,RPSLY INT DEFAULT 0 +,RPAMT INT DEFAULT 0 +,RPFMY INT DEFAULT 0 +,RPFM1 INT DEFAULT 0 +,RPFM2 INT DEFAULT 0 +,RPFM3 INT DEFAULT 0 +,RPSLA INT DEFAULT 0 +,RPDIS VARCHAR( 1) NULL +,RPDIH VARCHAR( 1) NULL +,RPOLD VARCHAR( 1) NULL +,RPNAT VARCHAR( 1) NULL +,RPPTP VARCHAR( 1) NULL +,RPLIS VARCHAR( 1) NULL +,RPHIS VARCHAR( 1) NULL +,RPDOC NVARCHAR(254) NULL +,APPNO INT DEFAULT 0 +); +ALTER TABLE RPIB ADD CONSTRAINT PK_RPIB PRIMARY KEY (RPREN,RPITM); +CREATE TABLE RPIBBAKD +(TRDAT DATETIME NULL +,TRMOD VARCHAR( 12) NULL +,TRUSR VARCHAR( 10) NULL +,RPREN NVARCHAR( 10) not NULL +,RPITM INT not NULL +,RPENO NVARCHAR( 10) NULL +,RPBDT DATETIME NULL +,RPSDT DATETIME NULL +,RPEDT DATETIME NULL +,RPSLY INT DEFAULT 0 +,RPAMT INT DEFAULT 0 +,RPFMY INT DEFAULT 0 +,RPFM1 INT DEFAULT 0 +,RPFM2 INT DEFAULT 0 +,RPFM3 INT DEFAULT 0 +,RPSLA INT DEFAULT 0 +,RPDIS VARCHAR( 1) NULL +,RPDIH VARCHAR( 1) NULL +,RPOLD VARCHAR( 1) NULL +,RPNAT VARCHAR( 1) NULL +,RPPTP VARCHAR( 1) NULL +,RPLIS VARCHAR( 1) NULL +,RPHIS VARCHAR( 1) NULL +,RPDOC NVARCHAR(254) NULL +,APPNO INT DEFAULT 0 +); + +-- W[~v + +CREATE TABLE [dbo].[SSMB]( + [TRDAT] [datetime] NULL, + [TRMOD] [varchar](12) NULL, + [TRUSR] [varchar](10) NULL, + [SSYMM] [datetime] NOT NULL, + [SSENO] [nvarchar](10) NOT NULL, + [SSNUM] [nvarchar](10) NULL, + [SSPYN] [nvarchar](10) NOT NULL, + [SSJNO] [varchar](2) NULL, + [SSCNO] [varchar](2) NULL, + [SSBRH] [nvarchar](50) NULL, + [SSD01] [int] NOT NULL DEFAULT (0), + [SSD02] [int] NOT NULL DEFAULT (0), + [SSSRD] [int] NOT NULL DEFAULT (0), + [SSP00] [int] NOT NULL DEFAULT (0), + [SSP01] [int] NOT NULL DEFAULT (0), + [SSP02] [int] NOT NULL DEFAULT (0), + [SSP03] [int] NOT NULL DEFAULT (0), + [SSP04] [int] NOT NULL DEFAULT (0), + [SSP05] [int] NOT NULL DEFAULT (0), + [SSP06] [int] NOT NULL DEFAULT (0), + [SSP07] [int] NOT NULL DEFAULT (0), + [SSP08] [int] NOT NULL DEFAULT (0), + [SSP09] [int] NOT NULL DEFAULT (0), + [SSP10] [int] NOT NULL DEFAULT (0), + [SSP11] [int] NOT NULL DEFAULT (0), + [SSP12] [int] NOT NULL DEFAULT (0), + [SSP13] [int] NOT NULL DEFAULT (0), + [SSP14] [int] NOT NULL DEFAULT (0), + [SSP15] [int] NOT NULL DEFAULT (0), + [SSP99] [int] NOT NULL DEFAULT (0), + [SSS01] [int] NOT NULL DEFAULT (0), + [SSS02] [int] NOT NULL DEFAULT (0), + [SSS03] [int] NOT NULL DEFAULT (0), + [SSS04] [int] NOT NULL DEFAULT (0), + [SSS05] [int] NOT NULL DEFAULT (0), + [SSS06] [int] NOT NULL DEFAULT (0), + [SSS07] [int] NOT NULL DEFAULT (0), + [SSS08] [int] NOT NULL DEFAULT (0), + [SSS09] [int] NOT NULL DEFAULT (0), + [SSS10] [int] NOT NULL DEFAULT (0), + [SSS11] [int] NOT NULL DEFAULT (0), + [SSS12] [int] NOT NULL DEFAULT (0), + [SSS13] [int] NOT NULL DEFAULT (0), + [SSS14] [int] NOT NULL DEFAULT (0), + [SSS15] [int] NOT NULL DEFAULT (0), + [SSS99] [int] NOT NULL DEFAULT (0), + [SSH01] [int] NOT NULL DEFAULT (0), + [SSH02] [int] NOT NULL DEFAULT (0), + [SSH03] [int] NOT NULL DEFAULT (0), + [SSH04] [int] NOT NULL DEFAULT (0), + [SSH05] [int] NOT NULL DEFAULT (0), + [SSH06] [int] NOT NULL DEFAULT (0), + [SSH07] [int] NOT NULL DEFAULT (0), + [SSH08] [int] NOT NULL DEFAULT (0), + [SSH09] [int] NOT NULL DEFAULT (0), + [SSH10] [int] NOT NULL DEFAULT (0), + [SST01] [int] NOT NULL DEFAULT (0), + [SST02] [int] NOT NULL DEFAULT (0), + [SST03] [int] NOT NULL DEFAULT (0), + [SST04] [int] NOT NULL DEFAULT (0), + [SST05] [int] NOT NULL DEFAULT (0), + [SST06] [int] NOT NULL DEFAULT (0), + [SST07] [int] NOT NULL DEFAULT (0), + [SST08] [int] NOT NULL DEFAULT (0), + [SST09] [int] NOT NULL DEFAULT (0), + [SST10] [int] NOT NULL DEFAULT (0), + [SST11] [int] NOT NULL DEFAULT (0), + [SST12] [int] NOT NULL DEFAULT (0), + [SST13] [int] NOT NULL DEFAULT (0), + [SST14] [int] NOT NULL DEFAULT (0), + [SST15] [int] NOT NULL DEFAULT (0), + [SST16] [int] NOT NULL DEFAULT (0), + [SST17] [int] NOT NULL DEFAULT (0), + [SST18] [int] NOT NULL DEFAULT (0), + [SST19] [int] NOT NULL DEFAULT (0), + [SST20] [int] NOT NULL DEFAULT (0), + [SSL01] [int] NOT NULL DEFAULT (0), + [SSL02] [int] NOT NULL DEFAULT (0), + [SSL03] [int] NOT NULL DEFAULT (0), + [SSL04] [int] NOT NULL DEFAULT (0), + [SSL05] [int] NOT NULL DEFAULT (0), + [SSC01] [nvarchar](254) NULL, + [SSC02] [nvarchar](254) NULL, + [SSC03] [nvarchar](254) NULL, + [SSC04] [nvarchar](254) NULL, + [SSC05] [nvarchar](254) NULL, + [SSC06] [nvarchar](254) NULL, + [SSC07] [nvarchar](254) NULL, + [SSC08] [nvarchar](254) NULL, + [SSC09] [nvarchar](254) NULL, + [SSC10] [nvarchar](254) NULL, + CONSTRAINT [PK_SSMB] PRIMARY KEY CLUSTERED +( + [SSYMM] ASC, + [SSENO] ASC, + [SSPYN] ASC +) ON [PRIMARY] +) ON [PRIMARY] + +ALTER TABLE UBWCPI ADD TRDAT DATETIME NULL ; +ALTER TABLE UBWCPI ADD TRMOD VARCHAR(12) NULL ; +ALTER TABLE UBWCPI ADD TRUSR VARCHAR(10) NULL ; +ALTER TABLE UBWCPI ADD TRVER INT DEFAULT 0 ; + +ALTER TABLE UBWCPT ADD TRDAT DATETIME NULL ; +ALTER TABLE UBWCPT ADD TRMOD VARCHAR(12) NULL ; +ALTER TABLE UBWCPT ADD TRUSR VARCHAR(10) NULL ; +ALTER TABLE UBWCPT ADD TRVER INT DEFAULT 0 ; + + +-- 4/11 9612 u۴֭p +UPDATE SSMS SET SSS06=16819 WHERE SSYMM='2007/12/31' AND SSENO='00045' AND SSPYN='TY' --dػ +UPDATE SSMS SET SSS06=19080 WHERE SSYMM='2007/12/31' AND SSENO='00025' AND SSPYN='TY' --_ +UPDATE SSMS SET SSS06=10081 WHERE SSYMM='2007/12/31' AND SSENO='00138' AND SSPYN='TY' --xT +UPDATE SSMS SET SSS06=8459 WHERE SSYMM='2007/12/31' AND SSENO='00181' AND SSPYN='TY' --dզp +UPDATE SSMS SET SSS06=10081 WHERE SSYMM='2007/12/31' AND SSENO='00145' AND SSPYN='TY' --ֵ +UPDATE SSMS SET SSS06=21112 WHERE SSYMM='2007/12/31' AND SSENO='00144' AND SSPYN='TY' --Lī +UPDATE SSMS SET SSS06=0 WHERE SSYMM='2007/12/31' AND SSENO='00147' AND SSPYN='TY' --G +UPDATE SSMS SET SSS06=0 WHERE SSYMM='2007/12/31' AND SSENO='00227' AND SSPYN='TY' --ʹ +UPDATE SSMS SET SSS06=0 WHERE SSYMM='2007/12/31' AND SSENO='00153' AND SSPYN='TY' --`^ +UPDATE SSMS SET SSS06=0 WHERE SSYMM='2007/12/31' AND SSENO='00244' AND SSPYN='TY' --L붳 + +UPDATE SSMB SET SSS06=16819 WHERE SSYMM='2007/12/31' AND SSENO='00045' AND SSPYN='TY' --dػ +UPDATE SSMB SET SSS06=19080 WHERE SSYMM='2007/12/31' AND SSENO='00025' AND SSPYN='TY' --_ +UPDATE SSMB SET SSS06=10081 WHERE SSYMM='2007/12/31' AND SSENO='00138' AND SSPYN='TY' --xT +UPDATE SSMB SET SSS06=8459 WHERE SSYMM='2007/12/31' AND SSENO='00181' AND SSPYN='TY' --dզp +UPDATE SSMB SET SSS06=10081 WHERE SSYMM='2007/12/31' AND SSENO='00145' AND SSPYN='TY' --ֵ +UPDATE SSMB SET SSS06=21112 WHERE SSYMM='2007/12/31' AND SSENO='00144' AND SSPYN='TY' --Lī +UPDATE SSMB SET SSS06=0 WHERE SSYMM='2007/12/31' AND SSENO='00147' AND SSPYN='TY' --G +UPDATE SSMB SET SSS06=0 WHERE SSYMM='2007/12/31' AND SSENO='00227' AND SSPYN='TY' --ʹ +UPDATE SSMB SET SSS06=0 WHERE SSYMM='2007/12/31' AND SSENO='00153' AND SSPYN='TY' --`^ +UPDATE SSMB SET SSS06=0 WHERE SSYMM='2007/12/31' AND SSENO='00244' AND SSPYN='TY' --L붳 + +-- 4/22 W[[ZOp覡 +ALTER TABLE BPRJ ADD BPOVR VARCHAR( 1) NOT NULL DEFAULT '1'; +UPDATE BPRJ SET BPOVR='1'; + +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPRJOVR','1','|ˤJ') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPRJOVR','2','L˥h') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPRJOVR','3','Li') + +-- 4/29 W[[ZOp覡O +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPRJOVR','4','O') + +-- 5/4 W[u~ƪAHέu~Ʋʪ +CREATE TABLE BPSL +(TRDAT DATETIME NULL +,TRMOD VARCHAR( 12) NULL +,TRUSR VARCHAR( 10) NULL +,BPENO NVARCHAR( 10) not NULL +,BPSRM INT DEFAULT 0 +,BPSRD INT DEFAULT 0 +,BPP01 INT DEFAULT 0 +,BPP02 INT DEFAULT 0 +,BPP03 INT DEFAULT 0 +,BPP04 INT DEFAULT 0 +,BPP05 INT DEFAULT 0 +,APPNO INT DEFAULT 0 +); +ALTER TABLE BPSL ADD CONSTRAINT PK_BPSL PRIMARY KEY (BPENO); + +CREATE TABLE RPSL +(TRDAT DATETIME NULL +,TRMOD VARCHAR( 12) NULL +,TRUSR VARCHAR( 10) NULL +,RPENO NVARCHAR( 10) not NULL +,RPITM INT not NULL +,RPBDT DATETIME NULL +,RPSRM INT DEFAULT 0 +,RPSRD INT DEFAULT 0 +,RPP01 INT DEFAULT 0 +,RPP02 INT DEFAULT 0 +,RPP03 INT DEFAULT 0 +,RPP04 INT DEFAULT 0 +,RPP05 INT DEFAULT 0 +,APPNO INT DEFAULT 0 +); +ALTER TABLE RPSL ADD CONSTRAINT PK_RPSL PRIMARY KEY (RPENO,RPITM); + +-- 5/9 [j~`H~ƥɳƵ +ALTER TABLE SSMS ALTER COLUMN SSC01 NVARCHAR(4000) +ALTER TABLE SSMS ALTER COLUMN SSC02 NVARCHAR(4000) +ALTER TABLE SSMS ALTER COLUMN SSC03 NVARCHAR(4000) +ALTER TABLE SSMS ALTER COLUMN SSC04 NVARCHAR(4000) +ALTER TABLE SSMS ALTER COLUMN SSC05 NVARCHAR(4000) +ALTER TABLE SSMS ALTER COLUMN SSC06 NVARCHAR(4000) +ALTER TABLE SSMS ALTER COLUMN SSC07 NVARCHAR(4000) +ALTER TABLE SSMS ALTER COLUMN SSC08 NVARCHAR(4000) +ALTER TABLE SSMS ALTER COLUMN SSC09 NVARCHAR(4000) +ALTER TABLE SSMS ALTER COLUMN SSC10 NVARCHAR(4000) + +ALTER TABLE SSMB ALTER COLUMN SSC01 NVARCHAR(4000) +ALTER TABLE SSMB ALTER COLUMN SSC02 NVARCHAR(4000) +ALTER TABLE SSMB ALTER COLUMN SSC03 NVARCHAR(4000) +ALTER TABLE SSMB ALTER COLUMN SSC04 NVARCHAR(4000) +ALTER TABLE SSMB ALTER COLUMN SSC05 NVARCHAR(4000) +ALTER TABLE SSMB ALTER COLUMN SSC06 NVARCHAR(4000) +ALTER TABLE SSMB ALTER COLUMN SSC07 NVARCHAR(4000) +ALTER TABLE SSMB ALTER COLUMN SSC08 NVARCHAR(4000) +ALTER TABLE SSMB ALTER COLUMN SSC09 NVARCHAR(4000) +ALTER TABLE SSMB ALTER COLUMN SSC10 NVARCHAR(4000) + +-- 6/3 [jMɥ[ZOpHμW[аڭp⤽ +ALTER TABLE BPRJ ALTER COLUMN BPOVR VARCHAR(4) ; +ALTER TABLE BPRJ ADD BPLVE VARCHAR(4) NOT NULL DEFAULT ''; + +CREATE TABLE BFRM +(TRDAT DATETIME NULL +,TRMOD VARCHAR( 12) NULL +,TRUSR VARCHAR( 10) NULL +,BFNUM VARCHAR( 4) not NULL +,BFNAM NVARCHAR( 50) NULL +,BFFRM NVARCHAR(254) NULL +,APPNO INT DEFAULT 0 +); +ALTER TABLE BFRM ADD CONSTRAINT PK_BFRM PRIMARY KEY (BFNUM); + +INSERT INTO BFRM (TRDAT, TRMOD, TRUSR, BFNUM, BFNAM, BFFRM, APPNO) VALUES ('2008/6/3','INSERT','X001','A001','[ZO (|ˤJA[`)','ROUND(ROUND(ROUND(@~/240, 0) + @뭹O/240, 0) * @[ZO * @ɼ, 0)',1); +INSERT INTO BFRM (TRDAT, TRMOD, TRUSR, BFNUM, BFNAM, BFFRM, APPNO) VALUES ('2008/6/3','INSERT','X001','A002','[ZO ([`A|ˤJ)','ROUND(ROUND(@~/240, 0) + @뭹O/240, 0) * @[ZO * @ɼ',1); +INSERT INTO BFRM (TRDAT, TRMOD, TRUSR, BFNUM, BFNAM, BFFRM, APPNO) VALUES ('2008/6/3','INSERT','X001','B001','а (~|ˤJ)','ROUND(ROUND(ROUND(@~/240, 0) + @뭹O/240, 0) * @ɼ, 0)',1); +INSERT INTO BFRM (TRDAT, TRMOD, TRUSR, BFNUM, BFNAM, BFFRM, APPNO) VALUES ('2008/6/3','INSERT','X001','B002','а (~|ˤJ)','ROUND((ROUND(@~/240, 0) + @뭹O/240) * @ɼ, 0)',1); + +UPDATE BPRJ SET BPLVE='B001'; +UPDATE BPRJ SET BPOVR='A001' WHERE BPOVR='1'; +UPDATE BPRJ SET BPOVR='A002' WHERE BPOVR='4'; + +-- 6/4 ק綠 +DELETE FROM BFRM +INSERT INTO BFRM (TRDAT, TRMOD, TRUSR, BFNUM, BFNAM, BFFRM, APPNO) VALUES ('2008/6/4','INSERT','X001','A001','_[ZO','ROUND((@~/240 + @뭹O/240) * @[ZO, 0) * @ɼ', 1); +INSERT INTO BFRM (TRDAT, TRMOD, TRUSR, BFNUM, BFNAM, BFFRM, APPNO) VALUES ('2008/6/4','INSERT','X001','A002','˭][ZO','ROUND((@~/240 + @뭹O/240) * @[ZO, 0) * @ɼ', 1); +INSERT INTO BFRM (TRDAT, TRMOD, TRUSR, BFNUM, BFNAM, BFFRM, APPNO) VALUES ('2008/6/4','INSERT','X001','A003','[ZO','ROUND(CEILING(@~/240 + @뭹O/240) * @[ZO * @ɼ, 0)',1); +INSERT INTO BFRM (TRDAT, TRMOD, TRUSR, BFNUM, BFNAM, BFFRM, APPNO) VALUES ('2008/6/4','INSERT','X001','B001','_а','ROUND(CEILING(@~/240 + @뭹O/240) * @ɼ, 0)',1); +INSERT INTO BFRM (TRDAT, TRMOD, TRUSR, BFNUM, BFNAM, BFFRM, APPNO) VALUES ('2008/6/4','INSERT','X001','B002','˭]а','ROUND((@~/240 + @뭹O/240) * @ɼ, 0)',1); +INSERT INTO BFRM (TRDAT, TRMOD, TRUSR, BFNUM, BFNAM, BFFRM, APPNO) VALUES ('2008/6/4','INSERT','X001','B003','а','ROUND(CEILING(@~/240 + @뭹O/240) * @ɼ, 0)',1); + + +-- 7/1 ק 96/12 q֭pҰhB +DELETE FROM SSMS WHERE SSYMM='2007/12/31' AND SSPYN='TY' +DELETE FROM SSMB WHERE SSYMM='2007/12/31' AND SSPYN='TY' +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00001', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00002', 34113, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00003', 34113, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00005', 25682, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00006', 34686, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00007', 19189, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00011', 45621, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00012', 45821, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00014', 33962, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00016', 41467, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00017', 37015, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00018', 31037, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00019', 20976, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00021', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00023', 21560, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00025', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00026', 39941, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00027', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00028', 25628, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00030', 41976, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00033', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00034', 47798, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00036', 44329, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00037', 45728, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00038', 42683, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00039', 47438, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00040', 44838, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00043', 42593, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00045', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00046', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00047', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00048', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00049', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00050', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00053', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00054', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00055', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00057', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00058', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00059', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00060', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00061', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00062', 22684, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00063', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00064', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00065', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00066', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00067', 24259, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00068', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00069', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00070', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00072', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00073', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00074', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00075', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00076', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00077', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00080', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00081', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00082', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00083', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00084', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00085', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00087', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00088', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00089', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00090', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00091', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00092', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00093', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00094', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00095', 26816, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00096', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00097', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00098', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00101', 22594, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00102', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00103', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00106', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00107', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00109', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00111', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00112', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00113', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00114', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00115', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00116', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00118', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00119', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00121', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00122', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00124', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00126', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00127', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00128', 23377, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00129', 21118, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00130', 22324, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00132', 20218, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00133', 23976, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00134', 23976, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00135', 21751, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00138', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00139', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00144', 23976, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00145', 46042, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00146', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00147', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00148', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00152', 23976, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00153', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00154', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00155', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00157', 21816, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00158', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00160', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00163', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00164', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00165', 21497, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00166', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00170', 23976, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00173', 22896, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00174', 19872, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00176', 23976, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00178', 24031, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00179', 15840, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00181', 20734, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00182', 12207, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00183', 19080, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00185', 17299, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00186', 17808, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00187', 14566, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00188', 13860, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00190', 16646, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00191', 17108, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00193', 16661, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00195', 14544, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00196', 14882, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00198', 15264, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00199', 15264, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00201', 17648, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00202', 13165, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00203', 12096, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00204', 13986, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00205', 13356, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00206', 12542, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00207', 10939, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00208', 10856, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00209', 9476, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00210', 9095, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00212', 6970, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00215', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00216', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00217', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00218', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00219', 5851, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00220', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00222', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00223', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00224', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00225', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00226', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00227', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00228', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00229', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00230', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00231', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00232', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00233', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00234', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00235', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00236', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00238', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00240', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00241', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00242', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00243', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00244', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00246', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00247', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00248', 0, 0) +INSERT INTO SSMS (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00249', 0, 0) + +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00001', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00002', 34113, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00003', 34113, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00005', 25682, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00006', 34686, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00007', 19189, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00011', 45621, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00012', 45821, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00014', 33962, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00016', 41467, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00017', 37015, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00018', 31037, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00019', 20976, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00021', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00023', 21560, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00025', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00026', 39941, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00027', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00028', 25628, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00030', 41976, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00033', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00034', 47798, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00036', 44329, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00037', 45728, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00038', 42683, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00039', 47438, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00040', 44838, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00043', 42593, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00045', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00046', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00047', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00048', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00049', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00050', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00053', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00054', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00055', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00057', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00058', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00059', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00060', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00061', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00062', 22684, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00063', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00064', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00065', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00066', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00067', 24259, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00068', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00069', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00070', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00072', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00073', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00074', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00075', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00076', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00077', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00080', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00081', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00082', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00083', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00084', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00085', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00087', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00088', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00089', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00090', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00091', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00092', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00093', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00094', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00095', 26816, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00096', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00097', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00098', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00101', 22594, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00102', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00103', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00106', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00107', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00109', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00111', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00112', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00113', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00114', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00115', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00116', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00118', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00119', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00121', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00122', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00124', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00126', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00127', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00128', 23377, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00129', 21118, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00130', 22324, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00132', 20218, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00133', 23976, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00134', 23976, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00135', 21751, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00138', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00139', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00144', 23976, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00145', 46042, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00146', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00147', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00148', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00152', 23976, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00153', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00154', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00155', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00157', 21816, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00158', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00160', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00163', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00164', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00165', 21497, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00166', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00170', 23976, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00173', 22896, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00174', 19872, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00176', 23976, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00178', 24031, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00179', 15840, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00181', 20734, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00182', 12207, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00183', 19080, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00185', 17299, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00186', 17808, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00187', 14566, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00188', 13860, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00190', 16646, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00191', 17108, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00193', 16661, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00195', 14544, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00196', 14882, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00198', 15264, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00199', 15264, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00201', 17648, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00202', 13165, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00203', 12096, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00204', 13986, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00205', 13356, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00206', 12542, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00207', 10939, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00208', 10856, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00209', 9476, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00210', 9095, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00212', 6970, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00215', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00216', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00217', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00218', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00219', 5851, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00220', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00222', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00223', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00224', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00225', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00226', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00227', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00228', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00229', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00230', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00231', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00232', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00233', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00234', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00235', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00236', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00238', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00240', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00241', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00242', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00243', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00244', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00246', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00247', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00248', 0, 0) +INSERT INTO SSMB (SSYMM, SSPYN, SSENO, SSH06, SSS06) VALUES ('2007/12/31', 'TY', '00249', 0, 0) + +-- 7/2 W[Hʸ +CREATE TABLE RASB +(TRDAT DATETIME NULL +,TRMOD VARCHAR( 12) NULL +,TRUSR VARCHAR( 10) NULL +,RANUM NVARCHAR( 10) not NULL +,RAITM INT not NULL +,RBITM INT not NULL +,RBBDT DATETIME NULL +,RACNM NVARCHAR( 10) NULL +,RAPYN NVARCHAR( 10) NULL +,RASDT DATETIME NULL +,RAEDT DATETIME NULL +,RAJNO VARCHAR( 2) NULL +,RACNO VARCHAR( 2) NULL +,RABRH NVARCHAR( 4) NULL +,RAS01 FLOAT DEFAULT 0 +,APPNO INT DEFAULT 0 +); +ALTER TABLE RASB ADD CONSTRAINT PK_RASB PRIMARY KEY (RANUM,RAITM,RBITM); + +-- 7/7 W[¾aOOOv]w +CREATE TABLE BIJT +(TRDAT DATETIME NULL +,TRMOD VARCHAR( 12) NULL +,TRUSR VARCHAR( 10) NULL +,BIIDN VARCHAR( 4) not NULL +,BIRTE FLOAT DEFAULT 0 +,BISDT DATETIME NULL +,BIEDT DATETIME NULL +,APPNO INT DEFAULT 0 +); +ALTER TABLE BIJT ADD CONSTRAINT PK_BIJT PRIMARY KEY (BIIDN); +INSERT INTO BIJT (BIIDN, BIRTE, BISDT, BIEDT, APPNO) VALUES ('0001', 0.001, '1899/12/31', '2008/6/30', 1) +INSERT INTO BIJT (BIIDN, BIRTE, BISDT, BIEDT, APPNO) VALUES ('0002', 0.0009, '2008/7/1', NULL, 1) + +-- 7/25 W[uƾǾ +ALTER TABLE BPSN ADD BPSTP VARCHAR( 1) NULL; +ALTER TABLE BPSN ADD BPST2 VARCHAR( 1) NULL; +ALTER TABLE BPSN ADD BPSC2 NVARCHAR( 20) NULL; +ALTER TABLE BPSN ADD BPSU2 NVARCHAR( 20) NULL; +ALTER TABLE BPSN ADD BPSG2 VARCHAR( 1) NULL; + +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, TRDAT, TRMOD, TRUSR) VALUES ('BPSNSTP', '3', '¾', '2008/7/25', 'INSERT', 'X001') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, TRDAT, TRMOD, TRUSR) VALUES ('BPSNSTP', '4', 'M', '2008/7/25', 'INSERT', 'X001') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, TRDAT, TRMOD, TRUSR) VALUES ('BPSNSTP', '5', 'j', '2008/7/25', 'INSERT', 'X001') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, TRDAT, TRMOD, TRUSR) VALUES ('BPSNSTP', '6', 's', '2008/7/25', 'INSERT', 'X001') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, TRDAT, TRMOD, TRUSR) VALUES ('BPSNSTP', '7', 'դhZ', '2008/7/25', 'INSERT', 'X001') + +-- 12/23 ŶZ BFDT W[Ƶ +ALTER TABLE BFDT ADD BFRMK VARCHAR(20) +GO + +UPDATE BFDT SET BFRMK='ҫOO' WHERE BFTYP=1 +UPDATE BFDT SET BFRMK='OO' WHERE BFTYP=2 +UPDATE BFDT SET BFRMK='Ұh۴' WHERE BFTYP=3 + +-- 12/31 W[Ov[c +CREATE TABLE BRTE +( + TRDAT DATETIME NULL, + TRMOD VARCHAR(12) NULL, + TRUSR VARCHAR(10) NULL, + BRTYP VARCHAR(30) NOT NULL, + BRVER SMALLINT NOT NULL, + BRRTE NUMERIC(10, 8) NOT NULL, + BRSDT DATETIME NULL, + BREDT DATETIME NULL, + APPNO INT NOT NULL +); +ALTER TABLE BRTE ADD CONSTRAINT PK_BRTE PRIMARY KEY (BRTYP, BRVER); +GO + +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2008/12/31', 'INSERT', 'X001', '֧Q', 1, 0.005, '2008/02/01', NULL, 1) +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2008/12/31', 'INSERT', 'X001', 'ҫO¾~a`', 1, 0.001, '1899/12/31', '2008/06/30', 1) +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2008/12/31', 'INSERT', 'X001', 'ҫO¾~a`', 2, 0.0009, '2008/07/01', NULL, 1) +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2008/12/31', 'INSERT', 'X001', 'ҫOq˯f', 1, 0.055, '1899/12/31', '2008/12/31', 1) +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2008/12/31', 'INSERT', 'X001', 'ҫOq˯f', 2, 0.065, '2009/01/01', NULL, 1) +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2008/12/31', 'INSERT', 'X001', 'ҫON~OI', 1, 0.01, '1899/12/31', NULL, 1) +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2008/12/31', 'INSERT', 'X001', 'ҫOuv', 1, 0.00025, '1899/12/31', NULL, 1) +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2008/12/31', 'INSERT', 'X001', 'O', 1, 0.0455, '1899/12/31', NULL, 1) + +-- 1/12 Rn BWEX ơAå[JK|B׳]w +DELETE FROM BWEX WHERE BSNUM<>'UNMWETA' +INSERT INTO BWEX (BSNUM, BSITM, BSNAM) VALUES ('UNBONUSTAXFREE', ' 1', '2000') + +-- 1/20 ƻs 97 ~Mצ 98 ~ +-- BPAA +INSERT INTO BPAA + (BPPNM, BPYER, BPPYN, BPPYM, BPBGT, BPCSD, BPMSD, BPS01, BPS02, BPS03, + BPS04, BPS05, BPS06, BPS07, BPS08, BPS09, BPS10, BPS11, BPS12, BPS13, + BPS14, BPS15, BPS16, BPS17, BPS18, BPS19, BPS20, BPS21, BPS22, BPS23, + BPS24, BPS25, BPS26, BPS27, BPS28, BPS29, BPS30, BPFED, APPNO, TRDAT, + TRMOD, TRUSR) +SELECT + BPPNM, 98, '098AGJ001', 'EQK~Ӯ׺޲z[SwHN~AȬu@ҰȻݨDpe', BPBGT, BPCSD, BPMSD, BPS01, BPS02, BPS03, + BPS04, BPS05, BPS06, BPS07, BPS08, BPS09, BPS10, BPS11, BPS12, BPS13, + BPS14, BPS15, BPS16, BPS17, BPS18, BPS19, BPS20, BPS21, BPS22, BPS23, + BPS24, BPS25, BPS26, BPS27, BPS28, BPS29, BPS30, BPFED, APPNO, TRDAT, + TRMOD, TRUSR +FROM BPAA +WHERE BPPYN='097AGJ001' + +INSERT INTO BPAA + (BPPNM, BPYER, BPPYN, BPPYM, BPBGT, BPCSD, BPMSD, BPS01, BPS02, BPS03, + BPS04, BPS05, BPS06, BPS07, BPS08, BPS09, BPS10, BPS11, BPS12, BPS13, + BPS14, BPS15, BPS16, BPS17, BPS18, BPS19, BPS20, BPS21, BPS22, BPS23, + BPS24, BPS25, BPS26, BPS27, BPS28, BPS29, BPS30, BPFED, APPNO, TRDAT, + TRMOD, TRUSR) +SELECT + BPPNM, 98, '098CGJ001', 'EQK~SwHN~AȭҰȻݨDpe', BPBGT, BPCSD, BPMSD, BPS01, BPS02, BPS03, + BPS04, BPS05, BPS06, BPS07, BPS08, BPS09, BPS10, BPS11, BPS12, BPS13, + BPS14, BPS15, BPS16, BPS17, BPS18, BPS19, BPS20, BPS21, BPS22, BPS23, + BPS24, BPS25, BPS26, BPS27, BPS28, BPS29, BPS30, BPFED, APPNO, TRDAT, + TRMOD, TRUSR +FROM BPAA +WHERE BPPYN='097CGJ001' + +INSERT INTO BPAA + (BPPNM, BPYER, BPPYN, BPPYM, BPBGT, BPCSD, BPMSD, BPS01, BPS02, BPS03, + BPS04, BPS05, BPS06, BPS07, BPS08, BPS09, BPS10, BPS11, BPS12, BPS13, + BPS14, BPS15, BPS16, BPS17, BPS18, BPS19, BPS20, BPS21, BPS22, BPS23, + BPS24, BPS25, BPS26, BPS27, BPS28, BPS29, BPS30, BPFED, APPNO, TRDAT, + TRMOD, TRUSR) +SELECT + BPPNM, 98, '098CGJ003', 'EQK~N~AȬu@ҰȻݨDpe', BPBGT, BPCSD, BPMSD, BPS01, BPS02, BPS03, + BPS04, BPS05, BPS06, BPS07, BPS08, BPS09, BPS10, BPS11, BPS12, BPS13, + BPS14, BPS15, BPS16, BPS17, BPS18, BPS19, BPS20, BPS21, BPS22, BPS23, + BPS24, BPS25, BPS26, BPS27, BPS28, BPS29, BPS30, BPFED, APPNO, TRDAT, + TRMOD, TRUSR +FROM BPAA +WHERE BPPYN='097CGJ003' + +INSERT INTO BPAA + (BPPNM, BPYER, BPPYN, BPPYM, BPBGT, BPCSD, BPMSD, BPS01, BPS02, BPS03, + BPS04, BPS05, BPS06, BPS07, BPS08, BPS09, BPS10, BPS11, BPS12, BPS13, + BPS14, BPS15, BPS16, BPS17, BPS18, BPS19, BPS20, BPS21, BPS22, BPS23, + BPS24, BPS25, BPS26, BPS27, BPS28, BPS29, BPS30, BPFED, APPNO, TRDAT, + TRMOD, TRUSR) +SELECT + BPPNM, 98, '098CGJ004', 'EQK~N~Aȥ~iu@pe(N~h)', BPBGT, BPCSD, BPMSD, BPS01, BPS02, BPS03, + BPS04, BPS05, BPS06, BPS07, BPS08, BPS09, BPS10, BPS11, BPS12, BPS13, + BPS14, BPS15, BPS16, BPS17, BPS18, BPS19, BPS20, BPS21, BPS22, BPS23, + BPS24, BPS25, BPS26, BPS27, BPS28, BPS29, BPS30, BPFED, APPNO, TRDAT, + TRMOD, TRUSR +FROM BPAA +WHERE BPPYN='097CGJ004' + +-- BPAB +INSERT INTO BPAB + (BPPYN, BPACC, BPAME, BPBGT, BPCLS, BPORD, BPDOC, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098AGJ001', BPACC, BPAME, BPBGT, BPCLS, BPORD, BPDOC, APPNO, TRDAT, TRMOD, TRUSR +FROM BPAB +WHERE BPPYN='097AGJ001' + +INSERT INTO BPAB + (BPPYN, BPACC, BPAME, BPBGT, BPCLS, BPORD, BPDOC, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098CGJ001', BPACC, BPAME, BPBGT, BPCLS, BPORD, BPDOC, APPNO, TRDAT, TRMOD, TRUSR +FROM BPAB +WHERE BPPYN='097CGJ001' + +INSERT INTO BPAB + (BPPYN, BPACC, BPAME, BPBGT, BPCLS, BPORD, BPDOC, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098CGJ003', BPACC, BPAME, BPBGT, BPCLS, BPORD, BPDOC, APPNO, TRDAT, TRMOD, TRUSR +FROM BPAB +WHERE BPPYN='097CGJ003' + +INSERT INTO BPAB + (BPPYN, BPACC, BPAME, BPBGT, BPCLS, BPORD, BPDOC, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098CGJ004', BPACC, BPAME, BPBGT, BPCLS, BPORD, BPDOC, APPNO, TRDAT, TRMOD, TRUSR +FROM BPAB +WHERE BPPYN='097CGJ004' + +-- BPJA +INSERT INTO BPJA + (BPPYN, BPJNO, BPJME, BPQTY, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098AGJ001', BPJNO, BPJME, BPQTY, APPNO, TRDAT, TRMOD, TRUSR +FROM BPJA +WHERE BPPYN='097AGJ001' + +INSERT INTO BPJA + (BPPYN, BPJNO, BPJME, BPQTY, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098CGJ001', BPJNO, BPJME, BPQTY, APPNO, TRDAT, TRMOD, TRUSR +FROM BPJA +WHERE BPPYN='097CGJ001' + +INSERT INTO BPJA + (BPPYN, BPJNO, BPJME, BPQTY, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098CGJ003', BPJNO, BPJME, BPQTY, APPNO, TRDAT, TRMOD, TRUSR +FROM BPJA +WHERE BPPYN='097CGJ003' + +INSERT INTO BPJA + (BPPYN, BPJNO, BPJME, BPQTY, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098CGJ004', BPJNO, BPJME, BPQTY, APPNO, TRDAT, TRMOD, TRUSR +FROM BPJA +WHERE BPPYN='097CGJ004' + +-- BPJB +INSERT INTO BPJB + (BPPYN, BPJNO, BPCNO, BPCME, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098AGJ001', BPJNO, BPCNO, BPCME, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO, TRDAT, TRMOD, TRUSR +FROM BPJB +WHERE BPPYN='097AGJ001' + +INSERT INTO BPJB + (BPPYN, BPJNO, BPCNO, BPCME, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098CGJ001', BPJNO, BPCNO, BPCME, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO, TRDAT, TRMOD, TRUSR +FROM BPJB +WHERE BPPYN='097CGJ001' + +INSERT INTO BPJB + (BPPYN, BPJNO, BPCNO, BPCME, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098CGJ003', BPJNO, BPCNO, BPCME, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO, TRDAT, TRMOD, TRUSR +FROM BPJB +WHERE BPPYN='097CGJ003' + +INSERT INTO BPJB + (BPPYN, BPJNO, BPCNO, BPCME, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + '098CGJ004', BPJNO, BPCNO, BPCME, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO, TRDAT, TRMOD, TRUSR +FROM BPJB +WHERE BPPYN='097CGJ004' + +-- RASN +INSERT INTO dbo.RASN + (RANUM, RAITM, RACNM, RAPYN, RASDT, RAEDT, RAJNO, RACNO, RABRH, RAS01, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + A.RANUM, (SELECT MAX(B.RAITM) + 1 FROM RASN B WHERE B.RANUM=A.RANUM) RAITM, A.RACNM, + '098AGJ001', '2009/01/01', NULL, A.RAJNO, A.RACNO, A.RABRH, A.RAS01, A.APPNO, A.TRDAT, A.TRMOD, A.TRUSR +FROM RASN A +WHERE RAPYN='097AGJ001' AND A.RAEDT IS NULL + +INSERT INTO dbo.RASN + (RANUM, RAITM, RACNM, RAPYN, RASDT, RAEDT, RAJNO, RACNO, RABRH, RAS01, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + A.RANUM, (SELECT MAX(B.RAITM) + 1 FROM RASN B WHERE B.RANUM=A.RANUM) RAITM, A.RACNM, + '098CGJ001', '2009/01/01', NULL, A.RAJNO, A.RACNO, A.RABRH, A.RAS01, A.APPNO, A.TRDAT, A.TRMOD, A.TRUSR +FROM RASN A +WHERE RAPYN='097CGJ001' AND A.RAEDT IS NULL + +INSERT INTO dbo.RASN + (RANUM, RAITM, RACNM, RAPYN, RASDT, RAEDT, RAJNO, RACNO, RABRH, RAS01, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + A.RANUM, (SELECT MAX(B.RAITM) + 1 FROM RASN B WHERE B.RANUM=A.RANUM) RAITM, A.RACNM, + '098CGJ003', '2009/01/01', NULL, A.RAJNO, A.RACNO, A.RABRH, A.RAS01, A.APPNO, A.TRDAT, A.TRMOD, A.TRUSR +FROM RASN A +WHERE RAPYN='097CGJ003' AND A.RAEDT IS NULL + +INSERT INTO dbo.RASN + (RANUM, RAITM, RACNM, RAPYN, RASDT, RAEDT, RAJNO, RACNO, RABRH, RAS01, APPNO, TRDAT, TRMOD, TRUSR) +SELECT + A.RANUM, (SELECT MAX(B.RAITM) + 1 FROM RASN B WHERE B.RANUM=A.RANUM) RAITM, A.RACNM, + '098CGJ004', '2009/01/01', NULL, A.RAJNO, A.RACNO, A.RABRH, A.RAS01, A.APPNO, A.TRDAT, A.TRMOD, A.TRUSR +FROM RASN A +WHERE RAPYN='097CGJ004' AND A.RAEDT IS NULL + +UPDATE RASN SET RAEDT='2008/12/31' WHERE RAPYN='097AGJ001' AND RAEDT IS NULL +UPDATE RASN SET RAEDT='2008/12/31' WHERE RAPYN='097CGJ001' AND RAEDT IS NULL +UPDATE RASN SET RAEDT='2008/12/31' WHERE RAPYN='097CGJ003' AND RAEDT IS NULL +UPDATE RASN SET RAEDT='2008/12/31' WHERE RAPYN='097CGJ004' AND RAEDT IS NULL + +-- 2/2 W[¾V +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPSNBRH', '0001', '¾~Vm') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPSNBRH', '0002', 's¾~Vm') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPSNBRH', '0003', '_¾~Vm') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPSNBRH', '0004', '¾~Vm') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPSNBRH', '0005', 'n¾~Vm') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPSNBRH', '0006', '¾~Vm') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPSNBRH', '0007', 'xn¾~Vm') + +-- 98/2/27 W[ SSMS +ALTER TABLE SSMS ADD SSITM VARCHAR(3) +UPDATE SSMS SET SSITM='001' + + +USE [THINKYU_WEB_TY] +GO +/****** : UserDefinedFunction [dbo].[SSMS_COMMENT] OX: 02/27/2009 09:48:57 ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +CREATE FUNCTION [dbo].[SSMS_COMMENT] +( + @SSYMM DATETIME, + @SSENO NVARCHAR(10), + @SSPYN NVARCHAR(10), + @FIELDNAME VARCHAR(10) +) +RETURNS NVARCHAR(4000) +AS +BEGIN + DECLARE @RESULT NVARCHAR(4000) + SET @RESULT = '' + + SELECT @RESULT = + CASE @FIELDNAME + WHEN 'SSC01' THEN @RESULT + ISNULL(SSC01, '') + WHEN 'SSC02' THEN @RESULT + ISNULL(SSC02, '') + WHEN 'SSC03' THEN @RESULT + ISNULL(SSC03, '') + WHEN 'SSC04' THEN @RESULT + ISNULL(SSC04, '') + WHEN 'SSC05' THEN @RESULT + ISNULL(SSC05, '') + WHEN 'SSC06' THEN @RESULT + ISNULL(SSC06, '') + WHEN 'SSC07' THEN @RESULT + ISNULL(SSC07, '') + WHEN 'SSC08' THEN @RESULT + ISNULL(SSC08, '') + WHEN 'SSC09' THEN @RESULT + ISNULL(SSC09, '') + WHEN 'SSC10' THEN @RESULT + ISNULL(SSC10, '') + END + FROM dbo.SSMS + WHERE SSYMM=@SSYMM + AND SSENO=@SSENO + AND SSPYN=@SSPYN + + RETURN @RESULT +END + +USE [THINKYU_WEB_TY] +GO +/****** : UserDefinedFunction [dbo].[SSMS_DATETIMEFIELD] OX: 02/27/2009 09:49:12 ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +-- ============================================= +-- Author: +-- Create date: +-- Description: +-- ============================================= +CREATE FUNCTION [dbo].[SSMS_DATETIMEFIELD] +( + @SSYMM DATETIME, + @SSENO NVARCHAR(10), + @SSPYN NVARCHAR(10), + @FIELDNAME VARCHAR(10) +) +RETURNS DATETIME +AS +BEGIN + DECLARE @RESULT DATETIME + + SELECT @RESULT = + CASE @FIELDNAME + WHEN 'TRDAT' THEN (SELECT TOP 1 TRDAT FROM SSMS WHERE SSYMM=@SSYMM AND SSENO=@SSENO AND SSPYN=@SSPYN ORDER BY SSITM DESC) + END + + RETURN @RESULT + +END + +USE [THINKYU_WEB_TY] +GO +/****** : UserDefinedFunction [dbo].[SSMS_STRINGFIELD] OX: 02/27/2009 09:49:21 ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +-- ============================================= +-- Author: +-- Create date: +-- Description: +-- ============================================= +CREATE FUNCTION [dbo].[SSMS_STRINGFIELD] +( + @SSYMM DATETIME, + @SSENO NVARCHAR(10), + @SSPYN NVARCHAR(10), + @FIELDNAME VARCHAR(10) +) +RETURNS NVARCHAR(50) +AS +BEGIN + DECLARE @RESULT NVARCHAR(50) + + SELECT @RESULT = + CASE @FIELDNAME + WHEN 'TRMOD' THEN (SELECT TOP 1 TRMOD FROM SSMS WHERE SSYMM=@SSYMM AND SSENO=@SSENO AND SSPYN=@SSPYN ORDER BY SSITM DESC) + WHEN 'TRUSR' THEN (SELECT TOP 1 TRUSR FROM SSMS WHERE SSYMM=@SSYMM AND SSENO=@SSENO AND SSPYN=@SSPYN ORDER BY SSITM DESC) + WHEN 'SSNUM' THEN (SELECT TOP 1 SSNUM FROM SSMS WHERE SSYMM=@SSYMM AND SSENO=@SSENO AND SSPYN=@SSPYN ORDER BY SSITM DESC) + WHEN 'SSJNO' THEN (SELECT TOP 1 SSJNO FROM SSMS WHERE SSYMM=@SSYMM AND SSENO=@SSENO AND SSPYN=@SSPYN ORDER BY SSITM DESC) + WHEN 'SSCNO' THEN (SELECT TOP 1 SSCNO FROM SSMS WHERE SSYMM=@SSYMM AND SSENO=@SSENO AND SSPYN=@SSPYN ORDER BY SSITM DESC) + WHEN 'SSBRH' THEN (SELECT TOP 1 SSBRH FROM SSMS WHERE SSYMM=@SSYMM AND SSENO=@SSENO AND SSPYN=@SSPYN ORDER BY SSITM DESC) + END + + RETURN @RESULT + +END + +USE [THINKYU_WEB_TY] +GO +/****** : View [dbo].[SSMS_VIEW] OX: 02/27/2009 09:44:27 ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE VIEW [dbo].[SSMS_VIEW] +AS +SELECT DISTINCT + SSYMM, SSENO, SSPYN, + dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'SSNUM') AS SSNUM, + dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'SSJNO') AS SSJNO, + dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'SSCNO') AS SSCNO, + dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'SSBRH') AS SSBRH, + SUM(SSD01) AS SSD01, + SUM(SSD02) AS SSD02, + (SELECT TOP 1 SSSRD FROM SSMS B WHERE B.SSYMM=SSYMM AND B.SSENO=SSENO AND B.SSPYN=SSPYN ORDER BY B.SSITM DESC) AS SSSRD, + SUM(SSP00) - dbo.SSMS_SSP00_ADJUST(SSYMM, SSENO, SSPYN, 'SSP00') AS SSP00, + SUM(SSP01) AS SSP01, + CASE WHEN SUM(SSP02) > 1800 THEN 1800 ELSE SUM(SSP02) END AS SSP02, + SUM(SSP03) AS SSP03, + SUM(SSP04) AS SSP04, + SUM(SSP05) AS SSP05, + SUM(SSP06) AS SSP06, + SUM(SSP07) AS SSP07, + SUM(SSP08) AS SSP08, + SUM(SSP09) AS SSP09, + SUM(SSP10) AS SSP10, + SUM(SSP11) AS SSP11, + SUM(SSP12) AS SSP12, + SUM(SSP13) AS SSP13, + SUM(SSP14) AS SSP14, + SUM(SSP15) AS SSP15, + SUM(SSP99) AS SSP99, + SUM(SSS01) AS SSS01, + SUM(SSS02) AS SSS02, + SUM(SSS03) AS SSS03, + SUM(SSS04) AS SSS04, + SUM(SSS05) AS SSS05, + SUM(SSS06) AS SSS06, + SUM(SSS07) - dbo.SSMS_SSP00_ADJUST(SSYMM, SSENO, SSPYN, 'SSS07') AS SSS07, + SUM(SSS08) AS SSS08, + SUM(SSS09) AS SSS09, + SUM(SSS10) AS SSS10, + SUM(SSS11) AS SSS11, + SUM(SSS12) AS SSS12, + SUM(SSS13) AS SSS13, + SUM(SSS14) AS SSS14, + SUM(SSS15) AS SSS15, + SUM(SSS99) AS SSS99, + SUM(SSH01) AS SSH01, + SUM(SSH02) AS SSH02, + SUM(SSH03) AS SSH03, + SUM(SSH04) AS SSH04, + SUM(SSH05) AS SSH05, + SUM(SSH06) AS SSH06, + SUM(SSH07) AS SSH07, + SUM(SSH08) AS SSH08, + SUM(SSH09) AS SSH09, + SUM(SSH10) AS SSH10, + SUM(SST01) AS SST01, + SUM(SST02) AS SST02, + SUM(SST03) AS SST03, + SUM(SST04) AS SST04, + SUM(SST05) AS SST05, + SUM(SST06) AS SST06, + SUM(SST07) AS SST07, + SUM(SST08) AS SST08, + SUM(SST09) AS SST09, + SUM(SST10) AS SST10, + SUM(SST11) AS SST11, + SUM(SST12) AS SST12, + SUM(SST13) AS SST13, + SUM(SST14) AS SST14, + SUM(SST15) AS SST15, + SUM(SST16) AS SST16, + SUM(SST17) AS SST17, + SUM(SST18) AS SST18, + SUM(SST19) AS SST19, + SUM(SST20) AS SST20, + SUM(SSL01) AS SSL01, + SUM(SSL02) AS SSL02, + SUM(SSL03) AS SSL03, + SUM(SSL04) AS SSL04, + SUM(SSL05) AS SSL05, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC01') AS SSC01, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC02') AS SSC02, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC03') AS SSC03, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC04') AS SSC04, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC05') AS SSC05, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC06') AS SSC06, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC07') AS SSC07, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC08') AS SSC08, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC09') AS SSC09, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC10') AS SSC10, + dbo.SSMS_DATETIMEFIELD(SSYMM, SSENO, SSPYN, 'TRDAT') AS TRDAT, + dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'TRMOD') AS TRMOD, + dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'TRUSR') AS TRUSR + +FROM dbo.SSMS +GROUP BY SSYMM, SSENO, SSPYN +GO + +-- W[~p覡AHάUMצ~ױ +ALTER TABLE BPAA ADD BPSAL CHAR(1) +UPDATE BPAA SET BPSAL='1' +UPDATE BPSS SET BPSAL='2' WHERE BPYER=98 AND BPPNM IN ('CGJ001', 'CGJ002', 'CGJ003', 'CGJ004') + + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE FUNCTION [dbo].[SSMS_SSP00_ADJUST] +( + @SSYMM DATETIME, + @SSENO NVARCHAR(10), + @SSPYN NVARCHAR(10), + @FIELDNAME NVARCHAR(10) +) +RETURNS INT +AS +BEGIN + DECLARE @RESULT FLOAT + DECLARE @RECCOUNT INT + DECLARE @DAYS INT + DECLARE @MONTHDAYS INT + SET @RESULT = 0 + + SELECT @RECCOUNT = COUNT(1), @DAYS = SUM(SSD01) + FROM dbo.SSMS + WHERE SSYMM = @SSYMM + AND SSENO = @SSENO + AND SSPYN = @SSPYN + IF @RECCOUNT > 1 + BEGIN + SELECT + @MONTHDAYS = CASE + WHEN BPSAL = '1' THEN 30 + WHEN BPSAL = '2' THEN DAY(DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(DAY, -(DAY(@SSYMM) - 1), @SSYMM)))) + END + FROM BPAA + WHERE BPPYN=@SSPYN + + IF @DAYS > @MONTHDAYS + BEGIN + SET @RESULT = + CASE @FIELDNAME + WHEN 'SSP00' THEN + (SELECT TOP 1 CAST(SSP00 AS FLOAT) / CAST(SSD01 AS FLOAT) + FROM SSMS + WHERE SSYMM = @SSYMM + AND SSENO = @SSENO + AND SSPYN = @SSPYN + ORDER BY SSITM DESC) + WHEN 'SSS07' THEN + (SELECT TOP 1 CAST(SSS07 AS FLOAT) / CAST(SSD01 AS FLOAT) + FROM SSMS + WHERE SSYMM = @SSYMM + AND SSENO = @SSENO + AND SSPYN = @SSPYN + ORDER BY SSITM DESC) + END + END + END + RETURN ROUND(@RESULT, 0) +END + +-- +INSERT INTO BFRM (TRDAT, TRMOD, TRUSR, BFNUM, BFNAM, BFFRM, APPNO) VALUES ('2009/3/3','INSERT','X001','A005','˭]Ӻޥ[ZO','ROUND((@~/240 + @뭹O/240) * @[ZO * @ɼ, 0)',1); + +-- 98/8/10 W[ȤM׷~AO +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, TRDAT, TRMOD, TRUSR) VALUES ('BCUSTRD', 'C', 'gٳӷ~q', '2009/08/10', 'INSERT', 'X002') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, TRDAT, TRMOD, TRUSR) VALUES ('BCUSTRD', 'G', 'FҤuB', '2009/08/10', 'INSERT', 'X002') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, TRDAT, TRMOD, TRUSR) VALUES ('BCUSTRD', 'S', 'FҤuB', '2009/08/10', 'INSERT', 'X002') + +-- 98/9/3 W[~ױ}~p覡O +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, TRDAT, TRMOD, TRUSR) VALUES ('BPAAMSD', '1', 'H 30', '2009/09/03', 'INSERT', 'X002') +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, TRDAT, TRMOD, TRUSR) VALUES ('BPAAMSD', '2', 'Hڤ', '2009/09/03', 'INSERT', 'X002') + +-- 99/2/1 R~ +SELECT A.RANUM, B.BPNME FROM RASN A INNER JOIN BPSN B ON A.RANUM=B.BPENO WHERE A.RAPYN='099AGJ001' +SELECT A.RANUM, B.BPNME FROM RASN A INNER JOIN BPSN B ON A.RANUM=B.BPENO WHERE A.RAPYN='099CGJ002' +DELETE FROM RASN WHERE RAPYN='099AGJ001' +DELETE FROM RASN WHERE RAPYN='099CGJ002' + +-- 99/3/19 sWҫO¾aOv +UPDATE BRTE SET TRDAT='2010/3/19', TRMOD='UPDATE', BREDT='2009/12/31', APPNO=2 WHERE BRTYP='ҫO¾~a`' AND BRVER=2 +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2010/3/19', 'INSERT', 'X001', 'ҫO¾~a`', 3, 0.0011, '2010/01/01', NULL, 1) + +-- 99/3/19 sWOOv +-- H{ƫإ SQL ԭz +SELECT 'INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (' + + '2, ' + + CONVERT(VARCHAR(2), BSLVL) + ', ' + + CONVERT(VARCHAR(10), BSLOW) + ', ' + + CONVERT(VARCHAR(10), BSHIH) + ', ' + + CONVERT(VARCHAR(10), BSAMT) + ')' +FROM BHIF +WHERE BSVER = 1 + +UPDATE BRTE SET TRDAT='2010/3/19', TRMOD='UPDATE', BREDT='2010/3/31', APPNO=2 WHERE BRTYP='O' AND BRVER=1 +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2010/3/19', 'INSERT', 'X002', 'O', 2, 0.0517, '2010/4/1', NULL, 1) + +UPDATE BFDT SET BFEDT='2010/3/31' WHERE BFTYP=2 AND BFVER=1 +INSERT INTO BFDT (BFTYP, BFVER, BFSDT, BFEDT) VALUES (2, 2, '2010/4/1', NULL) + +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 1, 0, 17280, 17280) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 2, 17281, 17400, 17400) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 3, 17401, 18300, 18300) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 4, 18301, 19200, 19200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 5, 19201, 20100, 20100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 6, 20101, 21000, 21000) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 7, 21001, 21900, 21900) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 8, 21901, 22800, 22800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 9, 22801, 24000, 24000) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 10, 24001, 25200, 25200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 11, 25201, 26400, 26400) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 12, 26401, 27600, 27600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 13, 27601, 28800, 28800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 14, 28801, 30300, 30300) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 15, 30301, 31800, 31800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 16, 31801, 33300, 33300) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 17, 33301, 34800, 34800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 18, 34801, 36300, 36300) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 19, 36301, 38200, 38200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 20, 38201, 40100, 40100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 21, 40101, 42000, 42000) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 22, 42001, 43900, 43900) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 23, 43901, 45800, 45800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 24, 45801, 48200, 48200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 25, 48201, 50600, 50600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 26, 50601, 53000, 53000) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 27, 53001, 55400, 55400) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 28, 55401, 57800, 57800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 29, 57801, 60800, 60800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 30, 60801, 63800, 63800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 31, 63801, 66800, 66800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 32, 66801, 69800, 69800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 33, 69801, 72800, 72800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 34, 72801, 76500, 76500) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 35, 76501, 80200, 80200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 36, 80201, 83900, 83900) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 37, 83901, 87600, 87600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 38, 87601, 92100, 92100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 39, 92101, 96600, 96600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 40, 96601, 101100, 101100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 41, 101101, 105600, 105600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 42, 105601, 110100, 110100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 43, 110101, 115500, 115500) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 44, 115501, 120900, 120900) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 45, 120901, 126300, 126300) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 46, 126301, 131700, 131700) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 47, 131701, 137100, 137100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 48, 137101, 142500, 142500) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 49, 142501, 147900, 147900) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 50, 147901, 150000, 150000) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 51, 150001, 156400, 156400) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 52, 156401, 162800, 162800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 53, 162801, 169200, 169200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 54, 169201, 175600, 175600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 55, 175601, 2147483647, 182000) + +-- 99/7/2 W[DMפHeG[ZBG[ZB[Z[ZO +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2010/7/2', 'INSERT', 'X002', 'DMפHeG[Z', 1, 1.3333, '1899/12/31', NULL, 1) +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2010/7/2', 'INSERT', 'X002', 'DMפHG[Z', 1, 1.6666, '1899/12/31', NULL, 1) +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2010/7/2', 'INSERT', 'X002', 'DMפH[Z', 1, 1.0, '1899/12/31', NULL, 1) + +-- 100/1/9 X֤ɯŧa} +UPDATE BPSN SET BPACY=SUBSTRING(BPACY, 1, LEN(BPACY) - 1) + '' WHERE BPACT IN ('x_', 'x', 'xn', '') +UPDATE BPSN SET BPACT='s_' WHERE BPACT='x_' +UPDATE BPSN SET BPACT='x' WHERE BPACT='x' +UPDATE BPSN SET BPACT='xn' WHERE BPACT='xn' +UPDATE BPSN SET BPACT='' WHERE BPACT='' +UPDATE BPSN SET BPASA='Fn󢲢Ѣˢ' WHERE BPENO='00063' +UPDATE BPSN SET BPASA='F_jIqѢ' WHERE BPENO='00065' +UPDATE BPSN SET BPASA='MMMѢТ' WHERE BPENO='00067' +UPDATE BPSN SET BPASA='U樽tTU' WHERE BPENO='00068' +UPDATE BPSN SET BPASA='`e`eТ' WHERE BPENO='00069' +UPDATE BPSN SET BPASA='÷M󢰬qѢТ' WHERE BPENO='00073' +UPDATE BPSN SET BPASA='FFF󢰢Ѣˢ' WHERE BPENO='00079' +UPDATE BPSN SET BPASA='ШM' WHERE BPENO='00083' +UPDATE BPSN SET BPASA='sFˮvqѢ' WHERE BPENO='00085' +UPDATE BPSN SET BPASA='󨽺aص󢰢Ѣˢ' WHERE BPENO='00086' +UPDATE BPSN SET BPASA='sܨsѢ' WHERE BPENO='00089' +UPDATE BPSN SET BPASA='YaFj󢲫Ѣ' WHERE BPENO='00137' +UPDATE BPSN SET BPASA='YaYaѢ' WHERE BPENO='00149' +UPDATE BPSN SET BPASA='sܨFsܵ@qѢˢ' WHERE BPENO='00153' +UPDATE BPSN SET BPASA='qҦZѢ' WHERE BPENO='00154' +UPDATE BPSN SET BPASA='M10Fs2q120' WHERE BPENO='00190' +UPDATE BPSN SET BPASA='qǨ5FӸGq707' WHERE BPENO='00242' +UPDATE BPSN SET BPASA='q2FR52' WHERE BPENO='00261' +UPDATE BPSN SET BPASA='FݥЫ335' WHERE BPENO='00270' +UPDATE BPSN SET BPASA='YaYa192117' WHERE BPENO='00324' +UPDATE BPSN SET BPASA='TMKFT13' WHERE BPENO='00454' + +UPDATE BPSN SET BPLCY=SUBSTRING(BPLCY, 1, LEN(BPLCY) - 1) + '' WHERE BPLCT IN ('x_', 'x', 'xn', '') +UPDATE BPSN SET BPLCT='s_' WHERE BPLCT='x_' +UPDATE BPSN SET BPLCT='x' WHERE BPLCT='x' +UPDATE BPSN SET BPLCT='xn' WHERE BPLCT='xn' +UPDATE BPSN SET BPLCT='' WHERE BPLCT='' +UPDATE BPSN SET BPLSA='Fn󢲢Ѣˢ' WHERE BPENO='00063' +UPDATE BPSN SET BPLSA='F_jIqѢ' WHERE BPENO='00065' +UPDATE BPSN SET BPLSA='MMMѢТ' WHERE BPENO='00067' +UPDATE BPSN SET BPLSA='`e`eТ' WHERE BPENO='00069' +UPDATE BPSN SET BPLSA='÷M󢰬qѢТ' WHERE BPENO='00073' +UPDATE BPSN SET BPLSA='FFF󢰢Ѣˢ' WHERE BPENO='00079' +UPDATE BPSN SET BPLSA='ЧM' WHERE BPENO='00083' +UPDATE BPSN SET BPLSA='sFˮvqѢ' WHERE BPENO='00085' +UPDATE BPSN SET BPLSA='aص󢰢Ѣˢ' WHERE BPENO='00086' +UPDATE BPSN SET BPLSA='sܧsѢ' WHERE BPENO='00089' +UPDATE BPSN SET BPLSA='YaFj󢲫Ѣ' WHERE BPENO='00137' +UPDATE BPSN SET BPLSA='YaYaѢ' WHERE BPENO='00149' +UPDATE BPSN SET BPLSA='sܧFsܵ@qѢˢ' WHERE BPENO='00153' +UPDATE BPSN SET BPLSA='qҦZѢ' WHERE BPENO='00154' +UPDATE BPSN SET BPLSA='M10Fs2q120' WHERE BPENO='00190' +UPDATE BPSN SET BPLSA='qǧ5FӸGq707' WHERE BPENO='00242' +UPDATE BPSN SET BPLSA='q2FR52' WHERE BPENO='00261' +UPDATE BPSN SET BPLSA='YaYa192117' WHERE BPENO='00324' +UPDATE BPSN SET BPLSA='TMKFT13' WHERE BPENO='00454' +UPDATE BPSN SET BPLSA='xZϥ|16' WHERE BPENO='00547' + + +-- 100 ~ 1 1 ҫOOvվHίŶZվ +UPDATE BRTE SET BREDT='2010/12/31', TRDAT='2011/1/9', TRMOD='UPDATE', TRUSR='X001' WHERE BRTYP='ҫOq˯f' AND BRVER=2 +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2011/01/09', 'INSERT', 'X001', 'ҫOq˯f', 3, 0.07, '2011/01/01', NULL, 1) + +UPDATE BFDT SET BFEDT='2010/12/31' WHERE BFTYP=1 AND BFVER=1 +INSERT INTO BFDT (BFTYP, BFVER, BFSDT, BFEDT) VALUES (1, 2, '2011/1/1', NULL) + +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 1, 0, 17880, 17880) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 2, 17881, 18300, 18300) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 3, 18301, 19200, 19200) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 4, 19201, 20100, 20100) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 5, 20101, 21000, 21000) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 6, 21001, 21900, 21900) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 7, 21901, 22800, 22800) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 8, 22801, 24000, 24000) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 9, 24001, 25200, 25200) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 10, 25201, 26400, 26400) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 11, 26401, 27600, 27600) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 12, 27601, 28800, 28800) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 13, 28801, 30300, 30300) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 14, 30301, 31800, 31800) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 15, 31801, 33300, 33300) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 16, 33301, 34800, 34800) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 17, 34801, 36300, 36300) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 18, 36301, 38200, 38200) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 19, 38201, 40100, 40100) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 20, 40101, 42000, 42000) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 21, 42001, 2147483647, 43900) + +-- 100/01/17 קK|e +DELETE FROM BWEX WHERE BSNUM='UNBONUSTAXFREE' AND BSITM=' 1' +INSERT INTO BWEX (BSNUM, BSITM, BSNAM) VALUES ('UNBONUSTAXFREE', ' 1', '68500') + +-- 100/3/19 sWҫO¾aOv +UPDATE BRTE SET TRDAT='2011/3/9', TRMOD='UPDATE', BREDT='2011/03/10', APPNO=2 WHERE BRTYP='ҫO¾~a`' AND BRVER=3 +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES + ('2010/3/19', 'INSERT', 'X001', 'ҫO¾~a`', 4, 0.001, '2011/03/11', NULL, 1) + +-- 101 ~ 1 1 ҫOOvվHίŶZվ +UPDATE BRTE SET BREDT='2011/12/31', TRDAT='2012/2/3', TRMOD='UPDATE', TRUSR='X001' WHERE BRTYP='ҫOq˯f' AND BRVER=3 +INSERT INTO BRTE (TRDAT, TRMOD, TRUSR, BRTYP, BRVER, BRRTE, BRSDT, BREDT, APPNO) VALUES ('2011/02/03', 'INSERT', 'X001', 'ҫOq˯f', 4, 0.075, '2012/01/01', NULL, 1) + +=========================================== +IIIII 101 ~s~ּ IIIII +=========================================== + +-- W[O +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('RPARTYP', '0D', ''); +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('RPARTYP', '33', 'X'); + + +-- RPAR HOά W[ +ALTER TABLE RPAR ADD RPADT DATETIME NULL ; +ALTER TABLE RPAR ADD RPAPN VARCHAR( 1) NULL ; +ALTER TABLE RPAR ADD RPANO VARCHAR( 1) NULL ; +ALTER TABLE RPAR ADD RPAPP VARCHAR( 1) NULL ; +ALTER TABLE RPAR ADD RPAPD DATETIME NULL ; +ALTER TABLE RPAR ADD RPAPU NVARCHAR( 10) NULL ; +ALTER TABLE RPAR ADD RPAGT NVARCHAR( 10) NULL ; +ALTER TABLE RPAR ADD RPAGM NVARCHAR( 30) NULL ; +ALTER TABLE RPAR ADD RPRTM NVARCHAR( 5) NULL ; +ALTER TABLE RPAR ADD RPETM NVARCHAR( 5) NULL ; +ALTER TABLE RPAR ADD RPUST INT DEFAULT 0 ; +ALTER TABLE RPAR ADD RPTC1 INT DEFAULT 0 ; +ALTER TABLE RPAR ADD RPTC2 INT DEFAULT 0 ; +ALTER TABLE RPAR ADD RPTC3 INT DEFAULT 0 ; +ALTER TABLE RPAR ADD RPRSN NVARCHAR( 70) NULL ; + +-- RPAB HOñ֬ ƪsW +CREATE TABLE RPAB +(TRDAT DATETIME NULL +,TRMOD VARCHAR( 12) NULL +,TRUSR VARCHAR( 10) NULL +,RPREN NVARCHAR( 12) not NULL +,RPITM INT not NULL +,RPGLP NVARCHAR( 12) NULL +,RPENO NVARCHAR( 12) NULL +,RPDAT DATETIME NULL +,RPAPP NVARCHAR( 1) NULL +,RPDOC NVARCHAR(200) NULL +); +ALTER TABLE RPAB ADD CONSTRAINT PK_RPAB PRIMARY KEY (RPREN,RPITM); + +--HJɡAñd 0 +--~HJɡAñdñd + +-- W[ƪ RPAC ɥRP +CREATE TABLE RPAC +(TRDAT DATETIME NULL +,TRMOD NVARCHAR( 12) NULL +,TRUSR NVARCHAR( 10) NULL +,RPREN NVARCHAR( 10) not NULL +,RPREX NVARCHAR( 10) not NULL +,RPTCT INT DEFAULT 0 +); +ALTER TABLE RPAC ADD CONSTRAINT PK_RPAC PRIMARY KEY (RPREN,RPREX); + + +-- sWWUZɶPȥ𮧮ɶ]w +INSERT INTO BWEX (BSNUM, BSITM, BSNAM) VALUES ('UNRPARTIME', ' 1', '08:00'); +INSERT INTO BWEX (BSNUM, BSITM, BSNAM) VALUES ('UNRPARTIME', ' 2', '17:00'); +INSERT INTO BWEX (BSNUM, BSITM, BSNAM) VALUES ('UNRPARTIME', ' 3', '12:00'); +INSERT INTO BWEX (BSNUM, BSITM, BSNAM) VALUES ('UNRPARTIME', ' 4', '13:00'); + +-- sWHS +CREATE TABLE RASD +(TRDAT DATETIME NULL +,TRMOD NVARCHAR( 12) NULL +,TRUSR NVARCHAR( 10) NULL +,RANUM NVARCHAR( 10) not NULL +,RAYER INT not NULL +,RATCT INT DEFAULT 0 +,RAUST INT DEFAULT 0 +); +ALTER TABLE RASD ADD CONSTRAINT PK_RASD PRIMARY KEY (RANUM,RAYER); + +-- sWXtO +CREATE TABLE RPAD +(TRDAT DATETIME NULL +,TRMOD NVARCHAR( 12) NULL +,TRUSR NVARCHAR( 10) NULL +,RPREN NVARCHAR( 10) not NULL +,RPITM INT not NULL +,RPSTP NVARCHAR( 20) NULL +,RPEDP NVARCHAR( 20) NULL +,RPF01 INT DEFAULT 0 +,RPF02 INT DEFAULT 0 +,RPF03 INT DEFAULT 0 +,RPF04 INT DEFAULT 0 +,RPF05 INT DEFAULT 0 +,RPF06 INT DEFAULT 0 +,RPF07 INT DEFAULT 0 +,RPF08 INT DEFAULT 0 +,RPF09 INT DEFAULT 0 +,RPF10 INT DEFAULT 0 +,RPSUM INT DEFAULT 0 +); +ALTER TABLE RPAD ADD CONSTRAINT PK_RPAD PRIMARY KEY (RPREN,RPITM); + +-- 2012-02-18 sW +CREATE NONCLUSTERED INDEX [IDX_RPAR_01] ON [dbo].[RPAR] +( + [RPNUM] ASC, + [RPTYP] ASC, + [RPRDT] ASC +) WITH (PAD_INDEX = OFF, + STATISTICS_NORECOMPUTE = OFF, + SORT_IN_TEMPDB = OFF, + IGNORE_DUP_KEY = OFF, + DROP_EXISTING = OFF, + ONLINE = OFF, + ALLOW_ROW_LOCKS = ON, + ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] + +-- [Ƶ +ALTER TABLE RPAR ALTER COLUMN RPDOC NVARCHAR(2000) + +---- 2012-02-18 Wz SQL w槹 + +--- 2012/2/21 sW~Hb +CREATE TABLE BPAP +(TRDAT DATETIME NULL +,TRMOD NVARCHAR( 12) NULL +,TRUSR NVARCHAR( 10) NULL +,BPENO NVARCHAR( 10) not NULL +,BPNME NVARCHAR( 20) NULL +,BPPWD NVARCHAR( 30) NULL +,BPEML NVARCHAR( 30) NULL +,BPZON NVARCHAR( 10) NULL +,BPBRH NVARCHAR( 10) NULL +); +ALTER TABLE BPAP ADD CONSTRAINT PK_BPAP PRIMARY KEY (BPENO); + +--- 2012/2/22 sWñ֤H +CREATE TABLE BSGP +(TRDAT DATETIME NULL +,TRMOD NVARCHAR( 12) NULL +,TRUSR NVARCHAR( 10) NULL +,BSPYN NVARCHAR( 20) not NULL +,BSFLW NVARCHAR( 10) not NULL +,BSLVL INT not NULL +,BSENO NVARCHAR( 10) not NULL +); +ALTER TABLE BSGP ADD CONSTRAINT PK_BSGP PRIMARY KEY (BSPYN,BSFLW,BSLVL,BSENO); + + +---- Wz SQL wg槹 + +-- 2012/4/14 ] RPAR.RPTCT ѮɼƧאּơAHU SQL +-- 1. RPAR.RPTCT DoƶO̡AH 60 +UPDATE RPAR SET RPTCT = RPTCT * 60, RPTC1 = RPTC1 * 60, RPTC2 = RPTC2 * 60, RPTC3 = RPTC3 * 60 WHERE RPTYP<>'22' + +-- 2. SSMS SST01 SST17 H 60 +UPDATE SSMS SET SST01=SST01*60, SST02=SST02*60, SST03=SST03*60, SST04=SST04*60, SST05=SST05*60, SST06=SST06*60, + SST07=SST07*60, SST08=SST08*60, SST09=SST09*60, SST10=SST10*60, SST11=SST11*60, SST12=SST12*60, + SST13=SST13*60, SST14=SST14*60, SST15=SST15*60, SST16=SST16*60, SST17=SST17*60 + +-- 3. SSMB SST01 SST17 H 60 +UPDATE SSMB SET SST01=SST01*60, SST02=SST02*60, SST03=SST03*60, SST04=SST04*60, SST05=SST05*60, SST06=SST06*60, + SST07=SST07*60, SST08=SST08*60, SST09=SST09*60, SST10=SST10*60, SST11=SST11*60, SST12=SST12*60, + SST13=SST13*60, SST14=SST14*60, SST15=SST15*60, SST16=SST16*60, SST17=SST17*60 + +-- 4. ROWK ɼ쭼H 60 +UPDATE ROWK SET ROT01=ROT01*60, ROT02=ROT02*60, ROT03=ROT03*60, ROT04=ROT04*60 + +-- 5. ק SSMSVIEWA SST01 SST17 ܮɰH 60 +SELECT DISTINCT + SSYMM, SSENO, SSPYN, dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'SSNUM') AS SSNUM, dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'SSJNO') + AS SSJNO, dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'SSCNO') AS SSCNO, dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'SSBRH') AS SSBRH, + SUM(SSD01) AS SSD01, dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSD02') AS SSD02, + (SELECT TOP (1) SSSRD + FROM dbo.SSMS AS B + WHERE (SSYMM = SSYMM) AND (SSENO = SSENO) AND (SSPYN = SSPYN) + ORDER BY SSITM DESC) AS SSSRD, SUM(SSP00) - dbo.SSMS_SSP00_ADJUST(SSYMM, SSENO, SSPYN, N'SSP00') AS SSP00, SUM(SSP01) AS SSP01, + SUM(SSP02) - dbo.SSMS_SSP00_ADJUST(SSYMM, SSENO, SSPYN, N'SSP02') AS SSP02, SUM(SSP03) AS SSP03, SUM(SSP04) AS SSP04, SUM(SSP05) AS SSP05, + SUM(SSP06) AS SSP06, SUM(SSP07) AS SSP07, SUM(SSP08) AS SSP08, SUM(SSP09) AS SSP09, SUM(SSP10) AS SSP10, SUM(SSP11) AS SSP11, SUM(SSP12) + AS SSP12, SUM(SSP13) AS SSP13, SUM(SSP14) AS SSP14, SUM(SSP15) AS SSP15, SUM(SSP99) AS SSP99, SUM(SSS01) AS SSS01, SUM(SSS02) AS SSS02, + SUM(SSS03) AS SSS03, dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSS04') AS SSS04, dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSS05') AS SSS05, + dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSS06') AS SSS06, SUM(SSS07) - dbo.SSMS_SSP00_ADJUST(SSYMM, SSENO, SSPYN, N'SSS07') AS SSS07, + SUM(SSS08) AS SSS08, SUM(SSS09) AS SSS09, SUM(SSS10) AS SSS10, SUM(SSS11) AS SSS11, SUM(SSS12) AS SSS12, SUM(SSS13) AS SSS13, SUM(SSS14) + AS SSS14, SUM(SSS15) AS SSS15, SUM(SSS99) AS SSS99, dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSH01') AS SSH01, dbo.SSMS_INTFIELD(SSYMM, + SSENO, SSPYN, 'SSH02') AS SSH02, dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSH03') AS SSH03, dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSH04') + AS SSH04, dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSH05') AS SSH05, dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSH06') AS SSH06, SUM(SSH07) + AS SSH07, SUM(SSH08) AS SSH08, SUM(SSH09) AS SSH09, SUM(SSH10) AS SSH10, SUM(SST01) / 60 AS SST01, SUM(SST02) / 60 AS SST02, SUM(SST03) / 60 AS SST03, + SUM(SST04) / 60 AS SST04, SUM(SST05) / 60 AS SST05, SUM(SST06) / 60 AS SST06, SUM(SST07) / 60 AS SST07, SUM(SST08) / 60 AS SST08, SUM(SST09) / 60 AS SST09, + SUM(SST10) / 60 AS SST10, SUM(SST11) / 60 AS SST11, SUM(SST12) / 60 AS SST12, SUM(SST13) / 60 AS SST13, SUM(SST14) / 60 AS SST14, SUM(SST15) / 60 AS SST15, + SUM(SST16) / 60 AS SST16, SUM(SST17) / 60 AS SST17, SUM(SST18) AS SST18, SUM(SST19) AS SST19, SUM(SST20) AS SST20, dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSL01') AS SSL01, + dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSL02') AS SSL02, dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSL03') AS SSL03, dbo.SSMS_INTFIELD(SSYMM, + SSENO, SSPYN, 'SSL04') AS SSL04, dbo.SSMS_INTFIELD(SSYMM, SSENO, SSPYN, 'SSL05') AS SSL05, dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC01') + AS SSC01, dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC02') AS SSC02, dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC03') AS SSC03, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC04') AS SSC04, dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC05') AS SSC05, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC06') AS SSC06, dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC07') AS SSC07, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC08') AS SSC08, dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC09') AS SSC09, + dbo.SSMS_COMMENT(SSYMM, SSENO, SSPYN, 'SSC10') AS SSC10, dbo.SSMS_DATETIMEFIELD(SSYMM, SSENO, SSPYN, 'TRDAT') AS TRDAT, + dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'TRMOD') AS TRMOD, dbo.SSMS_STRINGFIELD(SSYMM, SSENO, SSPYN, 'TRUSR') AS TRUSR +FROM dbo.SSMS +GROUP BY SSYMM, SSENO, SSPYN + +-- 2012/05/22 dƪW[ IP +ALTER TABLE RCRD ADD + RCP01 NVARCHAR( 40) NULL, + RCP02 NVARCHAR( 40) NULL, + RCP03 NVARCHAR( 40) NULL, + RCP04 NVARCHAR( 40) NULL, + RCP05 NVARCHAR( 40) NULL, + RCP06 NVARCHAR( 40) NULL + +-- 2012/05/24 sW RLOG ƪ +CREATE TABLE RLOG +(TRDAT DATETIME NULL +,TRMOD NVARCHAR( 12) NULL +,TRUSR NVARCHAR( 10) NULL +,RLDAT DATETIME NULL +,RLTIM VARCHAR( 8) NULL +,RLPRG VARCHAR( 20) NULL +,RLCIP VARCHAR( 40) NULL +,RLCNT VARCHAR(100) NULL +); + + +-- 2012/06/01 RPAR sWtȦaI RPPLC +ALTER TABLE RPAR ADD RPPLC NVARCHAR( 20) NULL ; + +-- 2012/06/04 sW~ׯS RYER + +CREATE TABLE RYER +(TRDAT DATETIME NULL +,TRMOD NVARCHAR( 12) NULL +,TRUSR NVARCHAR( 10) NULL +,RYENO VARCHAR( 10) not NULL +,RYYER INT not NULL +,RYTOT INT DEFAULT 0 +,RYUST INT DEFAULT 0 +); +ALTER TABLE RYER ADD CONSTRAINT PK_RYER PRIMARY KEY (RYENO,RYYER); + +---- Wz SQL wg槹 + +-- վñɬ[cAɸ + +SELECT *, (SELECT RPAPN FROM RPAR WHERE RPAB.RPREN=RPAR.RPREN) FROM RPAB +--SET RPAPN = (SELECT RPAPN FROM RPAR WHERE RPAB.RPREN=RPAR.RPREN) +--UPDATE RPAB +--SET RPAPN = (SELECT RPAPN FROM RPAR WHERE RPAB.RPREN=RPAR.RPREN) + + + +---ҫOŶZi +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 1, 0, 19047, 19047) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 2, 19048, 19200, 19200) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 3, 19201, 20100, 20100) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 4, 20101, 21000, 21000) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 5, 21001, 21900, 21900) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 6, 21901, 22800, 22800) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 7, 22801, 24000, 24000) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 8, 24001, 25200, 25200) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 9, 25201, 26400, 26400) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 10, 26401, 27600, 27600) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 11, 27601, 28800, 28800) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 12, 28801, 30300, 30300) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 13, 30301, 31800, 31800) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 14, 31801, 33300, 33300) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 15, 33301, 34800, 34800) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 16, 34801, 36300, 36300) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 17, 36301, 38200, 38200) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 18, 38201, 40100, 40100) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 19, 40101, 42000, 42000) +INSERT INTO BLIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 20, 42001, 2147483647, 43900) + + +-- OŶZi +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 1, 0, 18780, 18780) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 2, 18781, 19200, 19200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 3, 19201, 20100, 20100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 4, 20101, 21000, 21000) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 5, 21001, 21900, 21900) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 6, 21901, 22800, 22800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 7, 22801, 24000, 24000) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 8, 24001, 25200, 25200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 9, 25201, 26400, 26400) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 10, 26401, 27600, 27600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 11, 27601, 28800, 28800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 12, 28801, 30300, 30300) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 13, 30301, 31800, 31800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 14, 31801, 33300, 33300) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 15, 33301, 34800, 34800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 16, 34801, 36300, 36300) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 17, 36301, 38200, 38200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 18, 38201, 40100, 40100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 19, 40101, 42000, 42000) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 20, 42001, 43900, 43900) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 21, 43901, 45800, 45800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 22, 45801, 48200, 48200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 23, 48201, 50600, 50600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 24, 50601, 53000, 53000) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 25, 53001, 55400, 55400) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 26, 55401, 57800, 57800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 27, 57801, 60800, 60800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 28, 60801, 63800, 63800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 29, 63801, 66800, 66800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 30, 66801, 69800, 69800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 31, 69801, 72800, 72800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 32, 72801, 76500, 76500) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 33, 76501, 80200, 80200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 34, 80201, 83900, 83900) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 35, 83901, 87600, 87600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 36, 87601, 92100, 92100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 37, 92101, 96600, 96600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 38, 96601, 101100, 101100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 39, 101101, 105600, 105600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 40, 105601, 110100, 110100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 41, 110101, 115500, 115500) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 42, 115501, 120900, 120900) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 43, 120901, 126300, 126300) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 44, 126301, 131700, 131700) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 45, 131701, 137100, 137100) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 46, 137101, 142500, 142500) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 47, 142501, 147900, 147900) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 48, 147901, 150000, 150000) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 49, 150001, 156400, 156400) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 50, 156401, 162800, 162800) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 51, 162801, 169200, 169200) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 52, 169201, 175600, 175600) +INSERT INTO BHIF (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (3, 53, 175601, 2147483647, 182000) + +--- ҰhŶZi +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 1, 0, 1500, 1500) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 2, 1501, 3000, 3000) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 3, 3001, 4500, 4500) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 4, 4501, 6000, 6000) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 5, 6001, 7500, 7500) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 6, 7501, 8700, 8700) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 7, 8701, 9900, 9900) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 8, 9901, 11100, 11100) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 9, 11101, 12540, 12540) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 10, 12541, 13500, 13500) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 11, 13501, 15840, 15840) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 12, 15841, 16500, 16500) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 13, 16501, 17280, 17280) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 14, 17281, 17880, 17880) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 15, 17881, 19047, 19047) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 16, 19048, 19200, 19200) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 17, 19201, 20100, 20100) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 18, 20101, 21000, 21000) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 19, 21001, 21900, 21900) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 20, 21901, 22800, 22800) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 21, 22801, 24000, 24000) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 22, 24001, 25200, 25200) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 23, 25201, 26400, 26400) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 24, 26401, 27600, 27600) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 25, 27601, 28800, 28800) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 26, 28801, 30300, 30300) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 27, 30301, 31800, 31800) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 28, 31801, 33300, 33300) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 29, 33301, 34800, 34800) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 30, 34801, 36300, 36300) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 31, 36301, 38200, 38200) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 32, 38201, 40100, 40100) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 33, 40101, 42000, 42000) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 34, 42001, 43900, 43900) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 35, 43901, 45800, 45800) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 36, 45801, 48200, 48200) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 37, 48201, 50600, 50600) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 38, 50601, 53000, 53000) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 39, 53001, 55400, 55400) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 40, 55401, 57800, 57800) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 41, 57801, 60800, 60800) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 42, 60801, 63800, 63800) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 43, 63801, 66800, 66800) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 44, 66801, 69800, 69800) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 45, 69801, 72800, 72800) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 46, 72801, 76500, 76500) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 47, 76501, 80200, 80200) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 48, 80201, 83900, 83900) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 49, 83901, 87600, 87600) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 50, 87601, 92100, 92100) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 51, 92101, 96600, 96600) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 52, 96601, 101100, 101100) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 53,101101, 105600, 105600) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 54,105601, 110100, 110100) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 55,110101, 115500, 115500) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 56,115501, 120900, 120900) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 57,120901, 126300, 126300) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 58,126301, 131700, 131700) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 59,131701, 137100, 137100) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 60,137101, 142500, 142500) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 61,142501, 147900, 147900) +INSERT INTO BLRA (BSVER, BSLVL, BSLOW, BSHIH, BSAMT) VALUES (2, 62,147901, 2147483647, 150000) + +-- sWx 2014-01-04 +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPSNBRH', '1109', ''); +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR) VALUES ('BPSNBRH', '1306', 'sƳߤ'); \ No newline at end of file diff --git a/DB/勞健保測試資料.TXT b/DB/勞健保測試資料.TXT new file mode 100644 index 0000000..b96884a --- /dev/null +++ b/DB/勞健保測試資料.TXT @@ -0,0 +1,36 @@ +BPSN +01243 貓老大 Maolaoda M NULL NULL 1 NULL 1 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1 NULL NULL NULL NULL 3 2013-10-01 00:00:00.000 NULL  2013-10-19 11:47:57.120 INSERT 00002 1 NULL NULL 0.00 1 NULL NULL X NULL NULL NULL NULL NULL NULL + +BCUS +AG0002 測試機關 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 2013-10-19 11:48:24.487 INSERT 00002 1 + +BPRJ +2013-10-19 11:55:41.653 INSERT 00002 AG0002 JYAGJ999 測試專案(展譽) NULL NULL NULL NULL NULL N 1.3333 1.6666 1 1 NULL NULL A004 B001 JY +2013-10-19 11:53:45.003 INSERT 00002 AG0002 TYAGJ999 測試專案(新譽) NULL NULL NULL NULL NULL N 1.3333 1.6666 1 1 NULL NULL A004 B001 TY + +BPJA +2013-10-19 11:59:43.547 INSERT 00002 102JYAGJ999 01 工讀生 1 10 +2013-10-19 12:00:31.013 INSERT 00002 102TYAGJ999 01 工讀生 1 10 + +BPJB +2013-10-19 12:00:06.207 INSERT 00002 102JYAGJ999 01 01 首席 50000.00 300.00 3000.00 1800.00 0.00 0.00 0.00 1 +2013-10-19 12:00:48.660 INSERT 00002 102TYAGJ999 01 01 特級 45000.00 380.00 3000.00 1800.00 0.00 0.00 0.00 1 + +BPAA +2013-10-19 11:58:12.327 INSERT 00002 JYAGJ999 102 102JYAGJ999 102年度測試專案(展譽) 1000000 1 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 31 NULL 1 +2013-10-19 11:57:15.097 INSERT 00002 TYAGJ999 102 102TYAGJ999 102年度測試專案(新譽) 1000000 1 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 31 NULL 1 + +BPRM +NULL NULL NULL JYAGJ999 00002 1 +NULL NULL NULL TYAGJ999 00002 1 + +RASN +2013-10-19 12:07:15.913 UPDATE NULL 01243 1 AG0002 102JYAGJ999 2013-10-01 00:00:00.000 2013-10-10 00:00:00.000 0001 NULL 2 01 01 +2013-10-19 12:09:39.070 UPDATE NULL 01243 2 AG0002 102TYAGJ999 2013-10-15 00:00:00.000 2013-10-20 00:00:00.000 0001 NULL 2 01 01 + +RPIR +2013-10-19 13:22:38.883 UPDATE 00002 2013100012 01243 2013-10-01 00:00:00.000 NULL 50000 0 0 0 N 1 2 Y Y 4 0 0 0 NULL 0 50000 JY +2013-10-19 12:48:31.200 UPDATE 00002 2013100013 01243 2013-10-15 00:00:00.000 NULL 50000 0 0 0 N 1 2 Y Y 3 0 0 0 NULL 0 50000 TY + +RPIB +2013-10-19 13:24:55.720 INSERT 00002 2013100012 1 01243 2013-10-10 00:00:00.000 2013-10-01 00:00:00.000 2013-10-10 00:00:00.000 50000 50000 0 0 0 0 0 0 0 N 1 2 Y Y NULL 1 JY \ No newline at end of file diff --git a/DB/清除密碼.SQL b/DB/清除密碼.SQL new file mode 100644 index 0000000..f854cd8 --- /dev/null +++ b/DB/清除密碼.SQL @@ -0,0 +1,2 @@ +UPDATE BPSN SET BPAWD='' +UPDATE BWEX SET BSNAM='1.ܦv' WHERE BSNUM='UNMWETA' AND BSITM=' 1' \ No newline at end of file diff --git a/DB/辦訓系統刪除課程資料.SQL b/DB/辦訓系統刪除課程資料.SQL new file mode 100644 index 0000000..1a7b62b --- /dev/null +++ b/DB/辦訓系統刪除課程資料.SQL @@ -0,0 +1,23 @@ +declare @編號 int +set @編號=52 +delete from dbo.訓練課程企劃 where 編號=@編號 +delete from dbo.訓練課程企劃日數 where 編號=@編號 +delete from dbo.訓練效益 where 訓練課程企劃編號=@編號 +delete from dbo.訓練效益個人 where 訓練課程企劃編號=@編號 +delete from dbo.訓練檢討報告 where 訓練課程企劃編號=@編號 +delete from dbo.訓練課程計畫別 where 編號=@編號 +delete from dbo.訓練課程內容 where 訓練課程企劃編號=@編號 +delete from dbo.訓練課程異動通知 where 編號=@編號 +delete from dbo.訓練課程異動通知發送紀錄 where 編號=@編號 +delete from dbo.課程報名 where 訓練課程編號=@編號 +delete from dbo.課程經費 where 訓練課程企劃編號=@編號 +delete from dbo.講師遴選 where 課程企劃編號=@編號 +delete from dbo.講師異動 where 課程企劃編號=@編號 +delete from dbo.場地異動 where 課程企劃編號=@編號 +delete from dbo.場地遴選 where 課程企劃編號=@編號 +delete from dbo.學員出席 where 訓練課程編號=@編號 +delete from dbo.心得報告討論 where 心得報告編號 in (select 心得報告編號 from dbo.心得報告 where 訓練課程企劃編號=@編號) +delete from dbo.心得報告 where 訓練課程企劃編號=@編號 +delete from dbo.滿意度調查 where 訓練課程企劃編號=@編號 +delete from dbo.滿意度調查講師 where 訓練課程企劃編號=@編號 +delete from dbo.滿意度調查課程企劃 where 訓練課程企劃編號=@編號 diff --git a/DataTransfer/Project1.cfg b/DataTransfer/Project1.cfg new file mode 100644 index 0000000..6c57635 --- /dev/null +++ b/DataTransfer/Project1.cfg @@ -0,0 +1,38 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-LE"c:\program files\borland\delphi7\Projects\Bpl" +-LN"c:\program files\borland\delphi7\Projects\Bpl" +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/DataTransfer/Project1.dof b/DataTransfer/Project1.dof new file mode 100644 index 0000000..8890a3e --- /dev/null +++ b/DataTransfer/Project1.dof @@ -0,0 +1,136 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=0 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=vclx;vcl;rtl;indy;dsnapcon;dsnap;dbrtl;vcldb;VclSmp;adortl;bdertl;vcldbx;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;Comm;dclOffice2k;WLib70;TntUnicodeVcl_R70;vclshlctrlsW +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir=C:\Program Files\Borland\Delphi7\Bin\ +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1028 +CodePage=950 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= diff --git a/DataTransfer/Project1.dpr b/DataTransfer/Project1.dpr new file mode 100644 index 0000000..513a1dd --- /dev/null +++ b/DataTransfer/Project1.dpr @@ -0,0 +1,13 @@ +program Project1; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/DataTransfer/Project1.exe b/DataTransfer/Project1.exe new file mode 100644 index 0000000..0a9d66f Binary files /dev/null and b/DataTransfer/Project1.exe differ diff --git a/DataTransfer/Project1.res b/DataTransfer/Project1.res new file mode 100644 index 0000000..75eb6df Binary files /dev/null and b/DataTransfer/Project1.res differ diff --git a/DataTransfer/Project1.stat b/DataTransfer/Project1.stat new file mode 100644 index 0000000..e2df72b --- /dev/null +++ b/DataTransfer/Project1.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=43 +DesignerSecs=22 +InspectorSecs=1 +CompileSecs=5147 +OtherSecs=29 +StartTime=2008/1/28 15:50:17 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/DataTransfer/Unit1.dcu b/DataTransfer/Unit1.dcu new file mode 100644 index 0000000..ca7fbe4 Binary files /dev/null and b/DataTransfer/Unit1.dcu differ diff --git a/DataTransfer/Unit1.dfm b/DataTransfer/Unit1.dfm new file mode 100644 index 0000000..18fdf49 --- /dev/null +++ b/DataTransfer/Unit1.dfm @@ -0,0 +1,81 @@ +object Form1: TForm1 + Left = 192 + Top = 121 + Width = 696 + Height = 480 + Caption = 'Form1' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnClose = FormClose + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object DBGrid1: TDBGrid + Left = 16 + Top = 72 + Width = 657 + Height = 353 + DataSource = DataSource1 + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ADOConnection1: TADOConnection + ConnectionString = + 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\VS.NET\Thinkyu\D' + + 'oc\'#21729#24037#36039#26009#34920'excel_1.xls;Extended Properties="EXCEL 8.0;HDR=0;IMEX=1"' + + ';Persist Security Info=False' + KeepConnection = False + LoginPrompt = False + Mode = cmShareDenyNone + Provider = 'Microsoft.Jet.OLEDB.4.0' + Left = 40 + Top = 16 + end + object ADODataSet1: TADODataSet + Connection = ADOConnection1 + CursorType = ctStatic + CommandText = 'select * from ['#21729#24037#36039#26009#34920'excel$]' + Parameters = <> + Left = 128 + Top = 16 + end + object DataSource1: TDataSource + DataSet = ADODataSet2 + Left = 216 + Top = 16 + end + object ADOConnection2: TADOConnection + ConnectionString = + 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\VS.NET\Thinkyu\D' + + 'oc\'#21729#24037#36039#26009#34920'.mdb;Persist Security Info=False' + KeepConnection = False + LoginPrompt = False + Provider = 'Microsoft.Jet.OLEDB.4.0' + Left = 328 + Top = 16 + end + object ADOCommand1: TADOCommand + CommandText = 'DELETE FROM ['#21729#24037#36039#26009']' + Connection = ADOConnection2 + Parameters = <> + Left = 416 + Top = 16 + end + object ADODataSet2: TADODataSet + Connection = ADOConnection2 + CursorType = ctStatic + CommandText = 'select * from ['#21729#24037#36039#26009']' + Parameters = <> + Left = 504 + Top = 16 + end +end diff --git a/DataTransfer/Unit1.pas b/DataTransfer/Unit1.pas new file mode 100644 index 0000000..b6f7662 --- /dev/null +++ b/DataTransfer/Unit1.pas @@ -0,0 +1,116 @@ +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, ADODB, DB, Grids, DBGrids; + +type + TForm1 = class(TForm) + ADOConnection1: TADOConnection; + ADODataSet1: TADODataSet; + DBGrid1: TDBGrid; + DataSource1: TDataSource; + ADOConnection2: TADOConnection; + ADOCommand1: TADOCommand; + ADODataSet2: TADODataSet; + procedure FormCreate(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + private + { Private declarations } + function CdatetoEdate(adate: string): string; + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.dfm} + +function TForm1.CdatetoEdate(adate: string): string; +begin + if adate = '' then + Result := '' + else + Result := FormatDateTime('yyyy/mm/dd', + EncodeDate(StrToInt(Copy(adate, 1, 2)) + 1911, StrToInt(Copy(adate, 4, 2)), StrToInt(Copy(adate, 7, 2)))); +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + ADOConnection1.Connected := True; + ADODataSet1.Open; + + ADOConnection2.Connected := True; + ADOCommand1.Execute; + ADODataSet2.Open; + + while not ADODataSet1.Eof do + begin + ADODataSet2.Append; + + ADODataSet2.FieldByName('us').Value := ADODataSet1.FieldValues['A']; + ADODataSet2.FieldByName('umW').Value := ADODataSet1.FieldValues['B']; + ADODataSet2.FieldByName('ʧO' ).Value := ADODataSet1.FieldValues['C']; + ADODataSet2.FieldByName('s覡').Value := ADODataSet1.FieldValues['D']; + ADODataSet2.FieldByName('¾' ).AsString := CdatetoEdate(VarToStr(ADODataSet1.FieldValues['E'])); + ADODataSet2.FieldByName('~' ).Value := StringReplace(VarToStr(ADODataSet1.FieldValues['F']), ',', '', [rfReplaceAll, rfIgnoreCase]); + ADODataSet2.FieldByName('~O' ).Value := ADODataSet1.FieldValues['G']; + ADODataSet2.FieldByName('渹' ).Value := ADODataSet1.FieldValues['H']; + ADODataSet2.FieldByName('^W').Value := ADODataSet1.FieldValues['I']; + ADODataSet1.MoveBy(1); + + ADODataSet2.FieldByName('¾' ).Value := ADODataSet1.FieldValues['A']; + ADODataSet2.FieldByName('¾ȦW' ).Value := ADODataSet1.FieldValues['B']; + ADODataSet2.FieldByName('Xͤ' ).AsString := CdatetoEdate(VarToStr(ADODataSet1.FieldValues['C'])); + ADODataSet2.FieldByName('O' ).Value := ADODataSet1.FieldValues['D']; + ADODataSet2.FieldByName('¾' ).AsString := CdatetoEdate(VarToStr(ADODataSet1.FieldValues['E'])); + ADODataSet2.FieldByName('[ZO' ).Value := StringReplace(VarToStr(ADODataSet1.FieldValues['F']), ',', '', [rfReplaceAll, rfIgnoreCase]); + ADODataSet2.FieldByName('b' ).Value := ADODataSet1.FieldValues['G']; + ADODataSet2.FieldByName('Tw|v' ).Value := StringReplace(VarToStr(ADODataSet1.FieldValues['H']), ',', '', [rfReplaceAll, rfIgnoreCase]); + ADODataSet2.FieldByName('pqܤ@').Value := ADODataSet1.FieldValues['I']; + ADODataSet1.MoveBy(1); + + ADODataSet2.FieldByName('' ).Value := ADODataSet1.FieldValues['A']; + ADODataSet2.FieldByName('W' ).Value := ADODataSet1.FieldValues['B']; + ADODataSet2.FieldByName('Ҧr').Value := ADODataSet1.FieldValues['C']; + ADODataSet2.FieldByName('ҫOd' ).Value := ADODataSet1.FieldValues['D']; + ADODataSet2.FieldByName('h' ).AsString := CdatetoEdate(VarToStr(ADODataSet1.FieldValues['E'])); + ADODataSet2.FieldByName('Լ' ).Value := StringReplace(VarToStr(ADODataSet1.FieldValues['F']), ',', '', [rfReplaceAll, rfIgnoreCase]); + ADODataSet2.FieldByName('ҵ|覡' ).Value := ADODataSet1.FieldValues['G']; + ADODataSet2.FieldByName('Tw|B' ).Value := StringReplace(VarToStr(ADODataSet1.FieldValues['H']), ',', '', [rfReplaceAll, rfIgnoreCase]); + ADODataSet2.FieldByName('pqܤG').Value := ADODataSet1.FieldValues['I']; + ADODataSet1.MoveBy(1); + + ADODataSet2.FieldByName('¾' ).Value := ADODataSet1.FieldValues['A']; + ADODataSet2.FieldByName('¾W' ).Value := ADODataSet1.FieldValues['B']; + ADODataSet2.FieldByName('Bêp' ).Value := ADODataSet1.FieldValues['C']; + ADODataSet2.FieldByName('OX' ).Value := ADODataSet1.FieldValues['D']; + ADODataSet2.FieldByName('껺' ).AsString := CdatetoEdate(VarToStr(ADODataSet1.FieldValues['E'])); + ADODataSet2.FieldByName('h').Value := ADODataSet1.FieldValues['F']; + ADODataSet2.FieldByName('ya}' ).Value := ADODataSet1.FieldValues['G']; + ADODataSet1.MoveBy(1); + + ADODataSet2.FieldByName('Ǿ' ).Value := ADODataSet1.FieldValues['A']; + ADODataSet2.FieldByName('ɧU' ).Value := ADODataSet1.FieldValues['B']; + ADODataSet2.FieldByName('~' ).Value := StringReplace(VarToStr(ADODataSet1.FieldValues['C']), ',', '', [rfReplaceAll, rfIgnoreCase]); + ADODataSet2.FieldByName('úO').Value := ADODataSet1.FieldValues['D']; + ADODataSet2.FieldByName('qTa}' ).Value := ADODataSet1.FieldValues['G']; + ADODataSet1.MoveBy(1); + + ADODataSet2.Post; + end; + + ADOConnection1.Connected := False; +end; + +procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); +begin + ADOConnection2.Connected := False; +end; + +end. diff --git a/Delphi/Project1.cfg b/Delphi/Project1.cfg new file mode 100644 index 0000000..6c57635 --- /dev/null +++ b/Delphi/Project1.cfg @@ -0,0 +1,38 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-LE"c:\program files\borland\delphi7\Projects\Bpl" +-LN"c:\program files\borland\delphi7\Projects\Bpl" +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/Delphi/Project1.dof b/Delphi/Project1.dof new file mode 100644 index 0000000..4d64b3d --- /dev/null +++ b/Delphi/Project1.dof @@ -0,0 +1,136 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=0 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1028 +CodePage=950 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= diff --git a/Delphi/Project1.dpr b/Delphi/Project1.dpr new file mode 100644 index 0000000..513a1dd --- /dev/null +++ b/Delphi/Project1.dpr @@ -0,0 +1,13 @@ +program Project1; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Delphi/Project1.exe b/Delphi/Project1.exe new file mode 100644 index 0000000..1b44ddc Binary files /dev/null and b/Delphi/Project1.exe differ diff --git a/Delphi/Project1.res b/Delphi/Project1.res new file mode 100644 index 0000000..75eb6df Binary files /dev/null and b/Delphi/Project1.res differ diff --git a/Delphi/Project1.stat b/Delphi/Project1.stat new file mode 100644 index 0000000..7e5e1b6 --- /dev/null +++ b/Delphi/Project1.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=1797 +DesignerSecs=531 +InspectorSecs=860 +CompileSecs=46832 +OtherSecs=713 +StartTime=2007/11/27 10:11:30 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=4128 diff --git a/Delphi/Unit1.dcu b/Delphi/Unit1.dcu new file mode 100644 index 0000000..cbbb839 Binary files /dev/null and b/Delphi/Unit1.dcu differ diff --git a/Delphi/Unit1.ddp b/Delphi/Unit1.ddp new file mode 100644 index 0000000..4370276 Binary files /dev/null and b/Delphi/Unit1.ddp differ diff --git a/Delphi/Unit1.dfm b/Delphi/Unit1.dfm new file mode 100644 index 0000000..13039ea --- /dev/null +++ b/Delphi/Unit1.dfm @@ -0,0 +1,454 @@ +object Form1: TForm1 + Left = 261 + Top = 220 + Width = 870 + Height = 640 + Caption = 'Form1' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'MiNGLIU' + Font.Style = [] + OldCreateOrder = False + OnClose = FormClose + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 12 + object Splitter2: TSplitter + Left = 0 + Top = 306 + Width = 862 + Height = 5 + Cursor = crVSplit + Align = alTop + end + object Memo1: TMemo + Left = 0 + Top = 352 + Width = 862 + Height = 256 + Align = alClient + TabOrder = 0 + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 862 + Height = 306 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Splitter1: TSplitter + Left = 201 + Top = 0 + Width = 5 + Height = 306 + end + object DBGrid2: WDBGRID + Left = 0 + Top = 0 + Width = 201 + Height = 306 + Align = alLeft + DataSource = DataSource1 + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -12 + TitleFont.Name = 'MiNGLIU' + TitleFont.Style = [] + IsTwoColor = True + TwoColor = 12648447 + TwoFontColor = clWindowText + AllowAppend = True + AllowDelete = True + IsVerScrollBar = True + MenuShow = [msWDGM, msExcel, msDBF, msDB, msTXT, msMDB] + end + object DBGrid1: WDBGRID + Left = 206 + Top = 0 + Width = 656 + Height = 306 + Align = alClient + DataSource = DataSource2 + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -12 + TitleFont.Name = 'MiNGLIU' + TitleFont.Style = [] + IsTwoColor = True + TwoColor = 12648447 + TwoFontColor = clWindowText + AllowAppend = True + AllowDelete = True + IsVerScrollBar = True + MenuShow = [msWDGM, msExcel, msDBF, msDB, msTXT, msMDB] + Columns = < + item + Expanded = False + FieldName = #34920#26684#21517#31281 + Width = -1 + Visible = False + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #38917#27425 + Width = 28 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #27396#20301#21517#31281 + Width = 60 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #22411#24907 + PickList.Strings = ( + 'CHAR' + 'NCHAR' + 'TEXT' + 'NTEXT' + 'VARCHAR' + 'NVARCHAR' + 'INT' + 'DECIMAL' + 'DATETIME' + 'DOUBLE' + 'IMAGE') + Width = 60 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #38263#24230 + Width = 28 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #23567#25976 + Width = 28 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = 'PK' + Width = 16 + Visible = True + Check = True + ValueChecked = 'V' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = 'FK' + Width = 16 + Visible = True + Check = True + ValueChecked = 'V' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #20013#25991#21517#31281 + Width = 120 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #39023#31034#20803#20214 + PickList.Strings = ( + 'Label' + 'TextBox' + 'CheckBox' + 'ComboBox' + 'Memo' + 'Picture') + Width = 80 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #32232#36655#20803#20214 + PickList.Strings = ( + 'Label' + 'TextBox' + 'CheckBox' + 'ComboBox' + 'Memo' + 'Picture') + Width = 80 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #20633#35387 + Width = 1500 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end> + end + end + object Panel2: TPanel + Left = 0 + Top = 311 + Width = 862 + Height = 41 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Button1: TButton + Left = 8 + Top = 8 + Width = 105 + Height = 25 + Caption = #29986#29983' Create SQL' + TabOrder = 0 + OnClick = Button1Click + end + object Button2: TButton + Left = 120 + Top = 8 + Width = 121 + Height = 25 + Caption = #29986#29983' ItemTemplate' + TabOrder = 1 + end + object Button3: TButton + Left = 248 + Top = 8 + Width = 121 + Height = 25 + Caption = #29986#29983' InsertTemplate' + TabOrder = 2 + end + end + object ADOConnection1: TADOConnection + ConnectionString = + 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=N:\VS.NET\Thinkyu\D' + + 'elphi\'#36039#26009#34920'.mdb;Persist Security Info=False' + LoginPrompt = False + Mode = cmShareDenyNone + Provider = 'Microsoft.Jet.OLEDB.4.0' + Left = 168 + Top = 408 + end + object ADODataSet1: TADODataSet + Connection = ADOConnection1 + CursorType = ctStatic + AfterScroll = ADODataSet1AfterScroll + CommandText = 'SELECT * FROM ['#36039#26009#34920'] ORDER BY ['#34920#26684#21517#31281']' + Parameters = <> + Left = 272 + Top = 408 + end + object DataSource1: TDataSource + DataSet = ADODataSet1 + Left = 368 + Top = 408 + end + object ADODataSet2: TADODataSet + Connection = ADOConnection1 + CursorType = ctStatic + AfterInsert = ADODataSet2AfterInsert + CommandText = 'SELECT * FROM ['#27396#20301'] WHERE ['#34920#26684#21517#31281']=:'#34920#26684#21517#31281#13#10'ORDER BY ['#38917#27425']' + MasterFields = #34920#26684#21517#31281 + Parameters = < + item + Name = #34920#26684#21517#31281 + Attributes = [paNullable] + DataType = ftWideString + NumericScale = 255 + Precision = 255 + Size = 10 + Value = 'BCUS' + end> + Left = 272 + Top = 480 + object ADODataSet2DSDesigner: TWideStringField + FieldName = #34920#26684#21517#31281 + end + object ADODataSet2DSDesigner2: TSmallintField + FieldName = #38917#27425 + end + object ADODataSet2DSDesigner3: TWideStringField + FieldName = #27396#20301#21517#31281 + end + object ADODataSet2DSDesigner4: TWideStringField + FieldName = #22411#24907 + Size = 10 + end + object ADODataSet2DSDesigner5: TSmallintField + FieldName = #38263#24230 + end + object ADODataSet2DSDesigner6: TSmallintField + FieldName = #23567#25976 + end + object ADODataSet2PK: TWideStringField + FieldName = 'PK' + Size = 1 + end + object ADODataSet2FK: TWideStringField + FieldName = 'FK' + Size = 1 + end + object ADODataSet2DSDesigner7: TWideStringField + FieldName = #20013#25991#21517#31281 + end + object ADODataSet2DSDesigner8: TWideStringField + FieldName = #39023#31034#20803#20214 + end + object ADODataSet2DSDesigner9: TWideStringField + FieldName = #32232#36655#20803#20214 + end + object ADODataSet2DSDesigner10: TWideStringField + FieldName = #20633#35387 + Size = 255 + end + object ADODataSet2MaxItem: TAggregateField + FieldName = 'MaxItem' + Active = True + Expression = 'MAX('#38917#27425')' + end + end + object DataSource2: TDataSource + DataSet = ADODataSet2 + Left = 368 + Top = 480 + end + object DataSetProvider1: TDataSetProvider + DataSet = ADODataSet2 + ResolveToDataSet = True + Options = [poAutoRefresh] + Left = 464 + Top = 480 + end + object ClientDataSet1: TClientDataSet + Aggregates = <> + AggregatesActive = True + FetchOnDemand = False + Params = <> + ProviderName = 'DataSetProvider1' + AfterInsert = ClientDataSet1AfterInsert + AfterPost = ClientDataSet1AfterPost + Left = 552 + Top = 480 + object ClientDataSet1CDSDesigner: TWideStringField + FieldName = #34920#26684#21517#31281 + ProviderFlags = [pfInUpdate, pfInWhere, pfInKey] + end + object ClientDataSet1CDSDesigner2: TSmallintField + FieldName = #38917#27425 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1CDSDesigner3: TWideStringField + FieldName = #27396#20301#21517#31281 + ProviderFlags = [pfInUpdate, pfInWhere, pfInKey] + end + object ClientDataSet1CDSDesigner4: TWideStringField + FieldName = #22411#24907 + ProviderFlags = [pfInUpdate] + Size = 10 + end + object ClientDataSet1CDSDesigner5: TSmallintField + FieldName = #38263#24230 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1CDSDesigner6: TSmallintField + FieldName = #23567#25976 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1PK: TWideStringField + FieldName = 'PK' + ProviderFlags = [pfInUpdate] + Size = 1 + end + object ClientDataSet1FK: TWideStringField + FieldName = 'FK' + ProviderFlags = [pfInUpdate] + Size = 1 + end + object ClientDataSet1CDSDesigner7: TWideStringField + FieldName = #20013#25991#21517#31281 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1CDSDesigner8: TWideStringField + FieldName = #39023#31034#20803#20214 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1CDSDesigner9: TWideStringField + FieldName = #32232#36655#20803#20214 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1CDSDesigner10: TWideStringField + FieldName = #20633#35387 + ProviderFlags = [pfInUpdate] + Size = 255 + end + object ClientDataSet1MAXItem: TAggregateField + FieldName = 'MAXItem' + Active = True + Expression = 'MAX('#38917#27425')' + end + end +end diff --git a/Delphi/Unit1.pas b/Delphi/Unit1.pas new file mode 100644 index 0000000..da2182b --- /dev/null +++ b/Delphi/Unit1.pas @@ -0,0 +1,189 @@ +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, ExtCtrls, wdbreg, DBClient, + Provider; + +type + TForm1 = class(TForm) + ADOConnection1: TADOConnection; + ADODataSet1: TADODataSet; + Memo1: TMemo; + DataSource1: TDataSource; + ADODataSet2: TADODataSet; + DataSource2: TDataSource; + Panel1: TPanel; + DBGrid2: WDBGRID; + DBGrid1: WDBGRID; + Splitter1: TSplitter; + Splitter2: TSplitter; + DataSetProvider1: TDataSetProvider; + ClientDataSet1: TClientDataSet; + ClientDataSet1MAXItem: TAggregateField; + Panel2: TPanel; + Button1: TButton; + Button2: TButton; + Button3: TButton; + ADODataSet2MaxItem: TAggregateField; + ClientDataSet1CDSDesigner: TWideStringField; + ClientDataSet1CDSDesigner2: TSmallintField; + ClientDataSet1CDSDesigner3: TWideStringField; + ClientDataSet1CDSDesigner4: TWideStringField; + ClientDataSet1CDSDesigner5: TSmallintField; + ClientDataSet1CDSDesigner6: TSmallintField; + ClientDataSet1PK: TWideStringField; + ClientDataSet1FK: TWideStringField; + ClientDataSet1CDSDesigner7: TWideStringField; + ClientDataSet1CDSDesigner8: TWideStringField; + ClientDataSet1CDSDesigner9: TWideStringField; + ClientDataSet1CDSDesigner10: TWideStringField; + ADODataSet2DSDesigner: TWideStringField; + ADODataSet2DSDesigner2: TSmallintField; + ADODataSet2DSDesigner3: TWideStringField; + ADODataSet2DSDesigner4: TWideStringField; + ADODataSet2DSDesigner5: TSmallintField; + ADODataSet2DSDesigner6: TSmallintField; + ADODataSet2PK: TWideStringField; + ADODataSet2FK: TWideStringField; + ADODataSet2DSDesigner7: TWideStringField; + ADODataSet2DSDesigner8: TWideStringField; + ADODataSet2DSDesigner9: TWideStringField; + ADODataSet2DSDesigner10: TWideStringField; + procedure FormCreate(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure ListBox1Click(Sender: TObject); + procedure ADODataSet1AfterScroll(DataSet: TDataSet); + procedure Button1Click(Sender: TObject); + procedure ClientDataSet1AfterInsert(DataSet: TDataSet); + procedure ClientDataSet1AfterPost(DataSet: TDataSet); + procedure ADODataSet2AfterInsert(DataSet: TDataSet); + private + procedure GenerateCreateSQL; + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.dfm} + +procedure TForm1.FormCreate(Sender: TObject); +var i: integer; +begin + ADOConnection1.Connected := True; + ADODataSet1.Open; + ADODataSet2.Open; + //ClientDataSet1.Open; +end; + +procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); +begin + ADODataSet2.Close; + ADODataSet1.Close; + ADOConnection1.Connected := False; +end; + +procedure TForm1.ListBox1Click(Sender: TObject); +begin + //if ListBox1.ItemIndex = -1 then + // Exit; + + //ADODataSet1.Active := False; + //ADODataSet1.CommandText := Format('SELECT * FROM [%S]', [ListBox1.Items[ListBox1.ItemIndex]]); + //ADODataSet1.Active := True; + + //GenerateCreateSQL; +end; + +procedure TForm1.GenerateCreateSQL; +var recno: integer; + s: string; + fieldName, fieldType: string; + aLength, aDecimal: integer; +begin + Memo1.Lines.Clear; + Memo1.Lines.Append(Format('CREATE TABLE %s (', [ADODataSet2.FieldByName('W').AsString])); + + ClientDataSet1.DisableControls; + ClientDataSet1.First; + recno := 1; + while not ClientDataSet1.Eof do + begin + fieldName := ClientDataSet1.FieldByName('W').AsString; + fieldType := ClientDataSet1.FieldByName('A').AsString; + aLength := ClientDataSet1.FieldByName('').AsInteger; + aDecimal := ClientDataSet1.FieldByName('p').AsInteger; + s := Format(' %s %s', [fieldName, fieldType]); + + if fieldType = 'DECIMAL' then + s := s + Format(' (%d, %d)', [aLength, aDecimal]) + else if Pos(fieldType, 'CHAR,NCHAR,VARCHAR,NVARCHAR') > 0 then + s := s + Format(' (%d)', [aLength]); + + if ClientDataSet1.FieldByName('PK').AsString = 'V' then + s := s + ' NOT NULL '; + + if recno < ClientDataSet1.RecordCount then + s := s + ' ,' + else + s := s + ' )'; + Memo1.Lines.Append(s); + Inc(recno); + ClientDataSet1.MoveBy(1); + end; + Memo1.Lines.Append('GO'); + + ClientDataSet1.First; + ClientDataSet1.EnableControls; +end; + +procedure TForm1.ADODataSet1AfterScroll(DataSet: TDataSet); +begin + ClientDataSet1.Close; + ADODataSet2.DisableControls; + ADODataSet2.Close; + ADODataSet2.Parameters.ParamValues['W'] := ADODataSet1.FieldValues['W']; + ADODataSet2.Open; + ClientDataSet1.Open; + ADODataSet2.EnableControls; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + GenerateCreateSQL; +end; + +procedure TForm1.ClientDataSet1AfterInsert(DataSet: TDataSet); +begin + { + if VarIsNull(ClientDataSet1.FieldByName('MAXItem').Value) then + ClientDataSet1.FieldByName('').AsInteger := 1 + else + ClientDataSet1.FieldByName('').AsInteger := ClientDataSet1.FieldByName('MAXItem').Value + 1; + ClientDataSet1.FieldByName('W').AsString := ADODataSet1.FieldValues['W']; + } +end; + +procedure TForm1.ClientDataSet1AfterPost(DataSet: TDataSet); +//var i: integer; +begin + //i := ClientDataSet1.ApplyUpdates(0); +end; + +procedure TForm1.ADODataSet2AfterInsert(DataSet: TDataSet); +begin + if VarIsNull(ClientDataSet1.FieldByName('MAXItem').Value) then + ADODataSet2.FieldByName('').AsInteger := 1 + else + ADODataSet2.FieldByName('').AsInteger := ClientDataSet1.FieldByName('MAXItem').Value + 1; + ADODataSet2.FieldByName('W').AsString := ADODataSet1.FieldValues['W']; +end; + +end. diff --git a/Delphi/Unit1.~ddp b/Delphi/Unit1.~ddp new file mode 100644 index 0000000..4370276 Binary files /dev/null and b/Delphi/Unit1.~ddp differ diff --git a/Delphi/Unit1.~dfm b/Delphi/Unit1.~dfm new file mode 100644 index 0000000..fc9fc12 --- /dev/null +++ b/Delphi/Unit1.~dfm @@ -0,0 +1,453 @@ +object Form1: TForm1 + Left = 261 + Top = 220 + Width = 870 + Height = 640 + Caption = 'Form1' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'MiNGLIU' + Font.Style = [] + OldCreateOrder = False + OnClose = FormClose + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 12 + object Splitter2: TSplitter + Left = 0 + Top = 306 + Width = 862 + Height = 5 + Cursor = crVSplit + Align = alTop + end + object Memo1: TMemo + Left = 0 + Top = 352 + Width = 862 + Height = 256 + Align = alClient + TabOrder = 0 + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 862 + Height = 306 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Splitter1: TSplitter + Left = 201 + Top = 0 + Width = 5 + Height = 306 + end + object DBGrid2: WDBGRID + Left = 0 + Top = 0 + Width = 201 + Height = 306 + Align = alLeft + DataSource = DataSource1 + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -12 + TitleFont.Name = 'MiNGLIU' + TitleFont.Style = [] + IsTwoColor = True + TwoColor = 12648447 + TwoFontColor = clWindowText + AllowAppend = True + AllowDelete = True + IsVerScrollBar = True + MenuShow = [msWDGM, msExcel, msDBF, msDB, msTXT, msMDB] + end + object DBGrid1: WDBGRID + Left = 206 + Top = 0 + Width = 656 + Height = 306 + Align = alClient + DataSource = DataSource2 + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -12 + TitleFont.Name = 'MiNGLIU' + TitleFont.Style = [] + IsTwoColor = True + TwoColor = 12648447 + TwoFontColor = clWindowText + AllowAppend = True + AllowDelete = True + IsVerScrollBar = True + MenuShow = [msWDGM, msExcel, msDBF, msDB, msTXT, msMDB] + Columns = < + item + Expanded = False + FieldName = #34920#26684#21517#31281 + Width = -1 + Visible = False + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #38917#27425 + Width = 28 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #27396#20301#21517#31281 + Width = 60 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #22411#24907 + PickList.Strings = ( + 'CHAR' + 'NCHAR' + 'TEXT' + 'NTEXT' + 'VARCHAR' + 'NVARCHAR' + 'INT' + 'DECIMAL' + 'DATETIME' + 'DOUBLE' + 'IMAGE') + Width = 60 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #38263#24230 + Width = 28 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #23567#25976 + Width = 28 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = 'PK' + Width = 16 + Visible = True + Check = True + ValueChecked = 'V' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = 'FK' + Width = 16 + Visible = True + Check = True + ValueChecked = 'V' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #20013#25991#21517#31281 + Width = 120 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #39023#31034#20803#20214 + PickList.Strings = ( + 'Label' + 'TextBox' + 'CheckBox' + 'ComboBox' + 'Memo' + 'Picture') + Width = 80 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #32232#36655#20803#20214 + PickList.Strings = ( + 'Label' + 'TextBox' + 'CheckBox' + 'ComboBox' + 'Memo' + 'Picture') + Width = 80 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end + item + Expanded = False + FieldName = #20633#35387 + Width = 1500 + Visible = True + ValueChecked = 'T' + ValueUnchecked = 'F' + EditType = etEdit + TwoColor = 12648447 + TwoFontColor = clWindowText + end> + end + end + object Panel2: TPanel + Left = 0 + Top = 311 + Width = 862 + Height = 41 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Button1: TButton + Left = 8 + Top = 8 + Width = 105 + Height = 25 + Caption = #29986#29983' Create SQL' + TabOrder = 0 + OnClick = Button1Click + end + object Button2: TButton + Left = 120 + Top = 8 + Width = 121 + Height = 25 + Caption = #29986#29983' ItemTemplate' + TabOrder = 1 + end + object Button3: TButton + Left = 248 + Top = 8 + Width = 121 + Height = 25 + Caption = #29986#29983' InsertTemplate' + TabOrder = 2 + end + end + object ADOConnection1: TADOConnection + ConnectionString = + 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=N:\VS.NET\Thinkyu\D' + + 'elphi\'#36039#26009#34920'.mdb;Persist Security Info=False' + LoginPrompt = False + Mode = cmShareDenyNone + Provider = 'Microsoft.Jet.OLEDB.4.0' + Left = 168 + Top = 408 + end + object ADODataSet1: TADODataSet + Connection = ADOConnection1 + CursorType = ctStatic + AfterScroll = ADODataSet1AfterScroll + CommandText = 'SELECT * FROM ['#36039#26009#34920'] ORDER BY ['#34920#26684#21517#31281']' + Parameters = <> + Left = 272 + Top = 408 + end + object DataSource1: TDataSource + DataSet = ADODataSet1 + Left = 368 + Top = 408 + end + object ADODataSet2: TADODataSet + Connection = ADOConnection1 + CursorType = ctStatic + CommandText = 'SELECT * FROM ['#27396#20301'] WHERE ['#34920#26684#21517#31281']=:'#34920#26684#21517#31281#13#10'ORDER BY ['#38917#27425']' + MasterFields = #34920#26684#21517#31281 + Parameters = < + item + Name = #34920#26684#21517#31281 + Attributes = [paNullable] + DataType = ftWideString + NumericScale = 255 + Precision = 255 + Size = 10 + Value = 'BCUS' + end> + Left = 272 + Top = 480 + object ADODataSet2DSDesigner: TWideStringField + FieldName = #34920#26684#21517#31281 + end + object ADODataSet2DSDesigner2: TSmallintField + FieldName = #38917#27425 + end + object ADODataSet2DSDesigner3: TWideStringField + FieldName = #27396#20301#21517#31281 + end + object ADODataSet2DSDesigner4: TWideStringField + FieldName = #22411#24907 + Size = 10 + end + object ADODataSet2DSDesigner5: TSmallintField + FieldName = #38263#24230 + end + object ADODataSet2DSDesigner6: TSmallintField + FieldName = #23567#25976 + end + object ADODataSet2PK: TWideStringField + FieldName = 'PK' + Size = 1 + end + object ADODataSet2FK: TWideStringField + FieldName = 'FK' + Size = 1 + end + object ADODataSet2DSDesigner7: TWideStringField + FieldName = #20013#25991#21517#31281 + end + object ADODataSet2DSDesigner8: TWideStringField + FieldName = #39023#31034#20803#20214 + end + object ADODataSet2DSDesigner9: TWideStringField + FieldName = #32232#36655#20803#20214 + end + object ADODataSet2DSDesigner10: TWideStringField + FieldName = #20633#35387 + Size = 255 + end + object ADODataSet2MaxItem: TAggregateField + FieldName = 'MaxItem' + Active = True + Expression = 'MAX('#38917#27425')' + end + end + object DataSource2: TDataSource + DataSet = ADODataSet2 + Left = 368 + Top = 480 + end + object DataSetProvider1: TDataSetProvider + DataSet = ADODataSet2 + ResolveToDataSet = True + Options = [poAutoRefresh] + Left = 464 + Top = 480 + end + object ClientDataSet1: TClientDataSet + Aggregates = <> + AggregatesActive = True + FetchOnDemand = False + Params = <> + ProviderName = 'DataSetProvider1' + AfterInsert = ClientDataSet1AfterInsert + AfterPost = ClientDataSet1AfterPost + Left = 552 + Top = 480 + object ClientDataSet1CDSDesigner: TWideStringField + FieldName = #34920#26684#21517#31281 + ProviderFlags = [pfInUpdate, pfInWhere, pfInKey] + end + object ClientDataSet1CDSDesigner2: TSmallintField + FieldName = #38917#27425 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1CDSDesigner3: TWideStringField + FieldName = #27396#20301#21517#31281 + ProviderFlags = [pfInUpdate, pfInWhere, pfInKey] + end + object ClientDataSet1CDSDesigner4: TWideStringField + FieldName = #22411#24907 + ProviderFlags = [pfInUpdate] + Size = 10 + end + object ClientDataSet1CDSDesigner5: TSmallintField + FieldName = #38263#24230 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1CDSDesigner6: TSmallintField + FieldName = #23567#25976 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1PK: TWideStringField + FieldName = 'PK' + ProviderFlags = [pfInUpdate] + Size = 1 + end + object ClientDataSet1FK: TWideStringField + FieldName = 'FK' + ProviderFlags = [pfInUpdate] + Size = 1 + end + object ClientDataSet1CDSDesigner7: TWideStringField + FieldName = #20013#25991#21517#31281 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1CDSDesigner8: TWideStringField + FieldName = #39023#31034#20803#20214 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1CDSDesigner9: TWideStringField + FieldName = #32232#36655#20803#20214 + ProviderFlags = [pfInUpdate] + end + object ClientDataSet1CDSDesigner10: TWideStringField + FieldName = #20633#35387 + ProviderFlags = [pfInUpdate] + Size = 255 + end + object ClientDataSet1MAXItem: TAggregateField + FieldName = 'MAXItem' + Active = True + Expression = 'MAX('#38917#27425')' + end + end +end diff --git a/Delphi/Unit1.~pas b/Delphi/Unit1.~pas new file mode 100644 index 0000000..406b0e0 --- /dev/null +++ b/Delphi/Unit1.~pas @@ -0,0 +1,180 @@ +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, ExtCtrls, wdbreg, DBClient, + Provider; + +type + TForm1 = class(TForm) + ADOConnection1: TADOConnection; + ADODataSet1: TADODataSet; + Memo1: TMemo; + DataSource1: TDataSource; + ADODataSet2: TADODataSet; + DataSource2: TDataSource; + Panel1: TPanel; + DBGrid2: WDBGRID; + DBGrid1: WDBGRID; + Splitter1: TSplitter; + Splitter2: TSplitter; + DataSetProvider1: TDataSetProvider; + ClientDataSet1: TClientDataSet; + ClientDataSet1MAXItem: TAggregateField; + Panel2: TPanel; + Button1: TButton; + Button2: TButton; + Button3: TButton; + ADODataSet2MaxItem: TAggregateField; + ClientDataSet1CDSDesigner: TWideStringField; + ClientDataSet1CDSDesigner2: TSmallintField; + ClientDataSet1CDSDesigner3: TWideStringField; + ClientDataSet1CDSDesigner4: TWideStringField; + ClientDataSet1CDSDesigner5: TSmallintField; + ClientDataSet1CDSDesigner6: TSmallintField; + ClientDataSet1PK: TWideStringField; + ClientDataSet1FK: TWideStringField; + ClientDataSet1CDSDesigner7: TWideStringField; + ClientDataSet1CDSDesigner8: TWideStringField; + ClientDataSet1CDSDesigner9: TWideStringField; + ClientDataSet1CDSDesigner10: TWideStringField; + ADODataSet2DSDesigner: TWideStringField; + ADODataSet2DSDesigner2: TSmallintField; + ADODataSet2DSDesigner3: TWideStringField; + ADODataSet2DSDesigner4: TWideStringField; + ADODataSet2DSDesigner5: TSmallintField; + ADODataSet2DSDesigner6: TSmallintField; + ADODataSet2PK: TWideStringField; + ADODataSet2FK: TWideStringField; + ADODataSet2DSDesigner7: TWideStringField; + ADODataSet2DSDesigner8: TWideStringField; + ADODataSet2DSDesigner9: TWideStringField; + ADODataSet2DSDesigner10: TWideStringField; + procedure FormCreate(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure ListBox1Click(Sender: TObject); + procedure ADODataSet1AfterScroll(DataSet: TDataSet); + procedure Button1Click(Sender: TObject); + procedure ClientDataSet1AfterInsert(DataSet: TDataSet); + procedure ClientDataSet1AfterPost(DataSet: TDataSet); + private + procedure GenerateCreateSQL; + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.dfm} + +procedure TForm1.FormCreate(Sender: TObject); +var i: integer; +begin + ADOConnection1.Connected := True; + ADODataSet1.Open; + ADODataSet2.Open; + //ClientDataSet1.Open; +end; + +procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); +begin + ADODataSet2.Close; + ADODataSet1.Close; + ADOConnection1.Connected := False; +end; + +procedure TForm1.ListBox1Click(Sender: TObject); +begin + //if ListBox1.ItemIndex = -1 then + // Exit; + + //ADODataSet1.Active := False; + //ADODataSet1.CommandText := Format('SELECT * FROM [%S]', [ListBox1.Items[ListBox1.ItemIndex]]); + //ADODataSet1.Active := True; + + //GenerateCreateSQL; +end; + +procedure TForm1.GenerateCreateSQL; +var recno: integer; + s: string; + fieldName, fieldType: string; + aLength, aDecimal: integer; +begin + Memo1.Lines.Clear; + Memo1.Lines.Append(Format('CREATE TABLE %s (', [ADODataSet2.FieldByName('W').AsString])); + + ClientDataSet1.DisableControls; + ClientDataSet1.First; + recno := 1; + while not ClientDataSet1.Eof do + begin + fieldName := ClientDataSet1.FieldByName('W').AsString; + fieldType := ClientDataSet1.FieldByName('A').AsString; + aLength := ClientDataSet1.FieldByName('').AsInteger; + aDecimal := ClientDataSet1.FieldByName('p').AsInteger; + s := Format(' %s %s', [fieldName, fieldType]); + + if fieldType = 'DECIMAL' then + s := s + Format(' (%d, %d)', [aLength, aDecimal]) + else if Pos(fieldType, 'CHAR,NCHAR,VARCHAR,NVARCHAR') > 0 then + s := s + Format(' (%d)', [aLength]); + + if ClientDataSet1.FieldByName('PK').AsString = 'V' then + s := s + ' NOT NULL '; + + if recno < ClientDataSet1.RecordCount then + s := s + ' ,' + else + s := s + ' )'; + Memo1.Lines.Append(s); + Inc(recno); + ClientDataSet1.MoveBy(1); + end; + Memo1.Lines.Append('GO'); + + ClientDataSet1.First; + ClientDataSet1.EnableControls; +end; + +procedure TForm1.ADODataSet1AfterScroll(DataSet: TDataSet); +begin + ClientDataSet1.Close; + ADODataSet2.DisableControls; + ADODataSet2.Close; + ADODataSet2.Parameters.ParamValues['W'] := ADODataSet1.FieldValues['W']; + ADODataSet2.Open; + ClientDataSet1.Open; + ADODataSet2.EnableControls; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + GenerateCreateSQL; +end; + +procedure TForm1.ClientDataSet1AfterInsert(DataSet: TDataSet); +begin + if VarIsNull(ClientDataSet1.FieldByName('MAXItem').Value) then + //ClientDataSet1.FieldByName('').AsInteger := 1 + ADODataSet2.FieldByName('').AsInteger := 1 + else + //ClientDataSet1.FieldByName('').AsInteger := ClientDataSet1.FieldByName('MAXItem').Value + 1; + ADODataSet2.FieldByName('').AsInteger := ClientDataSet1.FieldByName('MAXItem').Value + 1; + //ClientDataSet1.FieldByName('W').AsString := ADODataSet1.FieldValues['W']; + ADODataSet2.FieldByName('W').AsString := ADODataSet1.FieldValues['W']; +end; + +procedure TForm1.ClientDataSet1AfterPost(DataSet: TDataSet); +//var i: integer; +begin + //i := ClientDataSet1.ApplyUpdates(0); +end; + +end. diff --git a/Delphi/資料表.mdb b/Delphi/資料表.mdb new file mode 100644 index 0000000..108b4da Binary files /dev/null and b/Delphi/資料表.mdb differ diff --git a/Delphi/資料表.xls b/Delphi/資料表.xls new file mode 100644 index 0000000..10576a6 Binary files /dev/null and b/Delphi/資料表.xls differ diff --git a/Doc/(THINKYU_WEB)_Table_Schema.xlsx b/Doc/(THINKYU_WEB)_Table_Schema.xlsx new file mode 100644 index 0000000..b561468 Binary files /dev/null and b/Doc/(THINKYU_WEB)_Table_Schema.xlsx differ diff --git a/Doc/(THINKYU_WEB)_Table_Schema_20251109.xlsx b/Doc/(THINKYU_WEB)_Table_Schema_20251109.xlsx new file mode 100644 index 0000000..b1c7c1d Binary files /dev/null and b/Doc/(THINKYU_WEB)_Table_Schema_20251109.xlsx differ diff --git a/Doc/(領據系統)TableSchema.xlsx b/Doc/(領據系統)TableSchema.xlsx new file mode 100644 index 0000000..4e9e76a Binary files /dev/null and b/Doc/(領據系統)TableSchema.xlsx differ diff --git a/Doc/1051206立法院三讀通過勞基法部分條文修正案_新舊條文對照表.pdf b/Doc/1051206立法院三讀通過勞基法部分條文修正案_新舊條文對照表.pdf new file mode 100644 index 0000000..93c2710 Binary files /dev/null and b/Doc/1051206立法院三讀通過勞基法部分條文修正案_新舊條文對照表.pdf differ diff --git a/Doc/20120629 差勤系統網站問題與解決.docx b/Doc/20120629 差勤系統網站問題與解決.docx new file mode 100644 index 0000000..4bbd4aa Binary files /dev/null and b/Doc/20120629 差勤系統網站問題與解決.docx differ diff --git a/Doc/20120706補休時數核對(All)-new.xlsx b/Doc/20120706補休時數核對(All)-new.xlsx new file mode 100644 index 0000000..e92c93a Binary files /dev/null and b/Doc/20120706補休時數核對(All)-new.xlsx differ diff --git a/Doc/20120706補休時數核對(All).xlsx b/Doc/20120706補休時數核對(All).xlsx new file mode 100644 index 0000000..7ccef00 Binary files /dev/null and b/Doc/20120706補休時數核對(All).xlsx differ diff --git a/Doc/20200220_系統功能清單.xlsx b/Doc/20200220_系統功能清單.xlsx new file mode 100644 index 0000000..b2e4c7e Binary files /dev/null and b/Doc/20200220_系統功能清單.xlsx differ diff --git a/Doc/SA/班表&人員排班.rp b/Doc/SA/班表&人員排班.rp new file mode 100644 index 0000000..5670bca Binary files /dev/null and b/Doc/SA/班表&人員排班.rp differ diff --git a/Doc/SQL/查補休.SQL b/Doc/SQL/查補休.SQL new file mode 100644 index 0000000..e4be289 --- /dev/null +++ b/Doc/SQL/查補休.SQL @@ -0,0 +1,17 @@ +DECLARE @RPENO NVARCHAR(20) +SET @RPENO='01642' + +--Xֿnɥ +SELECT * FROM RPAR WHERE RPNUM=@RPENO AND (RPTYP = '11' OR RPTYP = '13') AND RPRDT > '2017/7/1' + +--XɥRPO +SELECT * FROM RPAC WHERE RPREX IN + (SELECT RPREN FROM RPAR WHERE RPNUM=@RPENO AND (RPTYP = '11' OR RPTYP = '13') AND RPRDT > '2017/7/1') + +SELECT * FROM RPAR WHERE RPREN='2017090727' + +--UPDATE RPAR SET RPUST=0 WHERE RPREN='2017080752' +--UPDATE RPAR SET RPUST=0 WHERE RPREN='2017080861' +--UPDATE RPAR SET RPUST=0 WHERE RPREN='2017090512' +--DELETE FROM RPAC WHERE RPREN='2017090727' +--SELECT * FROM RPAC WHERE RPREN='2017090727' \ No newline at end of file diff --git a/Doc/SQL/講師處理修改.SQL b/Doc/SQL/講師處理修改.SQL new file mode 100644 index 0000000..67407ee --- /dev/null +++ b/Doc/SQL/講師處理修改.SQL @@ -0,0 +1,5 @@ +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, BLOCK, TRDAT, TRMOD, TRUSR, BSRMK, DB_APPNO) VALUES (N'½Ұϰ', 'C1', '', '', GETDATE(), 'INSERT', '', '', 1); +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, BLOCK, TRDAT, TRMOD, TRUSR, BSRMK, DB_APPNO) VALUES (N'½Ұϰ', 'C2', 's', '', GETDATE(), 'INSERT', '', '', 1); +INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, BLOCK, TRDAT, TRMOD, TRUSR, BSRMK, DB_APPNO) VALUES (N'½Ұϰ', 'C3', ']', '', GETDATE(), 'INSERT', '', '', 1); +update BCLS set BSPAR=N'--½Ұϰ' where BSPAR=N'½Ұϰ' and BSCLS='C' +update v set ½Ұϰ=REPLACE(½Ұϰ, 'C', 'C1,C2,C3') where ½Ұϰ like '%C%' \ No newline at end of file diff --git a/Doc/~$系統-101-展譽.docx b/Doc/~$系統-101-展譽.docx new file mode 100644 index 0000000..e2dd27b Binary files /dev/null and b/Doc/~$系統-101-展譽.docx differ diff --git a/Doc/人員派遣系統/20140701最低工资调整之级距表.xlsx b/Doc/人員派遣系統/20140701最低工资调整之级距表.xlsx new file mode 100644 index 0000000..a2e8a6e Binary files /dev/null and b/Doc/人員派遣系統/20140701最低工资调整之级距表.xlsx differ diff --git a/Doc/人員派遣系統/9501台中區個管核銷明細-終級版.xls b/Doc/人員派遣系統/9501台中區個管核銷明細-終級版.xls new file mode 100644 index 0000000..8dc1487 Binary files /dev/null and b/Doc/人員派遣系統/9501台中區個管核銷明細-終級版.xls differ diff --git a/Doc/人員派遣系統/97節假日.txt b/Doc/人員派遣系統/97節假日.txt new file mode 100644 index 0000000..c7ae664 --- /dev/null +++ b/Doc/人員派遣系統/97節假日.txt @@ -0,0 +1,22 @@ +'N':wΥU +'H':Ұ +'V':uʩ +'B':ɯZ +'-':WZ + + 1 2 3 +1234567890123456789012345678901 +N---HH-----HH-----HH-----HH---- +-HH--NNNNHV----HH-----HH---N- +HH-----HH-----HH-----HH-----HH- +---NHH-----HH-----HH-----HH--- +N-HH-----HH-----HH-----HH-----H +H-----HH-----HH-----HH-----HH- +----HH-----HH-----HH-----HH---- +-HH-----HH-----HH-----HH-----HH +-----HH-----HH-----HH-----HH-- +---HH----NHH-----HH-----HH----- +HH-----HH-----HH-----HH-----HH +-----HH-----HH-----HH-----HH--- + +N---HH-----HH-----HH-----HH-----HH--NNNNHV----HH-----HH---N-HH-----HH-----HH-----HH-----HH----NHH-----HH-----HH-----HH---N-HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH----NHH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH-----HH--- \ No newline at end of file diff --git a/Doc/人員派遣系統/A.UDL b/Doc/人員派遣系統/A.UDL new file mode 100644 index 0000000..1399566 Binary files /dev/null and b/Doc/人員派遣系統/A.UDL differ diff --git a/Doc/人員派遣系統/BWMS.xls b/Doc/人員派遣系統/BWMS.xls new file mode 100644 index 0000000..37d5a0c Binary files /dev/null and b/Doc/人員派遣系統/BWMS.xls differ diff --git a/Doc/人員派遣系統/FileZilla Server 修改連線密碼的方法.doc b/Doc/人員派遣系統/FileZilla Server 修改連線密碼的方法.doc new file mode 100644 index 0000000..a8c6253 Binary files /dev/null and b/Doc/人員派遣系統/FileZilla Server 修改連線密碼的方法.doc differ diff --git a/Doc/人員派遣系統/new 1.txt b/Doc/人員派遣系統/new 1.txt new file mode 100644 index 0000000..859741d --- /dev/null +++ b/Doc/人員派遣系統/new 1.txt @@ -0,0 +1,48 @@ +//jO +var bigcat_code=['10000','20000','30000','50000','60000', '70000' ,'0']; +var bigcat_name=['qO','yO','޲zO','dCO','aҸO','sШ|O','ޯVO']; + +//qĤGh +var com_code=['10100','10200','10600','10400','10700','10300','10500','10900','11000','11100','11200']; +var com_name=['@~t','J¦','{y',']p','޲z','줽','hCø','~q','Ʈw','{ҽҵ{','H~V']; + +//Dnﶵ +var cat_code_10100=['10101','10102','10103','10104','10105','10106','10107','10108']; +var cat_name_10100=['Windows','Linux','Unix','Windows2000','Windows NT','Solaris','FreeBSD','Mac OS']; +var cat_code_10200=['10201','10202','10203','10204']; +var cat_name_10200=['Internet¦','J','w','ൣq']; +var cat_code_10300=['10301','10302','10303','10304','10305','10306','10309']; +var cat_name_10300=['Excel','Word','PowerPoint','Access','Outlook','Project','OfficeM˽ҵ{']; +var cat_code_10400=['10401','10402','10403','10404','10405','10406','10407','10408','10409','10410','10429']; +var cat_name_10400=['yk','DHTML','Front Page','Dreamweaver','Flash','Fusion','Java/VB Script','VB Script','XML','Fireworks',']pi']; +var cat_code_10500=['10501','10502','10503','10504','10505','10506','10507','10508','10509','10510','10511','10512','10514','10515','10516','10517','10529']; +var cat_name_10500=['AutoCad','Photoshop','Corel Draw','PhotoImpact','Maya','Primare','Aftereffect','Director','Lightwave','3D Studio','C]p','Softimage','Painter','CakeWalk','PageMaker','Illustrator','hCiZ']; +var cat_code_10600=['10601','10602','10603','10604','10605','10606','10607','10608','10628','10629']; +var cat_name_10600=['ASP','Java','Visual Basic','Visual C++','LotusNotes','Delphi','Assembly','PDA{]p','qlӰȵ{]p','{]pi']; +var cat_code_10700=['10701','10702','10703','10704','10705','10706','10729']; +var cat_name_10700=['NT','Exchange','TCP/IP','OpenVMS','Firewall','ƦqH','ޤu{vV']; +var cat_code_10900=['10901','10902','10903']; +var cat_name_10900=['qlӰ','ERP','Intranet']; +var cat_code_11000=['11001','11002','11003','11004','11005','11006']; +var cat_name_11000=['SQL','VisualFaxpro','Oracle','DB2','Informix','MySQL']; +var cat_code_11100=['11101','11102','11103','11104','11105','11106','11129']; +var cat_name_11100=['TQC{','ACE{','Microsoft{','Cisco{','Novell{','SUN{','qvV']; +var cat_code_11200=['11201']; +var cat_name_11200=['ޤH~V']; + +var cat_code_20000=['20101','20102','20103','20104','20105','20201','20202','20203','20301','20401','20501','20601','20801','20901','21001','21101']; +var cat_name_20000=['^y¦','^y|','ӥέ^y','^yS','ൣ^y','y¦','y','y','ky','Zy','qjQy','wy','dǦҸ','yvV','L~ӻy','']; +var cat_code_30000=['30101','30201','30301','30401','30501','30601','30701','30801','30901','31001','31101','31201','31301','31401','31501']; +var cat_name_30000=['~g','HO귽','PǼ',']Ⱥ޲z','ħ','~eV','~޲z','Ͳ޲z','F','OоDz','Eƺ޲z','ڶT','޲z','Ѻ޲z','غ޲z']; +//var cat_code_40000=['40101','40201','40301','40401','40501']; +//var cat_name_40000=['','V','ź','y','ҷ']; +var cat_code_50000=['50101','50201','50301','50401','50501','50601','50701','50801','50901','51001','52901']; +var cat_name_50000=['Cd','[jCd','^Cd','æCd','DwCd','饻Cd','hCd','wCd','qjQCd','Cd','ڤ']; +var cat_code_60000=['60101','60201','60301','60401','60501']; +var cat_name_60000=['Ҹ','MަҸ','qkS','sҮvZ','gaʲ']; +//sШ|O +var cat_code_70000=['70101','70201','70301','70401']; //,'70501' +var cat_name_70000=['_jM|','jM|','njM|','FjM|']; //,'~q' + +var cat_code_0=['301','401','501','601','701','2901','901','1001','1101','1201','1301','1401','1501']; +var cat_name_0=['ޯҷ','i׾ǤZ','ޤH~V','~ޯ','iƲz','L','yqH~V','u~H~V','A˳]p','Ǥ]p','ev','RzN','ŰV']; diff --git a/Doc/人員派遣系統/中彰投多媽媽核銷報表.xls b/Doc/人員派遣系統/中彰投多媽媽核銷報表.xls new file mode 100644 index 0000000..ad0aa98 Binary files /dev/null and b/Doc/人員派遣系統/中彰投多媽媽核銷報表.xls differ diff --git a/Doc/人員派遣系統/中彰投櫃檯核銷報表.xls b/Doc/人員派遣系統/中彰投櫃檯核銷報表.xls new file mode 100644 index 0000000..c80ae70 Binary files /dev/null and b/Doc/人員派遣系統/中彰投櫃檯核銷報表.xls differ diff --git a/Doc/人員派遣系統/人力派遣系統功能圖.vsd b/Doc/人員派遣系統/人力派遣系統功能圖.vsd new file mode 100644 index 0000000..5d92c60 Binary files /dev/null and b/Doc/人員派遣系統/人力派遣系統功能圖.vsd differ diff --git a/Doc/人員派遣系統/人員資料excel.xls b/Doc/人員派遣系統/人員資料excel.xls new file mode 100644 index 0000000..6d30f72 Binary files /dev/null and b/Doc/人員派遣系統/人員資料excel.xls differ diff --git a/Doc/人員派遣系統/人員資料欄位.xls b/Doc/人員派遣系統/人員資料欄位.xls new file mode 100644 index 0000000..44af52e Binary files /dev/null and b/Doc/人員派遣系統/人員資料欄位.xls differ diff --git a/Doc/人員派遣系統/保費計算方式.doc b/Doc/人員派遣系統/保費計算方式.doc new file mode 100644 index 0000000..199ae91 Binary files /dev/null and b/Doc/人員派遣系統/保費計算方式.doc differ diff --git a/Doc/人員派遣系統/健投保金額負擔表.xls b/Doc/人員派遣系統/健投保金額負擔表.xls new file mode 100644 index 0000000..c12a1af Binary files /dev/null and b/Doc/人員派遣系統/健投保金額負擔表.xls differ diff --git a/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page1).doc b/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page1).doc new file mode 100644 index 0000000..8638ef1 Binary files /dev/null and b/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page1).doc differ diff --git a/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page2).doc b/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page2).doc new file mode 100644 index 0000000..739f406 Binary files /dev/null and b/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page2).doc differ diff --git a/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page3).doc b/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page3).doc new file mode 100644 index 0000000..9d62372 Binary files /dev/null and b/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page3).doc differ diff --git a/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page4).doc b/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page4).doc new file mode 100644 index 0000000..992c9b8 Binary files /dev/null and b/Doc/人員派遣系統/分頁-人才招募-履歷登錄(page4).doc differ diff --git a/Doc/人員派遣系統/加退保.dbf b/Doc/人員派遣系統/加退保.dbf new file mode 100644 index 0000000..3bae3e1 Binary files /dev/null and b/Doc/人員派遣系統/加退保.dbf differ diff --git a/Doc/人員派遣系統/加退保.xls b/Doc/人員派遣系統/加退保.xls new file mode 100644 index 0000000..f36844c Binary files /dev/null and b/Doc/人員派遣系統/加退保.xls differ diff --git a/Doc/人員派遣系統/勞保.doc b/Doc/人員派遣系統/勞保.doc new file mode 100644 index 0000000..6634b16 Binary files /dev/null and b/Doc/人員派遣系統/勞保.doc differ diff --git a/Doc/人員派遣系統/勞保保險費分擔金額表.xls b/Doc/人員派遣系統/勞保保險費分擔金額表.xls new file mode 100644 index 0000000..de104cd Binary files /dev/null and b/Doc/人員派遣系統/勞保保險費分擔金額表.xls differ diff --git a/Doc/人員派遣系統/勞健保.xls b/Doc/人員派遣系統/勞健保.xls new file mode 100644 index 0000000..2cc366c Binary files /dev/null and b/Doc/人員派遣系統/勞健保.xls differ diff --git a/Doc/人員派遣系統/勞工保險職業災害保險適用行業別及費率表[1].doc b/Doc/人員派遣系統/勞工保險職業災害保險適用行業別及費率表[1].doc new file mode 100644 index 0000000..1ec58e6 Binary files /dev/null and b/Doc/人員派遣系統/勞工保險職業災害保險適用行業別及費率表[1].doc differ diff --git a/Doc/人員派遣系統/勞工退休金月提繳工資分級表-96[1][1].6.29修正.doc b/Doc/人員派遣系統/勞工退休金月提繳工資分級表-96[1][1].6.29修正.doc new file mode 100644 index 0000000..f9afde8 Binary files /dev/null and b/Doc/人員派遣系統/勞工退休金月提繳工資分級表-96[1][1].6.29修正.doc differ diff --git a/Doc/人員派遣系統/勞退提撥累計9501-9612to小樹.xls b/Doc/人員派遣系統/勞退提撥累計9501-9612to小樹.xls new file mode 100644 index 0000000..60ba96f Binary files /dev/null and b/Doc/人員派遣系統/勞退提撥累計9501-9612to小樹.xls differ diff --git a/Doc/人員派遣系統/勞退雇主提繳累計金額.xls b/Doc/人員派遣系統/勞退雇主提繳累計金額.xls new file mode 100644 index 0000000..0683a1c Binary files /dev/null and b/Doc/人員派遣系統/勞退雇主提繳累計金額.xls differ diff --git a/Doc/人員派遣系統/員工資料(新).mdb b/Doc/人員派遣系統/員工資料(新).mdb new file mode 100644 index 0000000..ead130f Binary files /dev/null and b/Doc/人員派遣系統/員工資料(新).mdb differ diff --git a/Doc/人員派遣系統/員工資料表.mdb b/Doc/人員派遣系統/員工資料表.mdb new file mode 100644 index 0000000..9fac3d2 Binary files /dev/null and b/Doc/人員派遣系統/員工資料表.mdb differ diff --git a/Doc/人員派遣系統/員工資料表excel.xls b/Doc/人員派遣系統/員工資料表excel.xls new file mode 100644 index 0000000..5b42483 Binary files /dev/null and b/Doc/人員派遣系統/員工資料表excel.xls differ diff --git a/Doc/人員派遣系統/員工資料表excel_1.xls b/Doc/人員派遣系統/員工資料表excel_1.xls new file mode 100644 index 0000000..c8205ef Binary files /dev/null and b/Doc/人員派遣系統/員工資料表excel_1.xls differ diff --git a/Doc/人員派遣系統/報價及時程.xls b/Doc/人員派遣系統/報價及時程.xls new file mode 100644 index 0000000..1800ed1 Binary files /dev/null and b/Doc/人員派遣系統/報價及時程.xls differ diff --git a/Doc/人員派遣系統/報表-A版.xls b/Doc/人員派遣系統/報表-A版.xls new file mode 100644 index 0000000..ef331af Binary files /dev/null and b/Doc/人員派遣系統/報表-A版.xls differ diff --git a/Doc/人員派遣系統/報表-B版.xls b/Doc/人員派遣系統/報表-B版.xls new file mode 100644 index 0000000..39163dd Binary files /dev/null and b/Doc/人員派遣系統/報表-B版.xls differ diff --git a/Doc/人員派遣系統/報表內容及格式說明.xls b/Doc/人員派遣系統/報表內容及格式說明.xls new file mode 100644 index 0000000..7833a00 Binary files /dev/null and b/Doc/人員派遣系統/報表內容及格式說明.xls differ diff --git a/Doc/人員派遣系統/新譽 100 年 計畫代號新舊對照表_轉檔狀況.xlsx b/Doc/人員派遣系統/新譽 100 年 計畫代號新舊對照表_轉檔狀況.xlsx new file mode 100644 index 0000000..52f7de0 Binary files /dev/null and b/Doc/人員派遣系統/新譽 100 年 計畫代號新舊對照表_轉檔狀況.xlsx differ diff --git a/Doc/人員派遣系統/新譽員工自提勞退加總表.xls b/Doc/人員派遣系統/新譽員工自提勞退加總表.xls new file mode 100644 index 0000000..3c8c9ee Binary files /dev/null and b/Doc/人員派遣系統/新譽員工自提勞退加總表.xls differ diff --git a/Doc/人員派遣系統/權限表.xls b/Doc/人員派遣系統/權限表.xls new file mode 100644 index 0000000..fc629f6 Binary files /dev/null and b/Doc/人員派遣系統/權限表.xls differ diff --git a/Doc/人員派遣系統/獎金發放作業.doc b/Doc/人員派遣系統/獎金發放作業.doc new file mode 100644 index 0000000..a171187 Binary files /dev/null and b/Doc/人員派遣系統/獎金發放作業.doc differ diff --git a/Doc/人員派遣系統/站台別.xlsx b/Doc/人員派遣系統/站台別.xlsx new file mode 100644 index 0000000..c2e4835 Binary files /dev/null and b/Doc/人員派遣系統/站台別.xlsx differ diff --git a/Doc/人員派遣系統/管理報表測試後之問題970930.doc b/Doc/人員派遣系統/管理報表測試後之問題970930.doc new file mode 100644 index 0000000..a92ecee Binary files /dev/null and b/Doc/人員派遣系統/管理報表測試後之問題970930.doc differ diff --git a/Doc/人員派遣系統/管理報表需求-0723修改版.xls b/Doc/人員派遣系統/管理報表需求-0723修改版.xls new file mode 100644 index 0000000..5fcef0f Binary files /dev/null and b/Doc/人員派遣系統/管理報表需求-0723修改版.xls differ diff --git a/Doc/人員派遣系統/系統假別與報表對應表.xls b/Doc/人員派遣系統/系統假別與報表對應表.xls new file mode 100644 index 0000000..1eed228 Binary files /dev/null and b/Doc/人員派遣系統/系統假別與報表對應表.xls differ diff --git a/Doc/人員派遣系統/綜稅電子申報作業要點96.pdf b/Doc/人員派遣系統/綜稅電子申報作業要點96.pdf new file mode 100644 index 0000000..e2bc6f2 Binary files /dev/null and b/Doc/人員派遣系統/綜稅電子申報作業要點96.pdf differ diff --git a/Doc/人員派遣系統/編碼.xls b/Doc/人員派遣系統/編碼.xls new file mode 100644 index 0000000..761c012 Binary files /dev/null and b/Doc/人員派遣系統/編碼.xls differ diff --git a/Doc/人員派遣系統/薪資條(原始).GIF b/Doc/人員派遣系統/薪資條(原始).GIF new file mode 100644 index 0000000..11a72ac Binary files /dev/null and b/Doc/人員派遣系統/薪資條(原始).GIF differ diff --git a/Doc/人員派遣系統/薪資條(原始).bmp b/Doc/人員派遣系統/薪資條(原始).bmp new file mode 100644 index 0000000..b9a07d2 Binary files /dev/null and b/Doc/人員派遣系統/薪資條(原始).bmp differ diff --git a/Doc/人員派遣系統/薪資條.GIF b/Doc/人員派遣系統/薪資條.GIF new file mode 100644 index 0000000..3145a17 Binary files /dev/null and b/Doc/人員派遣系統/薪資條.GIF differ diff --git a/Doc/人員派遣系統/薪資條.bmp b/Doc/人員派遣系統/薪資條.bmp new file mode 100644 index 0000000..a3c19cf Binary files /dev/null and b/Doc/人員派遣系統/薪資條.bmp differ diff --git a/Doc/人員派遣系統/薪資條.dib b/Doc/人員派遣系統/薪資條.dib new file mode 100644 index 0000000..ce8ae28 Binary files /dev/null and b/Doc/人員派遣系統/薪資條.dib differ diff --git a/Doc/人員派遣系統/薪資條_01.gif b/Doc/人員派遣系統/薪資條_01.gif new file mode 100644 index 0000000..0ae34df Binary files /dev/null and b/Doc/人員派遣系統/薪資條_01.gif differ diff --git a/Doc/人員派遣系統/複本 Attach_12824_1_保險費負擔金額表(五)(99.4.1生效).xls b/Doc/人員派遣系統/複本 Attach_12824_1_保險費負擔金額表(五)(99.4.1生效).xls new file mode 100644 index 0000000..8a2bf1a Binary files /dev/null and b/Doc/人員派遣系統/複本 Attach_12824_1_保險費負擔金額表(五)(99.4.1生效).xls differ diff --git a/Doc/人員派遣系統/複製 -BWMS.xls b/Doc/人員派遣系統/複製 -BWMS.xls new file mode 100644 index 0000000..e0e9dba Binary files /dev/null and b/Doc/人員派遣系統/複製 -BWMS.xls differ diff --git a/Doc/人員派遣系統/請款單01.doc b/Doc/人員派遣系統/請款單01.doc new file mode 100644 index 0000000..b8a874c Binary files /dev/null and b/Doc/人員派遣系統/請款單01.doc differ diff --git a/Doc/人員派遣系統/請款單01.docx b/Doc/人員派遣系統/請款單01.docx new file mode 100644 index 0000000..167cf46 Binary files /dev/null and b/Doc/人員派遣系統/請款單01.docx differ diff --git a/Doc/人員派遣系統/請款單01.pdf b/Doc/人員派遣系統/請款單01.pdf new file mode 100644 index 0000000..6411302 Binary files /dev/null and b/Doc/人員派遣系統/請款單01.pdf differ diff --git a/Doc/人員派遣系統/資料表.xls b/Doc/人員派遣系統/資料表.xls new file mode 100644 index 0000000..1b15021 Binary files /dev/null and b/Doc/人員派遣系統/資料表.xls differ diff --git a/Doc/人員派遣系統/起始日、結束日、生效日.txt b/Doc/人員派遣系統/起始日、結束日、生效日.txt new file mode 100644 index 0000000..3cf897c --- /dev/null +++ b/Doc/人員派遣系統/起始日、結束日、生效日.txt @@ -0,0 +1,65 @@ +起始日填入規則: +1.起始日小於月初,且生效日NULL,填入月初日 +2.起始日小於月初,且生效日非NULL,填入生效日 +3.起始日大於或等於月初,且生效日NULL,不變 +4.起始日大於或等於月初,且生效日非NULL,填入生效日 + +結束日填入規則: +1.結束日NULL + 1.1.有下一筆,且下一筆的項次不是 0,填入(下一筆的生效日前一天 與 月底日之中較小者) + 1.2.沒有下一筆,填入月底日 +2.結束日非NULL + 2.1.有下一筆,且下一筆的項次不是 0,填入(下一筆的生效日前一天 與 月底日之中較小者) + 2.2.沒有下一筆,且結束日大於月底日,填入月底日 + 2.3.沒有下一筆,且結束日小於或等於月底日,不變 + +資料剔除規則: +1.結束日小於開始日 + +狀況一:開始日在月初日之前,結束日NULL,沒有異動紀錄 + 開始 月初 月底 +----O-------------O-----------------O--------------- + +RBITM RASDT RAEDT RABDT +0 0501 NULL NULL +---------------------------------- +0 1101 1130 + +狀況二:開始日在月初日之前,結束日在月底日之後,沒有異動紀錄 + 開始 月初 月底 結束 +----O-------------O-----------------O---------O------ + +RBITM RASDT RAEDT RABDT +0 0501 1205 NULL +---------------------------------- +0 1101 1130 + +狀況三:開始日在月初日之前,結束日NULL + 開始 月初 月底 +----O------O------O--------O--------O---------O----- + 異動一 異動二 異動三 + +RBITM RASDT RAEDT RABDT +0 0501 NULL NULL +1 0501 NULL 1015 +2 0501 NULL 1115 +3 0501 NULL 1210 +-------------------------- +0 1101 1014 +1 1015 1114 +2 1115 1130 +3 1210 1130 剔除 + +狀況二,開始日在月初日與月底日之間,結束日NULL + 月初 開始 月底 +----O------O------O--------O--------O--------- + 異動一 異動二 + +RBITM RASDT RAEDT RABDT +0 1110 NULL NULL O +1 1110 NULL 1120 O +2 1110 NULL 1220 X +-------------------------- +0 1110 1119 +0 1120 1130 + \ No newline at end of file diff --git a/Doc/人員派遣系統/銀行代碼對照.xls b/Doc/人員派遣系統/銀行代碼對照.xls new file mode 100644 index 0000000..59014ee Binary files /dev/null and b/Doc/人員派遣系統/銀行代碼對照.xls differ diff --git a/Doc/人員派遣系統/非全月加保或月中變更加保身分之保費計算說明.xls b/Doc/人員派遣系統/非全月加保或月中變更加保身分之保費計算說明.xls new file mode 100644 index 0000000..b4710f8 Binary files /dev/null and b/Doc/人員派遣系統/非全月加保或月中變更加保身分之保費計算說明.xls differ diff --git a/Doc/人派系統測試記錄-101.xlsx b/Doc/人派系統測試記錄-101.xlsx new file mode 100644 index 0000000..3f6e6af Binary files /dev/null and b/Doc/人派系統測試記錄-101.xlsx differ diff --git a/Doc/人派系統測試記錄-1010426.xlsx b/Doc/人派系統測試記錄-1010426.xlsx new file mode 100644 index 0000000..bb2e35b Binary files /dev/null and b/Doc/人派系統測試記錄-1010426.xlsx differ diff --git a/Doc/人派系統測試記錄_1-101.xlsx b/Doc/人派系統測試記錄_1-101.xlsx new file mode 100644 index 0000000..fe1cd8d Binary files /dev/null and b/Doc/人派系統測試記錄_1-101.xlsx differ diff --git a/Doc/加班費計算.jpg b/Doc/加班費計算.jpg new file mode 100644 index 0000000..2bbdcda Binary files /dev/null and b/Doc/加班費計算.jpg differ diff --git a/Doc/勞健保紀錄(補公司別)_20130504.xlsx b/Doc/勞健保紀錄(補公司別)_20130504.xlsx new file mode 100644 index 0000000..80894ad Binary files /dev/null and b/Doc/勞健保紀錄(補公司別)_20130504.xlsx differ diff --git a/Doc/問題單/差勤&管理系統修改驗收(10702).xlsx b/Doc/問題單/差勤&管理系統修改驗收(10702).xlsx new file mode 100644 index 0000000..6bdd9bb Binary files /dev/null and b/Doc/問題單/差勤&管理系統修改驗收(10702).xlsx differ diff --git a/Doc/問題單/複本 差勤&管理系統修改驗收(10702).xlsx b/Doc/問題單/複本 差勤&管理系統修改驗收(10702).xlsx new file mode 100644 index 0000000..c3f7e4f Binary files /dev/null and b/Doc/問題單/複本 差勤&管理系統修改驗收(10702).xlsx differ diff --git a/Doc/報價單/人資系統/系統建置報價單_20220505.xlsx b/Doc/報價單/人資系統/系統建置報價單_20220505.xlsx new file mode 100644 index 0000000..4c31462 Binary files /dev/null and b/Doc/報價單/人資系統/系統建置報價單_20220505.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20170204.pdf b/Doc/報價單/人資系統/需求修改報價單_20170204.pdf new file mode 100644 index 0000000..89fd538 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20170204.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20170204.xlsx b/Doc/報價單/人資系統/需求修改報價單_20170204.xlsx new file mode 100644 index 0000000..d93a0d2 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20170204.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20170208.pdf b/Doc/報價單/人資系統/需求修改報價單_20170208.pdf new file mode 100644 index 0000000..54f8e2c Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20170208.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20170208.xlsx b/Doc/報價單/人資系統/需求修改報價單_20170208.xlsx new file mode 100644 index 0000000..29da49f Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20170208.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20170218.pdf b/Doc/報價單/人資系統/需求修改報價單_20170218.pdf new file mode 100644 index 0000000..fe48f19 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20170218.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20170218.xlsx b/Doc/報價單/人資系統/需求修改報價單_20170218.xlsx new file mode 100644 index 0000000..4599052 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20170218.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20170601.pdf b/Doc/報價單/人資系統/需求修改報價單_20170601.pdf new file mode 100644 index 0000000..9d0726e Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20170601.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20170601.xlsx b/Doc/報價單/人資系統/需求修改報價單_20170601.xlsx new file mode 100644 index 0000000..4a8aeb3 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20170601.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20170801.pdf b/Doc/報價單/人資系統/需求修改報價單_20170801.pdf new file mode 100644 index 0000000..e551bb3 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20170801.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20170801.xlsx b/Doc/報價單/人資系統/需求修改報價單_20170801.xlsx new file mode 100644 index 0000000..1137ec0 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20170801.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20170801_回傳.pdf b/Doc/報價單/人資系統/需求修改報價單_20170801_回傳.pdf new file mode 100644 index 0000000..3802ce0 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20170801_回傳.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20180126.pdf b/Doc/報價單/人資系統/需求修改報價單_20180126.pdf new file mode 100644 index 0000000..2cbaa2e Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20180126.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20180126.xlsx b/Doc/報價單/人資系統/需求修改報價單_20180126.xlsx new file mode 100644 index 0000000..5dad94e Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20180126.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20180126_回傳.pdf b/Doc/報價單/人資系統/需求修改報價單_20180126_回傳.pdf new file mode 100644 index 0000000..66147cb Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20180126_回傳.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20180209.pdf b/Doc/報價單/人資系統/需求修改報價單_20180209.pdf new file mode 100644 index 0000000..dd92370 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20180209.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20180209.xlsx b/Doc/報價單/人資系統/需求修改報價單_20180209.xlsx new file mode 100644 index 0000000..fac2ed1 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20180209.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20180209_回傳.pdf b/Doc/報價單/人資系統/需求修改報價單_20180209_回傳.pdf new file mode 100644 index 0000000..759ebec Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20180209_回傳.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20190802.pdf b/Doc/報價單/人資系統/需求修改報價單_20190802.pdf new file mode 100644 index 0000000..75fa875 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20190802.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20190802.xlsx b/Doc/報價單/人資系統/需求修改報價單_20190802.xlsx new file mode 100644 index 0000000..0059f0e Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20190802.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20190802_回傳.pdf b/Doc/報價單/人資系統/需求修改報價單_20190802_回傳.pdf new file mode 100644 index 0000000..4d553fb Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20190802_回傳.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20190904.pdf b/Doc/報價單/人資系統/需求修改報價單_20190904.pdf new file mode 100644 index 0000000..419eff3 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20190904.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20190904.xlsx b/Doc/報價單/人資系統/需求修改報價單_20190904.xlsx new file mode 100644 index 0000000..93aaaf6 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20190904.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20200220.pdf b/Doc/報價單/人資系統/需求修改報價單_20200220.pdf new file mode 100644 index 0000000..f40f497 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20200220.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20200220.xlsx b/Doc/報價單/人資系統/需求修改報價單_20200220.xlsx new file mode 100644 index 0000000..4234b92 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20200220.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20200220_回傳.pdf b/Doc/報價單/人資系統/需求修改報價單_20200220_回傳.pdf new file mode 100644 index 0000000..5fb785f Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20200220_回傳.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20220104.pdf b/Doc/報價單/人資系統/需求修改報價單_20220104.pdf new file mode 100644 index 0000000..674e8c1 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20220104.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20220104.xlsx b/Doc/報價單/人資系統/需求修改報價單_20220104.xlsx new file mode 100644 index 0000000..f105b42 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20220104.xlsx differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20230323.pdf b/Doc/報價單/人資系統/需求修改報價單_20230323.pdf new file mode 100644 index 0000000..52e4a0f Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20230323.pdf differ diff --git a/Doc/報價單/人資系統/需求修改報價單_20230323.xlsx b/Doc/報價單/人資系統/需求修改報價單_20230323.xlsx new file mode 100644 index 0000000..6dafe70 Binary files /dev/null and b/Doc/報價單/人資系統/需求修改報價單_20230323.xlsx differ diff --git a/Doc/報價單/報到系統/報到系統 需求報價單_20260530.pdf b/Doc/報價單/報到系統/報到系統 需求報價單_20260530.pdf new file mode 100644 index 0000000..9db7b5d Binary files /dev/null and b/Doc/報價單/報到系統/報到系統 需求報價單_20260530.pdf differ diff --git a/Doc/報價單/報到系統/報到系統 需求報價單_20260530.xlsx b/Doc/報價單/報到系統/報到系統 需求報價單_20260530.xlsx new file mode 100644 index 0000000..feaeec4 Binary files /dev/null and b/Doc/報價單/報到系統/報到系統 需求報價單_20260530.xlsx differ diff --git a/Doc/報價單/報到系統/報到系統_需求報價單_20260530(用印).pdf b/Doc/報價單/報到系統/報到系統_需求報價單_20260530(用印).pdf new file mode 100644 index 0000000..0773dab Binary files /dev/null and b/Doc/報價單/報到系統/報到系統_需求報價單_20260530(用印).pdf differ diff --git a/Doc/報價單/報到系統/報到系統建置報價單_20260317.pdf b/Doc/報價單/報到系統/報到系統建置報價單_20260317.pdf new file mode 100644 index 0000000..34d3466 Binary files /dev/null and b/Doc/報價單/報到系統/報到系統建置報價單_20260317.pdf differ diff --git a/Doc/報價單/報到系統/報到系統建置報價單_20260317.xlsx b/Doc/報價單/報到系統/報到系統建置報價單_20260317.xlsx new file mode 100644 index 0000000..4939401 Binary files /dev/null and b/Doc/報價單/報到系統/報到系統建置報價單_20260317.xlsx differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20130403.pdf b/Doc/報價單/維護合約/維護合約報價單_20130403.pdf new file mode 100644 index 0000000..dc440e0 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20130403.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20130403.xls b/Doc/報價單/維護合約/維護合約報價單_20130403.xls new file mode 100644 index 0000000..b789516 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20130403.xls differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20140326.pdf b/Doc/報價單/維護合約/維護合約報價單_20140326.pdf new file mode 100644 index 0000000..c04fe4d Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20140326.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20140326.xls b/Doc/報價單/維護合約/維護合約報價單_20140326.xls new file mode 100644 index 0000000..026b021 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20140326.xls differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20150109.pdf b/Doc/報價單/維護合約/維護合約報價單_20150109.pdf new file mode 100644 index 0000000..71499c9 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20150109.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20150109.xls b/Doc/報價單/維護合約/維護合約報價單_20150109.xls new file mode 100644 index 0000000..6d05b21 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20150109.xls differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20160106.pdf b/Doc/報價單/維護合約/維護合約報價單_20160106.pdf new file mode 100644 index 0000000..d2e0c32 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20160106.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20160106.xls b/Doc/報價單/維護合約/維護合約報價單_20160106.xls new file mode 100644 index 0000000..8706c84 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20160106.xls differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20161219.pdf b/Doc/報價單/維護合約/維護合約報價單_20161219.pdf new file mode 100644 index 0000000..c683fa8 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20161219.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20161219.xls b/Doc/報價單/維護合約/維護合約報價單_20161219.xls new file mode 100644 index 0000000..dfe7b03 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20161219.xls differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20180104.pdf b/Doc/報價單/維護合約/維護合約報價單_20180104.pdf new file mode 100644 index 0000000..c9b9d43 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20180104.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20180104.xls b/Doc/報價單/維護合約/維護合約報價單_20180104.xls new file mode 100644 index 0000000..cf57ce3 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20180104.xls differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20181227.pdf b/Doc/報價單/維護合約/維護合約報價單_20181227.pdf new file mode 100644 index 0000000..f3e061b Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20181227.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20181227.xls b/Doc/報價單/維護合約/維護合約報價單_20181227.xls new file mode 100644 index 0000000..f095912 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20181227.xls differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20191227.pdf b/Doc/報價單/維護合約/維護合約報價單_20191227.pdf new file mode 100644 index 0000000..c888e50 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20191227.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20191227.xls b/Doc/報價單/維護合約/維護合約報價單_20191227.xls new file mode 100644 index 0000000..c5de33f Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20191227.xls differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20201212.pdf b/Doc/報價單/維護合約/維護合約報價單_20201212.pdf new file mode 100644 index 0000000..1249122 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20201212.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20201212.xls b/Doc/報價單/維護合約/維護合約報價單_20201212.xls new file mode 100644 index 0000000..1828a96 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20201212.xls differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20220207.pdf b/Doc/報價單/維護合約/維護合約報價單_20220207.pdf new file mode 100644 index 0000000..39034e9 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20220207.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20220207.xls b/Doc/報價單/維護合約/維護合約報價單_20220207.xls new file mode 100644 index 0000000..2676eac Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20220207.xls differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20221225.pdf b/Doc/報價單/維護合約/維護合約報價單_20221225.pdf new file mode 100644 index 0000000..17c5d2e Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20221225.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20221225.xls b/Doc/報價單/維護合約/維護合約報價單_20221225.xls new file mode 100644 index 0000000..6368f8a Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20221225.xls differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20231213.pdf b/Doc/報價單/維護合約/維護合約報價單_20231213.pdf new file mode 100644 index 0000000..bd81864 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20231213.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20231213.xlsx b/Doc/報價單/維護合約/維護合約報價單_20231213.xlsx new file mode 100644 index 0000000..dc0685d Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20231213.xlsx differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20241210.pdf b/Doc/報價單/維護合約/維護合約報價單_20241210.pdf new file mode 100644 index 0000000..565a69b Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20241210.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20241210.xlsx b/Doc/報價單/維護合約/維護合約報價單_20241210.xlsx new file mode 100644 index 0000000..ed4f099 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20241210.xlsx differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20251206.pdf b/Doc/報價單/維護合約/維護合約報價單_20251206.pdf new file mode 100644 index 0000000..aea934e Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20251206.pdf differ diff --git a/Doc/報價單/維護合約/維護合約報價單_20251206.xlsx b/Doc/報價單/維護合約/維護合約報價單_20251206.xlsx new file mode 100644 index 0000000..d80dd82 Binary files /dev/null and b/Doc/報價單/維護合約/維護合約報價單_20251206.xlsx differ diff --git a/Doc/報價單/行動版/行動版網站報價單_20260828.xls b/Doc/報價單/行動版/行動版網站報價單_20260828.xls new file mode 100644 index 0000000..f018dd5 Binary files /dev/null and b/Doc/報價單/行動版/行動版網站報價單_20260828.xls differ diff --git a/Doc/報價單/辦訓系統/辦訓系統報價單_20130403.pdf b/Doc/報價單/辦訓系統/辦訓系統報價單_20130403.pdf new file mode 100644 index 0000000..d7c098e Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統報價單_20130403.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統報價單_20130403.xls b/Doc/報價單/辦訓系統/辦訓系統報價單_20130403.xls new file mode 100644 index 0000000..df4e8ca Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統報價單_20130403.xls differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140404.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140404.pdf new file mode 100644 index 0000000..4611dae Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140404.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140404.xls b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140404.xls new file mode 100644 index 0000000..fb097d9 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140404.xls differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140407.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140407.pdf new file mode 100644 index 0000000..12e9d28 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140407.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140407.xls b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140407.xls new file mode 100644 index 0000000..7a43a4a Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20140407.xls differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161011.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161011.pdf new file mode 100644 index 0000000..da8ac97 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161011.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161018.ods b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161018.ods new file mode 100644 index 0000000..4a918d0 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161018.ods differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161018.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161018.pdf new file mode 100644 index 0000000..e01331a Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161018.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161021.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161021.pdf new file mode 100644 index 0000000..966a2f8 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161021.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161021.xlsx b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161021.xlsx new file mode 100644 index 0000000..a34e432 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161021.xlsx differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161229.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161229.pdf new file mode 100644 index 0000000..2ffd77f Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161229.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161229.xlsx b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161229.xlsx new file mode 100644 index 0000000..14a991a Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20161229.xlsx differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20170113.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20170113.pdf new file mode 100644 index 0000000..0fb2dfe Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20170113.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20170113.xlsx b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20170113.xlsx new file mode 100644 index 0000000..3a34569 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20170113.xlsx differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200514.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200514.pdf new file mode 100644 index 0000000..a111466 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200514.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200514.xlsx b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200514.xlsx new file mode 100644 index 0000000..379740e Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200514.xlsx differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200618.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200618.pdf new file mode 100644 index 0000000..78f3e1c Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200618.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200618.xlsx b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200618.xlsx new file mode 100644 index 0000000..cd350fc Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200618.xlsx differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200702.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200702.pdf new file mode 100644 index 0000000..1599498 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200702.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200702.xlsx b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200702.xlsx new file mode 100644 index 0000000..bcf53ea Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20200702.xlsx differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260719.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260719.pdf new file mode 100644 index 0000000..bff7818 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260719.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260719.xls b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260719.xls new file mode 100644 index 0000000..7e46acf Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260719.xls differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260723(用印回傳).pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260723(用印回傳).pdf new file mode 100644 index 0000000..1509704 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260723(用印回傳).pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260723.pdf b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260723.pdf new file mode 100644 index 0000000..5a1921a Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260723.pdf differ diff --git a/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260723.xls b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260723.xls new file mode 100644 index 0000000..00dded6 Binary files /dev/null and b/Doc/報價單/辦訓系統/辦訓系統需求修改報價單_20260723.xls differ diff --git a/Doc/報價單/辦訓系統/領據系統報價單_20231204.xlsx b/Doc/報價單/辦訓系統/領據系統報價單_20231204.xlsx new file mode 100644 index 0000000..7fbb5f2 Binary files /dev/null and b/Doc/報價單/辦訓系統/領據系統報價單_20231204.xlsx differ diff --git a/Doc/字串表.xls b/Doc/字串表.xls new file mode 100644 index 0000000..7b51ea8 Binary files /dev/null and b/Doc/字串表.xls differ diff --git a/Doc/差勤暨管理系統_20180109_修改需求.pptx b/Doc/差勤暨管理系統_20180109_修改需求.pptx new file mode 100644 index 0000000..8093fe7 Binary files /dev/null and b/Doc/差勤暨管理系統_20180109_修改需求.pptx differ diff --git a/Doc/差勤系統-101-展譽.docx b/Doc/差勤系統-101-展譽.docx new file mode 100644 index 0000000..b448035 Binary files /dev/null and b/Doc/差勤系統-101-展譽.docx differ diff --git a/Doc/差勤系統報價單 20120103.xlsx b/Doc/差勤系統報價單 20120103.xlsx new file mode 100644 index 0000000..0913a7d Binary files /dev/null and b/Doc/差勤系統報價單 20120103.xlsx differ diff --git a/Doc/差勤系統欄位規畫.xls b/Doc/差勤系統欄位規畫.xls new file mode 100644 index 0000000..6bbbf30 Binary files /dev/null and b/Doc/差勤系統欄位規畫.xls differ diff --git a/Doc/帳號密碼.txt b/Doc/帳號密碼.txt new file mode 100644 index 0000000..426fd16 --- /dev/null +++ b/Doc/帳號密碼.txt @@ -0,0 +1,34 @@ +SmarterASP +x +bGthinkyu KX: tau3min284 + +FTP +DGwin8062.site4now.net +bGthinkyu-001 +KXGtau3min284 + + +Ʈw +MSSQL: sql5003.site4now.net +ΤW: DB_A48A46_thinkyu_admin +KX: VUPm4ej03xu3 +Ʈw: DB_A48A46_thinkyu + + +l +SMTP: mx.thinkyu.com +ACCOUNT: hr@thinkyu.com +PASS: 27968860 +POST: 25 + + + + + + +ssh pi@220.128.115.99 -p55622 +KX ALxl32*$ \ No newline at end of file diff --git a/Doc/應用系統重啟程序.odt b/Doc/應用系統重啟程序.odt new file mode 100644 index 0000000..cdbbe25 Binary files /dev/null and b/Doc/應用系統重啟程序.odt differ diff --git a/Doc/應用系統重啟程序.pdf b/Doc/應用系統重啟程序.pdf new file mode 100644 index 0000000..9c9fea2 Binary files /dev/null and b/Doc/應用系統重啟程序.pdf differ diff --git a/Doc/教育訓練系統/0723測試修正紀錄.doc b/Doc/教育訓練系統/0723測試修正紀錄.doc new file mode 100644 index 0000000..46a6eaa Binary files /dev/null and b/Doc/教育訓練系統/0723測試修正紀錄.doc differ diff --git a/Doc/教育訓練系統/0730系統規劃圖.png b/Doc/教育訓練系統/0730系統規劃圖.png new file mode 100644 index 0000000..ac908a7 Binary files /dev/null and b/Doc/教育訓練系統/0730系統規劃圖.png differ diff --git a/Doc/教育訓練系統/20140926【前台】系統功能調整記錄_回覆.xlsx b/Doc/教育訓練系統/20140926【前台】系統功能調整記錄_回覆.xlsx new file mode 100644 index 0000000..810fdeb Binary files /dev/null and b/Doc/教育訓練系統/20140926【前台】系統功能調整記錄_回覆.xlsx differ diff --git a/Doc/教育訓練系統/20140926【後台】系統功能調整記錄_回覆.xlsx b/Doc/教育訓練系統/20140926【後台】系統功能調整記錄_回覆.xlsx new file mode 100644 index 0000000..1984cbd Binary files /dev/null and b/Doc/教育訓練系統/20140926【後台】系統功能調整記錄_回覆.xlsx differ diff --git a/Doc/教育訓練系統/20141001【後台】系統功能調整記錄_回覆.xlsx b/Doc/教育訓練系統/20141001【後台】系統功能調整記錄_回覆.xlsx new file mode 100644 index 0000000..db97ba6 Binary files /dev/null and b/Doc/教育訓練系統/20141001【後台】系統功能調整記錄_回覆.xlsx differ diff --git a/Doc/教育訓練系統/SQL/FUNCTION.SQL b/Doc/教育訓練系統/SQL/FUNCTION.SQL new file mode 100644 index 0000000..92938b4 --- /dev/null +++ b/Doc/教育訓練系統/SQL/FUNCTION.SQL @@ -0,0 +1,115 @@ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE FUNCTION FN取得選定場地編號 +( + @課程企劃編號 AS INT +) +RETURNS INT +AS +BEGIN + DECLARE @RESULT INT + DECLARE @COUNT INT + DECLARE @場地編號 INT + + SELECT @COUNT=COUNT(1) FROM 訓練課程企劃 WHERE 編號=@課程企劃編號 + IF @COUNT = 0 + BEGIN + RETURN 0 + END + ELSE + BEGIN + SELECT TOP 1 @場地編號 = 場地編號 FROM 場地異動 + WHERE 課程企劃編號 = @課程企劃編號 + ORDER BY 異動次數 DESC + + IF @場地編號 IS NOT NULL + BEGIN + RETURN @場地編號 + END + ELSE + BEGIN + DECLARE @場地A INT + DECLARE @場地B INT + DECLARE @場地C INT + DECLARE @分數A INT + DECLARE @分數B INT + DECLARE @分數C INT + + SELECT @場地A = ISNULL(場地編號_A, 0), @場地B = ISNULL(場地編號_B, 0), @場地C = ISNULL(場地編號_C, 0), + @分數A = ISNULL(合計_A, 0), @分數B = ISNULL(合計_B, 0), @分數C = ISNULL(合計_C, 0) + FROM 場地遴選 + WHERE 課程企劃編號 = @課程企劃編號 + + IF (@分數A > @分數B AND @分數A > @分數C) + SET @場地編號 = @場地A + ELSE IF (@分數B > @分數A AND @分數B > @分數C) + SET @場地編號 = @場地B + ELSE + SET @場地編號 = @場地C + END + END + RETURN @場地編號 +END +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE FUNCTION FN取得選定講師編號 +( + @課程企劃編號 AS INT, + @課程序號 AS INT +) +RETURNS INT +AS +BEGIN + DECLARE @RESULT INT + DECLARE @COUNT INT + DECLARE @講師編號 INT + + SELECT @COUNT=COUNT(1) FROM 訓練課程內容 WHERE 訓練課程企劃編號=@課程企劃編號 AND 課程序號=@課程序號 + IF @COUNT = 0 + BEGIN + RETURN 0 + END + ELSE + BEGIN + SELECT TOP 1 @講師編號 = 講師編號 FROM 講師異動 + WHERE 課程企劃編號 = @課程企劃編號 AND 課程序號 = @課程序號 + ORDER BY 異動次數 DESC + + IF @講師編號 IS NOT NULL + BEGIN + RETURN @講師編號 + END + ELSE + BEGIN + DECLARE @講師A INT + DECLARE @講師B INT + DECLARE @講師C INT + DECLARE @分數A INT + DECLARE @分數B INT + DECLARE @分數C INT + + SELECT @講師A = ISNULL(講師編號_A, 0), @講師B = ISNULL(講師編號_B, 0), @講師C = ISNULL(講師編號_C, 0), + @分數A = ISNULL(合計_A, 0), @分數B = ISNULL(合計_B, 0), @分數C = ISNULL(合計_C, 0) + FROM 講師遴選 + WHERE 課程企劃編號 = @課程企劃編號 AND 課程序號 = @課程序號 + + IF (@分數A > @分數B AND @分數A > @分數C) + SET @講師編號 = @講師A + ELSE IF (@分數B > @分數A AND @分數B > @分數C) + SET @講師編號 = @講師B + ELSE + SET @講師編號 = @講師C + END + END + RETURN @講師編號 +END +GO + +grant EXECUTE ON FN取得選定場地編號 TO HR +grant EXECUTE ON FN取得選定講師編號 to HR \ No newline at end of file diff --git a/Doc/教育訓練系統/excel_output.txt b/Doc/教育訓練系統/excel_output.txt new file mode 100644 index 0000000..a636226 --- /dev/null +++ b/Doc/教育訓練系統/excel_output.txt @@ -0,0 +1,187 @@ +=== 辦訓系統修改項目_1150719.xlsx === +A1=辦訓系統修改 B1= C1= D1= E1= F1= G1= H1= I1= +A2= +A3=序 B3=狀況及需求說明 C3= D3= E3= F3= G3= H3= I3= J3= K3= L3= M3= N3= O3= P3= Q3= R3= S3= T3= U3= V3= W3= X3= Y3= Z3= AA3= AB3= AC3= AD3= AE3= AF3= AG3= AH3= AI3= AJ3= AK3= AL3= AM3= AN3= AO3= AP3= AQ3= AR3= AS3= +A4= B4= C4= D4= E4= F4= G4= H4= I4= J4= K4= L4= M4= N4= O4= P4= Q4= R4= S4= T4= U4= V4= W4= X4= Y4= Z4= AA4= AB4= AC4= AD4= AE4= AF4= AG4= AH4= AI4= AJ4= AK4= AL4= AM4= AN4= AO4= AP4= AQ4= AR4= AS4= +A5=1 B5=●路徑:辦訓系統 > 開課作業 > 課程企劃書 C5= D5= E5= F5= G5= H5= I5= J5= K5= L5= M5= N5= O5= P5= Q5= R5= S5= T5= U5= V5= W5= X5= Y5= Z5= AA5= AB5= AC5= AD5= AE5= AF5= AG5= AH5= AI5= AJ5= AK5= AL5= AM5= AN5= AO5= AP5= AQ5= AR5= AS5= +A6= B6=教材遴選:在課程企劃書中加上教材遴選按鈕,遴選項目請參照下表。 C6= D6= E6= F6= G6= H6= I6= J6= K6= L6= M6= N6= O6= P6= Q6= R6= S6= T6= U6= V6= W6= X6= Y6= Z6= AA6= AB6= AC6= AD6= AE6= AF6= AG6= AH6= AI6= AJ6= AK6= AL6= AM6= AN6= AO6= AP6= AQ6= AR6= AS6= +A7= B7=專案類型:改成「職能類型」,選項為「核心職能、專業職能、管理職能」 C7= D7= E7= F7= G7= H7= I7= J7= K7= L7= M7= N7= O7= P7= Q7= R7= S7= T7= U7= V7= W7= X7= Y7= Z7= AA7= AB7= AC7= AD7= AE7= AF7= AG7= AH7= AI7= AJ7= AK7= AL7= AM7= AN7= AO7= AP7= AQ7= AR7= AS7= +A8= B8= C8= D8= E8= F8= G8= H8= I8= J8= M8= N8= O8= P8= Q8= R8= S8= T8= U8= V8= W8= X8= Y8= Z8= AA8= AB8= AC8= AD8= AE8= AF8= AG8= AH8= AI8= AJ8= AK8= AL8= AM8= AN8= AO8= AP8= AQ8= AR8= AS8= +A9= B9= C9= D9= E9= F9= G9= H9= I9= J9= M9= N9= O9= P9= Q9= R9= S9= T9= U9= V9= W9= X9= Y9= Z9= AA9= AB9= AC9= AD9= AE9= AF9= AG9= AH9= AI9= AJ9= AK9= AL9= AM9= AN9= AO9= AP9= AQ9= AR9= AS9= +A10= B10= C10= D10= E10= F10= G10= H10= I10= J10= M10= N10= O10= P10= Q10= R10= S10= T10= U10= V10= W10= X10= Y10= Z10= AA10= AB10= AC10= AD10= AE10= AF10= AG10= AH10= AI10= AJ10= AK10= AL10= AM10= AN10= AO10= AP10= AQ10= AR10= AS10= +A11= B11= C11= D11= E11= F11= G11= H11= I11= J11= M11= N11= O11= P11= Q11= R11= S11= T11= U11= V11= W11= X11= Y11= Z11= AA11= AB11= AC11= AD11= AE11= AF11= AG11= AH11= AI11= AJ11= AK11= AL11= AM11= AN11= AO11= AP11= AQ11= AR11= AS11= +A12= B12= C12= D12= E12= F12= G12= H12= I12= J12= M12= N12= O12= P12= Q12= R12= S12= T12= U12= V12= W12= X12= Y12= Z12= AA12= AB12= AC12= AD12= AE12= AF12= AG12= AH12= AI12= AJ12= AK12= AL12= AM12= AN12= AO12= AP12= AQ12= AR12= AS12= +A13= B13= C13= D13= E13= F13= G13= H13= I13= J13= M13= N13= O13= P13= Q13= R13= S13= T13= U13= V13= W13= X13= Y13= Z13= AA13= AB13= AC13= AD13= AE13= AF13= AG13= AH13= AI13= AJ13= AK13= AL13= AM13= AN13= AO13= AP13= AQ13= AR13= AS13= +A14= B14=教材遴選指標 C14= D14= E14=7 F14= G14= H14= I14= J14= M14= N14= O14= P14= Q14= R14= S14= T14= U14= V14= W14= X14= Y14= Z14= AA14= AB14= AC14= AD14= AE14= AF14= AG14= AH14= AI14= AJ14= AK14= AL14= AM14= AN14= AO14= AP14= AQ14= AR14= AS14= +A15= B15=教材設計符合訓練目標 C15= D15= E15=1 2 3 4 5 6 7 8 9 10 F15= G15= H15= I15= J15= M15= N15= O15= P15= Q15= R15= S15= T15= U15= V15= W15= X15= Y15= Z15= AA15= AB15= AC15= AD15= AE15= AF15= AG15= AH15= AI15= AJ15= AK15= AL15= AM15= AN15= AO15= AP15= AQ15= AR15= AS15= +A16= B16=教材設計整體架構規劃完整性 C16= D16= E16=1 2 3 4 5 6 7 8 9 10 F16= G16= H16= I16= J16= M16= N16= O16= P16= Q16= R16= S16= T16= U16= V16= W16= X16= Y16= Z16= AA16= AB16= AC16= AD16= AE16= AF16= AG16= AH16= AI16= AJ16= AK16= AL16= AM16= AN16= AO16= AP16= AQ16= AR16= AS16= +A17= B17=教材設計符合課程規劃時數 C17= D17= E17=1 2 3 4 5 6 7 8 9 10 F17= G17= H17= I17= J17= L17= M17= N17= O17= P17= Q17= R17= S17= T17= U17= V17= W17= X17= Y17= Z17= AA17= AB17= AC17= AD17= AE17= AF17= AG17= AH17= AI17= AJ17= AK17= AL17= AM17= AN17= AO17= AP17= AQ17= AR17= AS17= +A18= B18=教學方法能引起學員的學習興趣 C18= D18= E18=1 2 3 4 5 6 7 8 9 10 F18= G18= H18= I18= J18= K18= L18= M18= N18= O18= P18= Q18= R18= S18= T18= U18= V18= W18= X18= Y18= Z18= AA18= AB18= AC18= AD18= AE18= AF18= AG18= AH18= AI18= AJ18= AK18= AL18= AM18= AN18= AO18= AP18= AQ18= AR18= AS18= +A19= B19=教材設計可做為學員未來工作參考/運用 C19= D19= E19=1 2 3 4 5 6 7 8 9 10 F19= G19= H19= I19= J19= L19= M19= N19= O19= P19= Q19= R19= S19= T19= U19= V19= W19= X19= Y19= Z19= AA19= AB19= AC19= AD19= AE19= AF19= AG19= AH19= AI19= AJ19= AK19= AL19= AM19= AN19= AO19= AP19= AQ19= AR19= AS19= +A20= B20=教材評選綜合評估 C20= D20= E20=□不符合目標 □符合目標 □符合目標且能引起學習興趣 F20= G20= H20= I20= J20= K20= L20= M20= N20= O20= P20= Q20= R20= S20= T20= U20= V20= W20= X20= Y20= Z20= AA20= AB20= AC20= AD20= AE20= AF20= AG20= AH20= AI20= AJ20= AK20= AL20= AM20= AN20= AO20= AP20= AQ20= AR20= AS20= +A21= B21=訓練單位回饋與建議 C21= D21= E21= F21= G21= H21= I21= J21= L21= M21= N21= O21= P21= Q21= R21= S21= T21= U21= V21= W21= X21= Y21= Z21= AA21= AB21= AC21= AD21= AE21= AF21= AG21= AH21= AI21= AJ21= AK21= AL21= AM21= AN21= AO21= AP21= AQ21= AR21= AS21= +A22= B22= C22= D22= E22= F22= G22= H22= I22= J22= K22= L22= M22= N22= O22= P22= Q22= R22= S22= T22= U22= V22= W22= X22= Y22= Z22= AA22= AB22= AC22= AD22= AE22= AF22= AG22= AH22= AI22= AJ22= AK22= AL22= AM22= AN22= AO22= AP22= AQ22= AR22= AS22= +A23=2 B23=●路徑:辦訓系統 > 開課作業 > 課程企劃書 C23= D23= E23= F23= G23= H23= I23= J23= K23= L23= M23= N23= O23= P23= Q23= R23= S23= T23= U23= V23= W23= X23= Y23= Z23= AA23= AB23= AC23= AD23= AE23= AF23= AG23= AH23= AI23= AJ23= AK23= AL23= AM23= AN23= AO23= AP23= AQ23= AR23= AS23= +A24= B24=講師遴選:目前講師遴選之講師資料欄位皆由系統講師資料庫帶入,但未合作的講師不會建入講師資料庫, +A25= B25=     因此除了源有帶入功能,也請開放填寫講師資訊。(紅框的部分) +A26= B26=場地遴選:狀況亦同,請開放填寫場地資訊。(紅框的部分) +A47=3 B47=●路徑:辦訓系統 > 辦訓狀況 > 滿意度調查表填寫狀況 C47= D47= E47= F47= G47= H47= I47= J47= K47= L47= M47= N47= O47= P47= Q47= R47= S47= T47= U47= V47= W47= X47= Y47= Z47= AA47= AB47= AC47= AD47= AE47= AF47= AG47= AH47= AI47= AJ47= AK47= AL47= AM47= AN47= AO47= AP47= AQ47= AR47= AS47= +A48= B48=(1)專門填寫網頁:建立一個專門填寫滿意度問卷的網址,適配手機版面 ,打開之後可直接登入填寫。 C48= D48= E48= F48= G48= H48= I48= J48= K48= L48= M48= N48= O48= P48= Q48= R48= S48= T48= U48= V48= W48= X48= Y48= Z48= AA48= AB48= AC48= AD48= AE48= AF48= AG48= AH48= AI48= AJ48= AK48= AL48= AM48= AN48= AO48= AP48= AQ48= AR48= AS48= +B49=(2)增加填寫期限日期:設定填寫期限日期,超過期限未填寫者,系統主動寄通知信提醒。 +B50= +A51=4 B51=●路徑:辦訓系統 > 辦訓狀況 > 教學日誌暨異常狀況登錄、訓練檢討報告 C51= D51= E51= F51= G51= H51= I51= J51= K51= L51= M51= N51= O51= P51= Q51= R51= S51= T51= U51= V51= W51= X51= Y51= Z51= AA51= AB51= AC51= AD51= AE51= AF51= AG51= AH51= AI51= AJ51= AK51= AL51= AM51= AN51= AO51= AP51= AQ51= AR51= AS51= +A52= B52=(1)《教學日誌暨異常狀況登錄》及《訓練檢討報告》調整內容請看分頁,紅字為新增修改處。 C52= D52= E52= F52= G52= H52= I52= J52= K52= L52= M52= N52= O52= P52= Q52= R52= S52= T52= U52= V52= W52= X52= Y52= Z52= AA52= AB52= AC52= AD52= AE52= AF52= AG52= AH52= AI52= AJ52= AK52= AL52= AM52= AN52= AO52= AP52= AQ52= AR52= AS52= +A53= B53=(2) 兩份文件增加匯出單堂課程及匯出全年度資料的功能,單堂課程匯出畫面請看分頁,全年度匯出excel檔(參考滿意度匯出)。 C53= D53= E53= F53= G53= H53= I53= J53= K53= L53= M53= N53= O53= P53= Q53= R53= S53= T53= U53= V53= W53= X53= Y53= Z53= AA53= AB53= AC53= AD53= AE53= AF53= AG53= AH53= AI53= AJ53= AK53= AL53= AM53= AN53= AO53= AP53= AQ53= AR53= AS53= +A55=5 B55=●路徑:辦訓系統 > 簽核作業 C55= D55= E55= F55= G55= H55= I55= J55= K55= L55= M55= N55= O55= P55= Q55= R55= S55= T55= U55= V55= W55= X55= Y55= Z55= AA55= AB55= AC55= AD55= AE55= AF55= AG55= AH55= AI55= AJ55= AK55= AL55= AM55= AN55= AO55= AP55= AQ55= AR55= AS55= +A56= B56=課程企劃書、教學日誌、訓練檢討報告處理,這三份文件改為簽核一關即可。 C56= D56= E56= F56= G56= H56= I56= J56= K56= L56= M56= N56= O56= P56= Q56= R56= S56= T56= U56= V56= W56= X56= Y56= Z56= AA56= AB56= AC56= AD56= AE56= AF56= AG56= AH56= AI56= AJ56= AK56= AL56= AM56= AN56= AO56= AP56= AQ56= AR56= AS56= +A57= B57= C57= D57= E57= F57= G57= H57= I57= J57= K57= L57= M57= N57= O57= P57= Q57= R57= S57= T57= U57= V57= W57= X57= Y57= Z57= AA57= AB57= AC57= AD57= AE57= AF57= AG57= AH57= AI57= AJ57= AK57= AL57= AM57= AN57= AO57= AP57= AQ57= AR57= AS57= + +A1=28 B1= C1= D1= +A2=一、課程基本資料 B2= C2= D2= +A3=課程企劃編號 B3= C3=講師 D3= +A4=節次 B4= C4=應到人數 D4= +A5=實到人數 B5= C5=缺席人數 D5= +A6=36 B6= C6= D6= +A7=1.講師授課內容符合課程目標與大綱 B7= C7= □ 完全符合      □ 大致符合  + □ 部分符合      □ 不符合課程目標與大綱 D7= +A8=2.講師課程表達清楚,學員易於理解 B8= C8= □ 表達清楚易懂    □ 大致容易理解  + □ 大部分表達不清   □ 多數學員理解困難 D8= +A9=3.講師能運用提問、案例或活動引導學員參與 B9= C9= □ 能與學員互動熱烈  □ 能適時引導與學員互動  + □ 偶有與學員互動   □ 與學員互動不足 D9= +A10=4.講師課程節奏及時間掌握適當 B10= C10= □ 節奏流暢、時間充裕 □ 時間掌握略有延誤  + □ 節奏過快、提早結束 □ 明顯影響課程進行 D10= +A11=5.學員課堂參與情形良好 B11= C11= □ 學員參與度非常高  □ 學員參與度高  + □ 部分學員參與度低  □ 多數學員參與度偏低 D11= +A12=6.學員能主動回應、提問或參與討論 B12= C12= □ 學員踴躍且主動發言 □ 多數學員主動回應發言  + □ 學員少數被動回應  □ 學員幾乎無回應 D12= +A13=7.授課教材在學員未來工作應用與參考的程度 B13= C13= □ 可直接應用於工作  □ 具高度參考價值  + □ 僅部分內容可參考  □ 與工作應用關聯性較低 D13= +A14=8.授課教學方法是否可以帶動學員興趣 B14= C14= □ 全程互動氣氛熱絡  □ 多數學員積極參與  + □ 部分學員投入課程  □ 學員普遍反應冷淡 D14= +A15=9.場地設備及空間是否符合教學需求 B15= C15= □ 設備完善空間舒適  □ 大致符合教學需求  + □ 部分影響教學    □ 不符合教學需求 D15= +A16=10.督課人員課堂觀察與建議 B16= C16=(填寫100字以內) D16= +A17=三、異常事件紀錄 B17= C17= D17= +A18=1.異常事項 B18= □ 有  □ 無 (無須填寫以下欄位) C18= D18= +A19=2.異常類型 B19= □ 講師 □ 學員 □ 教材 □ 場地 □ 設備  + □ 行政 □其他______ C19= D19= +A20=3.異常處理方式 B20=(填寫100字以內) C20= D20= +A21=4.異常處理結果 B21= □ 異常狀況順利解決,本案已結案 + □ 未順利解決,建議於課後舉行檢討會議進行討論 C21= D21= + +A1=教學日誌暨異常狀況登錄 B1= C1= D1= +A2=一、課程基本資料 B2= C2= D2= +A3=課程名稱 B3= C3=課程日期 D3= +A4=講師 B4= C4=應到人數 D4= +A5=實到人數 B5= C5=缺席人數 D5= +A6=68 B6= C6= D6= +A7=1.講師授課內容符合課程目標與大綱 B7= C7= D7= +A8=2.講師課程表達清楚,學員易於理解 B8= C8= D8= +A9=3.講師能運用提問、案例或活動引導學員參與 B9= C9= D9= +A10=4.講師課程節奏及時間掌握適當 B10= C10= D10= +A11=5.學員課堂參與情形良好 B11= C11= D11= +A12=6.學員能主動回應、提問或參與討論 B12= C12= D12= +A13=7.授課教材在學員未來工作應用與參考的程度 B13= C13= D13= +A14=8.授課教學方法是否可以帶動學員興趣 B14= C14= D14= +A15=9.場地設備及空間是否符合教學需求 B15= C15= D15= +A16=10.督課人員課堂觀察與建議 B16= C16= D16= +A17=三、異常事件紀錄 B17= C17= D17= +A18=1.異常事項 B18= C18= D18= +A19=2.異常類型 B19= C19= D19= +A20=3.異常處理方式 B20= C20= D20= +A21=4.異常處理結果 B21= C21= D21= + +A2=填表日期 B2=46150 C2=填表人員 D2=02070 陳琬婷 E2= F2= G2= H2= +A3=學員出席率 B3=1 C3=訓練經費 D3=0 E3= F3= G3= H3= +A4=參與人數 B4=13 C4=回收數 D4=13 E4=回收率 F4=100 G4= H4= I4=原本滿意度在上,參與人數及回收數在下,這兩列上下位置交換 +A5=行政服務品質滿意度 B5=84.62 C5=餐點與茶飲滿意度 D5=89.23 E5=場地滿意度 F5=78.459999999999994 G5=整體滿意度 H5=86.15 +A6=講師滿意度 B6=節次 C6=講師編號 D6=講師姓名 E6=滿意度 F6= G6= H6= +A7= B7=1 C7=312 D7=葉學祥 E7=82.31 F7= G7= H7= +A8=學員建議 B8= C8= D8= +A9=講師建議 B9= C9= D9= +A10=改善措施 B10=改善面向 C10=改善內容(可複選) D10=改善作法 E10=補充說明 +B11=學員 C11=□ 加強課前提醒 +□ 增加案例分享 +□ 增加實作練習 +□ 提供課後學習資源 +□ 其他 _________ D11=□ 納入下次課程 +□ 修訂教材 +□ 修訂表單 +□ 修訂SOP +□ 修訂訓練品質手冊 +□ 其他 _________ E11= +B12=講師 C12=□ 調整授課節奏 +□ 加強重點說明 +□ 增加課堂互動 +□ 課前確認授課需求 +□ 其他 _________ D12=□ 納入下次課程 +□ 修訂教材 +□ 修訂表單 +□ 修訂SOP +□ 修訂訓練品質手冊 +□ 其他 _________ E12= +B13=教材及教具 C13=□ 修正教材內容 +□ 更新教材資料 +□ 增加教具輔助 +□ 提供電子教材 +□ 其他 _________ D13=□ 納入下次課程 +□ 修訂教材 +□ 修訂表單 +□ 修訂SOP +□ 修訂訓練品質手冊 +□ 其他 _________ E13= +B14=教學方法 C14=□ 增加案例討論 +□ 增加分組互動 +□ 增加實作演練 +□ 調整教學方式 +□ 其他 _________ D14=□ 納入下次課程 +□ 修訂教材 +□ 修訂表單 +□ 修訂SOP +□ 修訂訓練品質手冊 +□ 其他 _________ E14= +B15=場地及設備 C15=□ 調整教室配置 +□ 增加設備數量 +□ 提前測試設備 +□ 改善上課環境 +□ 其他 _________ D15=□ 納入下次課程 +□ 修訂教材 +□ 修訂表單 +□ 修訂SOP +□ 修訂訓練品質手冊 +□ 其他 _________ E15= +B16=行政流程 C16=□ 提前通知資訊 +□ 調整報到流程 +□ 強化行政協助 +□ 加強課後追蹤 +□ 其他 _________ D16=□ 納入下次課程 +□ 修訂教材 +□ 修訂表單 +□ 修訂SOP +□ 修訂訓練品質手冊 +□ 其他 _________ E16= +B17= C17= D17= E17= +B18= C18= D18= E18= +B19= C19= D19= E19= + +A1=訓練檢討報告 B1= C1= D1= +A2=一、回饋統計分析 B2= C2= D2= +A3=課程名稱 B3= C3=課程日期 D3= +A4=學員出席率 B4= C4=訓練經費 D4= +A5=參與人數 B5= C5=回收數 D5= E5= +A6=講師滿意度 B6= C6=回收率 D6= E6= +A7=行政服務品質滿意度 B7= C7=餐點與茶飲滿意度 D7= +A8=場地滿意度 B8= C8=整體滿意度 D8= +A9=學員建議 B9= C9= D9= +A10=講師建議 B10= C10= D10= +A11=二、改善措施 B11= C11= D11= +A12=改善面向 B12=改善內容 C12=改善作法 D12=補充說明 +A13=學員 B13= C13= D13= +A14=講師 B14= C14= D14= +A15=教材及教具 B15= C15= D15= +A16=教學方法 B16= C16= D16= +A17=場地及設備 B17= C17= D17= +A18=行政流程 B18= C18= D18= +B19= C19= D19= +B20= C20= D20= + diff --git a/Doc/教育訓練系統/場地基本資料表.doc b/Doc/教育訓練系統/場地基本資料表.doc new file mode 100644 index 0000000..d7a64ec Binary files /dev/null and b/Doc/教育訓練系統/場地基本資料表.doc differ diff --git a/Doc/教育訓練系統/外部訓練匯入格式.xlsx b/Doc/教育訓練系統/外部訓練匯入格式.xlsx new file mode 100644 index 0000000..0cb6f97 Binary files /dev/null and b/Doc/教育訓練系統/外部訓練匯入格式.xlsx differ diff --git a/Doc/教育訓練系統/年度課程執行狀況報表.xlsx b/Doc/教育訓練系統/年度課程執行狀況報表.xlsx new file mode 100644 index 0000000..d2fe669 Binary files /dev/null and b/Doc/教育訓練系統/年度課程執行狀況報表.xlsx differ diff --git a/Doc/教育訓練系統/教育訓練系統 Table Schema.xls b/Doc/教育訓練系統/教育訓練系統 Table Schema.xls new file mode 100644 index 0000000..ed43f66 Binary files /dev/null and b/Doc/教育訓練系統/教育訓練系統 Table Schema.xls differ diff --git a/Doc/教育訓練系統/教育訓練系統會議紀錄2014.1.16.xlsx b/Doc/教育訓練系統/教育訓練系統會議紀錄2014.1.16.xlsx new file mode 100644 index 0000000..765d5dd Binary files /dev/null and b/Doc/教育訓練系統/教育訓練系統會議紀錄2014.1.16.xlsx differ diff --git a/Doc/教育訓練系統/教育訓練系統會議紀錄2014.2.17 - 回覆.xlsx b/Doc/教育訓練系統/教育訓練系統會議紀錄2014.2.17 - 回覆.xlsx new file mode 100644 index 0000000..0d29cf8 Binary files /dev/null and b/Doc/教育訓練系統/教育訓練系統會議紀錄2014.2.17 - 回覆.xlsx differ diff --git a/Doc/教育訓練系統/教育訓練系統會議紀錄2014.2.7 - 回覆.xlsx b/Doc/教育訓練系統/教育訓練系統會議紀錄2014.2.7 - 回覆.xlsx new file mode 100644 index 0000000..174de96 Binary files /dev/null and b/Doc/教育訓練系統/教育訓練系統會議紀錄2014.2.7 - 回覆.xlsx differ diff --git a/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.7.15-1_回覆.xlsx b/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.7.15-1_回覆.xlsx new file mode 100644 index 0000000..d2e9651 Binary files /dev/null and b/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.7.15-1_回覆.xlsx differ diff --git a/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.7.22_回覆.xlsx b/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.7.22_回覆.xlsx new file mode 100644 index 0000000..10ddb98 Binary files /dev/null and b/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.7.22_回覆.xlsx differ diff --git a/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.8.04_回覆.xlsx b/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.8.04_回覆.xlsx new file mode 100644 index 0000000..eda8115 Binary files /dev/null and b/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.8.04_回覆.xlsx differ diff --git a/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.8.21_回覆.xlsx b/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.8.21_回覆.xlsx new file mode 100644 index 0000000..8814fe9 Binary files /dev/null and b/Doc/教育訓練系統/教育訓練系統詢問紀錄2014.8.21_回覆.xlsx differ diff --git a/Doc/教育訓練系統/新譽管理辦訓系統報價單 20120103-2-1.xls b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20120103-2-1.xls new file mode 100644 index 0000000..850c344 Binary files /dev/null and b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20120103-2-1.xls differ diff --git a/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130111.xls b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130111.xls new file mode 100644 index 0000000..f298886 Binary files /dev/null and b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130111.xls differ diff --git a/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130121.xls b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130121.xls new file mode 100644 index 0000000..3f3ba12 Binary files /dev/null and b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130121.xls differ diff --git a/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130130.xls b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130130.xls new file mode 100644 index 0000000..b989fdd Binary files /dev/null and b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130130.xls differ diff --git a/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130201(報價調整).xls b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130201(報價調整).xls new file mode 100644 index 0000000..9b1fdda Binary files /dev/null and b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130201(報價調整).xls differ diff --git a/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130304 (時程).xls b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130304 (時程).xls new file mode 100644 index 0000000..c5f17ad Binary files /dev/null and b/Doc/教育訓練系統/新譽管理辦訓系統報價單 20130304 (時程).xls differ diff --git a/Doc/教育訓練系統/溝通記錄畫面.odt b/Doc/教育訓練系統/溝通記錄畫面.odt new file mode 100644 index 0000000..b6036d3 Binary files /dev/null and b/Doc/教育訓練系統/溝通記錄畫面.odt differ diff --git a/Doc/教育訓練系統/溝通記錄畫面.pdf b/Doc/教育訓練系統/溝通記錄畫面.pdf new file mode 100644 index 0000000..cbca520 Binary files /dev/null and b/Doc/教育訓練系統/溝通記錄畫面.pdf differ diff --git a/Doc/教育訓練系統/簽到表.doc b/Doc/教育訓練系統/簽到表.doc new file mode 100644 index 0000000..4d3684c Binary files /dev/null and b/Doc/教育訓練系統/簽到表.doc differ diff --git a/Doc/教育訓練系統/系統修改示意_20200711.docx b/Doc/教育訓練系統/系統修改示意_20200711.docx new file mode 100644 index 0000000..695c540 Binary files /dev/null and b/Doc/教育訓練系統/系統修改示意_20200711.docx differ diff --git a/Doc/教育訓練系統/課程基本資料表及課程企畫書.doc b/Doc/教育訓練系統/課程基本資料表及課程企畫書.doc new file mode 100644 index 0000000..635c01f Binary files /dev/null and b/Doc/教育訓練系統/課程基本資料表及課程企畫書.doc differ diff --git a/Doc/教育訓練系統/講師資料匯出_20200730.xls b/Doc/教育訓練系統/講師資料匯出_20200730.xls new file mode 100644 index 0000000..a3e6659 Binary files /dev/null and b/Doc/教育訓練系統/講師資料匯出_20200730.xls differ diff --git a/Doc/教育訓練系統/辦訓作業流程SOP及表單(3.0版)-工程師 0425.doc b/Doc/教育訓練系統/辦訓作業流程SOP及表單(3.0版)-工程師 0425.doc new file mode 100644 index 0000000..a56c606 Binary files /dev/null and b/Doc/教育訓練系統/辦訓作業流程SOP及表單(3.0版)-工程師 0425.doc differ diff --git a/Doc/教育訓練系統/辦訓作業流程SOP及表單(3.0版)-彙整 0703.doc b/Doc/教育訓練系統/辦訓作業流程SOP及表單(3.0版)-彙整 0703.doc new file mode 100644 index 0000000..4ddc207 Binary files /dev/null and b/Doc/教育訓練系統/辦訓作業流程SOP及表單(3.0版)-彙整 0703.doc differ diff --git a/Doc/教育訓練系統/辦訓作業流程SOP及表單-效益追蹤表及檢討報告-0620.doc b/Doc/教育訓練系統/辦訓作業流程SOP及表單-效益追蹤表及檢討報告-0620.doc new file mode 100644 index 0000000..1aec133 Binary files /dev/null and b/Doc/教育訓練系統/辦訓作業流程SOP及表單-效益追蹤表及檢討報告-0620.doc differ diff --git a/Doc/教育訓練系統/辦訓系統修改進度更新_客戶版_1150730.md b/Doc/教育訓練系統/辦訓系統修改進度更新_客戶版_1150730.md new file mode 100644 index 0000000..55d5d18 --- /dev/null +++ b/Doc/教育訓練系統/辦訓系統修改進度更新_客戶版_1150730.md @@ -0,0 +1,91 @@ +# 辦訓系統修改進度更新 + +## 一、本次處理範圍 + +本次依據辦訓系統修改需求文件及後續批示,完成以下項目: + +- 職能類型選項調整。 +- 講師及場地遴選送簽檢核調整。 +- 教學日誌課程執行觀察及異常追蹤驗證。 +- 異常情形片語功能。 +- 處理結果追蹤獨立簽核限制。 +- 年度課程執行狀況的教學日誌暨異常資料顯示。 +- 訓練檢討報告改善措施的條件式驗證。 + +## 二、已完成內容 + +### 1. 職能類型 + +- 新增及選擇畫面移除舊有職能類型選項。 +- 保留既有歷史資料的顯示名稱及舊報表文字。 + +### 2. 講師及場地遴選 + +- 送簽前檢核調整為:講師或場地的「編號」與「名稱」至少有一項即可。 +- 支援資料庫已有編號及未建立編號但有手動名稱的情況。 + +### 3. 教學日誌 + +- 保留 8 項課程執行觀察。 +- 增加觀察說明及課程觀察紀錄。 +- 選擇異常或待改善選項時,提示填寫觀察說明。 +- 選擇有異常時,要求填寫異常情形。 +- 選擇需要後續追蹤時,要求填寫追蹤事項。 + +### 4. 異常情形片語 + +- 教學日誌異常情形增加片語按鈕。 +- 片語內容可由片語管理功能維護。 +- 片語可帶入異常情形欄位,並保留手動輸入功能。 + +### 5. 處理結果追蹤簽核 + +- 主教學日誌完成簽核且確實需要後續追蹤後,才可填寫處理結果追蹤。 +- 已完成簽核的處理結果追蹤不可再修改。 +- 處理結果追蹤與主教學日誌維持獨立簽核流程。 + +### 6. 年度課程執行狀況 + +- 保留「教學日誌暨異常」分頁。 +- 顯示 8 項課程執行觀察、觀察說明、課程觀察紀錄、異常及後續追蹤資料。 +- 年度課程主表保留異常情形顯示。 + +### 7. 訓練檢討報告 + +- 六個改善面向的「其他」欄位依選項動態顯示: + - 學員。 + - 講師。 + - 教材及教具。 + - 教學方法。 + - 場地及設備。 + - 行政流程。 +- 選擇改善內容或改善作法的「其他」時,要求填寫對應說明。 + +## 三、本次不納入範圍 + +依批示,本次不處理以下項目: + +- 講師評鑑入口。 +- 年度課程執行狀況的講師評鑑分頁。 +- 單堂及年度匯出報表。 +- 問卷固定天數提醒機制調整。 +- 現有簽核硬編碼規則調整。 + +## 四、客戶驗收重點 + +- 新增一筆含手動講師或手動場地名稱的課程企劃,確認可正常送簽。 +- 教學日誌逐項測試 8 個課程執行觀察選項。 +- 測試異常情形片語的顯示及帶入。 +- 測試「有異常」及「需要後續追蹤」時的必填檢核。 +- 確認主教學日誌簽核完成後,才能填寫處理結果追蹤。 +- 確認處理結果追蹤完成簽核後不可修改。 +- 在年度課程執行狀況確認教學日誌暨異常分頁資料完整。 +- 在訓練檢討報告測試六個面向的「其他」欄位及必填檢核。 + +## 五、片語資料設定 + +片語功能已加入「異常情形」分類。使用前請至片語管理新增或確認適用欄位為「異常情形」的片語資料,教學日誌即可顯示對應片語。 + +## 六、目前狀態 + +本次批示範圍已完成程式調整,後續請依驗收重點進行客戶測試;未納入範圍如需追加,另行評估時程及費用。 diff --git a/Doc/教育訓練系統/辦訓系統修改需求整理_1150807.md b/Doc/教育訓練系統/辦訓系統修改需求整理_1150807.md new file mode 100644 index 0000000..e445c69 --- /dev/null +++ b/Doc/教育訓練系統/辦訓系統修改需求整理_1150807.md @@ -0,0 +1,86 @@ +# 辦訓系統修改需求整理 + +## 1. 文件資訊 + +- **來源文件:** `辦訓系統修改項目_1150807.xlsx` +- **整理範圍:** 第一個工作表「辦訓系統修改」 +- **內容來源:** 工作表文字、內嵌畫面截圖、紅框及箭頭標註 + +## 2. 修改需求 + +### 2.1 課程企劃書:教材遴選 + +**路徑:** 辦訓系統 > 開課作業 > 課程企劃書 > 課程內容 > 教材遴選 + +- 教材遴選填寫一項教材即可,不限制一定要填寫兩項教材。 +- 教材遴選評分項目改為每項 20%。 +- 評分欄位改為直接輸入分數,不使用下拉式選單。 +- 移除「教材評選綜合評估」欄位。 +- 移除「訓練單位回饋與建議」欄位。 + +**圖片補充:** + +- 示意截圖標示教材遴選畫面的評分區域。 +- 紅框用來指出評分欄位及需要移除或調整的畫面區塊。 + +### 2.2 教學日誌暨異常狀況登錄 + +**路徑:** 辦訓系統 > 辦訓狀況 > 教學日誌暨異常狀況登錄 + +- 「教學概要及學員反應」欄位增加提示文字: + - `2026年起改填寫課程執行觀察` +- 「課程執行觀察」各題選項需上下對齊:上題第一個選項對齊下題第一個選項,依此類推。 +- 課程執行觀察選項如下: + +| 題目 | 選項 | +|---|---| +| 課程是否依原訂計畫執行 | 符合原訂計畫、部分調整、未依原訂計畫執行 | +| 課程進度 | 超前、符合規劃、略有落後、未完成 | +| 講師授課情形 | 優良、良好、普通、待改善 | + +- 異常處理區塊增加標題「異常狀況紀錄」。 +- 「處理結果追蹤」目前無法輸入內容,需增加「送簽」按鈕。 +- 第一關簽核人員固定為 `02070 陳琬婷`。 +- 送單後仍可更正內容,但僅限「處理結果追蹤」欄位。 +- 「處理結果追蹤」可獨立送簽。 + +**圖片補充:** + +- 示意表格以畫面方式呈現三組課程執行觀察選項的對齊方式。 +- 異常處理畫面以紅框標出新增的「異常狀況紀錄」區塊。 +- 相關畫面標示「處理結果追蹤」輸入區域及送簽流程需調整的位置。 + +### 2.3 訓練檢討報告 + +**路徑:** 辦訓系統 > 辦訓狀況 > 訓練檢討報告 + +- 「滿意度列」與「參與人數列」整列上下交換位置。 +- 隱藏示意圖中紅框標示的區塊。 + +**圖片補充:** + +- 示意截圖以紅框標出需要隱藏的畫面區域。 + +### 2.4 年度課程執行狀況 + +**路徑:** 辦訓系統 > 辦訓狀況 > 年度課程執行狀況 + +- 「教學日誌暨異常」分頁以原頁面格式呈現。 +- 畫面格式參照「課程企劃」分頁。 + +**圖片補充:** + +- 示意畫面用於說明「教學日誌暨異常」分頁應沿用既有頁面配置及呈現方式。 + +## 3. 驗收重點 + +- 教材遴選只填寫一項教材時可以正常儲存及送簽。 +- 教材評分可直接輸入,每項比例為 20%,且不顯示已移除欄位。 +- 教學日誌顯示新的提示文字及對齊後的課程執行觀察選項。 +- 異常區塊顯示「異常狀況紀錄」標題。 +- 「處理結果追蹤」可輸入並使用「送簽」按鈕。 +- 第一關簽核人員顯示為 `02070 陳琬婷`。 +- 主單送出後,只有「處理結果追蹤」可以繼續修改及獨立送簽。 +- 訓練檢討報告的「滿意度列」與「參與人數列」位置正確交換。 +- 訓練檢討報告中紅框指定區塊已隱藏。 +- 年度課程執行狀況的「教學日誌暨異常」分頁格式與「課程企劃」分頁一致。 diff --git a/Doc/教育訓練系統/辦訓系統修改需求條目與實作方案_1150730.md b/Doc/教育訓練系統/辦訓系統修改需求條目與實作方案_1150730.md new file mode 100644 index 0000000..dc83c95 --- /dev/null +++ b/Doc/教育訓練系統/辦訓系統修改需求條目與實作方案_1150730.md @@ -0,0 +1,538 @@ +# 辦訓系統修改需求條目與實作方案 + +## 1. 文件目的 + +本文件整合以下四份修改需求文件,整理本次辦訓系統的完整需求、版本增量、驗收條件及建議實作方案: + +- `辦訓系統修改項目_1150719.xlsx` +- `辦訓系統修改項目_1150722(更新V2).xlsx` +- `辦訓系統修改項目_1150727.xlsx` +- `辦訓系統修改項目_1150730.xlsx` + +另參考 `0730系統規劃圖.png` 及各 Excel 工作表中的畫面示意圖。圖片中的畫面配置、流程與模組關係視為需求的一部分。 + +## 2. 版本基準與合併規則 + +### 2.1 版本角色 + +| 版本 | 角色 | 處理方式 | +|---|---|---| +| 1150719 | 原始需求基準 | 全部納入 | +| 1150722 更新 V2 | 第一次追加及修改 | 未刪除的原需求保留;明確修改項目覆蓋原規格 | +| 1150727 | 第二次修改 | 依新版畫面調整欄位與排列 | +| 1150730 | 最新修改 | 覆蓋教學日誌的前一版畫面與欄位內容 | + +### 2.2 合併原則 + +1. 後續文件未明確刪除的原始需求仍然有效。 +2. 後續文件明確修改同一功能時,以日期較新的文件為準。 +3. `1150730` 的 8 項課程執行觀察取代 `1150727` 的簡化版教學日誌畫面。 +4. `1150722` 的「處理結果追蹤獨立簽核」取代 `1150719` 所描述的三份文件單一關卡簽核方式。 +5. Excel 內嵌圖片與獨立系統規劃圖均納入畫面與流程判讀,不以文字內容為唯一依據。 + +## 3. 需求條目 + +### R-01 課程企劃書增加教材遴選 + +**來源:** 1150719 + +**功能要求:** + +- 路徑:辦訓系統 > 開課作業 > 課程企劃書。 +- 增加「教材遴選」按鈕。 +- 遴選項目如下,採 1 至 10 分評分: + - 教材設計符合訓練目標。 + - 教材設計整體架構規劃完整性。 + - 教材設計符合課程規劃時數。 + - 教學方法能引起學員的學習興趣。 + - 教材設計可做為學員未來工作參考或運用。 +- 增加教材評選綜合評估:不符合目標、符合目標、符合目標且能引起學習興趣。 +- 增加訓練單位回饋與建議。 + +**驗收條件:** + +- 課程企劃書可以開啟教材遴選畫面。 +- 每個指標可輸入 1 至 10 分。 +- 系統保存、重新載入及簽核檢視時資料一致。 +- 教材遴選內容可在相關檢視及報表中顯示。 + +### R-02 專案類型改為職能類型 + +**來源:** 1150719 + +**功能要求:** + +- 欄位名稱由「專案類型」改為「職能類型」。 +- 選項固定為:核心職能、專業職能、管理職能。 +- 新增、修改、查詢、檢視及報表的欄位名稱與選項需一致。 + +**驗收條件:** + +- 所有相關畫面均顯示「職能類型」。 +- 舊資料可正常顯示,不因欄位名稱調整而遺失。 + +### R-03 講師及場地遴選允許手動輸入 + +**來源:** 1150719 + +**功能要求:** + +- 講師不在講師資料庫時,仍可填寫講師姓名及必要資訊。 +- 場地不在場地資料庫時,仍可填寫場地名稱及必要資訊。 +- 已存在於資料庫的講師或場地仍可使用原有選取功能。 +- 手動輸入資料需隨課程企劃保存,不能因重新載入而消失。 + +**驗收條件:** + +- 資料庫有資料與無資料兩種情境均可完成遴選。 +- 簽核、檢視及後續報表能正確顯示手動輸入內容。 + +### R-04 滿意度問卷手機填寫及逾期提醒 + +**來源:** 1150719 + +**功能要求:** + +- 建立專用滿意度問卷填寫網址。 +- 支援手機版面。 +- 使用者開啟網址後可直接登入並填寫問卷。 +- 增加問卷填寫期限日期。 +- 超過期限仍未填寫者,由系統主動寄送提醒通知。 + +**驗收條件:** + +- 手機瀏覽器可登入、填寫及送出問卷。 +- 填寫期限前不重複寄送提醒。 +- 超過期限且未填寫者會進入提醒名單。 +- 寄信失敗需有錯誤記錄,不得中斷其他收件者處理。 + +### R-05 教學日誌改為最新課程執行觀察表單 + +**來源:** 1150719、1150727、1150730 + +**最新規格:** 1150730 + +教學日誌需包含以下資料: + +#### 課程基本資料 + +- 課程內容下拉選單。 +- 課程企劃編號。 +- 節次。 +- 講師。 +- 應到人數。 +- 實到人數。 +- 缺席人數。 + +#### 課程執行觀察 + +| 編號 | 觀察項目 | 選項 | +|---|---|---| +| 1 | 課程是否依原訂計畫執行 | 符合原訂計畫、部分調整、未依原訂計畫執行 | +| 2 | 課程進度 | 超前、符合規劃、略有落後、未完成 | +| 3 | 講師授課情形 | 優良、良好、普通、待改善 | +| 4 | 學員參與互動 | 非常踴躍、踴躍、普通、不佳 | +| 5 | 學員學習投入 | 積極投入、大多投入、部分投入、投入度不足 | +| 6 | 學員課堂回應情形 | 主動分享工作經驗或案例、回應提問並連結工作情境、經引導後連結工作情境、未觀察到相關回應、不適用 | +| 7 | 實作/活動完成情形 | 全數完成、大部分完成、部分完成、未完成、不適用 | +| 8 | 教學設備及場地 | 正常、輕微異常、影響授課、無法使用 | + +若第 1、2、3、4、5、7、8 項選擇代表異常或待改善的選項,畫面需提示填寫說明。 + +#### 課程觀察紀錄 + +- 本次課程值得保留或表現良好之處。 +- 本次課程可改善事項及建議。 + +#### 異常及追蹤資料 + +- 異常情形:有/無。 +- 處理過程及建議。 +- 是否需後續追蹤:否,異常狀況順利解決,本案已結案;是,並填寫追蹤事項。 +- 處理結果追蹤。 +- 填表人員。 +- 填表日期。 + +**驗收條件:** + +- 新增、修改、檢視畫面欄位與 1150730 示意圖一致。 +- 8 項觀察選項的值可保存、修改、檢視。 +- 選擇「無」時,不要求填寫異常相關欄位。 +- 需要說明的觀察選項未填說明時,系統可提示使用者。 +- 舊有教學日誌資料仍可正常開啟。 + +### R-06 異常情形增加片語功能 + +**來源:** 1150722、1150730 + +**功能要求:** + +- 異常情形輸入欄位提供「片語」按鈕。 +- 片語由負責同仁透過既有片語設定功能維護。 +- 點選片語後,可將內容帶入異常情形文字框。 +- 支援既有文字後追加片語,不覆蓋使用者已輸入內容。 +- 年度課程執行狀況的異常情形顯示使用教學日誌保存的內容。 + +**驗收條件:** + +- 片語清單可正常載入。 +- 點選片語可帶入文字框。 +- 新增、修改、檢視及年度彙整內容一致。 +- 沒有片語資料時,畫面仍可手動輸入。 + +### R-07 處理結果追蹤獨立簽核 + +**來源:** 1150722 + +**功能要求:** + +- 「處理經過與結果」改名為「處理結果追蹤」的需求,依 1150730 最新畫面拆分為: + - 處理過程及建議。 + - 是否需後續追蹤。 + - 追蹤事項。 + - 處理結果追蹤。 +- 教學日誌主表單完成簽核後,若有異常且需要追蹤,才可填寫處理結果追蹤。 +- 處理結果追蹤填寫完成後,需使用獨立簽核流程送簽。 +- 主表單與追蹤表單的簽核狀態需分開顯示。 +- 追蹤簽核完成後,不得任意修改已簽核內容。 + +**驗收條件:** + +- 主表單未完成簽核時,不可填寫或送出追蹤結果。 +- 無異常或不需追蹤時,不顯示不必要的追蹤操作。 +- 追蹤內容可送簽、簽核、撤簽及檢視歷程。 + +### R-08 教學日誌增加講師評鑑入口 + +**來源:** 1150722、1150727、1150730 + +**功能要求:** + +- 教學日誌畫面增加「講師評鑑」按鈕。 +- 按鈕連結至講師評鑑功能頁面。 +- 至少需傳遞講師編號。 +- 若評鑑屬於單堂課程,應一併識別課程企劃編號及課程序號。 +- 已有該堂評鑑資料時,入口應開啟修改或檢視模式,而不是重複新增。 + +**驗收條件:** + +- 從教學日誌可直接開啟正確講師的評鑑畫面。 +- 評鑑資料可回到年度課程執行狀況查詢。 +- 同一課程、節次及講師不得產生重複評鑑資料。 + +### R-09 年度課程執行狀況增加教學日誌及講師評鑑 + +**來源:** 1150722、1150727、1150730 + +**功能要求:** + +- 主表格的「異常情形」欄位放在「教學方法」之後。 +- 異常情形內容從教學日誌帶入,必要時以片語內容顯示。 +- 課程明細分頁增加: + - 教學日誌暨異常。 + - 講師評鑑。 +- 教學日誌分頁顯示 8 項課程執行觀察、觀察紀錄、異常及追蹤資料。 +- 講師評鑑分頁顯示該課程及講師對應的評鑑資料。 + +**驗收條件:** + +- 選取年度課程後,兩個分頁均可正常載入。 +- 沒有資料時顯示明確的空資料訊息。 +- 課程切換、分頁切換及重新查詢不會顯示上一筆課程資料。 +- 年度主表的異常內容與教學日誌一致。 + +### R-10 訓練檢討報告增加改善措施 + +**來源:** 1150719 工作表及相關圖片 + +**功能要求:** + +改善措施分為六個面向: + +- 學員。 +- 講師。 +- 教材及教具。 +- 教學方法。 +- 場地及設備。 +- 行政流程。 + +每個面向包含: + +- 改善內容,可複選並以逗號分隔。 +- 改善內容其他說明。 +- 改善作法,單選。 +- 改善作法其他說明。 +- 補充說明。 + +當改善內容或改善作法選擇「其他」時,對應的其他說明欄位必填。 + +**驗收條件:** + +- 六個面向的欄位排列符合示意圖。 +- 複選值可正確保存及重新勾選。 +- 「其他」欄位有條件式必填檢核。 +- 檢視、列印及匯出內容可正確顯示中文名稱。 + +### R-11 教學日誌及訓練檢討報告匯出 + +**來源:** 1150719 + +**功能要求:** + +- 支援匯出單堂課程資料。 +- 支援匯出全年度資料。 +- 匯出格式參考滿意度調查匯出功能及 Excel 示意圖。 +- 匯出內容需包含最新版本的教學日誌欄位與訓練檢討報告改善措施。 +- 匯出檔需保留圖片示意的欄位順序、標題及版面結構。 + +**驗收條件:** + +- 單堂匯出內容與畫面資料一致。 +- 年度匯出只包含指定年度資料。 +- 無資料時不產生空白或錯誤檔案,並提供明確提示。 +- 多筆資料的欄位不錯位,中文、換行及複選內容可正常顯示。 + +### R-12 簽核流程整合 + +**來源:** 1150719、1150722 + +**最新處理方式:** + +- 原始需求的課程企劃書、教學日誌、訓練檢討報告一關簽核,保留作為整體流程背景。 +- 後續新增的教學日誌「處理結果追蹤」採獨立簽核,不與主教學日誌共用同一張簽核單。 +- 實際簽核關數依既有簽核設定及後續確認結果決定,不在程式中硬編碼。 + +## 4. 目前程式現況 + +### 4.1 已具備或已有基礎 + +| 項目 | 目前程式位置 | 現況 | +|---|---|---| +| 教材遴選 | `Forms/課程企劃/PickupMaterial.aspx`、`DAC/課程企劃/DAC_教材遴選*.cs` | 已有資料表、輸入及檢視基礎 | +| 職能類型 | `DAC/基本資料/DAC_計畫別.cs` | 已有核心、專業、管理職能選項 | +| 手動講師 | `Forms/課程企劃/PickupTeacher.aspx` | 已有手動姓名及相關欄位基礎 | +| 手動場地 | `Forms/課程企劃/PickupPlace.aspx` | 已有手動場地名稱基礎 | +| 手機問卷 | `MobileSurvey`、`Common/FollowService.cs` | 已有手機問卷及催填郵件基礎 | +| 教學日誌資料欄位 | `DAC/辦訓狀況/DAC_教學日誌1.cs` | 已有 8 項觀察、觀察紀錄、異常及追蹤欄位 | +| 教學日誌選項 | `DAC/辦訓狀況/DAC_教學日誌選項.cs` | 已有 8 組選項及名稱轉換 | +| 教學日誌畫面 | `Forms/辦訓狀況/教學日誌處理.aspx` | 已有最新 8 項觀察及追蹤欄位畫面 | +| 主教學日誌簽核 | `Forms/辦訓狀況/教學日誌處理.aspx.cs` | 已有主表單簽核流程 | +| 追蹤結果簽核 | `Forms/辦訓狀況/教學日誌處理.aspx.cs` | 已有獨立追蹤簽核基礎 | +| 年度異常欄位 | `Forms/辦訓狀況/年度課程執行狀況.aspx` | 已有主表及教學日誌明細異常欄位 | +| 講師評鑑頁面 | `Forms/辦訓狀況/講師評鑑.aspx` | 已有獨立新增、修改及刪除功能 | +| 檢討報告改善措施 | `DAC/辦訓狀況/DAC_訓練檢討報告1.cs` | 已有六面向欄位與資料存取基礎 | + +### 4.2 明確待補或需確認 + +| 項目 | 現況問題 | 建議處理 | +|---|---|---| +| 異常片語 | `btn片語_Click` 目前為空方法,異常輸入區缺少完整片語操作 | 比照既有片語元件,接入 `DAC_片語` | +| 教學日誌講師評鑑按鈕 | 教學日誌畫面尚未提供入口 | 增加按鈕並傳遞講師及課程識別資料 | +| 年度講師評鑑分頁 | 年度頁面目前只有教學日誌分頁 | 增加 View、資料來源、分頁按鈕及重新綁定流程 | +| 講師評鑑課程關聯 | 現有 `講師外訓滿意度` 主要以講師編號識別 | 確認是否新增課程企劃編號及課程序號關聯 | +| 單堂匯出 | 目前未找到教學日誌及檢討報告單堂匯出入口 | 新增 Report 類別及頁面按鈕 | +| 年度匯出 | 現有年度報表主要為課程摘要,未包含完整教學日誌及評鑑 | 擴充年度報表資料查詢及 Excel 版面 | +| 提醒期限 | 已有問卷催填基礎,但需確認填寫期限與重複寄送規則 | 補齊期限欄位、排程條件及發送紀錄 | +| 三份文件一關簽核 | 原始需求與後續獨立追蹤簽核存在版本差異 | 以後續獨立追蹤簽核為優先,確認主流程關卡設定 | + +## 5. 建議實作方案 + +### 5.1 第一階段:需求及資料模型確認 + +1. 將四份 Excel 的欄位、圖片畫面及流程整理成正式欄位對照表。 +2. 確認資料庫現有欄位與長度,尤其是教學日誌 8 項觀察及講師評鑑關聯。 +3. 確認講師評鑑是否以「講師」為單位,或以「課程企劃編號 + 課程序號 + 講師」為單位。 +4. 確認問卷填寫期限的資料來源、排程執行方式及提醒寄送紀錄。 +5. 確認簽核設定:主教學日誌、處理結果追蹤、訓練檢討報告各自的簽核關卡。 + +### 5.2 第二階段:資料存取及服務層 + +1. 保留既有 `DAC_教學日誌` 欄位,僅補不足的資料庫欄位或索引。 +2. 在 `DAC_教學日誌2.cs` 增加需要的驗證、片語查詢及年度彙整方法。 +3. 擴充講師評鑑資料存取方法,支援依課程企劃及節次查詢。 +4. 擴充年度課程查詢,一次取得課程、教學日誌及講師評鑑資料,避免畫面逐筆查詢造成效能問題。 +5. 增加匯出專用資料模型,避免直接把畫面物件當作報表資料來源。 +6. 補充問卷期限及提醒發送紀錄的資料存取方法。 + +### 5.3 第三階段:教學日誌功能 + +1. 在 `教學日誌處理.aspx` 的異常情形輸入區加入片語按鈕及片語清單。 +2. 使用既有 `DAC_片語` 查詢適用於異常情形的片語。 +3. 保留 1150730 的 8 項觀察、觀察說明、兩項課程觀察紀錄及追蹤欄位。 +4. 加入條件式驗證:選擇異常或待改善選項時提示填寫說明。 +5. 加入「講師評鑑」按鈕,使用 PopupForm 開啟既有 `講師評鑑.aspx`。 +6. 由教學日誌取得講師編號、課程企劃編號及課程序號,避免使用者重新選擇錯誤對象。 +7. 保留主表單及處理結果追蹤的分離簽核流程。 + +### 5.4 第四階段:年度課程執行狀況 + +1. 在 `年度課程執行狀況.aspx` 增加「講師評鑑」分頁及對應 `View`。 +2. 增加講師評鑑 ObjectDataSource 或由後端一次載入課程關聯資料。 +3. 修正課程切換、分頁切換及重新查詢時的資料綁定流程。 +4. 保留主表格「教學方法」後的異常情形欄位。 +5. 依示意圖調整教學日誌分頁欄位順序與顯示格式。 +6. 無資料時顯示空資料訊息,不顯示上一課程殘留內容。 + +### 5.5 第五階段:單堂及年度匯出 + +1. 新增教學日誌單堂匯出 Report。 +2. 新增訓練檢討報告單堂匯出 Report。 +3. 新增教學日誌及訓練檢討報告年度匯出 Report。 +4. 依 Excel 圖片示意保留標題、欄位順序、合併儲存格、換行及欄寬。 +5. 複選改善內容以中文名稱輸出,必要時以換行顯示,而不是直接輸出代碼。 +6. 報表資料查詢使用單次批次查詢,避免每一列各自查詢資料庫。 +7. 下載檔名包含課程或年度及產生時間,避免瀏覽器覆蓋既有檔案。 + +### 5.6 第六階段:簽核及提醒流程 + +1. 檢查 `表單簽核主檔` 對教學日誌、追蹤結果及訓練檢討報告的關卡設定。 +2. 以後續版本要求為準,讓處理結果追蹤保持獨立簽核。 +3. 確認簽核完成後的欄位唯讀規則。 +4. 補齊問卷填寫期限判斷、未填寫名單及提醒寄送紀錄。 +5. 單一收件者寄送失敗時,繼續處理其餘收件者並記錄失敗原因。 + +## 6. 建議修改檔案 + +### 教材及課程企劃 + +- `Forms/課程企劃/訓練課程企劃書.aspx` +- `Forms/課程企劃/PickupTeacher.aspx` +- `Forms/課程企劃/PickupPlace.aspx` +- `Forms/課程企劃/PickupMaterial.aspx` +- `Forms/檢視UC/教材遴選View.ascx` +- `DAC/課程企劃/DAC_教材遴選2.cs` + +### 教學日誌及講師評鑑 + +- `Forms/辦訓狀況/教學日誌處理.aspx` +- `Forms/辦訓狀況/教學日誌處理.aspx.cs` +- `Forms/辦訓狀況/講師評鑑.aspx` +- `Forms/辦訓狀況/講師評鑑.aspx.cs` +- `DAC/辦訓狀況/DAC_教學日誌2.cs` +- `DAC/辦訓狀況/DAC_教學日誌選項.cs` +- `DAC/辦訓狀況/DAC_講師外訓滿意度2.cs` +- `DAC/辦訓狀況/DAC_片語*.cs` + +### 年度課程執行狀況 + +- `Forms/辦訓狀況/年度課程執行狀況.aspx` +- `Forms/辦訓狀況/年度課程執行狀況.aspx.cs` +- `Forms/檢視UC/教學日誌暨異常狀況View.ascx` +- `Forms/檢視UC/教學日誌暨異常狀況View.ascx.cs` + +### 訓練檢討報告及匯出 + +- `Forms/辦訓狀況/訓練檢討報告處理.aspx` +- `Forms/辦訓狀況/訓練檢討報告處理.aspx.cs` +- `DAC/辦訓狀況/DAC_訓練檢討報告2.cs` +- `Report/年度課程執行狀況報表.cs` +- 新增教學日誌及訓練檢討報告匯出 Report 類別 + +### 問卷提醒 + +- `MobileSurvey/*` +- `Common/FollowService.cs` +- `SendMail/發送郵件.cs` +- 問卷期限及發送紀錄相關 DAC + +## 7. 測試計畫 + +### 功能測試 + +- 教材遴選評分、綜合評估及手動講師/場地。 +- 職能類型新增、修改、查詢及檢視。 +- 手機問卷登入、填寫、期限及提醒郵件。 +- 教學日誌 8 項觀察及條件式說明。 +- 異常片語帶入、手動輸入及年度彙整。 +- 主教學日誌簽核及處理結果追蹤獨立簽核。 +- 從教學日誌開啟講師評鑑及回到年度頁面查詢。 +- 年度課程執行狀況兩個新增分頁的資料正確性。 +- 單堂及年度 Excel 匯出。 + +### 相容性測試 + +- 已有舊教學日誌資料的檢視及修改。 +- 沒有講師評鑑資料的課程。 +- 沒有教學日誌資料的課程。 +- 沒有異常、沒有追蹤事項的課程。 +- 手動講師及手動場地資料。 +- 多節次課程及同一講師多筆評鑑資料。 + +### 安全及權限測試 + +- 未授權使用者不可修改已簽核資料。 +- 追蹤結果只能由符合權限的使用者填寫及送簽。 +- 匯出資料需遵守公司別及使用者權限。 +- 郵件收件者及內容需進行輸入清理,避免標頭注入。 + +## 8. 開放確認事項 + +1. 講師評鑑資料是否要以「課程企劃編號 + 課程序號 + 講師編號」作為唯一關聯? +2. 1150719 的「三份文件一關簽核」是否確定由 1150722 的「處理結果追蹤獨立簽核」取代? +3. 單堂及年度匯出是否需要完全依照 Excel 示意圖製作固定版型,或可使用欄位式 Excel 報表? +4. 問卷填寫期限由課程企劃設定,還是由滿意度調查功能另外設定? +5. 「課程內容」下拉選單是否只列出目前課程企劃的節次,或需可跨課程搜尋? +6. 觀察項目的異常說明是否只在畫面提示,還是必須設定為資料庫必填? + +## 9. 建議交付順序 + +1. 先完成需求與資料庫欄位確認。 +2. 完成教學日誌欄位、片語及獨立簽核驗證。 +3. 完成講師評鑑課程關聯及教學日誌入口。 +4. 完成年度課程執行狀況兩個分頁。 +5. 完成單堂及年度匯出。 +6. 完成教材遴選、問卷期限及提醒功能的差異補強。 +7. 執行完整回歸測試、編譯及使用者驗收。 + +## 10. 目前結論 + +目前程式已具備不少後續版本的資料欄位與教學日誌畫面基礎,但仍不能視為本次需求全部完成。最明確的缺口是: + +- 異常片語 UI 尚未完成。 +- 教學日誌到講師評鑑的入口尚未完成。 +- 年度課程執行狀況的講師評鑑分頁尚未完成。 +- 教學日誌及訓練檢討報告的單堂、年度匯出尚未完成。 +- 講師評鑑與課程節次的資料關聯仍需確認。 +- 原始需求與追加需求的簽核規則需依最新決策固定下來。 + +## 11. 程式碼比對結果與批示 + +本方案已與現有程式碼完成初步比對,完整差異請參考: + +`辦訓系統修改需求比對結果_1150730.md` + +### 11.1 批示前現況摘要 + +| 條目 | 目前狀態 | 主要缺口 | 批示 | +| ------------------- | -------- | ---------------------------- | ---- | +| R-01 教材遴選 | 部分完成 | 主課程企劃入口及報表需確認 | | +| R-02 職能類型 | 部分完成 | 仍有舊選項及舊報表文字 | | +| R-03 手動講師/場地 | 部分完成 | 送簽檢核強制要求編號 | | +| R-04 問卷期限提醒 | 需確認 | 目前為固定天數提醒 | | +| R-05 最新教學日誌 | 部分完成 | 缺少條件式說明驗證 | | +| R-06 異常片語 | 未完成 | 片語按鈕及帶入流程未完成 | | +| R-07 追蹤獨立簽核 | 部分完成 | 條件判斷及簽核鎖定不足 | | +| R-08 講師評鑑入口 | 需確認 | 無入口及課程節次關聯 | | +| R-09 年度課程分頁 | 部分完成 | 缺講師評鑑分頁及完整日誌內容 | | +| R-10 改善措施 | 部分完成 | 「其他」顯示及必填驗證不足 | | +| R-11 單堂/年度匯出 | 未完成 | 尚無完整日誌及檢討報告匯出 | | +| R-12 簽核整合 | 需確認 | 關數及簽核人員有硬編碼 | | + +### 11.2 批示結果 + +| 條目 | 批示結果 | 批示說明 | 預計版本/日期 | +| ---- | ---------------------------------------------------- | -------- | -------------- | +| R-01 | 教材遴選的入口在課程內容畫面,所以已完成 | | | +| R-02 | 移除舊選項,但要保持舊報表文字 | | | +| R-03 | 改成送簽前要檢核編號與名稱要有其一 | | | +| R-04 | 維持固定天數提醒 | | | +| R-05 | 做 | | | +| R-06 | 做 | | | +| R-07 | 做 | | | +| R-08 | 不做 | | | +| R-09 | 不做講師評鑑分頁,需保留或完成「教學日誌暨異常」分頁 | | | +| R-10 | 做 | | | +| R-11 | 不做 | | | +| R-12 | 維持硬編碼,客戶要求的 | | | + +**批示結果建議填寫:** 做、部分做、不做、待確認。 diff --git a/Doc/教育訓練系統/辦訓系統修改需求比對結果_1150730.md b/Doc/教育訓練系統/辦訓系統修改需求比對結果_1150730.md new file mode 100644 index 0000000..59c5446 --- /dev/null +++ b/Doc/教育訓練系統/辦訓系統修改需求比對結果_1150730.md @@ -0,0 +1,258 @@ +# 辦訓系統修改需求與現有程式碼比對結果 + +## 1. 比對範圍 + +本文件以以下方案文件及現有 Web 專案程式碼進行比對: + +- 方案文件:`辦訓系統修改需求條目與實作方案_1150730.md` +- 原始需求:`辦訓系統修改項目_1150719.xlsx` +- 後續修訂:`辦訓系統修改項目_1150722(更新V2).xlsx`、`辦訓系統修改項目_1150727.xlsx`、`辦訓系統修改項目_1150730.xlsx` +- 程式目錄:`D:\VS.NET\Thinkyu\教育訓練系統\Web` + +## 2. 狀態定義 + +| 狀態 | 說明 | +|---|---| +| 已完成 | 需求主要行為及驗收條件均已具備 | +| 部分完成 | 已有資料、畫面或流程基礎,但仍有明確缺口 | +| 未完成 | 尚未找到可支援需求的完整實作 | +| 需確認 | 有部分實作,但需確認需求規則、資料關聯或實際使用情境 | + +## 3. 逐項比對結果 + +### R-01 課程企劃書增加教材遴選 + +**比對狀態:** 部分完成 + +**現有程式:** + +- `Forms/課程企劃/PickupContent.aspx:397-401` 已有教材遴選入口。 +- `Forms/課程企劃/PickupMaterial.aspx:103-117,397-446` 已有評分、綜合評估及回饋欄位。 +- `Forms/課程企劃/PickupMaterial.aspx.cs:99-185,188-266` 已有資料載入及保存。 +- `DAC/課程企劃/DAC_教材遴選1.cs:24-30,84-148` 已有資料存取。 + +**缺口:** + +- 主課程企劃書是否需要直接顯示「教材遴選」按鈕,現況仍需確認。 +- 目前未確認教材遴選內容已納入相關 Excel 報表。 + +**批示:** 做/不做/待確認:____________ + +### R-02 專案類型改為職能類型 + +**比對狀態:** 部分完成 + +**現有程式:** + +- `Forms/課程企劃/訓練課程企劃書.aspx:54-58,167-171,421-426,647-652,1050` 多處已使用「職能類型」名稱。 +- `DAC/基本資料/DAC_計畫別.cs:20-40` 已有核心職能、專業職能、管理職能。 + +**缺口:** + +- 共用選項仍包含「人提、人派、一般」,不符合需求固定三選項。 +- `Report/年度課程執行狀況報表.cs:39-49,69-74` 仍輸出「訓練計畫別」及原始值。 +- `obj/Release` 建置複本仍可找到舊文字,需確認是否只是舊建置產物。 + +**批示:** 做/不做/待確認:____________ + +### R-03 講師及場地遴選允許手動輸入 + +**比對狀態:** 部分完成 + +**現有程式:** + +- `Forms/課程企劃/PickupTeacher.aspx:107-145` 及其 CodeBehind 已有手動講師姓名及資料欄位。 +- `Forms/課程企劃/PickupPlace.aspx:117-127` 及其 CodeBehind 已有手動場地名稱及資料欄位。 + +**缺口:** + +- `DAC/課程企劃/DAC_訓練課程企劃2.cs:594-608,619-633` 的送簽前置檢核強制要求講師/場地編號大於 0。 +- 手動資料因此可能無法通過送簽。 +- `Forms/檢視UC/訓練課程企劃書View.ascx.cs:46-52` 在編號為 0 時可能不顯示手動講師名稱。 + +**批示:** 做/不做/待確認:____________ + +### R-04 滿意度問卷手機填寫及逾期提醒 + +**比對狀態:** 需確認 + +**現有程式:** + +- `MobileSurvey/Login.aspx:5-8`、`SurveyList.aspx:5-9,22-43`、`SurveyForm.aspx:5-8,29-134` 已有手機問卷流程。 +- `Common/FollowService.cs:148-176,200-206` 已有催填郵件及狀態防重複機制。 + +**缺口:** + +- 現況使用課程結束後固定天數,不是每份問卷獨立的填寫期限日期。 +- `Common/PublicVariable.cs:108-132` 的提醒設定需確認是否符合新需求。 +- 寄信迴圈尚未確認逐收件者錯誤紀錄及不中斷處理。 +- `Web.config:38-41` 的 `SiteBaseUrl` 預設值需確認部署設定。 + +**批示:** 做/不做/待確認:____________ + +### R-05 最新教學日誌/課程執行觀察表 + +**比對狀態:** 部分完成 + +**現有程式:** + +- `Forms/辦訓狀況/教學日誌處理.aspx:94-136,366-548,615-797` 已有基本資料、8 項觀察、觀察紀錄、異常及追蹤欄位。 +- `DAC/辦訓狀況/DAC_教學日誌1.cs:24-26,96-110,346-360` 已保存 8 項觀察資料。 +- `DAC/辦訓狀況/DAC_教學日誌選項.cs:17-338` 已有 8 組選項及名稱轉換。 + +**缺口:** + +- 尚未看到選擇異常或待改善選項後的條件式說明驗證。 +- 目前只有共用「觀察說明」欄位,需確認是否符合圖片所要求的提示及資料規則。 +- 舊教學日誌資料的相容性需實際測試。 + +**批示:** 做/不做/待確認:____________ + +### R-06 異常情形增加片語功能 + +**比對狀態:** 未完成 + +**現有程式:** + +- 共用片語資料存取存在於 `DAC/基本資料/DAC_片語1.cs:24-30,120-174`。 +- `Forms/辦訓狀況/教學日誌處理.aspx.cs:209-211` 的 `btn片語_Click` 目前為空方法。 + +**缺口:** + +- 教學日誌異常情形區沒有完整片語按鈕及片語資料來源。 +- 尚未完成片語帶入、追加文字及年度彙整驗證。 + +**批示:** 做/不做/待確認:____________ + +### R-07 處理結果追蹤獨立簽核 + +**比對狀態:** 部分完成 + +**現有程式:** + +- `Forms/辦訓狀況/教學日誌處理.aspx:802-825` 已有主表單及追蹤結果兩個簽核控制項。 +- `Forms/辦訓狀況/教學日誌處理.aspx.cs:153-175` 已有主簽核完成後顯示追蹤入口的流程。 + +**缺口:** + +- `教學日誌處理.aspx.cs:168-171` 只檢查「有異常」,未檢查「是否需後續追蹤」。 +- `教學日誌處理.aspx:774-780` 的主表單編輯區仍可直接修改處理結果追蹤。 +- `DAC/辦訓狀況/DAC_教學日誌2.cs:123-137` 的獨立更新方法未確認簽核狀態、版本及歷程控管。 + +**批示:** 做/不做/待確認:____________ + +### R-08 教學日誌增加講師評鑑入口及關聯 + +**比對狀態:** 需確認,且為核心缺口 + +**現有程式:** + +- `Forms/辦訓狀況/講師評鑑.aspx` 及 CodeBehind 已有獨立評鑑功能。 +- `Forms/辦訓狀況/講師評鑑.aspx.cs:26-35` 目前接收 `id` 及 `teacherid`。 + +**缺口:** + +- 教學日誌目前沒有「講師評鑑」按鈕。 +- `DAC/辦訓狀況/DAC_講師外訓滿意度1.cs:24-30,100-114` 未看到課程企劃編號及課程序號欄位。 +- 無法可靠判斷同一課程、節次及講師是否已有評鑑,可能產生重複資料。 + +**批示:** 做/不做/待確認:____________ + +### R-09 年度課程執行狀況增加教學日誌及講師評鑑 + +**比對狀態:** 部分完成 + +**現有程式:** + +- `Forms/辦訓狀況/年度課程執行狀況.aspx:101-114` 已有主表異常情形欄位。 +- `年度課程執行狀況.aspx:153-158,285-347` 已有「教學日誌暨異常」分頁及資料表。 +- `年度課程執行狀況.aspx.cs:76-94` 已有異常內容彙整。 + +**缺口:** + +- 尚未有「講師評鑑」分頁。 +- 教學日誌分頁目前只顯示節次、日期、填表人員、出席人數、教學概要、學員反應、異常及處理過程,未顯示 8 項觀察、觀察紀錄及完整追蹤資料。 +- 完整 `Forms/檢視UC/教學日誌暨異常狀況View.ascx` 尚未被年度頁使用。 + +**批示:** 做/不做/待確認:____________ + +### R-10 訓練檢討報告增加改善措施 + +**比對狀態:** 部分完成 + +**現有程式:** + +- `Forms/辦訓狀況/訓練檢討報告處理.aspx:430-571,676-817` 已有六面向及相關欄位。 +- `DAC/辦訓狀況/DAC_訓練檢討報告1.cs:24-26,90-119,164-193` 已有資料欄位及保存。 + +**缺口:** + +- 「其他」欄位目前固定 `display:none`,尚未確認會依選項顯示。 +- `訓練檢討報告處理.aspx.cs:151-215` 尚未看到改善內容/改善作法選擇「其他」時的條件式必填驗證。 +- 列印及匯出中文名稱尚未完成比對。 + +**批示:** 做/不做/待確認:____________ + +### R-11 教學日誌及訓練檢討報告單堂/年度匯出 + +**比對狀態:** 未完成 + +**現有程式:** + +- `Forms/辦訓狀況/年度課程執行狀況.aspx.cs:117-141` 已有年度課程摘要報表匯出。 +- `Report/年度課程執行狀況報表.cs:39-79` 目前只輸出訓練日期、課程、經費、出席率及整體滿意度。 + +**缺口:** + +- 年度報表未包含教學日誌 8 項觀察、改善措施及講師評鑑。 +- 教學日誌及訓練檢討報告頁面未找到單堂匯出入口。 +- `Report` 目錄未找到對應的教學日誌/訓練檢討報告匯出類別。 + +**批示:** 做/不做/待確認:____________ + +### R-12 簽核流程整合 + +**比對狀態:** 需確認,目前部分完成 + +**現有程式:** + +- 教學日誌、處理結果追蹤及訓練檢討報告均已接入共用送簽控制項。 +- `Forms/辦訓狀況/教學日誌處理.aspx:823-825` 已有兩種表單類別。 +- `Forms/辦訓狀況/訓練檢討報告處理.aspx:953` 已接入訓練檢討報告簽核。 + +**缺口:** + +- `DAC/簽核/DAC_表單簽核主檔2.cs:270-285` 的簽核關數仍有固定值。 +- `Forms/簽核/送簽.ascx.cs:222-241` 的簽核人員設定仍有硬編碼情形。 +- 尚未確認原始「三份文件一關」與後續「處理結果追蹤獨立簽核」的最終規則。 + +**批示:** 做/不做/待確認:____________ + +## 4. 高優先缺口 + +1. R-03:手動講師/場地資料無法通過送簽檢核。 +2. R-08、R-09:講師評鑑入口、課程關聯及年度講師評鑑分頁缺失。 +3. R-07、R-12:追蹤結果簽核鎖定、簽核關數及簽核人員規則需修正或確認。 +4. R-11:單堂及年度完整匯出尚未建立。 +5. R-06:異常片語功能尚未實作。 +6. R-05、R-10:條件式說明及「其他」欄位必填驗證尚未完成。 +7. R-04:問卷期限、提醒來源及逐收件者錯誤處理需確認。 + +## 5. 批示欄位 + +| 條目 | 批示結果 | 批示說明 | 預計版本/日期 | +|---|---|---|---| +| R-01 | 已完成 | 教材遴選入口在課程內容畫面 | | +| R-02 | 做 | 移除舊選項,但保持舊報表文字 | | +| R-03 | 做 | 送簽前檢核編號與名稱至少一項 | | +| R-04 | 不做 | 維持固定天數提醒 | | +| R-05 | 做 | | | +| R-06 | 做 | | | +| R-07 | 做 | | | +| R-08 | 不做 | | | +| R-09 | 部分做 | 不做講師評鑑分頁,保留或完成教學日誌暨異常分頁 | | +| R-10 | 做 | | | +| R-11 | 不做 | | | +| R-12 | 不做 | 維持硬編碼,依客戶要求 | | + +**批示結果建議填寫:** 做、部分做、不做、待確認。 diff --git a/Doc/教育訓練系統/辦訓系統修改項目_1150719.xlsx b/Doc/教育訓練系統/辦訓系統修改項目_1150719.xlsx new file mode 100644 index 0000000..f1f15e9 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統修改項目_1150719.xlsx differ diff --git a/Doc/教育訓練系統/辦訓系統修改項目_1150722(更新V2).xlsx b/Doc/教育訓練系統/辦訓系統修改項目_1150722(更新V2).xlsx new file mode 100644 index 0000000..4565dc2 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統修改項目_1150722(更新V2).xlsx differ diff --git a/Doc/教育訓練系統/辦訓系統修改項目_1150727.xlsx b/Doc/教育訓練系統/辦訓系統修改項目_1150727.xlsx new file mode 100644 index 0000000..f7e3d1e Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統修改項目_1150727.xlsx differ diff --git a/Doc/教育訓練系統/辦訓系統修改項目_1150730.xlsx b/Doc/教育訓練系統/辦訓系統修改項目_1150730.xlsx new file mode 100644 index 0000000..2ff2930 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統修改項目_1150730.xlsx differ diff --git a/Doc/教育訓練系統/辦訓系統修改項目_1150807.xlsx b/Doc/教育訓練系統/辦訓系統修改項目_1150807.xlsx new file mode 100644 index 0000000..f8ca6f8 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統修改項目_1150807.xlsx differ diff --git a/Doc/教育訓練系統/辦訓系統規劃 0425.xls b/Doc/教育訓練系統/辦訓系統規劃 0425.xls new file mode 100644 index 0000000..3f4d7bc Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃 0425.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃 0607 回覆.xls b/Doc/教育訓練系統/辦訓系統規劃 0607 回覆.xls new file mode 100644 index 0000000..c050706 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃 0607 回覆.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-0708-回覆.xls b/Doc/教育訓練系統/辦訓系統規劃-0708-回覆.xls new file mode 100644 index 0000000..c59a128 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-0708-回覆.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-0723.xls b/Doc/教育訓練系統/辦訓系統規劃-0723.xls new file mode 100644 index 0000000..b300b53 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-0723.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-0730.xls b/Doc/教育訓練系統/辦訓系統規劃-0730.xls new file mode 100644 index 0000000..4e1bff7 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-0730.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-0803.xls b/Doc/教育訓練系統/辦訓系統規劃-0803.xls new file mode 100644 index 0000000..0fd2b87 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-0803.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-0805.xls b/Doc/教育訓練系統/辦訓系統規劃-0805.xls new file mode 100644 index 0000000..3f3a4a2 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-0805.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-0808.xls b/Doc/教育訓練系統/辦訓系統規劃-0808.xls new file mode 100644 index 0000000..0c73612 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-0808.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-0809.xls b/Doc/教育訓練系統/辦訓系統規劃-0809.xls new file mode 100644 index 0000000..2024468 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-0809.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-0823.xls b/Doc/教育訓練系統/辦訓系統規劃-0823.xls new file mode 100644 index 0000000..44a1f36 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-0823.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-0917.xls b/Doc/教育訓練系統/辦訓系統規劃-0917.xls new file mode 100644 index 0000000..115cbb1 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-0917.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-0918 - 回覆.xls b/Doc/教育訓練系統/辦訓系統規劃-0918 - 回覆.xls new file mode 100644 index 0000000..3a2c94a Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-0918 - 回覆.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-1108.xls b/Doc/教育訓練系統/辦訓系統規劃-1108.xls new file mode 100644 index 0000000..6891aaf Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-1108.xls differ diff --git a/Doc/教育訓練系統/辦訓系統規劃-1126.xls b/Doc/教育訓練系統/辦訓系統規劃-1126.xls new file mode 100644 index 0000000..c6c22d3 Binary files /dev/null and b/Doc/教育訓練系統/辦訓系統規劃-1126.xls differ diff --git a/Doc/新譽管理辦訓系統報價單 20121204.xlsx b/Doc/新譽管理辦訓系統報價單 20121204.xlsx new file mode 100644 index 0000000..fb9f447 Binary files /dev/null and b/Doc/新譽管理辦訓系統報價單 20121204.xlsx differ diff --git a/Doc/新譽辦訓系統後台-講師基本資料增修功能(已報價項目).docx b/Doc/新譽辦訓系統後台-講師基本資料增修功能(已報價項目).docx new file mode 100644 index 0000000..e546f5d Binary files /dev/null and b/Doc/新譽辦訓系統後台-講師基本資料增修功能(已報價項目).docx differ diff --git a/Doc/無法登入的處理方法.docx b/Doc/無法登入的處理方法.docx new file mode 100644 index 0000000..931d59a Binary files /dev/null and b/Doc/無法登入的處理方法.docx differ diff --git a/Doc/特休使用狀況統計 2012-2017.xls b/Doc/特休使用狀況統計 2012-2017.xls new file mode 100644 index 0000000..70d8c5f Binary files /dev/null and b/Doc/特休使用狀況統計 2012-2017.xls differ diff --git a/Doc/系統修改項目及說明畫面_20230314.xlsx b/Doc/系統修改項目及說明畫面_20230314.xlsx new file mode 100644 index 0000000..c107117 Binary files /dev/null and b/Doc/系統修改項目及說明畫面_20230314.xlsx differ diff --git a/Doc/級距表進版.xls b/Doc/級距表進版.xls new file mode 100644 index 0000000..4cd7865 Binary files /dev/null and b/Doc/級距表進版.xls differ diff --git a/Doc/行政表單人派-新譽106版本0602.xlsx b/Doc/行政表單人派-新譽106版本0602.xlsx new file mode 100644 index 0000000..84d7824 Binary files /dev/null and b/Doc/行政表單人派-新譽106版本0602.xlsx differ diff --git a/Doc/請假加班公式.xls b/Doc/請假加班公式.xls new file mode 100644 index 0000000..cd99184 Binary files /dev/null and b/Doc/請假加班公式.xls differ diff --git a/Doc/請款請購系統/核決組織圖.doc b/Doc/請款請購系統/核決組織圖.doc new file mode 100644 index 0000000..db9ce35 Binary files /dev/null and b/Doc/請款請購系統/核決組織圖.doc differ diff --git a/Doc/請款請購系統/請款單流程及表單.doc b/Doc/請款請購系統/請款單流程及表單.doc new file mode 100644 index 0000000..33cffaa Binary files /dev/null and b/Doc/請款請購系統/請款單流程及表單.doc differ diff --git a/Doc/請款請購系統/請款請購單.doc b/Doc/請款請購系統/請款請購單.doc new file mode 100644 index 0000000..f693eb7 Binary files /dev/null and b/Doc/請款請購系統/請款請購單.doc differ diff --git a/Doc/請款請購系統/請購單流程及表單.doc b/Doc/請款請購系統/請購單流程及表單.doc new file mode 100644 index 0000000..965d7da Binary files /dev/null and b/Doc/請款請購系統/請購單流程及表單.doc differ diff --git a/Doc/請款請購系統/部門與計畫代號.xls b/Doc/請款請購系統/部門與計畫代號.xls new file mode 100644 index 0000000..02cebf4 Binary files /dev/null and b/Doc/請款請購系統/部門與計畫代號.xls differ diff --git a/Doc/辦訓系統權限設定方法.docx b/Doc/辦訓系統權限設定方法.docx new file mode 100644 index 0000000..1f8f3f9 Binary files /dev/null and b/Doc/辦訓系統權限設定方法.docx differ diff --git a/Doc/辦訓系統權限設定方法.pdf b/Doc/辦訓系統權限設定方法.pdf new file mode 100644 index 0000000..0b713f6 Binary files /dev/null and b/Doc/辦訓系統權限設定方法.pdf differ diff --git a/Doc/通知表單/勞健保勞退加退保申請表.doc b/Doc/通知表單/勞健保勞退加退保申請表.doc new file mode 100644 index 0000000..7bcd92f Binary files /dev/null and b/Doc/通知表單/勞健保勞退加退保申請表.doc differ diff --git a/Doc/通知表單/報到手續單.doc b/Doc/通知表單/報到手續單.doc new file mode 100644 index 0000000..5c1d3f8 Binary files /dev/null and b/Doc/通知表單/報到手續單.doc differ diff --git a/Doc/通知表單/報到手續未完成通知.doc b/Doc/通知表單/報到手續未完成通知.doc new file mode 100644 index 0000000..600346b Binary files /dev/null and b/Doc/通知表單/報到手續未完成通知.doc differ diff --git a/Doc/通知表單/已加保通知.doc b/Doc/通知表單/已加保通知.doc new file mode 100644 index 0000000..21183ec Binary files /dev/null and b/Doc/通知表單/已加保通知.doc differ diff --git a/Doc/通知表單/新人報到通知.doc b/Doc/通知表單/新人報到通知.doc new file mode 100644 index 0000000..ab14d03 Binary files /dev/null and b/Doc/通知表單/新人報到通知.doc differ diff --git a/Doc/通知表單/滿意度調查表.doc b/Doc/通知表單/滿意度調查表.doc new file mode 100644 index 0000000..107d1af Binary files /dev/null and b/Doc/通知表單/滿意度調查表.doc differ diff --git a/Doc/通知表單/簡訊通知.doc b/Doc/通知表單/簡訊通知.doc new file mode 100644 index 0000000..c4c4f6a Binary files /dev/null and b/Doc/通知表單/簡訊通知.doc differ diff --git a/Doc/通知表單/錄取通知單.doc b/Doc/通知表單/錄取通知單.doc new file mode 100644 index 0000000..11c9b60 Binary files /dev/null and b/Doc/通知表單/錄取通知單.doc differ diff --git a/Doc/通知表單/預計報到通知.doc b/Doc/通知表單/預計報到通知.doc new file mode 100644 index 0000000..ad0dffb Binary files /dev/null and b/Doc/通知表單/預計報到通知.doc differ diff --git a/Doc/電子差勤系統擴充說明0106-1.docx b/Doc/電子差勤系統擴充說明0106-1.docx new file mode 100644 index 0000000..12eddec Binary files /dev/null and b/Doc/電子差勤系統擴充說明0106-1.docx differ diff --git a/Doc/領據/1150615楊樹人-報到系統擴充領據_簽.pdf b/Doc/領據/1150615楊樹人-報到系統擴充領據_簽.pdf new file mode 100644 index 0000000..f3272af Binary files /dev/null and b/Doc/領據/1150615楊樹人-報到系統擴充領據_簽.pdf differ diff --git a/Doc/領據/1150616楊樹人-報到系統擴充領據_簽.pdf b/Doc/領據/1150616楊樹人-報到系統擴充領據_簽.pdf new file mode 100644 index 0000000..ea166d7 Binary files /dev/null and b/Doc/領據/1150616楊樹人-報到系統擴充領據_簽.pdf differ diff --git a/Doc/領據匯入修正計畫.md b/Doc/領據匯入修正計畫.md new file mode 100644 index 0000000..0186f14 --- /dev/null +++ b/Doc/領據匯入修正計畫.md @@ -0,0 +1,40 @@ +# 領據匯入功能修正計畫 + +## 問題一:匯入顯示失敗但資料已入 DB + +### 根因 +`領據匯入.cs:InsertOne()` 中,`dac領據.InsertOne`、`dac勞務費.InsertOne`、`dac差旅費.InsertOne` 各自有獨立的 `TransactionScope`,但沒有外層 `TransactionScope` 包裹。當領據寫入成功後勞務費或差旅費寫入失敗時,領據主檔已 commit 到資料庫,但例外往上拋,前端顯示失敗。 + +### 修正 +在三個 InsertOne 呼叫外層加上 `using (var ts = DAC.NewTransactionScope())`,使三者屬於同一個交易,全部成功才 commit。 + +--- + +## 問題二:匯入時顯示無效檔案但資料已入 DB + +### 根因(多重因素) +1. **上傳處理器一律存成 `.xlsx`**(`ReceiptUploadHandler.ashx.cs:41`),若使用者上傳 `.xls` 格式,`LoadWorkbook` 會誤用 `XSSFWorkbook` 解析 OLE2 格式而拋錯 +2. **前端匯入完成後 `validationSuccess` 未重置**,加上 `importData()` 的 guard 僅檢查 `this.validationSuccess`,若因 session 過期或重複點擊導致匯入失敗,使用者看到錯誤但前一次資料已入 DB +3. **按鈕 disabled 條件不足**,未鎖定已完成的匯入 + +### 修正 +1. `ReceiptUploadHandler.ashx.cs`:存檔時保留原始副檔名 +2. `領據匯入.js`:新增 `importDone` 旗標,匯入完成後鎖住按鈕與 guard +3. `領據匯出匯入.ascx`:按鈕 `:disabled` 加入 `importDone` 條件 + +--- + +## 受影響檔案 + +| 檔案 | 修改內容 | +|------|----------| +| `Web\Import\領據匯入.cs` | `InsertOne()` 加入外層 `TransactionScope` | +| `Web\Services\ReceiptUploadHandler.ashx.cs` | 存檔時保留原始副檔名 | +| `Web\Scripts\領據匯入.js` | 新增 `importDone` 旗標,加入 guard | +| `Web\Forms\領據系統\領據匯出匯入.ascx` | 按鈕 `:disabled` 加入 `importDone` | + +--- + +## SVN Branch + +`branches/fix-import-transaction` diff --git a/Test/WebApplication1.sln b/Test/WebApplication1.sln new file mode 100644 index 0000000..84fa620 --- /dev/null +++ b/Test/WebApplication1.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.645 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApplication1", "WebApplication1\WebApplication1.csproj", "{31984517-1DE4-48A1-BC2A-CB90EDA1E40C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {31984517-1DE4-48A1-BC2A-CB90EDA1E40C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31984517-1DE4-48A1-BC2A-CB90EDA1E40C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31984517-1DE4-48A1-BC2A-CB90EDA1E40C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {31984517-1DE4-48A1-BC2A-CB90EDA1E40C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E19C23B0-249D-4B52-A327-B19EAC0677EC} + EndGlobalSection +EndGlobal diff --git a/Test/WebApplication1/Form1.aspx b/Test/WebApplication1/Form1.aspx new file mode 100644 index 0000000..1ed9b6a --- /dev/null +++ b/Test/WebApplication1/Form1.aspx @@ -0,0 +1,23 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Form1.aspx.cs" Inherits="Form1" %> + + + + + + + + + +
+
+ Now <%= DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") %>
+ UTC Now <%= DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm:ss") %>
+ UTC Now + 8h <%= DateTime.UtcNow.AddHours(8).ToString("yyyy/MM/dd HH:mm:ss") %>
+ + Today <%= DateTime.Now.Date.ToString("yyyy/MM/dd") %>
+ UTC Today <%= DateTime.UtcNow.Date.ToString("yyyy/MM/dd") %>
+ UTC Now +8h Today <%= DateTime.UtcNow.AddHours(8).Date.ToString("yyyy/MM/dd") %>
+
+
+ + diff --git a/Test/WebApplication1/Form1.aspx.cs b/Test/WebApplication1/Form1.aspx.cs new file mode 100644 index 0000000..80b0473 --- /dev/null +++ b/Test/WebApplication1/Form1.aspx.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +public partial class Form1 : System.Web.UI.Page +{ + protected void Page_Load(object sender, EventArgs e) + { + + } +} \ No newline at end of file diff --git a/Test/WebApplication1/Properties/AssemblyInfo.cs b/Test/WebApplication1/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e883932 --- /dev/null +++ b/Test/WebApplication1/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 組件的一般資訊是由下列的屬性集 +// 控制。變更這些屬性值可修改與組件關聯的 +// 資訊。 +[assembly: AssemblyTitle("WebApplication1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WebApplication1")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 將 ComVisible 設定為 false 會使得這個組件中的型別 +// 對 COM 元件而言為不可見。如果您需要從 COM 存取此組件中 +// 的型別,請在該型別上將 ComVisible 屬性設定為 true。 +[assembly: ComVisible(false)] + +// 下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID +[assembly: Guid("31984517-1de4-48a1-bc2a-cb90eda1e40c")] + +// 組件的版本資訊是由下列四項值構成: +// +// 主要版本 +// 次要版本 +// 組建編號 +// 修訂編號 +// +// 您可以指定所有的值,也可以依照以下的方式,使用 '*' 將修訂和組建編號 +// 指定為預設值: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Test/WebApplication1/Web.Debug.config b/Test/WebApplication1/Web.Debug.config new file mode 100644 index 0000000..a791836 --- /dev/null +++ b/Test/WebApplication1/Web.Debug.config @@ -0,0 +1,31 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Test/WebApplication1/Web.Release.config b/Test/WebApplication1/Web.Release.config new file mode 100644 index 0000000..1aa1329 --- /dev/null +++ b/Test/WebApplication1/Web.Release.config @@ -0,0 +1,32 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Test/WebApplication1/Web.config b/Test/WebApplication1/Web.config new file mode 100644 index 0000000..973834c --- /dev/null +++ b/Test/WebApplication1/Web.config @@ -0,0 +1,107 @@ + + + + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Test/WebApplication1/WebApplication1.csproj b/Test/WebApplication1/WebApplication1.csproj new file mode 100644 index 0000000..3ccf211 --- /dev/null +++ b/Test/WebApplication1/WebApplication1.csproj @@ -0,0 +1,106 @@ + + + + Debug + AnyCPU + + + 2.0 + {31984517-1DE4-48A1-BC2A-CB90EDA1E40C} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + WebApplication1 + WebApplication1 + v3.5 + true + + + + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + Web.config + + + Web.config + + + + + + + + + Form1.aspx + ASPXCodeBehind + + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + True + True + 59140 + / + http://localhost:59140/ + False + False + + + False + + + + + + \ No newline at end of file diff --git a/TestConsoleApp/Program.cs b/TestConsoleApp/Program.cs new file mode 100644 index 0000000..dfce8f6 --- /dev/null +++ b/TestConsoleApp/Program.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TestConsoleApp +{ + internal class Program + { + static void Main(string[] args) + { + var dt1 = new DateTime(2026, 3, 29, 4, 0, 0); + var dt2 = new DateTime(2026, 3, 29, 6, 0, 0); + var dt3 = new DateTime(2026, 3, 29, 14, 0, 0); + + var dnt1 = DateAndTime.GetNow("", dt1); + var dnt2 = DateAndTime.GetNow("", dt2); + var dnt3 = DateAndTime.GetNow("", dt3); + + Console.WriteLine(string.Format("{0:yyyy-MM-dd} {1:yyyy-MM-dd} {2} {3:yyyy-MM-dd} {4}", dnt1.TwWorkDate, dnt1.TwCalendarDate, dnt1.TwTime, dnt1.LocalDate, dnt1.LocalTime)); + Console.WriteLine(string.Format("{0:yyyy-MM-dd} {1:yyyy-MM-dd} {2} {3:yyyy-MM-dd} {4}", dnt2.TwWorkDate, dnt2.TwCalendarDate, dnt2.TwTime, dnt2.LocalDate, dnt2.LocalTime)); + Console.WriteLine(string.Format("{0:yyyy-MM-dd} {1:yyyy-MM-dd} {2} {3:yyyy-MM-dd} {4}", dnt3.TwWorkDate, dnt3.TwCalendarDate, dnt3.TwTime, dnt3.LocalDate, dnt3.LocalTime)); + Console.WriteLine("按 ENTER 結束"); + Console.ReadLine(); + } + } + + /// + /// 30 小時制的日期類別 + /// + public class DateAndTime + { + /// + /// 台灣工作日期 + /// + public DateTime TwWorkDate; + + /// + /// 台灣日曆日期 + /// + public DateTime TwCalendarDate; + + /// + /// 台灣時間 + /// + public string TwTime; + + /// + /// 當地日期 + /// + public DateTime LocalDate; + + /// + /// 當地時間 + /// + public string LocalTime; + + /// + /// 時區名稱 + /// + public string TimezoneName; + + /// + /// 時區ID + /// + public string TimeZoneID; + + public DateAndTime(DateTime twWorkDate, DateTime twCalendarDate, string twTime, DateTime localDate, string localTime, string timezoneName, string timezoneID) : base() + { + this.TwWorkDate = twWorkDate; + this.TwCalendarDate = twCalendarDate; + this.TwTime = twTime; + this.LocalDate = localDate; + this.LocalTime = localTime; + TimezoneName = timezoneName; + TimeZoneID = timezoneID; + } + + public static DateTime 轉換時區(string 時區, DateTime 日期, string 時間) + { + // 解析30小時制(小時可能 >= 24,表示跨入隔日凌晨) + var parts = 時間.Split(':'); + var timeSpan = new TimeSpan(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2])); + var sourceTime = 日期.Date.Add(timeSpan); + + if (string.IsNullOrEmpty(時區) || string.Compare(時區, "Taipei Standard Time") == 0) + { + return sourceTime; + } + + // 重要:將 Kind 設為 Unspecified + sourceTime = DateTime.SpecifyKind(sourceTime, DateTimeKind.Unspecified); + + // 轉換到目標時區 + var sourceZone = TimeZoneInfo.FindSystemTimeZoneById("Taipei Standard Time"); + var targetZone = TimeZoneInfo.FindSystemTimeZoneById(時區); + + var utcTime = TimeZoneInfo.ConvertTimeToUtc(sourceTime, sourceZone); + var targetTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, targetZone); + + return targetTime; + } + + public static DateAndTime GetNow(string bpeno, DateTime twNow) + { + string timezoneID = "Pacific Standard Time"; + string timezoneName = "美西"; + + var twCalendarDate = twNow.Date; + var twWorkDate = twNow.Date; + var localNow = 轉換時區(timezoneID, twNow.Date, twNow.ToString("HH:mm:ss")); + var localDate = localNow.Date; + var twHourOffset = 0; + var localHourOffset = 0; + + // 06:00 之前算前一天 + if (twNow.TimeOfDay < new TimeSpan(6, 0, 0)) + { + twWorkDate = twWorkDate.AddDays(-1); + twHourOffset = 24; + } + if (localNow.TimeOfDay < new TimeSpan(6, 0, 0)) + { + localDate = localDate.AddDays(-1); + localHourOffset = 24; + } + + return new DateAndTime( + twWorkDate, + twCalendarDate, + string.Format("{0:00}:{1:00}:{2:00}", twNow.TimeOfDay.Hours + twHourOffset, twNow.TimeOfDay.Minutes, twNow.Second), + localDate, + string.Format("{0:00}:{1:00}:{2:00}", localNow.TimeOfDay.Hours + localHourOffset, localNow.TimeOfDay.Minutes, localNow.Second), + timezoneName, + timezoneID + ); + } + + public static DateAndTime GetNow(string bpeno) + { + var twNow = DateTime.UtcNow.AddHours(8); + return GetNow(bpeno, twNow); + } + } +} diff --git a/TestConsoleApp/Properties/AssemblyInfo.cs b/TestConsoleApp/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e8445fd --- /dev/null +++ b/TestConsoleApp/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 組件的一般資訊是由下列的屬性集控制。 +// 變更這些屬性的值即可修改組件的相關 +// 資訊。 +[assembly: AssemblyTitle("TestConsoleApp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TestConsoleApp")] +[assembly: AssemblyCopyright("Copyright © 2026")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 將 ComVisible 設為 false 可對 COM 元件隱藏 +// 組件中的類型。若必須從 COM 存取此組件中的類型, +// 的類型,請在該類型上將 ComVisible 屬性設定為 true。 +[assembly: ComVisible(false)] + +// 下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID +[assembly: Guid("18c0ec59-f66b-48a7-ab66-04263c52bd6b")] + +// 組件的版本資訊由下列四個值所組成: +// +// 主要版本 +// 次要版本 +// 組建編號 +// 修訂 +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/TestConsoleApp/TestConsoleApp.csproj b/TestConsoleApp/TestConsoleApp.csproj new file mode 100644 index 0000000..1a9c3cd --- /dev/null +++ b/TestConsoleApp/TestConsoleApp.csproj @@ -0,0 +1,47 @@ + + + + + Debug + AnyCPU + {18C0EC59-F66B-48A7-AB66-04263C52BD6B} + Exe + TestConsoleApp + TestConsoleApp + v3.5 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Thinkyu.sln b/Thinkyu.sln new file mode 100644 index 0000000..c2a22b0 --- /dev/null +++ b/Thinkyu.sln @@ -0,0 +1,106 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 18 +VisualStudioVersion = 18.5.11723.231 stable +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WNET", "..\..\Wellan\WNet\WNET\WNET.csproj", "{EB4C2BF9-E5C1-48C2-8384-CE4973A32BFA}" +EndProject +Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "Web", "http://localhost:50194", "{086D6A5F-3CBC-49D2-A29B-21E647CA4DA1}" + ProjectSection(WebsiteProperties) = preProject + SccProjectName = "Svn" + SccAuxPath = "Svn" + SccLocalPath = "Svn" + SccProvider = "SubversionScc" + UseIISExpress = "true" + TargetFrameworkMoniker = ".NETFramework,Version%3Dv3.5" + ProjectReferences = "{c9f2a75c-ae08-420b-9e96-44154548351e}|CRAXHelper.dll;{eb4c2bf9-e5c1-48c2-8384-ce4973a32bfa}|WNET.dll;" + Debug.AspNetCompiler.VirtualPath = "/PrecompiledWeb" + Debug.AspNetCompiler.PhysicalPath = "Web\" + Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\" + Debug.AspNetCompiler.Updateable = "true" + Debug.AspNetCompiler.ForceOverwrite = "true" + Debug.AspNetCompiler.FixedNames = "true" + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.VirtualPath = "/PrecompiledWeb" + Release.AspNetCompiler.PhysicalPath = "Web\" + Release.AspNetCompiler.TargetPath = "PrecompiledWeb\" + Release.AspNetCompiler.Updateable = "true" + Release.AspNetCompiler.ForceOverwrite = "true" + Release.AspNetCompiler.FixedNames = "true" + Release.AspNetCompiler.Debug = "False" + SlnRelativePath = "Web\" + EndProjectSection + ProjectSection(SvnOrigin) = preProject + @Keys = Enlist,Svn.Uri + Enlist = Required + Svn.Uri = Web/ + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CRAXHelper", "..\CRAXViewer\CRAXHelper\CRAXHelper.csproj", "{C9F2A75C-AE08-420B-9E96-44154548351E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BackupService", "BackupService\BackupService.csproj", "{A42DA595-C6E4-4658-8790-F6364DF91F84}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|.NET = Debug|.NET + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Release|.NET = Release|.NET + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EB4C2BF9-E5C1-48C2-8384-CE4973A32BFA}.Debug|.NET.ActiveCfg = Debug|Any CPU + {EB4C2BF9-E5C1-48C2-8384-CE4973A32BFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB4C2BF9-E5C1-48C2-8384-CE4973A32BFA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB4C2BF9-E5C1-48C2-8384-CE4973A32BFA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {EB4C2BF9-E5C1-48C2-8384-CE4973A32BFA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {EB4C2BF9-E5C1-48C2-8384-CE4973A32BFA}.Release|.NET.ActiveCfg = Release|Any CPU + {EB4C2BF9-E5C1-48C2-8384-CE4973A32BFA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB4C2BF9-E5C1-48C2-8384-CE4973A32BFA}.Release|Any CPU.Build.0 = Release|Any CPU + {EB4C2BF9-E5C1-48C2-8384-CE4973A32BFA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {EB4C2BF9-E5C1-48C2-8384-CE4973A32BFA}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {086D6A5F-3CBC-49D2-A29B-21E647CA4DA1}.Debug|.NET.ActiveCfg = Debug|Any CPU + {086D6A5F-3CBC-49D2-A29B-21E647CA4DA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {086D6A5F-3CBC-49D2-A29B-21E647CA4DA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {086D6A5F-3CBC-49D2-A29B-21E647CA4DA1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {086D6A5F-3CBC-49D2-A29B-21E647CA4DA1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {086D6A5F-3CBC-49D2-A29B-21E647CA4DA1}.Release|.NET.ActiveCfg = Debug|Any CPU + {086D6A5F-3CBC-49D2-A29B-21E647CA4DA1}.Release|Any CPU.ActiveCfg = Debug|Any CPU + {086D6A5F-3CBC-49D2-A29B-21E647CA4DA1}.Release|Any CPU.Build.0 = Debug|Any CPU + {086D6A5F-3CBC-49D2-A29B-21E647CA4DA1}.Release|Mixed Platforms.ActiveCfg = Debug|Any CPU + {086D6A5F-3CBC-49D2-A29B-21E647CA4DA1}.Release|Mixed Platforms.Build.0 = Debug|Any CPU + {C9F2A75C-AE08-420B-9E96-44154548351E}.Debug|.NET.ActiveCfg = Debug|Any CPU + {C9F2A75C-AE08-420B-9E96-44154548351E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9F2A75C-AE08-420B-9E96-44154548351E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9F2A75C-AE08-420B-9E96-44154548351E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C9F2A75C-AE08-420B-9E96-44154548351E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {C9F2A75C-AE08-420B-9E96-44154548351E}.Release|.NET.ActiveCfg = Release|Any CPU + {C9F2A75C-AE08-420B-9E96-44154548351E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9F2A75C-AE08-420B-9E96-44154548351E}.Release|Any CPU.Build.0 = Release|Any CPU + {C9F2A75C-AE08-420B-9E96-44154548351E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {C9F2A75C-AE08-420B-9E96-44154548351E}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Debug|.NET.ActiveCfg = Debug|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Debug|.NET.Build.0 = Debug|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Release|.NET.ActiveCfg = Release|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Release|.NET.Build.0 = Release|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Release|Any CPU.Build.0 = Release|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {A42DA595-C6E4-4658-8790-F6364DF91F84}.Release|Mixed Platforms.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F13D2BFB-B55E-405E-8506-3B4B6E472613} + EndGlobalSection + GlobalSection(SubversionScc) = preSolution + Svn-Managed = True + Manager = AnkhSVN - Subversion Support for Visual Studio + EndGlobalSection +EndGlobal diff --git a/Web/.editorconfig b/Web/.editorconfig new file mode 100644 index 0000000..9fa5e75 --- /dev/null +++ b/Web/.editorconfig @@ -0,0 +1,13 @@ + +# All files +[*] +indent_style = space + +# Xml files +[*.xml] +indent_size = 2 + +# 設定所有文字檔案使用 UTF-8 編碼 +[*] +charset = utf-8-bom + diff --git a/Web/App_Browsers/blackberry.browser b/Web/App_Browsers/blackberry.browser new file mode 100644 index 0000000..4ebd920 --- /dev/null +++ b/Web/App_Browsers/blackberry.browser @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/App_Browsers/chrome.browser b/Web/App_Browsers/chrome.browser new file mode 100644 index 0000000..b2b41a0 --- /dev/null +++ b/Web/App_Browsers/chrome.browser @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/App_Browsers/firefox.browser b/Web/App_Browsers/firefox.browser new file mode 100644 index 0000000..b267a54 --- /dev/null +++ b/Web/App_Browsers/firefox.browser @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/App_Browsers/gateway.browser b/Web/App_Browsers/gateway.browser new file mode 100644 index 0000000..093470a --- /dev/null +++ b/Web/App_Browsers/gateway.browser @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/App_Browsers/generic.browser b/Web/App_Browsers/generic.browser new file mode 100644 index 0000000..68db2c6 --- /dev/null +++ b/Web/App_Browsers/generic.browser @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web/App_Browsers/ie.browser b/Web/App_Browsers/ie.browser new file mode 100644 index 0000000..e3f0d64 --- /dev/null +++ b/Web/App_Browsers/ie.browser @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web/App_Browsers/iemobile.browser b/Web/App_Browsers/iemobile.browser new file mode 100644 index 0000000..df87291 --- /dev/null +++ b/Web/App_Browsers/iemobile.browser @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Web/App_Browsers/iphone.browser b/Web/App_Browsers/iphone.browser new file mode 100644 index 0000000..80c0f3f --- /dev/null +++ b/Web/App_Browsers/iphone.browser @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web/App_Browsers/opera.browser b/Web/App_Browsers/opera.browser new file mode 100644 index 0000000..c4dee63 --- /dev/null +++ b/Web/App_Browsers/opera.browser @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/App_Browsers/safari.browser b/Web/App_Browsers/safari.browser new file mode 100644 index 0000000..fd6f480 --- /dev/null +++ b/Web/App_Browsers/safari.browser @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/App_Browsers/ucbrowser.browser b/Web/App_Browsers/ucbrowser.browser new file mode 100644 index 0000000..834b4de --- /dev/null +++ b/Web/App_Browsers/ucbrowser.browser @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/App_Code/BatchService.cs b/Web/App_Code/BatchService.cs new file mode 100644 index 0000000..7134775 --- /dev/null +++ b/Web/App_Code/BatchService.cs @@ -0,0 +1,329 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Script.Services; +using System.Web.Services; +using Wellan.Common; +using Wellan.Data; +using System.Data; +using System.Net.Mail; +using System.Text; +using System.IO; + +/// +/// BatchService 的摘要描述 +/// +[WebService(Namespace = "http://thinkyu.com/")] +[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] +[ScriptService] +public class BatchService : System.Web.Services.WebService +{ + + public BatchService() + { + + //如果使用設計的元件,請取消註解下列一行 + //InitializeComponent(); + } + + private WQuery SetupQuery() + { + var ConnectionConfigName = WConfig.GetConnectionConfigName(); + WConnectionString.ConnectionConfigFile = WConfig.GetConnectionConfig(); + var ConnectionString = WConnectionString.GetConnectionString(ConnectionConfigName); + var ConnectionType = WConnectionString.GetConnectionType(ConnectionConfigName); + var Query = new WQuery(ConnectionType, ConnectionString); + WGuard1.SetQuery(ConnectionType, ConnectionString); + return Query; + } + + private void CheckPunchCard(DateTime date, ref List<打卡異常Item> employeeWarning, ref List<通知督導Item> supervisorWarning) + { + /* + 差勤異常通知之定義及需求如下 + 一、差勤異常定義: + 1.無上下班打卡紀錄,且無"出差" 或 "請假" 申請紀錄 + 2.出勤時數不足8小時(出勤時數指"打卡+出差+請假") + 註:此處出差或請假申請只要申請人送單即可算 + 二、系統需求 + 1.差勤月報表:有異常者,於備註顯示 "出勤異常" + 2.寄送異常通知:有出勤異常則於隔日通知個人,專案管理人統一於每月30日收到所有專案人員差勤異常通知 + 3.打卡限定:不能連續七日打卡 + */ + + TimeCalc timeCalc = new TimeCalc(); + var Query = SetupQuery(); + var bhrdDao = new BhrdDAC(Query); + var rparDao = new RparDAC(Query); + var bsgpDao = new BsgpDAC(Query); + + var cmd1 = Query.NewCommand( + @"SELECT A.BPENO, A.BPNME, A.BPEML, A.BPEM2, B.RCC01, B.RCC02, B.RCC07, B.RCC08 , + C.RAPYN, D.BPPYM + FROM BPSNView A + LEFT JOIN RCRD B ON A.BPENO = B.RCUSR AND B.RCDAT = @DATE + LEFT JOIN RASN C ON A.BPENO = C.RANUM AND (C.RAEDT IS NULL OR (C.RASDT <= @DATE AND C.RAEDT >= @DATE)) + LEFT JOIN BPAA D ON C.RAPYN=D.BPPYN + WHERE dbo.EmployeeOnboard(BPENO, @DATE) = 1 + "); + Query.AddParam(cmd1, "DATE", date); + DataTable tableRcrd = Query.Select(cmd1); + foreach (DataRow rowRcrd in tableRcrd.Rows) + { + var bpeno = WDAC.GetStringValue(rowRcrd["BPENO"]); // 員工編號 + var bpnme = WDAC.GetStringValue(rowRcrd["BPNME"]); // 員工姓名 + var bpeml = WDAC.GetStringValue(rowRcrd["BPEML"]); // 郵箱1 + var bpem2 = WDAC.GetStringValue(rowRcrd["BPEM2"]); // 郵箱2 + var rcc01 = WDAC.GetStringValue(rowRcrd["RCC01"]); // 上班打卡 + var rcc02 = WDAC.GetStringValue(rowRcrd["RCC02"]); // 下班打卡 + var rcc07 = WDAC.GetStringValue(rowRcrd["RCC07"]); // 外出打卡 + var rcc08 = WDAC.GetStringValue(rowRcrd["RCC08"]); // 返回打卡 + var isDuty = !bhrdDao.IsHoliday(bpeno, date); // 是否需上班 + var rapyn = WDAC.GetStringValue(rowRcrd["RAPYN"]); // 派駐專案 + var rapym = WDAC.GetStringValue(rowRcrd["BPPYM"]); // 派駐專案名稱 + + 打卡檢查Item checkResult = rparDao.IsPunchcardNormal(date, bpeno, rapyn, isDuty, rcc01, rcc02, rcc07, rcc08); + if (!checkResult.正常) + { + var supervisorItem = supervisorWarning.FirstOrDefault(x => x.專案年度號 == rapyn); + if (supervisorItem == null) + { + supervisorItem = new 通知督導Item() + { + 專案年度號 = rapyn, + 專案名稱 = rapym + }; + + // 取得簽核人員第一關與第三關 + // BSNME 姓名, BSEML 郵箱 + var tableBsgp = bsgpDao.SelectByLevel(rapyn, "差勤", 1); + foreach (DataRow rowBsgp in tableBsgp.Rows) + { + if (supervisorItem.督導List.Find(p => p.督導郵箱 == WDAC.GetStringValue(rowBsgp["BSEML"])) == null) + { + supervisorItem.督導List.Add(new 督導Item() + { + 督導姓名 = WDAC.GetStringValue(rowBsgp["BSNME"]), + 督導郵箱 = WDAC.GetStringValue(rowBsgp["BSEML"]) + }); + } + } + + tableBsgp = bsgpDao.SelectByLevel(rapyn, "差勤", 3); + foreach (DataRow rowBsgp in tableBsgp.Rows) + { + if (supervisorItem.督導List.Find(p => p.督導郵箱 == WDAC.GetStringValue(rowBsgp["BSEML"])) == null) + { + supervisorItem.督導List.Add(new 督導Item() + { + 督導姓名 = WDAC.GetStringValue(rowBsgp["BSNME"]), + 督導郵箱 = WDAC.GetStringValue(rowBsgp["BSEML"]) + }); + } + } + + supervisorWarning.Add(supervisorItem); + } + + var abnormalItem = new 打卡異常Item() + { + 員工編號 = bpeno, + 姓名 = bpnme, + 日期 = date, + 郵箱_1 = bpeml, + // 郵箱_2 = bpem2, + 異常訊息 = checkResult.異常訊息 + }; + + supervisorItem.異常List.Add(abnormalItem); + employeeWarning.Add(abnormalItem); + } + } + } + + private void CheckPunchCardMonth(DateTime month, ref List<打卡異常Item> employeeWarning, ref List<通知督導Item> supervisorWarning) + { + DateTime date = new DateTime(month.Year, month.Month, 1); + DateTime endDate = date.AddMonths(1); + DateTime today = DateTime.UtcNow.AddHours(8).Date; + while (date < endDate && date < today) + { + CheckPunchCard(date, ref employeeWarning, ref supervisorWarning); + date = date.AddDays(1); + } + } + + [WebMethod(EnableSession = true)] + [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = false)] + public GetDataResponse DoBatchJob(string apiKey, string jobName, string test) + { + WQuery Query = SetupQuery(); + if (apiKey != "5D5F88D286A6479889B9DD986419A99C") + { + return new GetDataResponse() + { + Result = 400, + Message = "Unauthorized" + }; + } + + var today = DateTime.UtcNow.AddHours(8).Date.AddDays(-1); + List<打卡異常Item> employeeWarning = new List<打卡異常Item>(); + List<通知督導Item> supervisorWarning = new List<通知督導Item>(); + + switch (jobName.ToUpper()) + { + case "CHECKPUNCHCARD": // 考勤檢查通知個人 + CheckPunchCard(today, ref employeeWarning, ref supervisorWarning); + + // 發郵件給個人 + foreach (var w in employeeWarning) + { + var d = String.Format("{0:yyyy-MM-dd}", w.日期); + + MailMessage mm = new MailMessage(); + mm.Subject = String.Format("{0} 打卡異常通知", d); + if (!string.IsNullOrEmpty(w.郵箱_1)) + { + mm.To.Add(new MailAddress(w.郵箱_1)); + } + else + { + continue; + } + + mm.BodyEncoding = Encoding.UTF8; + mm.IsBodyHtml = true; + mm.Body = File.ReadAllText(HttpContext.Current.Server.MapPath("~/Template/出勤異常通知.html")) + .Replace("{日期}", d) + .Replace("{異常狀況}", w.異常訊息) + ; + // 發送郵件 + try + { + Wellan.Service.WMailSender.GetInstance().Send( + mm + , string.Format("打卡異常通知 人員:{0} {1} 日期:{2} 異常:{3}", w.員工編號, w.姓名, d, w.異常訊息)); + } + catch + { } + } + + return new GetDataResponse() + { + Result = 0, + // Data = Newtonsoft.Json.JsonConvert.SerializeObject(supervisorWarning) + Data = "OK" + }; + + case "CHECKPUNCHCARDMONTH": // 考勤檢查通知督導 + + if (today.AddDays(1).Day != 1 && string.Compare(test, "true") != 0) + { + return new GetDataResponse() + { + Result = 401, + Data = "Not the end of month" + }; + } + + CheckPunchCardMonth(today, ref employeeWarning, ref supervisorWarning); + + byte[] UTF8BOM = new byte[] { 0xEF, 0xBB, 0xBF }; + + foreach (var w in supervisorWarning) + { + if (w.督導List == null || w.督導List.Count == 0) + { + continue; + } + + MailMessage mm = new MailMessage(); + mm.Subject = String.Format("{0:yyyy-MM} {1} {2} 專案打卡異常通知", today, w.專案年度號, w.專案名稱); + foreach (var s in w.督導List) + { + if (!string.IsNullOrEmpty(s.督導郵箱)) { mm.To.Add(new MailAddress(s.督導郵箱)); } + } + mm.BodyEncoding = Encoding.UTF8; + mm.IsBodyHtml = true; + mm.Body = File.ReadAllText(HttpContext.Current.Server.MapPath("~/Template/出勤異常督導通知.html")) + .Replace("{年月}", today.ToString("yyyy-MM")) + .Replace("{專案編號}", w.專案年度號) + .Replace("{專案名稱}", w.專案名稱) + ; + + MemoryStream 出勤異常明細 = new MemoryStream(); + 出勤異常明細.Write(UTF8BOM, 0, UTF8BOM.Length); + byte[] b = Encoding.UTF8.GetBytes("\"日期\",\"員工編號\",\"姓名\",\"異常訊息\"\r\n"); + 出勤異常明細.Write(b, 0, b.Length); + foreach (var wp in w.異常List) + { + b = Encoding.UTF8.GetBytes(string.Format("\"{0:yyyy-MM-dd}\",=T(\"{1}\"),\"{2}\",\"{3}\"\r\n" + , wp.日期, wp.員工編號, wp.姓名, wp.異常訊息)); + 出勤異常明細.Write(b, 0, b.Length); + } + 出勤異常明細.Position = 0; + mm.Attachments.Add(new Attachment(出勤異常明細, string.Format( + "打卡異常_{0:yyyy-MM}_{1}_{2}.csv", today, w.專案年度號, w.專案名稱))); + + // 發送郵件 + try + { + Wellan.Service.WMailSender.GetInstance().Send( + mm + , string.Format("{0:yyyy-MM} {1} {2} 專案打卡異常通知", today, w.專案年度號, w.專案名稱)); + } + catch + { } + + } + + return new GetDataResponse() + { + Result = 0, + // Data = Newtonsoft.Json.JsonConvert.SerializeObject(supervisorWarning) + Data = "OK" + }; + + default: + return new GetDataResponse() + { + Result = 401, + Message = "jobName required" + }; + } + } + +} + +[Serializable] +public class 打卡異常Item +{ + public string 員工編號 { get; set; } + public string 姓名 { get; set; } + public DateTime 日期 { get; set; } + public string 郵箱_1 { get; set; } + public string 郵箱_2 { get; set; } + public string 異常訊息 { get; set; } +} + +public class 督導Item +{ + public string 督導姓名 { get; set; } + public string 督導郵箱 { get; set; } +} + +public class 通知督導Item +{ + public string 專案年度號 { get; set; } + public string 專案名稱 { get; set; } + public List<督導Item> 督導List { get; set; } + public List<打卡異常Item> 異常List { get; set; } + + public 通知督導Item() + { + 督導List = new List<督導Item>(); + 異常List = new List<打卡異常Item>(); + } +} \ No newline at end of file diff --git a/Web/App_Code/Calculate/Bhif.cs b/Web/App_Code/Calculate/Bhif.cs new file mode 100644 index 0000000..201103a --- /dev/null +++ b/Web/App_Code/Calculate/Bhif.cs @@ -0,0 +1,183 @@ +using System; +using System.Data; +using System.Configuration; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; + +/// +/// pⰷOO +/// +public class Bhif : LaborAndHealthFee +{ + private double _healthInsuranceFeeRate; + private double _healthInsuranceAverageFamily; + private double _oldHealthInsuranceFeeRate; + + public Bhif(DateTime aDate) : base(aDate) + { + _bftyp = 2; + _tableName = "BHIF"; + _healthInsuranceFeeRate = 0.0455d; + _oldHealthInsuranceFeeRate = 0.0455d; + } + + /// + /// OOv + /// + public double HealthInsuranceFeeRate + { + get + { + return _healthInsuranceFeeRate; + } + set + { + _healthInsuranceFeeRate = value; + } + } + + /// + /// Of + /// + public double HealthInsuranceAverageFamily + { + get + { + return _healthInsuranceAverageFamily; + } + set + { + _healthInsuranceAverageFamily = value; + } + } + + public HealthInsuranceFee GetFee(int salary, int family, int family25, int family50, string disabled, bool hasHIF, string employeeType) + { + // XO~ + HealthInsuranceFee fee = new HealthInsuranceFee(); + fee.Init(); + + // 밷OA^ + if (!hasHIF) + return fee; + + // sOvO~ + double bsamt = GetAmont(salary); + // ¶OvO~ + double oldbsamt = GetAmont(new DateTime(2010, 3, 1) ,salary); + + fee.InsuranceSalary = (Int32)bsamt; + + if (bsamt > 0) + { + // p⤽qOO + // uOD + if (employeeType == "1") + fee.CompanyFee = 0; + // uOu + else + fee.CompanyFee = Convert.ToInt32(Math.Round(bsamt * _healthInsuranceFeeRate * 0.6d * (1d + _healthInsuranceAverageFamily), MidpointRounding.AwayFromZero)); + + // pӤHOO + double personalFee = 0; + double oldPersonalFee = 0; + + // uOD + if (employeeType == "1") + { + personalFee = bsamt * _healthInsuranceFeeRate; + oldPersonalFee = oldbsamt * _oldHealthInsuranceFeeRate; + } + // uOu + else + { + personalFee = bsamt * _healthInsuranceFeeRate * 0.3d; + oldPersonalFee = oldbsamt * _oldHealthInsuranceFeeRate * 0.3d; + } + + /* + 99/4/1 101/12/31 ItBɧU + OB ұo ɧUv + 40,100(t)HU 5U1d(t)HU 100% + 42,00050,600 5U3d6U5d 20% + 53,000(t)HW 6U8d(t)HW 0% + */ + + if (_baseDate.ToString("yyyyMM", WGuard1.InvariantCulture).CompareTo("201004") >= 0 && + _baseDate.ToString("yyyyMM", WGuard1.InvariantCulture).CompareTo("201301") < 0) + { + // HO~pɧUv + if (bsamt <= 40100) + { + personalFee = oldPersonalFee; + } + else if (bsamt > 40100 && bsamt < 53000) + { + personalFee = personalFee - Convert.ToInt32(Math.Round((personalFee - oldPersonalFee) * 0.2d, MidpointRounding.AwayFromZero)); + } + } + + int noDiscountFee = Convert.ToInt32(Math.Round(personalFee, MidpointRounding.AwayFromZero)); + int discount25Fee = Convert.ToInt32(Math.Truncate(Math.Round(personalFee, MidpointRounding.AwayFromZero) * 0.75d)); + int discount50Fee = Convert.ToInt32(Math.Truncate(Math.Round(personalFee, MidpointRounding.AwayFromZero) * 0.5d)); + int remainFamily = 3; + + switch (disabled) + { + case "0": // L + fee.PersonalFee = noDiscountFee; + break; + case "1": // + fee.PersonalFee = discount25Fee; + break; + case "2": // + fee.PersonalFee = discount50Fee; + break; + case "3": // + fee.PersonalFee = 0; + break; + } + + // [W@벲f + fee.PersonalFee += noDiscountFee * (family > remainFamily ? (remainFamily > 0 ? remainFamily : 0) : family); + remainFamily -= family; + + // [WK25%f + fee.PersonalFee += (discount25Fee) * (family25 > remainFamily ? (remainFamily > 0 ? remainFamily : 0) : family25); + remainFamily -= family25; + + // [WK50%f + fee.PersonalFee += (discount50Fee) * (family50 > remainFamily ? (remainFamily > 0 ? remainFamily : 0) : family50); + } + + return fee; + } +} + +public struct HealthInsuranceFee +{ + public int InsuranceSalary; + public int PersonalFee; + public int CompanyFee; + + public void Init() + { + InsuranceSalary = 0; + PersonalFee = 0; + CompanyFee = 0; + } + + public void Assign(HealthInsuranceFee fee) + { + InsuranceSalary = fee.InsuranceSalary; + PersonalFee = fee.PersonalFee; + CompanyFee = fee.CompanyFee; + } +} diff --git a/Web/App_Code/Calculate/Blif.cs b/Web/App_Code/Calculate/Blif.cs new file mode 100644 index 0000000..175e658 --- /dev/null +++ b/Web/App_Code/Calculate/Blif.cs @@ -0,0 +1,457 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Data.Common; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.HtmlControls; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using Wellan.Common; +using Wellan.Data; + +/// +/// pҫOO +/// +public class Blif : LaborAndHealthFee +{ + private int _inWorkDays; + private int _insuranceSalary; + private int _injurySalary; + private decimal _normalPersonalFee; + private decimal _normalCompanyFee; + private decimal _lostJobPersonalFee; + private decimal _lostJobCompanyFee; + private decimal _injuryCompanyFee; + private decimal _disableNormalSupport; + private decimal _disableLostJobSupport; + private decimal _salaryReverseFund; + + private double _normalFeeRate; + private double _lostJobFeeRate; + private double _salaryReverseFundRate; + private double _injuryCompanyFeeRate; + + // ¾aŶZ + private Dictionary> _bljiAmtData; + + public Blif(DateTime aDate) : base(aDate) + { + _bftyp = 1; + _tableName = "BLIF"; + } + + /// + /// qƬGOv + /// + public double NormalFeeRate + { + get + { + return _normalFeeRate; + } + set + { + _normalFeeRate = value; + } + } + + /// + /// N~OIOv + /// + public double LostJobFeeRate + { + get + { + return _lostJobFeeRate; + } + set + { + _lostJobFeeRate = value; + } + } + + /// + /// uvOv + /// + public double SalaryReverseFundRate + { + get + { + return _salaryReverseFundRate; + } + set + { + _salaryReverseFundRate = value; + } + } + + /// + /// ¾aOIOv + /// + public double InjuryFeeRate + { + get + { + return _injuryCompanyFeeRate; + } + set + { + _injuryCompanyFeeRate = value; + } + } + + public LaborInsuranceFee GetFee() + { + LaborInsuranceFee fee = new LaborInsuranceFee(); + fee.Init(); + + fee.InWorkDays = _inWorkDays; + fee.InsuranceSalary = _insuranceSalary; + fee.InjurySalary = _injurySalary; + fee.NormalPersonalFee = _normalPersonalFee; + fee.NormalCompanyFee = _normalCompanyFee; + fee.LostJobPersonalFee = _lostJobPersonalFee; + fee.LostJobCompanyFee = _lostJobCompanyFee; + fee.InjuryCompanyFee = _injuryCompanyFee; + fee.DisableNormalSupport = _disableNormalSupport; + fee.DisableLostJobSupport = _disableLostJobSupport; + fee.SalaryReverseFund = _salaryReverseFund; + + return fee; + } + + public void Clear() + { + _inWorkDays = 0; + _insuranceSalary = 0; + _injurySalary = 0; + _normalPersonalFee = 0; + _normalCompanyFee = 0; + _lostJobPersonalFee = 0; + _lostJobCompanyFee = 0; + _injuryCompanyFee = 0; + _disableNormalSupport = 0; + _disableLostJobSupport = 0; + _salaryReverseFund = 0; + } + + /// + /// o¾aŶZ + /// + /// + private void GetBLJIData(DateTime aDate) + { + if (this._bljiAmtData == null) + _bljiAmtData = new Dictionary>(); + + if (!_bljiAmtData.ContainsKey(aDate)) + { + List _newAmtDataItem = new List(); + + // oAίŶZ + DataTable _verData = _query.Select("SELECT * FROM BFDT WHERE BFTYP=4 ORDER BY BFVER"); + int version = 0; + + foreach (System.Data.DataRow row in _verData.Rows) + { + if (aDate.CompareTo(row["BFSDT"]) >= 0 && (row["BFEDT"] == DBNull.Value || aDate.CompareTo(row["BFEDT"]) <= 0)) + { + version = Convert.ToInt32(row["BFVER"]); + break; + } + } + + // oӪŶZ + DataTable data = _query.Select(String.Format("SELECT * FROM BLJI WHERE BSVER={0} ORDER BY BSLVL", version)); + + for (int i = 0; i < data.Rows.Count; i++) + { + _newAmtDataItem.Add(new LHFClass(Convert.ToInt32(data.Rows[i]["BSLOW"]), + Convert.ToInt32(data.Rows[i]["BSHIH"]), + Convert.ToInt32(data.Rows[i]["BSAMT"]))); + } + + _bljiAmtData.Add(aDate, _newAmtDataItem); + } + } + + /// + /// o¾aOIO~ + /// + /// + /// ~ + /// + protected double GetBLJIAmt(DateTime aDate, int salary) + { + GetBLJIData(aDate); + + double bsamt = 0; + for (int i = 0; i < _amtData[aDate].Count; i++) + { + if (salary >= _amtData[aDate][i].Low && salary <= _amtData[aDate][i].High) + { + bsamt = _amtData[aDate][i].Amt; + break; + } + } + + return bsamt; + } + + /// + /// o¾aOIO~ + /// + /// ~ + /// + protected double GetBLJIAmt(int salary) + { + return GetBLJIAmt(_baseDate, salary); + } + + /// + /// på[J@qɶqҫOO + /// + /// O~ + /// ɶq_ + /// ɶq + /// hO + /// ٸɧU + /// ҫO + /// wѦ~I + /// WL65 + /// u + /// uy 1=y 2=~y + /// qɶҫOXuѼ + public void Add(int salary, DateTime startDay, DateTime endDay, bool goOut, string disable, + bool hasLIF, bool retired, bool over65, string employeeType, string nation, + ref int thisMonthLaborDays) + { + // LҫOABz + if (!hasLIF) + return; + + // ҫOBҰhp + double bsamt = GetAmont(salary); + + double daysRatio = 0; + int days = 0; + int monthEndDay = startDay.AddMonths(1).AddDays(-startDay.Day).Day; + _insuranceSalary = Convert.ToInt32(bsamt); + + if (bsamt > 0) + { + // + if (startDay.Day == 1 && endDay.Day == monthEndDay) + { + days = 30; + // YGABhOAnܤ멳ڤѼ + if (goOut && endDay.Month == 2) + days = monthEndDay; + } + // D + else + { + // O멳 + if (endDay.Day == monthEndDay) + { + if (startDay.Day == 30 || startDay.Day == 31) + days = 1; + else + days = 30 - startDay.Day + 1; + + // YGABhOAnܤ멳ڤѼ + if (goOut && endDay.Month == 2) + { + days -= (30 - monthEndDay); + } + } + else + // D멳 + { + days = endDay.Day - startDay.Day + 1; + } + if (days > 30 - thisMonthLaborDays) + days = 30 - thisMonthLaborDays; + } + + _inWorkDays += days; + thisMonthLaborDays += days; + daysRatio = Convert.ToDouble(days) / 30d; + + decimal _thisNormalPersonalFee = 0; + decimal _thisNormalCompanyFee = 0; + decimal _thisLostJobPersonalFee = 0; + decimal _thisLostJobCompanyFee = 0; + + if (!retired) + { + // uODG + if (employeeType == "1") + { + // pⴶqƬGOO + _thisNormalPersonalFee = Convert.ToDecimal(Math.Round(bsamt * _normalFeeRate * daysRatio * 0.2d, 4, MidpointRounding.AwayFromZero)); + _thisNormalCompanyFee = Convert.ToDecimal(Math.Round(bsamt * _normalFeeRate * daysRatio * 0.7d, 4, MidpointRounding.AwayFromZero)); + + // pN~OIOO + _thisLostJobPersonalFee = 0; + _thisLostJobCompanyFee = 0; + } + // uO@ҤuG + else + { + // pⴶqƬGOO + _thisNormalPersonalFee = Convert.ToDecimal(Math.Round(bsamt * _normalFeeRate * daysRatio * 0.2d, 4, MidpointRounding.AwayFromZero)); + _thisNormalCompanyFee = Convert.ToDecimal(Math.Round(bsamt * _normalFeeRate * daysRatio * 0.7d, 4, MidpointRounding.AwayFromZero)); + + // pN~OIOOAyuA65~ݭn + if (nation == "1" && !over65) + { + _thisLostJobPersonalFee = Convert.ToDecimal(Math.Round(bsamt * _lostJobFeeRate * daysRatio * 0.2d, 4, MidpointRounding.AwayFromZero)); + _thisLostJobCompanyFee = Convert.ToDecimal(Math.Round(bsamt * _lostJobFeeRate * daysRatio * 0.7d, 4, MidpointRounding.AwayFromZero)); + } + } + } + _normalPersonalFee += _thisNormalPersonalFee; + _normalCompanyFee += _thisNormalCompanyFee; + _lostJobPersonalFee += _thisLostJobPersonalFee; + _lostJobCompanyFee += _thisLostJobCompanyFee; + + // p⨭߻êɧU + switch (disable) + { + case "0": // L + break; + case "1": // + _disableNormalSupport = Math.Round((_thisNormalPersonalFee) * 0.25m, MidpointRounding.AwayFromZero); + _disableLostJobSupport = Math.Round((_thisLostJobPersonalFee) * 0.25m, MidpointRounding.AwayFromZero); + break; + case "2": // + _disableNormalSupport = Math.Round((_thisNormalPersonalFee) * 0.5m, MidpointRounding.AwayFromZero); + _disableLostJobSupport = Math.Round((_thisLostJobPersonalFee) * 0.5m, MidpointRounding.AwayFromZero); + break; + case "3": // + case "4": // + _disableNormalSupport = _thisNormalPersonalFee; + _disableLostJobSupport = _thisLostJobPersonalFee; + break; + } + + // p¾aOIOO + double bljiAmt = GetBLJIAmt(salary); + _injurySalary = Convert.ToInt32(bljiAmt); + _injuryCompanyFee += Convert.ToDecimal(Math.Round(bljiAmt * _injuryCompanyFeeRate * daysRatio, 4, MidpointRounding.AwayFromZero)); + + // puv + // uODG + if (employeeType == "1") + { + _salaryReverseFund += 0; + } + else + { + _salaryReverseFund += Convert.ToDecimal(Math.Round(bsamt * daysRatio * _salaryReverseFundRate, 4, MidpointRounding.AwayFromZero)); + } + } + } +} + +/// +/// ҫOO +/// +public struct LaborInsuranceFee +{ + /// + /// ¾Ѽ + /// + public int InWorkDays; + /// + /// O~ + /// + public int InsuranceSalary; + /// + /// ¾aO~ + /// + public int InjurySalary; + /// + /// qƬGӤHOO + /// + public decimal NormalPersonalFee; + /// + /// qƬGqOO + /// + public decimal NormalCompanyFee; + /// + /// N~OIӤHOO + /// + public decimal LostJobPersonalFee; + /// + /// N~OIqOO + /// + public decimal LostJobCompanyFee; + /// + /// ¾aOO + /// + public decimal InjuryCompanyFee; + /// + /// ٸɧU + /// + public decimal DisableNormalSupport; + /// + /// ٸɧU + /// + public decimal DisableLostJobSupport; + /// + /// uv + /// + public decimal SalaryReverseFund; + + public void Init() + { + InWorkDays = 0; + InsuranceSalary = 0; + InjurySalary = 0; + NormalCompanyFee = 0; + NormalPersonalFee = 0; + LostJobCompanyFee = 0; + LostJobPersonalFee = 0; + InjuryCompanyFee = 0; + DisableNormalSupport = 0; + DisableLostJobSupport = 0; + SalaryReverseFund = 0; + } + + public void Add(LaborInsuranceFee fee) + { + InWorkDays += fee.InWorkDays; + InsuranceSalary = fee.InsuranceSalary; + InjurySalary = fee.InjurySalary; + NormalCompanyFee += fee.NormalCompanyFee; + NormalPersonalFee += fee.NormalPersonalFee; + LostJobCompanyFee += fee.LostJobCompanyFee; + LostJobPersonalFee += fee.LostJobPersonalFee; + InjuryCompanyFee += fee.InjuryCompanyFee; + DisableNormalSupport += fee.DisableNormalSupport; + DisableLostJobSupport += fee.DisableLostJobSupport; + SalaryReverseFund += fee.SalaryReverseFund; + } + + /// + /// ӤH`OO + /// + public int TotalPersonalFee + { + // { |ˤJ(qƬG) + |ˤJ(N~OI) } + //- { |ˤJ(qƬGK) + |ˤJ(N~OIK) } + + get + { + return Convert.ToInt32(Math.Round(NormalPersonalFee, MidpointRounding.AwayFromZero)) + + Convert.ToInt32(Math.Round(LostJobPersonalFee, MidpointRounding.AwayFromZero)) + - Convert.ToInt32(Math.Round(DisableNormalSupport, MidpointRounding.AwayFromZero)) + - Convert.ToInt32(Math.Round(DisableLostJobSupport, MidpointRounding.AwayFromZero)); + } + } +} \ No newline at end of file diff --git a/Web/App_Code/Calculate/Blra.cs b/Web/App_Code/Calculate/Blra.cs new file mode 100644 index 0000000..ae0be4f --- /dev/null +++ b/Web/App_Code/Calculate/Blra.cs @@ -0,0 +1,155 @@ +using System; +using System.Data; +using System.Configuration; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; + +/// +/// pҰh +/// +public class Blra : LaborAndHealthFee +{ + private int _annuitySalary; + private double _companyFee; + private double _personalFee; + private int _inworkdays; + + public Blra(DateTime aDate) + : base(aDate) + { + _bftyp = 3; + _tableName = "BLRA"; + } + + public LaborRetireAnnuity GetFee() + { + LaborRetireAnnuity fee = new LaborRetireAnnuity(); + fee.Init(); + fee.CompanyFee = Convert.ToInt32(Math.Round(_companyFee, MidpointRounding.AwayFromZero)); + fee.PersonalFee = Convert.ToInt32(Math.Round(_personalFee, MidpointRounding.AwayFromZero)); + fee.AnnuitySalary = _annuitySalary; + return fee; + } + + public void Clear() + { + _annuitySalary = 0; + _companyFee = 0; + _personalFee = 0; + _inworkdays = 0; + } + + /// + /// pҰhAå[J Blra 餤 + /// + /// ~ + /// b¾_l + /// b¾ + /// ӤHúv + /// uO 1=D 2=u + /// ¾Ѽ + /// uy 1=y 2=~y + public void Add(int salary, DateTime startDay, DateTime endDay, int personalRate, string employeeType, int thisMonthDays, string nation) + { + // ~yuSҰh + if (nation == "2") + return; + + double bsamt = GetAmont(salary); + double daysRatio = 0; + int days = 0; + int monthEndDay = WGuard1.GetMonthEnd(startDay, 0).Day; + _annuitySalary = Convert.ToInt32(bsamt); + + if (bsamt > 0) + { + // 멳 + if (startDay.Day == 1 && endDay.Day == monthEndDay) + { + days = 30; + } + else + { + // O멳 + if (endDay.Day == monthEndDay) + { + if (startDay.Day == 30 || startDay.Day == 31) + days = 1; + else + days = 30 - startDay.Day + 1; + } + else + // D멳 + { + days = endDay.Day - startDay.Day + 1; + } + if (days > 30) + days = 30; + } + + /* + // 멳AH 30 ѭp + if (startDay.Day == 1 && endDay.Day == monthEndDay) + { + days = 30; + } + else + { + // O멳A 30 h + //if (endDay.Day == monthEndDay) + // days = 30 - startDay.Day + 1; + // D멳Aιڵh + //else + days = endDay.Day - startDay.Day + 1; + // վѼơA̦h 30 + if (days > 30) + days = 30; + } + */ + + // Y֭pѼ > 30 hhhXѼ + if (_inworkdays + days > 30) + days = 30 - _inworkdays; + _inworkdays += days; + + daysRatio = Convert.ToDouble(days) / 30d; + + // p⤽q + if (employeeType == "1") // uOD + _companyFee += 0; + else + _companyFee += Math.Round(bsamt * 0.06 * daysRatio, 4, MidpointRounding.AwayFromZero); + + // pӤH + _personalFee += Math.Round(bsamt * ((double)personalRate / 100) * daysRatio, 4, MidpointRounding.AwayFromZero); + } + } +} + +public struct LaborRetireAnnuity +{ + public int CompanyFee; + public int PersonalFee; + public int AnnuitySalary; + + public void Init() + { + AnnuitySalary = 0; + CompanyFee = 0; + PersonalFee = 0; + } + + public void Add(LaborRetireAnnuity fee) + { + AnnuitySalary = fee.AnnuitySalary; + CompanyFee += fee.CompanyFee; + PersonalFee += fee.PersonalFee; + } +} \ No newline at end of file diff --git a/Web/App_Code/Calculate/Calculate.cs b/Web/App_Code/Calculate/Calculate.cs new file mode 100644 index 0000000..82e913e --- /dev/null +++ b/Web/App_Code/Calculate/Calculate.cs @@ -0,0 +1,931 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using Wellan.Common; +using Wellan.Data; + +/// +/// 計算加班費 +/// 1. 取出這個年月的這個人員的加班紀錄 +/// 2. 若要累積補休(11),就累加進累積補休 +/// 3. 若要請領加班費(12),就看那天是不是假日 +/// 4. 是假日:假日加班費率 * 8 * 時薪 +/// 5. 不是假日:區分出 前二時數 與 後二時數 +/// 6. 前二加班:前二加班費率 * 前二時數 * 時薪 +/// 7. 後二加班:後二加班費率 * 後二時數 * 時薪 +/// 8. 累加加班費、前二時數、後二時數、假日時數 +/// +public class ExtraWork +{ + private BhrdDAC bhrd = new BhrdDAC(); + private static Calculate calc = new Calculate(); + + /// + /// 累積補休時數 + /// + public int RelaxationAllowance = 0; + + /// + /// 前二加班時數 + /// + public int RPTC1 = 0; + + private double _RPTA1 = 0d; + /// + /// 前二加班費 + /// + public int RPTA1 + { + get + { + return (Int32)Math.Round(_RPTA1, MidpointRounding.AwayFromZero); + } + set + { + _RPTA1 = value; + } + } + + /// + /// 後二加班時數 + /// + public int RPTC2 = 0; + + private double _RPTA2 = 0d; + /// + /// 後二加班費 + /// + public int RPTA2 + { + get + { + return (Int32)Math.Round(_RPTA2, MidpointRounding.AwayFromZero); + } + set + { + _RPTA2 = value; + } + } + + /// + /// 假日加班時數 + /// + public int RPTC3 = 0; + + private double _RPTA3 = 0d; + /// + /// 假日加班費 + /// + public int RPTA3 + { + get + { + return (Int32)Math.Round(_RPTA3, MidpointRounding.AwayFromZero); + } + set + { + _RPTA3 = value; + } + } + + /// + /// 休息日加班超過 8 小時時數 + /// + public int RPTC4 = 0; + private double _RPTA4 = 0d; + /// + /// 休息日加班超過 8 小時加班費 + /// + public int RPTA4 + { + get + { + return (Int32)Math.Round(_RPTA4, MidpointRounding.AwayFromZero); + } + set + { + _RPTA4 = value; + } + } + + /// + /// 例假日加班超過 8 小時時數 + /// + public int RPTC5 = 0; + + private double _RPTA5 = 0d; + /// + /// 例假日加班超過 8 小時加班費 + /// + public int RPTA5 + { + get + { + return (Int32)Math.Round(_RPTA5, MidpointRounding.AwayFromZero); + } + set + { + _RPTA5 = value; + } + } + + public RASNRecord RasnRecord; + + public ExtraWork() + { + } + + public void Clear() + { + RelaxationAllowance = 0; + RPTC1 = 0; + RPTC2 = 0; + RPTC3 = 0; + RPTC4 = 0; + RPTC5 = 0; + RPTA1 = 0; + RPTA2 = 0; + RPTA3 = 0; + RPTA4 = 0; + RPTA5 = 0; + } + + /// + /// 計算加班費 + /// + /// 月薪 + /// 伙食津貼 + /// 時數 + /// 比例 + /// 計算公式 + /// 加班費計算方式 + public static int CalculateOverTimeInt(int bpsrm, int bpp02, int hours, double ratio, string bpovr, string bpott) + { + return (Int32)Math.Round(CalculateOverTime(bpsrm, bpp02, hours, ratio, 1D, bpovr), MidpointRounding.AwayFromZero); + } + + /// + /// 計算加班費 + /// + /// 月薪 + /// 伙食津貼 + /// 時數 + /// 加班費比例 + /// 請假扣款比例 + /// 計算公式 + /// 加班費計算方式 + /// + public static double CalculateOverTime(int bpsrm, int bpp02, int hours, double overtimeRatio, double leaveRatio, string bpovr) + { + return calc.CalcOverTime(bpsrm, bpp02, hours, overtimeRatio, leaveRatio, bpovr); + } + + + /// + /// 區分加班時數(支援累積模式) + /// + /// 加班類型 + /// 本次加班分鐘數 + /// 處理前累計時數(用於多張加班單累積計算) + /// 加班分鐘數(1.34) + /// 加班分鐘數(1.67) + /// 加班分鐘數(1.00) + /// 加班分鐘數(2.67) + /// 加班分鐘數(2.00) + public void SplitOverTime(string 加班類型, int 本筆分鐘數, int 含本筆累計分鐘數, + out int tc1, out int tc2, out int tc3, out int tc4, out int tc5) + { + tc1 = 0; + tc2 = 0; + tc3 = 0; + tc4 = 0; + tc5 = 0; + + int minBefore = 含本筆累計分鐘數 - 本筆分鐘數; + int minAfter = 含本筆累計分鐘數; + + switch (加班類型) + { + case RPAR_TYPE.T11_非休息日累積補休時數: + case RPAR_TYPE.T12_非休息日請領加班費: + 分配非休息日時數(本筆分鐘數, minBefore, minAfter, out tc1, out tc2); + break; + + case RPAR_TYPE.T13_休息日累積補休時數: + case RPAR_TYPE.T14_休息日請領加班費: + 分配休息日時數(本筆分鐘數, minBefore, minAfter, out tc1, out tc2, out tc4); + break; + + case RPAR_TYPE.T15_國定假日累積補休時數: + case RPAR_TYPE.T16_國定假日請領加班費: + 分配國定假日時數(本筆分鐘數, minBefore, minAfter, out tc1, out tc2, out tc3); + break; + + case RPAR_TYPE.T17_例假日累積補休時數: + case RPAR_TYPE.T18_例假日請領加班費: + 分配例假日時數(本筆分鐘數, minBefore, minAfter, out tc3, out tc5); + break; + } + } + + /// + /// 分配非休息日加班時數 + /// 規則:前 120 分鐘為 tc1(1.34),超過部分為 tc2(1.67) + /// + private void 分配非休息日時數(int 本次時數, int 處理前累計, int 處理後累計, + out int tc1, out int tc2) + { + const int 門檻 = 120; + + tc1 = 0; + tc2 = 0; + + if (處理後累計 <= 門檻) + { + // 未超過門檻:全部算入 tc1 + tc1 = 本次時數; + } + else if (處理前累計 >= 門檻) + { + // 之前已超過門檻:全部算入 tc2 + tc2 = 本次時數; + } + else + { + // 本筆跨越門檻:分配至 tc1 和 tc2 + tc1 = 門檻 - 處理前累計; + tc2 = 本次時數 - tc1; + } + } + + /// + /// 分配休息日加班時數 + /// 規則:0-120 分鐘為 tc1(1.34),120-480 分鐘為 tc2(1.67),超過 480 分鐘為 tc4(2.67) + /// + private void 分配休息日時數(int 本次時數, int 處理前累計, int 處理後累計, + out int tc1, out int tc2, out int tc4) + { + const int 第一門檻 = 120; + const int 第二門檻 = 480; + + tc1 = 0; + tc2 = 0; + tc4 = 0; + + if (處理後累計 <= 第一門檻) + { + // 未超過第一門檻 + tc1 = 本次時數; + } + else if (處理後累計 <= 第二門檻) + { + // 在第一和第二門檻之間 + if (處理前累計 >= 第一門檻) + { + tc2 = 本次時數; + } + else + { + tc1 = 第一門檻 - 處理前累計; + tc2 = 本次時數 - tc1; + } + } + else + { + // 超過第二門檻 + if (處理前累計 >= 第二門檻) + { + tc4 = 本次時數; + } + else if (處理前累計 >= 第一門檻) + { + tc2 = 第二門檻 - 處理前累計; + tc4 = 本次時數 - tc2; + } + else + { + tc1 = 第一門檻 - 處理前累計; + tc2 = 第二門檻 - 第一門檻; + tc4 = 本次時數 - tc1 - tc2; + } + } + } + + /// + /// 分配國定假日加班時數 + /// 規則:0-480 分鐘為 tc3(1.00),480-600 分鐘為 tc1(1.34),超過 600 分鐘為 tc2(1.67) + /// + private void 分配國定假日時數(int 本次時數, int 處理前累計, int 處理後累計, + out int tc1, out int tc2, out int tc3) + { + const int 第一門檻 = 480; + const int 第二門檻 = 600; + + tc1 = 0; + tc2 = 0; + tc3 = 0; + + if (處理後累計 <= 第一門檻) + { + // 未超過第一門檻:全部算入 tc3 + tc3 = 本次時數; + } + else if (處理後累計 <= 第二門檻) + { + // 在第一和第二門檻之間 + if (處理前累計 >= 第一門檻) + { + tc1 = 本次時數; + } + else + { + tc3 = 第一門檻 - 處理前累計; + tc1 = 本次時數 - tc3; + } + } + else + { + // 超過第二門檻 + if (處理前累計 >= 第二門檻) + { + tc2 = 本次時數; + } + else if (處理前累計 >= 第一門檻) + { + tc1 = 第二門檻 - 處理前累計; + tc2 = 本次時數 - tc1; + } + else + { + tc3 = 第一門檻 - 處理前累計; + tc1 = 第二門檻 - 第一門檻; + tc2 = 本次時數 - tc3 - tc1; + } + } + } + + /// + /// 分配例假日加班時數 + /// 規則:0-480 分鐘為 tc3(1.00),超過 480 分鐘為 tc5(2.00) + /// + private void 分配例假日時數(int 本次時數, int 處理前累計, int 處理後累計, + out int tc3, out int tc5) + { + const int 門檻 = 480; + + tc3 = 0; + tc5 = 0; + + if (處理後累計 <= 門檻) + { + // 未超過門檻:全部算入 tc3 + tc3 = 本次時數; + } + else if (處理前累計 >= 門檻) + { + // 之前已超過門檻:全部算入 tc5 + tc5 = 本次時數; + } + else + { + // 本筆跨越門檻:分配至 tc3 和 tc5 + tc3 = 門檻 - 處理前累計; + tc5 = 本次時數 - tc3; + } + } + + /// + /// 增加加班時數 + /// + /// 類別 + /// 加班日期 + /// 當日加班時數(分鐘) + /// 月薪 + /// 伙食津貼 + /// 前二比例 + /// 後二比例 + /// 假日比例 + /// 計算公式 + /// 加班時數計算方式 + /// 前段加班時數(分鐘) + /// 後段加班時數(分鐘) + /// 假日加班時數(分鐘) + public ExtraWorkData Add(string rptyp, DateTime rprdt, int rptct, int bpsrm, int bpp02, + double bpbft, double bpaft, double bphol, string formula, string bpott, + int rptc1, int rptc2, int rptc3, int rptc4, int rptc5 + /*string 上班時間, string 下班時間*/) + { + ExtraWorkData result = new ExtraWorkData(); + + switch (rptyp) + { + case RPAR_TYPE.T11_非休息日累積補休時數: + case RPAR_TYPE.T13_休息日累積補休時數: + case RPAR_TYPE.T15_國定假日累積補休時數: + case RPAR_TYPE.T17_例假日累積補休時數: + result.RelaxationAllowance = rptct; + RelaxationAllowance += rptct; + break; + //if (rprdt < new DateTime(2018, 3, 1)) + //{ + // decimal calcMin = Math.Ceiling((decimal)rptct / 240m) * 240m; + // result.RelaxationAllowance = (int)calcMin; + // RelaxationAllowance += (int)calcMin; + //} + //else + //{ + // result.RelaxationAllowance = rptct; + // RelaxationAllowance += rptct; + //} + //break; + + case RPAR_TYPE.T12_非休息日請領加班費: + case RPAR_TYPE.T14_休息日請領加班費: + case RPAR_TYPE.T16_國定假日請領加班費: + case RPAR_TYPE.T18_例假日請領加班費: + // 1.34時數 + result.RPTC1 = rptc1; + result.RPTA1 = CalculateOverTime(bpsrm, bpp02, rptc1, bpbft, 1D, formula); + RPTC1 += rptc1; + _RPTA1 += result.RPTA1; + + // 1.67時數 + result.RPTC2 = rptc2; + result.RPTA2 = CalculateOverTime(bpsrm, bpp02, rptc2, bpaft, 1D, formula); + RPTC2 += rptc2; + _RPTA2 += result.RPTA2; + + // 1.00時數 + result.RPTC3 = rptc3; + result.RPTA3 = CalculateOverTime(bpsrm, bpp02, rptc3, bphol, 1D, formula); + RPTC3 += rptc3; + _RPTA3 += result.RPTA3; + + // 2.67時數 + result.RPTC4 = rptc4; + result.RPTA4 = CalculateOverTime(bpsrm, bpp02, rptc4, bpaft + 1D, 1D, formula); + RPTC4 += rptc4; + _RPTA4 += result.RPTA4; + + // 2.00時數 + result.RPTC5 = rptc5; + result.RPTA5 = CalculateOverTime(bpsrm, bpp02, rptc5, bphol + 1D, 1D, formula); + RPTC5 += rptc5; + _RPTA5 += result.RPTA5; + break; + } + + return result; + } + + public void Add(ROWKRecord rowkRecord) + { + this.RPTC1 += rowkRecord.ROT01; + this.RPTC2 += rowkRecord.ROT02; + this.RPTC3 += rowkRecord.ROT03; + this.RPTC4 += rowkRecord.ROT05; + this.RPTC5 += rowkRecord.ROT06; + this.RPTA1 += rowkRecord.ROA01; + this.RPTA2 += rowkRecord.ROA02; + this.RPTA3 += rowkRecord.ROA03; + this.RPTA4 += rowkRecord.ROA05; + this.RPTA5 += rowkRecord.ROA06; + this.RelaxationAllowance += rowkRecord.ROT04; + } +} + +public class ExtraWorkData +{ + /// + /// 1.34 加班時數 + /// + public int RPTC1 = 0; + /// + /// 1.67 加班時數 + /// + public int RPTC2 = 0; + /// + /// 1.00 加班時數 + /// + public int RPTC3 = 0; + /// + /// 2.67 加班時數 + /// + public int RPTC4 = 0; + /// + /// 2.00 加班時數 + /// + public int RPTC5 = 0; + /// + /// 累積補休 + /// + public int RelaxationAllowance = 0; + /// + /// 1.34 加班費 + /// + public Double RPTA1 = 0; + /// + /// 1.67 加班費 + /// + public Double RPTA2 = 0; + /// + /// 1.00 加班費 + /// + public Double RPTA3 = 0; + /// + /// 2.67 加班費 + /// + public Double RPTA4 = 0; + /// + /// 2.00 加班費 + /// + public Double RPTA5 = 0; +} + + +/* +2. 計算缺勤扣款 + 1. 取出這個年月的這個人員的請假紀錄 + 2. 區分出扣薪假與不扣薪假 + 3. 扣薪假:事假:時數 * 時薪 + 病假:(時數 * 時薪) / 2 + 4. 累加各假別時數、扣薪金額 +*/ +public class Absent +{ + private Calculate calc = new Calculate(); + + public Absent() + { + } + + /// + /// 月薪 + /// + public int bpsrm; + /// + /// 伙食津貼 + /// + public int bpp02; + /// + /// 計算公式 + /// + public string Formula; + /// + /// 補休請假時數 + /// + public int SST05 = 0; + /// + /// 特休時數 + /// + public int SST06 = 0; + /// + /// 事假時數 + /// + public int SST07 = 0; + /// + /// 病假時數 + /// + public int SST08 = 0; + /// + /// 喪假時數,不影響全勤 + /// + public int SST09 = 0; + /// + /// 產假時數 + /// + public int SST10 = 0; + /// + /// 婚假時數,不影響全勤 + /// + public int SST11 = 0; + /// + /// 陪產假時數 + /// + public int SST12 = 0; + /// + /// 公假時數,不影響全勤 + /// + public int SST13 = 0; + /// + /// 公傷假時數,不影響全勤 + /// + public int SST14 = 0; + /// + /// 生理假時數,不影響全勤 + /// + public int SST15 = 0; + /// + /// 家庭照顧假時數,不影響全勤 + /// + public int SST16 = 0; + /// + /// 育嬰假時數 + /// + public int SST17 = 0; + /// + /// 原民祭儀假 + /// + public int SST19 = 0; + /// + /// 產檢假時數 + /// + public int SST20 = 0; + /// + /// 病假扣款 + /// + public int SSS01 = 0; + /// + /// 事假扣款 + /// + public int SSS02 = 0; + /// + /// 其他假別(一)時數,不影響全勤 + /// + public int SST23 = 0; + /// + /// 無薪扣款 + /// + public int SSS09 = 0; + + + public void Clear() + { + SST05 = 0; + SST06 = 0; + SST07 = 0; + SST08 = 0; + SST09 = 0; + SST10 = 0; + SST11 = 0; + SST12 = 0; + SST13 = 0; + SST14 = 0; + SST15 = 0; + SST16 = 0; + SST17 = 0; + SST19 = 0; + SST20 = 0; + SST23 = 0; + SSS01 = 0; + SSS02 = 0; + SSS09 = 0; + } + + /// + /// 以假別與總時數計算請假扣款與區分時數 + /// + /// 假別 + /// 時數 + /// 請假扣款 + public int Add(string rptyp, int rptct) + { + int rpftr = 0; + switch (rptyp) + { + case RPAR_TYPE.T00_補休: //補休時數 + SST05 += rptct; + break; + case RPAR_TYPE.T01_特休: //特休時數 + SST06 += rptct; + break; + case RPAR_TYPE.T02_事假: //事假時數 + SST07 += rptct; + rpftr = Convert.ToInt32(calc.CalcOverTime(bpsrm, bpp02, rptct, 0D, 1D, Formula)); + SSS02 += rpftr; + break; + case RPAR_TYPE.T03_病假: //病假時數 + SST08 += rptct; + rpftr = Convert.ToInt32(calc.CalcOverTime(bpsrm, bpp02, rptct, 0D, 0.5D, Formula)); + SSS01 += rpftr; + break; + case RPAR_TYPE.T04_喪假: //喪假時數 + SST09 += rptct; + break; + case RPAR_TYPE.T05_產假: //產假時數 + SST10 += rptct; + break; + case RPAR_TYPE.T06_婚假: //婚假時數 + SST11 += rptct; + break; + case RPAR_TYPE.T07_陪產假: //陪產假時數 + SST12 += rptct; + break; + case RPAR_TYPE.T08_公假: //公假時數 + SST13 += rptct; + break; + case RPAR_TYPE.T09_公傷假: //公傷假時數 + SST14 += rptct; + break; + case RPAR_TYPE.T0A_生理假: //生理假時數 + SST15 += rptct; + rpftr = Convert.ToInt32(calc.CalcOverTime(bpsrm, bpp02, rptct, 0D, 0.5D, Formula)); + SSS01 += rpftr; + break; + case RPAR_TYPE.T0B_家庭照顧假: //家庭照顧假時數 + SST16 += rptct; + rpftr = Convert.ToInt32(calc.CalcOverTime(bpsrm, bpp02, rptct, 0D, 1D, Formula)); + SSS02 += rpftr; + break; + case RPAR_TYPE.T0C_育嬰假: //育嬰假時數 + SST17 += rptct; + break; + case RPAR_TYPE.T0D_原民祭儀假: //原民祭儀假 + SST19 += rptct; + break; + case RPAR_TYPE.T0E_產檢假: //產檢假時數 + SST20 += rptct; + break; + case RPAR_TYPE.T0G_無薪假: //無薪假時數 + case RPAR_TYPE.T0F_防疫照顧假: + SST23 += rptct; + rpftr = Convert.ToInt32(calc.CalcOverTime(bpsrm, bpp02, rptct, 0D, 1D, Formula)); + SSS09 += rpftr; + break; + case RPAR_TYPE.T0H_防疫隔離假: + SST23 += rptct; + break; + } + return rpftr; + } + + public int Add(RPARRecord rparRecord, DateTime calcStartDay, DateTime calcEndDay, bool is進整小時) + { + DateTime 起日 = rparRecord.RPRDT; + DateTime 迄日 = rparRecord.RPEDT; + string 起時 = rparRecord.RPRTM; + string 迄時 = rparRecord.RPETM; + TimeCalc timeCalc = new TimeCalc(); + + + if (起時.Length > 0 && 迄時.Length > 0) + { + return Add(rparRecord.RPNUM, rparRecord.RPTYP, 起日, 迄日, 起時, 迄時, calcStartDay, calcEndDay, is進整小時); + } + else + return Add(rparRecord.RPTYP, rparRecord.RPTCT); + } + + public int Add(string RPNUM, string RPTYP, DateTime 起日, DateTime 迄日, string 起時, string 迄時, DateTime calcStartDay, DateTime calcEndDay, bool is進整小時) + { + TimeCalc timeCalc = new TimeCalc(); + + if (起日 < calcStartDay) + { + 起日 = calcStartDay; + } + if (迄日 > calcEndDay) + { + 迄日 = calcEndDay; + } + if (string.IsNullOrEmpty(起時)) + { + 起時 = timeCalc.上班時間; + } + if (string.IsNullOrEmpty(迄時)) + { + 迄時 = timeCalc.下班時間; + } + + if (起日 != 迄日) + { + var rpftr = 0; + var dt = 起日; + while (dt <= 迄日) + { + rpftr += Add(RPTYP, timeCalc.計算請假當日時數(RPNUM, dt, 起日, 迄日, 起時, 迄時, RPTYP, is進整小時)); + dt = dt.AddDays(1); + } + return rpftr; + } + else + { + return Add(RPTYP, timeCalc.計算請假總時數(RPNUM, 起日, 迄日, 起時, 迄時, RPTYP, is進整小時)); + } + } + + /// + /// 是否全勤 + /// + public bool AllPresent + { + get + { + return (SST07 == 0) && (SST08 == 0) && (SST10 == 0) && (SST12 == 0); + } + } +} + +/// +/// 計算其他費用 +/// +public class OtherFee +{ + public OtherFee() + { + } + + /// + /// 短程出差差旅費 + /// + public int ShortTrip = 0; + /// + /// 長途出差差旅費 + /// + public int LongTrip = 0; + /// + /// 電話費補助 + /// + public int TelephoneFee = 0; + /// + /// 油料費補助公里數 + /// + public int FuelKm = 0; + /// + /// 油料費補助金額 + /// + public int FuelFee = 0; + + public void Clear() + { + ShortTrip = 0; + LongTrip = 0; + TelephoneFee = 0; + FuelKm = 0; + FuelFee = 0; + } + + public void Add(string rptyp, int rptct, int rpftr) + { + switch (rptyp) + { + case RPAR_TYPE.T21_電話費: // 電話費 + TelephoneFee += rpftr; + break; + case RPAR_TYPE.T22_油料費: // 油料費 + FuelKm += rptct; + FuelFee += Convert.ToInt32(Math.Round((double)rptct * 2.5d, MidpointRounding.AwayFromZero)); + break; + case RPAR_TYPE.T31_短程出差: // 短程差旅 + case RPAR_TYPE.T33_公出: // 公出 + case RPAR_TYPE.T34_公假: // 公假 + ShortTrip += rpftr; + break; + case RPAR_TYPE.T32_長程出差: // 長途差旅 + LongTrip += rpftr; + break; + } + } + + public void Add(RPARRecord rparRecord) + { + Add(rparRecord.RPTYP, rparRecord.RPTCT, rparRecord.RPFTR); + } +} + +/// +/// 計算公式 +/// +public class Calculate : Wellan.Data.WDAC +{ + private DbCommand cmdCalc; + + public Calculate() + { + cmdCalc = Query.NewCommand(); + cmdCalc.Parameters.Add(Query.NewParameter("月薪", DbType.Double)); + cmdCalc.Parameters.Add(Query.NewParameter("本薪", DbType.Double)); + cmdCalc.Parameters.Add(Query.NewParameter("伙食費", DbType.Double)); + cmdCalc.Parameters.Add(Query.NewParameter("時數", DbType.Double)); + cmdCalc.Parameters.Add(Query.NewParameter("加班費比例", DbType.Double)); + cmdCalc.Parameters.Add(Query.NewParameter("請假扣款比例", DbType.Double)); + } + + /// + /// 計算加班費與請假扣款 + /// + /// 月薪 + /// 伙食津貼 + /// 時數(分鐘) + /// 加班費比例 + /// 請假扣款比例 + /// 計算公式 + /// + public Double CalcOverTime(int bpsrm, int bpp02, int hours, double overtimeRatio, double leaveRatio, string formula) + { + cmdCalc.CommandText = "SELECT ROUND(" + formula + ", 0)"; + cmdCalc.Parameters["月薪"].Value = Convert.ToDouble(bpsrm); + cmdCalc.Parameters["本薪"].Value = Convert.ToDouble(bpsrm - bpp02); + cmdCalc.Parameters["伙食費"].Value = Convert.ToDouble(bpp02); + cmdCalc.Parameters["時數"].Value = Convert.ToDouble(hours) / 60d; + cmdCalc.Parameters["加班費比例"].Value = Convert.ToDouble(overtimeRatio); + cmdCalc.Parameters["請假扣款比例"].Value = Convert.ToDouble(leaveRatio); + + int result; + if (ExecuteScalar(cmdCalc, out result)) + return result; + else + return 0d; + } +} \ No newline at end of file diff --git a/Web/App_Code/Calculate/LaborAndHealthFee.cs b/Web/App_Code/Calculate/LaborAndHealthFee.cs new file mode 100644 index 0000000..47dcf7a --- /dev/null +++ b/Web/App_Code/Calculate/LaborAndHealthFee.cs @@ -0,0 +1,127 @@ +using System; +using System.Data; +using System.Configuration; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Collections.Generic; + +/// +/// pҰOO¦O +/// +public class LaborAndHealthFee +{ + protected WQuery _query; + protected DateTime _baseDate; + protected Dictionary> _amtData; + protected int _bftyp; + protected string _tableName; + + /// p + public LaborAndHealthFee(DateTime baseDate) + { + WConnectionString.ConnectionConfigFile = WConfig.GetConnectionConfig(); + WConnectionString.ConnectionConfigName = WConfig.GetConnectionConfigName(); + _query = new WQuery(WConnectionString.GetConnectionType(), WConnectionString.GetConnectionString()); + _baseDate = baseDate; + } + + /// + /// oSwŶZ + /// + /// + protected void GetData(DateTime aDate) + { + if (_amtData == null) + _amtData = new Dictionary>(); + + if (!_amtData.ContainsKey(aDate)) + { + List _newAmtDataItem = new List(); + + // oAίŶZ + DataTable _verData = _query.Select(String.Format("SELECT * FROM BFDT WHERE BFTYP={0} ORDER BY BFVER", _bftyp)); + int version = 0; + + foreach (System.Data.DataRow row in _verData.Rows) + { + if (aDate.CompareTo(row["BFSDT"]) >= 0 && (row["BFEDT"] == DBNull.Value || aDate.CompareTo(row["BFEDT"]) <= 0)) + { + version = Convert.ToInt32(row["BFVER"]); + break; + } + } + + // oӪŶZ + DataTable data = _query.Select(String.Format("SELECT * FROM {1} WHERE BSVER={0} ORDER BY BSLVL", version, _tableName)); + + for (int i = 0; i < data.Rows.Count; i++) + { + _newAmtDataItem.Add(new LHFClass(Convert.ToInt32(data.Rows[i]["BSLOW"]), + Convert.ToInt32(data.Rows[i]["BSHIH"]), + Convert.ToInt32(data.Rows[i]["BSAMT"]))); + } + + _amtData.Add(aDate, _newAmtDataItem); + } + } + + // oثeŶZ + protected void GetData() + { + GetData(_baseDate); + } + + /// + /// HSwAΪŶZAoSwAΪO~ + /// + /// + /// + /// + protected double GetAmont(DateTime aDate, int salary) + { + GetData(aDate); + + double bsamt = 0; + for (int i = 0; i < _amtData[aDate].Count; i++) + { + if (salary >= _amtData[aDate][i].Low && salary <= _amtData[aDate][i].High) + { + bsamt = _amtData[aDate][i].Amt; + break; + } + } + + return bsamt; + } + + /// + /// HثeŶZAoO~ + /// + /// + /// + protected double GetAmont(int salary) + { + return GetAmont(_baseDate, salary); + } + + protected struct LHFClass + { + public int Low; + public int High; + public int Amt; + + public LHFClass(int aLow, int aHigh, int aAmt) + { + Low = aLow; + High = aHigh; + Amt = aAmt; + } + } +} diff --git a/Web/App_Code/Calculate/TimeCalc.cs b/Web/App_Code/Calculate/TimeCalc.cs new file mode 100644 index 0000000..503cd07 --- /dev/null +++ b/Web/App_Code/Calculate/TimeCalc.cs @@ -0,0 +1,555 @@ +using System; +using System.Linq; +using System.Xml.Linq; +using Wellan.Common; + +/// +/// 計算時數的類別 +/// +public class TimeCalc +{ + public string 上班時間; + public string 下班時間; + public string 午休開始; + public string 午休結束; + public int 上班分鐘數; + public int 午休分鐘數; + public bool 彈性上班時間; + private BhrdDAC bhrdDao = new BhrdDAC(WGuard1.Query); + private RtmeDAC rtmeDao = new RtmeDAC(WGuard1.Query); + private BpsnDAC bpsnDao = new BpsnDAC(WGuard1.Query); + private BpaaDAC bpaaDao = new BpaaDAC(WGuard1.Query); + private BtmeDAC btmeDao = new BtmeDAC(WGuard1.Query); + + public TimeCalc() + { + } + + /// + /// 計算時數之前取得各個時間點 + /// + /// + /// + public void Init(string 員工編號, DateTime 日期) + { + 上班時間 = WGuard1.WSetR("UNRPARTIME", 1); + 下班時間 = WGuard1.WSetR("UNRPARTIME", 2); + 午休開始 = WGuard1.WSetR("UNRPARTIME", 3); + 午休結束 = WGuard1.WSetR("UNRPARTIME", 4); + 彈性上班時間 = WGuard1.WSetR("彈性上班時間", 1) == "Y"; + + // 取員工班表 + var btmeItem = rtmeDao.SelectBtmeDay(員工編號, 日期); + if (btmeItem != null && !String.IsNullOrEmpty(btmeItem.BTSTM) && !String.IsNullOrEmpty(btmeItem.BTETM) + && !String.IsNullOrEmpty(btmeItem.BTRST) && !String.IsNullOrEmpty(btmeItem.BTRED)) + { + 上班時間 = btmeItem.BTSTM; + 下班時間 = btmeItem.BTETM; + 午休開始 = btmeItem.BTRST; + 午休結束 = btmeItem.BTRED; + } + // 若員工班表沒有設定,則取專案預設班表 + else + { + // 取員工專案年度接單編號 + var rapyn = bpsnDao.GetProjectByDate(員工編號, 日期); + if (!String.IsNullOrEmpty(rapyn)) + { + // 取專案預設班表編號 + var bptme = bpaaDao.GetTimeTableNo(rapyn); + if (!String.IsNullOrEmpty(bptme)) + { + // 取班表 + btmeItem = btmeDao.SelectOne(bptme).FirstOrDefault(); + if (btmeItem != null && !String.IsNullOrEmpty(btmeItem.BTSTM) && !String.IsNullOrEmpty(btmeItem.BTETM) + && !String.IsNullOrEmpty(btmeItem.BTRST) && !String.IsNullOrEmpty(btmeItem.BTRED)) + { + 上班時間 = btmeItem.BTSTM; + 下班時間 = btmeItem.BTETM; + 午休開始 = btmeItem.BTRST; + 午休結束 = btmeItem.BTRED; + } + } + } + } + + 上班分鐘數 = 計算分鐘數(上班時間, 下班時間) - 計算分鐘數(午休開始, 午休結束); + 午休分鐘數 = 計算分鐘數(午休開始, 午休結束); + } + + public static int 進整小時(int 分鐘) + { + double 渣渣 = ((double)分鐘 / 30d) % 1d; + + if (渣渣 > 0.5d) + return (分鐘 / 60 + 1) * 60; + else + return (分鐘 / 60) * 60; + } + + public static int 進半小時(int 分鐘) + { + double 渣渣 = ((double)分鐘 / 15d) % 1d; + + if (渣渣 > 0.5d) + return (分鐘 / 30 + 1) * 30; + else + return (分鐘 / 30) * 30; + } + + public static int 計算分鐘數(string tm1, string tm2) + { + DateTime dt1 = new DateTime(); + DateTime dt2 = new DateTime(); + dt1 = dt1.AddHours(Convert.ToInt32((tm1 + "00:00").Substring(0, 2))).AddMinutes(Convert.ToInt32((tm1 + "00:00").Substring(3, 2))); + dt2 = dt2.AddHours(Convert.ToInt32((tm2 + "00:00").Substring(0, 2))).AddMinutes(Convert.ToInt32((tm2 + "00:00").Substring(3, 2))); + + return Convert.ToInt32((dt2 - dt1).TotalMinutes); + } + + public static string 加分鐘數(string tm1, int minutes) + { + DateTime dt1 = new DateTime(); + dt1 = dt1.AddHours(Convert.ToInt32((tm1 + "00:00").Substring(0, 2))).AddMinutes(Convert.ToInt32((tm1 + "00:00").Substring(3, 2))); + dt1 = dt1.AddMinutes(minutes); + + return dt1.ToString("HH:mm"); + } + + public int 計算午休分鐘數(string 起時, string 迄時) + { + if (起時.CompareTo(午休開始) <= 0 && 迄時.CompareTo(午休結束) >= 0) + return 午休分鐘數; + else if (起時.CompareTo(午休開始) >= 0 && 起時.CompareTo(午休結束) <= 0 && 迄時.CompareTo(午休結束) >= 0) + return 計算分鐘數(起時, 午休結束); + else if (起時.CompareTo(午休開始) <= 0 && 迄時.CompareTo(午休開始) >= 0 && 迄時.CompareTo(午休結束) <= 0) + return 計算分鐘數(午休開始, 迄時); + else if (起時.CompareTo(午休開始) >= 0 && 起時.CompareTo(午休結束) <= 0 && 迄時.CompareTo(午休開始) >= 0 && 迄時.CompareTo(午休結束) <= 0) + return 計算分鐘數(起時, 迄時); + else + return 0; + } + + public int 計算請假總時數(string 員工編號, DateTime 起日, DateTime 迄日, string 起時, string 迄時, string 假別, bool is進整小時) + { + Init(員工編號, 起日); + + if (String.IsNullOrEmpty(起時)) + 起時 = 上班時間; + if (String.IsNullOrEmpty(迄時)) + 迄時 = 下班時間; + + int 分鐘數; + + // 起始與結束同一天 + if (起日 == 迄日) + { + 分鐘數 = 計算分鐘數(起時, 迄時) - 計算午休分鐘數(起時, 迄時); + } + // 起始與結束不同天 + else + { + DateTime std = 起日; + 分鐘數 = 0; + + while (std <= 迄日) + { + Init(員工編號, std); + + // 不是假日,或是產假,要列入時數計算 + if (!bhrdDao.IsHoliday(員工編號, std) || 假別 == RPAR_TYPE.T05_產假) + { + // 第一天 + if (std == 起日) + { + 分鐘數 += 計算分鐘數(起時, 下班時間) - 計算午休分鐘數(起時, 下班時間); + } + // 最後一天 + else if (std == 迄日) + { + 分鐘數 += 計算分鐘數(上班時間, 迄時) - 計算午休分鐘數(上班時間, 迄時); + } + // 中間其他天 + else + { + 分鐘數 += 上班分鐘數; + } + } + + std = std.AddDays(1); + } + } + + if (is進整小時) + 分鐘數 = 進半小時(分鐘數); + return 分鐘數; + } + + public int 計算請假跨日數(string 員工編號, DateTime 起日, DateTime 迄日, string 假別) + { + // 起始與結束同一天 + if (起日 == 迄日) + { + return 1; + } + // 起始與結束不同天 + else + { + DateTime std = 起日; + int 天數 = 0; + + while (std <= 迄日) + { + // 不是假日,或是產假,要列入時數計算 + if (!bhrdDao.IsHoliday(員工編號, std) || 假別 == RPAR_TYPE.T05_產假) + { + 天數++; + } + std = std.AddDays(1); + } + return 天數; + } + } + + public int 計算請假當日時數(string 員工編號, DateTime 日期, DateTime 起日, DateTime 迄日, string 起時, string 迄時, string 假別, bool is進整小時) + { + int 當日分鐘數 = 0; + + // 起始與結束同一天 + if (起日 == 迄日) + { + Init(員工編號, 起日); + + if (String.IsNullOrEmpty(起時)) + 起時 = 上班時間; + if (String.IsNullOrEmpty(迄時)) + 迄時 = 下班時間; + + 當日分鐘數 = 計算分鐘數(起時, 迄時) - 計算午休分鐘數(起時, 迄時); + + if (is進整小時) + return 進整小時(當日分鐘數); + else + return 當日分鐘數; + } + // 起始與結束不同天 + else + { + DateTime std = 起日; + + while (std <= 迄日) + { + Init(員工編號, std); + + // 不是假日,或是產假,要列入時數計算 + if (!bhrdDao.IsHoliday(員工編號, std) || 假別 == RPAR_TYPE.T05_產假) + { + // 第一天 + if (std == 起日) + { + 當日分鐘數 = 計算分鐘數(起時, 下班時間) - 計算午休分鐘數(起時, 下班時間); + } + // 最後一天 + else if (std == 迄日) + { + 當日分鐘數 = 計算分鐘數(上班時間, 迄時) - 計算午休分鐘數(上班時間, 迄時); + } + // 中間其他天 + else + { + 當日分鐘數 = 上班分鐘數; + } + // 只計算一天,就返回 + if (日期 == std) + { + if (is進整小時) + return 進整小時(當日分鐘數); + else + return 當日分鐘數; + } + } + else + 當日分鐘數 = 0; + + std = std.AddDays(1); + } + + return 0; + } + } + + public int 計算加班時數(string 員工編號, DateTime 日期, string 起時, string 迄時, bool 休息日) + { + Init(員工編號, 日期); + + int 分鐘數 = 計算分鐘數(起時, 迄時) - 計算午休分鐘數(起時, 迄時); + + // 2018/3/1 之後休息日加班不進整 4 小時 + if (休息日 && 日期.CompareTo(new DateTime(2018, 3, 1)) < 0) + 分鐘數 = (int)(Math.Ceiling((decimal)分鐘數 / 240m) * 240m); + + return 分鐘數; + } + + //public static void 拆分加班時數(int 分鐘數, bool 是假日, out int 前二, out int 後二, out int 假日) + //{ + // 前二 = 0; + // 後二 = 0; + // 假日 = 0; + + // if (是假日) + // 假日 = 分鐘數; + // else + // { + // if (分鐘數 < 120) + // 前二 = 分鐘數; + // else + // { + // 前二 = 120; + // 後二 = 分鐘數 - 120; + // } + // } + //} + + public int 計算差旅時數(string 員工編號, DateTime 起日, DateTime 迄日, string 起時, string 迄時) + { + Init(員工編號, 起日); + + if (String.IsNullOrEmpty(起時)) + 起時 = 上班時間; + if (String.IsNullOrEmpty(迄時)) + 迄時 = 下班時間; + + int 分鐘數; + + // 起始與結束同一天 + if (起日 == 迄日) + { + 分鐘數 = 計算分鐘數(起時, 迄時) - 計算午休分鐘數(起時, 迄時); + } + // 起始與結束不同天 + else + { + DateTime std = 起日; + 分鐘數 = 0; + + while (std <= 迄日) + { + Init(員工編號, std); + + // 第一天 + if (std == 起日) + { + 分鐘數 += 計算分鐘數(起時, 下班時間) - 計算午休分鐘數(起時, 下班時間); + } + // 最後一天 + else if (std == 迄日) + { + 分鐘數 += 計算分鐘數(上班時間, 迄時) - 計算午休分鐘數(上班時間, 迄時); + } + // 中間其他天 + else + { + 分鐘數 += 上班分鐘數; + } + + std = std.AddDays(1); + } + } + + return 分鐘數; + } + + public int 計算差旅當日時數(string 員工編號, DateTime 日期, DateTime 起日, DateTime 迄日, string 起時, string 迄時) + { + Init(員工編號, 起日); + + if (String.IsNullOrEmpty(起時)) + 起時 = 上班時間; + if (String.IsNullOrEmpty(迄時)) + 迄時 = 下班時間; + + int 分鐘數; + + // 起始與結束同一天 + if (起日 == 迄日) + { + 分鐘數 = 計算分鐘數(起時, 迄時) - 計算午休分鐘數(起時, 迄時); + if (日期 == 起日) + return 分鐘數; + else + return 0; + } + // 起始與結束不同天 + else + { + DateTime std = 起日; + + while (std <= 迄日) + { + Init(員工編號, std); + 分鐘數 = 0; + + // 第一天 + if (std == 起日) + { + 分鐘數 = 計算分鐘數(起時, 下班時間) - 計算午休分鐘數(起時, 下班時間); + } + // 最後一天 + else if (std == 迄日) + { + 分鐘數 = 計算分鐘數(上班時間, 迄時) - 計算午休分鐘數(上班時間, 迄時); + } + // 中間其他天 + else + { + 分鐘數 = 上班分鐘數; + } + + if (日期 == std) + return 分鐘數; + + std = std.AddDays(1); + } + } + + return 0; + } + + public static DateTime 轉換時區(string 時區, DateTime 日期, string 時間) + { + // 解析30小時制(小時可能 >= 24,表示跨入隔日凌晨) + var parts = 時間.Split(':'); + var timeSpan = new TimeSpan(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2])); + var sourceTime = 日期.Date.Add(timeSpan); + + if (string.IsNullOrEmpty(時區) || string.Compare(時區, "Taipei Standard Time") == 0) + { + return sourceTime; + } + + // 重要:將 Kind 設為 Unspecified + sourceTime = DateTime.SpecifyKind(sourceTime, DateTimeKind.Unspecified); + + // 轉換到目標時區 + var sourceZone = TimeZoneInfo.FindSystemTimeZoneById("Taipei Standard Time"); + var targetZone = TimeZoneInfo.FindSystemTimeZoneById(時區); + + var utcTime = TimeZoneInfo.ConvertTimeToUtc(sourceTime, sourceZone); + var targetTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, targetZone); + + return targetTime; + } + + public static string 轉換打卡時區(string 時區, DateTime 打卡日期, string 打卡時間) + { + var targetTime = 轉換時區(時區, 打卡日期, 打卡時間); + + // 輸出 30 小時制時分秒 + // 06:00 之前算前一天,小時數加 24 + int outputHours = targetTime.Hour; + if (targetTime.TimeOfDay < new TimeSpan(6, 0, 0)) + outputHours += 24; + + return string.Format("{0:00}:{1:00}:{2:00}", outputHours, targetTime.Minute, targetTime.Second); + } +} + + +/// +/// 30 小時制的日期類別 +/// +public class DateAndTime +{ + /// + /// 台灣工作日期 + /// + public DateTime TwWorkDate; + + /// + /// 台灣日曆日期 + /// + public DateTime TwCalendarDate; + + /// + /// 台灣時間 + /// + public string TwTime; + + /// + /// 當地日期 + /// + public DateTime LocalDate; + + /// + /// 當地時間 + /// + public string LocalTime; + + /// + /// 時區名稱 + /// + public string TimezoneName; + + /// + /// 時區ID + /// + public string TimeZoneID; + + /// + /// 打卡的日期 + /// + public DateTime CardDate; + + public DateAndTime(DateTime twWorkDate, DateTime twCalendarDate, string twTime, DateTime localDate, string localTime, string timezoneName, string timezoneID) : base() + { + TwWorkDate = twWorkDate; + TwCalendarDate = twCalendarDate; + TwTime = twTime; + LocalDate = localDate; + LocalTime = localTime; + TimezoneName = timezoneName; + TimeZoneID = timezoneID; + CardDate = string.IsNullOrEmpty(TimeZoneID) || string.Compare(TimeZoneID, "Taipei Standard Time") == 0 + ? TwWorkDate + : TwCalendarDate; + } + + public static DateAndTime GetNow(string bpeno) + { + var twNow = DateTime.UtcNow.AddHours(8); + var rasnDao = new RasnDAC(WGuard1.Query); + string timezoneID; + string timezoneName; + rasnDao.GetTimeZone(bpeno, twNow, out timezoneID, out timezoneName); + + var twCalendarDate = twNow.Date; + var twWorkDate = twNow.Date; + var localNow = TimeCalc.轉換時區(timezoneID, twNow.Date, twNow.ToString("HH:mm:ss")); + var localDate = localNow.Date; + var twHourOffset = 0; + var localHourOffset = 0; + + // 06:00 之前算前一天 + if (twNow.TimeOfDay < new TimeSpan(6, 0, 0)) + { + twWorkDate = twWorkDate.AddDays(-1); + twHourOffset = 24; + } + if (localNow.TimeOfDay < new TimeSpan(6, 0, 0)) + { + localDate = localDate.AddDays(-1); + localHourOffset = 24; + } + + return new DateAndTime( + twWorkDate, + twCalendarDate, + string.Format("{0:00}:{1:00}:{2:00}", twNow.TimeOfDay.Hours + twHourOffset, twNow.TimeOfDay.Minutes, twNow.Second), + localDate, + string.Format("{0:00}:{1:00}:{2:00}", localNow.TimeOfDay.Hours + localHourOffset, localNow.TimeOfDay.Minutes, localNow.Second), + timezoneName, + timezoneID + ); + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/BhrdDAC.cs b/Web/App_Code/DAC/BhrdDAC.cs new file mode 100644 index 0000000..1ce6004 --- /dev/null +++ b/Web/App_Code/DAC/BhrdDAC.cs @@ -0,0 +1,260 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Collections.Generic; +using Wellan.Data; +using Wellan.Common; +using System.Linq; + +/// +/// 節假日設定檔 +/// +public class BhrdDAC : Wellan.Data.WDAC +{ + private Hashtable bhrdData = new Hashtable(); + private string nationalHolidays = "0101,0228,0501,1010"; + + public const string 排休 = "排休"; + public const string 例假日 = "例假日"; + public const string 休假日 = "休假日"; + public const string 國定假日 = "國定假日"; + public static readonly List 休假日班表 = new List { 排休, 例假日, 休假日, 國定假日 }; + + public BhrdDAC() + { + } + + public BhrdDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BhrdDAC(WQuery query) + { + this._query = query; + } + + public DataTable GetAll() + { + return Query.Select("SELECT BHYER, BHHRD FROM BHRD ORDER BY BHYER"); + } + + public string[] GetYear(int Year) + { + DbCommand cmd = Query.NewCommand("SELECT BHYER, BHHRD FROM BHRD WHERE BHYER=@BHYER"); + cmd.Parameters.Add(Query.NewParameter("BHYER", Year)); + DataTable bhrd = Query.Select(cmd); + string yearData; + + // 有資料,取出該年資料 + if (bhrd.Rows.Count != 0) + { + yearData = bhrd.Rows[0]["BHHRD"].ToString(); + } + // 無資料,回傳預設資料 + else + { + char[] tmp = new char[366]; + for (int i = 0; i < tmp.Length; i++) + { + tmp[i] = ' '; + } + + DateTime aDate = new DateTime(Year, 1, 1); + for (int i = 0; i < tmp.Length; i++) + { + if (aDate.DayOfWeek == DayOfWeek.Sunday || aDate.DayOfWeek == DayOfWeek.Saturday) + tmp[i] = (char)HolidayType.Holiday; + else if (nationalHolidays.Contains(String.Format("{0:00}{1:00}", aDate.Month, aDate.Day))) + tmp[i] = (char)HolidayType.NationalHoliday; + else + tmp[i] = (char)HolidayType.WorkDay; + + aDate = aDate.AddDays(1); + if (aDate.Year != Year) + break; + } + + yearData = new String(tmp); + } + + string[] result = new string[12]; + for (int m = 1; m <= 12; m++) + { + DateTime aDate = new DateTime(Year, m, 1); + result[m - 1] = yearData.Substring(aDate.DayOfYear - 1, WGuard1.GetMonthEnd(aDate, 0).Day); + } + + return result; + } + + private void SetYear(int Year, string[] YearData) + { + DbCommand cmd = Query.NewCommand("SELECT COUNT(1) FROM BHRD WHERE BHYER=@BHYER"); + cmd.Parameters.Add(Query.NewParameter("BHYER", Year)); + int count; + ExecuteScalar(cmd, out count); + if (count == 0) + { + cmd.CommandText = "INSERT INTO BHRD (BHYER, BHHRD, TRDAT, TRMOD, TRUSR) VALUES (@BHYER, @BHHRD, GETDATE(), 'INSERT', 'X001')"; + } + else + { + cmd.CommandText = "UPDATE BHRD SET BHHRD=@BHHRD, TRDAT=GETDATE(), TRMOD='MODIFY', TRUSR='X001' WHERE BHYER=@BHYER"; + } + cmd.Parameters.Add(Query.NewParameter("BHHRD", String.Concat(YearData))); + Query.ExecuteNonQuery(cmd); + } + + public string GetMonth(int Year, int Month) + { + string[] YearData = GetYear(Year); + return YearData[Month - 1]; + } + + public void SetMonth(int Year, int Month, string Value) + { + string[] YearData = GetYear(Year); + YearData[Month - 1] = Value; + SetYear(Year, YearData); + } + + public HolidayType GetDayHolidayType(DateTime aDateTime) + { + string bhhrd = ""; + if (!bhrdData.Contains(aDateTime.Year)) + { + DbCommand cmd = Query.NewCommand("SELECT BHHRD FROM BHRD WHERE BHYER=@BHYER"); + cmd.Parameters.Add(Query.NewParameter("BHYER", aDateTime.Year)); + if (ExecuteScalar(cmd, out bhhrd)) + bhrdData.Add(aDateTime.Year, bhhrd); + } + else + { + bhhrd = bhrdData[aDateTime.Year].ToString(); + } + + if (bhhrd != "") + { + // 有節假日資料,找出該日之節假日資料 + char theDay; + try + { + theDay = bhhrd[aDateTime.DayOfYear - 1]; + } + catch + { + theDay = ' '; + } + + switch ((HolidayType)theDay) + { + case HolidayType.WorkDay: // 上班日 + case HolidayType.CompensatoryWorkDay: // 補班 + case HolidayType.NationalHoliday: // 國定假日或民俗假 + case HolidayType.Holiday: // 例假日 + case HolidayType.ElasticRest: // 彈性休假 + case HolidayType.TyphoonRest: // 颱風假 + case HolidayType.VoteRest: // 選舉假 + case HolidayType.CompanyActivity: // 公司活動 + return (HolidayType)theDay; + default: + if (nationalHolidays.Contains(aDateTime.ToString("MMdd"))) + return HolidayType.NationalHoliday; + else if (aDateTime.DayOfWeek == DayOfWeek.Sunday || aDateTime.DayOfWeek == DayOfWeek.Saturday) + return HolidayType.Holiday; + else + return HolidayType.WorkDay; + } + } + else + { + // 若無節假日資料,則週六、週日為假日 + if (nationalHolidays.Contains(aDateTime.ToString("MMdd"))) + return HolidayType.NationalHoliday; + else if (aDateTime.DayOfWeek == DayOfWeek.Sunday || aDateTime.DayOfWeek == DayOfWeek.Saturday) + return HolidayType.Holiday; + else + return HolidayType.WorkDay; + } + } + + public bool IsHoliday(string bpeno, DateTime aDateTime) + { + // 先看班表有沒有資料 + RtmeDAC rtmeDao = new RtmeDAC(); + var rtme = rtmeDao.SelectDay(bpeno, aDateTime).FirstOrDefault(); + if (rtme != null && !string.IsNullOrEmpty(rtme.RTTID.Trim())) + { + return ItemIsHoliday(rtme.RTTID.Trim()); + } + + // 若沒有班表資料,用行事曆資料判斷是否需要上班 + HolidayType theDay = GetDayHolidayType(aDateTime); + + switch (theDay) + { + case HolidayType.WorkDay: // 上班日 + case HolidayType.CompensatoryWorkDay: // 補班 + return false; + case HolidayType.NationalHoliday: // 國定假日或民俗假 + case HolidayType.Holiday: // 例假日 + case HolidayType.ElasticRest: // 彈性休假 + case HolidayType.TyphoonRest: // 颱風假 + case HolidayType.VoteRest: // 選舉假 + case HolidayType.CompanyActivity: // 公司活動 + return true; + default: + return false; + } + } + + public static bool ItemIsHoliday(string item) + { + return 休假日班表.IndexOf(item.Trim()) >= 0; + } +} + +public enum HolidayType +{ + /// + /// 無資料 + /// + Null = ' ', + /// + /// 上班日 + /// + WorkDay = '-', + /// + /// 補班 + /// + CompensatoryWorkDay = 'B', + /// + /// 國定假日或民俗假 + /// + NationalHoliday = 'N', + /// + /// 例假日 + /// + Holiday = 'H', + /// + /// 彈性休假 + /// + ElasticRest = 'V', + /// + /// 颱風假 + /// + TyphoonRest = 'T', + /// + /// 選舉假 + /// + VoteRest = 'E', + /// + /// 公司活動 + /// + CompanyActivity = 'A' +} diff --git a/Web/App_Code/DAC/BpaaDAC.cs b/Web/App_Code/DAC/BpaaDAC.cs new file mode 100644 index 0000000..6f472fb --- /dev/null +++ b/Web/App_Code/DAC/BpaaDAC.cs @@ -0,0 +1,328 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using Wellan.Common; +using Wellan.Data; + +/// +/// 取得專案年度接單資料 +/// +public class BpaaDAC : Wellan.Data.WDAC +{ + public BpaaDAC() + { + } + + public BpaaDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BpaaDAC(WQuery query) + { + this._query = query; + } + + /// + /// 取得所有年度專案計畫代號與名稱,不含總公司 + /// 20141230 修改,必定包含 103 年度新譽與展譽 + /// + /// + public DataTable GetBpaa() + { + DbCommand cmd = Query.NewCommand( + @"SELECT BPPYN, BPPYM FROM + ( + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 4 CLS + FROM BPAA WHERE (BPCSD IS NULL) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 3 CLS + -- 移除展育 + -- FROM BPAA WHERE BPPYN = '103JYB00001' OR BPPYN = '103TYB00001' + FROM BPAA WHERE BPPYN = '103TYB00001' + ) AS TMP1 + ORDER BY CLS, BPPYN"); + return Query.Select(cmd); + } + + /// + /// 取得指定年度專案計畫代號與名稱,不含總公司 + /// 20141230 修改,必定包含 103 年度新譽與展譽 + /// + /// 指定年度 + /// + public DataTable GetBpaa(int year) + { + DbCommand cmd = Query.NewCommand( + @"SELECT BPPYN, BPPYM FROM + ( + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 4 CLS + FROM BPAA WHERE (BPYER=@BPYER) AND (BPCSD IS NULL) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 3 CLS + -- 移除展育 + -- FROM BPAA WHERE BPPYN = '103JYB00001' OR BPPYN = '103TYB00001' + FROM BPAA WHERE BPPYN = '103TYB00001' + ) AS TMP1 + ORDER BY CLS, BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPYER", year - WGuard1.CY11)); + return Query.Select(cmd); + } + + /// + /// 取得所有年度專案計畫代號與名稱,含總公司 + /// 20141230 修改,必定包含 103 年度新譽與展譽 + /// + /// + public DataTable GetBpaaWithTY() + { + DbCommand cmd = Query.NewCommand( + @"SELECT BPPYN, BPPYM FROM + ( + SELECT '000000001' BPPYN, '【非專案人員】' BPPYM, 2 CLS + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 4 CLS + FROM BPAA WHERE (BPCSD IS NULL) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 3 CLS + -- 移除展育 + -- FROM BPAA WHERE BPPYN = '103JYB00001' OR BPPYN = '103TYB00001' + FROM BPAA WHERE BPPYN = '103TYB00001' + ) AS TMP1 + ORDER BY CLS, BPPYN"); + return Query.Select(cmd); + } + + /// + /// 取得所有年度專案計畫代號與名稱,含總公司,並加上一個空項目 + /// 20141230 修改,必定包含 103 年度新譽與展譽 + /// + /// + public DataTable GetBpaaWithTYPlusNone() + { + DbCommand cmd = Query.NewCommand( + @"SELECT BPPYN, BPPYM FROM + ( + SELECT '' BPPYN, '【全部】' BPPYM, 1 CLS + UNION + SELECT '000000001' BPPYN, '【非專案人員】' BPPYM, 2 CLS + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 4 CLS + FROM BPAA WHERE (BPCSD IS NULL) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 3 CLS + -- 移除展育 + -- FROM BPAA WHERE BPPYN = '103JYB00001' OR BPPYN = '103TYB00001' + FROM BPAA WHERE BPPYN = '103TYB00001' + ) AS TMP1 + ORDER BY CLS, BPPYN"); + return Query.Select(cmd); + } + + /// + /// 取得指定年度專案計畫代號與名稱,含總公司 + /// 20141230 修改,必定包含 103 年度新譽與展譽 + /// + /// 指定年度 + /// + public DataTable GetBpaaWithTY(int year) + { + DbCommand cmd = Query.NewCommand( + @"SELECT BPPYN, BPPYM FROM + ( + SELECT '' BPPYN, '【全部】' BPPYM, 1 CLS + UNION + SELECT '000000001' BPPYN, '【非專案人員】' BPPYM, 2 CLS + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 3 CLS + -- 移除展育 + -- FROM BPAA WHERE BPPYN = '103JYB00001' OR BPPYN = '103TYB00001' + FROM BPAA WHERE BPPYN = '103TYB00001' + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 4 CLS + FROM BPAA WHERE (BPYER=@BPYER) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') + ) AS TMP1 + ORDER BY CLS, BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPYER", year - WGuard1.CY11)); + return Query.Select(cmd); + } + + /// + /// 取得指定年度專案計畫代號與名稱,含總公司,並加上一個空項目 + /// 20141230 修改,必定包含 103 年度新譽與展譽 + /// + /// 指定年度 + /// + public DataTable GetBpaaWithTYPlusNone(int year) + { + DbCommand cmd = Query.NewCommand( + @"SELECT BPPYN, BPPYM FROM + ( + SELECT '' BPPYN, '【全部】' BPPYM, 1 CLS + UNION + SELECT '000000001' BPPYN, '【非專案人員】' BPPYM, 2 CLS + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 4 CLS + FROM BPAA WHERE (BPYER=@BPYER) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 3 CLS + -- 移除展育 + -- FROM BPAA WHERE BPPYN = '103JYB00001' OR BPPYN = '103TYB00001' + FROM BPAA WHERE BPPYN = '103TYB00001' + ) AS TMP1 + ORDER BY CLS, BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPYER", year - WGuard1.CY11)); + return Query.Select(cmd); + } + + /// + /// 取得指定年度專案計畫代號與名稱,含總公司 + /// + public DataTable GetBpaaWithTYPlusNone(int yearFrom, int yearTo) + { + return GetBpaa(yearFrom, yearTo, true); + } + + /// + /// 取得指定年度專案計畫代號與名稱,含總公司 + /// + public DataTable GetBpaaWithTYPlusNoneNotCheckYear(int yearFrom, int yearTo) + { + return GetBpaa(yearFrom, yearTo, false); + } + + /// + /// 取得指定年度專案計畫代號與名稱,含總公司 + /// 20141230 修改,必定包含 103 年度新譽與展譽 + /// + /// 指定年度 + /// + public DataTable GetBpaa(int yearFrom, int yearTo, bool checkYearEqual) + { + if (yearTo <= 0) yearTo = yearFrom; + + DbCommand cmd; + if (yearFrom == yearTo || !checkYearEqual) + { + cmd = Query.NewCommand( + @"SELECT BPPYN, BPPYM FROM + ( + SELECT '' BPPYN, '【全部】' BPPYM, 1 CLS + UNION + SELECT '000000001' BPPYN, '【非專案人員】' BPPYM, 2 CLS + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 3 CLS + -- 移除展育的選項 + -- FROM BPAA WHERE BPPYN = '103JYB00001' OR BPPYN = '103TYB00001' + FROM BPAA WHERE BPPYN = '103TYB00001' + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 4 CLS + FROM BPAA WHERE (BPYER = @BPYER1) AND (BPPYN <> '000000001') AND (BPPNM <> 'JYB00001') AND (BPPNM <> 'TYB00001') + ) AS TMP1 + ORDER BY CLS, BPPYN"); + } + else + { + cmd = Query.NewCommand( + @"SELECT BPPYN, BPPYM FROM + ( + SELECT '' BPPYN, '【全部】' BPPYM, 1 CLS + UNION + SELECT '000000001' BPPYN, '【非專案人員】' BPPYM, 2 CLS + -- UNION + -- SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 3 CLS + -- FROM BPAA WHERE BPPYN = '103JYB00001' OR BPPYN = '103TYB00001' + UNION + SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM, 4 CLS + FROM BPAA WHERE (BPYER>=@BPYER1 AND BPYER<=@BPYER2) AND (BPPYN <> '000000001') AND (BPPNM <> 'JYB00001') AND (BPPNM <> 'TYB00001') + ) AS TMP1 + ORDER BY CLS, BPPYN"); + } + cmd.Parameters.Add(Query.NewParameter("BPYER1", yearFrom - WGuard1.CY11)); + cmd.Parameters.Add(Query.NewParameter("BPYER2", yearTo - WGuard1.CY11)); + return Query.Select(cmd); + } + + /// + /// 取得加班時數計算方式 + /// + /// 年度專案計畫編號 + /// 1=計算至小時,2=計算至分鐘 + public string GetOverTimeType(string BPPYN) + { + DbCommand cmd = Query.NewCommand("SELECT BPOTT FROM BPAA WHERE BPPYN=@BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", BPPYN)); + string s = WDAC.GetStringValue(Query.ExecuteScalar(cmd)); + return s == "1" || s == "2" ? s : "1"; + } + + /// + /// 取得上下班時間 + /// + /// + /// + //public void GetTime(string bppyn, out string bpstm, out string bpetm) + //{ + // bpstm = WGuard1.WSetR("UNRPARTIME", 1); + // bpetm = WGuard1.WSetR("UNRPARTIME", 2); + + // DbCommand cmd1 = Query.NewCommand("SELECT BPPNM FROM BPAA WHERE BPPYN=@BPPYN"); + // cmd1.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); + // string bppnm = WDAC.GetStringValue(Query.ExecuteScalar(cmd1)); + + // if (string.IsNullOrEmpty(bppnm)) + // return; + + // DbCommand cmd2 = Query.NewCommand("SELECT BPSTM, BPETM FROM BPRJ WHERE BPPNM=@BPPNM"); + // cmd1.Parameters.Add(Query.NewParameter("BPPNM", bppnm)); + // DataTable dt = Query.Select(cmd2); + + // if (dt.Rows.Count == 0) + // return; + + // string bpstm1 = WDAC.GetStringValue(dt.Rows[0]["BPSTM"]); + // string bpetm1 = WDAC.GetStringValue(dt.Rows[0]["BPETM"]); + + // string[] timepart = bpstm1.Split(':'); + // if (timepart.Length >= 2) + // bpstm = timepart[0].PadRight(2, '0') + timepart[1].PadRight(2, '0'); + + // timepart = bpetm1.Split(':'); + // if (timepart.Length >= 2) + // bpetm = timepart[0].PadRight(2, '0') + timepart[1].PadRight(2, '0'); + //} + + /// + /// 取得年初特休計算方式 + /// + /// 年度專案計畫編號 + /// S=加總上年生效(正數) / Z=年初時數為0 + public string GetYearBeginAnnualLeaveType(string BPPYN) + { + DbCommand cmd = Query.NewCommand("SELECT BPALT FROM BPAA WHERE BPPYN=@BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", BPPYN)); + string s = WDAC.GetStringValue(Query.ExecuteScalar(cmd)); + return s == "S" || s == "Z" ? s : "Z"; + } + + /// + /// 取得年度專案計畫代號對應的班表編號 + /// + /// 年度專案計畫編號 + /// 班表編號 + public string GetTimeTableNo(string BPPYN) + { + DbCommand cmd = Query.NewCommand("SELECT BPPNM FROM BPAA WHERE BPPYN=@BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", BPPYN)); + var bppnm = WDAC.GetStringValue(Query.ExecuteScalar(cmd)); + + cmd.CommandText = "SELECT BPTME FROM BPRJ WHERE BPPNM=@BPPNM"; + cmd.Parameters.Clear(); + cmd.Parameters.Add(Query.NewParameter("BPPNM", bppnm)); + return WDAC.GetStringValue(Query.ExecuteScalar(cmd)); + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/BpapDAC.cs b/Web/App_Code/DAC/BpapDAC.cs new file mode 100644 index 0000000..7aec073 --- /dev/null +++ b/Web/App_Code/DAC/BpapDAC.cs @@ -0,0 +1,126 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Collections.Generic; +using Wellan.Data; +using Wellan.Common; +using System.Transactions; +using System.ComponentModel; + +/// +/// 外部人員帳號資料檔 +/// +[DataObject] +public class BpapDAC : Wellan.Data.WDAC +{ + private string _select = + @" SELECT BPENO, BPNME, BPPWD, BPEML, BPZON, BPBRH, TRDAT, TRMOD, TRUSR FROM BPAP "; + private string _insert = + @"INSERT INTO dbo.BPAP + (BPENO, BPNME, BPPWD, BPEML, BPZON, BPBRH, TRDAT, TRMOD, TRUSR) + VALUES + (@BPENO, @BPNME, @BPPWD, @BPEML, @BPZON, @BPBRH, GETDATE(), 'INSERT', @TRUSR)"; + private string _update = + @"UPDATE BPAP SET + BPNME = @BPNME, + BPEML = @BPEML, + BPZON = @BPZON, + BPBRH = @BPBRH, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @TRUSR + WHERE BPENO = @OLD_BPENO"; + private string _delete = + @"DELETE FROM BPAP + WHERE BPENO = @OLD_BPENO"; + + public BpapDAC() + { + } + + public BpapDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BpapDAC(WQuery query) + { + this._query = query; + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectAll() + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _select + " ORDER BY BPENO "; + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectOne(string BPENO) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _select + " WHERE BPENO=@BPENO "; + AddParam(cmd, "BPENO", BPENO); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Insert)] + public void InsertOne(string BPNME, string BPEML, string BPZON, string BPBRH, string TRUSR) + { + string BPENO = WGuard1.WNextRen(DateTime.UtcNow.AddHours(8).Date, "BPAP", "BPENO", "\"Z\"<999>", ""); + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _insert; + AddParam(cmd, "BPENO", BPENO); + AddParam(cmd, "BPNME", BPNME); + AddParam(cmd, "BPPWD", WGuard1.KeyEnc(BPENO)); + AddParam(cmd, "BPEML", BPEML); + AddParam(cmd, "BPZON", BPZON); + AddParam(cmd, "BPBRH", BPBRH); + AddParam(cmd, "TRUSR", TRUSR); + Query.ExecuteNonQuery(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Update)] + public void UpdateOne(string OLD_BPENO, string BPENO, string BPNME, string BPEML, string BPZON, string BPBRH, string TRUSR) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _update; + AddParam(cmd, "BPNME", BPNME); + AddParam(cmd, "BPEML", BPEML); + AddParam(cmd, "BPZON", BPZON); + AddParam(cmd, "BPBRH", BPBRH); + AddParam(cmd, "TRUSR", TRUSR); + AddParam(cmd, "OLD_BPENO", OLD_BPENO); + Query.ExecuteNonQuery(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Delete)] + public void DeleteOne(string OLD_BPENO) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _delete; + AddParam(cmd, "OLD_BPENO", OLD_BPENO); + Query.ExecuteNonQuery(cmd); + } + + /// + /// 取得人員電子郵件 + /// + /// + /// + public string GetEmail(string bpeno) + { + DbCommand cmd = Query.NewCommand(@" + SELECT BPEML + FROM BPAP + WHERE BPENO=@BPENO"); + AddParam(cmd, "BPENO", bpeno); + return GetStringValue(Query.ExecuteScalar(cmd)); + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/BprjDAC.cs b/Web/App_Code/DAC/BprjDAC.cs new file mode 100644 index 0000000..f076854 --- /dev/null +++ b/Web/App_Code/DAC/BprjDAC.cs @@ -0,0 +1,31 @@ +using System; +using System.Linq; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Collections.Generic; +using Wellan.Data; +using Wellan.Common; + +/// +/// BprjDAC 的摘要描述 +/// +public class BprjDAC : Wellan.Data.WDAC +{ + public BprjDAC() + { + } + + public BprjDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BprjDAC(WQuery query) + { + this._query = query; + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/BprmDAC.cs b/Web/App_Code/DAC/BprmDAC.cs new file mode 100644 index 0000000..9b38681 --- /dev/null +++ b/Web/App_Code/DAC/BprmDAC.cs @@ -0,0 +1,66 @@ +using System; +using System.Data; +using System.Configuration; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; + +/// +/// 用來取得專案處理人員資料的類別 +/// +public class BprmDAC : Wellan.Data.WDAC +{ + public BprmDAC() + { + } + + public BprmDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BprmDAC(WQuery query) + { + this._query = query; + } + + /// + /// 取得某使用者是否有處理某專案的權限 + /// + /// 年度專案編號 + /// + /// + public bool GetRight(string bppyn, string bpeno) + { + DbCommand cmd = Query.NewCommand( + //@"SELECT COUNT(1) FROM BPRM A + // INNER JOIN BPAA B ON A.BPPNM=B.BPPNM + // WHERE B.BPPYN=@BPPYN AND BPENO=@BPENO"); + @"SELECT COUNT(1) FROM BPRM + WHERE BPPNM=@BPPYN AND BPENO=@BPENO"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn.Length > 3 ? bppyn.Substring(3) : bppyn)); + cmd.Parameters.Add(Query.NewParameter("BPENO", bpeno)); + int i; + ExecuteScalar(cmd, out i); + return i > 0; + } + + public DataTable SelectBy年度接單編號(string BPPYN) + { + DbCommand cmd = Query.NewCommand( + @"SELECT A.BPENO, C.BPNME, C.BPEML + FROM BPRM A + JOIN BPAA B ON A.BPPNM = B.BPPNM + JOIN BPSNView C ON A.BPENO = C.BPENO + WHERE B.BPPYN = @BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", BPPYN)); + return Query.Select(cmd); + } +} diff --git a/Web/App_Code/DAC/BpseDAC.cs b/Web/App_Code/DAC/BpseDAC.cs new file mode 100644 index 0000000..00a350e --- /dev/null +++ b/Web/App_Code/DAC/BpseDAC.cs @@ -0,0 +1,131 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Collections.Generic; +using Wellan.Data; +using Wellan.Common; +using System.Transactions; +using System.ComponentModel; + +/// +/// BPSE 片語資料表資料處理類別 +/// +[DataObject] +public class BpseDAC : Wellan.Data.WDAC +{ + public BpseDAC() + { + } + + public BpseDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BpseDAC(WQuery query) + { + this._query = query; + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectAll() + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT BPTYP, BPCNT + FROM BPSE + ORDER BY BPTYP, BPCNT"; + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectOne(string BPTYP, string BPCNT) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT BPTYP, BPCNT + FROM BPSE + WHERE BPTYP=@BPTYP + AND BPCNT=@BPCNT"; + Query.AddParam(cmd, "BPTYP", BPTYP); + Query.AddParam(cmd, "BPCNT", BPCNT); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select片語類別() + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT DISTINCT BPTYP + FROM BPSE ORDER BY BPTYP"; + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select片語By類別(string BPTYP) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT BPCNT + FROM BPSE + WHERE BPTYP=@BPTYP AND BPENB=1 + ORDER BY BPORD, BPCNT"; + Query.AddParam(cmd, "BPTYP", BPTYP); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Insert)] + public void InsertOne(string BPTYP, string BPCNT, string UserId) + { + if (SelectOne(BPTYP, BPCNT).Rows.Count == 0) + { + DbCommand cmdInsert = Query.NewCommand(); + cmdInsert.CommandText = + @"INSERT INTO BPSE (BPTYP, BPCNT, TRDAT, TRMOD, TRUSR) + VALUES (@BPTYP, @BPCNT, GETDATE(), 'INSERT', @TRUSR)"; + Query.AddParam(cmdInsert, "BPTYP", BPTYP); + Query.AddParam(cmdInsert, "BPCNT", BPCNT); + Query.AddParam(cmdInsert, "TRUSR", UserId); + Query.ExecuteNonQuery(cmdInsert); + } + } + + [DataObjectMethod(DataObjectMethodType.Update)] + public void UpdateOne(string OLD_BPTYP, string OLD_BPCNT, string BPTYP, string BPCNT, string UserId) + { + DbCommand cmdUpdate = Query.NewCommand(); + cmdUpdate.CommandText = + @"UPDATE BPSE SET + BPTYP = @BPTYP, + BPCNT = @BPCNT, + TRDAT = GETDATE(), + TRMOD = 'MODIFY', + TRUSR = @TRUSR + WHERE BPTYP=@OLD_BPTYP + AND BPCNT=@OLD_BPCNT"; + Query.AddParam(cmdUpdate, "BPTYP", BPTYP); + Query.AddParam(cmdUpdate, "BPCNT", BPCNT); + Query.AddParam(cmdUpdate, "TRUSR", UserId); + Query.AddParam(cmdUpdate, "OLD_BPTYP", OLD_BPTYP); + Query.AddParam(cmdUpdate, "OLD_BPCNT", OLD_BPCNT); + Query.ExecuteNonQuery(cmdUpdate); + } + + [DataObjectMethod(DataObjectMethodType.Delete)] + public void DeleteOne(string OLD_BPTYP, string OLD_BPCNT) + { + DbCommand cmdDelete = Query.NewCommand(); + cmdDelete.CommandText = + @"DELETE FROM BPSE + WHERE BPTYP=@OLD_BPTYP + AND BPCNT=@OLD_BPCNT"; + Query.AddParam(cmdDelete, "OLD_BPTYP", OLD_BPTYP); + Query.AddParam(cmdDelete, "OLD_BPCNT", OLD_BPCNT); + Query.ExecuteNonQuery(cmdDelete); + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/BpslDAC.cs b/Web/App_Code/DAC/BpslDAC.cs new file mode 100644 index 0000000..7d5e676 --- /dev/null +++ b/Web/App_Code/DAC/BpslDAC.cs @@ -0,0 +1,531 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Text; +using System.ComponentModel; +using Wellan.Data; + +/// +/// 薪資資料與薪資異動資料的資料處理類別 +/// +[DataObject(true)] +public class BpslDAC : Wellan.Data.WDAC +{ + private DbCommand cmdSelectBpslBpeno; + private DbCommand cmdSelectRpsl; + private DbCommand cmdSelectBpslOne; + private DbCommand cmdSelectRpslOne; + private DbCommand cmdSelectRpslAll; + private DbCommand cmdSelectBpsl2; + + public BpslDAC() + { + // 取出最後一筆異動 + cmdSelectRpsl = Query.NewCommand( + @"SELECT TOP 1 RPENO BPENO, RPITM BPITM, RPBDT BPBDT, RPSRM BPSRM, RPSRD BPSRD, + RPP01 BPP01, RPP02 BPP02, RPP03 BPP03, RPP04 BPP04, RPP05 BPP05, APPNO + FROM RPSL WHERE RPENO=@BPENO ORDER BY BPITM DESC"); + cmdSelectRpsl.Parameters.Add(Query.NewParameter("BPENO", DbType.String)); + + // 取出員工薪資資料 + cmdSelectBpslOne = Query.NewCommand( + @"SELECT *, 0 BPITM, NULL BPBDT FROM BPSL WHERE BPENO=@BPENO"); + cmdSelectBpslOne.Parameters.Add(Query.NewParameter("BPENO", DbType.String)); + + // 取出某一筆薪資異動資料 + cmdSelectRpslOne = Query.NewCommand( + @"SELECT RPENO BPENO, RPITM BPITM, RPBDT BPBDT, RPSRM BPSRM, RPSRD BPSRD, + RPP01 BPP01, RPP02 BPP02, RPP03 BPP03, RPP04 BPP04, RPP05 BPP05, APPNO + FROM RPSL WHERE RPENO=@BPENO AND RPITM=@BPITM"); + cmdSelectRpslOne.Parameters.Add(Query.NewParameter("BPENO", DbType.String)); + cmdSelectRpslOne.Parameters.Add(Query.NewParameter("BPITM", DbType.Int32)); + + // 取出某員工編號全部的紀錄,以異動次數排序 + cmdSelectRpslAll = Query.NewCommand( + @"SELECT BPENO, 0 BPITM, NULL BPBDT, BPSRM, BPSRD, + BPP01, BPP02, BPP03, BPP04, BPP05, APPNO + FROM BPSL + WHERE BPENO=@BPENO + UNION + SELECT RPENO BPENO, RPITM BPITM, RPBDT BPBDT, RPSRM BPSRM, RPSRD BPSRD, + RPP01 BPP01, RPP02 BPP02, RPP03 BPP03, RPP04 BPP04, RPP05 BPP05, APPNO + FROM RPSL + WHERE RPENO=@BPENO + ORDER BY BPITM"); + cmdSelectRpslAll.Parameters.Add(Query.NewParameter("BPENO", DbType.String)); + + // 取出某員工編號全部的紀錄,以生效日期排序 + cmdSelectBpsl2 = Query.NewCommand( + @"SELECT BPENO, 0 BPITM, '1899/12/31' BPBDT, BPSRM, BPSRD, + BPP01, BPP02, BPP03, BPP04, BPP05, APPNO + FROM BPSL + WHERE BPENO=@BPENO + UNION + SELECT RPENO BPENO, RPITM BPITM, RPBDT BPBDT, RPSRM BPSRM, RPSRD BPSRD, + RPP01 BPP01, RPP02 BPP02, RPP03 BPP03, RPP04 BPP04, RPP05 BPP05, APPNO + FROM RPSL + WHERE RPENO=@BPENO + ORDER BY BPBDT"); + cmdSelectBpsl2.Parameters.Add(Query.NewParameter("BPENO", DbType.String)); + } + + public BpslDAC(string connectionConfig, string connectionConfigName) + : this() + { + base._connectionConfig = connectionConfig; + base._connectionConfigName = connectionConfigName; + } + + public BpslDAC(WQuery query) + : this() + { + base._query = query; + } + + private DataTable NewResult() + { + // 準備輸出資料架構 + DataTable Result = new DataTable(); + Result.Columns.Add("BPENO", typeof(String)); + Result.Columns.Add("BPITM", typeof(Int32)); + Result.Columns.Add("BPBDT", typeof(DateTime)); + Result.Columns.Add("BPSRM", typeof(Int32)); + Result.Columns.Add("BPSRD", typeof(Int32)); + Result.Columns.Add("BPP01", typeof(Int32)); + Result.Columns.Add("BPP02", typeof(Int32)); + Result.Columns.Add("BPP03", typeof(Int32)); + Result.Columns.Add("BPP04", typeof(Int32)); + Result.Columns.Add("BPP05", typeof(Int32)); + Result.Columns.Add("APPNO", typeof(Int32)); + Result.Columns.Add("BPSRM_Changed", typeof(Char)); + Result.Columns.Add("BPSRD_Changed", typeof(Char)); + Result.Columns.Add("BPP01_Changed", typeof(Char)); + Result.Columns.Add("BPP02_Changed", typeof(Char)); + Result.Columns.Add("BPP03_Changed", typeof(Char)); + Result.Columns.Add("BPP04_Changed", typeof(Char)); + Result.Columns.Add("BPP05_Changed", typeof(Char)); + + return Result; + } + + private void FillResult(DataTable Result, DataRow source) + { + DataRow newRow = Result.NewRow(); + newRow["BPENO"] = source["BPENO"]; + newRow["BPITM"] = source["BPITM"]; + newRow["BPBDT"] = source["BPBDT"]; + newRow["BPSRM"] = source["BPSRM"]; + newRow["BPSRD"] = source["BPSRD"]; + newRow["BPP01"] = source["BPP01"]; + newRow["BPP02"] = source["BPP02"]; + newRow["BPP03"] = source["BPP03"]; + newRow["BPP04"] = source["BPP04"]; + newRow["BPP05"] = source["BPP05"]; + newRow["APPNO"] = source["APPNO"]; + newRow["BPSRM_Changed"] = 'N'; + newRow["BPSRD_Changed"] = 'N'; + newRow["BPP01_Changed"] = 'N'; + newRow["BPP02_Changed"] = 'N'; + newRow["BPP03_Changed"] = 'N'; + newRow["BPP04_Changed"] = 'N'; + newRow["BPP05_Changed"] = 'N'; + Result.Rows.Add(newRow); + } + + private Char FieldDiff(object obj1, object obj2) + { + string s1 = obj1 != DBNull.Value ? obj1.ToString() : ""; + string s2 = obj2 != DBNull.Value ? obj2.ToString() : ""; + if (s1.CompareTo(s2) != 0) + return 'Y'; + else + return 'N'; + } + + private void FillResult(DataTable Result, DataRow current, DataRow prev) + { + DataRow newRow = Result.NewRow(); + newRow["BPENO"] = current["BPENO"]; + newRow["BPITM"] = current["BPITM"]; + newRow["BPBDT"] = current["BPBDT"]; + newRow["BPSRM"] = current["BPSRM"]; + newRow["BPSRD"] = current["BPSRD"]; + newRow["BPP01"] = current["BPP01"]; + newRow["BPP02"] = current["BPP02"]; + newRow["BPP03"] = current["BPP03"]; + newRow["BPP04"] = current["BPP04"]; + newRow["BPP05"] = current["BPP05"]; + newRow["APPNO"] = current["APPNO"]; + newRow["BPSRM_Changed"] = FieldDiff(current["BPSRM"], prev["BPSRM"]); + newRow["BPSRD_Changed"] = FieldDiff(current["BPSRD"], prev["BPSRD"]); + newRow["BPP01_Changed"] = FieldDiff(current["BPP01"], prev["BPP01"]); + newRow["BPP02_Changed"] = FieldDiff(current["BPP02"], prev["BPP02"]); + newRow["BPP03_Changed"] = FieldDiff(current["BPP03"], prev["BPP03"]); + newRow["BPP04_Changed"] = FieldDiff(current["BPP04"], prev["BPP04"]); + newRow["BPP05_Changed"] = FieldDiff(current["BPP05"], prev["BPP05"]); + Result.Rows.Add(newRow); + } + + /// + /// 依條件取出資料,給 GridView 的 Select 用的 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select(string BPENO, string BPNME) + { + if (cmdSelectBpslBpeno == null) + cmdSelectBpslBpeno = Query.NewCommand(); + cmdSelectBpslBpeno.Parameters.Clear(); + + // 清空輸出資料表 + DataTable Result = NewResult(); + + // 依條件抓出員工編號 + StringBuilder sb = new StringBuilder(); + sb.Append("SELECT A.BPENO FROM BPSL A INNER JOIN BPSNView B ON A.BPENO=B.BPENO WHERE 1=1 "); + if (BPENO != null && BPENO.Length > 0) + { + sb.Append(" AND A.BPENO LIKE @BPENO "); + cmdSelectBpslBpeno.Parameters.Add(Query.NewParameter("BPENO", BPENO + "%")); + } + if (BPNME != null && BPNME.Length > 0) + { + sb.Append(" AND B.BPNME LIKE @BPNME "); + cmdSelectBpslBpeno.Parameters.Add(Query.NewParameter("BPNME", BPNME + "%")); + } + cmdSelectBpslBpeno.CommandText = sb.ToString(); + DataTable bpenoTmp = Query.Select(cmdSelectBpslBpeno); + + DataTable bpslTmp; + // 一筆一筆的抓出應該顯示的資料 + foreach (DataRow bpenoRow in bpenoTmp.Rows) + { + // 依照員工編號,抓出最後一筆異動 + cmdSelectRpsl.Parameters[0].Value = bpenoRow[0]; + bpslTmp = Query.Select(cmdSelectRpsl); + + // 有異動資料,填入異動資料 + if (bpslTmp.Rows.Count != 0) + { + FillResult(Result, bpslTmp.Rows[0]); + } + // 沒有異動資料,填入原始資料 + else + { + cmdSelectBpslOne.Parameters[0].Value = bpenoRow[0]; + bpslTmp = Query.Select(cmdSelectBpslOne); + FillResult(Result, bpslTmp.Rows[0]); + } + } + + return Result; + } + + /// + /// 取出最新資料,給 FormView 的 Select 用的 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectOne(string BPENO, int BPITM) + { + return SelectOne(BPENO, BPITM, null); + } + + /// + /// 取出某一筆薪資異動資料 + /// + public DataTable SelectOne(string BPENO, int BPITM, DbTransaction tran) + { + DataTable Result = NewResult(); + + if (BPENO != null && BPENO.Length > 0) + { + // 取原始資料 + if (BPITM == 0) + { + cmdSelectBpslOne.Parameters[0].Value = BPENO; + DataTable tmp; + if (tran == null) + tmp = Query.Select(cmdSelectBpslOne); + else + tmp = Query.Select(cmdSelectBpslOne, tran); + if (tmp.Rows.Count > 0) + FillResult(Result, tmp.Rows[0]); + } + else + { + cmdSelectRpslOne.Parameters[0].Value = BPENO; + cmdSelectRpslOne.Parameters[1].Value = BPITM; + DataTable tmp; + if (tran == null) + tmp = Query.Select(cmdSelectRpslOne); + else + tmp = Query.Select(cmdSelectRpslOne, tran); + if (tmp.Rows.Count > 0) + FillResult(Result, tmp.Rows[0]); + } + } + return Result; + } + + /// + /// 取出所有薪資異動歷史資料,薪資異動查詢用 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectRPSL(string BPENO) + { + DataTable Result = NewResult(); + + if (BPENO != null && BPENO.Length > 0) + { + cmdSelectRpslAll.Parameters[0].Value = BPENO; + DataTable tmp = Query.Select(cmdSelectRpslAll); + for (int i = 0; i < tmp.Rows.Count; i++) + { + if (i > 0) + FillResult(Result, tmp.Rows[i], tmp.Rows[i - 1]); + else + FillResult(Result, tmp.Rows[i]); + } + } + return Result; + } + + /// + /// 取出日期區間內薪資基本資料以及薪資異動資料 + /// + public DataTable SelectBPSLDateRange(string bpeno, DateTime startDay, DateTime endDay, DbTransaction tran) + { + DataTable Result = NewResult(); + + if (bpeno != null && bpeno.Length > 0) + { + cmdSelectBpsl2.Parameters[0].Value = bpeno; + DataTable tmp = Query.Select(cmdSelectBpsl2, tran); + int startIndex = -1; + int endIndex = -1; + for (int i = 0; i < tmp.Rows.Count; i++) + { + DateTime bpbdt = Convert.ToDateTime(tmp.Rows[i]["BPBDT"]); + if (startDay >= bpbdt) + startIndex = i; + if (endDay >= bpbdt) + endIndex = i; + } + + if (startIndex != -1 && endIndex != -1) + { + for (int i = startIndex; i <= endIndex; i++) + { + FillResult(Result, tmp.Rows[i]); + } + } + } + return Result; + } + + /// + /// 取出某一筆薪資異動紀錄 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectRPSLOne(string BPENO, int BPITM) + { + DataTable Result = NewResult(); + + if (BPENO != null && BPENO.Length > 0) + { + cmdSelectRpslAll.Parameters[0].Value = BPENO; + DataTable tmp = Query.Select(cmdSelectRpslAll); + for (int i = 0; i < tmp.Rows.Count; i++) + { + if (Convert.ToInt32(tmp.Rows[i]["BPITM"]) == BPITM) + { + if (i > 0) + FillResult(Result, tmp.Rows[i], tmp.Rows[i - 1]); + else + FillResult(Result, tmp.Rows[i]); + } + } + } + return Result; + } + + /// + /// 取得下一個薪資異動項次 + /// + private int NextRPITM(string BPENO) + { + DbCommand cmd = Query.NewCommand("SELECT ISNULL(MAX(RPITM), 0) + 1 FROM RPSL WHERE RPENO=@RPENO"); + cmd.Parameters.Add(Query.NewParameter("RPENO", BPENO)); + int Result; + ExecuteScalar(cmd, out Result); + return Result; + } + + /// + /// 新增一筆員工薪資資料,或薪資異動紀錄 + /// + [DataObjectMethod(DataObjectMethodType.Insert)] + public int Insert(string BPENO, int BPITM, DateTime BPBDT, int BPSRM, int BPSRD, int BPP01, int BPP02, + int BPP03, int BPP04, int BPP05, string TRUSR) + { + DbCommand cmdInsert = Query.NewCommand(); + + if (BPITM == 0) + { + cmdInsert.CommandText = + @"INSERT INTO BPSL + (BPENO, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO, + TRDAT, TRMOD, TRUSR) + VALUES + (@BPENO, @BPSRM, @BPSRD, @BPP01, @BPP02, @BPP03, @BPP04, @BPP05, 1, + GETDATE(), 'INSERT', @TRUSR)"; + AddParam(cmdInsert, "BPENO", BPENO); + AddParam(cmdInsert, "BPSRM", BPSRM); + AddParam(cmdInsert, "BPSRD", BPSRD); + AddParam(cmdInsert, "BPP01", BPP01); + AddParam(cmdInsert, "BPP02", BPP02); + AddParam(cmdInsert, "BPP03", BPP03); + AddParam(cmdInsert, "BPP04", BPP04); + AddParam(cmdInsert, "BPP05", BPP05); + AddParam(cmdInsert, "TRUSR", TRUSR); + } + else + { + cmdInsert.CommandText = + @"INSERT INTO RPSL + (RPENO, RPITM, RPBDT, RPSRM, RPSRD, RPP01, RPP02, RPP03, RPP04, RPP05, APPNO, + TRDAT, TRMOD, TRUSR) + VALUES + (@RPENO, @RPITM, @RPBDT, @RPSRM, @RPSRD, @RPP01, @RPP02, @RPP03, @RPP04, @RPP05, 1, + GETDATE(), 'INSERT', @TRUSR)"; + AddParam(cmdInsert, "RPENO", BPENO); + AddParam(cmdInsert, "RPITM", NextRPITM(BPENO)); + AddParam(cmdInsert, "RPBDT", BPBDT); + AddParam(cmdInsert, "RPSRM", BPSRM); + AddParam(cmdInsert, "RPSRD", BPSRD); + AddParam(cmdInsert, "RPP01", BPP01); + AddParam(cmdInsert, "RPP02", BPP02); + AddParam(cmdInsert, "RPP03", BPP03); + AddParam(cmdInsert, "RPP04", BPP04); + AddParam(cmdInsert, "RPP05", BPP05); + AddParam(cmdInsert, "TRUSR", TRUSR); + } + + return Query.ExecuteNonQuery(cmdInsert); + } + + /// + /// 更正員工薪資資料或薪資異動紀錄 + /// + [DataObjectMethod(DataObjectMethodType.Update)] + public int Update(string BPENO, int BPITM, DateTime BPBDT, int BPSRM, int BPSRD, int BPP01, int BPP02, + int BPP03, int BPP04, int BPP05, string TRUSR, int APPNO, + string OLD_BPENO, int OLD_BPITM, int OLD_APPNO) + { + DbCommand cmdUpdate = Query.NewCommand(); + + if (OLD_BPITM == 0) + { + cmdUpdate.CommandText = + @"UPDATE BPSL SET + BPENO = @BPENO, + BPSRM = @BPSRM, + BPSRD = @BPSRD, + BPP01 = @BPP01, + BPP02 = @BPP02, + BPP03 = @BPP03, + BPP04 = @BPP04, + BPP05 = @BPP05, + APPNO = APPNO + 1, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @TRUSR + WHERE BPENO = @OLD_BPENO + AND APPNO = @OLD_APPNO"; + AddParam(cmdUpdate, "BPENO", BPENO); + AddParam(cmdUpdate, "BPSRM", BPSRM); + AddParam(cmdUpdate, "BPSRD", BPSRD); + AddParam(cmdUpdate, "BPP01", BPP01); + AddParam(cmdUpdate, "BPP02", BPP02); + AddParam(cmdUpdate, "BPP03", BPP03); + AddParam(cmdUpdate, "BPP04", BPP04); + AddParam(cmdUpdate, "BPP05", BPP05); + AddParam(cmdUpdate, "TRUSR", TRUSR); + AddParam(cmdUpdate, "OLD_BPENO", OLD_BPENO); + AddParam(cmdUpdate, "OLD_APPNO", OLD_APPNO); + } + else + { + cmdUpdate.CommandText = + @"UPDATE RPSL SET + RPENO = @RPENO, + RPITM = @RPITM, + RPBDT = @RPBDT, + RPSRM = @RPSRM, + RPSRD = @RPSRD, + RPP01 = @RPP01, + RPP02 = @RPP02, + RPP03 = @RPP03, + RPP04 = @RPP04, + RPP05 = @RPP05, + APPNO = APPNO + 1, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @TRUSR + WHERE RPENO = @OLD_RPENO + AND RPITM = @OLD_RPITM + AND APPNO = @OLD_APPNO"; + AddParam(cmdUpdate, "RPENO", BPENO); + AddParam(cmdUpdate, "RPITM", BPITM); + AddParam(cmdUpdate, "RPBDT", BPBDT); + AddParam(cmdUpdate, "RPSRM", BPSRM); + AddParam(cmdUpdate, "RPSRD", BPSRD); + AddParam(cmdUpdate, "RPP01", BPP01); + AddParam(cmdUpdate, "RPP02", BPP02); + AddParam(cmdUpdate, "RPP03", BPP03); + AddParam(cmdUpdate, "RPP04", BPP04); + AddParam(cmdUpdate, "RPP05", BPP05); + AddParam(cmdUpdate, "TRUSR", TRUSR); + AddParam(cmdUpdate, "OLD_RPENO", OLD_BPENO); + AddParam(cmdUpdate, "OLD_RPITM", OLD_BPITM); + AddParam(cmdUpdate, "OLD_APPNO", OLD_APPNO); + } + + return Query.ExecuteNonQuery(cmdUpdate); + } + + /// + /// 刪除員工薪資資料或薪資異動紀錄 + /// + [DataObjectMethod(DataObjectMethodType.Delete)] + public int Delete(string OLD_BPENO, int OLD_BPITM, int OLD_APPNO) + { + OLD_BPENO = OLD_BPENO != null ? OLD_BPENO : ""; + + DbCommand cmdDelete = Query.NewCommand(); + + if (OLD_BPITM == 0) + { + cmdDelete.CommandText = + @"DELETE FROM BPSL + WHERE BPENO = @OLD_BPENO + AND APPNO = @OLD_APPNO"; + AddParam(cmdDelete, "OLD_BPENO", OLD_BPENO); + AddParam(cmdDelete, "OLD_APPNO", OLD_APPNO); + } + else + { + cmdDelete.CommandText = + @"DELETE FROM RPSL + WHERE RPENO = @OLD_BPENO + AND RPITM = @OLD_BPITM + AND APPNO = @OLD_APPNO"; + AddParam(cmdDelete, "OLD_BPENO", OLD_BPENO); + AddParam(cmdDelete, "OLD_BPITM", OLD_BPITM); + AddParam(cmdDelete, "OLD_APPNO", OLD_APPNO); + } + + return Query.ExecuteNonQuery(cmdDelete); + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/BpsnDAC.cs b/Web/App_Code/DAC/BpsnDAC.cs new file mode 100644 index 0000000..16932a5 --- /dev/null +++ b/Web/App_Code/DAC/BpsnDAC.cs @@ -0,0 +1,298 @@ +using System; +using System.Data; +using System.Data.Common; +using System.Configuration; +using System.Text; +using System.Collections.Generic; +using Wellan.Data; + +/// +/// uƪƳBzO +/// +public class BpsnDAC : Wellan.Data.BPSN_DAC +{ + private DbCommand cmdSelect; + private DbCommand cmdInsert; + private DbCommand cmdUpdate; + private DbCommand cmdDelete; + private StringBuilder sb = new StringBuilder(); + private string select = "SELECT * "; + private string from = " FROM BPSNView "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY BPENO "; + + public BpsnDAC() + { + } + + public BpsnDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BpsnDAC(WQuery query) + { + this._query = query; + } + + private void Init() + { + EnsureQuery(); + EnsureDbObjects(); + } + + private void EnsureDbObjects() + { + cmdSelect = Query.NewCommand(); + cmdInsert = Query.NewCommand(); + cmdUpdate = Query.NewCommand(); + cmdDelete = Query.NewCommand(); + } + + public DataTable SelectAll() + { + Init(); + cmdSelect.CommandText = select + from + order; + cmdSelect.Parameters.Clear(); + return Query.Select(cmdSelect); + } + + public void ClearWhere() + { + Init(); + cmdSelect.Parameters.Clear(); + sb.Length = 0; + sb.Append(select); + sb.Append(from); + sb.Append(where); + } + + public void AddWhere(string fieldName, string value1, string value2, bool like) + { + Init(); + + if (value1 != null && value1.Length > 0 && value2 != null && value2.Length > 0) + { + sb.Append(String.Format(" AND {0} >= @{0}1 AND {0} <= @{0}2 ", fieldName)); + cmdSelect.Parameters.Add(Query.NewParameter(fieldName + "1", value1)); + cmdSelect.Parameters.Add(Query.NewParameter(fieldName + "2", value2)); + } + else if (value1 != null && value1.Length > 0) + { + if (like) + { + sb.Append(String.Format(" AND {0} LIKE @{0} ", fieldName)); + cmdSelect.Parameters.Add(Query.NewParameter(fieldName, value1.ToString() + "%")); + } + else + { + sb.Append(String.Format(" AND {0} = @{0} ", fieldName)); + cmdSelect.Parameters.Add(Query.NewParameter(fieldName, value1)); + } + } + else if (value2 != null && value2.Length > 0) + { + if (like) + { + sb.Append(String.Format(" AND {0} LIKE @{0} ", fieldName)); + cmdSelect.Parameters.Add(Query.NewParameter(fieldName, value2 + "%")); + } + else + { + sb.Append(String.Format(" AND {0} = @{0} ", fieldName)); + cmdSelect.Parameters.Add(Query.NewParameter(fieldName, value2)); + } + } + } + + public DataTable SelectByWhere() + { + Init(); + sb.Append(order); + return Query.Select(cmdSelect); + } + + /// + /// oHثenM + /// + /// + /// + public string GetCurrentProject(string bpeno) + { + return GetProjectByDate(bpeno, DateTime.UtcNow.AddHours(8).Date); + } + + /// + /// oHثenM + /// + /// + /// + public string GetProjectByDate(string bpeno, DateTime date) + { + DbCommand cmd = Query.NewCommand(@" + SELECT TOP 1 RAPYN + FROM + ( + SELECT 1 AS O, RAPYN + FROM RASN + WHERE RANUM = @BPENO + AND RASDT <= @DATE AND (RAEDT >= @DATE OR RAEDT IS NULL) + UNION + SELECT TOP 1 2 AS O, RAPYN + FROM RASN + WHERE RANUM = @BPENO + AND DATEPART(YEAR, RASDT) = DATEPART(YEAR, @DATE) + AND DATEPART(MONTH, RASDT) = DATEPART(MONTH, @DATE) + ) AS TMP1 + WHERE RAPYN <> '' AND RAPYN IS NOT NULL + ORDER BY O"); + AddParam(cmd, "BPENO", bpeno); + AddParam(cmd, "DATE", date); + return GetStringValue(Query.ExecuteScalar(cmd)); + } + + /// + /// oHثenaI + /// + /// + /// + public string GetCurrentSite(string bpeno) + { + return GetSiteByDate(bpeno, DateTime.UtcNow.AddHours(8).Date); + } + + /// + /// oHثenaI + /// + /// + /// + public string GetSiteByDate(string bpeno, DateTime date) + { + DbCommand cmd = Query.NewCommand(@" + SELECT C.BSSCR + FROM BPSNView A + LEFT OUTER JOIN RASN B ON A.BPENO=B.RANUM AND (B.RASDT <= @DATE AND (B.RAEDT >= @DATE OR B.RAEDT IS NULL)) + LEFT OUTER JOIN BCLS C ON B.RABRH=C.BSCLS AND C.BSPAR='BPSNBRH' + WHERE A.BPENO=@BPENO"); + AddParam(cmd, "BPENO", bpeno); + AddParam(cmd, "DATE", date); + return GetStringValue(Query.ExecuteScalar(cmd)); + } + + /// + /// oHqll + /// + /// + /// + public string GetEmail(string bpeno) + { + DbCommand cmd = Query.NewCommand(@" + SELECT BPEML + FROM BPSNView + WHERE BPENO=@BPENO"); + AddParam(cmd, "BPENO", bpeno); + return GetStringValue(Query.ExecuteScalar(cmd)); + } + + /// + /// oHqll2 + /// + /// + /// + public string GetEmail2(string bpeno) + { + DbCommand cmd = Query.NewCommand(@" + SELECT BPEM2 + FROM BPSNView + WHERE BPENO=@BPENO"); + AddParam(cmd, "BPENO", bpeno); + return GetStringValue(Query.ExecuteScalar(cmd)); + } + + /// + /// oYHݤqW + /// + /// us + /// + /// + public List GetCompanyByDate(string bpeno, DateTime date) + { + DbCommand cmd = Query.NewCommand(@" + SELECT TOP 1 RPCPY FROM + ( + SELECT RPENO, RPCPY, RPSDT, RPEDT, @YYMM-RPSDT AS SDTDIFF FROM RPIR + WHERE RPENO=@BPENO AND + (RPSDT <= @YYMM AND RPEDT >= @YYMM + OR RPSDT <= @YYMM AND RPEDT IS NULL) + UNION + SELECT RPENO, RPCPY, RPSDT, RPEDT, @YYMM-RPSDT AS SDTDIFF FROM RPIB + WHERE RPENO=@BPENO AND + (RPSDT <= @YYMM AND RPEDT >= @YYMM + OR RPSDT <= @YYMM AND RPEDT IS NULL) + ) AS TMP1 + ORDER BY SDTDIFF"); + AddParam(cmd, "BPENO", bpeno); + AddParam(cmd, "YYMM", date); + + List result = new List(); + result.Add(GetStringValue(Query.ExecuteScalar(cmd))); + result.Add(CompanyDAC.GetCompanyName(result[0])); + return result; + } + + /// + /// oH¾ + /// + /// + /// + public DateTime GetBPSDY(string bpeno) + { + DbCommand cmd = Query.NewCommand(@" + SELECT BPSDY + FROM BPSNView + WHERE BPENO=@BPENO"); + AddParam(cmd, "BPENO", bpeno); + return GetDateTimeValue(Query.ExecuteScalar(cmd)); + } + + /// + /// oH¾ + /// + /// + /// + public DateTime GetBPEDY(string bpeno) + { + DbCommand cmd = Query.NewCommand(@" + SELECT BPEDY + FROM BPSNView + WHERE BPENO=@BPENO"); + AddParam(cmd, "BPENO", bpeno); + return GetDateTimeValue(Query.ExecuteScalar(cmd)); + } + + private static List managerIds = new List(); + + public static bool IsManager(string bpeno) + { + if (managerIds.Count == 0) + { + managerIds.Add("00001"); + managerIds.Add("00002"); + managerIds.Add("00003"); + } + + return managerIds.Contains(bpeno); + } + + /// + /// XYb¾u + /// + /// + /// + public DataTable GetOnBoardEmployee(DateTime date) + { + return Query.Select(Query.NewCommand("SELECT * FROM BPSNView WHERE dbo.EmployeeOnboard(BPENO, @DATE) = 1")); + } +} diff --git a/Web/App_Code/DAC/BsgpDAC.cs b/Web/App_Code/DAC/BsgpDAC.cs new file mode 100644 index 0000000..48c6b56 --- /dev/null +++ b/Web/App_Code/DAC/BsgpDAC.cs @@ -0,0 +1,219 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Collections.Generic; +using Wellan.Data; +using Wellan.Common; +using System.Transactions; +using System.ComponentModel; + +/// +/// 簽核關卡人員檔 +/// +[DataObject] +public class BsgpDAC : Wellan.Data.WDAC +{ + private string _select = + @" SELECT BSPYN, BSFLW, BSLVL, BSENO, TRDAT, TRMOD, TRUSR, + CASE WHEN SUBSTRING(BSENO, 1, 1) = 'Z' + THEN (SELECT TOP 1 BPNME FROM BPAP WHERE BPENO=BSENO) + ELSE (SELECT TOP 1 BPNME FROM BPSNView WHERE BPENO=BSENO) END AS BSNME, + CASE WHEN SUBSTRING(BSENO, 1, 1) = 'Z' + THEN (SELECT TOP 1 BPEML FROM BPAP WHERE BPENO=BSENO) + ELSE (SELECT TOP 1 BPEML FROM BPSNView WHERE BPENO=BSENO) END AS BSEML + FROM BSGP "; + private string _insert = + @"INSERT INTO dbo.BSGP + (BSPYN, BSFLW, BSLVL, BSENO, TRDAT, TRMOD, TRUSR) + VALUES + (@BSPYN, @BSFLW, @BSLVL, @BSENO, GETDATE(), 'INSERT', @TRUSR)"; + private string _update = + @"UPDATE BSGP SET + BSPYN = @BSPYN, + BSFLW = @BSFLW, + BSLVL = @BSLVL, + BSENO = @BSENO, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @TRUSR + WHERE BSPYN = @OLD_BSPYN + AND BSFLW = @OLD_BSFLW + AND BSLVL = @OLD_BSLVL + AND BSENO = @OLD_BSENO"; + private string _delete = + @"DELETE FROM BSGP + WHERE BSPYN = @OLD_BSPYN + AND BSFLW = @OLD_BSFLW + AND BSLVL = @OLD_BSLVL + AND BSENO = @OLD_BSENO"; + + public BsgpDAC() + { + } + + public BsgpDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BsgpDAC(WQuery query) + { + this._query = query; + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectAll() + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _select + " ORDER BY BSPYN, BSFLW, BSLVL, BSENO "; + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectOne(string BSPYN, string BSFLW, int BSLVL, string BSENO) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _select + " WHERE BSPYN = @BSPYN AND BSFLW = @BSFLW AND BSLVL = @BSLVL AND BSENO = @BSENO "; + AddParam(cmd, "BSPYN", BSPYN); + AddParam(cmd, "BSFLW", BSFLW); + AddParam(cmd, "BSLVL", BSLVL); + AddParam(cmd, "BSENO", BSENO); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectByLevel(string BSPYN, string BSFLW, int BSLVL) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _select + " WHERE BSPYN = @BSPYN AND BSFLW = @BSFLW AND BSLVL = @BSLVL ORDER BY BSENO "; + AddParam(cmd, "BSPYN", BSPYN); + AddParam(cmd, "BSFLW", BSFLW); + AddParam(cmd, "BSLVL", BSLVL); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectForDropdown(string BSPYN, string BSFLW, int BSLVL) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _select + " WHERE BSPYN = @BSPYN AND BSFLW = @BSFLW AND BSLVL = @BSLVL ORDER BY BSENO "; + //@"SELECT NULL AS BSPYN, NULL AS BSFLW, NULL AS BSLVL, NULL AS BSENO, NULL AS TRDAT, + // NULL AS TRMOD, NULL AS TRUSR, NULL AS BSNME + // UNION ALL " + // + _select + " WHERE BSPYN = @BSPYN AND BSFLW = @BSFLW AND BSLVL = @BSLVL ORDER BY BSENO "; + AddParam(cmd, "BSPYN", BSPYN); + AddParam(cmd, "BSFLW", BSFLW); + AddParam(cmd, "BSLVL", BSLVL); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Insert)] + public void InsertOne(string BSPYN, string BSFLW, int BSLVL, string BSENO, string TRUSR) + { + if (SelectOne(BSPYN, BSFLW, BSLVL, BSENO).Rows.Count > 0) + return; + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _insert; + AddParam(cmd, "BSPYN", BSPYN); + AddParam(cmd, "BSFLW", BSFLW); + AddParam(cmd, "BSLVL", BSLVL); + AddParam(cmd, "BSENO", BSENO); + AddParam(cmd, "TRUSR", TRUSR); + Query.ExecuteNonQuery(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Update)] + public void UpdateOne(string OLD_BSPYN, string OLD_BSFLW, int OLD_BSLVL, string OLD_BSENO, + string BSPYN, string BSFLW, int BSLVL, string BSENO, string TRUSR) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _update; + AddParam(cmd, "BSPYN", BSPYN); + AddParam(cmd, "BSFLW", BSFLW); + AddParam(cmd, "BSLVL", BSLVL); + AddParam(cmd, "BSENO", BSENO); + AddParam(cmd, "OLD_BSPYN", OLD_BSPYN); + AddParam(cmd, "OLD_BSFLW", OLD_BSFLW); + AddParam(cmd, "OLD_BSLVL", OLD_BSLVL); + AddParam(cmd, "OLD_BSENO", OLD_BSENO); + AddParam(cmd, "TRUSR", TRUSR); + Query.ExecuteNonQuery(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Delete)] + public void DeleteOne(string OLD_BSPYN, string OLD_BSFLW, int OLD_BSLVL, string OLD_BSENO) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _delete; + AddParam(cmd, "OLD_BSPYN", OLD_BSPYN); + AddParam(cmd, "OLD_BSFLW", OLD_BSFLW); + AddParam(cmd, "OLD_BSLVL", OLD_BSLVL); + AddParam(cmd, "OLD_BSENO", OLD_BSENO); + Query.ExecuteNonQuery(cmd); + } + + public bool 是否是主要簽核(string BSENO) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT COUNT(1) + FROM BSGP + WHERE BSLVL IN (1, 3) AND BSENO=@BSENO"; + AddParam(cmd, "BSENO", BSENO); + return GetInt32Value(Query.ExecuteScalar(cmd)) > 0; + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable 我督導的專案(string BSENO) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT A.BSPYN, B.BPPYM + FROM BSGP A + INNER JOIN BPAA B ON A.BSPYN=B.BPPYN + WHERE BSLVL=3 AND BSENO=@BSENO + ORDER BY BSPYN"; + AddParam(cmd, "BSENO", BSENO); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable 我可簽核的專案(int Year1, int Year2, string BSENO) + { + string yearWhere = ""; + if (Year1 > 0 && Year2 > 0) + yearWhere = " AND B.BPYER>=@BPYER1 AND B.BPYER<=@BPYER2 "; + if (Year1 > 0 && Year2 == 0) + yearWhere = " AND B.BPYER=@BPYER1 "; + if (Year1 == 0 && Year2 > 0) + yearWhere = " AND B.BPYER=@BPYER2 "; + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = String.Format( + @"SELECT A.BSPYN, B.BPPYM + FROM BSGP A + INNER JOIN BPAA B ON A.BSPYN=B.BPPYN {0} + WHERE BSLVL IN (1, 3) AND BSENO=@BSENO + UNION + SELECT A.BSPYN, B.BPPYM + FROM BSGP A + INNER JOIN BPAA B ON A.BSPYN=B.BPPYN + WHERE BSLVL IN (1, 3) AND BSENO=@BSENO AND (BPPYN = '103TYB00001' OR BPPYN = '103JYB00001') + ORDER BY BSPYN", yearWhere); + AddParam(cmd, "BPYER1", Year1); + AddParam(cmd, "BPYER2", Year2); + AddParam(cmd, "BSENO", BSENO); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable 我可簽核的專案(int Year, string BSENO) + { + return 我可簽核的專案(Year, 0, BSENO); + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/BtmeDAC.cs b/Web/App_Code/DAC/BtmeDAC.cs new file mode 100644 index 0000000..4add163 --- /dev/null +++ b/Web/App_Code/DAC/BtmeDAC.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Wellan.Data; +using Wellan.Common; +using System.ComponentModel; + +/// +/// 班表的資料處理類別 +/// +[DataObject] +public class BtmeDAC : WDAC +{ + public BtmeDAC() + { + } + + public BtmeDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BtmeDAC(WQuery query) + { + this._query = query; + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public List SelectAll() + { + var cmd = Query.NewCommand(); + cmd.CommandText = "SELECT * FROM BTME ORDER BY BTTID"; + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public List SelectOne(string BTTID) + { + var cmd = Query.NewCommand(); + cmd.CommandText = "SELECT * FROM BTME WHERE BTTID=@BTTID"; + AddParam(cmd, "BTTID", BTTID); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Insert)] + public void InsertOne(BtmeItem value) + { + var cmd = Query.NewCommand(); + cmd.CommandText = + @"INSERT INTO dbo.BTME + (BTTID, BTNME, BTSTM, BTETM, BTRST, BTRED, TRDAT, TRMOD, TRUSR) + VALUES + (@BTTID, @BTNME, @BTSTM, @BTETM, @BTRST, @BTRED, GETDATE(), 'INSERT', @TRUSR)"; + AddParam(cmd, "BTTID", WGuard1.WNextRen(DateTime.UtcNow.AddHours(8).Date, "BTME", "BTTID", "<9999>", "") ); + AddParam(cmd, "BTNME", value.BTNME); + AddParam(cmd, "BTSTM", value.BTSTM); + AddParam(cmd, "BTETM", value.BTETM); + AddParam(cmd, "BTRST", value.BTRST); + AddParam(cmd, "BTRED", value.BTRED); + AddParam(cmd, "TRUSR", value.TRUSR); + Query.ExecuteNonQuery(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Update)] + public void UpdateOne(BtmeItem value) + { + var cmd = Query.NewCommand(); + cmd.CommandText = + @"UPDATE dbo.BTME SET + BTNME = @BTNME, + BTSTM = @BTSTM, + BTETM = @BTETM, + BTRST = @BTRST, + BTRED = @BTRED, + TRDAT = GETDATE(), + TRMOD = 'MODIFY', + TRUSR = @TRUSR + WHERE + BTTID = @OLD_BTTID"; + AddParam(cmd, "BTNME", value.BTNME); + AddParam(cmd, "BTSTM", value.BTSTM); + AddParam(cmd, "BTETM", value.BTETM); + AddParam(cmd, "BTRST", value.BTRST); + AddParam(cmd, "BTRED", value.BTRED); + AddParam(cmd, "TRUSR", value.TRUSR); + AddParam(cmd, "OLD_BTTID", value.BTTID); + Query.ExecuteNonQuery(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Delete)] + public void DeleteOne(BtmeItem value) + { + var cmd = Query.NewCommand(); + cmd.CommandText = @"DELETE FROM dbo.BTME WHERE BTTID = @OLD_BTTID"; + AddParam(cmd, "OLD_BTTID", value.BTTID); + Query.ExecuteNonQuery(cmd); + } + + /// + /// 取出班表選擇下拉選單的資料,包含預設班表 + /// + /// + public List SelectForDropdown() + { + var cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT NULL BTTID, '預設班表 (08:00-17:00)' BTNME + UNION ALL + SELECT BTTID, CONCAT(BTNME, ' (', BTSTM, '-', BTETM, ')') BTNME FROM BTME + WHERE BTSTM <> '' AND BTSTM IS NOT NULL + ORDER BY BTTID"; + return Query.Select(cmd); + } +} + +public class BtmeItem +{ + public string BTTID { get; set; } + public string BTNME { get; set; } + public string BTSTM { get; set; } + public string BTETM { get; set; } + public string BTRST { get; set; } + public string BTRED { get; set; } + public DateTime TRDAT { get; set; } + public string TRMOD { get; set; } + public string TRUSR { get; set; } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/CompanyDAC.cs b/Web/App_Code/DAC/CompanyDAC.cs new file mode 100644 index 0000000..997ff8a --- /dev/null +++ b/Web/App_Code/DAC/CompanyDAC.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.ComponentModel; + +/// +/// CompanyDAC 的摘要描述 +/// +[DataObject] +public class CompanyDAC +{ + private List items; + private static CompanyDAC _staticInstance = null; + + public CompanyDAC() + { + items = new List(); + items.Add(new CompanyItem("", "(請選擇)", "(請選擇)")); + items.Add(new CompanyItem("TY", "新譽管理有限公司", "新譽")); + items.Add(new CompanyItem("JY", "展譽職涯管理顧問有限公司", "展譽")); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public List SelectAll() + { + return items; + } + + private string FindCompanyName(string companyId) + { + foreach (CompanyItem item in items) + { + if (item.CompanyId.CompareTo(companyId) == 0) + return item.CompanyName; + } + return ""; + } + + private string FindCompanyShortName(string companyId) + { + foreach (CompanyItem item in items) + { + if (item.CompanyId.CompareTo(companyId) == 0) + return item.ShortName; + } + return ""; + } + + public static string GetCompanyName(string companyId) + { + if (_staticInstance == null) + _staticInstance = new CompanyDAC(); + return _staticInstance.FindCompanyName(companyId); + } + + public static string GetCompanyShortName(string companyId) + { + if (_staticInstance == null) + _staticInstance = new CompanyDAC(); + return _staticInstance.FindCompanyShortName(companyId); + } +} + +public class CompanyItem +{ + public CompanyItem(string companyId, string companyName, string shortName) + { + this.CompanyId = companyId; + this.CompanyName = companyName; + this.ShortName = shortName; + } + + [DataObjectField(true)] + public string CompanyId + { + get; + set; + } + + [DataObjectField(false)] + public string CompanyName + { + get; + set; + } + + [DataObjectField(false)] + public string ShortName + { + get; + set; + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/GetData.cs b/Web/App_Code/DAC/GetData.cs new file mode 100644 index 0000000..f9aebce --- /dev/null +++ b/Web/App_Code/DAC/GetData.cs @@ -0,0 +1,1823 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using Wellan.Common; +using Wellan.Data; +using System.Collections.Generic; +using System.Linq; +using NPOI.SS.Formula.Functions; + +/// +/// 取得資料的方法集合 +/// +public class GetData +{ + private string selectBPAA = + @"SELECT A.BPPYN, A.BPBGT, A.BPCSD, A.BPS01, A.BPS02, A.BPS03, A.BPS04, A.BPS05, A.BPS06, + A.BPS07, A.BPS08, A.BPS09, A.BPS10, A.BPS11, A.BPS12, A.BPS13, A.BPS14, A.BPS15, + A.BPS16, A.BPS17, A.BPS18, A.BPS19, A.BPS20, A.BPS21, A.BPS22, A.BPS23, A.BPS24, + A.BPS25, A.BPS26, A.BPS27, A.BPS28, A.BPS29, A.BPS30, A.BPFED, A.BPMSD, A.BPSAL, + A.BPOTT, A.BPOTD, B.BPCPY + FROM BPAA A WITH (NOLOCK) + LEFT OUTER JOIN BPRJ B ON A.BPPNM=B.BPPNM "; + public static string defaultBPOVR = "ROUND(ROUND(ROUND(@本薪/240, 0) + @伙食費/240, 0) * @加班費比例 * @時數, 0)"; + public static string defaultBPLVE = "ROUND(ROUND(ROUND(@本薪/240, 0) + @伙食費/240, 0) * @時數, 0)"; + public WQuery Query; + + public GetData() + { + } + + public GetData(WQuery AQuery) + : this() + { + Query = AQuery; + } + + /// + /// 由年度,取得專案年度接單資料 + /// + public DataTable GetBPAA_Year(int aYear) + { + DbCommand cmd = Query.NewCommand(selectBPAA + "WHERE A.BPYER=@BPYER ORDER BY A.BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPYER", aYear)); + return Query.Select(cmd); + } + + /// + /// 由專案年度編號,取得專案年度接單資料 + /// + public DataTable GetBPAA_BPPYN(string bppyn) + { + DbCommand cmd = Query.NewCommand(selectBPAA + "WHERE A.BPPYN=@BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); + return Query.Select(cmd); + } + + /// + /// 由專案年度編號,取得補休有效期限 + /// + public int GetBPAA_BPOTD(string bppyn) + { + DbCommand cmd = Query.NewCommand(selectBPAA + "WHERE A.BPPYN=@BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); + BPAARecord bpaaRecord = new BPAARecord(); + var dt = Query.Select(cmd); + if (dt.Rows.Count > 0) + { + bpaaRecord.FillRecord(dt.Rows[0]); + if (bpaaRecord.BPOTD != 0) + return bpaaRecord.BPOTD; + else + return 6; + } + else + { + return 6; + } + } + + /// + /// 由專案年度編號,取得專案加班時數是否計算至分鐘 + /// + public bool GetOverTimeToMinutes(string bppyn) + { + DbCommand cmd = Query.NewCommand("SELECT BPOTT FROM BPAA WITH (NOLOCK) WHERE BPPYN=@BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); + return WDAC.GetStringValue(Query.ExecuteScalar(cmd)) == "2"; + } + + /// + /// 由年月、專案年度代號,取得派遣出去的人員 (要改) + /// + public DataTable GetRASN_YYMM_BPPYN(DateTime yymm, string rapyn, DbTransaction tran) + { + return GetRASN_DATE_BPPYN(yymm, yymm.AddMonths(1).AddDays(-1), rapyn, tran); + } + + /// + /// 由日期區間、專案年度代號,取得派遣出去的人員 + /// + public DataTable GetRASN_DATE_BPPYN(DateTime date1, DateTime date2, string rapyn, DbTransaction tran) + { + DbCommand cmd = Query.NewCommand( + @"SELECT A.RANUM, A.RAITM, A.RACNM, A.RAPYN, A.RASDT, A.RAEDT, A.RAJNO, A.RACNO, A.RABRH, + B.BPSRM, B.BPSRD, B.BPP01, B.BPP02, B.BPP03, B.BPP04, B.BPP05, D.BPBFT, D.BPAFT, + D.BPHOL, E.BFFRM AS BPOVR, F.BFFRM AS BPLVE, G.BPNME, G.BPEDY + FROM RASN A WITH (NOLOCK) + INNER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO + INNER JOIN BPAA C ON A.RAPYN=C.BPPYN + INNER JOIN BPRJ D ON C.BPPNM=D.BPPNM + INNER JOIN BFRM E ON D.BPOVR=E.BFNUM + INNER JOIN BFRM F ON D.BPLVE=F.BFNUM + INNER JOIN BPSNView G ON A.RANUM=G.BPENO + WHERE A.RAPYN = @RAPYN + AND ((A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM2) + OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL) + OR (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT IS NULL) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2)) + ORDER BY A.RANUM, A.RAITM"); + cmd.Parameters.Add(Query.NewParameter("RAPYN", rapyn)); + cmd.Parameters.Add(Query.NewParameter("YYMM1", date1)); + cmd.Parameters.Add(Query.NewParameter("YYMM2", date2)); + + if (tran != null) + { + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmd); + DataTable result = new DataTable(); + da.Fill(result); + return result; + } + else + { + return Query.Select(cmd); + } + } + + /// + /// 由日期區間、專案年度代號,取得派遣出去的人員 + /// + public List GetRASN_DATE_BPPYN(DateTime date1, DateTime date2, string rapyn) + { + DbCommand cmd = Query.NewCommand( + @"SELECT DISTINCT A.RANUM BPENO, G.BPNME, A.RABRH BPBRH + FROM RASN A WITH (NOLOCK) + INNER JOIN BPSNView G ON A.RANUM=G.BPENO + WHERE A.RAPYN = @RAPYN + AND ((A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM2) + OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL) + OR (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT IS NULL) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2)) + ORDER BY A.RANUM"); + cmd.Parameters.Add(Query.NewParameter("RAPYN", rapyn)); + cmd.Parameters.Add(Query.NewParameter("YYMM1", date1)); + cmd.Parameters.Add(Query.NewParameter("YYMM2", date2)); + + return Query.Select(cmd); + } + + /// + /// 取得人員在某日期派駐的專案 + /// + public string GetRAPYN_DATE_BPENO(DateTime date, string bpeno) + { + DbCommand cmd = Query.NewCommand( + @"SELECT RAPYN + FROM RASN A WITH (NOLOCK) + WHERE A.RANUM = @RANUM + AND ((A.RASDT <= @DATE AND A.RAEDT >= @DATE) + OR (A.RASDT <= @DATE AND A.RAEDT IS NULL))"); + cmd.Parameters.Add(Query.NewParameter("RANUM", bpeno)); + cmd.Parameters.Add(Query.NewParameter("DATE", date)); + + return WQuery.GetStringValue(Query.ExecuteScalar(cmd)); + } + + /// + /// 取得員工在請假日期所在專案的補休期限設定 + /// + public int GetBPOTD_DATE_BPENO(DateTime date, string bpeno) + { + var pyn = GetRAPYN_DATE_BPENO(date, bpeno); + return GetBPAA_BPOTD(pyn); + } + + /// + /// 由年度專案代號,取得前二、後二、假日加班比例 (要改) + /// + public void GetRASN_Overwork_Rate(string bppyn, out double bpbft, out double bpaft, out double bphol, out string bpovr, out string bplve) + { + DbCommand cmd = Query.NewCommand( + @"SELECT B.BPBFT, B.BPAFT, B.BPHOL, C.BFFRM AS BPOVR, D.BFFRM AS BPLVE + FROM BPAA A WITH (NOLOCK) + INNER JOIN BPRJ B ON A.BPPNM=B.BPPNM + INNER JOIN BFRM C ON B.BPOVR=C.BFNUM + INNER JOIN BFRM D ON B.BPLVE=D.BFNUM + WHERE A.BPPYN = @BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); + DataTable data = Query.Select(cmd); + if (data.Rows.Count == 0) + { + bpbft = 0d; + bpaft = 0d; + bphol = 0d; + bpovr = defaultBPOVR; + bplve = defaultBPLVE; + } + else + { + bpbft = data.Rows[0]["BPBFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPBFT"]) : 0d; + bpaft = data.Rows[0]["BPAFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPAFT"]) : 0d; + bphol = data.Rows[0]["BPHOL"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPHOL"]) : 0d; + bpovr = data.Rows[0]["BPOVR"] != DBNull.Value ? data.Rows[0]["BPOVR"].ToString() : defaultBPOVR; + bplve = data.Rows[0]["BPLVE"] != DBNull.Value ? data.Rows[0]["BPLVE"].ToString() : defaultBPLVE; + } + } + + /// + /// 由年月取得本月曾經在職的人員 + /// + public DataTable GetBPSNInMonth(DateTime yymm, DbTransaction tran) + { + DateTime yymm2 = yymm.AddMonths(1).AddDays(-1); // 月底日 + DbCommand cmdBpsn = Query.NewCommand( + @"SELECT BPENO, BPSDY, BPEDY + FROM BPSNView WITH (NOLOCK) + WHERE ((BPSDY <= @YYMM1 AND BPEDY >= @YYMM2) + OR (BPSDY <= @YYMM1 AND BPEDY IS NULL) + OR (BPSDY <= @YYMM1 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2) + OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM2) + OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY IS NULL) + OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2))"); + cmdBpsn.Parameters.Add(Query.NewParameter("YYMM1", yymm)); + cmdBpsn.Parameters.Add(Query.NewParameter("YYMM2", yymm2)); + cmdBpsn.Connection = tran.Connection; + cmdBpsn.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmdBpsn); + DataTable result = new DataTable(); + da.Fill(result); + return result; + } + + ///// + ///// 取得上月初至本月底不在專案中的人員 (要改) + ///// + //public DataTable GetBPSNInMonthButNotInProject() + //{ + // DateTime yymm1 = DateTime.UtcNow.AddHours(8).AddDays(-(DateTime.UtcNow.AddHours(8).Day - 1)).AddMonths(-1); // 上個月月初日 + // DateTime yymm2 = DateTime.UtcNow.AddHours(8).AddDays(-(DateTime.UtcNow.AddHours(8).Day - 1)).AddMonths(1).AddDays(-1); // 本月月底日 + // DbCommand cmdBpsn = Query.NewCommand( + // @"SELECT BPENO, BPENO + ' ' + BPNME BPNME + // FROM BPSN WITH (NOLOCK) + // WHERE ( (BPSDY <= @YYMM1 AND BPEDY >= @YYMM2) + // OR (BPSDY <= @YYMM1 AND BPEDY IS NULL) + // OR (BPSDY <= @YYMM1 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2) + // OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM2) + // OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY IS NULL) + // OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2)) + // AND BPENO NOT IN + // (SELECT RANUM FROM RASN + // WHERE ( (RASDT <= @YYMM1 AND RAEDT >= @YYMM2) + // OR (RASDT <= @YYMM1 AND RAEDT IS NULL) + // OR (RASDT <= @YYMM1 AND RAEDT >= @YYMM1 AND RAEDT <= @YYMM2) + // OR (RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT >= @YYMM2) + // OR (RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT IS NULL) + // OR (RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT >= @YYMM1 AND RAEDT <= @YYMM2)))"); + // cmdBpsn.Parameters.Add(Query.NewParameter("YYMM1", yymm1)); + // cmdBpsn.Parameters.Add(Query.NewParameter("YYMM2", yymm2)); + // DataTable result = Query.Select(cmdBpsn); + // return result; + //} + + /// + /// 由年月、人員編號,取得未派遣出去的日期區間資料、基本薪資資料,以及薪資異動資料 (要改) + /// + public DataTable GetBPSNNoCase(DateTime yymm, string bpeno, DbTransaction tran) + { + DateTime yymm2 = yymm.AddMonths(1).AddDays(-1); // 月底日 + + // 準備輸出架構 + DataTable aTable = new DataTable(); + aTable.Columns.Add("BPENO", typeof(System.String)); + aTable.Columns.Add("STA_DATE", typeof(System.DateTime)); + aTable.Columns.Add("END_DATE", typeof(System.DateTime)); + aTable.Columns.Add("BPSRM", typeof(System.Int32)); + aTable.Columns.Add("BPSRD", typeof(System.Int32)); + aTable.Columns.Add("BPP01", typeof(System.Int32)); + aTable.Columns.Add("BPP02", typeof(System.Int32)); + aTable.Columns.Add("BPP03", typeof(System.Int32)); + aTable.Columns.Add("BPP04", typeof(System.Int32)); + aTable.Columns.Add("BPP05", typeof(System.Int32)); + + // 取得人員到職日與離職日 + DbCommand cmdBpsn = Query.NewCommand( + @"SELECT BPSDY, BPEDY + FROM BPSNView WITH (NOLOCK) + WHERE BPENO=@BPENO"); + cmdBpsn.Parameters.Add(Query.NewParameter("BPENO", bpeno)); + cmdBpsn.Connection = tran.Connection; + cmdBpsn.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmdBpsn); + DataTable bpsn = new DataTable(); + da.Fill(bpsn); + + if (bpsn.Rows.Count == 0) + return null; + + DateTime bpsdy = bpsn.Rows[0]["BPSDY"] != DBNull.Value ? Convert.ToDateTime(bpsn.Rows[0]["BPSDY"]) : yymm; + int bpsdyDay = bpsdy < yymm ? 0 : bpsdy.Day - 1; + DateTime bpedy = bpsn.Rows[0]["BPEDY"] != DBNull.Value ? Convert.ToDateTime(bpsn.Rows[0]["BPEDY"]) : yymm.AddMonths(1); + int bpedyDay = bpedy > yymm2 ? yymm.AddMonths(1).AddDays(-1).Day - 1 : bpedy.Day - 1; + + // 由年月 + 人員,取得派遣紀錄 + DbCommand cmdRasn = Query.NewCommand( + @"SELECT A.RASDT, A.RAEDT + FROM RASN A WITH (NOLOCK) + WHERE RANUM=@BPENO + AND ((A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM2) + OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL) + OR (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT IS NULL) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2))"); + cmdRasn.Parameters.Add(Query.NewParameter("BPENO", bpeno)); + cmdRasn.Parameters.Add(Query.NewParameter("YYMM1", yymm)); + cmdRasn.Parameters.Add(Query.NewParameter("YYMM2", yymm2)); + cmdRasn.Connection = tran.Connection; + cmdRasn.Transaction = tran; + da.SelectCommand = cmdRasn; + DataTable rasn = new DataTable(); + da.Fill(rasn); + + // 準備一個陣列,代表本月每一天 + char[] days = new char[31]; + // 填入 - 初始化 + for (int i = 0; i < days.Length; i++) + days[i] = '-'; + // 填入 0 代表到職未派遣 + for (int i = bpsdyDay; i <= bpedyDay; i++) + days[i] = '0'; + + // 依照派遣紀錄將陣列填入 1,代表有派遣 + foreach (DataRow rasnRow in rasn.Rows) + { + // 開始日 + DateTime startDate = rasnRow["RASDT"] != DBNull.Value ? Convert.ToDateTime(rasnRow["RASDT"]) : yymm; + if (startDate < yymm) + startDate = yymm; + + // 結束日 + DateTime endDate = rasnRow["RAEDT"] != DBNull.Value ? Convert.ToDateTime(rasnRow["RAEDT"]) : yymm2; + if (endDate > yymm2) + endDate = yymm2; + + for (int i = startDate.Day - 1; i < endDate.Day; i++) + days[i] = '1'; + } + + // 依照陣列產生輸出資料 + int startDay = 0; + int endDay = 0; + char currState = '-'; + BpslDAC bpsl = new BpslDAC(Query); + for (int i = 0; i < days.Length; i++) + { + if (days[i] == '0') + { + if (currState == '1' || currState == '-') + startDay = i; + currState = '0'; + endDay = i; + } + + // 當遇到派遣日、非本月、月底日時,寫出紀錄 + if (currState == '0' && (days[i] == '1' || days[i] == '-' || i == days.Length - 1)) + { + DateTime sDate = yymm.AddDays(startDay); + DateTime eDate = yymm.AddDays(endDay); + + // 取得此區間內之薪資基本資料以及薪資異動資料 + DataTable bpslData = bpsl.SelectBPSLDateRange(bpeno, sDate, eDate, tran); + + for (int j = 0; j < bpslData.Rows.Count; j++) + { + DataRow newRow = aTable.NewRow(); + newRow["BPENO"] = bpeno; + newRow["STA_DATE"] = sDate; + + if (bpslData.Rows.Count > 1 && j != bpslData.Rows.Count - 1) + { + sDate = Convert.ToDateTime(bpslData.Rows[j + 1]["BPBDT"]); + newRow["END_DATE"] = sDate.AddDays(-1); + } + if (bpslData.Rows.Count == 1 || j == bpslData.Rows.Count - 1) + { + newRow["END_DATE"] = eDate; + } + + newRow["BPSRM"] = bpslData.Rows[j]["BPSRM"]; + newRow["BPSRD"] = bpslData.Rows[j]["BPSRD"]; + newRow["BPP01"] = bpslData.Rows[j]["BPP01"]; + newRow["BPP02"] = bpslData.Rows[j]["BPP02"]; + newRow["BPP03"] = bpslData.Rows[j]["BPP03"]; + newRow["BPP04"] = bpslData.Rows[j]["BPP04"]; + newRow["BPP05"] = bpslData.Rows[j]["BPP05"]; + aTable.Rows.Add(newRow); + } + + currState = '1'; + } + } + + return aTable; + } + + /// + /// 由日期 + 人員 + 專案年度編號,取得月薪、伙食津貼、前二加班、後二加班、假日加班比例 (要改) + /// + /// 日期 + /// 專案年度編號 + /// 人員編號 + /// 月薪 + /// 伙食津貼 + /// 前二加班比例 + /// 後二加班比例 + /// 假日加班比例 + /// 加班費公式 + /// 請假扣款公式 + /// 加班費計算方式 1=計算至小時 2=計算至分鐘 + public void GetRASN_Date_Bppyn_Bpeno_Overwork_Rate(DateTime aDate, string bppyn, string bpeno, out int bpsrm, + out int bpp02, out double bpbft, out double bpaft, out double bphol, out string bpovr, out string bplve, + out string bpott) + { + #region 專案人員 + if (bppyn != "000000001") + { + DbCommand cmd = Query.NewCommand( + @"SELECT B.BPSRM, B.BPP02, D.BPBFT, D.BPAFT, D.BPHOL, E.BFFRM AS BPOVR, F.BFFRM AS BPLVE, C.BPOTT AS BPOTT + FROM RASN A WITH (NOLOCK) + INNER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO + INNER JOIN BPAA C ON A.RAPYN=C.BPPYN + INNER JOIN BPRJ D ON C.BPPNM=D.BPPNM + INNER JOIN BFRM E ON D.BPOVR=E.BFNUM + INNER JOIN BFRM F ON D.BPLVE=F.BFNUM + WHERE A.RANUM=@RANUM AND A.RAPYN=@RAPYN + AND ( (A.RASDT <= @DATE AND A.RAEDT IS NULL) + OR (A.RASDT <= @DATE AND A.RAEDT >= @DATE) )"); + cmd.Parameters.Add(Query.NewParameter("RANUM", bpeno)); + cmd.Parameters.Add(Query.NewParameter("RAPYN", bppyn)); + cmd.Parameters.Add(Query.NewParameter("DATE", aDate)); + // cmd.Parameters.Add(Query.NewParameter("YYMM2", aDate.AddDays(-aDate.Day + 1).AddMonths(1).AddDays(-1))); + DataTable data = Query.Select(cmd); + if (data.Rows.Count == 0) + { + bpsrm = 0; + bpp02 = 0; + bpbft = 0d; + bpaft = 0d; + bphol = 0d; + bpovr = defaultBPOVR; + bplve = defaultBPLVE; + bpott = "1"; + } + else + { + bpsrm = data.Rows[0]["BPSRM"] != DBNull.Value ? Convert.ToInt32(data.Rows[0]["BPSRM"]) : 0; + bpp02 = data.Rows[0]["BPP02"] != DBNull.Value ? Convert.ToInt32(data.Rows[0]["BPP02"]) : 0; + bpbft = data.Rows[0]["BPBFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPBFT"]) : 0d; + bpaft = data.Rows[0]["BPAFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPAFT"]) : 0d; + bphol = data.Rows[0]["BPHOL"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPHOL"]) : 0d; + bpovr = data.Rows[0]["BPOVR"] != DBNull.Value ? WDAC.GetStringValue(data.Rows[0]["BPOVR"]).Trim() : defaultBPOVR; + bplve = data.Rows[0]["BPLVE"] != DBNull.Value ? WDAC.GetStringValue(data.Rows[0]["BPLVE"]).Trim() : defaultBPLVE; + bpott = data.Rows[0]["BPOTT"] != DBNull.Value ? WDAC.GetStringValue(data.Rows[0]["BPOTT"]).Trim() : "1"; + } + } + #endregion + + #region 非專案人員 + else + { + // 取得非專案人員的月薪、伙食津貼資料以及薪資異動資料的月薪、伙食津貼 + DbCommand cmd = Query.NewCommand( + @"SELECT * FROM + ( + SELECT BPENO, 0 AS BPITM, '1900/01/01' AS BPBDT, BPSRM, BPP02 + FROM BPSL WITH (NOLOCK) + WHERE BPENO=@BPENO + UNION + SELECT RPENO AS BPENO, RPITM AS BPITM, RPBDT AS BPBDT, RPSRM AS BPSRM, RPP02 AS BPP02 + FROM RPSL WITH (NOLOCK) + WHERE RPENO=@BPENO + ) BPSL_TMP + ORDER BY BPITM"); + cmd.Parameters.Add(Query.NewParameter("BPENO", bpeno)); + DataTable data = Query.Select(cmd); + + bpovr = defaultBPOVR; + bplve = defaultBPLVE; + bpbft = GetFeeRate("非專案人員前二加班", aDate, null); + bpaft = GetFeeRate("非專案人員後二加班", aDate, null); + bphol = GetFeeRate("非專案人員假日加班", aDate, null); + bpsrm = 0; + bpp02 = 0; + bpott = "1"; + + if (data.Rows.Count == 0) + { + return; + } + else + { + // 依照日期,推算應該適用的月薪與伙食津貼 + for (int i = 0; i < data.Rows.Count; i++) + { + DateTime bpbdt = data.Rows[i]["BPBDT"] != DBNull.Value ? Convert.ToDateTime(data.Rows[i]["BPBDT"]) : new DateTime(1900, 1, 1); + if (aDate.CompareTo(bpbdt) >= 0) + { + bpsrm = data.Rows[i]["BPSRM"] != DBNull.Value ? Convert.ToInt32(data.Rows[i]["BPSRM"]) : 0; + bpp02 = data.Rows[i]["BPP02"] != DBNull.Value ? Convert.ToInt32(data.Rows[i]["BPP02"]) : 0; + } + } + } + } + #endregion + } + + /// + /// 由日期區間 + 人員 + 專案年度編號,取得月薪、伙食津貼、前二加班、後二加班、假日加班比例 (要改) + /// + /// 起始日期 + /// 結束日期 + /// 專案年度編號 + /// 人員編號 + /// 月薪 + /// 伙食津貼 + /// 前二加班比例 + /// 後二加班比例 + /// 假日加班比例 + /// 加班費公式 + /// 請假扣款公式 + /// 加班時數計算方式 + public void GetRASN_DateRange_Bppyn_Bpeno_Overwork_Rate(DateTime aDate1, DateTime aDate2, string bppyn, + string bpeno, out int bpsrm, out int bpp02, out double bpbft, out double bpaft, out double bphol, + out string bpovr, out string bplve, out string bpott) + { + // 專案人員 + if (bppyn != "000000001") + { + DbCommand cmd = Query.NewCommand( + @"SELECT B.BPSRM, B.BPP02, D.BPBFT, D.BPAFT, D.BPHOL, E.BFFRM AS BPOVR, F.BFFRM AS BPLVE, C.BPOTT as BPOTT + FROM RASN A WITH (NOLOCK) + INNER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO + INNER JOIN BPAA C ON A.RAPYN=C.BPPYN + INNER JOIN BPRJ D ON C.BPPNM=D.BPPNM + INNER JOIN BFRM E ON D.BPOVR=E.BFNUM + INNER JOIN BFRM F ON D.BPLVE=F.BFNUM + WHERE A.RANUM=@RANUM AND A.RAPYN=@RAPYN + AND ((A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM2) + OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL) + OR (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT IS NULL) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2)) "); + cmd.Parameters.Add(Query.NewParameter("RANUM", bpeno)); + cmd.Parameters.Add(Query.NewParameter("RAPYN", bppyn)); + cmd.Parameters.Add(Query.NewParameter("YYMM1", aDate1)); + cmd.Parameters.Add(Query.NewParameter("YYMM2", aDate2)); + // cmd.Parameters.Add(Query.NewParameter("YYMM2", aDate.AddDays(-aDate.Day + 1).AddMonths(1).AddDays(-1))); + DataTable data = Query.Select(cmd); + if (data.Rows.Count == 0) + { + bpsrm = 0; + bpp02 = 0; + bpbft = 0d; + bpaft = 0d; + bphol = 0d; + bpovr = defaultBPOVR; + bplve = defaultBPLVE; + bpott = "1"; + } + else + { + bpsrm = data.Rows[0]["BPSRM"] != DBNull.Value ? Convert.ToInt32(data.Rows[0]["BPSRM"]) : 0; + bpp02 = data.Rows[0]["BPP02"] != DBNull.Value ? Convert.ToInt32(data.Rows[0]["BPP02"]) : 0; + bpbft = data.Rows[0]["BPBFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPBFT"]) : 0d; + bpaft = data.Rows[0]["BPAFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPAFT"]) : 0d; + bphol = data.Rows[0]["BPHOL"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPHOL"]) : 0d; + bpovr = data.Rows[0]["BPOVR"] != DBNull.Value ? data.Rows[0]["BPOVR"].ToString().Trim() : defaultBPOVR; + bplve = data.Rows[0]["BPLVE"] != DBNull.Value ? data.Rows[0]["BPLVE"].ToString().Trim() : defaultBPLVE; + bpott = data.Rows[0]["BPOTT"] != DBNull.Value ? data.Rows[0]["BPOTT"].ToString().Trim() : "1"; + } + } + // 非專案人員 + else + { + // 取得非專案人員的月薪、伙食津貼資料以及薪資異動資料的月薪、伙食津貼 + DbCommand cmd = Query.NewCommand( + @"SELECT * FROM + ( + SELECT BPENO, 0 AS BPITM, '1900/01/01' AS BPBDT, BPSRM, BPP02 + FROM BPSL + WHERE BPENO=@BPENO + UNION + SELECT RPENO AS BPENO, RPITM AS BPITM, RPBDT AS BPBDT, RPSRM AS BPSRM, RPP02 AS BPP02 + FROM RPSL + WHERE RPENO=@BPENO + ) BPSL_TMP + ORDER BY BPITM"); + cmd.Parameters.Add(Query.NewParameter("BPENO", bpeno)); + DataTable data = Query.Select(cmd); + + bpovr = defaultBPOVR; + bplve = defaultBPLVE; + bpbft = GetFeeRate("非專案人員前二加班", aDate1, null); + bpaft = GetFeeRate("非專案人員後二加班", aDate1, null); + bphol = GetFeeRate("非專案人員假日加班", aDate1, null); + bpsrm = 0; + bpp02 = 0; + bpott = "1"; + + if (data.Rows.Count == 0) + { + return; + } + else + { + // 依照日期,推算應該適用的月薪與伙食津貼 + for (int i = 0; i < data.Rows.Count; i++) + { + DateTime bpbdt = data.Rows[i]["BPBDT"] != DBNull.Value ? Convert.ToDateTime(data.Rows[i]["BPBDT"]) : new DateTime(1900, 1, 1); + if (aDate1.CompareTo(bpbdt) >= 0) + { + bpsrm = data.Rows[i]["BPSRM"] != DBNull.Value ? Convert.ToInt32(data.Rows[i]["BPSRM"]) : 0; + bpp02 = data.Rows[i]["BPP02"] != DBNull.Value ? Convert.ToInt32(data.Rows[i]["BPP02"]) : 0; + } + } + } + } + } + + /// + /// 取得人員請假、加班、費用紀錄 + /// + /// 年月 + /// 專案年度編號 + /// 資料起始日 + /// 資料結束日 + /// 派遣起日 + /// 派遣訖日 + /// 員工編號 + /// 費用類型 + /// 結算日 + /// 交易 + /// + public DataTable GetRPAR(DateTime yymm, string rppyn, DateTime startDay, DateTime endDay, DateTime rasdt, DateTime raedt, string rpeno, string rptyp, int bpfed, DbTransaction tran) + { + DateTime startDay1, endDay1; + + // 上個月月底超過結算日,起始日為上個月的結算日 + 1 + if (yymm.AddDays(-1).Day > bpfed) + startDay1 = yymm.AddMonths(-1).AddDays(bpfed); + // 否則起始日為這個月的月初 + else + startDay1 = yymm; + + // 本月月底超過結算日,結束日為本月結算日 + if (yymm.AddMonths(1).AddDays(-1).Day > bpfed) + endDay1 = yymm.AddDays(bpfed - 1); + // 否則結束日為本月的月底日 + else + endDay1 = yymm.AddMonths(1).AddDays(-1); + + // rptyp == "2" 是電話費以及油料費 + // 此二項費用輸入時只輸入年月,所以資料都建立於該年月的 1 日 + // 如果依照起始日及結束日來修正資料抓取的日期區間,並且起始日不是 1 日時 + // 就會抓不到資料 + if (rptyp != "2") + { + // 起始日不為月初,以起始日為準 + if (startDay.Year == yymm.Year && startDay.Month == yymm.Month && startDay.Day != 1) + startDay1 = startDay; + // 結束日不為月底,以結束日為準 + if (endDay.Year == yymm.Year && endDay.Month == yymm.Month && endDay.Day != WGuard1.GetMonthEnd(yymm, 0).Day) + endDay1 = endDay; + } + + if (rasdt.Ticks == 0) rasdt = new DateTime(1900, 1, 1); + if (raedt.Ticks == 0) raedt = new DateTime(2999, 1, 1); + + // 取出不用簽核或是已經簽核過的 RPAR 紀錄 + // 2020/09/30 差旅費改抓差旅費明細,避免跨月的差旅費重複計算 + // 2024/02/03 不再使用 RPPYN 條件,改用用派遣起訖日範圍 + DbCommand cmd = Query.NewCommand( + @"SELECT RPPYN, RPREN, RPNUM, RPRDT, RPEDT, RPTYP, RPTCT, + (CASE WHEN RPTYP LIKE '3%' THEN (SELECT SUM(RPSUM) FROM RPAD WHERE RPAD.RPREN=RPAR.RPREN AND RPDAT >= @YYMM1 AND RPDAT <= @YYMM2) + ELSE RPFTR + END) AS RPFTR, + RPDOC, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5, RPRTM, RPETM, RPRSN, RPPLC + FROM RPAR + WHERE RPNUM=@RPNUM + AND ( + (RPRDT >= @RASDT AND RPRDT <= @RAEDT) + OR (RPEDT >= @RASDT AND RPEDT <= @RAEDT) + OR (RPRDT <= @RASDT AND RPEDT >= @RAEDT) + ) + AND ( + (RPRDT >= @YYMM1 AND RPRDT <= @YYMM2) + OR (RPEDT >= @YYMM1 AND RPEDT <= @YYMM2) + OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM2) + ) + AND RPTYP LIKE '" + rptyp + @"%' + AND ((RPAPN IS NULL) OR (RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y')) + ORDER BY RPREN"); + cmd.Parameters.Add(Query.NewParameter("RASDT", rasdt)); + cmd.Parameters.Add(Query.NewParameter("RAEDT", raedt)); + cmd.Parameters.Add(Query.NewParameter("RPNUM", rpeno)); + cmd.Parameters.Add(Query.NewParameter("YYMM1", startDay1)); + cmd.Parameters.Add(Query.NewParameter("YYMM2", endDay1)); + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmd); + DataTable result = new DataTable(); + da.Fill(result); + + // 修正不正確的 RPPYN,讓報表取資料能正確 + foreach (DataRow row in result.Rows) + { + var row_rppyn = WDAC.GetStringValue(row["RPPYN"]).Trim(); + var row_rpren = WDAC.GetStringValue(row["RPREN"]).Trim(); + if (row_rppyn != rppyn) + { + row.BeginEdit(); + row["RPPYN"] = rppyn; + row.EndEdit(); + row.AcceptChanges(); + + DbCommand cmd2 = Query.NewCommand("UPDATE RPAR SET RPPYN=@RPPYN WHERE RPREN=@RPREN"); + cmd2.Parameters.Add(Query.NewParameter("RPPYN", rppyn)); + cmd2.Parameters.Add(Query.NewParameter("RPREN", row_rpren)); + cmd2.Connection = tran.Connection; + cmd2.Transaction = tran; + cmd2.ExecuteNonQuery(); + } + } + + return result; + } + + /// + /// 取得請假紀錄 + /// 上月 bpfed + 1 日至本月 bpdef 日 + /// + public DataTable GetRPAR0X(DateTime yymm, string rppyn, DateTime startDay, DateTime endDay, DateTime rasdt, DateTime raedt, string rpeno, int bpfed, DbTransaction tran) + { + return GetRPAR(yymm, rppyn, startDay, endDay, rasdt, raedt, rpeno, RPAR_TYPE.T0_請假, bpfed, tran); + } + + /// + /// 取得加班與補休紀錄 + /// 上月 bpfed + 1 日至本月 bpdef 日 + /// + public DataTable GetRPAR1X(DateTime yymm, string rppyn, DateTime startDay, DateTime endDay, DateTime rasdt, DateTime raedt, string rpeno, int bpfed, DbTransaction tran) + { + return GetRPAR(yymm, rppyn, startDay, endDay, rasdt, raedt, rpeno, RPAR_TYPE.T1_加班, bpfed, tran); + } + + /// + /// 以日期取得人員加班紀錄 + /// + /// 日期 + /// 計畫年度代號 + /// 員工編號 + /// 交易 + /// + public DataTable GetRPAR1XByDate(DateTime date, string rppyn, string rpeno, DbTransaction tran) + { + DbCommand cmd = Query.NewCommand( + @"SELECT RPPYN, RPREN, RPNUM, RPRDT, RPEDT, RPTYP, RPTCTm RPFTR, + RPDOC, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5, RPRTM, RPETM, RPRSN, RPPLC + FROM RPAR + WHERE RPPYN=@RPPYN + AND RPNUM=@RPNUM + AND RPRDT = @DATE + AND RPTYP LIKE '1%' + AND ((RPAPN IS NULL) OR (RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y')) + ORDER BY RPREN"); + cmd.Parameters.Add(Query.NewParameter("RPPYN", rppyn)); + cmd.Parameters.Add(Query.NewParameter("RPNUM", rpeno)); + cmd.Parameters.Add(Query.NewParameter("DATE", date)); + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmd); + DataTable result = new DataTable(); + da.Fill(result); + return result; + } + + /// + /// 取得當日人員請假紀錄 + /// + /// 年月 + /// 資料起始日 + /// 資料結束日 + /// 計畫年度代號 + /// 員工編號 + /// 費用類型 + /// 結算日 + /// 交易 + /// + public DataTable GetRPAR0XByDate(DateTime date, string rppyn, string rpeno, DbTransaction tran) + { + // 取出不用簽核或是已經簽核過的 RPAR 紀錄 + // 2020/9/30 差旅費改抓差旅費明細,避免跨月的差旅費重複計算 + DbCommand cmd = Query.NewCommand( + @"SELECT RPPYN, RPREN, RPNUM, RPRDT, RPEDT, RPTYP, RPTCT, RPFTR, + RPDOC, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5, RPRTM, RPETM, RPRSN, RPPLC + FROM RPAR + WHERE RPPYN=@RPPYN + AND RPNUM=@RPNUM + AND ( + (RPRDT >= @YYMM1 AND RPRDT <= @YYMM2) + OR (RPEDT >= @YYMM1 AND RPEDT <= @YYMM2) + OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM2) + ) + AND RPTYP LIKE '0%' + AND ((RPAPN IS NULL) OR (RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y')) + ORDER BY RPREN"); + cmd.Parameters.Add(Query.NewParameter("RPPYN", rppyn)); + cmd.Parameters.Add(Query.NewParameter("RPNUM", rpeno)); + cmd.Parameters.Add(Query.NewParameter("YYMM1", date)); + cmd.Parameters.Add(Query.NewParameter("YYMM2", date)); + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmd); + DataTable result = new DataTable(); + da.Fill(result); + return result; + } + + /// + /// 取得電話費與油料費 + /// 上月 bpfed + 1 日至本月 bpdef 日 + /// + public DataTable GetRPAR2X(DateTime yymm, string rppyn, DateTime startDay, DateTime endDay, DateTime rasdt, DateTime raedt, string rpeno, int bpfed, DbTransaction tran) + { + return GetRPAR(yymm, rppyn, startDay, endDay, rasdt, raedt, rpeno, RPAR_TYPE.T2_電話油料, bpfed, tran); + } + + /// + /// 取得差勤紀錄 + /// 上月 bpfed + 1 日至本月 bpdef 日 + /// + public DataTable GetRPAR3X(DateTime yymm, string rppyn, DateTime startDay, DateTime endDay, DateTime rasdt, DateTime raedt, string rpeno, int bpfed, DbTransaction tran) + { + return GetRPAR(yymm, rppyn, startDay, endDay, rasdt, raedt, rpeno, RPAR_TYPE.T3_出差, bpfed, tran); + } + + /// + /// 取得某期間、某人員勞健保加退保紀錄 + /// + public DataTable GetRPIR(DateTime startDay, DateTime endDay, string rpeno, DbTransaction tran, bool isLabor) + { + // 1. 取出區間內加退保主檔,依加保日排序 + DbCommand cmd = Query.NewCommand( + @"SELECT RPREN, RPSDT + FROM RPIR + WHERE RPENO=@RPENO + AND ((RPSDT <= @YYMM1 AND RPEDT >= @YYMM2) + OR (RPSDT <= @YYMM1 AND RPEDT IS NULL) + OR (RPSDT <= @YYMM1 AND RPEDT >= @YYMM1 AND RPEDT <= @YYMM2) + OR (RPSDT >= @YYMM1 AND RPSDT <= @YYMM2 AND RPEDT >= @YYMM2) + OR (RPSDT >= @YYMM1 AND RPSDT <= @YYMM2 AND RPEDT IS NULL) + OR (RPSDT >= @YYMM1 AND RPSDT <= @YYMM2 AND RPEDT >= @YYMM1 AND RPEDT <= @YYMM2)) + ORDER BY RPSDT"); + cmd.Parameters.Add(Query.NewParameter("RPENO", rpeno)); + cmd.Parameters.Add(Query.NewParameter("YYMM1", startDay)); + cmd.Parameters.Add(Query.NewParameter("YYMM2", endDay)); + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmd); + DataTable rpirRpren = new DataTable(); + da.Fill(rpirRpren); + + if (rpirRpren.Rows.Count == 0) + return rpirRpren; + + RpirDAC rpirDao = new RpirDAC(); + DataTable rpir = new DataTable(); + + foreach (DataRow rpirRow in rpirRpren.Rows) + { + string rpren = rpirRow["RPREN"].ToString(); + rpir.Merge(rpirDao.SelectRPIB(rpren, tran, "RPITM ASC", true), true, MissingSchemaAction.Add); + } + + // 整理每一筆紀錄,將結束日期填入 + for (int i = 0; i < rpir.Rows.Count; i++) + { + int rpitm = Convert.ToInt32(rpir.Rows[i]["RPITM"]); + + rpir.Rows[i].BeginEdit(); + + // 若項次不是 0,把起始日填入生效日 + if (rpitm != 0) + { + DateTime rpbdt = Convert.ToDateTime(rpir.Rows[i]["RPBDT"]); + } + + // 沒有結束日 + if (rpir.Rows[i]["RPEDT"] == DBNull.Value) + { + // 若不是最後一筆,且下一筆項次不是 0 + if (i < rpir.Rows.Count - 1 && Convert.ToInt32(rpir.Rows[i + 1]["RPITM"]) != 0) + { + // 下一筆沒有退保日,把下一筆的生效日期前一天與結束日比較之後的較前一天放入退保日期 + if (rpir.Rows[i + 1]["RPEDT"] == DBNull.Value) + { + DateTime rpbdt = Convert.ToDateTime(rpir.Rows[i + 1]["RPBDT"]); + if (rpbdt < endDay) + rpir.Rows[i]["RPEDT"] = rpbdt.AddDays(-1); + else + rpir.Rows[i]["RPEDT"] = endDay; + } + // 下一筆有結束日,把下一筆的結束日,放入這一筆的結束日 + else + { + rpir.Rows[i]["RPEDT"] = rpir.Rows[i + 1]["RPEDT"]; + } + } + // 最後一筆 + else if (i == rpir.Rows.Count - 1) + { + DateTime rpsdt = Convert.ToDateTime(rpir.Rows[i]["RPSDT"]); + // 結束日大於月底日,結束日放入加保日的當月月底 + if (rpsdt > endDay) + rpir.Rows[i]["RPEDT"] = WGuard1.GetMonthEnd(rpsdt, 0); + // 否則放入月底日 + else + rpir.Rows[i]["RPEDT"] = endDay; + } + } + rpir.Rows[i]["RPXDT"] = rpir.Rows[i]["RPEDT"]; + + rpir.Rows[i].EndEdit(); + } + + // 再一次整理,剔除: + // 1. 生效起日與生效迄日均在日期區間外的紀錄 + // 2. 生效迄日小於生效起日的紀錄 + // 3. 生效起日等於生效迄日且是最後一筆,但項次不是 0 的紀錄 + // 4. 後面的已經涵蓋整個月,前面的都要刪除 + // 5. 生效起日與生效迄日相同且作業類別是退保、眷屬退保、留職停薪的紀錄 + int count = rpir.Rows.Count - 1; + bool goOut = false; + List cover = new List(); + for (int i = rpir.Rows.Count - 1; i >= 0; i--) + { + DataRow row = rpir.Rows[i]; + DateTime rpsdt = WQuery.GetDateTimeValue(row["RPBDT"]); + DateTime rpedt = WQuery.GetDateTimeValue(row["RPXDT"]); + int rpitm = WQuery.GetInt32Value(row["RPITM"]); + string rpopt = WQuery.GetStringValue(row["RPOPT"]); + + if (rpopt == "退保" && rpedt >= startDay && rpedt <= endDay) + goOut = true; + + bool allCover = true; + DateTime day = startDay; + while (day <= endDay) + { + allCover &= cover.Contains(day); + day = day.AddDays(1); + if (!allCover) + break; + } + + if (allCover + || (rpsdt < startDay && rpedt < startDay) + || (rpsdt > endDay && rpedt > endDay) + || (rpsdt > rpedt) + || (rpsdt == rpedt && i == count && rpitm != 0) + || (rpsdt == rpedt && (rpopt == "退保" || rpopt == "眷屬退保" || rpopt == "留職停薪")) + ) + rpir.Rows.RemoveAt(i); + else + { + day = rpsdt; + while (day <= rpedt) + { + if (!cover.Contains(day)) + cover.Add(day); + day = day.AddDays(1); + } + } + } + + // 再做一次欄位改變比對 + if (isLabor) + { + for (int i = 0; i < rpir.Rows.Count; i++) + { + if (i > 0) + rpirDao.CompareChanged(rpir.Rows[i], rpir.Rows[i - 1]); + } + // 這段期間退保,將最後一筆的作業類別改為退保 + if (goOut) + { + rpir.Rows[rpir.Rows.Count - 1].BeginEdit(); + rpir.Rows[rpir.Rows.Count - 1]["RPOPT"] = "退保"; + rpir.Rows[rpir.Rows.Count - 1].EndEdit(); + rpir.Rows[rpir.Rows.Count - 1].AcceptChanges(); + } + } + + return rpir; + } + + /// + /// 取得薪資項目以及與個人有關費用的加總 + /// + public DataTable GetSSMSSum01(DateTime yymm, string rppyn, DbTransaction tran) + { + DbCommand cmd = Query.NewCommand( + @"SELECT SUM(SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 - SSS01 - SSS02) BPS01, + SUM(SSH01 + SSH02 + SSH03) BPS02, + SUM(SSH05) BPS03, + SUM(SSH04) BPS04, + SUM(SSH06) BPS05, + SUM(SSP09 + SSP10) BPS06, + SUM(SSP12) BPS07, + SUM(SSP06 + SSP07 + SSP08) BPS08, + SUM(SSP11) BPS09 + FROM SSMS_VIEW WHERE SSYMM = @YYMM AND SSPYN = @SSPYN"); + cmd.Parameters.Add(Query.NewParameter("YYMM", yymm)); + cmd.Parameters.Add(Query.NewParameter("SSPYN", rppyn)); + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmd); + DataTable result = new DataTable(); + da.Fill(result); + return result; + } + + /// + /// 取得科目預設的備註 + /// + /// 年度專案編號 + /// 科目編號 + /// 要加入的交易物件 + /// + public string GetBPAB_BPDOC(string bppyn, string bpacc, DbTransaction tran) + { + DbCommand cmd = Query.NewCommand("SELECT BPDOC FROM BPAB WHERE BPPYN=@BPPYN AND BPACC=@BPACC"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); + cmd.Parameters.Add(Query.NewParameter("BPACC", bpacc)); + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + object o = cmd.ExecuteScalar(); + if (o != null && o != DBNull.Value) + return o.ToString(); + else + return ""; + } + + /// + /// 取得憑證加總 by 科目 + /// + public DataTable GetRPFESum(DateTime yymm, string rppyn, DbTransaction tran) + { + DbCommand cmd = Query.NewCommand( + @"SELECT RPACC, SUM(RPAMT) RPAMT + FROM RPFE WHERE RPDAT = @YYMM AND RPPYN = @RPPYN + GROUP BY RPACC"); + cmd.Parameters.Add(Query.NewParameter("YYMM", yymm)); + cmd.Parameters.Add(Query.NewParameter("RPPYN", rppyn)); + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmd); + DataTable result = new DataTable(); + da.Fill(result); + return result; + } + + /// + /// 取得差勤結算日 + /// + /// 專案年度編號 + /// 要加入的交易 + /// + public int GetBPAA_BPFED(string bppyn, DbTransaction tran) + { + DbCommand cmd = Query.NewCommand( + @"SELECT BPFED + FROM BPAA WHERE BPPYN = @BPPYN"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + object o = cmd.ExecuteScalar(); + if (o == null || o == DBNull.Value) + return 31; + else + return Convert.ToInt32(o); + } + + /// + /// 取得加班匯總資料 + /// + public DataTable GetROWK(DateTime yymm, string ropyn, string roeno, DbTransaction tran) + { + DbCommand cmd = Query.NewCommand( + @"SELECT ROYMM, ROPYN, ROENO, ROT01, ROT02, ROT03, ROT04, ROT05, ROA01, ROA02, ROA03, ROA05, ROT06, ROA06 + FROM ROWK WHERE ROYMM = @YYMM AND ROPYN = @ROPYN AND ROENO=@ROENO"); + cmd.Parameters.Add(Query.NewParameter("YYMM", yymm)); + cmd.Parameters.Add(Query.NewParameter("ROPYN", ropyn)); + cmd.Parameters.Add(Query.NewParameter("ROENO", roeno)); + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmd); + DataTable result = new DataTable(); + da.Fill(result); + return result; + } + + /// + /// 取得總表用資料 + /// + public bool GetSACDReportData(string bppyn, DateTime aYYMM, out DataTable reportData) + { + // 產生資料架構 + DataColumn[] keys = new DataColumn[1]; + DbCommand cmdSACDTmp = Query.NewCommand( + @"SELECT (SELECT TOP 1 B.BPACC FROM BPAB B WHERE B.BPPYN=A.BPPYN AND B.BPACC=SUBSTRING(A.BPACC,1,2) + '0000') BPACC_A, + (SELECT TOP 1 B.BPAME FROM BPAB B WHERE B.BPPYN=A.BPPYN AND B.BPACC=SUBSTRING(A.BPACC,1,2) + '0000') BPAME_A, + (SELECT TOP 1 C.BPACC FROM BPAB C WHERE C.BPPYN=A.BPPYN AND C.BPACC=SUBSTRING(A.BPACC,1,4) + '00') BPACC_B, + (SELECT TOP 1 C.BPAME FROM BPAB C WHERE C.BPPYN=A.BPPYN AND C.BPACC=SUBSTRING(A.BPACC,1,4) + '00') BPAME_B, + A.BPPYN, A.BPACC, A.BPBGT, A.BPCLS, A.BPAME, + '' MM, + CASE WHEN D.BPS13=A.BPACC OR D.BPS14=A.BPACC THEN 'N' ELSE 'Y' END SHOW, + 0 SAAMT_01, 0 SAAMT_02, 0 SAAMT_03, 0 SAAMT_04, 0 SAAMT_05, 0 SAAMT_06, + 0 SAAMT_07, 0 SAAMT_08, 0 SAAMT_09, 0 SAAMT_10, 0 SAAMT_11, 0 SAAMT_12, + '' SADOC + FROM BPAB A INNER JOIN BPAA D ON A.BPPYN=D.BPPYN + WHERE A.BPPYN=@BPPYN AND SUBSTRING(A.BPACC,5,2) <> '00'"); + cmdSACDTmp.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); + reportData = Query.Select(cmdSACDTmp); + + if (reportData.Rows.Count == 0) + return false; + + keys[0] = reportData.Columns["BPACC"]; + reportData.PrimaryKey = keys; + + // 擷取科目對照 + DataTable bpaa = Query.Select("SELECT * FROM BPAA WHERE BPPYN='" + bppyn + "'"); + DataRow bpaaRow = bpaa.Rows[0]; + + // 擷取每月資料,填入資料架構 + DbCommand cmdSACD = Query.NewCommand( + @"SELECT A.BPACC, + ISNULL(B.SAAMT, 0) SAAMT, + ISNULL(B.SADOC, '') SADOC + FROM BPAB A LEFT OUTER JOIN SACD B ON A.BPPYN = B.SAPYN AND A.BPACC = B.SAACC AND B.SAYMM = @SAYMM + WHERE A.BPPYN=@BPPYN AND SUBSTRING(A.BPACC,5,2) <> '00'"); + cmdSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); + cmdSACD.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); + + DateTime aYYMM1 = new DateTime(aYYMM.Year, 1, 1); + string thisMonth = aYYMM.ToString("MMM", WGuard1.TaiwanCulture) + "份"; + string prevMonth = aYYMM.AddMonths(-1).ToString("MMM", WGuard1.TaiwanCulture) + "份"; + + for (int i = 0; i < aYYMM.Month; i++) + { + // 取得每月資料 + cmdSACD.Parameters["SAYMM"].Value = aYYMM1.AddMonths(i); + DataTable sacdThisMonth = Query.Select(cmdSACD); + + // 取得每月之前一個月資料 + cmdSACD.Parameters["SAYMM"].Value = aYYMM1.AddMonths(i - 1); + DataTable sacdPrevMonth = Query.Select(cmdSACD); + + foreach (DataRow row in sacdThisMonth.Rows) + { + string bpacc = row["BPACC"].ToString(); + DataRow aRow = reportData.Rows.Find(bpacc); + aRow.BeginEdit(); + + if (bpacc == bpaaRow["BPS02"].ToString() || + bpacc == bpaaRow["BPS03"].ToString() || + bpacc == bpaaRow["BPS04"].ToString() || + bpacc == bpaaRow["BPS05"].ToString() || + bpacc == bpaaRow["BPS11"].ToString()) + { + aRow["MM"] = prevMonth; + DataRow[] prev = sacdPrevMonth.Select("BPACC='" + bpacc + "'"); + if (prev.Length > 0) + aRow[String.Format("SAAMT_{0:00}", i + 1)] = prev[0]["SAAMT"]; + else + aRow[String.Format("SAAMT_{0:00}", i + 1)] = 0; + } + else + { + aRow["MM"] = thisMonth; + aRow[String.Format("SAAMT_{0:00}", i + 1)] = row["SAAMT"]; + } + + if (aYYMM.Month == i + 1) + aRow["SADOC"] = row["SADOC"]; + aRow.EndEdit(); + } + } + + return true; + } + + /// + /// 取得薪資勞健保報表資料 + /// + public bool GetSSMSReportData(string bppyn, DateTime aYYMM, bool year, out DataTable reportData) + { + string where = string.Empty; + + if (year) + where = "WHERE A.SSPYN=@SSPYN AND A.SSYMM >= @SSYMM_1 AND A.SSYMM < @SSYMM_2 AND DATEPART(DAY, A.SSYMM) = 1"; + else + where = "WHERE A.SSPYN=@SSPYN AND A.SSYMM=@SSYMM_1"; + + string sql = String.Format(@"SELECT A.SSYMM, A.SSENO, B.BPNME, A.SSJNO, C.BPJME, A.SSCNO, D.BPCME, A.SSBRH, + E.BSRMK SSBRHX, A.SSD01, A.SSD02, A.SSSRD, A.SSP00, A.SSP01, A.SSP02, + A.SSP03, A.SSP04, A.SSP05, A.SSP06, A.SSP07, A.SSP08, A.SSP09, A.SSP10, + A.SSP11, A.SSP12, A.SSP13, A.SSP14, A.SSP15, A.SSP99, A.SSS01, A.SSS02, + A.SSS03, A.SSS04, A.SSS05, A.SSS06, A.SSS07, A.SSS08, A.SSS09, A.SSS10, + A.SSS11, A.SSS12, A.SSS13, A.SSS14, A.SSS15, A.SSS99, A.SSH01, A.SSH02, + A.SSH03, A.SSH04, A.SSH05, A.SSH06, A.SSH07, A.SSH08, A.SSH09, A.SSH10, + A.SST01, A.SST02, A.SST03, A.SST04, A.SST05, A.SST06, A.SST07, A.SST08, + A.SST09, A.SST10, A.SST11, A.SST12, A.SST13, A.SST14, A.SST15, A.SST16, + A.SST17, A.SST18, A.SST19, A.SST20, A.SST21, A.SST22, A.SST23, A.SST24, + A.SST25, A.SSL01, A.SSL02, A.SSL03, A.SSL04, A.SSL05, A.SSC01, A.SSC02, + A.SSC03, A.SSC04, A.SSC05, A.SSC06, A.SSC07, A.SSC08, A.SSC09, A.SSC10, + B.BPSDY, D.BPSRM, D.BPP02, A.SST01M, A.SST02M, A.SST03M, A.SST04M, A.SST05M, + A.SST06M, A.SST07M, A.SST08M, A.SST09M, A.SST10M, A.SST11M, A.SST12M, + A.SST13M, A.SST14M, A.SST15M, A.SST16M, A.SST17M, A.SST19M, A.SST20M, + A.SST21M, A.SST22M, A.SST23M, A.SST24M, A.SST25M, + (SELECT TOP 1 RASDT FROM RASN F WHERE A.SSPYN=F.RAPYN AND A.SSENO=F.RANUM AND F.RASDT <= @SSYMM_1 ORDER BY F.RASDT DESC) RASDT, + (SELECT TOP 1 RAEDT FROM RASN F WHERE A.SSPYN=F.RAPYN AND A.SSENO=F.RANUM AND F.RASDT <= @SSYMM_1 ORDER BY F.RASDT DESC) RAEDT + FROM SSMS_VIEW A + INNER JOIN BPSNView B ON A.SSENO=B.BPENO + LEFT OUTER JOIN BPJA C ON A.SSPYN=C.BPPYN AND A.SSJNO=C.BPJNO + LEFT OUTER JOIN BPJB D ON A.SSPYN=D.BPPYN AND A.SSJNO=D.BPJNO AND A.SSCNO=D.BPCNO + LEFT OUTER JOIN BCLS E ON A.SSBRH=E.BSCLS AND E.BSPAR='BPSNBRH' + {0} + ORDER BY SSBRH, SSENO, SSYMM", where); + + DbCommand cmdBHIF = Query.NewCommand(sql); + cmdBHIF.Parameters.Add(Query.NewParameter("SSPYN", bppyn)); + cmdBHIF.Parameters.Add(Query.NewParameter("SSYMM_1", aYYMM)); + if (year) + cmdBHIF.Parameters.Add(Query.NewParameter("SSYMM_2", aYYMM.AddMonths(year ? 12 : 1))); + + DbConnection conn = Query.NewConnection(); + cmdBHIF.Connection = conn; + DbDataAdapter da = Query.NewDataAdapter(cmdBHIF); + reportData = new DataTable(); + da.FillSchema(reportData, SchemaType.Mapped); + da.Fill(reportData); + + // 處理「中心」 + foreach (DataRow row in reportData.Rows) + { + if (row["SSBRHX"].ToString().Contains("中心")) + { + row.BeginEdit(); + row["SSBRHX"] = "中心"; + row.EndEdit(); + } + } + + return reportData.Rows.Count > 0; + } + + /// + /// 取得薪資總表資料 + /// + public bool GetSSMSSummaryReportData(DateTime aYYMM, out DataTable reportData) + { + DbCommand cmdBHIF = Query.NewCommand( + @"SELECT A.SSPYN, B.BPPYM, + SUM(A.SSP00) AS SSP00, SUM(A.SSP01) AS SSP01, SUM(A.SSP02) AS SSP02, + SUM(A.SSP03) AS SSP03, SUM(A.SSP04) AS SSP04, SUM(A.SSP05) AS SSP05, + SUM(A.SSP06) AS SSP06, SUM(A.SSP07) AS SSP07, SUM(A.SSP08) AS SSP08, + SUM(A.SSP09) AS SSP09, SUM(A.SSP10) AS SSP10, SUM(A.SSP11) AS SSP11, + SUM(A.SSP12) AS SSP12, SUM(A.SSP13) AS SSP13, SUM(A.SSP14) AS SSP14, + SUM(A.SSP15) AS SSP15, SUM(A.SSP99) AS SSP99, SUM(A.SSS01) AS SSS01, + SUM(A.SSS02) AS SSS02, SUM(A.SSS03) AS SSS03, SUM(A.SSS04) AS SSS04, + SUM(A.SSS05) AS SSS05, SUM(A.SSS06) AS SSS06, SUM(A.SSS07) AS SSS07, + SUM(A.SSS08) AS SSS08, SUM(A.SSS09) AS SSS09, SUM(A.SSS10) AS SSS10, + SUM(A.SSS11) AS SSS11, SUM(A.SSS12) AS SSS12, SUM(A.SSS13) AS SSS13, + SUM(A.SSS14) AS SSS14, SUM(A.SSS15) AS SSS15, SUM(A.SSS99) AS SSS99, + SUM(A.SSH01) AS SSH01, SUM(A.SSH02) AS SSH02, SUM(A.SSH03) AS SSH03, + SUM(A.SSH04) AS SSH04, SUM(A.SSH05) AS SSH05, SUM(A.SSH06) AS SSH06, + SUM(A.SSH07) AS SSH07, SUM(A.SSH08) AS SSH08, SUM(A.SSH09) AS SSH09, + SUM(A.SSH10) AS SSH10, SUM(A.SST01) AS SST01, SUM(A.SST02) AS SST02, + SUM(A.SST03) AS SST03, SUM(A.SST04) AS SST04, SUM(A.SST05) AS SST05, + SUM(A.SST06) AS SST06, SUM(A.SST07) AS SST07, SUM(A.SST08) AS SST08, + SUM(A.SST09) AS SST09, SUM(A.SST10) AS SST10, SUM(A.SST11) AS SST11, + SUM(A.SST12) AS SST12, SUM(A.SST13) AS SST13, SUM(A.SST14) AS SST14, + SUM(A.SST15) AS SST15, SUM(A.SST16) AS SST16, SUM(A.SST17) AS SST17, + SUM(A.SST18) AS SST18, SUM(A.SST19) AS SST19, SUM(A.SST20) AS SST20, + SUM(A.SST21) AS SST21, SUM(A.SST22) AS SST22, SUM(A.SST23) AS SST23, + SUM(A.SST24) AS SST24, SUM(A.SST25) AS SST25, + SUM(A.SSL01) AS SSL01, SUM(A.SSL02) AS SSL02, SUM(A.SSL03) AS SSL03, + SUM(A.SSL04) AS SSL04, SUM(A.SSL05) AS SSL05 + FROM SSMS_VIEW A + INNER JOIN BPAA B ON A.SSPYN=B.BPPYN + WHERE A.SSYMM=@SSYMM + GROUP BY A.SSPYN, B.BPPYM + ORDER BY A.SSPYN"); + cmdBHIF.Parameters.Add(Query.NewParameter("SSYMM", aYYMM)); + + reportData = Query.Select(cmdBHIF); + + return reportData.Rows.Count > 0; + } + + /// + /// 由費率類別、年月取得費率 + /// + /// 費率類別 + /// 年月 + /// + public double GetFeeRate(string BRTYP, DateTime aYYMM, DbTransaction tran) + { + DbCommand cmdBRTE = Query.NewCommand( + @"SELECT TOP 1 BRRTE, BRVER FROM BRTE + WHERE BRTYP=@BRTYP + AND ((BRSDT <= @YYMM AND BREDT IS NULL) OR (BRSDT <= @YYMM AND BREDT >= @YYMM)) + ORDER BY BRVER DESC"); + cmdBRTE.Parameters.Add(Query.NewParameter("BRTYP", BRTYP)); + cmdBRTE.Parameters.Add(Query.NewParameter("YYMM", aYYMM)); + object o; + if (tran == null) + o = Query.ExecuteScalar(cmdBRTE); + else + { + cmdBRTE.Connection = tran.Connection; + cmdBRTE.Transaction = tran; + o = cmdBRTE.ExecuteScalar(); + } + + if (o == null || o == DBNull.Value) + return 0d; + else + return Convert.ToDouble(o); + } + + public DateTime Get關帳日(string bppyn) + { + DbCommand cmd = Query.NewCommand(@"SELECT BPMSD FROM BPAA WHERE BPPYN=@BPPYN"); + Query.AddParam(cmd, "BPPYN", bppyn); + object o = Query.ExecuteScalar(cmd); + return WDAC.GetDateTimeValue(o).AddMonths(1).AddDays(-1); + } +} + +/// +/// 專案年度接單 +/// +public struct BPAARecord +{ + ///專案年度編號 + public string BPPYN; + ///年度預算 + public int BPBGT; + ///年關帳日 + public DateTime BPCSD; + ///月關帳日 + public DateTime BPMSD; + ///薪資科目 + public string BPS01; + ///勞保雇主部份負擔科目 + public string BPS02; + ///健保雇主部份負擔科目 + public string BPS03; + ///工資墊償基金科目 + public string BPS04; + ///勞退金提撥科目 + public string BPS05; + ///外勤作業費科目 + public string BPS06; + ///油料費科目 + public string BPS07; + ///加班費科目 + public string BPS08; + ///電話費科目 + public string BPS09; + ///行政督導薪資科目 + public string BPS10; + ///行政督導保險及退休提撥科目 + public string BPS11; + ///行政督導加班費科目 + public string BPS12; + ///公費科目 + public string BPS13; + ///營業稅科目 + public string BPS14; + ///管理費用 + public string BPS15; + ///科目16 + public string BPS16; + ///科目17 + public string BPS17; + ///科目18 + public string BPS18; + ///科目19 + public string BPS19; + ///科目20 + public string BPS20; + ///科目21 + public string BPS21; + ///科目22 + public string BPS22; + ///科目23 + public string BPS23; + ///科目24 + public string BPS24; + ///科目25 + public string BPS25; + ///科目26 + public string BPS26; + ///科目27 + public string BPS27; + ///科目28 + public string BPS28; + ///科目29 + public string BPS29; + ///科目30 + public string BPS30; + ///差勤結算日 + public int BPFED; + ///薪資破月計算方式 + public string BPSAL; + ///公司別 + public string BPCPY; + ///加班時數計算方式 + public string BPOTT; + ///補休有效期(月) + public int BPOTD; + + public void FillRecord(DataRow row) + { + BPPYN = row["BPPYN"] != DBNull.Value ? row["BPPYN"].ToString().Trim() : ""; + BPBGT = row["BPBGT"] != DBNull.Value ? Convert.ToInt32(row["BPBGT"]) : 0; + BPCSD = row["BPCSD"] != DBNull.Value ? Convert.ToDateTime(row["BPCSD"]) : new DateTime(0); + BPMSD = row["BPMSD"] != DBNull.Value ? Convert.ToDateTime(row["BPMSD"]) : new DateTime(0); + BPS01 = row["BPS01"] != DBNull.Value ? row["BPS01"].ToString().Trim() : ""; + BPS02 = row["BPS02"] != DBNull.Value ? row["BPS02"].ToString().Trim() : ""; + BPS03 = row["BPS03"] != DBNull.Value ? row["BPS03"].ToString().Trim() : ""; + BPS04 = row["BPS04"] != DBNull.Value ? row["BPS04"].ToString().Trim() : ""; + BPS05 = row["BPS05"] != DBNull.Value ? row["BPS05"].ToString().Trim() : ""; + BPS06 = row["BPS06"] != DBNull.Value ? row["BPS06"].ToString().Trim() : ""; + BPS07 = row["BPS07"] != DBNull.Value ? row["BPS07"].ToString().Trim() : ""; + BPS08 = row["BPS08"] != DBNull.Value ? row["BPS08"].ToString().Trim() : ""; + BPS09 = row["BPS09"] != DBNull.Value ? row["BPS09"].ToString().Trim() : ""; + BPS10 = row["BPS10"] != DBNull.Value ? row["BPS10"].ToString().Trim() : ""; + BPS11 = row["BPS11"] != DBNull.Value ? row["BPS11"].ToString().Trim() : ""; + BPS12 = row["BPS12"] != DBNull.Value ? row["BPS12"].ToString().Trim() : ""; + BPS13 = row["BPS13"] != DBNull.Value ? row["BPS13"].ToString().Trim() : ""; + BPS14 = row["BPS14"] != DBNull.Value ? row["BPS14"].ToString().Trim() : ""; + BPS15 = row["BPS15"] != DBNull.Value ? row["BPS15"].ToString().Trim() : ""; + BPS16 = row["BPS16"] != DBNull.Value ? row["BPS16"].ToString().Trim() : ""; + BPS17 = row["BPS17"] != DBNull.Value ? row["BPS17"].ToString().Trim() : ""; + BPS18 = row["BPS18"] != DBNull.Value ? row["BPS18"].ToString().Trim() : ""; + BPS19 = row["BPS19"] != DBNull.Value ? row["BPS19"].ToString().Trim() : ""; + BPS20 = row["BPS20"] != DBNull.Value ? row["BPS20"].ToString().Trim() : ""; + BPS21 = row["BPS21"] != DBNull.Value ? row["BPS21"].ToString().Trim() : ""; + BPS22 = row["BPS22"] != DBNull.Value ? row["BPS22"].ToString().Trim() : ""; + BPS23 = row["BPS23"] != DBNull.Value ? row["BPS23"].ToString().Trim() : ""; + BPS24 = row["BPS24"] != DBNull.Value ? row["BPS24"].ToString().Trim() : ""; + BPS25 = row["BPS25"] != DBNull.Value ? row["BPS25"].ToString().Trim() : ""; + BPS26 = row["BPS26"] != DBNull.Value ? row["BPS26"].ToString().Trim() : ""; + BPS27 = row["BPS27"] != DBNull.Value ? row["BPS27"].ToString().Trim() : ""; + BPS28 = row["BPS28"] != DBNull.Value ? row["BPS28"].ToString().Trim() : ""; + BPS29 = row["BPS29"] != DBNull.Value ? row["BPS29"].ToString().Trim() : ""; + BPS30 = row["BPS30"] != DBNull.Value ? row["BPS30"].ToString().Trim() : ""; + BPFED = row["BPFED"] != DBNull.Value ? Convert.ToInt32(row["BPFED"]) : 31; + BPSAL = row["BPSAL"] != DBNull.Value ? row["BPSAL"].ToString().Trim() : "1"; + BPCPY = row["BPCPY"] != DBNull.Value ? row["BPCPY"].ToString().Trim() : ""; + BPOTT = row["BPOTT"] != DBNull.Value ? row["BPOTT"].ToString().Trim() : "1"; + BPOTD = row["BPOTD"] != DBNull.Value ? Convert.ToInt32(row["BPOTD"]) : 6; + } +} + +/// +/// 人員派遣紀錄 +/// +public struct RASNRecord +{ + ///人員編號 + public string RANUM; + ///派遣項次 + public int RAITM; + ///客戶編號 + public string RACNM; + ///專案年度編號 + public string RAPYN; + ///派遣開始日期 + public DateTime RASDT; + ///派遣結束日期 + public DateTime RAEDT; + ///離職日 + public DateTime BPEDY; + ///職稱 + public string RAJNO; + ///等級 + public string RACNO; + ///站別 + public string RABRH; + ///月薪 + public int BPSRM; + ///時薪 + public int BPSRD; + ///全勤獎金 + public int BPP01; + ///伙食津貼 + public int BPP02; + ///職務加給 + public int BPP03; + ///派駐津貼 + public int BPP04; + ///其他津貼 + public int BPP05; + ///前二加班 + public double BPBFT; + ///後二加班 + public double BPAFT; + ///假日加班 + public double BPHOL; + ///加班費計算公式 + public string BPOVR; + ///請假扣款計算公式 + public string BPLVE; + + public void FillRecord(DataRow row) + { + RANUM = row["RANUM"] != DBNull.Value ? row["RANUM"].ToString().Trim() : ""; + RAITM = row["RAITM"] != DBNull.Value ? Convert.ToInt32(row["RAITM"]) : 0; + RACNM = row["RACNM"] != DBNull.Value ? row["RACNM"].ToString().Trim() : ""; + RAPYN = row["RAPYN"] != DBNull.Value ? row["RAPYN"].ToString().Trim() : ""; + RASDT = row["RASDT"] != DBNull.Value ? Convert.ToDateTime(row["RASDT"]) : new DateTime(0); + RAEDT = row["RAEDT"] != DBNull.Value ? Convert.ToDateTime(row["RAEDT"]) : new DateTime(0); + BPEDY = row["BPEDY"] != DBNull.Value ? Convert.ToDateTime(row["BPEDY"]) : new DateTime(0); + RAJNO = row["RAJNO"] != DBNull.Value ? row["RAJNO"].ToString().Trim() : ""; + RACNO = row["RACNO"] != DBNull.Value ? row["RACNO"].ToString().Trim() : ""; + RABRH = row["RABRH"] != DBNull.Value ? row["RABRH"].ToString().Trim() : ""; + BPSRM = row["BPSRM"] != DBNull.Value ? Convert.ToInt32(row["BPSRM"]) : 0; + BPSRD = row["BPSRD"] != DBNull.Value ? Convert.ToInt32(row["BPSRD"]) : 0; + BPP01 = row["BPP01"] != DBNull.Value ? Convert.ToInt32(row["BPP01"]) : 0; + BPP02 = row["BPP02"] != DBNull.Value ? Convert.ToInt32(row["BPP02"]) : 0; + BPP03 = row["BPP03"] != DBNull.Value ? Convert.ToInt32(row["BPP03"]) : 0; + BPP04 = row["BPP04"] != DBNull.Value ? Convert.ToInt32(row["BPP04"]) : 0; + BPP05 = row["BPP05"] != DBNull.Value ? Convert.ToInt32(row["BPP05"]) : 0; + BPBFT = row["BPBFT"] != DBNull.Value ? Convert.ToDouble(row["BPBFT"]) : 1d; + BPAFT = row["BPAFT"] != DBNull.Value ? Convert.ToDouble(row["BPAFT"]) : 1d; + BPHOL = row["BPHOL"] != DBNull.Value ? Convert.ToDouble(row["BPHOL"]) : 1d; + BPOVR = row["BPOVR"] != DBNull.Value ? row["BPOVR"].ToString() : GetData.defaultBPOVR; + BPLVE = row["BPLVE"] != DBNull.Value ? row["BPLVE"].ToString() : GetData.defaultBPLVE; + } +} + +/// +/// 非專案人員薪資計算用資料類別 +/// +public struct BPSNNoCaseRecord +{ + public string BPENO; + public DateTime STA_DATE; + public DateTime END_DATE; + public int BPSRM; + public int BPSRD; + public int BPP01; + public int BPP02; + public int BPP03; + public int BPP04; + public int BPP05; + + public void FillRecord(DataRow row) + { + BPENO = row["BPENO"] != DBNull.Value ? row["BPENO"].ToString() : ""; + STA_DATE = row["STA_DATE"] != DBNull.Value ? Convert.ToDateTime(row["STA_DATE"]) : new DateTime(); + END_DATE = row["END_DATE"] != DBNull.Value ? Convert.ToDateTime(row["END_DATE"]) : new DateTime(); + BPSRM = row["BPSRM"] != DBNull.Value ? Convert.ToInt32(row["BPSRM"]) : 0; + BPSRD = row["BPSRD"] != DBNull.Value ? Convert.ToInt32(row["BPSRD"]) : 0; + BPP01 = row["BPP01"] != DBNull.Value ? Convert.ToInt32(row["BPP01"]) : 0; + BPP02 = row["BPP02"] != DBNull.Value ? Convert.ToInt32(row["BPP02"]) : 0; + BPP03 = row["BPP03"] != DBNull.Value ? Convert.ToInt32(row["BPP03"]) : 0; + BPP04 = row["BPP04"] != DBNull.Value ? Convert.ToInt32(row["BPP04"]) : 0; + BPP05 = row["BPP05"] != DBNull.Value ? Convert.ToInt32(row["BPP05"]) : 0; + } +} + +/// +/// 人員請假、加班、差旅、費用紀錄 +/// +public struct RPARRecord +{ + ///年度接單編號 + public string RPPYN; + ///員工編號 + public string RPNUM; + ///單號 + public string RPREN; + ///開始日期或發生日期 + public DateTime RPRDT; + ///結束日期 + public DateTime RPEDT; + ///類別 + public string RPTYP; + ///時數 + public int RPTCT; + ///費用 + public int RPFTR; + ///前二時數 + public int RPTC1; + ///後二時數 + public int RPTC2; + ///假日時數 + public int RPTC3; + ///2.67時數 + public int RPTC4; + ///2.00時數 + public int RPTC5; + ///備註 + public string RPDOC; + ///開始時間 + public string RPRTM; + ///結束時間 + public string RPETM; + ///差旅地點 + public string RPPLC; + ///差旅事由 + public string RPRSN; + + public void FillRecord(DataRow row) + { + RPPYN = WDAC.GetStringValue(row["RPPYN"]); + RPNUM = WDAC.GetStringValue(row["RPNUM"]); + RPREN = WDAC.GetStringValue(row["RPREN"]); + RPRDT = WDAC.GetDateTimeValue(row["RPRDT"]); + RPEDT = WDAC.GetDateTimeValue(row["RPEDT"]); + RPTYP = WDAC.GetStringValue(row["RPTYP"]); + RPTCT = WDAC.GetInt32Value(row["RPTCT"]); + RPFTR = WDAC.GetInt32Value(row["RPFTR"]); + RPTC1 = WDAC.GetInt32Value(row["RPTC1"]); + RPTC2 = WDAC.GetInt32Value(row["RPTC2"]); + RPTC3 = WDAC.GetInt32Value(row["RPTC3"]); + RPTC4 = WDAC.GetInt32Value(row["RPTC4"]); + RPTC5 = WDAC.GetInt32Value(row["RPTC5"]); + RPDOC = WDAC.GetStringValue(row["RPDOC"]); + RPRTM = WDAC.GetStringValue(row["RPRTM"]); + RPETM = WDAC.GetStringValue(row["RPETM"]); + RPPLC = WDAC.GetStringValue(row["RPPLC"]); + RPRSN = WDAC.GetStringValue(row["RPRSN"]); + } +} + +/// +/// 勞健保加退保紀錄 +/// +public struct RPIRRecord +{ + ///人員編號 + public string RPENO; + ///生效起日 + public DateTime RPBDT; + ///生效迄日 + public DateTime RPXDT; + ///加保日期 + public DateTime RPSDT; + ///退保日期 + public DateTime RPEDT; + ///薪資 + public int RPSLY; + ///勞保投保級距 + public int RPAMT; + ///健保投保級距 + public int RPAM2; + ///勞退投保級距 + public int RPAM3; + ///一般眷口數 + public int RPFMY; + ///減免25%眷口數 + public int RPFM1; + ///減免50%眷口數 + public int RPFM2; + ///減免100%眷口數 + public int RPFM3; + ///勞退自提 + public int RPSLA; + ///勞保減免比例 + public string RPDIS; + ///健保減免比例 + public string RPDIH; + ///已領老年給付 + public bool RPOLD; + ///國籍別 1=本國籍 / 2=外國籍 + public string RPNAT; + ///身份別 + public string RPPTP; + ///有勞保 + public bool RPLIS; + ///有健保 + public bool RPHIS; + ///公司別 + public string RPCPY; + ///超過65歲 + public bool RPOVR; + ///異動類別 1=加保, 2=退保, 3=其他異動 + public int TRTYPE; + ///GoOut 轉出 + public bool GoOut; + + public void FillRecord(DataRow row) + { + RPENO = WDAC.GetStringValue(row["RPENO"]); + RPBDT = WDAC.GetDateTimeValue(row["RPBDT"]); + RPXDT = WDAC.GetDateTimeValue(row["RPXDT"]); + RPSDT = WDAC.GetDateTimeValue(row["RPSDT"]); + RPEDT = WDAC.GetDateTimeValue(row["RPEDT"]); + RPSLY = WDAC.GetInt32Value(row["RPSLY"]); + RPAMT = WDAC.GetInt32Value(row["RPAMT"]); + RPAM2 = WDAC.GetInt32Value(row["RPAM2"]); + RPAM3 = WDAC.GetInt32Value(row["RPAM3"]); + RPFMY = WDAC.GetInt32Value(row["RPFMY"]); + RPFM1 = WDAC.GetInt32Value(row["RPFM1"]); + RPFM2 = WDAC.GetInt32Value(row["RPFM2"]); + RPFM3 = WDAC.GetInt32Value(row["RPFM3"]); + RPSLA = WDAC.GetInt32Value(row["RPSLA"]); + RPDIS = WDAC.GetStringValue(row["RPDIS"]).Trim(); + RPDIH = WDAC.GetStringValue(row["RPDIH"]).Trim(); + RPOLD = WDAC.GetStringValue(row["RPOLD"]).Trim() == "Y"; + RPNAT = WDAC.GetStringValue(row["RPNAT"]).Trim(); + RPPTP = WDAC.GetStringValue(row["RPPTP"]).Trim(); + RPLIS = WDAC.GetStringValue(row["RPLIS"]).Trim() == "Y"; + RPHIS = WDAC.GetStringValue(row["RPHIS"]).Trim() == "Y"; + RPCPY = WDAC.GetStringValue(row["RPCPY"]); + RPOVR = WDAC.GetStringValue(row["RPOVR"]).Trim() == "Y"; + GoOut = WDAC.GetStringValue(row["RPOPT"]) == "退保"; + + int itemNo = WDAC.GetInt32Value(row["RPITM"]); + string rpedtChanged = WDAC.GetStringValue(row["RPEDT_Changed"]); + if (itemNo == 0) + TRTYPE = 1; // 加保 + else if (rpedtChanged == "Y" && RPEDT.Ticks > 0) + TRTYPE = 2; // 退保 + else + TRTYPE = 3; // 其他異動 + } +} + +/// +/// 人員月加班匯總 +/// +public struct ROWKRecord +{ + ///員工編號 + public string ROENO; + ///月份 + public DateTime ROYMM; + ///專案年度編號 + public string ROPYN; + ///前二加班時數 + public int ROT01; + ///後二加班時數 + public int ROT02; + ///假日加班時數 + public int ROT03; + ///申請補休時數 + public int ROT04; + ///2.67加班時數 + public int ROT05; + ///2.00加班時數 + public int ROT06; + ///前二加班費 + public int ROA01; + ///後二加班費 + public int ROA02; + ///假日加班費 + public int ROA03; + ///2.67加班費 + public int ROA05; + ///2.00加班費 + public int ROA06; + + public void FillRecord(DataRow row) + { + ROENO = WDAC.GetStringValue(row["ROENO"]); + ROYMM = WDAC.GetDateTimeValue(row["ROYMM"]); + ROPYN = WDAC.GetStringValue(row["ROPYN"]); + ROT01 = WDAC.GetInt32Value(row["ROT01"]); + ROT02 = WDAC.GetInt32Value(row["ROT02"]); + ROT03 = WDAC.GetInt32Value(row["ROT03"]); + ROT04 = WDAC.GetInt32Value(row["ROT04"]); + ROT05 = WDAC.GetInt32Value(row["ROT05"]); + ROT06 = WDAC.GetInt32Value(row["ROT06"]); + ROA01 = WDAC.GetInt32Value(row["ROA01"]); + ROA02 = WDAC.GetInt32Value(row["ROA02"]); + ROA03 = WDAC.GetInt32Value(row["ROA03"]); + ROA05 = WDAC.GetInt32Value(row["ROA05"]); + ROA06 = WDAC.GetInt32Value(row["ROA06"]); + } +} + +public class ProjectEmployeeItem +{ + public string BPENO { get; set; } + public string BPNME { get; set; } + public string BPBRH { get; set; } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/LoginBPAP.cs b/Web/App_Code/DAC/LoginBPAP.cs new file mode 100644 index 0000000..ec89c8b --- /dev/null +++ b/Web/App_Code/DAC/LoginBPAP.cs @@ -0,0 +1,143 @@ +using System; +using System.Data; +using System.Configuration; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Common; +using Wellan.Data; + +/// +/// Summary description for Login +/// +public class LoginBPAP +{ + private string _userId = ""; + private string _password = ""; + private string _userName = ""; + private string _errMessage = ""; + private string _userLang = ""; + private bool _noPassword = false; + + public LoginBPAP() + { + } + + public string UserId + { + get + { + return _userId; + } + set + { + _userId = value; + } + } + + public string Password + { + get + { + return _password; + } + set + { + _password = value; + } + } + + public string UserName + { + get + { + return _userName; + } + } + + public string ErrorMessage + { + get + { + return _errMessage; + } + } + + public bool NoPassword + { + get + { + return _noPassword; + } + } + + public string UserLang + { + get + { + return _userLang; + } + set + { + _userLang = value; + } + } + + /// + /// oO_nJ\ + /// + /// nJ\P_CY^ falseA~TNxsb ErrorMessage ݩʤ + public bool GetResult() + { + WConnectionString.ConnectionConfigFile = WConfig.GetConnectionConfig(); + string ConnName = WConfig.GetConnectionConfigName(); + string ConnStr = WConnectionString.GetConnectionString(ConnName); + string ConnType = WConnectionString.GetConnectionType(ConnName); + + WQuery Query = new WQuery(ConnType); + DbConnection conn = Query.NewConnection(ConnStr); + DbCommand cmd = Query.NewCommand("SELECT BPENO, BPNME, BPPWD FROM BPAP WHERE BPENO=@BPENO"); + cmd.Parameters.Add(Query.NewParameter("@BPENO", _userId)); + DataTable rs = Query.Select(conn, cmd); + _noPassword = false; + + if (rs.Rows.Count == 0) + { + _errMessage = WStringTable.GetInstance().GetString(_userLang, "LOGIN.NOUSERID"); + return false; + } + else + { + string pwd1 = rs.Rows[0]["BPPWD"].ToString(); + string pwd2 = WGuard1.KeyDec(pwd1); + + if (pwd1.CompareTo("\u007f\u007f\u007f\u007f") == 0) + { + _noPassword = true; + pwd2 = ""; + } + + if (_password.CompareTo(pwd2) != 0) + { + _errMessage = WStringTable.GetInstance().GetString(_userLang, "LOGIN.WRONGPASSWORD"); + return false; + } + + /* + if (rs.Rows[0]["BPEDY"] != DBNull.Value) + { + _errMessage = WStringTable.GetInstance().GetString(_userLang, "LOGIN.NORIGHT"); + return false; + } + */ + } + + _errMessage = ""; + _userName = rs.Rows[0]["BPNME"].ToString(); + return true; + } +} diff --git a/Web/App_Code/DAC/LoginBPSN.cs b/Web/App_Code/DAC/LoginBPSN.cs new file mode 100644 index 0000000..2b93db4 --- /dev/null +++ b/Web/App_Code/DAC/LoginBPSN.cs @@ -0,0 +1,150 @@ +using System; +using System.Data; +using System.Configuration; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Common; +using Wellan.Data; + +/// +/// Summary description for Login +/// +public class LoginBPSN +{ + private string _userId = ""; + private string _password = ""; + private string _userName = ""; + private string _errMessage = ""; + private string _userLang = ""; + private bool _noPassword = false; + + public LoginBPSN() + { + } + + public string UserId + { + get + { + return _userId; + } + set + { + _userId = value; + } + } + + public string Password + { + get + { + return _password; + } + set + { + _password = value; + } + } + + public string UserName + { + get + { + return _userName; + } + } + + public string ErrorMessage + { + get + { + return _errMessage; + } + } + + public bool NoPassword + { + get + { + return _noPassword; + } + } + + public string UserLang + { + get + { + return _userLang; + } + set + { + _userLang = value; + } + } + + /// + /// oO_nJ\ + /// + /// nJ\P_CY^ falseA~TNxsb ErrorMessage ݩʤ + public bool GetResult() + { + try + { + WConnectionString.ConnectionConfigFile = WConfig.GetConnectionConfig(); + string ConnName = WConfig.GetConnectionConfigName(); + string ConnStr = WConnectionString.GetConnectionString(ConnName); + string ConnType = WConnectionString.GetConnectionType(ConnName); + + WQuery Query = new WQuery(ConnType); + DbConnection conn = Query.NewConnection(ConnStr); + DbCommand cmd = Query.NewCommand("SELECT BPENO, BPNME, BPEDY, BPAWD FROM BPSNView WHERE BPENO=@BPENO"); + cmd.Parameters.Add(Query.NewParameter("@BPENO", _userId)); + DataTable rs = Query.Select(conn, cmd); + _noPassword = false; + + if (rs.Rows.Count == 0) + { + _errMessage = WStringTable.GetInstance().GetString(_userLang, "LOGIN.NOUSERID"); + return false; + } + else + { + string pwd1 = rs.Rows[0]["BPAWD"].ToString(); + string pwd2 = WGuard1.KeyDec(pwd1); + + if (pwd1.CompareTo("\u007f\u007f\u007f\u007f") == 0) + { + _noPassword = true; + pwd2 = ""; + } + + if (_password.CompareTo(pwd2) != 0) + { + _errMessage = WStringTable.GetInstance().GetString(_userLang, "LOGIN.WRONGPASSWORD"); + return false; + } + + if (rs.Rows[0]["BPEDY"] != DBNull.Value) + { + _errMessage = WStringTable.GetInstance().GetString(_userLang, "LOGIN.NORIGHT"); + return false; + } + } + + _errMessage = ""; + _userName = rs.Rows[0]["BPNME"].ToString(); + return true; + } + catch + { + _errMessage = "tΦLAеyA"; + _userName = ""; + return false; + } + } +} diff --git a/Web/App_Code/DAC/ProjectBranchGroupDAC.cs b/Web/App_Code/DAC/ProjectBranchGroupDAC.cs new file mode 100644 index 0000000..29a333c --- /dev/null +++ b/Web/App_Code/DAC/ProjectBranchGroupDAC.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.ComponentModel; + +/// +/// ProjectBranchGroupDAC 的摘要描述 +/// +[DataObject] +public class ProjectBranchGroupDAC : Wellan.Data.WDAC +{ + public ProjectBranchGroupDAC() + { + } + + public ProjectBranchGroupDAC(Wellan.Data.WQuery query): base(query) + { + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public List SelectByProject(string projectID) + { + var cmd = Query.NewCommand( + @"SELECT SELECT A.ProjectID, A.BranchID, B.BSSCR BranchName, A.GroupID + FROM ProjectBranchGroup A + LEFT JOIN BCLS B ON A.BranchID = B.BSCLS AND B.BSPAR='BPSNBRH' + WHERE A.ProjectID=@ProjectID ORDER BY A.GroupID, A.BranchID"); + AddParam(cmd, "ProjectID", projectID); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Delete)] + public void DeleteByProject(string projectID) + { + var cmd = Query.NewCommand(@"DELETE FROM ProjectBranchGroup WHERE ProjectID=@ProjectID"); + AddParam(cmd, "ProjectID", projectID); + Query.ExecuteNonQuery(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Insert)] + public void Insert(string projectID, string branchID, string groupID) + { + var cmd = Query.NewCommand(@"INSERT INTO ProjectBranchGroup (ProjectID, BranchID, GroupID) VALUES (@ProjectID, @BranchID, @GroupID)"); + AddParam(cmd, "ProjectID", projectID); + AddParam(cmd, "BranchID", branchID); + AddParam(cmd, "GroupID", groupID); + Query.ExecuteNonQuery(cmd); + } +} + +public class ProjectBranchGroupItem +{ + public string ProjectID { get; set; } + public string BranchID { get; set; } + public string BranchName { get; set; } + public string GroupID { get; set; } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/RasnDAC.cs b/Web/App_Code/DAC/RasnDAC.cs new file mode 100644 index 0000000..82d512a --- /dev/null +++ b/Web/App_Code/DAC/RasnDAC.cs @@ -0,0 +1,595 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Configuration; +using System.Data; +using System.Data.Common; +using System.Text; +using System.Xml.Linq; +using Wellan.Data; + +/// +/// 人員派遣資料的資料處理類別 +/// +public class RasnDAC : Wellan.Data.WDAC +{ + private DbCommand cmdSelectRasnRapyn = null; + private DbCommand cmdSelectRasb = null; + private DbCommand cmdSelectRasnOne = null; + private DbCommand cmdSelectRasbOne = null; + private DbCommand cmdSelectRasnAll = null; + private DbCommand cmdSelectRasnAll2 = null; + + public RasnDAC() + { + string selectRasn = + @"SELECT A.RANUM, A.RAITM, 0 AS RBITM, NULL AS RBBDT, A.RACNM, A.RAPYN, A.RASDT, + A.RAEDT, A.RAJNO, A.RACNO, A.RABRH, A.RAS01, A.RAWTZ, A.APPNO, + B.BPSRM, B.BPSRD, B.BPP01, B.BPP02, B.BPP03, B.BPP04, B.BPP05 + FROM RASN A + INNER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO + WHERE A.RANUM=@RANUM AND A.RAITM=@RAITM"; + string selectRasb = + @"SELECT A.RANUM, A.RAITM, B.RBITM, B.RBBDT, A.RACNM, A.RAPYN, A.RASDT, + A.RAEDT, B.RAJNO, B.RACNO, B.RABRH, A.RAS01, A.RAWTZ, B.APPNO, + C.BPSRM, C.BPSRD, C.BPP01, C.BPP02, C.BPP03, C.BPP04, C.BPP05 + FROM RASN A + INNER JOIN RASB B ON A.RANUM=B.RANUM AND A.RAITM=B.RAITM + INNER JOIN BPJB C ON A.RAPYN=C.BPPYN AND B.RAJNO=C.BPJNO AND B.RACNO=C.BPCNO + WHERE A.RANUM=@RANUM AND A.RAITM=@RAITM"; + + // 取出最後一筆異動 + cmdSelectRasb = Query.NewCommand( + "SELECT TOP 1 * FROM ( " + selectRasn + " UNION " + selectRasb + " ) TMP ORDER BY RBITM DESC"); + cmdSelectRasb.Parameters.Add(Query.NewParameter("RANUM", DbType.String)); + cmdSelectRasb.Parameters.Add(Query.NewParameter("RAITM", DbType.Int32)); + + // 取出某一筆員工派遣資料 + cmdSelectRasnOne = Query.NewCommand(selectRasn); + cmdSelectRasnOne.Parameters.Add(Query.NewParameter("RANUM", DbType.String)); + cmdSelectRasnOne.Parameters.Add(Query.NewParameter("RAITM", DbType.Int32)); + + // 取出某一筆員工派遣異動資料 + cmdSelectRasbOne = Query.NewCommand(selectRasb + " AND B.RBITM=@RBITM"); + cmdSelectRasbOne.Parameters.Add(Query.NewParameter("RANUM", DbType.String)); + cmdSelectRasbOne.Parameters.Add(Query.NewParameter("RAITM", DbType.Int32)); + cmdSelectRasbOne.Parameters.Add(Query.NewParameter("RBITM", DbType.Int32)); + + // 取出某員工編號全部的紀錄,以異動次數排序 + cmdSelectRasnAll = Query.NewCommand(selectRasn + " UNION " + selectRasb + " ORDER BY RBITM"); + cmdSelectRasnAll.Parameters.Add(Query.NewParameter("RANUM", DbType.String)); + cmdSelectRasnAll.Parameters.Add(Query.NewParameter("RAITM", DbType.Int32)); + + // 取出某員工編號全部的紀錄,以生效日期排序 + cmdSelectRasnAll2 = Query.NewCommand(selectRasn + " UNION " + selectRasb + " ORDER BY RBBDT"); + cmdSelectRasnAll2.Parameters.Add(Query.NewParameter("RANUM", DbType.String)); + cmdSelectRasnAll2.Parameters.Add(Query.NewParameter("RAITM", DbType.Int32)); + } + + public RasnDAC(string connectionConfig, string connectionConfigName) + : this() + { + base._connectionConfig = connectionConfig; + base._connectionConfigName = connectionConfigName; + } + + public RasnDAC(WQuery query) + : this() + { + base._query = query; + } + + // 準備輸出資料架構 + private DataTable NewResult() + { + DataTable Result = new DataTable(); + Result.Columns.Add("RANUM", typeof(String)); + Result.Columns.Add("RAITM", typeof(Int32)); + Result.Columns.Add("RBITM", typeof(Int32)); + Result.Columns.Add("RBBDT", typeof(DateTime)); + Result.Columns.Add("RACNM", typeof(String)); + Result.Columns.Add("RAPYN", typeof(String)); + Result.Columns.Add("RASDT", typeof(DateTime)); + Result.Columns.Add("RAEDT", typeof(DateTime)); + Result.Columns.Add("RAJNO", typeof(String)); + Result.Columns.Add("RACNO", typeof(String)); + Result.Columns.Add("RABRH", typeof(String)); + Result.Columns.Add("RAS01", typeof(Double)); + Result.Columns.Add("RAWTZ", typeof(String)); + Result.Columns.Add("APPNO", typeof(Int32)); + Result.Columns.Add("BPSRM", typeof(Int32)); + Result.Columns.Add("BPSRD", typeof(Int32)); + Result.Columns.Add("BPP01", typeof(Int32)); + Result.Columns.Add("BPP02", typeof(Int32)); + Result.Columns.Add("BPP03", typeof(Int32)); + Result.Columns.Add("BPP04", typeof(Int32)); + Result.Columns.Add("BPP05", typeof(Int32)); + Result.Columns.Add("RAEDT_Changed", typeof(Char)); + Result.Columns.Add("RAJNO_Changed", typeof(Char)); + Result.Columns.Add("RACNO_Changed", typeof(Char)); + Result.Columns.Add("RABRH_Changed", typeof(Char)); + Result.Columns.Add("RAWTZ_Changed", typeof(Char)); + Result.Columns.Add("BPSRM_Changed", typeof(Char)); + Result.Columns.Add("BPSRD_Changed", typeof(Char)); + Result.Columns.Add("BPP01_Changed", typeof(Char)); + Result.Columns.Add("BPP02_Changed", typeof(Char)); + Result.Columns.Add("BPP03_Changed", typeof(Char)); + Result.Columns.Add("BPP04_Changed", typeof(Char)); + Result.Columns.Add("BPP05_Changed", typeof(Char)); + + return Result; + } + + private void FillResult(DataTable Result, DataRow source) + { + DataRow newRow = Result.NewRow(); + newRow["RANUM"] = source["RANUM"]; + newRow["RAITM"] = source["RAITM"]; + newRow["RBITM"] = source["RBITM"]; + newRow["RBBDT"] = source["RBBDT"]; + newRow["RACNM"] = source["RACNM"]; + newRow["RAPYN"] = source["RAPYN"]; + newRow["RASDT"] = source["RASDT"]; + newRow["RAEDT"] = source["RAEDT"]; + newRow["RAJNO"] = source["RAJNO"]; + newRow["RACNO"] = source["RACNO"]; + newRow["RABRH"] = source["RABRH"]; + newRow["RAS01"] = source["RAS01"]; + newRow["RAWTZ"] = source["RAWTZ"]; + newRow["APPNO"] = source["APPNO"]; + newRow["BPSRM"] = source["BPSRM"]; + newRow["BPSRD"] = source["BPSRD"]; + newRow["BPP01"] = source["BPP01"]; + newRow["BPP02"] = source["BPP02"]; + newRow["BPP03"] = source["BPP03"]; + newRow["BPP04"] = source["BPP04"]; + newRow["BPP05"] = source["BPP05"]; + newRow["RAEDT_Changed"] = 'N'; + newRow["RAJNO_Changed"] = 'N'; + newRow["RACNO_Changed"] = 'N'; + newRow["RABRH_Changed"] = 'N'; + newRow["RAWTZ_Changed"] = 'N'; + newRow["BPSRM_Changed"] = 'N'; + newRow["BPSRD_Changed"] = 'N'; + newRow["BPP01_Changed"] = 'N'; + newRow["BPP02_Changed"] = 'N'; + newRow["BPP03_Changed"] = 'N'; + newRow["BPP04_Changed"] = 'N'; + newRow["BPP05_Changed"] = 'N'; + Result.Rows.Add(newRow); + } + + private Char FieldDiff(object obj1, object obj2) + { + string s1 = obj1 != DBNull.Value ? obj1.ToString() : ""; + string s2 = obj2 != DBNull.Value ? obj2.ToString() : ""; + if (s1.CompareTo(s2) != 0) + return 'Y'; + else + return 'N'; + } + + private void FillResult(DataTable Result, DataRow current, DataRow prev) + { + DataRow newRow = Result.NewRow(); + newRow["RANUM"] = current["RANUM"]; + newRow["RAITM"] = current["RAITM"]; + newRow["RBITM"] = current["RBITM"]; + newRow["RBBDT"] = current["RBBDT"]; + newRow["RACNM"] = current["RACNM"]; + newRow["RAPYN"] = current["RAPYN"]; + newRow["RASDT"] = current["RASDT"]; + newRow["RAEDT"] = current["RAEDT"]; + newRow["RAJNO"] = current["RAJNO"]; + newRow["RACNO"] = current["RACNO"]; + newRow["RABRH"] = current["RABRH"]; + newRow["RAS01"] = current["RAS01"]; + newRow["APPNO"] = current["APPNO"]; + newRow["BPSRM"] = current["BPSRM"]; + newRow["BPSRD"] = current["BPSRD"]; + newRow["BPP01"] = current["BPP01"]; + newRow["BPP02"] = current["BPP02"]; + newRow["BPP03"] = current["BPP03"]; + newRow["BPP04"] = current["BPP04"]; + newRow["BPP05"] = current["BPP05"]; + newRow["RAEDT_Changed"] = FieldDiff(current["RAEDT"], prev["RAEDT"]); + newRow["RAJNO_Changed"] = FieldDiff(current["RAJNO"], prev["RAJNO"]); + newRow["RACNO_Changed"] = FieldDiff(current["RACNO"], prev["RACNO"]); + newRow["RABRH_Changed"] = FieldDiff(current["RABRH"], prev["RABRH"]); + newRow["BPSRM_Changed"] = FieldDiff(current["BPSRM"], prev["BPSRM"]); + newRow["BPSRD_Changed"] = FieldDiff(current["BPSRD"], prev["BPSRD"]); + newRow["BPP01_Changed"] = FieldDiff(current["BPP01"], prev["BPP01"]); + newRow["BPP02_Changed"] = FieldDiff(current["BPP02"], prev["BPP02"]); + newRow["BPP03_Changed"] = FieldDiff(current["BPP03"], prev["BPP03"]); + newRow["BPP04_Changed"] = FieldDiff(current["BPP04"], prev["BPP04"]); + newRow["BPP05_Changed"] = FieldDiff(current["BPP05"], prev["BPP05"]); + Result.Rows.Add(newRow); + } + + /// + /// 依條件取出資料,給 GridView 的 Select 用的 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select(string RACNM, string RAPYN) + { + cmdSelectRasnRapyn.Parameters.Clear(); + + DataTable Result = NewResult(); + + // 依條件抓出派遣紀錄 + StringBuilder sb = new StringBuilder(); + sb.Append("SELECT * FROM RASN WHERE 1=1"); + if (RACNM != null && RACNM.Length > 0) + { + sb.Append(" AND RACNM LIKE @RACNM "); + cmdSelectRasnRapyn.Parameters.Add(Query.NewParameter("RACNM", RACNM + "%")); + } + if (RAPYN != null && RAPYN.Length > 0) + { + sb.Append(" AND RAPYN LIKE @RAPYN "); + cmdSelectRasnRapyn.Parameters.Add(Query.NewParameter("RAPYN", RAPYN + "%")); + } + sb.Append("ORDER BY RACNM, RAPYN, RANUM, RAITM"); + + cmdSelectRasnRapyn.CommandText = sb.ToString(); + DataTable rasnTmp1 = Query.Select(cmdSelectRasnRapyn); + + // 一筆一筆的抓出應該顯示的資料 + DataTable rasnTmp2; + foreach (DataRow rasnRow in rasnTmp1.Rows) + { + // 依照員工編號及派遣項次,抓出最後一筆異動 + cmdSelectRasb.Parameters["RANUM"].Value = rasnRow["RANUM"]; + cmdSelectRasb.Parameters["RAITM"].Value = rasnRow["RAITM"]; + rasnTmp2 = Query.Select(cmdSelectRasb); + + // 填入異動資料 + if (rasnTmp2.Rows.Count != 0) + { + FillResult(Result, rasnTmp2.Rows[0]); + } + } + + return Result; + } + + /// + /// 取出某一筆派遣異動資料,給 FormView 的 Select 用的 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectOne(string RANUM, int RAITM, int RBITM) + { + return SelectOne(RANUM, RAITM, RBITM, null); + } + + /// + /// 取出某一筆派遣異動資料,可加入交易中執行 + /// + public DataTable SelectOne(string RANUM, int RAITM, int RBITM, DbTransaction tran) + { + DataTable Result = NewResult(); + DataTable tmp; + + if (RANUM != null && RANUM.Length > 0) + { + // 取原始資料 + if (RBITM == 0) + { + cmdSelectRasnOne.Parameters["RANUM"].Value = RANUM; + cmdSelectRasnOne.Parameters["RAITM"].Value = RAITM; + if (tran == null) + tmp = Query.Select(cmdSelectRasnOne); + else + tmp = Query.Select(cmdSelectRasnOne, tran); + if (tmp.Rows.Count > 0) + FillResult(Result, tmp.Rows[0]); + } + else + { + cmdSelectRasbOne.Parameters["RANUM"].Value = RANUM; + cmdSelectRasbOne.Parameters["RAITM"].Value = RAITM; + cmdSelectRasbOne.Parameters["RBITM"].Value = RBITM; + if (tran == null) + tmp = Query.Select(cmdSelectRasbOne); + else + tmp = Query.Select(cmdSelectRasbOne, tran); + if (tmp.Rows.Count > 0) + FillResult(Result, tmp.Rows[0]); + } + } + return Result; + } + + /// + /// 取出所有派遣異動歷史資料,派遣異動查詢用 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectRASB(string RANUM, int RAITM) + { + DataTable Result = NewResult(); + + if (RANUM != null && RANUM.Length > 0) + { + cmdSelectRasnAll.Parameters["RANUM"].Value = RANUM; + cmdSelectRasnAll.Parameters["RAITM"].Value = RAITM; + + DataTable tmp = Query.Select(cmdSelectRasnAll); + for (int i = 0; i < tmp.Rows.Count; i++) + { + if (i > 0) + FillResult(Result, tmp.Rows[i], tmp.Rows[i - 1]); + else + FillResult(Result, tmp.Rows[i]); + } + } + return Result; + } + + /// + /// 取出某人員最近的專案 + /// + /// + /// + public DataTable SelectRecent(string BPENO) + { + return SelectRecentByDate(BPENO, DateTime.UtcNow.AddHours(8).Date); + + //var cmd = Query.NewCommand( + // @"SELECT TOP 1 A.BPENO, A.BPNME + // , B.RANUM, B.RAITM, B.RACNM, B.RAPYN, B.RASDT, B.RAEDT, B.RABRH, B.RAWTZ + // , F.BPCNO, F.BPCME, F.BPSRM, F.BPSRD + // FROM BPSNView A + // LEFT OUTER JOIN RASN B ON A.BPENO=B.RANUM AND (B.RAEDT IS NULL OR (B.RASDT <= @TODAY AND B.RAEDT >= @TODAY)) + // LEFT OUTER JOIN BPJB F ON B.RAPYN=F.BPPYN AND B.RAJNO=F.BPJNO AND B.RACNO=F.BPCNO + // WHERE A.BPENO = @BPENO + // ORDER BY B.RASDT DESC"); + //Query.AddParam(cmd, "TODAY", DateTime.UtcNow.AddHours(8).Date); + //Query.AddParam(cmd, "BPENO", BPENO); + //return Query.Select(cmd); + } + + /// + /// 取出某人員某日期的專案 + /// + /// + /// + public DataTable SelectRecentByDate(string BPENO, DateTime DATE) + { + var cmd = Query.NewCommand( + @"SELECT TOP 1 A.BPENO, A.BPNME + , B.RANUM, B.RAITM, B.RACNM, B.RAPYN, B.RASDT, B.RAEDT, B.RABRH, B.RAWTZ + , F.BPCNO, F.BPCME, F.BPSRM, F.BPSRD + FROM BPSNView A + LEFT OUTER JOIN RASN B ON A.BPENO=B.RANUM AND ((B.RASDT <= @DATE AND B.RAEDT IS NULL) OR (B.RASDT <= @DATE AND B.RAEDT >= @DATE)) + LEFT OUTER JOIN BPJB F ON B.RAPYN=F.BPPYN AND B.RAJNO=F.BPJNO AND B.RACNO=F.BPCNO + WHERE A.BPENO = @BPENO + ORDER BY B.RASDT DESC"); + Query.AddParam(cmd, "DATE", DATE); + Query.AddParam(cmd, "BPENO", BPENO); + return Query.Select(cmd); + } + + /// + /// 取出某專案年度接單的站別清單 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public List SelectBranchForForm(string rapyn) + { + var cmd = Query.NewCommand( + @"SELECT DISTINCT A.RAPYN ProjectID, A.RABRH BranchID, B.BSSCR BranchName, B.BSRMK BranchShortName, GroupID + FROM RASN A + JOIN BCLS B ON A.RABRH=B.BSCLS AND B.BSPAR='BPSNBRH' + LEFT JOIN ProjectBranchGroup C ON A.RAPYN=C.ProjectID AND A.RABRH=C.BranchID + WHERE A.RAPYN=@RAPYN"); + Query.AddParam(cmd, "RAPYN", rapyn); + return Query.Select(cmd); + } + + /// + /// 取出某專案年度接單的站別清單,依照分組順序排序 + /// + public List SelectBranchForReport(string rapyn) + { + var cmd = Query.NewCommand( + @"SELECT DISTINCT A.RAPYN ProjectID, A.RABRH BranchID, B.BSSCR BranchName, B.BSRMK BranchShortName, GroupID + FROM RASN A + JOIN BCLS B ON A.RABRH=B.BSCLS AND B.BSPAR='BPSNBRH' + JOIN ProjectBranchGroup C ON A.RAPYN=C.ProjectID AND A.RABRH=C.BranchID + WHERE A.RAPYN=@RAPYN + ORDER BY GroupID"); + Query.AddParam(cmd, "RAPYN", rapyn); + return Query.Select(cmd); + } + + /// + /// 取出某人員的專案歷史紀錄 + /// + /// + /// + public DataTable SelectHistoryByEmployee(string ranum) + { + var cmd = Query.NewCommand( + @"SELECT B.BPENO, B.BPNME + , A.RAITM, A.RAPYN, C.BPPYM + , A.RASDT, A.RAEDT, A.RABRH, D.BSSCR + , F.BPJNO, F.BPJME + FROM RASN A + LEFT OUTER JOIN BPSNView B ON B.BPENO=A.RANUM + LEFT JOIN BPAA C ON A.RAPYN = C.BPPYN + LEFT JOIN BCLS D ON A.RABRH = D.BSCLS AND D.BSPAR = 'BPSNBRH' + LEFT JOIN BPJA F ON A.RAPYN = F.BPPYN AND A.RAJNO=F.BPJNO + WHERE A.RANUM = @RANUM + ORDER BY A.RASDT DESC"); + Query.AddParam(cmd, "RANUM", ranum); + return Query.Select(cmd); + } + + public void GetTimeZone(string bpeno, DateTime date, out string timezoneID, out string timezoneName) + { + var rasnTable = SelectRecentByDate(bpeno, date); + timezoneName = string.Empty; + timezoneID = string.Empty; + + if (rasnTable.Rows.Count > 0) + { + timezoneName = WDAC.GetStringValue(rasnTable.Rows[0]["RAWTZ"]); + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = "SELECT WINDOWS_ID FROM BTMZ WHERE NAME=@NAME"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "NAME", rasnTable.Rows[0]["RAWTZ"]); + timezoneID = WDAC.GetStringValue(Query.ExecuteScalar(cmd)).Trim(); + + // 如果表格內沒取到,這裡做個保險 + if (string.IsNullOrEmpty(timezoneID)) + { + switch (timezoneName) + { + case "台北": + case "": + case null: + break; + case "美西": + timezoneID = "Pacific Standard Time"; + break; + case "美東": + timezoneID = "Eastern Standard Time"; + break; + case "東京": + timezoneID = "Tokyo Standard Time"; + break; + case "倫敦": + timezoneID = "GMT Standard Time"; + break; + } + } + } + } + + /// + /// 取出日期區間內派遣資料以及派遣異動資料 + /// + /* + public DataTable SelectRASNDateRange(string RANUM, int RAITM, DateTime startDay, DateTime endDay, DbTransaction tran) + { + // 1. 取出區間內派遣資料,依照開始日期排序 + DbCommand cmd = Query.NewCommand( + @"SELECT RANUM, RAITM, RASDT + FROM RASN + WHERE RANUM=@RANUM AND RAITM=@RAITM + AND ((RASDT <= @YYMM1 AND RAEDT >= @YYMM2) + OR (RASDT <= @YYMM1 AND RAEDT IS NULL) + OR (RASDT <= @YYMM1 AND RAEDT >= @YYMM1 AND RAEDT <= @YYMM2) + OR (RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT >= @YYMM2) + OR (RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT IS NULL) + OR (RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT >= @YYMM1 AND RAEDT <= @YYMM2)) + ORDER BY RASDT"); + cmd.Parameters.Add(Query.NewParameter("RANUM", RANUM)); + cmd.Parameters.Add(Query.NewParameter("RAITM", RAITM)); + cmd.Parameters.Add(Query.NewParameter("YYMM1", startDay)); + cmd.Parameters.Add(Query.NewParameter("YYMM2", endDay)); + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmd); + DataTable rasnTmp1 = new DataTable(); + da.Fill(rasnTmp1); + + if (rasnTmp1.Rows.Count == 0) + return rasnTmp1; + + DataTable rasn; + + foreach (DataRow rasnRow in rasnTmp1.Rows) + { + string ranum = rasnRow["RANUM"].ToString(); + int raitm = Convert.ToInt32(rasnRow["RAITM"]); + + // 取得主檔與異動紀錄 + rasn = SelectRASB(ranum, raitm); + // 取得異動紀錄 + //rpir.Merge(rpirDao.SelectRPIBMonth(ranum, startDay, endDay, tran), true, MissingSchemaAction.Add); + } + + // 整理每一筆紀錄,將退保日期填入 + for (int i = 0; i < rasn.Rows.Count; i++) + { + int rpitm = Convert.ToInt32(rasn.Rows[i]["RPITM"]); + + rasn.Rows[i].BeginEdit(); + + // 若項次不是 0,把加保日填入生效日 //的次月一號 + if (rpitm != 0) + { + DateTime rpbdt = Convert.ToDateTime(rasn.Rows[i]["RPBDT"]); + //rpir.Rows[i]["RPSDT"] = WGuard1.GetMonthBegin(rpbdt, 1); + rasn.Rows[i]["RPSDT"] = rpbdt; + } + + // 沒有退保日 + if (rasn.Rows[i]["RPEDT"] == DBNull.Value) + { + // 若不是最後一筆,且下一筆項次不是 0 + if (i < rasn.Rows.Count - 1 && Convert.ToInt32(rasn.Rows[i + 1]["RPITM"]) != 0) + { + // 下一筆沒有退保日,把下一筆的生效日期前一天 // 的當月月底,放入退保日期 + if (rasn.Rows[i + 1]["RPEDT"] == DBNull.Value) + { + DateTime rpbdt = Convert.ToDateTime(rasn.Rows[i + 1]["RPBDT"]); + //rpir.Rows[i]["RPEDT"] = WGuard1.GetMonthEnd(rpbdt, 0); + rasn.Rows[i]["RPEDT"] = rpbdt.AddDays(-1); + } + // 下一筆有退保日,把下一筆的退保日,放入這一筆的退保日期 + else + { + rasn.Rows[i]["RPEDT"] = rasn.Rows[i + 1]["RPEDT"]; + } + } + // 最後一筆 + else if (i == rasn.Rows.Count - 1) + { + DateTime rpsdt = Convert.ToDateTime(rasn.Rows[i]["RPSDT"]); + // 加保日大於月底日,退保日放入加保日的當月月底 + if (rpsdt > endDay) + rasn.Rows[i]["RPEDT"] = WGuard1.GetMonthEnd(rpsdt, 0); + // 否則放入月底日 + else + rasn.Rows[i]["RPEDT"] = endDay; + } + } + + rasn.Rows[i].EndEdit(); + } + + // 再一次整理,剔除: + // 1. 加保日與退保日均在日期區間外的紀錄 + // 2. 退保日小於加保日的紀錄 + // 3. 加保日等於退保日且是最後一筆,但項次不是 0 的紀錄 + int count = rasn.Rows.Count - 1; + for (int i = rasn.Rows.Count - 1; i >= 0; i--) + { + DateTime rpsdt = Convert.ToDateTime(rasn.Rows[i]["RPSDT"]); + DateTime rpedt = Convert.ToDateTime(rasn.Rows[i]["RPEDT"]); + int rpitm = Convert.ToInt32(rasn.Rows[i]["RPITM"]); + + if ((rpsdt < startDay && rpedt < startDay) + || (rpsdt > endDay && rpedt > endDay) + || (rpsdt > rpedt) + || (rpsdt == rpedt && i == count && rpitm != 0)) + rasn.Rows.RemoveAt(i); + } + return rasn; + } + */ + +} + + +public class RASNBRHItem +{ + public string ProjectID { get; set; } + public string BranchID { get; set; } + public string BranchName { get; set; } + public string BranchShortName { get; set; } + public string GroupID { get; set; } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/RbsaDAC.cs b/Web/App_Code/DAC/RbsaDAC.cs new file mode 100644 index 0000000..cea8469 --- /dev/null +++ b/Web/App_Code/DAC/RbsaDAC.cs @@ -0,0 +1,280 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using Wellan.Data; +using Wellan.Common; + +/// +/// 補休補登以及沖補登 +/// +[DataObject] +public class RbsaDAC : Wellan.Data.WDAC +{ + public RbsaDAC() + { + } + + public RbsaDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public RbsaDAC(WQuery query) + { + this._query = query; + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select(string RBPYN) + { + DbCommand cmd = Query.NewCommand(); + + cmd.CommandText = + @"SELECT RBREN, RBENO, RBPYN, RBDAT, RBTCT / 60 AS RBTCT, RBUST FROM RBSA + WHERE RBPYN=@RBPYN + ORDER BY RBENO, RBDAT"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "RBPYN", RBPYN); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Insert)] + public void InsertOne(string RBENO, string RBPYN, DateTime RBDAT, int RBTCT, string TRUSR) + { + DbCommand cmd = Query.NewCommand(); + + cmd.CommandText = + @"INSERT INTO RBSA + (RBREN, RBENO, RBPYN, RBDAT, RBTCT, RBUST, TRDAT, TRMOD, TRUSR) + VALUES + (@RBREN, @RBENO, @RBPYN, @RBDAT, @RBTCT, 0, GETDATE(), 'INSERT', @TRUSR)"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "RBREN", NextRBREN(RBDAT)); + Query.AddParam(cmd, "RBENO", RBENO); + Query.AddParam(cmd, "RBPYN", RBPYN); + Query.AddParam(cmd, "RBDAT", RBDAT); + Query.AddParam(cmd, "RBTCT", RBTCT * 60); + Query.AddParam(cmd, "TRUSR", TRUSR); + Query.ExecuteNonQuery(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Update)] + public void UpdateOne(string OLD_RBREN, string RBENO, string RBPYN, DateTime RBDAT, int RBTCT, string TRUSR) + { + DbCommand cmd = Query.NewCommand(); + + cmd.CommandText = + @"UPDATE RBSA + SET TRDAT = GETDATE() , + TRMOD = 'UPDATE' , + TRUSR = @TRUSR , + RBENO = @RBENO , + RBPYN = @RBPYN , + RBDAT = @RBDAT , + RBTCT = @RBTCT + WHERE RBREN = @RBREN"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "TRUSR", TRUSR); + Query.AddParam(cmd, "RBENO", RBENO); + Query.AddParam(cmd, "RBPYN", RBPYN); + Query.AddParam(cmd, "RBDAT", RBDAT); + Query.AddParam(cmd, "RBTCT", RBTCT * 60); + Query.AddParam(cmd, "RBREN", OLD_RBREN); + Query.ExecuteNonQuery(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Delete)] + public void DeleteOne(string OLD_RBREN) + { + DbCommand cmd = Query.NewCommand(); + + cmd.CommandText = + @"DELETE FROM RBSA + WHERE RBREN = @RBREN"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "RBREN", OLD_RBREN); + Query.ExecuteNonQuery(cmd); + } + + public string NextRBREN(DateTime RBDAT) + { + DbCommand cmd = Query.NewCommand(); + + cmd.CommandText = + @"DECLARE @MAXRBREN NVARCHAR(10) + DECLARE @YYMM NVARCHAR(6) + DECLARE @SERIAL NVARCHAR(4) + SELECT @MAXRBREN = ISNULL(MAX(RBREN), @RBREN1) FROM RBSA WHERE RBREN > @RBREN1 AND RBREN <= @RBREN2 + SET @YYMM = SUBSTRING(@MAXRBREN, 1, 6) + SET @SERIAL = SUBSTRING(@MAXRBREN, 7, 4) + SELECT @YYMM + RIGHT('0000' + CAST(CAST(@SERIAL AS INT) + 1 AS NVARCHAR(4)), 4)"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "RBREN1", RBDAT.ToString("yyyyMM", WGuard1.InvariantCulture) + "0000"); + Query.AddParam(cmd, "RBREN2", RBDAT.ToString("yyyyMM", WGuard1.InvariantCulture) + "9999"); + return Query.ExecuteScalar(cmd).ToString(); + } + + /// 員工編號 + /// 請假日期 + /// + public int Get可用補休(string rbeno, DateTime rpdat) + { + // 取得員工在請假日期所在專案的補休期限設定 + int otd = new GetData(Query).GetBPOTD_DATE_BPENO(rpdat, rbeno); + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = @" + SELECT SUM(RBTCT - ISNULL(RBUST, 0)) + FROM RBSA + WHERE RBENO = @RBENO + AND RBDAT >= @RBDAT + AND (RBUST IS NULL OR RBUST= dbo.BPSDY(@RBENO) -- 加班日期大於到職日的條件 + "; + + AddParam(cmd, "RBENO", rbeno); + AddParam(cmd, "RBDAT", rpdat.AddMonths(-otd)); + AddParam(cmd, "TODAY", DateTime.UtcNow.AddHours(8).Date); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + /// + /// 沖補休補登 + /// + /// 要參加的交易 + /// 請假單號 + /// 員工編號 + /// 請假日期 + /// 請假時數 + /// 補休備註 + /// 剩餘時數 + public int 沖補休(DbTransaction tran, string rbren, string rbeno, DateTime rbdat, int rbtct, out string 備註) + { + 備註 = ""; + + // 取得員工在請假日期所在專案的補休期限設定 + int otd = new GetData(Query).GetBPOTD_DATE_BPENO(rbdat, rbeno); + + // 取出可沖補休補登單 + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT RBREN, RBENO, RBPYN, RBDAT, RBTCT, RBUST + FROM RBSA + WHERE RBENO = @RBENO + AND RBDAT >= @RBDAT -- 補休6個月之內有效 + AND RBDAT >= dbo.BPSDY(@RBENO) -- 到職日之後 + AND RBDAT < @TODAY -- 今天之前 + AND (RBUST IS NULL OR RBUST RbsaRbren = new List(); + + foreach (DataRow row in data.Rows) + { + // 一筆一筆的寫沖銷紀錄 + string rbren1 = WDAC.GetStringValue(row["RBREN"]); + int rbtct1 = WDAC.GetInt32Value(row["RBTCT"]); + int rbust1 = WDAC.GetInt32Value(row["RBUST"]); + DateTime rbdat1 = WDAC.GetDateTimeValue(row["RBDAT"]); + + int tct = rbtct > rbtct1 - rbust1 ? rbtct1 - rbust1 : rbtct; + rbtct -= tct; + + // 新增補休補登沖帳檔 + AddParam(cmdInsertRbsb, "RBREN", rbren); + AddParam(cmdInsertRbsb, "RBREX", rbren1); + AddParam(cmdInsertRbsb, "RBTCT", tct); + AddParam(cmdInsertRbsb, "TRUSR", rbeno); + Query.ExecuteNonQuery(tran.Connection, tran, cmdInsertRbsb); + + 備註 += String.Format("{0:MM/dd}-{1}、", rbdat1, tct / 60); + + if (!RbsaRbren.Contains(rbren1)) + RbsaRbren.Add(rbren1); + + if (rbtct <= 0) + break; + } + + // 重新加總 RBSA 的已用時數 + foreach (string rbren1 in RbsaRbren) + { + AddParam(cmdUpdateRbsa, "RBREN", rbren1); + Query.ExecuteNonQuery(tran.Connection, tran, cmdUpdateRbsa); + } + + // 回傳未沖完的時數 + return rbtct; + } + + public void 取消沖補休(DbTransaction tran, string rbren) + { + // 取出本張單據沖銷的紀錄 + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = @"SELECT RBREN, RBREX, RBTCT FROM RBSB WHERE RBREN=@RBREN"; + AddParam(cmd, "RBREN", rbren); + DataTable data = Query.Select(cmd, tran); + + DbCommand cmdDeleteRbsb = Query.NewCommand(); + cmdDeleteRbsb.CommandText = + @"DELETE FROM RBSB + WHERE RBREN = @RBREN AND RBREX = @RBREX"; + + DbCommand cmdUpdateRbsa = Query.NewCommand(); + cmdUpdateRbsa.CommandText = + @"UPDATE RBSA + SET RBUST = (SELECT SUM(RBTCT) FROM RBSB WHERE RBREX=RBSA.RBREN) + WHERE RBREN = @RBREN"; + + // 用來儲存要重新加總的 RBSA 的 RBREN,以免 RBSA 重複 UPDATE 被 LOCK + List RbsaRbren = new List(); + + // 還原被沖銷單據的被沖銷時數 + foreach (DataRow row in data.Rows) + { + string rprex1 = WDAC.GetStringValue(row["RBREX"]); + int rptct1 = WDAC.GetInt32Value(row["RBTCT"]); + + AddParam(cmdDeleteRbsb, "RBREN", rbren); + AddParam(cmdDeleteRbsb, "RBREX", rprex1); + Query.ExecuteNonQuery(tran.Connection, tran, cmdDeleteRbsb); + + if (!RbsaRbren.Contains(rprex1)) + RbsaRbren.Add(rprex1); + } + + // 重新加總 RBSA 的已用時數 + foreach (string rbren1 in RbsaRbren) + { + AddParam(cmdUpdateRbsa, "RBREN", rbren1); + Query.ExecuteNonQuery(tran.Connection, tran, cmdUpdateRbsa); + } + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/RcrdDAC.cs b/Web/App_Code/DAC/RcrdDAC.cs new file mode 100644 index 0000000..bcabb13 --- /dev/null +++ b/Web/App_Code/DAC/RcrdDAC.cs @@ -0,0 +1,290 @@ +using NPOI.SS.Formula.Functions; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Data.Common; +using Wellan.Common; +using Wellan.Data; + +/// +/// 打卡資料檔 +/// +public class RcrdDAC : Wellan.Data.WDAC +{ + public const string T01_上班 = "01"; + public const string T02_下班 = "02"; + public const string T03_中午休息 = "03"; + public const string T04_下午上班 = "04"; + public const string T05_加班上班 = "05"; + public const string T06_加班下班 = "06"; + public const string T07_出差離開 = "07"; + public const string T08_出差返回 = "08"; + + + public RcrdDAC() + { + } + + public RcrdDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public RcrdDAC(WQuery query) + { + this._query = query; + } + + /// + /// 讀取今天某人員的打卡資料 + /// + /// 人員編號 + public DataTable ReadToday(string rcusr, DateTime date) + { + return ReadByDate(rcusr, date); + } + + /// + /// 讀取某天某人員的打卡資料 + /// + /// 人員編號 + public DataTable ReadByDate(string rcusr, DateTime date) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT RCDAT, RCUSR, RCC01, RCC02, RCC03, RCC04, RCC05, RCC06, RCC07, RCC08, + RCP01, RCP02, RCP03, RCP04, RCP05, RCP06, RCP07, RCP08 + FROM RCRD WHERE RCDAT = @RCDAT AND RCUSR = @RCUSR "; + Query.AddParam(cmd, "RCDAT", date); + Query.AddParam(cmd, "RCUSR", rcusr); + return Query.Select(cmd); + } + + /// + /// 讀取日期區間某人員的打卡資料 + /// + /// 人員編號 + public DataTable SelectPeriod(string rcusr, DateTime rcdat1, DateTime rcdat2) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT RCDAT, RCUSR, RCC01, RCC02, RCC03, RCC04, RCC05, RCC06, RCC07, RCC08, + RCP01, RCP02, RCP03, RCP04, RCP05, RCP06, RCP07, RCP08 + FROM RCRD WHERE RCUSR = @RCUSR AND RCDAT >= @RCDAT1 AND RCDAT < @RCDAT2"; + Query.AddParam(cmd, "RCUSR", rcusr); + Query.AddParam(cmd, "RCDAT1", rcdat1.Date); + Query.AddParam(cmd, "RCDAT2", rcdat2.Date.AddDays(1)); + return Query.Select(cmd); + } + + /// + /// 檢查某一天某人員是否有打卡資料 + /// + /// 日期 + /// 人員編號 + /// + public bool CheckExists(DateTime rcdat, string rcusr) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = "SELECT COUNT(1) FROM RCRD WHERE RCDAT = @RCDAT AND RCUSR = @RCUSR "; + Query.AddParam(cmd, "RCDAT", rcdat.Date); + Query.AddParam(cmd, "RCUSR", rcusr); + int c = WQuery.GetInt32Value(Query.ExecuteScalar(cmd)); + return c > 0; + } + + /// + /// 打卡 + /// + /// 日期 + /// 人員編號 + /// 時間 + /// 打卡欄位 + /// 是否為補打卡 + private void Punch(DateAndTime rcdat, string rcusr, string ip, string fieldName, bool 補打) + { + DbCommand cmd = Query.NewCommand(); + + var d = ReadByDate(rcusr, rcdat.CardDate); + + if (d.Rows.Count == 0) + { + cmd.CommandText = + String.Format(@"INSERT INTO RCRD + (TRDAT, TRMOD, TRUSR, RCDAT, RCUSR, RCC{0}, RCP{0}, RCZ{0}) + VALUES + (GETDATE(), 'INSERT', @TRUSR, @RCDAT, @RCUSR, @TIME, @IP, @TIMEZONE)", fieldName); + cmd.Parameters.Clear(); + Query.AddParam(cmd, "TRUSR", rcusr); + Query.AddParam(cmd, "RCDAT", rcdat.CardDate); + Query.AddParam(cmd, "RCUSR", rcusr); + Query.AddParam(cmd, "TIME", rcdat.LocalTime); + Query.AddParam(cmd, "IP", ip); + Query.AddParam(cmd, "TIMEZONE", rcdat.TimezoneName); + Query.ExecuteNonQuery(cmd); + } + else + { + if (String.IsNullOrEmpty(WDAC.GetStringValue(d.Rows[0]["RCC" + fieldName]))) + { + cmd.CommandText = + String.Format(@"UPDATE RCRD + SET TRDAT = GETDATE() , + TRMOD = 'UPDATE' , + TRUSR = @TRUSR , + RCC{0} = @TIME , + RCP{0} = @IP , + RCZ{0} = @TIMEZONE + WHERE RCDAT = @RCDAT + AND RCUSR = @RCUSR", fieldName); + cmd.Parameters.Clear(); + Query.AddParam(cmd, "TRUSR", rcusr); + Query.AddParam(cmd, "TIME", rcdat.LocalTime); + Query.AddParam(cmd, "IP", ip); + Query.AddParam(cmd, "TIMEZONE", rcdat.TimezoneName); + Query.AddParam(cmd, "RCDAT", rcdat.CardDate); + Query.AddParam(cmd, "RCUSR", rcusr); + Query.ExecuteNonQuery(cmd); + } + } + } + + /// + /// 清除打卡 + /// + /// 日期 + /// 人員編號 + /// 打卡欄位 + private void Clear(DateTime rcdat, string rcusr, string fieldName) + { + DbCommand cmd = Query.NewCommand(); + + cmd.CommandText = + String.Format(@"UPDATE RCRD + SET TRDAT = GETDATE() , + TRMOD = 'UPDATE' , + TRUSR = @TRUSR , + RCC{0} = NULL , + RCP{0} = NULL + WHERE RCDAT = @RCDAT + AND RCUSR = @RCUSR", fieldName); + cmd.Parameters.Clear(); + Query.AddParam(cmd, "TRUSR", rcusr); + Query.AddParam(cmd, "RCDAT", rcdat); + Query.AddParam(cmd, "RCUSR", rcusr); + Query.ExecuteNonQuery(cmd); + } + + /// + /// 打上班卡 + /// + /// 日期 + /// 人員編號 + /// 時間 + /// + public void PunchRCC01(DateAndTime rcdat, string rcusr, string ip, bool 補打) + { + Punch(rcdat, rcusr, ip, T01_上班, 補打); + } + + /// + /// 清除上班卡 + /// + /// 日期 + /// 人員編號 + public void ClearRCC01(DateTime rcdat, string rcusr) + { + Clear(rcdat, rcusr, T01_上班); + } + + /// + /// 打下班卡 + /// + /// 日期 + /// 人員編號 + /// 時間 + public void PunchRCC02(DateAndTime rcdat, string rcusr, string ip, bool 補打) + { + Punch(rcdat, rcusr, ip, T02_下班, 補打); + } + + /// + /// 清除下班卡 + /// + /// 日期 + /// 人員編號 + public void ClearRCC02(DateTime rcdat, string rcusr) + { + Clear(rcdat, rcusr, T02_下班); + } + + /// + /// 打出差外出打卡 + /// + /// 日期 + /// 人員編號 + /// 時間 + public void PunchRCC07(DateAndTime rcdat, string rcusr, string ip, bool 補打) + { + Punch(rcdat, rcusr, ip, T07_出差離開, 補打); + } + + /// + /// 清除出差外出打卡 + /// + /// 日期 + /// 人員編號 + public void ClearRCC07(DateTime rcdat, string rcusr) + { + Clear(rcdat, rcusr, T07_出差離開); + } + + /// + /// 打出差返回打卡 + /// + /// 日期 + /// 人員編號 + /// 時間 + public void PunchRCC08(DateAndTime rcdat, string rcusr, string ip, bool 補打) + { + Punch(rcdat, rcusr, ip, T08_出差返回, 補打); + } + + /// + /// 清除出差返回打卡 + /// + /// 日期 + /// 人員編號 + public void ClearRCC08(DateTime rcdat, string rcusr) + { + Clear(rcdat, rcusr, T08_出差返回); + } + + /// + /// 取得某員工某日期往前6天之內的打卡天數 + /// + /// + /// + /// + public int PunchDaysIn7Days(DateTime rcdat, string rcusr, bool includeLastDay) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = string.Format(@"SELECT COUNT(1) FROM RCRD + WHERE RCUSR = @RCUSR + AND RCDAT >= @RCDAT1 + AND RCDAT {0} @RCDAT2 + AND (RCC01 IS NOT NULL AND RCC01 <> '' + OR RCC02 IS NOT NULL AND RCC02 <> '' + OR RCC07 IS NOT NULL AND RCC07 <> '' + OR RCC08 IS NOT NULL AND RCC08 <> '')", (includeLastDay ? "<=": "<")); + Query.AddParam(cmd, "RCUSR", rcusr); + Query.AddParam(cmd, "RCDAT1", rcdat.Date.AddDays(-6)); + Query.AddParam(cmd, "RCDAT2", rcdat.Date); + int c = WQuery.GetInt32Value(Query.ExecuteScalar(cmd)); + return c; + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/RlogDAC.cs b/Web/App_Code/DAC/RlogDAC.cs new file mode 100644 index 0000000..e08da9c --- /dev/null +++ b/Web/App_Code/DAC/RlogDAC.cs @@ -0,0 +1,55 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Collections.Generic; +using Wellan.Data; +using Wellan.Common; +using System.Transactions; +using System.ComponentModel; + +/// +/// RlogDAC 的摘要描述 +/// +public class RlogDAC : Wellan.Data.WDAC +{ + //private string _select = + // @" SELECT RLDAT, RLTIM, RLUSR, RLPRG, RLCIP, RLCNT, TRDAT, TRMOD, TRUSR FROM RLOG "; + + private string _insert = + @"INSERT INTO RLOG + (RLDAT, RLTIM, RLUSR, RLPRG, RLCIP, RLCNT, TRDAT, TRMOD, TRUSR) + VALUES + (@RLDAT, @RLTIM, @RLUSR, @RLPRG, @RLCIP, @RLCNT, GETDATE(), 'INSERT', @TRUSR)"; + + public RlogDAC() + { + } + + public RlogDAC(WQuery query) + : this() + { + this._query = query; + } + + public RlogDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public void InsertOne(string RLUSR, string RLPRG, string RLCIP, string RLCNT) + { + DbCommand cmdInsert = Query.NewCommand(_insert); + Query.AddParam(cmdInsert, "RLDAT", DateTime.UtcNow.AddHours(8).Date); + Query.AddParam(cmdInsert, "RLTIM", DateTime.UtcNow.AddHours(8).ToString("HH:mm:ss")); + Query.AddParam(cmdInsert, "RLUSR", RLUSR); + Query.AddParam(cmdInsert, "RLPRG", RLPRG); + Query.AddParam(cmdInsert, "RLCIP", RLCIP); + Query.AddParam(cmdInsert, "RLCNT", RLCNT); + Query.AddParam(cmdInsert, "TRUSR", RLUSR); + Query.ExecuteNonQuery(cmdInsert); + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/RpabDAC.cs b/Web/App_Code/DAC/RpabDAC.cs new file mode 100644 index 0000000..e67f3c5 --- /dev/null +++ b/Web/App_Code/DAC/RpabDAC.cs @@ -0,0 +1,292 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Collections.Generic; +using Wellan.Data; +using Wellan.Common; +using System.Transactions; +using System.ComponentModel; + +/// +/// 人員差勤簽核檔 +/// +public class RpabDAC : Wellan.Data.WDAC +{ + private string _select = + @" SELECT RPREN, RPANO, RPAPN, RPENO, RPDAT, RPAPP, RPDOC, TRDAT, TRMOD, TRUSR FROM RPAB "; + private string _insert = + @"INSERT INTO dbo.RPAB + (RPREN, RPANO, RPAPN, RPENO, RPDAT, RPAPP, RPDOC, TRDAT, TRMOD, TRUSR) + VALUES + (@RPREN, @RPANO, @RPAPN, @RPENO, NULL, NULL, NULL, GETDATE(), 'INSERT', @TRUSR)"; + private string _update1 = + @"UPDATE dbo.RPAB SET + RPDAT = @RPDAT, + RPAPP = @RPAPP, + RPDOC = @RPDOC, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @TRUSR + WHERE RPREN = @OLD_RPREN + AND RPANO = @OLD_RPANO"; + private string _update2 = + @"UPDATE dbo.RPAB SET + RPENO = @RPENO, + RPDAT = NULL, + RPAPP = NULL, + RPDOC = NULL, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @TRUSR + WHERE RPREN = @OLD_RPREN + AND RPANO = @OLD_RPANO"; + private string _delete = + @"DELETE FROM dbo.RPAB + WHERE RPREN = @OLD_RPREN + AND RPANO = @OLD_RPANO"; + + public RpabDAC() + { + } + + public RpabDAC(WQuery query) + : this() + { + this._query = query; + } + + public RpabDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public DataTable SelectRpren(string RPREN) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _select + " WHERE RPREN=@RPREN "; + AddParam(cmd, "RPREN", RPREN); + return Query.Select(cmd); + } + + public DataTable SelectOne(string RPREN, string RPANO) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _select + " WHERE RPREN=@RPREN AND RPANO=@RPANO "; + AddParam(cmd, "RPREN", RPREN); + AddParam(cmd, "RPANO", RPANO); + return Query.Select(cmd); + } + + public DataTable SelectOne(DbTransaction tran, string RPREN, string RPANO) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _select + " WHERE RPREN=@RPREN AND RPANO=@RPANO "; + AddParam(cmd, "RPREN", RPREN); + AddParam(cmd, "RPANO", RPANO); + return Query.Select(cmd, tran); + } + + private string NextRPANO(string RPREN) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = "SELECT ISNULL(MAX(RPANO), '0') + 1 FROM RPAB WHERE RPREN=@RPREN AND RPANO <> 'D' "; + AddParam(cmd, "RPREN", RPREN); + string s; + ExecuteScalar(cmd, out s); + return s; + } + + private void InsertOne(DbTransaction tran, string RPREN, string RPAPN, string RPANO, string RPENO, object TRUSR) + { + if (string.IsNullOrEmpty(RPREN) || string.IsNullOrEmpty(RPAPN) || string.IsNullOrEmpty(RPANO) || string.IsNullOrEmpty(RPENO)) + { + return; + } + + if (SelectOne(RPREN, RPANO).Rows.Count > 0) + { + UpdateOne(tran, RPREN, RPANO, RPENO, TRUSR); + } + else + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _insert; + AddParam(cmd, "RPREN", RPREN); + AddParam(cmd, "RPANO", RPANO); + AddParam(cmd, "RPAPN", RPAPN); + AddParam(cmd, "RPENO", RPENO); + AddParam(cmd, "TRUSR", TRUSR); + Query.ExecuteNonQuery(tran.Connection, tran, cmd); + } + } + + private void UpdateOne(DbTransaction tran, string RPREN, string RPANO, + object RPENO, object TRUSR) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _update2; + AddParam(cmd, "RPENO", RPENO); + AddParam(cmd, "TRUSR", TRUSR); + AddParam(cmd, "OLD_RPREN", RPREN); + AddParam(cmd, "OLD_RPANO", RPANO); + Query.ExecuteNonQuery(tran.Connection, tran, cmd); + } + + private void UpdateOne(DbTransaction tran, string RPREN, string RPANO, + object RPDAT, object RPAPP, object RPDOC, object TRUSR) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _update1; + AddParam(cmd, "RPDAT", RPDAT); + AddParam(cmd, "RPAPP", RPAPP); + AddParam(cmd, "RPDOC", RPDOC); + AddParam(cmd, "TRUSR", TRUSR); + AddParam(cmd, "OLD_RPREN", RPREN); + AddParam(cmd, "OLD_RPANO", RPANO); + Query.ExecuteNonQuery(tran.Connection, tran, cmd); + } + + private void DeleteOne(DbTransaction tran, string RPREN, string RPANO) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _delete; + AddParam(cmd, "OLD_RPREN", RPREN); + AddParam(cmd, "OLD_RPANO", RPANO); + Query.ExecuteNonQuery(tran.Connection, tran, cmd); + } + + public DataTable SelectLastOne(DbTransaction tran, string RPREN) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = "SELECT TOP 1 * FROM RPAB WHERE RPREN=@RPREN AND RPANO <> 'D' ORDER BY RPANO DESC"; + AddParam(cmd, "RPREN", RPREN); + return Query.Select(cmd, tran); + } + + /// + /// 送簽 + /// + /// 單號 + /// 簽核人員 + public void 送簽(DbTransaction tran, string RPREN, string RPAPN, string RPANO, string RPENO, string TRUSR) + { + InsertOne(tran, RPREN, RPAPN, RPANO, RPENO, TRUSR); + } + + /// + /// 抽單 + /// + /// 單號 + /// 簽核人員 + public void 抽單(DbTransaction tran, string RPREN, string RPENO, string TRUSR) + { + InsertOne(tran, RPREN, "D", "D", RPENO, TRUSR); + } + + public string 取消抽單(DbTransaction tran, string RPREN, out string 前關關號, + out DateTime 前關日期, out string 前關結果, out string 前關應簽) + { + DeleteOne(tran, RPREN, "D"); + DataTable t = SelectLastOne(tran, RPREN); + if (t.Rows.Count > 0) + { + 前關關號 = WDAC.GetStringValue(t.Rows[0]["RPANO"]); + 前關日期 = WDAC.GetDateTimeValue(t.Rows[0]["RPDAT"]); + 前關結果 = WDAC.GetStringValue(t.Rows[0]["RPAPP"]); + 前關應簽 = WDAC.GetStringValue(t.Rows[0]["RPAPN"]); + return WDAC.GetStringValue(t.Rows[0]["RPENO"]); + } + else + { + 前關關號 = ""; + 前關日期 = new DateTime(); + 前關結果 = ""; + 前關應簽 = ""; + return ""; + } + } + + + /// + /// 核准 + /// + /// 單號 + /// 關卡 + /// 簽核日期 + /// 簽核備註 + public void 核准(DbTransaction tran, string RPREN, string RPANO, + DateTime RPDAT, string RPDOC, string TRUSR) + { + UpdateOne(tran, RPREN, RPANO, RPDAT, "Y", RPDOC, TRUSR); + } + + /// + /// 駁回 + /// + /// 單號 + /// 簽核人員 + /// 簽核日期 + /// 簽核備註 + public void 不核准(DbTransaction tran, string RPREN, string RPANO, + DateTime RPDAT, string RPDOC, string TRUSR) + { + UpdateOne(tran, RPREN, RPANO, RPDAT, "N", RPDOC, TRUSR); + } + + /// + /// 取消本關簽核 + /// + public void 取消本關(DbTransaction tran, string RPREN, string 本關, string TRUSR) + { + UpdateOne(tran, RPREN, 本關, DBNull.Value, DBNull.Value, DBNull.Value, TRUSR); + } + + /// + /// 取消本關簽核,並退回上一關 + /// + public string 退回上一關(DbTransaction tran, string RPREN, string 本關, string TRUSR) + { + // 抽單 + if (本關.CompareTo("D") == 0) + { + UpdateOne(tran, RPREN, "D", DBNull.Value, DBNull.Value, DBNull.Value, TRUSR); + return ""; + } + // 非抽單 + else + { + int i本關 = Convert.ToInt32(本關); + if (i本關 > 1) + { + DeleteOne(tran, RPREN, 本關); + UpdateOne(tran, RPREN, Convert.ToString(i本關 - 1), DBNull.Value, DBNull.Value, DBNull.Value, TRUSR); + + DataTable t = SelectLastOne(tran, RPREN); + if (t.Rows.Count > 0) + return WDAC.GetStringValue(t.Rows[0]["RPENO"]); + else + return ""; + } + else + return ""; + } + } + + /// + /// 刪除某張單據的簽核資料 + /// + /// + public void Delete(DbTransaction tran, string RPREN) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"DELETE FROM dbo.RPAB + WHERE RPREN = @OLD_RPREN"; + AddParam(cmd, "OLD_RPREN", RPREN); + Query.ExecuteNonQuery(tran.Connection, tran, cmd); + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/RpadDAC.cs b/Web/App_Code/DAC/RpadDAC.cs new file mode 100644 index 0000000..83aa717 --- /dev/null +++ b/Web/App_Code/DAC/RpadDAC.cs @@ -0,0 +1,179 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Collections.Generic; +using Wellan.Data; +using Wellan.Common; +using System.Transactions; +using System.ComponentModel; + +/// +/// 出差費用檔 +/// +[DataObject] +public class RpadDAC : Wellan.Data.WDAC +{ + private string _select = + @"SELECT RPREN, RPITM, RPSTP, RPEDP, RPF01, RPF02, RPF03, RPF04, RPF05, RPF06, RPF07, RPF08, + RPF09, RPF10, RPSUM, RPDAT, RPJOB, RPVCH, RPDOC, TRDAT, TRMOD, TRUSR + FROM RPAD "; + + public RpadDAC() + { + } + + public RpadDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public RpadDAC(WQuery query) + { + this._query = query; + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectRpar(string rpren) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = _select + " WHERE RPREN=@RPREN ORDER BY RPITM"; + AddParam(cmd, "RPREN", rpren); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Insert)] + public void InsertOne(string userId, string rpren, string rpstp, string rpedp, int rpf01, int rpf02, int rpf03, int rpf04, + int rpf05, int rpf06, int rpf07, int rpf08, int rpf09, int rpf10, DateTime rpdat, string rpvch, string rpdoc) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"INSERT INTO RPAD + (RPREN, RPITM, RPSTP, RPEDP, RPF01, RPF02, RPF03, RPF04, RPF05, RPF06, RPF07, RPF08, RPF09, RPF10, RPSUM, RPDAT, RPVCH, RPDOC, TRDAT, TRMOD, TRUSR) + VALUES + (@RPREN, @RPITM, @RPSTP, @RPEDP, @RPF01, @RPF02, @RPF03, @RPF04, @RPF05, @RPF06, @RPF07, @RPF08, @RPF09, @RPF10, @RPSUM, @RPDAT, @RPVCH, @RPDOC, GETDATE(), 'INSERT', @TRUSR)"; + AddParam(cmd, "RPREN", rpren); + AddParam(cmd, "RPITM", GetNextRpitm(rpren)); + AddParam(cmd, "RPSTP", rpstp); + AddParam(cmd, "RPEDP", rpedp); + AddParam(cmd, "RPF01", rpf01); + AddParam(cmd, "RPF02", rpf02); + AddParam(cmd, "RPF03", rpf03); + AddParam(cmd, "RPF04", rpf04); + AddParam(cmd, "RPF05", rpf05); + AddParam(cmd, "RPF06", rpf06); + AddParam(cmd, "RPF07", rpf07); + AddParam(cmd, "RPF08", rpf08); + AddParam(cmd, "RPF09", rpf09); + AddParam(cmd, "RPF10", rpf10); + AddParam(cmd, "RPSUM", rpf01 + rpf02 + rpf03 + rpf04 + rpf05 + rpf06 + rpf07 + rpf08 + rpf09 + rpf10); + AddParam(cmd, "RPDAT", rpdat); + AddParam(cmd, "RPVCH", rpvch); + AddParam(cmd, "RPDOC", rpdoc); + AddParam(cmd, "TRUSR", userId); + Query.ExecuteNonQuery(cmd); + + UpdateRpar(rpren); + } + + [DataObjectMethod(DataObjectMethodType.Update)] + public void UpdateOne(string userId, string rpren, int rpitm, string rpstp, string rpedp, int rpf01, int rpf02, int rpf03, int rpf04, + int rpf05, int rpf06, int rpf07, int rpf08, int rpf09, int rpf10, DateTime rpdat, string rpvch, string rpdoc) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"UPDATE RPAD SET + RPSTP = @RPSTP, + RPEDP = @RPEDP, + RPF01 = @RPF01, + RPF02 = @RPF02, + RPF03 = @RPF03, + RPF04 = @RPF04, + RPF05 = @RPF05, + RPF06 = @RPF06, + RPF07 = @RPF07, + RPF08 = @RPF08, + RPF09 = @RPF09, + RPF10 = @RPF10, + RPSUM = @RPSUM, + RPDAT = @RPDAT, + RPVCH = @RPVCH, + RPDOC = @RPDOC, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @TRUSR + WHERE RPREN = @RPREN + AND RPITM = @RPITM"; + AddParam(cmd, "RPSTP", rpstp); + AddParam(cmd, "RPEDP", rpedp); + AddParam(cmd, "RPF01", rpf01); + AddParam(cmd, "RPF02", rpf02); + AddParam(cmd, "RPF03", rpf03); + AddParam(cmd, "RPF04", rpf04); + AddParam(cmd, "RPF05", rpf05); + AddParam(cmd, "RPF06", rpf06); + AddParam(cmd, "RPF07", rpf07); + AddParam(cmd, "RPF08", rpf08); + AddParam(cmd, "RPF09", rpf09); + AddParam(cmd, "RPF10", rpf10); + AddParam(cmd, "RPSUM", rpf01 + rpf02 + rpf03 + rpf04 + rpf05 + rpf06 + rpf07 + rpf08 + rpf09 + rpf10); + AddParam(cmd, "RPDAT", rpdat); + AddParam(cmd, "RPVCH", rpvch); + AddParam(cmd, "RPDOC", rpdoc); + AddParam(cmd, "TRUSR", userId); + AddParam(cmd, "RPREN", rpren); + AddParam(cmd, "RPITM", rpitm); + Query.ExecuteNonQuery(cmd); + + UpdateRpar(rpren); + } + + [DataObjectMethod(DataObjectMethodType.Delete)] + public void DeleteOne(string rpren, int rpitm) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"DELETE FROM RPAD + WHERE RPREN = @RPREN + AND RPITM = @RPITM"; + AddParam(cmd, "RPREN", rpren); + AddParam(cmd, "RPITM", rpitm); + Query.ExecuteNonQuery(cmd); + + UpdateRpar(rpren); + } + + public void DeleteByRpren(string rpren) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"DELETE FROM RPAD + WHERE RPREN = @RPREN"; + AddParam(cmd, "RPREN", rpren); + Query.ExecuteNonQuery(cmd); + + UpdateRpar(rpren); + } + + private int GetNextRpitm(string rpren) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = @"SELECT ISNULL(MAX(RPITM), 0) + 1 FROM RPAD WHERE RPREN=@RPREN"; + AddParam(cmd, "RPREN", rpren); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + private void UpdateRpar(string rpren) + { + DbCommand cmd1 = Query.NewCommand(); + cmd1.CommandText = + @"UPDATE RPAR + SET RPFTR = (SELECT ISNULL(SUM(RPSUM), 0) FROM RPAD WHERE RPREN=@RPREN) + WHERE RPREN=@RPREN"; + AddParam(cmd1, "RPREN", rpren); + Query.ExecuteNonQuery(cmd1); + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/RparDAC.cs b/Web/App_Code/DAC/RparDAC.cs new file mode 100644 index 0000000..65476e4 --- /dev/null +++ b/Web/App_Code/DAC/RparDAC.cs @@ -0,0 +1,1911 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Collections.Generic; +using Wellan.Data; +using Wellan.Common; +using System.Transactions; +using System.ComponentModel; +using System.IO; +using System.Web; +using System.Linq; +using System.Web.UI; + +/// +/// 人員請假、加班、出差紀錄 +/// +[DataObject] +public class RparDAC : Wellan.Data.WDAC +{ + //private string _tableName = "RPAR"; + //private string _select = + // @"SELECT TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, + // RPTYP, RPTCT, RPFTR, RPDOC, APPNO, RPADT, RPAPN, RPANO, RPAPP, RPAPD, + // RPAPU, RPAGT, RPRTM, RPETM, RPUST, RPTC1, RPTC2, RPTC3, RPRSN, RPAGM, + // RPPLC "; + //private string _insert = + // @" TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, + // RPTYP, RPTCT, RPFTR, RPDOC, APPNO, RPADT, RPAPN, RPANO, RPAPP, RPAPD, + // RPAPU, RPAGT, RPRTM, RPETM, RPUST, RPTC1, RPTC2, RPTC3, RPRSN, RPAGM, + // RPPLC "; + //private string _insertValue = + // @" @TRDAT, @TRMOD, @TRUSR, @RPREN, @RPNUM, @RAITM, @RPCNM, @RPPYN, @RPRDT, @RPEDT, + // @RPTYP, @RPTCT, @RPFTR, @RPDOC, @APPNO, @RPADT, @RPAPN, @RPANO, @RPAPP, @RPAPD, + // @RPAPU, @RPAGT, @RPRTM, @RPETM, @RPUST, @RPTC1, @RPTC2, @RPTC3, @RPRSN, @RPAGM, + // @RPPLC "; + //private string _from = " from RPAR "; + //private string _where = " where 1=1 "; + //private string _order = " order by RPREN "; + + private string 補休類別Where = " (RPTYP = '11' OR RPTYP = '13' OR RPTYP = '15') "; + private string 事假類別Where = " (RPTYP = '02' OR RPTYP = '0B') "; + private string 病假類別Where = " (RPTYP = '03') "; + + public RparDAC() + { + } + + public RparDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public RparDAC(WQuery query) + { + this._query = query; + } + + /* + public DataTable SelectOne(string rpren) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, + RPTYP, RPTCT / 60 AS RPTCT, RPFTR, RPDOC, APPNO, RPAPP, RPAPD, RPAPU, + RPADT, RPAPN, RPANO, RPAGT, RPRTM, RPETM, RPUST, RPTC1 / 60 AS RPTC1, + RPTC2 / 60 AS RPTC2, RPTC3 / 60 AS RPTC3, RPRSN, RPAGM, RPPLC + FROM RPAR WHERE RPREN=@RPREN"; + AddParam(cmd, "RPREN", rpren); + return Query.Select(cmd); + } + */ + + [DataObjectMethod(DataObjectMethodType.Select)] + public RPARList SelectOne(String RPREN) + { + RPARList result = new RPARList(); + IDataList list = result as IDataList; + DbCommand cmdSelect = Query.NewCommand(); + cmdSelect.CommandText = + @"SELECT + RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, RPTYP, RPFTR, RPDOC, + APPNO, RPADT, RPAPN, RPANO, RPAPP, RPAPD, RPAPU, RPAGT, RPAGM, RPRTM, + RPETM, RPUST, RPRSN, RPPLC, RPFPC, RPFAD, RPKMS, TRDAT, TRMOD, TRUSR, + CAST(RPTCT AS INT) / 60 AS RPTCT, + ISNULL(CAST(RPTCT AS INT) % 60, 0) AS RPTMT, + ISNULL(RPTC1, 0) / 60 AS RPTC1, + ISNULL(RPTC1, 0) % 60 AS RPTM1, + ISNULL(RPTC2, 0) / 60 AS RPTC2, + ISNULL(RPTC2, 0) % 60 AS RPTM2, + ISNULL(RPTC3, 0) / 60 AS RPTC3, + ISNULL(RPTC3, 0) % 60 AS RPTM3, + ISNULL(RPTC4, 0) / 60 AS RPTC4, + ISNULL(RPTC4, 0) % 60 AS RPTM4, + ISNULL(RPTC5, 0) / 60 AS RPTC5, + ISNULL(RPTC5, 0) % 60 AS RPTM5 + FROM RPAR WHERE RPREN=@RPREN"; + AddParam(cmdSelect, "RPREN", RPREN); + Query.Select(cmdSelect, ref list); + return result; + } + + + /// + /// 取出某人某天的加班單 + /// + /// + /// + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public RPARList SelectOverTimeOneDay(String RPNUM, DateTime RPRDT) + { + RPARList result = new RPARList(); + IDataList list = result as IDataList; + DbCommand cmdSelect = Query.NewCommand(); + cmdSelect.CommandText = + @"SELECT + RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, RPTYP, RPFTR, RPDOC, + APPNO, RPADT, RPAPN, RPANO, RPAPP, RPAPD, RPAPU, RPAGT, RPAGM, RPRTM, + RPETM, RPUST, RPRSN, RPPLC, RPFPC, RPFAD, RPKMS, TRDAT, TRMOD, TRUSR, + RPTCT, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5, 0 RPTMT, 0 RPTM1, 0 RPTM2, 0 RPTM3, 0 RPTM4, 0 RPTM5 + FROM RPAR + WHERE RPNUM=@RPNUM + AND RPRDT=@RPRDT + AND RPTYP LIKE '1%' + AND ((RPAPN IS NOT NULL AND RPAPN<>'D' AND (RPAPP IS NULL OR RPAPP<>'N')) OR (RPAPN IS NULL)) + ORDER BY RPRTM"; + AddParam(cmdSelect, "RPNUM", RPNUM); + AddParam(cmdSelect, "RPRDT", RPRDT); + Query.Select(cmdSelect, ref list); + return result; + } + + + /// + /// 更新加班時數 + /// + /// + /// + /// + /// + /// + public void UpdateOverTimeHours(string RPREN, int RPTCT, int RPTC1, int RPTC2, int RPTC3, int RPTC4, int RPTC5, + int RPTA1, int RPTA2, int RPTA3, int RPTA4, int RPTA5) + { + DbCommand cmdUpdate = Query.NewCommand(); + cmdUpdate.CommandText = + @"UPDATE RPAR SET RPTCT=@RPTCT, RPTC1=@RPTC1, RPTC2=@RPTC2, RPTC3=@RPTC3, RPTC4=@RPTC4, RPTC5=@RPTC5, + RPFTR=@RPFTR, RPTA1=@RPTA1, RPTA2=@RPTA2, RPTA3=@RPTA3, RPTA4=@RPTA4, RPTA5=@RPTA5 + WHERE RPREN=@RPREN"; + AddParam(cmdUpdate, "RPREN", RPREN); + AddParam(cmdUpdate, "RPTCT", RPTCT); + AddParam(cmdUpdate, "RPTC1", RPTC1); + AddParam(cmdUpdate, "RPTC2", RPTC2); + AddParam(cmdUpdate, "RPTC3", RPTC3); + AddParam(cmdUpdate, "RPTC4", RPTC4); + AddParam(cmdUpdate, "RPTC5", RPTC5); + AddParam(cmdUpdate, "RPFTR", RPTA1 + RPTA2 + RPTA3 + RPTA4 + RPTA5); + AddParam(cmdUpdate, "RPTA1", RPTA1); + AddParam(cmdUpdate, "RPTA2", RPTA2); + AddParam(cmdUpdate, "RPTA3", RPTA3); + AddParam(cmdUpdate, "RPTA4", RPTA4); + AddParam(cmdUpdate, "RPTA5", RPTA5); + Query.ExecuteNonQuery(cmdUpdate); + } + + /// 員工編號 + /// 請假日期 + /// + public int Get可用補休(string rpnum, DateTime rprdt) + { + // 取得補休補登的可用時數 + RbsaDAC rbsaDao = new RbsaDAC(Query); + + // 取得員工在請假日期所在專案的補休期限設定 + int otd = new GetData(Query).GetBPOTD_DATE_BPENO(rprdt, rpnum); + + // 取得加班補休的可用時數 + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = String.Format(@" + SELECT SUM(RPTCT - ISNULL(RPUST, 0)) + FROM RPAR + WHERE RPNUM = @RPNUM + AND {0} + AND RPRDT >= @RPRDT + AND ((RPAPN IS NOT NULL AND RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y') OR (RPAPN IS NULL)) + AND (RPUST IS NULL OR RPUST= dbo.BPSDY(@RPNUM) -- 20150803 增加加班日期需大於等於到職日期的條件 + AND RPRDT < @TODAY -- 20160429 增加加班日期需小於今天的條件 + ", 補休類別Where); + AddParam(cmd, "RPNUM", rpnum); + AddParam(cmd, "RPRDT", rprdt.AddMonths(-otd)); + AddParam(cmd, "TODAY", DateTime.UtcNow.AddHours(8).Date); + + return rbsaDao.Get可用補休(rpnum, rprdt) + WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + /// 員工編號 + /// 請假日期 + /// + public int Get已請事假(string rpnum, DateTime rprdt, string rprenExclude) + { + return Get年度已請假時數(rpnum, rprdt, 事假類別Where, rprenExclude); + } + + /// 員工編號 + /// 請假日期 + /// + public int Get已請病假(string rpnum, DateTime rprdt, string rprenExclude) + { + return Get年度已請假時數(rpnum, rprdt, 病假類別Where, rprenExclude); + } + + + public int Get年度已請假時數(string rpnum, DateTime rprdt, string 請假類別Where, string rprenExclude) + { + var yearBegin = new DateTime(rprdt.Year, 1, 1); + var yearEnd = new DateTime(rprdt.Year, 12, 31); + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = String.Format(@" + SELECT * + FROM RPAR + WHERE RPNUM = @RPNUM + AND {0} + AND ((RPRDT >= @DATE_1 AND RPRDT < @DATE_2) OR (RPEDT >= @DATE_1 AND RPEDT < @DATE_2)) + -- AND ((RPAPN IS NOT NULL AND RPAPN <> 'D') OR (RPAPN IS NULL)) + AND ((RPAPN IS NOT NULL AND RPAPN <> 'D' AND RPAPP <> 'N') OR (RPAPN IS NULL)) + AND RPRDT >= dbo.BPSDY(@RPNUM) + ", 請假類別Where); + AddParam(cmd, "RPNUM", rpnum); + AddParam(cmd, "DATE_1", yearBegin); + AddParam(cmd, "DATE_2", yearEnd.AddDays(1)); + + var d = Query.Select(cmd); + + // 抓加班時數計算方式 + BpaaDAC bpaa = new BpaaDAC(Query); + + DataTable d1 = Query.Select(cmd); + TimeCalc timeCalc = new TimeCalc(); + int 請假 = 0; + + foreach (DataRow r1 in d1.Rows) + { + string rpren = GetStringValue(r1["RPREN"]); + + if (rpren == rprenExclude) + continue; + + string rppyn = GetStringValue(r1["RPPYN"]); + DateTime 起日 = GetDateTimeValue(r1["RPRDT"]); + DateTime 迄日 = GetDateTimeValue(r1["RPEDT"]); + string 起時 = GetStringValue(r1["RPRTM"]); + string 迄時 = GetStringValue(r1["RPETM"]); + string 類別 = GetStringValue(r1["RPTYP"]); + string bpott = bpaa.GetOverTimeType(rppyn); + + if (起日 >= yearBegin && 起日 <= yearEnd && 迄日 >= yearBegin && 迄日 <= yearEnd) + 請假 += GetInt32Value(r1["RPTCT"]); + else + { + DateTime 日期 = 起日; + while (日期 <= 迄日) + { + if (日期 >= yearBegin && 日期 <= yearEnd) + 請假 += timeCalc.計算請假當日時數(rpnum, 日期, 起日, 迄日, 起時, 迄時, 類別, bpott == "1"); + 日期 = 日期.AddDays(1); + } + } + } + + return 請假; + } + + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Get可用補休明細(string rpnum, DateTime rprdt) + { + // 取得員工在請假日期所在專案的補休期限設定 + int otd = new GetData(Query).GetBPOTD_DATE_BPENO(rprdt, rpnum); + + // 取得補休補登的可用時數 + RbsaDAC rbsaDao = new RbsaDAC(Query); + + // 20150803 增加加班日期需大於等於到職日期的條件 + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = String.Format(@" + SELECT RPRDT AS 日期, '加班' AS 類別, + FLOOR(ISNULL(RPTCT, 0) / 60) AS 可補時數, + FLOOR(ISNULL(RPUST, 0) / 60) AS 已補時數, + ISNULL(RPTCT, 0) - FLOOR(ISNULL(RPTCT, 0) / 60) * 60 AS 可補分數, + ISNULL(RPUST, 0) - FLOOR(ISNULL(RPUST, 0) / 60) * 60 AS 已補分數, + DATEADD(MONTH, @OTD, RPRDT) AS 補休期限 + FROM RPAR + WHERE RPNUM=@RPNUM + AND {0} + AND RPRDT >= @RPRDT + AND ((RPAPN IS NOT NULL AND RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y') OR (RPAPN IS NULL)) + AND (RPUST IS NULL OR RPUST= dbo.BPSDY(@RPNUM) -- 加班日期需大於等於到職日期 + AND RPRDT < @TODAY -- 20160429 增加加班日期需小於今天的條件 + UNION ALL + SELECT RBDAT AS 日期, '補休補登' AS 類別, + FLOOR(ISNULL(RBTCT, 0) / 60) AS 可補時數, + FLOOR(ISNULL(RBUST, 0) / 60) AS 已補時數, + ISNULL(RBTCT, 0) - FLOOR(ISNULL(RBTCT, 0) / 60) * 60 AS 可補分數, + ISNULL(RBUST, 0) - FLOOR(ISNULL(RBUST, 0) / 60) * 60 AS 已補分數, + DATEADD(MONTH, @OTD, RBDAT) AS 補休期限 + FROM RBSA + WHERE RBENO = @RPNUM + AND RBDAT >= @RPRDT + AND (RBUST IS NULL OR RBUST= dbo.BPSDY(@RPNUM) -- 補休補登日期需大於等於到職日期 + AND RBDAT < @TODAY -- 20160429 增加加班日期需小於今天的條件 + ORDER BY 日期", 補休類別Where); + AddParam(cmd, "RPNUM", rpnum); + AddParam(cmd, "RPRDT", rprdt.AddMonths(-otd)); + AddParam(cmd, "TODAY", DateTime.UtcNow.AddHours(8).Date); + AddParam(cmd, "OTD", otd); + return Query.Select(cmd); + } + + /// + /// 沖補休 + /// + /// 請假單號 + /// 員工編號 + /// 請假日期 + /// 請假時數 + /// 沖補休備註 + public string 沖補休(DbTransaction tran, string rpren, string rpnum, DateTime rprdt, int rptct) + { + string result = ""; + + // 取得員工在請假日期所在專案的補休期限設定 + int otd = new GetData(Query).GetBPOTD_DATE_BPENO(rprdt, rpnum); + + // 先呼叫補休補登的沖補休 + RbsaDAC rbsaDao = new RbsaDAC(Query); + rptct = rbsaDao.沖補休(tran, rpren, rpnum, rprdt, rptct, out result); + + if (rptct > 0) + { + // 取出可沖單號 + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = String.Format( + @"SELECT RPREN, RPTCT, RPUST, RPRDT + FROM RPAR + WHERE RPNUM = @RPNUM + AND {0} + AND RPRDT >= @RPRDT -- 補休6個月之內有效 + AND ((RPAPN IS NOT NULL AND RPAPN <> 'D' AND RPAPN = RPANO AND RPAPP = 'Y') OR (RPAPN IS NULL)) + AND (RPUST IS NULL OR RPUST < RPTCT) + AND RPRDT >= dbo.BPSDY(@RPNUM) -- 到職日之後 + AND RPRDT < @TODAY -- 今天之前 + ORDER BY RPRDT, RPREN", 補休類別Where); + AddParam(cmd, "RPNUM", rpnum); + AddParam(cmd, "RPRDT", rprdt.AddMonths(-otd)); + AddParam(cmd, "TODAY", DateTime.UtcNow.AddHours(8).Date); + DataTable data = Query.Select(cmd, tran); + + // 準備新增補休沖銷紀錄 SQL + DbCommand cmdInsertRpac = Query.NewCommand(); + cmdInsertRpac.CommandText = + @"INSERT INTO RPAC + (RPREN, RPREX, RPTCT, TRDAT, TRMOD, TRUSR) + VALUES + (@RPREN, @RPREX, @RPTCT, GETDATE(), 'INSERT', @TRUSR)"; + + // 準備回填已沖時數 SQL + DbCommand cmdUpdateRpar = Query.NewCommand(); + cmdUpdateRpar.CommandText = + @"UPDATE RPAR + SET RPUST = (SELECT SUM(RPTCT) FROM RPAC WHERE RPREX=RPAR.RPREN) + WHERE RPREN = @RPREN"; + + // 用來儲存要重新加總的 RPAR 的 RPREN,以免 RPAR 重複 UPDATE 被 LOCK + List RbarRpren = new List(); + + foreach (DataRow row in data.Rows) + { + // 一筆一筆的寫沖銷紀錄 + string rpren1 = WDAC.GetStringValue(row["RPREN"]); + int rptct1 = WDAC.GetInt32Value(row["RPTCT"]); + int rpust1 = WDAC.GetInt32Value(row["RPUST"]); + DateTime rprdt1 = WDAC.GetDateTimeValue(row["RPRDT"]); + + int tct = rptct > rptct1 - rpust1 ? rptct1 - rpust1 : rptct; + rptct -= tct; + + AddParam(cmdInsertRpac, "RPREN", rpren); + AddParam(cmdInsertRpac, "RPREX", rpren1); + AddParam(cmdInsertRpac, "RPTCT", tct); + AddParam(cmdInsertRpac, "TRUSR", rpnum); + Query.ExecuteNonQuery(tran.Connection, tran, cmdInsertRpac); + + result += String.Format("{0:MM/dd}-{1}:{2}、", rprdt1, tct / 60, tct % 60); + + if (!RbarRpren.Contains(rpren1)) + RbarRpren.Add(rpren1); + + if (rptct <= 0) + break; + } + + // 重新加總 RPAR 的已用時數 + foreach (string rpren1 in RbarRpren) + { + AddParam(cmdUpdateRpar, "RPREN", rpren1); + Query.ExecuteNonQuery(tran.Connection, tran, cmdUpdateRpar); + } + } + + if (result.Length > 0) + return result.Substring(0, result.Length - 1); + else + return result; + } + + public void 取消沖補休(DbTransaction tran, string rpren) + { + // 先呼叫補休補登的取消沖補休 + RbsaDAC rbsaDao = new RbsaDAC(Query); + rbsaDao.取消沖補休(tran, rpren); + + // 取出本張單據沖銷的紀錄 + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = @"SELECT RPREN, RPREX, RPTCT FROM RPAC WHERE RPREN=@RPREN"; + AddParam(cmd, "RPREN", rpren); + DataTable data = Query.Select(cmd, tran); + + DbCommand cmdDeleteRpac = Query.NewCommand(); + cmdDeleteRpac.CommandText = @"DELETE FROM RPAC + WHERE RPREN = @RPREN AND RPREX = @RPREX"; + + DbCommand cmdUpdateRpar = Query.NewCommand(); + cmdUpdateRpar.CommandText = @"UPDATE RPAR + SET RPUST = (SELECT SUM(RPTCT) FROM RPAC WHERE RPREX=RPAR.RPREN) + WHERE RPREN = @RPREN"; + + // 用來儲存要重新加總的 RPAR 的 RPREN,以免 RPAR 重複 UPDATE 被 LOCK + List RbarRpren = new List(); + + foreach (DataRow row in data.Rows) + { + // 還原被沖銷單據的被沖銷時數 + string rprex1 = WDAC.GetStringValue(row["RPREX"]); + int rptct1 = WDAC.GetInt32Value(row["RPTCT"]); + + AddParam(cmdDeleteRpac, "RPREN", rpren); + AddParam(cmdDeleteRpac, "RPREX", rprex1); + Query.ExecuteNonQuery(tran.Connection, tran, cmdDeleteRpac); + + if (!RbarRpren.Contains(rprex1)) + RbarRpren.Add(rprex1); + } + + // 重新加總 RPAR 的已用時數 + foreach (string rpren1 in RbarRpren) + { + AddParam(cmdUpdateRpar, "RPREN", rpren1); + Query.ExecuteNonQuery(tran.Connection, tran, cmdUpdateRpar); + } + } + + /// + /// 送簽 + /// + /// 單號 + /// 目前關卡 + /// 簽核人員 + public void 送簽(DbTransaction tran, object RPREN, object RPANO, object RPAPU) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"UPDATE RPAR + SET RPANO = @RPANO, + RPAPP = NULL, + RPAPD = NULL, + RPAPU = @RPAPU, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @RPAPU + WHERE RPREN = @RPREN"; + AddParam(cmd, "RPANO", RPANO); + AddParam(cmd, "RPAPU", RPAPU); + AddParam(cmd, "RPREN", RPREN); + Query.ExecuteNonQuery(tran.Connection, tran, cmd); + } + + /// + /// 抽單 + /// + /// 單號 + /// 簽核人員 + public void 抽單(DbTransaction tran, object RPREN, object RPAPU) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"UPDATE RPAR + SET RPAPN = 'D', + RPANO = 'D', + RPAPP = NULL, + RPAPD = NULL, + RPAPU = @RPAPU, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @RPAPU + WHERE RPREN = @RPREN"; + AddParam(cmd, "RPAPU", RPAPU); + AddParam(cmd, "RPREN", RPREN); + Query.ExecuteNonQuery(tran.Connection, tran, cmd); + } + + /// + /// 取消抽單 + /// + /// 單號 + /// 應簽關數 + /// 前關關卡 + /// 前關簽核結果 + /// 前關簽核日期 + /// 前關簽核人員 + public void 取消抽單(DbTransaction tran, string RPREN, string RPAPN, string RPANO, string RPAPP, DateTime RPAPD, string RPAPU) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"UPDATE RPAR + SET RPAPN = @RPAPN, + RPANO = @RPANO, + RPAPP = @RPAPP, + RPAPD = @RPAPD, + RPAPU = @RPAPU, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @RPAPU + WHERE RPREN = @RPREN"; + AddParam(cmd, "RPAPN", RPAPN); + AddParam(cmd, "RPANO", RPANO); + AddParam(cmd, "RPAPP", RPAPP); + if (RPAPD.Ticks > 0) + AddParam(cmd, "RPAPD", RPAPD); + else + AddParam(cmd, "RPAPD", DBNull.Value); + AddParam(cmd, "RPAPU", RPAPU); + AddParam(cmd, "RPREN", RPREN); + Query.ExecuteNonQuery(tran.Connection, tran, cmd); + } + + /// + /// 簽核 + /// + /// 單號 + /// 本關簽核結果 + /// 簽核日期 + public void 簽核(DbTransaction tran, string rpren, string rpapp, DateTime rpapd) + { + // 先取出這張單據的資料,用以判斷是何種單據 + RPARList d = SelectOne(rpren); + if (d.Count > 0) + { + string rptyp = GetStringValue(d[0].RPTYP); + string rpapn = GetStringValue(d[0].RPAPN); + + // 如果不核准或是核准的是抽單 + if (rpapp == "N" || (rpapp == "Y" && rpapn == "D")) + { + // 補休,要將補休沖回去 + if (rptyp == RPAR_TYPE.T00_補休) + { + 取消沖補休(tran, rpren); + } + + // 特休,要將特休沖回去 + if (rptyp == RPAR_TYPE.T01_特休) + { + new RyerDAC(Query).取消沖特休(tran, rpren); + } + } + } + + // 更新簽核結果 + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"UPDATE RPAR + SET RPAPP = @RPAPP, + RPAPD = @RPAPD, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = RPAPU + WHERE RPREN = @RPREN"; + AddParam(cmd, "RPAPP", rpapp); + AddParam(cmd, "RPAPD", rpapd); + AddParam(cmd, "RPREN", rpren); + Query.ExecuteNonQuery(tran.Connection, tran, cmd); + } + + /// + /// 退回上一關 + /// + /// 單號 + public void 退回上一關(DbTransaction tran, object RPREN, object 上一關簽核人) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"UPDATE RPAR + SET RPANO = RPANO - 1, + RPAPP = NULL, + RPAPD = NULL, + RPAPU = @RPAPU, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = RPAPU + WHERE RPREN = @RPREN"; + AddParam(cmd, "RPAPU", 上一關簽核人); + AddParam(cmd, "RPREN", RPREN); + Query.ExecuteNonQuery(tran.Connection, tran, cmd); + } + + /// + /// 取消本關 + /// + /// 單號 + public void 取消本關(DbTransaction tran, object RPREN) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"UPDATE RPAR + SET RPAPP = NULL, + RPAPD = NULL, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = RPAPU + WHERE RPREN = @RPREN"; + AddParam(cmd, "RPREN", RPREN); + Query.ExecuteNonQuery(tran.Connection, tran, cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select未簽核ByUser(string UserId, string RPTYP, string RPNUM) + { + DbCommand cmd = Query.NewCommand(); + var wheres = new List(); + + if (!string.IsNullOrEmpty(RPTYP)) + { + var rptypWhere = new List(); + foreach (var rptyp in RPTYP.Split(',')) + { + rptypWhere.Add(string.Format(" RPTYP LIKE '{0}' ", rptyp)); + } + wheres.Add(string.Format(" AND ({0}) ", string.Join(" OR ", rptypWhere.ToArray()))); + } + + if (!string.IsNullOrEmpty(RPNUM)) + { + var rpnumWhere = new List(); + foreach (var rpnum in RPNUM.Split(',')) + { + rpnumWhere.Add(string.Format("'{0}'", rpnum)); + } + wheres.Add(string.Format(" AND RPNUM IN ({0}) ", string.Join(",", rpnumWhere.ToArray()))); + } + + cmd.CommandText = string.Format( + @"SELECT + A.RPREN, A.RPNUM, A.RAITM, A.RPCNM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP, + A.RPFTR, A.RPDOC, A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN, + A.RPANO, A.RPAGT, A.RPRTM, A.RPETM, A.RPUST, + A.RPRSN, A.RPAGM, A.RPPLC, B.BPPYM, + B.BPOTT, + CAST(A.RPTCT AS INT) / 60 AS RPTCT, + ISNULL(CAST(A.RPTCT AS INT) % 60, 0) AS RPTMT, + ISNULL(A.RPTC1, 0) / 60 AS RPTC1, + ISNULL(A.RPTC1, 0) % 60 AS RPTM1, + ISNULL(A.RPTC2, 0) / 60 AS RPTC2, + ISNULL(A.RPTC2, 0) % 60 AS RPTM2, + ISNULL(A.RPTC3, 0) / 60 AS RPTC3, + ISNULL(A.RPTC3, 0) % 60 AS RPTM3, + ISNULL(A.RPTC4, 0) / 60 AS RPTC4, + ISNULL(A.RPTC4, 0) % 60 AS RPTM4, + ISNULL(A.RPTC5, 0) / 60 AS RPTC5, + ISNULL(A.RPTC5, 0) % 60 AS RPTM5, + A.TRDAT + FROM RPAR A INNER JOIN BPAA B ON A.RPPYN=B.BPPYN + WHERE RPAPU=@RPAPU AND RPAPD IS NULL {0} + ORDER BY A.RPRDT DESC", string.Join(" ", wheres.ToArray())); + AddParam(cmd, "RPAPU", UserId); + + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select已簽核ByUser(string UserId) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT A.RPREN, A.RPNUM, A.RAITM, A.RPCNM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP, + A.RPFTR, A.RPDOC, A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN, + A.RPANO, A.RPAGT, A.RPRTM, A.RPETM, A.RPUST, + A.RPRSN, A.RPAGM, A.RPPLC, B.BPPYM, C.RPAPP AS CRPAPP, C.RPDAT AS CRPDAT, C.RPENO AS CRPENO, + B.BPOTT, + CAST(A.RPTCT AS INT) / 60 AS RPTCT, + ISNULL(CAST(A.RPTCT AS INT) % 60, 0) AS RPTMT, + ISNULL(A.RPTC1, 0) / 60 AS RPTC1, + ISNULL(A.RPTC1, 0) % 60 AS RPTM1, + ISNULL(A.RPTC2, 0) / 60 AS RPTC2, + ISNULL(A.RPTC2, 0) % 60 AS RPTM2, + ISNULL(A.RPTC3, 0) / 60 AS RPTC3, + ISNULL(A.RPTC3, 0) % 60 AS RPTM3, + ISNULL(A.RPTC4, 0) / 60 AS RPTC4, + ISNULL(A.RPTC4, 0) % 60 AS RPTM4, + ISNULL(A.RPTC5, 0) / 60 AS RPTC5, + ISNULL(A.RPTC5, 0) % 60 AS RPTM5 + FROM RPAR A INNER JOIN BPAA B ON A.RPPYN=B.BPPYN + INNER JOIN RPAB C ON A.RPREN=C.RPREN + WHERE C.RPENO=@RPENO + AND + ( + ( C.RPAPN = C.RPANO AND C.RPDAT IS NOT NULL) -- 最後一關且已簽 + OR (A.RPANO='2' AND C.RPANO='1' AND A.RPAPD IS NULL) -- 是上關且本關未簽 + OR (A.RPANO='3' AND C.RPANO='2' AND A.RPAPD IS NULL) -- 是上關且本關未簽 + OR (A.RPAPP='N') -- 不核准 + ) + ORDER BY A.RPRDT DESC"; + AddParam(cmd, "RPENO", UserId); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select我的申請(string UserId, DateTime Date1, DateTime Date2, string RPTYP, string RPAPP) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT A.RPREN, A.RPNUM, A.RAITM, A.RPCNM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP, + A.RPFTR, A.RPDOC, A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN, + A.RPANO, A.RPAGT, A.RPRTM, A.RPETM, A.RPUST, + A.RPRSN, A.RPAGM, A.RPPLC, C.RPENO AS CRPENO, + B.BPOTT, + CAST(A.RPTCT AS INT) / 60 AS RPTCT, + ISNULL(CAST(A.RPTCT AS INT) % 60, 0) AS RPTMT, + ISNULL(A.RPTC1, 0) / 60 AS RPTC1, + ISNULL(A.RPTC1, 0) % 60 AS RPTM1, + ISNULL(A.RPTC2, 0) / 60 AS RPTC2, + ISNULL(A.RPTC2, 0) % 60 AS RPTM2, + ISNULL(A.RPTC3, 0) / 60 AS RPTC3, + ISNULL(A.RPTC3, 0) % 60 AS RPTM3, + ISNULL(A.RPTC4, 0) / 60 AS RPTC4, + ISNULL(A.RPTC4, 0) % 60 AS RPTM4, + ISNULL(A.RPTC5, 0) / 60 AS RPTC5, + ISNULL(A.RPTC5, 0) % 60 AS RPTM5 + FROM RPAR A + INNER JOIN BPAA B ON A.RPPYN=B.BPPYN + INNER JOIN RPAB C ON A.RPREN=C.RPREN AND C.RPANO=A.RPANO + WHERE A.RPNUM = @RPENO + AND A.RPRDT >= @RPRDT1 AND A.RPRDT < @RPRDT2 + AND A.RPTYP LIKE @RPTYP "; + + switch (RPAPP) + { + case "YES": + cmd.CommandText += " AND A.RPAPP = 'Y' "; + break; + case "NO": + cmd.CommandText += " AND A.RPAPP = 'N' "; + break; + case "NULL": + cmd.CommandText += " AND (A.RPAPP = '' OR A.RPAPP IS NULL) "; + break; + default: + break; + } + + cmd.CommandText += " ORDER BY A.RPRDT DESC"; + AddParam(cmd, "RPENO", UserId); + AddParam(cmd, "RPRDT1", Date1); + AddParam(cmd, "RPRDT2", Date2.AddDays(1)); + AddParam(cmd, "RPTYP", RPTYP); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select我的督導專案(string UserId, DateTime Date1, DateTime Date2, string RPTYP, string RPPYN, List RPNUM, bool all) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = string.Format( + @"SELECT A.RPREN, A.RPNUM, A.RAITM, A.RPCNM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP, + A.RPFTR, A.RPDOC, A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN, + A.RPANO, A.RPAGT, A.RPRTM, A.RPETM, A.RPUST, + A.RPRSN, A.RPAGM, A.RPPLC, B.BPPYM, + B.BPOTT, + CAST(A.RPTCT AS INT) / 60 AS RPTCT, + ISNULL(CAST(A.RPTCT AS INT) % 60, 0) AS RPTMT, + ISNULL(A.RPTC1, 0) / 60 AS RPTC1, + ISNULL(A.RPTC1, 0) % 60 AS RPTM1, + ISNULL(A.RPTC2, 0) / 60 AS RPTC2, + ISNULL(A.RPTC2, 0) % 60 AS RPTM2, + ISNULL(A.RPTC3, 0) / 60 AS RPTC3, + ISNULL(A.RPTC3, 0) % 60 AS RPTM3, + ISNULL(A.RPTC4, 0) / 60 AS RPTC4, + ISNULL(A.RPTC4, 0) % 60 AS RPTM4, + ISNULL(A.RPTC5, 0) / 60 AS RPTC5, + ISNULL(A.RPTC5, 0) % 60 AS RPTM5 + FROM RPAR A + INNER JOIN BPAA B ON A.RPPYN=B.BPPYN + WHERE EXISTS (SELECT BSPYN FROM BSGP WHERE BSENO=@RPENO AND BSLVL IN ('1', '3') AND BSFLW='差勤' AND BSPYN=A.RPPYN) + AND {0} ", RPTYP.Contains("%") ? string.Format("A.RPTYP LIKE '{0}'", RPTYP) : string.Format("A.RPTYP IN ({0})", RPTYP)); + + if (RPPYN != null && RPPYN.Length > 0) + cmd.CommandText += string.Format(" AND A.RPPYN IN ({0}) ", RPPYN); + else + return new DataTable(); + + if (RPNUM != null && RPNUM.Count > 0) + cmd.CommandText += String.Format(" AND A.RPNUM IN ({0}) ", WDAC.GetIN(RPNUM)); + + if (Date1.Ticks > 0 && Date2.Ticks > 0) + { + cmd.CommandText += " AND A.RPRDT >= @RPRDT1 AND A.RPRDT < @RPRDT2 "; + } + else if (Date1.Ticks > 0 && Date2.Ticks == 0) + { + cmd.CommandText += " AND A.RPRDT >= @RPRDT1 "; + } + else if (Date1.Ticks == 0 && Date2.Ticks > 0) + { + cmd.CommandText += " AND A.RPRDT < @RPRDT2 "; + } + + if (!all) + { + cmd.CommandText += " AND A.RPAPN <> 'D' AND A.RPAPN = A.RPANO AND A.RPAPP = 'Y' "; + } + + cmd.CommandText += " ORDER BY A.RPRDT DESC "; + AddParam(cmd, "RPENO", UserId); + AddParam(cmd, "RPRDT1", Date1); + AddParam(cmd, "RPRDT2", Date2.AddDays(1)); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select我的督導專案人員(string UserId, DateTime Date1, DateTime Date2, string RPTYP, string RPPYN) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = string.Format( + @"SELECT DISTINCT A.RPNUM, A.RPNUM + ' ' + C.BPNME AS BPNME + FROM RPAR A + INNER JOIN BPAA B ON A.RPPYN=B.BPPYN + INNER JOIN BPSNView C ON A.RPNUM=C.BPENO + WHERE EXISTS (SELECT BSPYN FROM BSGP WHERE BSENO=@RPENO AND BSLVL IN ('1', '3') AND BSFLW='差勤' AND BSPYN=A.RPPYN) + AND A.RPRDT >= @RPRDT1 AND A.RPRDT < @RPRDT2 + AND {0} ", RPTYP.Contains("%") ? string.Format("A.RPTYP LIKE '{0}'", RPTYP) : string.Format("A.RPTYP IN ({0})", RPTYP)); + if (RPPYN != null && RPPYN.Length > 0) + cmd.CommandText += string.Format(" AND A.RPPYN IN ({0}) ", RPPYN); + cmd.CommandText += " ORDER BY A.RPNUM "; + AddParam(cmd, "RPENO", UserId); + AddParam(cmd, "RPRDT1", Date1); + AddParam(cmd, "RPRDT2", Date2.AddDays(1)); + return Query.Select(cmd); + } + + public DataTable Select報表資料_013(DateTime 年月, string 年度專案, string 類型) + { + DateTime 月初 = 年月.AddDays(-年月.Day + 1); + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT A.RPREN, A.RPNUM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP, A.RPTCT, A.RPFTR, A.RPDOC, + A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN, A.RPANO, A.RPAGT, A.RPRTM, A.RPETM, + A.RPUST, A.RPTC1, A.RPTC2, A.RPTC3, A.RPTC4, A.RPTC5, A.RPRSN, A.RPAGM, A.RPPLC, + B.BPNME, C.RABRH, C.RAJNO, D.BSRMK AS 站別, E.BPJME AS 職稱 + FROM RPAR A + LEFT OUTER JOIN BPSNView B ON B.BPENO = A.RPNUM + LEFT OUTER JOIN RASN C ON A.RPPYN = C.RAPYN AND A.RPNUM = C.RANUM + LEFT OUTER JOIN BCLS D ON D.BSPAR = 'BPSNBRH' AND D.BSCLS = C.RABRH + LEFT OUTER JOIN BPJA E ON E.BPPYN = C.RAPYN AND E.BPJNO = C.RAJNO + WHERE RPPYN = @RPPYN + AND RPRDT >= @RPRDT1 AND RPRDT < @RPRDT2 + AND RPTYP LIKE @RPTYP + AND RPAPN <> 'D' + AND RPAPN = RPANO + AND RPAPP = 'Y' + ORDER BY RPNUM, RPRDT, RPREN"; + AddParam(cmd, "RPPYN", 年度專案); + AddParam(cmd, "RPRDT1", 月初); + AddParam(cmd, "RPRDT2", 月初.AddMonths(1)); + + switch (類型) + { + case "請假": + AddParam(cmd, "RPTYP", "0%"); + break; + case "加班": + AddParam(cmd, "RPTYP", "1%"); + break; + case "差旅": + AddParam(cmd, "RPTYP", "3%"); + break; + } + return Query.Select(cmd); + } + + public DataTable Select報表資料_013By人員(DateTime 年月, string 人員編號, string 類型) + { + DateTime 月初 = 年月.AddDays(-年月.Day + 1); + + string SQL = @" + SELECT DISTINCT A.RPREN, A.RPNUM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP, A.RPTCT, A.RPFTR, A.RPDOC, + A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN, A.RPANO, A.RPAGT, A.RPRTM, A.RPETM, + A.RPUST, A.RPTC1, A.RPTC2, A.RPTC3, A.RPTC4, A.RPTC5, A.RPRSN, A.RPAGM, A.RPPLC, + B.BPNME, C.RABRH, C.RAJNO, D.BSSCR AS 站別, E.BPJME AS 職稱, F.BSSCR AS 類別, + COALESCE(G.BPNME, H.BPNME) AS 審核人員, + 0 AS RPAC1, 0 AS RPAC2, 0 AS RPAC3, 0 AS RPAC4, 0 AS RPAC5 + FROM RPAR A + LEFT OUTER JOIN BPSNView B ON B.BPENO = A.RPNUM + LEFT OUTER JOIN RASN C ON A.RPPYN = C.RAPYN AND A.RPNUM = C.RANUM AND (C.RASDT <= A.RPRDT AND (C.RAEDT >= A.RPRDT OR C.RAEDT IS NULL)) + LEFT OUTER JOIN BCLS D ON D.BSPAR = 'BPSNBRH' AND D.BSCLS = C.RABRH + LEFT OUTER JOIN BPJA E ON E.BPPYN = C.RAPYN AND E.BPJNO = C.RAJNO + LEFT OUTER JOIN BCLS F ON F.BSPAR = 'RPARTYP' AND F.BSCLS = A.RPTYP + LEFT OUTER JOIN BPAP G ON A.RPAPU = G.BPENO + LEFT OUTER JOIN BPSNView H ON A.RPAPU = H.BPENO + WHERE RPNUM = @RPNUM + AND ( + (RPRDT >= @RPRDT1 AND RPRDT < @RPRDT2) + OR (RPEDT >= @RPRDT1 AND RPEDT < @RPRDT2) + OR (RPRDT < @RPRDT1 AND RPEDT >= @RPRDT2) + ) + AND RPTYP LIKE @RPTYP + AND RPAPN <> 'D' + AND RPAPN = RPANO + AND RPAPP = 'Y' + {0} + ORDER BY RPRDT, RPREN"; + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = String.Format(SQL, ""); + AddParam(cmd, "RPNUM", 人員編號); + AddParam(cmd, "RPRDT1", 月初); + AddParam(cmd, "RPRDT2", 月初.AddMonths(1)); + + switch (類型) + { + case "請假": + AddParam(cmd, "RPTYP", "0%"); + break; + case "加班": + AddParam(cmd, "RPTYP", "1%"); + break; + case "公差": + AddParam(cmd, "RPTYP", "3%"); + break; + case "差旅費": + cmd.CommandText = String.Format(SQL, " AND RPFTR > 0 "); + AddParam(cmd, "RPTYP", "3%"); + break; + } + DataTable d = Query.Select(cmd); + + if (d.Rows.Count > 0) + { + // 計算加班費 + ExtraWork extraWork = new ExtraWork(); + + GetData calc = new GetData(); + calc.Query = Query; + int bpsrm; + int bpp02; + double bpbft; + double bpaft; + double bphol; + string bpovr; + string bplve; + string bpott; + + foreach (DataRow i in d.Rows) + { + // 取得該人員該專案該日期的薪資、加班費比例、加班費計算公式 + calc.GetRASN_Date_Bppyn_Bpeno_Overwork_Rate( + WDAC.GetDateTimeValue(i["RPRDT"]), + WDAC.GetStringValue(i["RPPYN"]), + WDAC.GetStringValue(i["RPNUM"]), + out bpsrm, out bpp02, out bpbft, + out bpaft, out bphol, out bpovr, + out bplve, out bpott); + + extraWork.Clear(); + extraWork.Add( + WDAC.GetStringValue(i["RPTYP"]), + WDAC.GetDateTimeValue(i["RPRDT"]), + WDAC.GetInt32Value(i["RPTCT"]), + bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott, + WDAC.GetInt32Value(i["RPTC1"]), + WDAC.GetInt32Value(i["RPTC2"]), + WDAC.GetInt32Value(i["RPTC3"]), + WDAC.GetInt32Value(i["RPTC4"]), + WDAC.GetInt32Value(i["RPTC5"])); + + i.BeginEdit(); + i["RPAC1"] = extraWork.RPTA1; + i["RPAC2"] = extraWork.RPTA2; + i["RPAC3"] = extraWork.RPTA3; + i["RPAC4"] = extraWork.RPTA4; + i["RPAC5"] = extraWork.RPTA5; + i.EndEdit(); + } + } + + return d; + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select出勤資料(DateTime 起日, DateTime 迄日, string 年度專案, string 人員編號) + { + TimeCalc timeCalc = new TimeCalc(); + RtmeDAC rtmeDao = new RtmeDAC(Query); + + // 1. 準備輸出架構 + DataTable result = new DataTable(); + result.Columns.Add("日期", typeof(DateTime)); + result.Columns.Add("人員編號", typeof(String)); + result.Columns.Add("人員姓名", typeof(String)); + result.Columns.Add("站別編號", typeof(String)); + result.Columns.Add("站別名稱", typeof(String)); + result.Columns.Add("職稱", typeof(String)); + result.Columns.Add("上班時間", typeof(String)); + result.Columns.Add("上班IP", typeof(String)); + result.Columns.Add("下班時間", typeof(String)); + result.Columns.Add("下班IP", typeof(String)); + result.Columns.Add("請假時數", typeof(Int32)); + result.Columns.Add("加班時數", typeof(Int32)); + result.Columns.Add("出差時數", typeof(Int32)); + result.Columns.Add("請假分數", typeof(Int32)); + result.Columns.Add("加班分數", typeof(Int32)); + result.Columns.Add("出差分數", typeof(Int32)); + result.Columns.Add("出差外出時間", typeof(String)); + result.Columns.Add("出差外出IP", typeof(String)); + result.Columns.Add("出差返回時間", typeof(String)); + result.Columns.Add("出差返回IP", typeof(String)); + result.Columns.Add("備註", typeof(String)); + + // 2. 抓專案人員以及打卡資料 + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT A.RANUM, C.BPNME, A.RABRH, G.BSRMK AS 單位, H.BPJME AS 職稱 + FROM RASN A + INNER JOIN BPSNView C ON C.BPENO=A.RANUM + LEFT OUTER JOIN BCLS G ON G.BSPAR='BPSNBRH' AND G.BSCLS=A.RABRH + LEFT OUTER JOIN BPJA H ON H.BPPYN=A.RAPYN AND H.BPJNO=A.RAJNO + WHERE A.RAPYN = @BPPYN + AND ( (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM2) + OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL) + OR (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT IS NULL) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) ) + GROUP BY A.RANUM, C.BPNME, A.RABRH, G.BSRMK, H.BPJME + ORDER BY A.RANUM"; + AddParam(cmd, "BPPYN", 年度專案); + AddParam(cmd, "YYMM1", 起日.Date); + AddParam(cmd, "YYMM2", 迄日.Date); + DataTable d = Query.Select(cmd); + + DateTime 日期 = 起日; + + // 抓加班時數計算方式 + BpaaDAC bpaa = new BpaaDAC(Query); + string bpott = bpaa.GetOverTimeType(年度專案); + + // 2. 計算差勤單資料,拆到每一天 + + // 2.1. 準備取當天差勤資料的 SQL + DbCommand cmd1 = Query.NewCommand(); + cmd1.CommandText = + // @"SELECT RPPYN, RPNUM, RPTYP, RPRDT, RPEDT, RPRTM, RPETM, RPTCT + // FROM RPAR A + // WHERE RPPYN=@RPPYN + // AND RPNUM=@RPNUM + // AND ((RPRDT = @YYMM1 AND RPEDT IS NULL) + // OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM1)) + // AND ((RPAPN IS NULL) + // OR (RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y'))"; + // @"SELECT RPPYN, RPNUM, RPTYP, RPRDT, RPEDT, RPRTM, RPETM, RPTCT + // FROM RPAR A + // WHERE RPPYN=@RPPYN + // AND RPNUM=@RPNUM + // AND ((RPRDT = @YYMM1 AND RPEDT IS NULL) + // OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM1)) + // AND ((RPAPN IS NULL) OR (RPAPN<>'D'))"; + @"SELECT RPPYN, RPNUM, RPTYP, RPRDT, RPEDT, RPRTM, RPETM, RPTCT + FROM RPAR A + WHERE RPPYN=@RPPYN + AND RPNUM=@RPNUM + AND ((RPRDT = @YYMM1 AND RPEDT IS NULL) + OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM1)) + AND ((RPAPN IS NULL) OR ((RPAPN<>'D') AND (RPAPN=RPANO) AND (RPAPP<>'N')))"; + + // 2.2. 準備取當天打卡資料的 SQL + DbCommand cmd2 = Query.NewCommand(); + cmd2.CommandText = + @"SELECT RCC01, RCC02, RCC07, RCC08, RCP01, RCP02, RCP07, RCP08 FROM RCRD + WHERE RCDAT = @RCDAT + AND RCUSR = @RCUSR"; + + while (日期 <= 迄日) + { + // 2.2 計算當天資料 + foreach (DataRow r in d.Rows) + { + // 若有人員編號條件,於此處過濾 + if (人員編號.Length > 0) + { + if (人員編號.CompareTo(r["RANUM"]) != 0) + continue; + } + + // 取差勤資料,並計算 + AddParam(cmd1, "RPPYN", 年度專案); + AddParam(cmd1, "YYMM1", 日期); + AddParam(cmd1, "RPNUM", r["RANUM"]); + DataTable d1 = Query.Select(cmd1); + int 請假 = 0; + int 加班 = 0; + int 差旅 = 0; + List 備註 = new List(); + + foreach (DataRow r1 in d1.Rows) + { + string RPNUM = GetStringValue(r1["RPNUM"]); + DateTime 差勤起日 = GetDateTimeValue(r1["RPRDT"]); + DateTime 差勤迄日 = GetDateTimeValue(r1["RPEDT"]); + string 差勤起時 = GetStringValue(r1["RPRTM"]); + string 差勤迄時 = GetStringValue(r1["RPETM"]); + string 類別 = GetStringValue(r1["RPTYP"]); + + switch (類別.Substring(0, 1)) + { + case RPAR_TYPE.T0_請假: + 請假 += timeCalc.計算請假當日時數(RPNUM, 日期, 差勤起日, 差勤迄日, 差勤起時, 差勤迄時, 類別, bpott == "1"); + break; + case RPAR_TYPE.T1_加班: + 加班 += timeCalc.計算加班時數(RPNUM, 日期, 差勤起時, 差勤迄時, RPAR_TYPE.休息日加班(類別)); + break; + case RPAR_TYPE.T3_出差: + 差旅 += timeCalc.計算差旅當日時數(RPNUM, 日期, 差勤起日, 差勤迄日, 差勤起時, 差勤迄時); + break; + } + } + + // 取打卡資料 + AddParam(cmd2, "RCDAT", 日期); + AddParam(cmd2, "RCUSR", r["RANUM"]); + DataTable d2 = Query.Select(cmd2); + + DataRow newRow = result.NewRow(); + newRow["日期"] = 日期; + newRow["人員編號"] = r["RANUM"]; + newRow["人員姓名"] = r["BPNME"]; + newRow["站別編號"] = r["RABRH"]; + newRow["站別名稱"] = r["單位"]; + newRow["職稱"] = r["職稱"]; + if (d2.Rows.Count > 0) + { + newRow["上班時間"] = d2.Rows[0]["RCC01"]; + newRow["上班IP"] = d2.Rows[0]["RCP01"]; + newRow["下班時間"] = d2.Rows[0]["RCC02"]; + newRow["下班IP"] = d2.Rows[0]["RCP02"]; + newRow["出差外出時間"] = d2.Rows[0]["RCC07"]; + newRow["出差外出IP"] = d2.Rows[0]["RCP07"]; + newRow["出差返回時間"] = d2.Rows[0]["RCC08"]; + newRow["出差返回IP"] = d2.Rows[0]["RCP08"]; + + if (WDAC.GetStringValue(d2.Rows[0]["RCP01"]) == "補打卡") + 備註.Add("補打上班卡"); + if (WDAC.GetStringValue(d2.Rows[0]["RCP02"]) == "補打卡") + 備註.Add("補打下班卡"); + } + else + { + newRow["上班時間"] = ""; + newRow["上班IP"] = ""; + newRow["下班時間"] = ""; + newRow["下班IP"] = ""; + newRow["出差外出時間"] = ""; + newRow["出差外出IP"] = ""; + newRow["出差返回時間"] = ""; + newRow["出差返回IP"] = ""; + } + + // 取班表資料 + var btmeItem = rtmeDao.SelectBtmeDay(GetStringValue(r["RANUM"]), 日期); + if (btmeItem != null) + { + 備註.Add(string.Format("值{0}{1}-{2}", btmeItem.BTNME, btmeItem.BTSTM, btmeItem.BTETM)); + } + + newRow["請假時數"] = 請假 / 60; + newRow["請假分數"] = 請假 % 60; + newRow["加班時數"] = 加班 / 60; + newRow["加班分數"] = 加班 % 60; + newRow["出差時數"] = 差旅 / 60; + newRow["出差分數"] = 差旅 % 60; + newRow["備註"] = string.Join("/", 備註.ToArray()); + result.Rows.Add(newRow); + } + + 日期 = 日期.AddDays(1); + } + + return result; + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select出勤資料By人員(DateTime 日期, string 人員編號) + { + TimeCalc timeCalc = new TimeCalc(); + + // 1. 抓專案人員以及打卡資料 + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT A.RANUM + , C.BPNME + , A.RAPYN + , A.RABRH, G.BSSCR AS 單位, H.BPJME AS 職稱 + , B.RCC01, B.RCC02, B.RCP01, B.RCP02, B.RCC07, B.RCC08 + , 0 AS 請假時數, 0 AS 請假分數, 0 AS 加班時數, 0 AS 加班分數, 0 AS 出差時數, 0 AS 出差分數 + , 0 AS 請假, 0 AS 加班, 0 AS 出差 + FROM RASN A + INNER JOIN BPSNView C ON C.BPENO=A.RANUM + LEFT OUTER JOIN RCRD B ON B.RCUSR=A.RANUM AND B.RCDAT=@YYMM1 + LEFT OUTER JOIN BCLS G ON G.BSPAR='BPSNBRH' AND G.BSCLS=A.RABRH + LEFT OUTER JOIN BPJA H ON H.BPPYN=A.RAPYN AND H.BPJNO=A.RAJNO + WHERE A.RANUM = @RANUM + AND ( + (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1) + OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL) + ) + GROUP BY A.RANUM, C.BPNME, A.RAPYN, A.RABRH, G.BSSCR, H.BPJME, B.RCC01, B.RCC02, B.RCP01, B.RCP02, B.RCC07, B.RCC08 + ORDER BY A.RANUM"; + AddParam(cmd, "RANUM", 人員編號); + AddParam(cmd, "YYMM1", 日期); + DataTable d = Query.Select(cmd); + + // 抓加班時數計算方式 + BpaaDAC bpaa = new BpaaDAC(Query); + + // 2. 抓差勤單資料,拆到每一天 + DbCommand cmd1 = Query.NewCommand(); + cmd1.CommandText = + @"SELECT RPPYN, RPNUM, RPTYP, RPRDT, RPEDT, RPRTM, RPETM, RPTCT + FROM RPAR A + WHERE RPNUM=@RPNUM + AND ((RPRDT = @YYMM1 AND RPEDT IS NULL) + OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM1)) + AND ((RPAPN IS NULL) + OR (RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y'))"; + AddParam(cmd1, "RPNUM", 人員編號); + AddParam(cmd1, "YYMM1", 日期); + + foreach (DataRow r in d.Rows) + { + + AddParam(cmd1, "RPNUM", r["RANUM"]); + DataTable d1 = Query.Select(cmd1); + int 請假 = 0; + int 加班 = 0; + int 差旅 = 0; + + foreach (DataRow r1 in d1.Rows) + { + string rpnum = GetStringValue(r1["RPNUM"]); + string rppyn = GetStringValue(r1["RPPYN"]); + string bpott = bpaa.GetOverTimeType(rppyn); + DateTime 起日 = GetDateTimeValue(r1["RPRDT"]); + DateTime 迄日 = GetDateTimeValue(r1["RPEDT"]); + string 起時 = GetStringValue(r1["RPRTM"]); + string 迄時 = GetStringValue(r1["RPETM"]); + string 類別 = GetStringValue(r1["RPTYP"]); + + switch (類別.Substring(0, 1)) + { + case RPAR_TYPE.T0_請假: + 請假 += timeCalc.計算請假當日時數(rpnum, 日期, 起日, 迄日, 起時, 迄時, 類別, bpott == "1"); + break; + case RPAR_TYPE.T1_加班: + 加班 += timeCalc.計算加班時數(rpnum, 日期, 起時, 迄時, "13,14".Contains(類別)); + break; + case RPAR_TYPE.T3_出差: + 差旅 += timeCalc.計算差旅當日時數(rpnum, 日期, 起日, 迄日, 起時, 迄時); + break; + } + } + + r.BeginEdit(); + r["請假時數"] = 請假 / 60; + r["請假分數"] = 請假 % 60; + r["加班時數"] = 加班 / 60; + r["加班分數"] = 加班 % 60; + r["出差時數"] = 差旅 / 60; + r["出差分數"] = 差旅 % 60; + r["請假"] = 請假; + r["加班"] = 加班; + r["出差"] = 差旅; + r.EndEdit(); + } + + return d; + } + + //public void 回填加班時數(string 單號, int 前二加班, int 後二加班, int 假日加班) + //{ + // DbCommand cmd = Query.NewCommand(); + // cmd.CommandText = + // @"UPDATE RPAR SET + // RPTC1 = @RPTC1, + // RPTC2 = @RPTC2, + // RPTC3 = @RPTC3 + // WHERE RPREN = @RPREN"; + // AddParam(cmd, "RPTC1", 前二加班); + // AddParam(cmd, "RPTC2", 後二加班); + // AddParam(cmd, "RPTC3", 假日加班); + // AddParam(cmd, "RPREN", 單號); + // Query.ExecuteNonQuery(cmd); + //} + + public void 回填加班費(string 單號, int RPTA1, int RPTA2, int RPTA3, int RPTA4, int RPTA5, DbTransaction tran) + { + DbCommand cmd = Query.NewCommand(); + if (tran != null) + { + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + } + cmd.CommandText = + @"UPDATE RPAR SET + RPTA1 = @RPTA1, + RPTA2 = @RPTA2, + RPTA3 = @RPTA3, + RPTA4 = @RPTA4, + RPTA5 = @RPTA5, + RPFTR = @RPFTR + WHERE RPREN = @RPREN"; + AddParam(cmd, "RPTA1", RPTA1); + AddParam(cmd, "RPTA2", RPTA2); + AddParam(cmd, "RPTA3", RPTA3); + AddParam(cmd, "RPTA4", RPTA4); + AddParam(cmd, "RPTA5", RPTA5); + AddParam(cmd, "RPFTR", RPTA1 + RPTA2 + RPTA3 + RPTA4 + RPTA5); + AddParam(cmd, "RPREN", 單號); + if (tran != null) + { + cmd.ExecuteNonQuery(); + } + else + { + Query.ExecuteNonQuery(cmd); + } + } + + public void 回填缺勤扣款(string 單號, int RPFTR, DbTransaction tran) + { + DbCommand cmd = Query.NewCommand(); + if (tran != null) + { + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + } + cmd.CommandText = + @"UPDATE RPAR SET + RPFTR = @RPFTR + WHERE RPREN = @RPREN"; + AddParam(cmd, "RPFTR", RPFTR); + AddParam(cmd, "RPREN", 單號); + if (tran != null) + { + cmd.ExecuteNonQuery(); + } + else + { + Query.ExecuteNonQuery(cmd); + } + } + + public bool 代理人不在(string 代理人姓名, string 代理人電郵, DateTime 起日, DateTime 迄日, string 起時, string 迄時) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT COUNT(1) FROM + ( + SELECT A.RPNUM, A.RPTYP, B.BPNME, B.BPEML, + CONVERT(VARCHAR(8), A.RPRDT, 112) + '-' + ISNULL(A.RPRTM, '00:00') AS START_DT, + CONVERT(VARCHAR(8), A.RPEDT, 112) + '-' + ISNULL(A.RPETM, '24:00') AS END_DT + FROM RPAR A + LEFT JOIN BPSNView B ON A.RPNUM=B.BPENO + WHERE A.RPRDT >= '2016/1/1' + AND ((A.RPTYP >= '00' AND A.RPTYP <= '0Z') OR (A.RPTYP >= '30' AND A.RPTYP <= '3Z')) + AND B.BPNME = @RPAGT + AND B.BPEML = @RPAGM + AND A.RPANO <> 'D' + AND A.RPAPP <> 'N' + ) AS TMP1 + WHERE ((START_DT <= @SDT AND END_DT > @SDT) OR (START_DT < @EDT AND END_DT >= @EDT))"; + AddParam(cmd, "SDT", String.Format(WGuard1.InvariantCulture, "{0:yyyyMMdd}-{1}", 起日, 起時)); + AddParam(cmd, "EDT", String.Format(WGuard1.InvariantCulture, "{0:yyyyMMdd}-{1}", 迄日, 迄時)); + AddParam(cmd, "RPAGT", 代理人姓名); + AddParam(cmd, "RPAGM", 代理人電郵); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)) > 0; + } + + public DataTable 我是代理人的單據(string 員工姓名, string 員工電郵, DateTime 起日, DateTime 迄日, string 起時, string 迄時, + bool check請假, bool check差勤) + { + string sql請假 = "A.RPTYP >= '00' AND A.RPTYP <= '0Z'"; + if (!check請假) + sql請假 = "1=0"; + string sql差勤 = "A.RPTYP >= '30' AND A.RPTYP <= '3Z'"; + if (!check差勤) + sql差勤 = "1=0"; + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = String.Format( + @"SELECT * FROM + ( + SELECT A.RPPYN, A.RPREN, A.RPNUM, A.RPTYP, C.BSSCR, B.BPNME, B.BPEML, B.BPMB1, B.BPMB2, + CONVERT(VARCHAR(8), A.RPRDT, 112) + '-' + ISNULL(A.RPRTM, '00:00') AS START_DT, + CONVERT(VARCHAR(8), A.RPEDT, 112) + '-' + ISNULL(A.RPETM, '24:00') AS END_DT + FROM RPAR A + JOIN BPSNView B ON A.RPNUM = B.BPENO + JOIN BCLS C ON A.RPTYP = C.BSCLS AND C.BSPAR='RPARTYP' + WHERE A.RPRDT >= '2016/1/1' + AND (({0}) OR ({1})) + AND A.RPAGT = @RPAGT + AND A.RPAGM = @RPAGM + AND A.RPANO <> 'D' + AND A.RPAPP <> 'N' + ) AS TMP1 + WHERE ((START_DT <= @SDT AND END_DT > @SDT) OR (START_DT < @EDT AND END_DT >= @EDT))", + sql請假, sql差勤); + AddParam(cmd, "SDT", String.Format(WGuard1.InvariantCulture, "{0:yyyyMMdd}-{1}", 起日, 起時)); + AddParam(cmd, "EDT", String.Format(WGuard1.InvariantCulture, "{0:yyyyMMdd}-{1}", 迄日, 迄時)); + AddParam(cmd, "RPAGT", 員工姓名); + AddParam(cmd, "RPAGM", 員工電郵); + return Query.Select(cmd); + } + + public DataTable 我是代理人的單據(string 員工姓名, string 員工電郵, DateTime 起日, DateTime 迄日, string 起時, string 迄時) + { + return 我是代理人的單據(員工姓名, 員工電郵, 起日, 迄日, 起時, 迄時, true, true); + } + + public bool 檢查休息日加班(string BPENO, DateTime RPRDT, string RPREN, out string message) + { + message = ""; + + var holiday_type = new BhrdDAC().GetDayHolidayType(RPRDT); + if (holiday_type != HolidayType.Holiday && holiday_type != HolidayType.ElasticRest) + { + message = "只有例假日、休息日、彈性休假日可以申請休息日加班!"; + return false; + } + + DateTime sun; + DateTime sat; + + if (RPRDT.DayOfWeek == DayOfWeek.Sunday) + { + sun = RPRDT; + sat = RPRDT.AddDays(-1); + } + else + { + sun = RPRDT.AddDays(1); + sat = RPRDT; + } + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT COUNT(DISTINCT RPRDT) + FROM RPAR + WHERE (RPRDT = @SAT OR RPRDT = @SUN) + AND RPNUM = @BPENO + AND (RPTYP = '13' OR RPTYP = '14') + AND (RPAPN IS NULL OR (RPAPN <> 'D' AND (RPAPP IS NULL OR RPAPP <> 'N'))) + AND RPRDT <> @RPRDT"; + AddParam(cmd, "SAT", sat); + AddParam(cmd, "SUN", sun); + AddParam(cmd, "BPENO", BPENO); + AddParam(cmd, "RPRDT", RPRDT); + + if (WDAC.GetInt32Value(Query.ExecuteScalar(cmd)) > 0) + { + message = "不可連續兩天申請休息日加班!"; + return false; + } + + return true; + } + + public DataTable 代理人提醒(DateTime 代理日期) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT A.RPPYN, A.RPREN, A.RPNUM, A.RPTYP, A.RPAGT, A.RPAGM, + A.RPRDT, A.RPRTM, A.RPEDT, A.RPETM, A.RPRSN, A.RPDOC, + B.BPNME, B.BPEML, C.BSSCR + FROM RPAR A + JOIN BPSNView B ON A.RPNUM = B.BPENO + JOIN BCLS C ON A.RPTYP = C.BSCLS AND C.BSPAR='RPARTYP' + WHERE A.RPRDT = @RPRDT + AND ((A.RPTYP >= '00' AND A.RPTYP <= '0Z') OR (A.RPTYP >= '30' AND A.RPTYP <= '3Z')) + AND A.RPAGT IS NOT NULL + AND A.RPAGT <> '' + AND A.RPANO <> 'D' + AND A.RPAPP <> 'N' "; + AddParam(cmd, "RPRDT", 代理日期); + return Query.Select(cmd); + } + + public DataTable 取得督導(string 單號) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT A.RPENO, B.BPNME, B.BPEML + FROM RPAB A + LEFT JOIN BPSNView B ON A.RPENO = B.BPENO + WHERE A.RPREN <> '' AND A.RPREN IS NOT NULL AND A.RPREN = @RPREN + AND A.RPANO = '1' "; + AddParam(cmd, "RPREN", 單號); + return Query.Select(cmd); + } + + public List<差勤日報表Item> 取得差勤日報表資料(string 年度接單編號, DateTime 起日, DateTime 迄日, string 類別) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT DISTINCT A.RPPYN 年度接單編號, A.RPNUM 員工編號, B.BPNME 員工姓名 + , A.RPTYP 類別, C.BSSCR 類別名稱 + , A.RPRDT 起日, A.RPRTM 起時, A.RPEDT 迄日, A.RPETM 迄時 + , CAST(A.RPTCT AS INT) / 60 時數, CAST(A.RPTCT AS INT) % 60 分數 + , D.RABRH 站別編號, E.BSSCR 站別名稱, A.RPPLC 出差地點 + FROM RPAR A + JOIN BPSNView B ON A.RPNUM=B.BPENO + JOIN BCLS C ON A.RPTYP=C.BSCLS AND C.BSPAR='RPARTYP' + JOIN RASN D ON A.RPPYN=D.RAPYN AND A.RPNUM=D.RANUM + AND ((D.RASDT BETWEEN @SDT AND @EDT) + OR (D.RAEDT BETWEEN @SDT AND @EDT) + OR (D.RASDT <= @SDT AND (D.RAEDT >= @EDT OR D.RAEDT IS NULL))) + JOIN BCLS E ON D.RABRH=E.BSCLS AND E.BSPAR='BPSNBRH' + WHERE A.RPRDT > '2016/1/1' + AND A.RPPYN = @RPPYN + AND ((A.RPRDT BETWEEN @SDT AND @EDT) OR (A.RPEDT BETWEEN @SDT AND @EDT) OR (A.RPRDT <= @SDT AND A.RPEDT >= @EDT)) + AND A.RPANO <> 'D' + AND A.RPAPP <> 'N' + AND A.RPTYP LIKE @RPTYP + ORDER BY A.RPPYN, A.RPNUM "; + AddParam(cmd, "RPPYN", 年度接單編號); + AddParam(cmd, "SDT", 起日); + AddParam(cmd, "EDT", 迄日); + AddParam(cmd, "RPTYP", 類別 + "%"); + + return Query.Select<差勤日報表Item>(cmd); + } + + public List<補休明細Item> 取得補休明細資料(string 員工編號) + { + var today = DateTime.UtcNow.AddHours(8).Date; + + // 取得員工在請假日期所在專案的補休期限設定 + int otd = new GetData(Query).GetBPOTD_DATE_BPENO(today, 員工編號); + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = String.Format( + @"SELECT '補登' 類別, RBENO 員工編號, RBREN 單號, RBDAT 日期, + (CAST(RBTCT AS INT) - ISNULL(CAST(RBUST AS INT), 0)) / 60 可用時數, + (CAST(RBTCT AS INT) - ISNULL(CAST(RBUST AS INT), 0)) % 60 可用分數, + DATEADD(month, 6, RBDAT) 有效期限 + FROM RBSA + WHERE 1=1 + AND RBENO = @員工編號 + AND RBDAT >= @起始日期 -- 補休6個月之內有效 + AND RBDAT >= dbo.BPSDY(RBSA.RBENO) -- 到職日之後 + AND RBDAT < @TODAY -- 今天之前 + AND (RBUST IS NULL OR RBUST= @起始日期 -- 補休6個月之內有效 + AND ((RPAPN IS NOT NULL AND RPAPN <> 'D' AND RPAPN = RPANO AND RPAPP = 'Y') OR (RPAPN IS NULL)) -- 非抽單且已經簽核完畢或無須簽核的單子 + AND (RPUST IS NULL OR RPUST < RPTCT) -- 尚未使用完畢 + AND RPRDT >= dbo.BPSDY(RPAR.RPNUM) -- 到職日之後 + AND RPRDT < @TODAY -- 今天之前 + ORDER BY 類別, 有效期限 ", 補休類別Where); + AddParam(cmd, "員工編號", 員工編號); + AddParam(cmd, "起始日期", today.AddMonths(-otd)); + AddParam(cmd, "TODAY", today); + return Query.Select<補休明細Item>(cmd); + } + + + /// + /// 檢查輸入資料是否重複 + /// + /// 單號 + /// 員工編號 + /// 開始日期 + /// 結束日期 + /// 開始時間 + /// 結束時間 + /// + public bool 加班單是否重複(string RPREN, string RPNUM, DateTime? RPRDT, DateTime? RPEDT, string RPRTM, string RPETM) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = "SELECT COUNT(*) FROM RPAR WHERE RPREN <> @RPREN AND RPTYP LIKE '1%' AND RPAPN <> 'D' AND (RPAPP IS NULL OR RPAPP <> 'N') "; + AddParam(cmd, "RPREN", RPREN); + if (!string.IsNullOrEmpty(RPNUM)) + { + cmd.CommandText += " AND RPNUM = @RPNUM "; + AddParam(cmd, "RPNUM", RPNUM); + } + if (RPRDT.HasValue) + { + cmd.CommandText += " AND RPRDT = @RPRDT "; + AddParam(cmd, "RPRDT", RPRDT); + } + if (RPEDT.HasValue) + { + cmd.CommandText += " AND RPEDT = @RPEDT "; + AddParam(cmd, "RPEDT", RPEDT); + } + if (!string.IsNullOrEmpty(RPRTM)) + { + cmd.CommandText += " AND RPRTM = @RPRTM "; + AddParam(cmd, "RPRTM", RPRTM); + } + if (!string.IsNullOrEmpty(RPETM)) + { + cmd.CommandText += " AND RPETM = @RPETM"; + AddParam(cmd, "RPETM", RPETM); + } + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)) > 0; + } + + + /// + /// 取得當月加班時數(包含未簽核完成) + /// + /// + /// + /// + public int Select當月加班時數(DateTime 年月, string 人員編號, string 排除單號) + { + DateTime 月初 = 年月.AddDays(-年月.Day + 1); + + string SQL = @" + SELECT ISNULL(SUM(A.RPTCT), 0) + FROM RPAR A + WHERE RPNUM = @RPNUM + AND ( + (RPRDT >= @RPRDT1 AND RPRDT < @RPRDT2) + OR (RPEDT >= @RPRDT1 AND RPEDT < @RPRDT2) + OR (RPRDT < @RPRDT1 AND RPEDT >= @RPRDT2) + ) + AND RPTYP LIKE '1%' -- 加班單 + AND RPAPN <> 'D' -- 排除抽單 + AND (RPAPP <> 'N' OR RPAPP IS NULL) -- 排除簽核不通過 + AND RPREN <> @EXT_RPREN -- 排除某單號 + "; + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = String.Format(SQL, ""); + AddParam(cmd, "RPNUM", 人員編號); + AddParam(cmd, "RPRDT1", 月初); + AddParam(cmd, "RPRDT2", 月初.AddMonths(1)); + AddParam(cmd, "EXT_RPREN", 排除單號); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + public static string GetAttachLink(string RPREN, Page page) + { + var link = ""; + var allFiles = Directory.GetFiles(PublicVariable.RPARAttachPath).ToList(); + var f = allFiles.Find(p => Path.GetFileName(p).StartsWith(RPREN + ".")); + if (!String.IsNullOrEmpty(f) && File.Exists(f)) + { + link += string.Format("檢視附件1    ", + page.ResolveClientUrl("~/UploadedPicture/RPAR_ATTACHMENT/"), Path.GetFileName(f)); + } + + f = allFiles.Find(p => Path.GetFileName(p).StartsWith(RPREN + "_2.")); + if (!String.IsNullOrEmpty(f) && File.Exists(f)) + { + link += string.Format("檢視附件2    ", + page.ResolveClientUrl("~/UploadedPicture/RPAR_ATTACHMENT/"), Path.GetFileName(f)); + } + + f = allFiles.Find(p => Path.GetFileName(p).StartsWith(RPREN + "_3.")); + if (!String.IsNullOrEmpty(f) && File.Exists(f)) + { + link += string.Format("檢視附件3    ", + page.ResolveClientUrl("~/UploadedPicture/RPAR_ATTACHMENT/"), Path.GetFileName(f)); + } + + if (link.Length > 0) + { + return link; + } + else + return "無附件"; + } + + private static bool GetAttachExists(string RPREN, string fileNo) + { + var allFiles = Directory.GetFiles(PublicVariable.RPARAttachPath).ToList(); + return !String.IsNullOrEmpty(allFiles.Find(p => Path.GetFileName(p).StartsWith(RPREN + fileNo + "."))); + } + + public static bool GetAttach1Exists(string RPREN) + { + return GetAttachExists(RPREN, ""); + } + + public static bool GetAttach2Exists(string RPREN) + { + return GetAttachExists(RPREN, "_2"); + } + + public static bool GetAttach3Exists(string RPREN) + { + return GetAttachExists(RPREN, "_3"); + } + + private static void DeleteAttach(string RPREN, string fileNo) + { + var allFiles = Directory.GetFiles(PublicVariable.RPARAttachPath).ToList(); + var file = allFiles.Find(p => Path.GetFileName(p).StartsWith(RPREN + fileNo + ".")); + if (!String.IsNullOrEmpty(file) && File.Exists(file)) + File.Delete(file); + } + + public static void DeleteAttach1(string RPREN) + { + DeleteAttach(RPREN, ""); + } + + public static void DeleteAttach2(string RPREN) + { + DeleteAttach(RPREN, "_2"); + } + + public static void DeleteAttach3(string RPREN) + { + DeleteAttach(RPREN, "_3"); + } + + + /// + /// 打卡是否正常 + /// + /// 日期 + /// 員工編號 + /// 派駐專案 + /// 是否要上班 + /// 上班打卡 + /// 下班打卡 + /// 外出打卡 + /// 返回打卡 + /// + public 打卡檢查Item IsPunchcardNormal(DateTime date + , string bpeno + , string rapyn + , bool isDuty + , string rcc01 + , string rcc02 + , string rcc07 + , string rcc08) + { + // 不檢查打卡的 + var cmdNoCheck = Query.NewCommand( + @"SELECT COUNT(*) + FROM NO_PUNCH_CHECK + WHERE CATEGORY = 'BPENO' AND VALUE = @BPENO + OR CATEGORY = 'RAPYN' AND VALUE = RIGHT(@RAPYN, LEN(VALUE))"); + Query.AddParam(cmdNoCheck, "BPENO", bpeno); + Query.AddParam(cmdNoCheck, "RAPYN", rapyn); + if (GetInt32Value(Query.ExecuteScalar(cmdNoCheck)) > 0) + { + return new 打卡檢查Item(); + } + + TimeCalc timeCalc = new TimeCalc(); + if (isDuty) + { + // 取得員工當日班表 + timeCalc.Init(bpeno, date); + + // 有打卡 + if (!string.IsNullOrEmpty(rcc01) && !string.IsNullOrEmpty(rcc02)) + { + // 計算打卡分鐘數 + var onDutyMinutes = TimeCalc.計算分鐘數(rcc01, rcc02) - timeCalc.計算午休分鐘數(rcc01, rcc02); + // 若有外出打卡要扣除 + if (!string.IsNullOrEmpty(rcc07) && !string.IsNullOrEmpty(rcc08)) + { + onDutyMinutes -= TimeCalc.計算分鐘數(rcc07, rcc08) - timeCalc.計算午休分鐘數(rcc07, rcc08); + } + // 如果打卡分鐘數不夠 + if (onDutyMinutes < timeCalc.上班分鐘數) + { + // 加上請假出差分鐘數 + DataTable tableRpar = Select出勤資料By人員(date, bpeno); + foreach (DataRow rowRpar in tableRpar.Rows) + { + onDutyMinutes += WDAC.GetInt32Value(rowRpar["請假"]); + onDutyMinutes += WDAC.GetInt32Value(rowRpar["出差"]); + } + // 若分鐘數還不夠,列入發郵件 + if (onDutyMinutes < timeCalc.上班分鐘數) + { + return new 打卡檢查Item(false, 打卡檢查Item.時數不足); + } + } + } + // 沒有打卡 + else + { + // 取得請假與差旅單 + DataTable tableRpar = Select出勤資料By人員(date, bpeno); + var offDutyMinutes = 0; + foreach (DataRow rowRpar in tableRpar.Rows) + { + offDutyMinutes += WDAC.GetInt32Value(rowRpar["請假"]); + offDutyMinutes += WDAC.GetInt32Value(rowRpar["出差"]); + } + // 若分鐘數還不夠,列入發郵件 + if (offDutyMinutes < timeCalc.上班分鐘數) + { + return new 打卡檢查Item(false, 打卡檢查Item.時數不足); + } + } + } + + // 檢查是否連續七天打卡 + RcrdDAC rcrdDao = new RcrdDAC(Query); + if (rcrdDao.PunchDaysIn7Days(date, bpeno, true) >= 7) + return new 打卡檢查Item(false, 打卡檢查Item.打卡異常); + + return new 打卡檢查Item(); + } +} + + + +public class 差勤日報表Item +{ + public string 年度接單編號 { get; set; } + public string 員工編號 { get; set; } + public string 員工姓名 { get; set; } + public string 類別 { get; set; } + public string 類別名稱 { get; set; } + public DateTime 起日 { get; set; } + public string 起時 { get; set; } + public DateTime 迄日 { get; set; } + public string 迄時 { get; set; } + public double 時數 { get; set; } + public double 分數 { get; set; } + public string 站別編號 { get; set; } + public string 站別名稱 { get; set; } + public string 出差地點 { get; set; } +} + +public class 補休明細Item +{ + public string 類別 { get; set; } + public string 員工編號 { get; set; } + public string 單號 { get; set; } + public DateTime 日期 { get; set; } + public double 可用時數 { get; set; } + public double 可用分數 { get; set; } + public DateTime 有效期限 { get; set; } +} + +public class 打卡檢查Item +{ + public bool 正常 { get; set; } + public string 異常訊息 { get; set; } + + public const string 時數不足 = "打卡時數 + 請假時數 + 差勤時數不足當天應上班時數"; + public const string 打卡異常 = "連續 7 天打卡"; + + public 打卡檢查Item() + { + this.正常 = true; + this.異常訊息 = String.Empty; + } + + public 打卡檢查Item(bool 正常, string 異常訊息) : this() + { + this.正常 = 正常; + this.異常訊息 = 異常訊息; + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/RpirDAC.cs b/Web/App_Code/DAC/RpirDAC.cs new file mode 100644 index 0000000..30950fd --- /dev/null +++ b/Web/App_Code/DAC/RpirDAC.cs @@ -0,0 +1,1268 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Text; +using System.ComponentModel; +using Wellan.Data; + +/// +/// 勞健保紀錄與異動紀錄的資料存取類別 +/// +[DataObject(true)] +public class RpirDAC : Wellan.Data.WDAC +{ + private DbCommand cmdSelectRpirRpren; + private DbCommand cmdSelectRpib; + private DbCommand cmdSelectRpir; + private DbCommand cmdSelectRpibOne; + private DbCommand cmdSelectRpirOne; + private DbCommand cmdSelectRpib1; + // private DbCommand cmdSelectRpib2; + private string sqlSelectRpib1; + private string orderSelectRpib1; + + public RpirDAC() + { + cmdSelectRpib = Query.NewCommand("SELECT TOP 1 A.*, B.BPNME, B.BPBDY, B.BPIDN FROM RPIB A JOIN BPSNView B ON A.RPENO=B.BPENO WHERE A.RPREN=@RPREN ORDER BY A.RPITM DESC"); + cmdSelectRpib.Parameters.Add(Query.NewParameter("RPREN", DbType.String)); + + cmdSelectRpir = Query.NewCommand("SELECT A.*, 0 RPITM, A.RPSDT RPBDT, B.BPNME, B.BPBDY, B.BPIDN FROM RPIR A JOIN BPSNView B ON A.RPENO=B.BPENO WHERE A.RPREN=@RPREN"); + cmdSelectRpir.Parameters.Add(Query.NewParameter("RPREN", DbType.String)); + + cmdSelectRpibOne = Query.NewCommand("SELECT A.*, B.BPNME, B.BPBDY, B.BPIDN FROM RPIB A JOIN BPSNView B ON A.RPENO=B.BPENO WHERE A.RPREN=@RPREN AND A.RPITM=@RPITM"); + cmdSelectRpibOne.Parameters.Add(Query.NewParameter("RPREN", DbType.String)); + cmdSelectRpibOne.Parameters.Add(Query.NewParameter("RPITM", DbType.Int32)); + + cmdSelectRpirOne = Query.NewCommand("SELECT A.*, 0 RPITM, A.RPSDT RPBDT, B.BPNME, B.BPBDY, B.BPIDN FROM RPIR A JOIN BPSNView B ON A.RPENO=B.BPENO WHERE A.RPREN=@RPREN"); + cmdSelectRpirOne.Parameters.Add(Query.NewParameter("RPREN", DbType.String)); + + cmdSelectRpib1 = Query.NewCommand(); + + sqlSelectRpib1 = + @"SELECT RPREN, 0 AS RPITM, RPSDT RPBDT, + RPENO, RPSDT, RPEDT, RPSLY, RPAMT, RPAM2, RPAM3, RPFMY, RPFM1, RPFM2, RPFM3, RPSLA, + RPDIS, RPDIH, RPOLD, RPNAT, RPPTP, RPLIS, RPHIS, RPDOC, RPCPY, RPOVR, RPFMD, RPXDT, RPOPT, RPIR.APPNO, + RPIR.TRUSR, + BPSNView.BPNME, BPSNView.BPBDY, BPSNView.BPIDN + FROM RPIR + JOIN BPSNView ON RPIR.RPENO = BPSNView.BPENO + WHERE RPREN = @RPREN + UNION + SELECT RPREN, RPITM, RPBDT, + RPENO, RPSDT, RPEDT, RPSLY, RPAMT, RPAM2, RPAM3, RPFMY, RPFM1, RPFM2, RPFM3, RPSLA, + RPDIS, RPDIH, RPOLD, RPNAT, RPPTP, RPLIS, RPHIS, RPDOC, RPCPY, RPOVR, RPFMD, RPXDT, RPOPT, RPIB.APPNO, + RPIB.TRUSR, + BPSNView.BPNME, BPSNView.BPBDY, BPSNView.BPIDN + FROM RPIB + JOIN BPSNView ON RPIB.RPENO = BPSNView.BPENO + WHERE RPREN = @RPREN"; + + orderSelectRpib1 = "ORDER BY RPBDT DESC, RPITM DESC"; + + cmdSelectRpib1.Parameters.Add(Query.NewParameter("RPREN", DbType.String)); + + //cmdSelectRpib2 = Query.NewCommand( + // @"SELECT RPREN, RPITM, RPBDT, RPENO, RPSDT, RPEDT, RPSLY, RPAMT, RPFMY, RPFM1, RPFM2, RPFM3, RPSLA, + // RPDIS, RPDIH, RPOLD, RPNAT, RPPTP, RPLIS, RPHIS, RPDOC, RPCPY, RPOVR, RPFMD, RPXDT, RPOPT, RPIB.APPNO, + // RPIB.TRUSR, + // BPSNView.BPNME, BPSNView.BPBDY, BPSNView.BPIDN + // FROM RPIB + // JOIN BPSNView ON RPIB.RPENO=BPSNView.BPENO + // WHERE RPREN=@RPREN + // ORDER BY RPBDT"); + + //cmdSelectRpib2.Parameters.Add(Query.NewParameter("RPREN", DbType.String)); + //cmdSelectRpib2.Parameters.Add(Query.NewParameter("RPXDT1", DbType.Date)); + //cmdSelectRpib2.Parameters.Add(Query.NewParameter("RPXDT2", DbType.Date)); + } + + public RpirDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public RpirDAC(WQuery query) : this() + { + this._query = query; + } + + private DataTable NewResult() + { + var result = new DataTable(); + result.Columns.Add("RPREN", typeof(String)); + result.Columns.Add("RPITM", typeof(Int32)); + result.Columns.Add("RPBDT", typeof(DateTime)); + result.Columns.Add("RPENO", typeof(String)); + result.Columns.Add("BPNME", typeof(String)); + result.Columns.Add("BPBDY", typeof(DateTime)); + result.Columns.Add("BPIDN", typeof(String)); + result.Columns.Add("RPSDT", typeof(DateTime)); + result.Columns.Add("RPEDT", typeof(DateTime)); + result.Columns.Add("RPSLY", typeof(Int32)); + result.Columns.Add("RPAMT", typeof(Int32)); + result.Columns.Add("RPAM2", typeof(Int32)); + result.Columns.Add("RPAM3", typeof(Int32)); + result.Columns.Add("RPFMY", typeof(Int32)); + result.Columns.Add("RPFM1", typeof(Int32)); + result.Columns.Add("RPFM2", typeof(Int32)); + result.Columns.Add("RPFM3", typeof(Int32)); + result.Columns.Add("RPSLA", typeof(Int32)); + result.Columns.Add("RPDIS", typeof(String)); + result.Columns.Add("RPDIH", typeof(String)); + result.Columns.Add("RPOLD", typeof(String)); + result.Columns.Add("RPNAT", typeof(String)); + result.Columns.Add("RPPTP", typeof(String)); + result.Columns.Add("RPLIS", typeof(String)); + result.Columns.Add("RPHIS", typeof(String)); + result.Columns.Add("RPDOC", typeof(String)); + result.Columns.Add("RPCPY", typeof(String)); + result.Columns.Add("RPOVR", typeof(String)); + result.Columns.Add("RPFMD", typeof(String)); + result.Columns.Add("RPFMD_PREV", typeof(String)); + result.Columns.Add("RPXDT", typeof(DateTime)); + result.Columns.Add("RPOPT", typeof(String)); + result.Columns.Add("APPNO", typeof(Int32)); + result.Columns.Add("TRUSR", typeof(String)); + result.Columns.Add("RPSDT_Changed", typeof(Char)); + result.Columns.Add("RPEDT_Changed", typeof(Char)); + result.Columns.Add("RPSLY_Changed", typeof(Char)); + result.Columns.Add("RPAMT_Changed", typeof(Char)); + result.Columns.Add("RPAM2_Changed", typeof(Char)); + result.Columns.Add("RPAM3_Changed", typeof(Char)); + result.Columns.Add("RPFMY_Changed", typeof(Char)); + result.Columns.Add("RPFM1_Changed", typeof(Char)); + result.Columns.Add("RPFM2_Changed", typeof(Char)); + result.Columns.Add("RPFM3_Changed", typeof(Char)); + result.Columns.Add("RPSLA_Changed", typeof(Char)); + result.Columns.Add("RPDIS_Changed", typeof(Char)); + result.Columns.Add("RPDIH_Changed", typeof(Char)); + result.Columns.Add("RPOLD_Changed", typeof(Char)); + result.Columns.Add("RPNAT_Changed", typeof(Char)); + result.Columns.Add("RPPTP_Changed", typeof(Char)); + result.Columns.Add("RPLIS_Changed", typeof(Char)); + result.Columns.Add("RPHIS_Changed", typeof(Char)); + result.Columns.Add("RPCPY_Changed", typeof(Char)); + result.Columns.Add("RPOVR_Changed", typeof(Char)); + result.Columns.Add("RPFMD_Changed", typeof(Char)); + result.Columns.Add("RPXDT_Changed", typeof(Char)); + result.Columns.Add("RPOPT_Changed", typeof(Char)); + result.Columns.Add("異動類別", typeof(String)); + result.Columns.Add("RPFMY_ChangeCount", typeof(Int32)); + result.Columns.Add("RPFM1_ChangeCount", typeof(Int32)); + result.Columns.Add("RPFM2_ChangeCount", typeof(Int32)); + result.Columns.Add("RPFM3_ChangeCount", typeof(Int32)); + + return result; + } + + /// + /// 填入資料紀錄 + /// + /// + private void FillResult(DataTable result, DataRow source) + { + result.Rows.Add(NewRow(result, source)); + } + + public DataRow NewRow(DataTable result, DataRow source) + { + DataRow newRow = result.NewRow(); + newRow["RPREN"] = source["RPREN"]; + newRow["RPITM"] = source["RPITM"]; + newRow["RPBDT"] = source["RPBDT"]; + newRow["RPENO"] = source["RPENO"]; + newRow["BPNME"] = source["BPNME"]; + newRow["BPBDY"] = source["BPBDY"]; + newRow["BPIDN"] = source["BPIDN"]; + newRow["RPSDT"] = source["RPSDT"]; + newRow["RPEDT"] = source["RPEDT"]; + newRow["RPSLY"] = source["RPSLY"]; + newRow["RPAMT"] = source["RPAMT"]; + newRow["RPAM2"] = source["RPAM2"]; + newRow["RPAM3"] = source["RPAM3"]; + newRow["RPFMY"] = source["RPFMY"]; + newRow["RPFM1"] = source["RPFM1"]; + newRow["RPFM2"] = source["RPFM2"]; + newRow["RPFM3"] = source["RPFM3"]; + newRow["RPSLA"] = source["RPSLA"]; + newRow["RPDIS"] = source["RPDIS"]; + newRow["RPDIH"] = source["RPDIH"]; + newRow["RPOLD"] = source["RPOLD"]; + newRow["RPNAT"] = source["RPNAT"]; + newRow["RPPTP"] = source["RPPTP"]; + newRow["RPLIS"] = source["RPLIS"]; + newRow["RPHIS"] = source["RPHIS"]; + newRow["RPDOC"] = source["RPDOC"]; + newRow["RPCPY"] = source["RPCPY"]; + newRow["RPOVR"] = source["RPOVR"]; + newRow["RPFMD"] = source["RPFMD"]; + newRow["RPFMD_PREV"] = DBNull.Value; + newRow["RPXDT"] = source["RPXDT"]; + newRow["RPOPT"] = source["RPOPT"]; + newRow["APPNO"] = source["APPNO"]; + newRow["TRUSR"] = source["TRUSR"]; + newRow["RPSDT_Changed"] = 'N'; + newRow["RPEDT_Changed"] = 'N'; + newRow["RPSLY_Changed"] = 'N'; + newRow["RPAMT_Changed"] = 'N'; + newRow["RPAM2_Changed"] = 'N'; + newRow["RPAM3_Changed"] = 'N'; + newRow["RPFMY_Changed"] = 'N'; + newRow["RPFM1_Changed"] = 'N'; + newRow["RPFM2_Changed"] = 'N'; + newRow["RPFM3_Changed"] = 'N'; + newRow["RPSLA_Changed"] = 'N'; + newRow["RPDIS_Changed"] = 'N'; + newRow["RPDIH_Changed"] = 'N'; + newRow["RPOLD_Changed"] = 'N'; + newRow["RPNAT_Changed"] = 'N'; + newRow["RPPTP_Changed"] = 'N'; + newRow["RPLIS_Changed"] = 'N'; + newRow["RPHIS_Changed"] = 'N'; + newRow["RPCPY_Changed"] = 'N'; + newRow["RPOVR_Changed"] = 'N'; + newRow["RPFMD_Changed"] = 'N'; + newRow["RPXDT_Changed"] = 'N'; + newRow["RPOPT_Changed"] = 'N'; + newRow["RPFMY_ChangeCount"] = 0; + newRow["RPFM1_ChangeCount"] = 0; + newRow["RPFM2_ChangeCount"] = 0; + newRow["RPFM3_ChangeCount"] = 0; + + return newRow; + } + + /// + /// 比較不同點 + /// + /// 物件一 + /// 物件二 + private Char FieldDiff(object obj1, object obj2) + { + string s1 = obj1 != DBNull.Value ? obj1.ToString() : ""; + string s2 = obj2 != DBNull.Value ? obj2.ToString() : ""; + if (s1.CompareTo(s2) != 0) + return 'Y'; + else + return 'N'; + } + + /// + /// 填入資料紀錄,以及不同點 + /// + /// 目前紀錄 + /// 前一筆紀錄 + private void FillResult(DataTable result, DataRow current, DataRow prev) + { + DataRow newRow = result.NewRow(); + string 異動類別 = "其他"; + newRow["RPREN"] = current["RPREN"]; + newRow["RPITM"] = current["RPITM"]; + newRow["RPBDT"] = current["RPBDT"]; + newRow["RPENO"] = current["RPENO"]; + newRow["BPNME"] = current["BPNME"]; + newRow["BPBDY"] = current["BPBDY"]; + newRow["BPIDN"] = current["BPIDN"]; + newRow["RPSDT"] = current["RPSDT"]; + newRow["RPEDT"] = current["RPEDT"]; + newRow["RPSLY"] = current["RPSLY"]; + newRow["RPAMT"] = current["RPAMT"]; + newRow["RPAM2"] = current["RPAM2"]; + newRow["RPAM3"] = current["RPAM3"]; + newRow["RPFMY"] = current["RPFMY"]; + newRow["RPFM1"] = current["RPFM1"]; + newRow["RPFM2"] = current["RPFM2"]; + newRow["RPFM3"] = current["RPFM3"]; + newRow["RPSLA"] = current["RPSLA"]; + newRow["RPDIS"] = current["RPDIS"]; + newRow["RPDIH"] = current["RPDIH"]; + newRow["RPOLD"] = current["RPOLD"]; + newRow["RPNAT"] = current["RPNAT"]; + newRow["RPPTP"] = current["RPPTP"]; + newRow["RPLIS"] = current["RPLIS"]; + newRow["RPHIS"] = current["RPHIS"]; + newRow["RPDOC"] = current["RPDOC"]; + newRow["RPCPY"] = current["RPCPY"]; + newRow["RPOVR"] = current["RPOVR"]; + newRow["RPFMD"] = current["RPFMD"]; + newRow["RPFMD_PREV"] = prev["RPFMD"]; + newRow["RPXDT"] = current["RPXDT"]; + newRow["RPOPT"] = current["RPOPT"]; + newRow["APPNO"] = current["APPNO"]; + newRow["TRUSR"] = current["TRUSR"]; + newRow["RPSDT_Changed"] = FieldDiff(current["RPSDT"], prev["RPSDT"]); + newRow["RPEDT_Changed"] = FieldDiff(current["RPEDT"], prev["RPEDT"]); + newRow["RPSLY_Changed"] = FieldDiff(current["RPSLY"], prev["RPSLY"]); + newRow["RPAMT_Changed"] = FieldDiff(current["RPAMT"], prev["RPAMT"]); + newRow["RPAM2_Changed"] = FieldDiff(current["RPAM2"], prev["RPAM2"]); + newRow["RPAM3_Changed"] = FieldDiff(current["RPAM3"], prev["RPAM3"]); + newRow["RPFMY_Changed"] = FieldDiff(current["RPFMY"], prev["RPFMY"]); + newRow["RPFM1_Changed"] = FieldDiff(current["RPFM1"], prev["RPFM1"]); + newRow["RPFM2_Changed"] = FieldDiff(current["RPFM2"], prev["RPFM2"]); + newRow["RPFM3_Changed"] = FieldDiff(current["RPFM3"], prev["RPFM3"]); + newRow["RPSLA_Changed"] = FieldDiff(current["RPSLA"], prev["RPSLA"]); + newRow["RPDIS_Changed"] = FieldDiff(current["RPDIS"], prev["RPDIS"]); + newRow["RPDIH_Changed"] = FieldDiff(current["RPDIH"], prev["RPDIH"]); + newRow["RPOLD_Changed"] = FieldDiff(current["RPOLD"], prev["RPOLD"]); + newRow["RPNAT_Changed"] = FieldDiff(current["RPNAT"], prev["RPNAT"]); + newRow["RPPTP_Changed"] = FieldDiff(current["RPPTP"], prev["RPPTP"]); + newRow["RPLIS_Changed"] = FieldDiff(current["RPLIS"], prev["RPLIS"]); + newRow["RPHIS_Changed"] = FieldDiff(current["RPHIS"], prev["RPHIS"]); + newRow["RPCPY_Changed"] = FieldDiff(current["RPCPY"], prev["RPCPY"]); + newRow["RPOVR_Changed"] = FieldDiff(current["RPOVR"], prev["RPOVR"]); + newRow["RPFMD_Changed"] = FieldDiff(current["RPFMD"], prev["RPFMD"]); + newRow["RPXDT_Changed"] = FieldDiff(current["RPXDT"], prev["RPXDT"]); + newRow["RPOPT_Changed"] = FieldDiff(current["RPOPT"], prev["RPOPT"]); + newRow["RPFMY_ChangeCount"] = Convert.ToInt32(current["RPFMY"]) - Convert.ToInt32(prev["RPFMY"]); + newRow["RPFM1_ChangeCount"] = Convert.ToInt32(current["RPFM1"]) - Convert.ToInt32(prev["RPFM1"]); + newRow["RPFM2_ChangeCount"] = Convert.ToInt32(current["RPFM2"]) - Convert.ToInt32(prev["RPFM2"]); + newRow["RPFM3_ChangeCount"] = Convert.ToInt32(current["RPFM3"]) - Convert.ToInt32(prev["RPFM3"]); + + if (string.IsNullOrEmpty(newRow["RPOPT"].ToString())) + { + if (GetStringValue(newRow["RPSDT_Changed"]) == "Y") + 異動類別 = "加保"; + else if (GetStringValue(newRow["RPEDT_Changed"]) == "Y") + 異動類別 = "退保"; + else if (GetStringValue(newRow["RPSLY_Changed"]) == "Y" || + GetStringValue(newRow["RPAMT_Changed"]) == "Y") + 異動類別 = "薪資調整"; + //else if (GetStringValue(newRow["RPFMY_Changed"]) == "Y" || + // GetStringValue(newRow["RPFM1_Changed"]) == "Y" || + // GetStringValue(newRow["RPFM2_Changed"]) == "Y" || + // GetStringValue(newRow["RPFM3_Changed"]) == "Y") + // 異動類別 = "眷屬調整"; + else if (GetInt32Value(newRow["RPFMY_ChangeCount"]) > 0 || + GetInt32Value(newRow["RPFM1_ChangeCount"]) > 0 || + GetInt32Value(newRow["RPFM2_ChangeCount"]) > 0 || + GetInt32Value(newRow["RPFM3_ChangeCount"]) > 0) + 異動類別 = "眷屬加保"; + else if (GetInt32Value(newRow["RPFMY_ChangeCount"]) < 0 || + GetInt32Value(newRow["RPFM1_ChangeCount"]) < 0 || + GetInt32Value(newRow["RPFM2_ChangeCount"]) < 0 || + GetInt32Value(newRow["RPFM3_ChangeCount"]) < 0) + 異動類別 = "眷屬退保"; + else if (GetStringValue(newRow["RPOVR_Changed"]) == "Y") + 異動類別 = "其他"; + + newRow["RPOPT"] = 異動類別; + } + + result.Rows.Add(newRow); + } + + /// + /// 取得勞健保(異動)紀錄 + /// + /// 查詢條件:員工編號 + /// 查詢條件:員工姓名 + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable Select(string RPENO, string BPNME) + { + if (cmdSelectRpirRpren == null) + cmdSelectRpirRpren = Query.NewCommand(); + cmdSelectRpirRpren.Parameters.Clear(); + + // 清空輸出資料表 + var result = NewResult(); + + // 抓出所有的單號 + StringBuilder sb = new StringBuilder(); + sb.Append("SELECT A.RPREN FROM RPIR A INNER JOIN BPSNView B ON A.RPENO=B.BPENO WHERE 1=1 "); + if (RPENO != null && RPENO.Length > 0) + { + sb.Append(" AND A.RPENO LIKE @RPENO "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPENO", RPENO + "%")); + } + if (BPNME != null && BPNME.Length > 0) + { + sb.Append(" AND B.BPNME LIKE @BPNME "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("BPNME", BPNME + "%")); + } + cmdSelectRpirRpren.CommandText = sb.ToString(); + DataTable rpirTmp = Query.Select(cmdSelectRpirRpren); + + DataTable rpibTmp; + // 一筆一筆的抓出應該顯示的資料 + foreach (DataRow rpirRow in rpirTmp.Rows) + { + // 依照單號,抓出最後一筆異動 + cmdSelectRpib.Parameters[0].Value = rpirRow[0]; + rpibTmp = Query.Select(cmdSelectRpib); + + // 有異動資料,填入異動資料 + if (rpibTmp.Rows.Count != 0) + { + FillResult(result, rpibTmp.Rows[0]); + } + // 沒有異動資料,填入原始資料 + else + { + cmdSelectRpir.Parameters[0].Value = rpirRow[0]; + rpibTmp = Query.Select(cmdSelectRpir); + FillResult(result, rpibTmp.Rows[0]); + } + } + + return result; + } + + /// + /// 取得勞健保(異動)紀錄分頁查詢 + /// + /// 查詢條件:員工編號 + /// 查詢條件:員工姓名 + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage( + int startRowIndex, + int maximumRows, + string RPENO, + string BPNME, + DateTime RPXDT1, + DateTime RPXDT2, + string RPOPT, + DateTime RPBDT1, + DateTime RPBDT2, + string orderBy + ) + { + if (cmdSelectRpirRpren == null) + cmdSelectRpirRpren = Query.NewCommand(); + cmdSelectRpirRpren.Parameters.Clear(); + + // 清空輸出資料表 + var result = NewResult(); + + // 抓出所有的單號 + StringBuilder sbRPIR = new StringBuilder(); + StringBuilder sbRPIB = new StringBuilder(); + sbRPIR.Append("SELECT A.RPREN FROM RPIR A INNER JOIN BPSNView B ON A.RPENO=B.BPENO WHERE 1=1 "); + sbRPIB.Append("SELECT A.RPREN FROM RPIB A INNER JOIN BPSNView B ON A.RPENO=B.BPENO WHERE 1=1 "); + + if (!string.IsNullOrEmpty(RPENO)) + { + sbRPIR.Append(" AND A.RPENO LIKE @RPENO "); + sbRPIB.Append(" AND A.RPENO LIKE @RPENO "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPENO", RPENO + "%")); + } + + if (!string.IsNullOrEmpty(BPNME)) + { + sbRPIR.Append(" AND B.BPNME LIKE @BPNME "); + sbRPIB.Append(" AND B.BPNME LIKE @BPNME "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("BPNME", BPNME + "%")); + } + + if (RPXDT1.Ticks > 0 && RPXDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPXDT >= @RPXDT1 AND A.RPXDT < @RPXDT2 "); + sbRPIB.Append(" AND A.RPXDT >= @RPXDT1 AND A.RPXDT < @RPXDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT1", RPXDT1)); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT2", RPXDT2.AddDays(1))); + } + else if (RPXDT1.Ticks > 0 && RPXDT2.Ticks == 0) + { + sbRPIR.Append(" AND A.RPXDT >= @RPXDT1 "); + sbRPIB.Append(" AND A.RPXDT >= @RPXDT1 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT1", RPXDT1)); + } + else if (RPXDT1.Ticks == 0 && RPXDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPXDT < @RPXDT2 "); + sbRPIB.Append(" AND A.RPXDT < @RPXDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT2", RPXDT2.AddDays(1))); + } + + if (!string.IsNullOrEmpty(RPOPT)) + { + var rpopts = RPOPT.Split(','); + var paramNames = new string[rpopts.Length]; + for (int i = 0; i < rpopts.Length; i++) + { + paramNames[i] = string.Format("@RPOPT{0}", i + 1); + } + sbRPIR.Append(string.Format(" AND A.RPOPT IN ({0}) ", string.Join(", ", paramNames))); + sbRPIB.Append(string.Format(" AND A.RPOPT IN ({0}) ", string.Join(", ", paramNames))); + for (int i = 0; i < rpopts.Length; i++) + { + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter(string.Format("RPOPT{0}", i + 1), rpopts[i])); + } + } + + if (RPBDT1.Ticks > 0 && RPBDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPSDT >= @RPBDT1 AND A.RPSDT < @RPBDT2 "); + sbRPIB.Append(" AND A.RPBDT >= @RPBDT1 AND A.RPBDT < @RPBDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT1", RPBDT1)); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT2", RPBDT2.AddDays(1))); + } + else if (RPBDT1.Ticks > 0 && RPBDT2.Ticks == 0) + { + sbRPIR.Append(" AND A.RPSDT >= @RPBDT1 "); + sbRPIB.Append(" AND A.RPBDT >= @RPBDT1 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT1", RPBDT1)); + } + else if (RPBDT1.Ticks == 0 && RPBDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPSDT < @RPBDT2 "); + sbRPIB.Append(" AND A.RPBDT < @RPBDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT2", RPBDT2.AddDays(1))); + } + + + if (string.IsNullOrEmpty(orderBy)) + orderBy = "A.RPREN ASC"; + + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("STARTROWINDEX", startRowIndex)); + cmdSelectRpirRpren.CommandText = String.Format( + @"SELECT TOP {0} * FROM + (SELECT A.RPREN + , ROW_NUMBER() OVER (ORDER BY {3}) AS ROWID + FROM ({1} UNION {2}) A + ) AS TMP1 WHERE ROWID > @STARTROWINDEX" + , maximumRows, sbRPIR.ToString(), sbRPIB.ToString(), orderBy + ); + DataTable rpirTmp = Query.Select(cmdSelectRpirRpren); + + DataTable rpibTmp; + // 一筆一筆的抓出應該顯示的資料 + foreach (DataRow rpirRow in rpirTmp.Rows) + { + // 依照單號,抓出最後一筆異動 + cmdSelectRpib.Parameters[0].Value = rpirRow["RPREN"]; + rpibTmp = Query.Select(cmdSelectRpib); + + // 有異動資料,填入異動資料 + if (rpibTmp.Rows.Count != 0) + { + FillResult(result, rpibTmp.Rows[0]); + } + // 沒有異動資料,填入原始資料 + else + { + cmdSelectRpir.Parameters[0].Value = rpirRow["RPREN"]; + rpibTmp = Query.Select(cmdSelectRpir); + FillResult(result, rpibTmp.Rows[0]); + } + } + + return result; + } + + /// + /// 取得勞健保(異動)紀錄數量 + /// + /// 查詢條件:員工編號 + /// 查詢條件:員工姓名 + [DataObjectMethod(DataObjectMethodType.Select)] + public int SelectCount(string RPENO, string BPNME, DateTime RPXDT1, DateTime RPXDT2, string RPOPT, DateTime RPBDT1, DateTime RPBDT2, string orderBy) + { + if (cmdSelectRpirRpren == null) + cmdSelectRpirRpren = Query.NewCommand(); + cmdSelectRpirRpren.Parameters.Clear(); + + StringBuilder sbRPIR = new StringBuilder(); + StringBuilder sbRPIB = new StringBuilder(); + sbRPIR.Append("SELECT A.RPREN FROM RPIR A INNER JOIN BPSNView B ON A.RPENO=B.BPENO WHERE 1=1 "); + sbRPIB.Append("SELECT A.RPREN FROM RPIB A INNER JOIN BPSNView B ON A.RPENO=B.BPENO WHERE 1=1 "); + + if (!string.IsNullOrEmpty(RPENO)) + { + sbRPIR.Append(" AND A.RPENO LIKE @RPENO "); + sbRPIB.Append(" AND A.RPENO LIKE @RPENO "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPENO", RPENO + "%")); + } + + if (!string.IsNullOrEmpty(BPNME)) + { + sbRPIR.Append(" AND B.BPNME LIKE @BPNME "); + sbRPIB.Append(" AND B.BPNME LIKE @BPNME "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("BPNME", BPNME + "%")); + } + + if (RPXDT1.Ticks > 0 && RPXDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPXDT >= @RPXDT1 AND A.RPXDT < @RPXDT2 "); + sbRPIB.Append(" AND A.RPXDT >= @RPXDT1 AND A.RPXDT < @RPXDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT1", RPXDT1)); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT2", RPXDT2.AddDays(1))); + } + else if (RPXDT1.Ticks > 0 && RPXDT2.Ticks == 0) + { + sbRPIR.Append(" AND A.RPXDT >= @RPXDT1 "); + sbRPIB.Append(" AND A.RPXDT >= @RPXDT1 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT1", RPXDT1)); + } + else if (RPXDT1.Ticks == 0 && RPXDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPXDT < @RPXDT2 "); + sbRPIB.Append(" AND A.RPXDT < @RPXDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT2", RPXDT2.AddDays(1))); + } + + if (!string.IsNullOrEmpty(RPOPT)) + { + var rpopts = RPOPT.Split(','); + var paramNames = new string[rpopts.Length]; + for (int i = 0; i < rpopts.Length; i++) + { + paramNames[i] = string.Format("@RPOPT{0}", i + 1); + } + sbRPIR.Append(string.Format(" AND A.RPOPT IN ({0}) ", string.Join(", ", paramNames))); + sbRPIB.Append(string.Format(" AND A.RPOPT IN ({0}) ", string.Join(", ", paramNames))); + for (int i = 0; i < rpopts.Length; i++) + { + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter(string.Format("RPOPT{0}", i + 1), rpopts[i])); + } + } + + if (RPBDT1.Ticks > 0 && RPBDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPSDT >= @RPBDT1 AND A.RPSDT < @RPBDT2 "); + sbRPIB.Append(" AND A.RPBDT >= @RPBDT1 AND A.RPBDT < @RPBDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT1", RPBDT1)); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT2", RPBDT2.AddDays(1))); + } + else if (RPBDT1.Ticks > 0 && RPBDT2.Ticks == 0) + { + sbRPIR.Append(" AND A.RPSDT >= @RPBDT1 "); + sbRPIB.Append(" AND A.RPBDT >= @RPBDT1 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT1", RPBDT1)); + } + else if (RPBDT1.Ticks == 0 && RPBDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPSDT < @RPBDT2 "); + sbRPIB.Append(" AND A.RPBDT < @RPBDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT2", RPBDT2.AddDays(1))); + } + + cmdSelectRpirRpren.CommandText = String.Format( + @"SELECT COUNT(*) FROM ({0} UNION {1}) A" + , sbRPIR.ToString(), sbRPIB.ToString() + ); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmdSelectRpirRpren)); + } + + /// + /// 取得勞健保(異動)紀錄單號在第幾筆 + /// + /// 查詢條件:員工編號 + /// 查詢條件:員工姓名 + public int SelectRPRENIndex( + string RPREN, + string RPENO, + string BPNME, + DateTime RPXDT1, + DateTime RPXDT2, + string RPOPT, + DateTime RPBDT1, + DateTime RPBDT2 + ) + { + if (cmdSelectRpirRpren == null) + cmdSelectRpirRpren = Query.NewCommand(); + cmdSelectRpirRpren.Parameters.Clear(); + + // 抓出所有的單號 + StringBuilder sbRPIR = new StringBuilder(); + StringBuilder sbRPIB = new StringBuilder(); + sbRPIR.Append("SELECT A.RPREN FROM RPIR A INNER JOIN BPSNView B ON A.RPENO=B.BPENO WHERE 1=1 "); + sbRPIB.Append("SELECT A.RPREN FROM RPIB A INNER JOIN BPSNView B ON A.RPENO=B.BPENO WHERE 1=1 "); + + if (!string.IsNullOrEmpty(RPENO)) + { + sbRPIR.Append(" AND A.RPENO LIKE @RPENO "); + sbRPIB.Append(" AND A.RPENO LIKE @RPENO "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPENO", RPENO + "%")); + } + + if (!string.IsNullOrEmpty(BPNME)) + { + sbRPIR.Append(" AND B.BPNME LIKE @BPNME "); + sbRPIB.Append(" AND B.BPNME LIKE @BPNME "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("BPNME", BPNME + "%")); + } + + if (RPXDT1.Ticks > 0 && RPXDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPXDT >= @RPXDT1 AND A.RPXDT < @RPXDT2 "); + sbRPIB.Append(" AND A.RPXDT >= @RPXDT1 AND A.RPXDT < @RPXDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT1", RPXDT1)); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT2", RPXDT2.AddDays(1))); + } + else if (RPXDT1.Ticks > 0 && RPXDT2.Ticks == 0) + { + sbRPIR.Append(" AND A.RPXDT >= @RPXDT1 "); + sbRPIB.Append(" AND A.RPXDT >= @RPXDT1 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT1", RPXDT1)); + } + else if (RPXDT1.Ticks == 0 && RPXDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPXDT < @RPXDT2 "); + sbRPIB.Append(" AND A.RPXDT < @RPXDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPXDT2", RPXDT2.AddDays(1))); + } + + if (!string.IsNullOrEmpty(RPOPT)) + { + var rpopts = RPOPT.Split(','); + var paramNames = new string[rpopts.Length]; + for (int i = 0; i < rpopts.Length; i++) + { + paramNames[i] = string.Format("@RPOPT{0}", i + 1); + } + sbRPIR.Append(string.Format(" AND A.RPOPT IN ({0}) ", string.Join(", ", paramNames))); + sbRPIB.Append(string.Format(" AND A.RPOPT IN ({0}) ", string.Join(", ", paramNames))); + for (int i = 0; i < rpopts.Length; i++) + { + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter(string.Format("RPOPT{0}", i + 1), rpopts[i])); + } + } + + if (RPBDT1.Ticks > 0 && RPBDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPSDT >= @RPBDT1 AND A.RPSDT < @RPBDT2 "); + sbRPIB.Append(" AND A.RPBDT >= @RPBDT1 AND A.RPBDT < @RPBDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT1", RPBDT1)); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT2", RPBDT2.AddDays(1))); + } + else if (RPBDT1.Ticks > 0 && RPBDT2.Ticks == 0) + { + sbRPIR.Append(" AND A.RPSDT >= @RPBDT1 "); + sbRPIB.Append(" AND A.RPBDT >= @RPBDT1 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT1", RPBDT1)); + } + else if (RPBDT1.Ticks == 0 && RPBDT2.Ticks > 0) + { + sbRPIR.Append(" AND A.RPSDT < @RPBDT2 "); + sbRPIB.Append(" AND A.RPBDT < @RPBDT2 "); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPBDT2", RPBDT2.AddDays(1))); + } + + + cmdSelectRpirRpren.CommandText = String.Format( + @"SELECT ROWID - 1 FROM + (SELECT A.RPREN + , ROW_NUMBER() OVER (ORDER BY A.RPREN ASC) AS ROWID + FROM ({0} UNION {1}) A + ) AS TMP1 WHERE RPREN = @RPREN" + , sbRPIR.ToString(), sbRPIB.ToString() + ); + cmdSelectRpirRpren.Parameters.Add(Query.NewParameter("RPREN", RPREN)); + + var o = Query.ExecuteScalar(cmdSelectRpirRpren); + if (o is int || o is Int64) + return WDAC.GetInt32Value(o); + return -1; + } + + /// + /// 取得最近一筆勞健保(異動)紀錄 + /// + /// 單號 + /// 異動次數 + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectOne(string RPREN, int RPITM) + { + return SelectOne(RPREN, RPITM, null); + } + + /// + /// 取得最近一筆勞健保(異動)紀錄 + /// + /// 單號 + /// 異動次數 + public DataTable SelectOne(string RPREN, int RPITM, DbTransaction tran) + { + var result = NewResult(); + + if (RPREN != null && RPREN.Length > 0) + { + if (RPITM == 0) + { + cmdSelectRpirOne.Parameters[0].Value = RPREN; + DataTable tmp; + if (tran == null) + tmp = Query.Select(cmdSelectRpirOne); + else + tmp = Query.Select(cmdSelectRpirOne, tran); + if (tmp.Rows.Count > 0) + FillResult(result,tmp.Rows[0]); + } + else + { + cmdSelectRpibOne.Parameters[0].Value = RPREN; + cmdSelectRpibOne.Parameters[1].Value = RPITM; + DataTable tmp; + if (tran == null) + tmp = Query.Select(cmdSelectRpibOne); + else + tmp = Query.Select(cmdSelectRpibOne, tran); + if (tmp.Rows.Count > 0) + FillResult(result,tmp.Rows[0]); + } + } + return result; + } + + /// + /// 取出異動紀錄 + /// + /// + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectRPIB(string RPREN) + { + return SelectRPIB(RPREN, null, null, false); + } + + /// + /// 取出異動紀錄 + /// + /// + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectRPIB(string RPREN, DbTransaction tran, string orderBy, bool assending) + { + var result = NewResult(); + + if (RPREN != null && RPREN.Length > 0) + { + if (string.IsNullOrEmpty(orderBy)) + { + cmdSelectRpib1.CommandText = string.Format("{0} {1}", sqlSelectRpib1, orderSelectRpib1); + } + else + { + cmdSelectRpib1.CommandText = string.Format("{0} order by {1}", sqlSelectRpib1, orderBy); + } + cmdSelectRpib1.Parameters[0].Value = RPREN; + DataTable tmp; + if (tran != null) + tmp = Query.Select(cmdSelectRpib1, tran); + else + tmp = Query.Select(cmdSelectRpib1); + + if (assending) + { + for (int i = 0; i < tmp.Rows.Count; i++) + { + if (i != 0) + FillResult(result, tmp.Rows[i], tmp.Rows[i - 1]); + else + FillResult(result, tmp.Rows[i]); + } + } + else + { + for (int i = 0; i < tmp.Rows.Count; i++) + { + if (i < tmp.Rows.Count - 1) + FillResult(result, tmp.Rows[i], tmp.Rows[i + 1]); + else + FillResult(result, tmp.Rows[i]); + } + } + } + return result; + } + + /// + /// 取出起始日期至結束日期之間,勞健保異動紀錄 + /// + /// + /// + /// + /// + /// + //public DataTable SelectRPIBMonth(string RPREN, DateTime startDay, DateTime endDay, DbTransaction tran) + //{ + // var result = NewResult(); + + // if (RPREN != null && RPREN.Length > 0) + // { + // cmdSelectRpib2.Parameters[0].Value = RPREN; + // cmdSelectRpib2.Parameters[1].Value = startDay; + // cmdSelectRpib2.Parameters[2].Value = endDay; + // DataTable tmp = Query.Select(cmdSelectRpib2, tran); + // for (int i = 0; i < tmp.Rows.Count; i++) + // { + // if (i != 0) + // FillResult(result, tmp.Rows[i], tmp.Rows[i - 1]); + // else + // FillResult(result, tmp.Rows[i]); + // } + // } + // return result; + //} + + /// + /// 取出單筆異動紀錄 + /// + /// + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectRPIBOne(string RPREN, int RPITM) + { + var result = NewResult(); + + if (RPREN != null && RPREN.Length > 0) + { + cmdSelectRpib1.CommandText = string.Format("{0} {1}", sqlSelectRpib1, orderSelectRpib1); + cmdSelectRpib1.Parameters[0].Value = RPREN; + DataTable tmp = Query.Select(cmdSelectRpib1); + for (int i = 0; i < tmp.Rows.Count; i++) + { + if (Convert.ToInt32(tmp.Rows[i]["RPITM"]) == RPITM) + { + //if (i != 0) + // FillResult(result, tmp.Rows[i], tmp.Rows[i - 1]); + //else + // FillResult(result, tmp.Rows[i]); + if (i < tmp.Rows.Count - 1) + FillResult(result, tmp.Rows[i], tmp.Rows[i + 1]); + else + FillResult(result, tmp.Rows[i]); + } + } + } + return result; + } + + /// + /// 取得下一個異動次數 + /// + /// 單號 + private int NextRPITM(string RPREN) + { + DbCommand cmd = Query.NewCommand("SELECT ISNULL(MAX(RPITM), 0) + 1 FROM RPIB WHERE RPREN=@RPREN"); + cmd.Parameters.Add(Query.NewParameter("RPREN", RPREN)); + int Result; + ExecuteScalar(cmd, out Result); + return Result; + } + + /// + /// 加入一筆紀錄,自動判斷該加入的是加退保紀錄還是異動紀錄 + /// + [DataObjectMethod(DataObjectMethodType.Insert)] + public int Insert(string RPREN, int RPITM, DateTime RPBDT, string RPENO, DateTime RPSDT, DateTime RPEDT, + int RPSLY, int RPAMT, int RPAM2, int RPAM3, int RPFMY, int RPFM1, int RPFM2, int RPFM3, int RPSLA, string RPDIS, string RPDIH, + string RPOLD, string RPNAT, string RPPTP, string RPLIS, string RPHIS, string RPDOC, string RPCPY, string RPOVR, + string RPFMD, DateTime RPXDT, string RPOPT, + string TRUSR) + { + DbCommand cmdInsert = Query.NewCommand(); + + if (RPITM == 0) + { + cmdInsert.CommandText = + @"INSERT INTO RPIR + (RPREN, RPENO, RPSDT, RPEDT, RPSLY, RPAMT, RPAM2, RPAM3, RPFMY, RPFM1, RPFM2, RPFM3, RPSLA, + RPDIS, RPDIH, RPOLD, RPNAT, RPPTP, RPLIS, RPHIS, RPDOC, RPCPY, RPOVR, RPFMD, + RPXDT, RPOPT, + APPNO, TRDAT, TRMOD, TRUSR) + VALUES + (@RPREN, @RPENO, @RPSDT, @RPEDT, @RPSLY, @RPAMT, @RPAM2, @RPAM3, @RPFMY, @RPFM1, @RPFM2, @RPFM3, @RPSLA, + @RPDIS, @RPDIH, @RPOLD, @RPNAT, @RPPTP, @RPLIS, @RPHIS, @RPDOC, @RPCPY, @RPOVR, @RPFMD, + @RPXDT, @RPOPT, + 1, GETDATE(), 'INSERT', @TRUSR)"; + AddParam(cmdInsert, "RPREN", RPREN); + AddParam(cmdInsert, "RPENO", RPENO); + AddParam(cmdInsert, "RPSDT", RPSDT); + AddParam(cmdInsert, "RPEDT", RPEDT); + AddParam(cmdInsert, "RPSLY", RPSLY); + AddParam(cmdInsert, "RPAMT", RPAMT); + AddParam(cmdInsert, "RPAM2", RPAM2); + AddParam(cmdInsert, "RPAM3", RPAM3); + AddParam(cmdInsert, "RPFMY", RPFMY); + AddParam(cmdInsert, "RPFM1", RPFM1); + AddParam(cmdInsert, "RPFM2", RPFM2); + AddParam(cmdInsert, "RPFM3", RPFM3); + AddParam(cmdInsert, "RPSLA", RPSLA); + AddParam(cmdInsert, "RPDIS", RPDIS); + AddParam(cmdInsert, "RPDIH", RPDIH); + AddParam(cmdInsert, "RPOLD", RPOLD); + AddParam(cmdInsert, "RPNAT", RPNAT); + AddParam(cmdInsert, "RPPTP", RPPTP); + AddParam(cmdInsert, "RPLIS", RPLIS); + AddParam(cmdInsert, "RPHIS", RPHIS); + AddParam(cmdInsert, "RPDOC", RPDOC); + AddParam(cmdInsert, "RPCPY", RPCPY); + AddParam(cmdInsert, "RPOVR", RPOVR); + AddParam(cmdInsert, "RPFMD", RPFMD); + AddParam(cmdInsert, "RPXDT", RPXDT); + AddParam(cmdInsert, "RPOPT", RPOPT); + AddParam(cmdInsert, "TRUSR", TRUSR); + } + else + { + cmdInsert.CommandText = + @"INSERT INTO RPIB + (RPREN, RPITM, RPBDT, RPENO, RPSDT, RPEDT, RPSLY, RPAMT, RPAM2, RPAM3, RPFMY, RPFM1, RPFM2, RPFM3, RPSLA, + RPDIS, RPDIH, RPOLD, RPNAT, RPPTP, RPLIS, RPHIS, RPDOC, RPCPY, RPOVR, RPFMD, RPXDT, RPOPT, + APPNO, TRDAT, TRMOD, TRUSR) + VALUES + (@RPREN, @RPITM, @RPBDT, @RPENO, @RPSDT, @RPEDT, @RPSLY, @RPAMT, @RPAM2, @RPAM3, @RPFMY, @RPFM1, @RPFM2, @RPFM3, @RPSLA, + @RPDIS, @RPDIH, @RPOLD, @RPNAT, @RPPTP, @RPLIS, @RPHIS, @RPDOC, @RPCPY, @RPOVR, @RPFMD, @RPXDT, @RPOPT, + 1, GETDATE(), 'INSERT', @TRUSR)"; + AddParam(cmdInsert, "RPREN", RPREN); + AddParam(cmdInsert, "RPITM", NextRPITM(RPREN)); + AddParam(cmdInsert, "RPBDT", RPBDT); + AddParam(cmdInsert, "RPENO", RPENO); + AddParam(cmdInsert, "RPSDT", RPSDT); + AddParam(cmdInsert, "RPEDT", RPEDT); + AddParam(cmdInsert, "RPSLY", RPSLY); + AddParam(cmdInsert, "RPAMT", RPAMT); + AddParam(cmdInsert, "RPAM2", RPAM2); + AddParam(cmdInsert, "RPAM3", RPAM3); + AddParam(cmdInsert, "RPFMY", RPFMY); + AddParam(cmdInsert, "RPFM1", RPFM1); + AddParam(cmdInsert, "RPFM2", RPFM2); + AddParam(cmdInsert, "RPFM3", RPFM3); + AddParam(cmdInsert, "RPSLA", RPSLA); + AddParam(cmdInsert, "RPDIS", RPDIS); + AddParam(cmdInsert, "RPDIH", RPDIH); + AddParam(cmdInsert, "RPOLD", RPOLD); + AddParam(cmdInsert, "RPNAT", RPNAT); + AddParam(cmdInsert, "RPPTP", RPPTP); + AddParam(cmdInsert, "RPLIS", RPLIS); + AddParam(cmdInsert, "RPHIS", RPHIS); + AddParam(cmdInsert, "RPDOC", RPDOC); + AddParam(cmdInsert, "RPCPY", RPCPY); + AddParam(cmdInsert, "RPOVR", RPOVR); + AddParam(cmdInsert, "RPFMD", RPFMD); + AddParam(cmdInsert, "RPXDT", RPXDT); + AddParam(cmdInsert, "RPOPT", RPOPT); + AddParam(cmdInsert, "TRUSR", TRUSR); + } + + return Query.ExecuteNonQuery(cmdInsert); + } + + /// + /// 更正 + /// + [DataObjectMethod(DataObjectMethodType.Update)] + public int Update(string RPREN, int RPITM, DateTime RPBDT, string RPENO, DateTime RPSDT, DateTime RPEDT, + int RPSLY, int RPAMT, int RPAM2, int RPAM3, int RPFMY, int RPFM1, int RPFM2, int RPFM3, int RPSLA, string RPDIS, string RPDIH, + string RPOLD, string RPNAT, string RPPTP, string RPLIS, string RPHIS, string RPDOC, string RPCPY, string RPOVR, + string RPFMD, DateTime RPXDT, string RPOPT, + string TRUSR, + string OLD_RPREN, int OLD_RPITM, int OLD_APPNO, int APPNO) + { + DbCommand cmdUpdate = Query.NewCommand(); + + if (OLD_RPITM == 0) + { + cmdUpdate.CommandText = + @"UPDATE RPIR SET + RPREN = @RPREN, + RPENO = @RPENO, + RPSDT = @RPSDT, + RPEDT = @RPEDT, + RPSLY = @RPSLY, + RPAMT = @RPAMT, + RPAM2 = @RPAM2, + RPAM3 = @RPAM3, + RPFMY = @RPFMY, + RPFM1 = @RPFM1, + RPFM2 = @RPFM2, + RPFM3 = @RPFM3, + RPSLA = @RPSLA, + RPDIS = @RPDIS, + RPDIH = @RPDIH, + RPOLD = @RPOLD, + RPNAT = @RPNAT, + RPPTP = @RPPTP, + RPLIS = @RPLIS, + RPHIS = @RPHIS, + RPDOC = @RPDOC, + RPCPY = @RPCPY, + RPOVR = @RPOVR, + RPFMD = @RPFMD, + RPXDT = @RPXDT, + RPOPT = @RPOPT, + APPNO = APPNO + 1, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @TRUSR + WHERE RPREN = @OLD_RPREN + AND APPNO = @OLD_APPNO"; + AddParam(cmdUpdate, "RPREN", RPREN); + AddParam(cmdUpdate, "RPENO", RPENO); + AddParam(cmdUpdate, "RPSDT", RPSDT); + AddParam(cmdUpdate, "RPEDT", RPEDT); + AddParam(cmdUpdate, "RPSLY", RPSLY); + AddParam(cmdUpdate, "RPAMT", RPAMT); + AddParam(cmdUpdate, "RPAM2", RPAM2); + AddParam(cmdUpdate, "RPAM3", RPAM3); + AddParam(cmdUpdate, "RPFMY", RPFMY); + AddParam(cmdUpdate, "RPFM1", RPFM1); + AddParam(cmdUpdate, "RPFM2", RPFM2); + AddParam(cmdUpdate, "RPFM3", RPFM3); + AddParam(cmdUpdate, "RPSLA", RPSLA); + AddParam(cmdUpdate, "RPDIS", RPDIS); + AddParam(cmdUpdate, "RPDIH", RPDIH); + AddParam(cmdUpdate, "RPOLD", RPOLD); + AddParam(cmdUpdate, "RPNAT", RPNAT); + AddParam(cmdUpdate, "RPPTP", RPPTP); + AddParam(cmdUpdate, "RPLIS", RPLIS); + AddParam(cmdUpdate, "RPHIS", RPHIS); + AddParam(cmdUpdate, "RPDOC", RPDOC); + AddParam(cmdUpdate, "RPCPY", RPCPY); + AddParam(cmdUpdate, "RPOVR", RPOVR); + AddParam(cmdUpdate, "RPFMD", RPFMD); + AddParam(cmdUpdate, "RPXDT", RPXDT); + AddParam(cmdUpdate, "RPOPT", RPOPT); + AddParam(cmdUpdate, "TRUSR", TRUSR); + AddParam(cmdUpdate, "OLD_RPREN", OLD_RPREN); + AddParam(cmdUpdate, "OLD_APPNO", OLD_APPNO); + } + else + { + cmdUpdate.CommandText = + @"UPDATE RPIB SET + RPREN = @RPREN, + RPITM = @RPITM, + RPBDT = @RPBDT, + RPENO = @RPENO, + RPSDT = @RPSDT, + RPEDT = @RPEDT, + RPSLY = @RPSLY, + RPAMT = @RPAMT, + RPAM2 = @RPAM2, + RPAM3 = @RPAM3, + RPFMY = @RPFMY, + RPFM1 = @RPFM1, + RPFM2 = @RPFM2, + RPFM3 = @RPFM3, + RPSLA = @RPSLA, + RPDIS = @RPDIS, + RPDIH = @RPDIH, + RPOLD = @RPOLD, + RPNAT = @RPNAT, + RPPTP = @RPPTP, + RPLIS = @RPLIS, + RPHIS = @RPHIS, + RPDOC = @RPDOC, + RPCPY = @RPCPY, + RPOVR = @RPOVR, + RPFMD = @RPFMD, + RPXDT = @RPXDT, + RPOPT = @RPOPT, + APPNO = APPNO + 1, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @TRUSR + WHERE RPREN = @OLD_RPREN + AND RPITM = @OLD_RPITM + AND APPNO = @OLD_APPNO"; + AddParam(cmdUpdate, "RPREN", RPREN); + AddParam(cmdUpdate, "RPITM", RPITM); + AddParam(cmdUpdate, "RPBDT", RPBDT); + AddParam(cmdUpdate, "RPENO", RPENO); + AddParam(cmdUpdate, "RPSDT", RPSDT); + AddParam(cmdUpdate, "RPEDT", RPEDT); + AddParam(cmdUpdate, "RPSLY", RPSLY); + AddParam(cmdUpdate, "RPAMT", RPAMT); + AddParam(cmdUpdate, "RPAM2", RPAM2); + AddParam(cmdUpdate, "RPAM3", RPAM3); + AddParam(cmdUpdate, "RPFMY", RPFMY); + AddParam(cmdUpdate, "RPFM1", RPFM1); + AddParam(cmdUpdate, "RPFM2", RPFM2); + AddParam(cmdUpdate, "RPFM3", RPFM3); + AddParam(cmdUpdate, "RPSLA", RPSLA); + AddParam(cmdUpdate, "RPDIS", RPDIS); + AddParam(cmdUpdate, "RPDIH", RPDIH); + AddParam(cmdUpdate, "RPOLD", RPOLD); + AddParam(cmdUpdate, "RPNAT", RPNAT); + AddParam(cmdUpdate, "RPPTP", RPPTP); + AddParam(cmdUpdate, "RPLIS", RPLIS); + AddParam(cmdUpdate, "RPHIS", RPHIS); + AddParam(cmdUpdate, "RPDOC", RPDOC); + AddParam(cmdUpdate, "RPCPY", RPCPY); + AddParam(cmdUpdate, "RPOVR", RPOVR); + AddParam(cmdUpdate, "RPFMD", RPFMD); + AddParam(cmdUpdate, "RPXDT", RPXDT); + AddParam(cmdUpdate, "RPOPT", RPOPT); + AddParam(cmdUpdate, "TRUSR", TRUSR); + AddParam(cmdUpdate, "OLD_RPREN", OLD_RPREN); + AddParam(cmdUpdate, "OLD_RPITM", OLD_RPITM); + AddParam(cmdUpdate, "OLD_APPNO", OLD_APPNO); + } + + return Query.ExecuteNonQuery(cmdUpdate); + } + + /// + /// 刪除一筆紀錄,自動判斷該加入的是加退保紀錄還是異動紀錄 + /// + [DataObjectMethod(DataObjectMethodType.Delete)] + public int Delete(string OLD_RPREN, int OLD_RPITM, int OLD_APPNO) + { + OLD_RPREN = OLD_RPREN != null ? OLD_RPREN : ""; + + DbCommand cmdDelete = Query.NewCommand(); + + if (OLD_RPITM == 0) + { + cmdDelete.CommandText = + @"DELETE FROM RPIR + WHERE RPREN = @OLD_RPREN + AND APPNO = @OLD_APPNO"; + AddParam(cmdDelete, "OLD_RPREN", OLD_RPREN); + AddParam(cmdDelete, "OLD_APPNO", OLD_APPNO); + } + else + { + cmdDelete.CommandText = + @"DELETE FROM RPIB + WHERE RPREN = @OLD_RPREN + AND RPITM = @OLD_RPITM + AND APPNO = @OLD_APPNO"; + AddParam(cmdDelete, "OLD_RPREN", OLD_RPREN); + AddParam(cmdDelete, "OLD_RPITM", OLD_RPITM); + AddParam(cmdDelete, "OLD_APPNO", OLD_APPNO); + } + + return Query.ExecuteNonQuery(cmdDelete); + } + + public void CompareChanged(DataRow current, DataRow prev) + { + current.BeginEdit(); + current["RPSDT_Changed"] = FieldDiff(current["RPSDT"], prev["RPSDT"]); + current["RPEDT_Changed"] = FieldDiff(current["RPEDT"], prev["RPEDT"]); + current["RPSLY_Changed"] = FieldDiff(current["RPSLY"], prev["RPSLY"]); + current["RPAMT_Changed"] = FieldDiff(current["RPAMT"], prev["RPAMT"]); + current["RPAM2_Changed"] = FieldDiff(current["RPAM2"], prev["RPAM2"]); + current["RPAM3_Changed"] = FieldDiff(current["RPAM3"], prev["RPAM3"]); + current["RPFMY_Changed"] = FieldDiff(current["RPFMY"], prev["RPFMY"]); + current["RPFM1_Changed"] = FieldDiff(current["RPFM1"], prev["RPFM1"]); + current["RPFM2_Changed"] = FieldDiff(current["RPFM2"], prev["RPFM2"]); + current["RPFM3_Changed"] = FieldDiff(current["RPFM3"], prev["RPFM3"]); + current["RPSLA_Changed"] = FieldDiff(current["RPSLA"], prev["RPSLA"]); + current["RPDIS_Changed"] = FieldDiff(current["RPDIS"], prev["RPDIS"]); + current["RPDIH_Changed"] = FieldDiff(current["RPDIH"], prev["RPDIH"]); + current["RPOLD_Changed"] = FieldDiff(current["RPOLD"], prev["RPOLD"]); + current["RPNAT_Changed"] = FieldDiff(current["RPNAT"], prev["RPNAT"]); + current["RPPTP_Changed"] = FieldDiff(current["RPPTP"], prev["RPPTP"]); + current["RPLIS_Changed"] = FieldDiff(current["RPLIS"], prev["RPLIS"]); + current["RPHIS_Changed"] = FieldDiff(current["RPHIS"], prev["RPHIS"]); + current["RPCPY_Changed"] = FieldDiff(current["RPCPY"], prev["RPCPY"]); + current["RPOVR_Changed"] = FieldDiff(current["RPOVR"], prev["RPOVR"]); + current["RPFMD_Changed"] = FieldDiff(current["RPFMD"], prev["RPFMD"]); + current["RPXDT_Changed"] = FieldDiff(current["RPXDT"], prev["RPXDT"]); + current["RPOPT_Changed"] = FieldDiff(current["RPOPT"], prev["RPOPT"]); + current["RPFMY_ChangeCount"] = Convert.ToInt32(current["RPFMY"]) - Convert.ToInt32(prev["RPFMY"]); + current["RPFM1_ChangeCount"] = Convert.ToInt32(current["RPFM1"]) - Convert.ToInt32(prev["RPFM1"]); + current["RPFM2_ChangeCount"] = Convert.ToInt32(current["RPFM2"]) - Convert.ToInt32(prev["RPFM2"]); + current["RPFM3_ChangeCount"] = Convert.ToInt32(current["RPFM3"]) - Convert.ToInt32(prev["RPFM3"]); + current.EndEdit(); + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/RpsbDAC.cs b/Web/App_Code/DAC/RpsbDAC.cs new file mode 100644 index 0000000..d0d8605 --- /dev/null +++ b/Web/App_Code/DAC/RpsbDAC.cs @@ -0,0 +1,439 @@ +// +// 這個檔案是 RPSB 資料表的資料存取類別 檔案一 +// 請不要修改這個檔案,重新產生資料存取類別時,這個檔案會被覆蓋掉 +// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using Wellan.Data; +using System.Data.Common; +using Wellan.Common; +using Newtonsoft.Json; + +/// +/// RPSB 人員異動資料 資料存取類別 +/// +[DataObject] +public class RpsbDAC : Wellan.Data.WDAC +{ + private const string _tableName = "[RPSB]"; + private const string _allFields = "[RPENO], [RPITM], [RPDAT], [RPCLS], [RPODT], [RPDPT], [RPDOC], [DB_CRDAT], [DB_CRUSR], [DB_TRDAT], [DB_TRUSR]"; + //private string _select = "select " + _allFields; + private string _insert = "[RPENO], [RPITM], [RPDAT], [RPCLS], [RPODT], [RPDPT], [RPDOC], [DB_CRDAT], [DB_CRUSR], [DB_TRDAT], [DB_TRUSR]"; + private string _insertValue = "@RPENO, @RPITM, @RPDAT, @RPCLS, @RPODT, @RPDPT, @RPDOC, @DB_CRDAT, @DB_CRUSR, @DB_TRDAT, @DB_TRUSR"; + //private string _from = " from " + _tableName + " WITH (NOLOCK) "; + //private string _where = " where 1=1 "; + //private string _order = " order by [RPENO], [RPITM] "; + + public RpsbDAC() + { + } + + public RpsbDAC(string connectionConfig, string connectionConfigName) : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public RpsbDAC(WQuery query) : this() + { + this._query = query; + } + + /// + /// 查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public RPSBList Select(string RPENO) + { + RPSBList result = new RPSBList(); + IDataList list = result as IDataList; + DbCommand cmdSelect = Query.NewCommand(); + cmdSelect.CommandText = @" + SELECT A.*, B.BDNAM AS RPODT_NAME, C.BDNAM AS RPDPT_NAME + FROM RPSB A + LEFT JOIN BDPT B ON A.RPODT = B.BDNUM + LEFT JOIN BDPT C ON A.RPDPT = C.BDNUM + WHERE A.RPENO = @RPENO + ORDER BY A.RPITM"; + AddParam(cmdSelect, "RPENO", RPENO); + Query.Select(cmdSelect, ref list); + return result; + } + + /// + /// 查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public RPSBList SelectOne(string RPENO, int RPITM) + { + RPSBList result = new RPSBList(); + IDataList list = result as IDataList; + DbCommand cmdSelect = Query.NewCommand(); + cmdSelect.CommandText = @" + SELECT A.*, B.BDNAM AS RPODT_NAME, C.BDNAM AS RPDPT_NAME + FROM RPSB A + LEFT JOIN BDPT B ON A.RPODT = B.BDNUM + LEFT JOIN BDPT C ON A.RPDPT = C.BDNUM + WHERE A.RPENO = @RPENO + AND A.RPITM = @RPITM"; + AddParam(cmdSelect, "RPENO", RPENO); + AddParam(cmdSelect, "RPITM", RPITM); + Query.Select(cmdSelect, ref list); + return result; + } + + public RPSBItem SelectLast(string RPENO, int prevRBITM) + { + RPSBList result = new RPSBList(); + IDataList list = result as IDataList; + DbCommand cmdSelect = Query.NewCommand(); + cmdSelect.CommandText = @" + SELECT TOP 1 A.*, B.BDNAM AS RPODT_NAME, C.BDNAM AS RPDPT_NAME + FROM RPSB A + LEFT JOIN BDPT B ON A.RPODT = B.BDNUM + LEFT JOIN BDPT C ON A.RPDPT = C.BDNUM + WHERE A.RPENO = @RPENO + AND A.RPITM < @RPITM + ORDER BY RPITM DESC"; + AddParam(cmdSelect, "RPENO", RPENO); + AddParam(cmdSelect, "RPITM", prevRBITM == 0 ? Int32.MaxValue : prevRBITM); + Query.Select(cmdSelect, ref list); + if (result.Count == 0) + return null; + else + return result[0]; + } + + public string PrevRPDPT(string RPENO, int RPITM) + { + DbCommand cmdSelect = Query.NewCommand(); + cmdSelect.CommandText = @" + SELECT TOP 1 RPDPT + FROM RPSB + WHERE RPENO = @RPENO + AND RPITM < @RPITM + AND RPCLS = '部門調動' + ORDER BY RPITM DESC"; + AddParam(cmdSelect, "RPENO", RPENO); + AddParam(cmdSelect, "RPITM", RPITM); + return WDAC.GetStringValue(Query.ExecuteScalar(cmdSelect)); + } + + public int NextRPITM(string RPENO) + { + DbCommand cmdSelect = Query.NewCommand(); + cmdSelect.CommandText = @" + SELECT ISNULL(MAX(RPITM), 0) + 1 + FROM RPSB + WHERE RPENO = @RPENO"; + AddParam(cmdSelect, "RPENO", RPENO); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmdSelect)); + } + + private bool BeforeInsertOne(RPSBItem value) + { + return true; + } + + /// + /// 新增一筆資料 + /// + [DataObjectMethod(DataObjectMethodType.Insert)] + public bool InsertOne(RPSBItem value) + { + try + { + if (!BeforeInsertOne(value)) + return false; + value.DB_CRDAT = DateTime.UtcNow.AddHours(8); + value.DB_CRUSR = UserId; + value.DB_TRDAT = DateTime.UtcNow.AddHours(8); + value.DB_TRUSR = UserId; + DbCommand cmdInsert = Query.NewCommand(); + cmdInsert.CommandText = + "insert into [RPSB]" + + " (" + _insert + ") " + + " values " + + " (" + _insertValue + ") " + ; + AddParam(cmdInsert, "RPENO", value.RPENO); + AddParam(cmdInsert, "RPITM", value.RPITM); + AddParam(cmdInsert, "RPDAT", value.RPDAT); + AddParam(cmdInsert, "RPCLS", value.RPCLS); + AddParam(cmdInsert, "RPODT", value.RPODT); + AddParam(cmdInsert, "RPDPT", value.RPDPT); + AddParam(cmdInsert, "RPDOC", value.RPDOC); + AddParam(cmdInsert, "DB_CRDAT", value.DB_CRDAT); + AddParam(cmdInsert, "DB_CRUSR", value.DB_CRUSR); + AddParam(cmdInsert, "DB_TRDAT", value.DB_TRDAT); + AddParam(cmdInsert, "DB_TRUSR", value.DB_TRUSR); + Query.ExecuteNonQuery(cmdInsert); + return true; + } + catch + { + return false; + } + } + + + private bool BeforeUpdateOne(RPSBItem value) + { + return true; + } + + /// + /// 修改一筆資料 + /// + [DataObjectMethod(DataObjectMethodType.Update)] + public bool UpdateOne(RPSBItem value) + { + try + { + if (!BeforeUpdateOne(value)) + return false; + value.DB_TRDAT = DateTime.UtcNow.AddHours(8); + value.DB_TRUSR = UserId; + DbCommand cmdUpdate = Query.NewCommand(); + cmdUpdate.CommandText = @" + update [RPSB] + set + [RPDAT] = @RPDAT , + [RPCLS] = @RPCLS , + [RPODT] = @RPODT , + [RPDPT] = @RPDPT , + [RPDOC] = @RPDOC , + DB_TRDAT = @DB_TRDAT , + DB_TRUSR = @DB_TRUSR + where 1=1 + and [RPENO] = @original_RPENO + and [RPITM] = @original_RPITM + "; + AddParam(cmdUpdate, "RPDAT", value.RPDAT); + AddParam(cmdUpdate, "RPCLS", value.RPCLS); + AddParam(cmdUpdate, "RPODT", value.RPODT); + AddParam(cmdUpdate, "RPDPT", value.RPDPT); + AddParam(cmdUpdate, "RPDOC", value.RPDOC); + AddParam(cmdUpdate, "DB_TRDAT", value.DB_TRDAT); + AddParam(cmdUpdate, "DB_TRUSR", value.DB_TRUSR); + AddParam(cmdUpdate, "original_RPENO", value.RPENO); + AddParam(cmdUpdate, "original_RPITM", value.RPITM); + Query.ExecuteNonQuery(cmdUpdate); + return true; + } + catch + { + return false; + } + } + + + private bool BeforeDeleteOne(string RPENO, int RPITM) + { + return true; + } + + /// + /// 刪除一筆資料 + /// + [DataObjectMethod(DataObjectMethodType.Delete)] + public bool DeleteOne(string RPENO, int RPITM) + { + try + { + if (!BeforeDeleteOne(RPENO, RPITM)) + return false; + DbCommand cmdDelete = Query.NewCommand(); + cmdDelete.CommandText = @" + delete from [RPSB] + where 1=1 + and RPENO = @RPENO + and RPITM = @RPITM + "; + AddParam(cmdDelete, "RPENO", RPENO); + AddParam(cmdDelete, "RPITM", RPITM); + Query.ExecuteNonQuery(cmdDelete); + return true; + } + catch + { + return false; + } + } +} + + + +/// +/// RPSB 資料集合類別 +/// +[Serializable] +public partial class RPSBList : List, IDataList +{ + /// + /// 從 DataReader 填入資料 + /// + public void Fill(DbDataReader reader) + { + while (reader.Read()) + { + RPSBItem newItem = new RPSBItem + { + RPENO = WDAC.GetStringValue(reader["RPENO"]), + RPITM = WDAC.GetInt32Value(reader["RPITM"]), + RPCLS = WDAC.GetStringValue(reader["RPCLS"]), + RPDAT = WDAC.GetDateTimeValue(reader["RPDAT"]), + RPDPT = WDAC.GetStringValue(reader["RPDPT"]), + RPODT = WDAC.GetStringValue(reader["RPODT"]), + RPDOC = WDAC.GetStringValue(reader["RPDOC"]), + RPDPT_NAME = WDAC.GetStringValue(reader["RPDPT_NAME"]), + RPODT_NAME = WDAC.GetStringValue(reader["RPODT_NAME"]), + DB_CRDAT = WDAC.GetDateTimeValue(reader["DB_CRDAT"]), + DB_CRUSR = WDAC.GetStringValue(reader["DB_CRUSR"]), + DB_TRDAT = WDAC.GetDateTimeValue(reader["DB_TRDAT"]), + DB_TRUSR = WDAC.GetStringValue(reader["DB_TRUSR"]), + }; + Add(newItem); + } + } +} + + + +/// +/// RPSB 資料紀錄類別 +/// +[Serializable] +[Description("人員異動資料")] +public class RPSBItem +{ + public static string 到職 = "到職"; + public static string 離職回任 = "離職回任"; + public static string 離職 = "離職"; + public static string 留職停薪 = "留職停薪"; + public static string 留停復職 = "留停復職"; + public static string 部門調動 = "部門調動"; + + /// + /// 人員編號 + /// + public string RPENO { get; set; } + + /// + /// 異動項次 + /// + public int RPITM { get; set; } + + /// + /// 異動日期 + /// + [JsonIgnore] + public DateTime? RPDAT { get; set; } + + [JsonProperty(PropertyName = "RPDAT")] + public string RPDAT_STR { get { return string.Format("{0:yyyyMMdd}", RPDAT); } } + /// + /// 異動類別 + /// 到職/離職/留職停薪/留停復職/部門調動 + /// + public string RPCLS { get; set; } + + /// + /// 原部門 + /// + public string RPODT { get; set; } + public string RPODT_NAME { get; set; } + + /// + /// 新部門 + /// + public string RPDPT { get; set; } + public string RPDPT_NAME { get; set; } + + /// + /// 備註 + /// + public string RPDOC { get; set; } + + public DateTime? DB_CRDAT { get; set; } + public string DB_CRUSR { get; set; } + public DateTime? DB_TRDAT { get; set; } + public string DB_TRUSR { get; set; } + public bool OnBoard { get { return Array.IndexOf(RPSBSaveItem.OnBoardRPCLS, RPCLS) >= 0; } } + public bool OffBoard { get { return Array.IndexOf(RPSBSaveItem.OffBoardRPCLS, RPCLS) >= 0; } } + public bool Quit { get { return Array.IndexOf(RPSBSaveItem.QuitRPCLS, RPCLS) >= 0; } } + public bool DeptChange { get { return RPCLS == RPSBItem.部門調動; } } +} + + +public class RPSBSaveItem +{ + public static string[] RPCLSOptions = { RPSBItem.到職, RPSBItem.離職回任, RPSBItem.離職, RPSBItem.留職停薪, RPSBItem.留停復職 }; + public static string[] OnBoardRPCLS = { RPSBItem.到職, RPSBItem.離職回任, RPSBItem.留停復職 }; + public static string[] OffBoardRPCLS = { RPSBItem.離職, RPSBItem.留職停薪 }; + public static string[] QuitRPCLS = { RPSBItem.離職 }; + + private DateTime _RPDAT_DATE; + public string RPENO { get; set; } + public int RPITM { get; set; } + public string RPDAT { get; set; } + public string RPCLS { get; set; } + public string RPDPT { get; set; } + public string RPDOC { get; set; } + public DateTime RPDAT_DATE { get { return _RPDAT_DATE; } } + public string Message; + + public bool IsValid + { + get + { + var valid = true; + var messages = new List(); + + if (string.IsNullOrEmpty(RPCLS)) + { + messages.Add("異動類別未輸入"); + valid = false; + } + + else if (Array.IndexOf(RPCLSOptions, RPCLS) < 0) + { + messages.Add("異動類別不正確"); + valid = false; + } + + if (string.IsNullOrEmpty(RPENO)) + { + messages.Add("人員編號未輸入"); + valid = false; + } + + if (string.IsNullOrEmpty(RPDAT)) + { + messages.Add("異動日期未輸入"); + valid = false; + } + else if (!WGuard1.CheckDate(RPDAT, out _RPDAT_DATE) || _RPDAT_DATE.Year > 2112) + { + messages.Add("異動日期不正確"); + valid = false; + } + + //if (RPCLS == RPSBItem.部門調動 && string.IsNullOrEmpty(RPDPT)) + //{ + // messages.Add("新部門未輸入"); + // valid = false; + //} + + Message = string.Join(" / ", messages.ToArray()); + return valid; + } + } + + public bool OnBoard { get { return Array.IndexOf(OnBoardRPCLS, RPCLS) >= 0; } } + public bool OffBoard { get { return Array.IndexOf(OffBoardRPCLS, RPCLS) >= 0; } } + public bool Quit { get { return Array.IndexOf(QuitRPCLS, RPCLS) >= 0; } } + public bool DeptChange { get { return RPCLS == RPSBItem.部門調動; } } + +} diff --git a/Web/App_Code/DAC/RsajDAC.cs b/Web/App_Code/DAC/RsajDAC.cs new file mode 100644 index 0000000..adfe749 --- /dev/null +++ b/Web/App_Code/DAC/RsajDAC.cs @@ -0,0 +1,130 @@ +using System; +using System.Data; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; + +/// +/// 薪資加減項資料處理類別 +/// +public class RsajDAC : Wellan.Data.WDAC +{ + public RsajDAC() + { + } + + public RsajDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public RsajDAC(WQuery query) + { + this._query = query; + } + + /// + /// 取得某年月、某人員薪資加減項紀錄 + /// + /// 年月 + /// 人員編號 + /// 專案年度編號 + /// 要加入的交易 + public DataTable GetRSAJ(DateTime yymm, string rseno, string rspyn, DbTransaction tran) + { + DbCommand cmd = Query.NewCommand( + @"SELECT RSAMT, RSDOC + FROM RSAJ WHERE RSENO=@RSENO AND RSPYN=@RSPYN + AND RSYMM = @YYMM"); + cmd.Parameters.Add(Query.NewParameter("RSENO", rseno)); + cmd.Parameters.Add(Query.NewParameter("RSPYN", rspyn)); + cmd.Parameters.Add(Query.NewParameter("YYMM", yymm)); + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + DbDataAdapter da = Query.NewDataAdapter(cmd); + DataTable result = new DataTable(); + da.Fill(result); + return result; + } + + /// + /// 寫特休結算薪資加減項 + /// + /// + /// + /// + /// + /// + public string WriteAnnualLeaveSalary(DateTime yymm, string rseno, string rspyn, int rsamt, string rsdoc) + { + DbCommand cmd = Query.NewCommand(); + var rsren = GetAnnualLeaveSalaryREN(yymm, rseno, rspyn); + if (string.IsNullOrEmpty(rsren) && rsamt > 0) + { + cmd.CommandText = + @"INSERT INTO RSAJ + (TRDAT, TRMOD, TRUSR, RSREN, RSENO, RSPYN, RSYMM, RSAMT, RSDOC, APPNO) + VALUES + (@TRDAT, 'INSERT', @TRUSR, @RSREN, @RSENO, @RSPYN, @RSYMM, @RSAMT, @RSDOC, 1)"; + cmd.Parameters.Clear(); + cmd.Parameters.Add(Query.NewParameter("TRDAT", DateTime.UtcNow.AddHours(8))); + cmd.Parameters.Add(Query.NewParameter("TRUSR", UserId)); + cmd.Parameters.Add(Query.NewParameter("RSREN", WGuard1.WNextRen(yymm, "RSAJ", "RSREN", "YYYYMM\"F\"<9999>", "", null))); + cmd.Parameters.Add(Query.NewParameter("RSENO", rseno)); + cmd.Parameters.Add(Query.NewParameter("RSPYN", rspyn)); + cmd.Parameters.Add(Query.NewParameter("RSYMM", yymm)); + cmd.Parameters.Add(Query.NewParameter("RSAMT", rsamt)); + cmd.Parameters.Add(Query.NewParameter("RSDOC", rsdoc)); + Query.ExecuteNonQuery(cmd); + } + else if (rsamt == 0) + { + cmd.CommandText = @"DELETE FROM RSAJ WHERE RSREN = @RSREN"; + cmd.Parameters.Add(Query.NewParameter("RSREN", rsren)); + Query.ExecuteNonQuery(cmd); + } + else + { + cmd.CommandText = + @"UPDATE RSAJ + SET TRDAT = @TRDAT + , TRMOD = 'UPDATE' + , TRUSR = @TRUSR + , RSENO = @RSENO + , RSPYN = @RSPYN + , RSYMM = @RSYMM + , RSAMT = @RSAMT + , RSDOC = @RSDOC + , APPNO = APPNO + 1 + WHERE RSREN = @RSREN"; + cmd.Parameters.Clear(); + cmd.Parameters.Add(Query.NewParameter("TRDAT", DateTime.UtcNow.AddHours(8))); + cmd.Parameters.Add(Query.NewParameter("TRUSR", UserId)); + cmd.Parameters.Add(Query.NewParameter("RSENO", rseno)); + cmd.Parameters.Add(Query.NewParameter("RSPYN", rspyn)); + cmd.Parameters.Add(Query.NewParameter("RSYMM", yymm)); + cmd.Parameters.Add(Query.NewParameter("RSAMT", rsamt)); + cmd.Parameters.Add(Query.NewParameter("RSDOC", rsdoc)); + cmd.Parameters.Add(Query.NewParameter("RSREN", rsren)); + Query.ExecuteNonQuery(cmd); + } + return rsren; + } + + public string GetAnnualLeaveSalaryREN(DateTime yymm, string rseno, string rspyn) + { + DbCommand cmd = Query.NewCommand( + @"SELECT RSREN + FROM RSAJ + WHERE RSENO=@RSENO + AND RSPYN=@RSPYN + AND RSYMM=@RSYMM + AND RSREN LIKE '______F____'"); + cmd.Parameters.Add(Query.NewParameter("RSENO", rseno)); + cmd.Parameters.Add(Query.NewParameter("RSPYN", rspyn)); + cmd.Parameters.Add(Query.NewParameter("RSYMM", yymm)); + return GetStringValue(Query.ExecuteScalar(cmd)); + } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/RtmeDAC.cs b/Web/App_Code/DAC/RtmeDAC.cs new file mode 100644 index 0000000..21360b7 --- /dev/null +++ b/Web/App_Code/DAC/RtmeDAC.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using Wellan.Data; +using Wellan.Common; +using System.ComponentModel; + +/// +/// 人員班表的資料處理類別 +/// +[DataObject] +public class RtmeDAC : WDAC +{ + public RtmeDAC() + { + } + + public RtmeDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public RtmeDAC(WQuery query) + { + this._query = query; + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public List SelectDay(string RTENO, DateTime? RTDAT) + { + var cmd = Query.NewCommand(); + cmd.CommandText = "SELECT * FROM RTME WHERE 1=1"; + + if (!string.IsNullOrEmpty(RTENO)) + cmd.CommandText += " AND RTENO = @RTENO "; + if (RTDAT.HasValue) + cmd.CommandText += " AND RTDAT = @RTDAT "; + + AddParam(cmd, "RTENO", RTENO); + AddParam(cmd, "RTDAT", RTDAT); + return Query.Select(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public List SelectMonth(string RTENO, DateTime? RTDAT) + { + var cmd = Query.NewCommand(); + cmd.CommandText = "SELECT * FROM RTME WHERE 1=1"; + + // if (!string.IsNullOrEmpty(RTENO)) + cmd.CommandText += " AND RTENO = @RTENO "; + + if (RTDAT.HasValue) + { + cmd.CommandText += " AND RTDAT >= @RTDAT_1 AND RTDAT < @RTDAT_2 "; + var d = RTDAT.Value.AddDays(-(RTDAT.Value.Day - 1)); + AddParam(cmd, "RTDAT_1", d); + AddParam(cmd, "RTDAT_2", d.AddMonths(1)); + } + + AddParam(cmd, "RTENO", RTENO); + return Query.Select(cmd); + } + + public void SetDay(string RTENO, DateTime RTDAT, string RTTID, string TRUSR) + { + var item = SelectDay(RTENO, RTDAT).FirstOrDefault(); + if (item == null) + { + InsertOne(new RtmeItem() + { + RTENO = RTENO, + RTDAT = RTDAT, + RTTID = RTTID, + TRUSR = TRUSR + }); + } + else + { + item.RTTID = RTTID; + UpdateOne(item); + } + } + + [DataObjectMethod(DataObjectMethodType.Insert)] + public void InsertOne(RtmeItem value) + { + var cmd = Query.NewCommand(); + cmd.CommandText = + @"INSERT INTO dbo.RTME + (RTENO, RTDAT, RTTID, TRDAT, TRMOD, TRUSR) + VALUES + (@RTENO, @RTDAT, @RTTID, GETDATE(), 'INSERT', @TRUSR)"; + AddParam(cmd, "RTENO", value.RTENO); + AddParam(cmd, "RTDAT", value.RTDAT); + AddParam(cmd, "RTTID", value.RTTID); + AddParam(cmd, "TRUSR", value.TRUSR); + Query.ExecuteNonQuery(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Update)] + public void UpdateOne(RtmeItem value) + { + var cmd = Query.NewCommand(); + cmd.CommandText = + @"UPDATE dbo.RTME SET + RTTID = @RTTID, + TRDAT = GETDATE(), + TRMOD = 'MODIFY', + TRUSR = @TRUSR + WHERE RTENO = @OLD_RTENO + AND RTDAT = @OLD_RTDAT"; + AddParam(cmd, "RTTID", value.RTTID); + AddParam(cmd, "TRUSR", value.TRUSR); + AddParam(cmd, "OLD_RTENO", value.RTENO); + AddParam(cmd, "OLD_RTDAT", value.RTDAT); + Query.ExecuteNonQuery(cmd); + } + + [DataObjectMethod(DataObjectMethodType.Delete)] + public void DeleteOne(RtmeItem value) + { + var cmd = Query.NewCommand(); + cmd.CommandText = + @"DELETE FROM dbo.RTME + WHERE RTENO = @OLD_RTENO + AND RTDAT = @OLD_RTDAT"; + AddParam(cmd, "OLD_RTENO", value.RTENO); + AddParam(cmd, "OLD_RTDAT", value.RTDAT); + Query.ExecuteNonQuery(cmd); + } + + /// + /// 由員工與日期取班表資料 + /// + /// + /// + /// + public BtmeItem SelectBtmeDay(string RTENO, DateTime RTDAT) + { + var rtmeItem = SelectDay(RTENO, RTDAT).FirstOrDefault(); + if (rtmeItem != null && !string.IsNullOrEmpty(rtmeItem.RTTID.Trim()) && !BhrdDAC.ItemIsHoliday(rtmeItem.RTTID)) + { + return new BtmeDAC(Query).SelectOne(rtmeItem.RTTID).FirstOrDefault(); + } + else + return null; + } +} + +public class RtmeItem +{ + public string RTENO { get; set; } + public DateTime RTDAT { get; set; } + public string RTTID { get; set; } + public DateTime TRDAT { get; set; } + public string TRMOD { get; set; } + public string TRUSR { get; set; } +} \ No newline at end of file diff --git a/Web/App_Code/DAC/RyerDAC.cs b/Web/App_Code/DAC/RyerDAC.cs new file mode 100644 index 0000000..c4ff6f9 --- /dev/null +++ b/Web/App_Code/DAC/RyerDAC.cs @@ -0,0 +1,788 @@ +using System; +using System.Data; +using System.Configuration; +using System.Data.Common; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using Wellan.Data; +using Wellan.Common; +using NPOI.SS.Formula.Functions; +using System.IdentityModel.Claims; +using Microsoft.Win32; + +/// +/// 年度特休 +/// +[DataObject] +public class RyerDAC : Wellan.Data.WDAC +{ + public RyerDAC() + { + } + + public RyerDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public RyerDAC(WQuery query) + { + this._query = query; + } + + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectProject(int RYYERFrom, int RYYERTo, string RAPYN, string RANUM) + { + string select = @"SELECT A.RANUM AS RYENO + , A.BPYER AS RYYER + , B.BPNME + , B.BPSDY + , B.BPEDY + , C.RYYST + , '' AS RYYST_H + , '' AS RYYST_M + , ISNULL(C.RYYXT, 0) AS RYYXT + , '' AS RYYXT_D + , ISNULL(C.RYTOT, 0) / 60 AS RYTOT + , ISNULL(C.RYH01, 0) / 60 AS RYH01 + , ISNULL(C.RYH02, 0) / 60 AS RYH02 + , ISNULL(C.RYH03, 0) / 60 AS RYH03 + , ISNULL(C.RYH04, 0) / 60 AS RYH04 + , ISNULL(C.RYH05, 0) / 60 AS RYH05 + , ISNULL(C.RYH06, 0) / 60 AS RYH06 + , ISNULL(C.RYH07, 0) / 60 AS RYH07 + , ISNULL(C.RYH08, 0) / 60 AS RYH08 + , ISNULL(C.RYH09, 0) / 60 AS RYH09 + , ISNULL(C.RYH10, 0) / 60 AS RYH10 + , ISNULL(C.RYH11, 0) / 60 AS RYH11 + , ISNULL(C.RYH12, 0) / 60 AS RYH12 + , ISNULL(C.RYD01, 1) AS RYD01 + , ISNULL(C.RYD02, 1) AS RYD02 + , ISNULL(C.RYD03, 1) AS RYD03 + , ISNULL(C.RYD04, 1) AS RYD04 + , ISNULL(C.RYD05, 1) AS RYD05 + , ISNULL(C.RYD06, 1) AS RYD06 + , ISNULL(C.RYD07, 1) AS RYD07 + , ISNULL(C.RYD08, 1) AS RYD08 + , ISNULL(C.RYD09, 1) AS RYD09 + , ISNULL(C.RYD10, 1) AS RYD10 + , ISNULL(C.RYD11, 1) AS RYD11 + , ISNULL(C.RYD12, 1) AS RYD12 + , '' AS RYVLD + , '' AS RYUST + , '' AS RYLFT + , '' AS RYPLF + , ISNULL(C.RYSLY, 0) AS RYSLY + , ISNULL(C.RYNXT, 0) AS RYNXT + , '' AS RYSLY_H + , '' AS RYSLY_M + , '' AS RYNXT_H + , '' AS RYNXT_M + , C.RYRMK"; + + if (RAPYN == "103JYB00001" || RAPYN == "103TYB00001") + { + RYYERTo = RYYERFrom; + } + + DbCommand cmd = Query.NewCommand(); + if (RYYERFrom != RYYERTo) + { + cmd.CommandText = string.Format( + @"{0} + FROM (SELECT DISTINCT RASN.RANUM, BPAA.BPYER + @CY11 BPYER + FROM RASN + JOIN BPAA on RASN.RAPYN = BPAA.BPPYN + WHERE (BPYER + @CY11 >= @RYYER_FROM AND BPYER + @CY11 <= @RYYER_TO) + AND (RASN.RAPYN = @RAPYN OR @RAPYN = '') -- 跨年度查詢忽略專案條件 + AND (RASN.RANUM = @RANUM OR @RANUM = '') + ) A + JOIN BPSNView B ON A.RANUM=B.BPENO -- AND (B.BPEDY IS NULL OR YEAR(B.BPEDY) = BPYER) + LEFT JOIN RYER C ON A.RANUM=C.RYENO AND A.BPYER = C.RYYER + ORDER BY (CASE WHEN BPEDY IS NULL THEN 0 ELSE 1 END), RYENO, BPYER" + , select); + } + else + { + cmd.CommandText = string.Format( + @"{0} + FROM (SELECT DISTINCT RASN.RANUM, @RYYER_FROM BPYER + FROM RASN + WHERE (RASN.RAPYN = @RAPYN OR @RAPYN = '') + AND (RASN.RANUM = @RANUM OR @RANUM = '') + -- AND (RASN.RAEDT IS NULL OR YEAR(RASN.RAEDT) = @RYYER_FROM) -- 加上專案結束日為空或年度=查詢年度 + ) A + JOIN BPSNView B ON A.RANUM=B.BPENO -- AND (B.BPEDY IS NULL OR YEAR(B.BPEDY) = BPYER) + LEFT JOIN RYER C ON A.RANUM=C.RYENO AND A.BPYER = C.RYYER + ORDER BY (CASE WHEN BPEDY IS NULL THEN 0 ELSE 1 END), RYENO, BPYER" + , select); + } + + cmd.Parameters.Clear(); + Query.AddParam(cmd, "CY11", WGuard1.CY11); + Query.AddParam(cmd, "RANUM", RANUM); + Query.AddParam(cmd, "RAPYN", RAPYN); + Query.AddParam(cmd, "RYYER_FROM", RYYERFrom); + Query.AddParam(cmd, "RYYER_TO", RYYERTo); + DataTable result = Query.Select(cmd); + + var nowtime = DateTime.UtcNow.AddHours(8); + int month = nowtime.Month; + int day = nowtime.Day; + foreach (DataRow r in result.Rows) + { + var ryyer = WDAC.GetInt32Value(r["RYYER"]); + var ryeno = WDAC.GetStringValue(r["RYENO"]); + if (ryyer < nowtime.Year) + { + month = 12; + day = 31; + } + + r.BeginEdit(); + int 年初特休 = Get年初特休(ryeno, ryyer); + int 可用特休 = Get可用特休(ryeno, ryyer, month, day); + int 至今生效特休 = Get至今生效特休(ryeno, ryyer, month, day); + int 已休時數 = 年初特休 + 至今生效特休 - 可用特休; + int 上年未休 = Get可用特休(ryeno, ryyer - 1, 12, 31); + + r["RYYST_H"] = String.Format("{0}", GetInt32Value(GetInt32Value(r["RYYST"]) / 60)); + r["RYYST_M"] = String.Format("{0:00}", GetInt32Value(GetInt32Value(r["RYYST"]) % 60)); + r["RYYXT_D"] = String.Format("{0}:{1:00}", GetInt32Value(GetInt32Value(r["RYYXT"]) / 60), GetInt32Value(r["RYYXT"]) % 60); + r["RYVLD"] = String.Format("{0}:{1:00}", GetInt32Value(至今生效特休 / 60), 至今生效特休 % 60); + r["RYUST"] = String.Format("{0}:{1:00}", GetInt32Value(已休時數 / 60), 已休時數 % 60); + r["RYLFT"] = String.Format("{0}:{1:00}", GetInt32Value(可用特休 / 60), 可用特休 % 60); + r["RYPLF"] = String.Format("{0}:{1:00}", GetInt32Value(上年未休 / 60), 上年未休 % 60); + r["RYSLY_H"] = String.Format("{0}", GetInt32Value(GetInt32Value(r["RYSLY"]) / 60)); + r["RYSLY_M"] = String.Format("{0:00}", GetInt32Value(r["RYSLY"]) % 60); + r["RYNXT_H"] = String.Format("{0}", GetInt32Value(GetInt32Value(r["RYNXT"]) / 60)); + r["RYNXT_M"] = String.Format("{0:00}", GetInt32Value(r["RYNXT"]) % 60); + r.EndEdit(); + r.AcceptChanges(); + } + + return result; + } + + /// + /// 取得某人某年還有多少特休 + /// + /// 員工編號 + /// 年 + /// 月 + /// 日 + /// 加入年初已生效時數 + /// 減去本年已休時數 + public int DoGet可用特休(string RYENO, int year, int month, int day, bool addYearBegin, bool substrateOffHours) + { + // 取得總時數 + if (month < 1) month = 1; + if (month > 12) month = 12; + List monthsql = new List(); + if (addYearBegin) + { + monthsql.Add("ISNULL(RYYST, 0)"); // 年初生效時數 + monthsql.Add("ISNULL(RYYXT, 0)"); // 上年遞延時數 + } + for (int i = 1; i < month; i++) + { + monthsql.Add(string.Format("ISNULL(RYH{0:00}, 0)", i)); + } + monthsql.Add(string.Format("ISNULL(CASE WHEN @RYDAY >= ISNULL(RYD{0:00}, 1) THEN RYH{0:00} ELSE 0 END, 0)", month)); + + + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + string.Format(@"SELECT {0} + FROM RYER + WHERE RYYER=@RYYER + AND RYENO=@RYENO", string.Join("+", monthsql.ToArray())); + cmd.Parameters.Clear(); + Query.AddParam(cmd, "RYYER", year); + Query.AddParam(cmd, "RYENO", RYENO); + Query.AddParam(cmd, "RYDAY", day); + int 總時數 = GetInt32Value(Query.ExecuteScalar(cmd)); + + // 取得已休時數 + int 已休時數 = 0; + if (substrateOffHours) + { + cmd.CommandText = + @"SELECT ISNULL(SUM(RPTCT), 0) + FROM RPAR + WHERE RPNUM = @RYENO + AND RPTYP = '01' + AND YEAR(RPRDT) = @RYYER + AND YEAR(RPEDT) = @RYYER + AND (MONTH(RPRDT) < @RYMON or MONTH(RPRDT) = @RYMON AND DAY(RPRDT) <= @RYDAY) + AND (RPAPN IS NULL OR RPAPN <> 'D' AND (RPAPP IS NULL OR RPAPP <> 'N'))"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "RYENO", RYENO); + Query.AddParam(cmd, "RYYER", year); + Query.AddParam(cmd, "RYMON", month); + Query.AddParam(cmd, "RYDAY", day); + 已休時數 += GetInt32Value(Query.ExecuteScalar(cmd)); + } + + return 總時數 - 已休時數; + } + + public int Get可用特休(string RYENO, int year, int month, int day) + { + return DoGet可用特休(RYENO, year, month, day, true, true); + } + public int Get至今生效特休(string RYENO, int year, int month, int day) + { + return DoGet可用特休(RYENO, year, month, day, false, false); + } + public int Get年初特休(string RYENO, int year) + { + return DoGet可用特休(RYENO, year, 1, 0, true, false); + } + + public int Get上年結轉(string RYENO, int year) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"SELECT RYNXT + FROM RYER + WHERE RYYER=@RYYER + AND RYENO=@RYENO"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "RYYER", year - 1); + Query.AddParam(cmd, "RYENO", RYENO); + return GetInt32Value(Query.ExecuteScalar(cmd)); + } + + [DataObjectMethod(DataObjectMethodType.Update)] + public void UpdateOne( + string old_ryeno + , int old_ryyer + , int rytot + , string trusr + , int ryyst + , int ryh01 + , int ryh02 + , int ryh03 + , int ryh04 + , int ryh05 + , int ryh06 + , int ryh07 + , int ryh08 + , int ryh09 + , int ryh10 + , int ryh11 + , int ryh12 + , int ryd01 + , int ryd02 + , int ryd03 + , int ryd04 + , int ryd05 + , int ryd06 + , int ryd07 + , int ryd08 + , int ryd09 + , int ryd10 + , int ryd11 + , int ryd12 + , int rysly + , int rynxt + , string ryrmk + ) + { + DbCommand cmd = Query.NewCommand(); + + if (!CheckExists(old_ryeno, old_ryyer)) + { + cmd.CommandText = + @"INSERT INTO RYER + (TRDAT, TRMOD, TRUSR, RYENO, RYYER, RYTOT, RYUST, RYYST, + RYH01, RYH02, RYH03, RYH04, RYH05, RYH06, RYH07, RYH08, RYH09, RYH10, RYH11, RYH12, + RYD01, RYD02, RYD03, RYD04, RYD05, RYD06, RYD07, RYD08, RYD09, RYD10, RYD11, RYD12, + RYSLY, RYNXT, RYRMK + ) + VALUES + (GETDATE(), 'INSERT', @TRUSR, @RYENO, @RYYER, @RYTOT, 0, @RYYST, + @RYH01, @RYH02, @RYH03, @RYH04, @RYH05, @RYH06, @RYH07, @RYH08, @RYH09, @RYH10, @RYH11, @RYH12, + @RYD01, @RYD02, @RYD03, @RYD04, @RYD05, @RYD06, @RYD07, @RYD08, @RYD09, @RYD10, @RYD11, @RYD12, + @RYSLY, @RYNXT, @RYRMK + )"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "TRUSR", trusr); + Query.AddParam(cmd, "RYENO", old_ryeno); + Query.AddParam(cmd, "RYYER", old_ryyer); + Query.AddParam(cmd, "RYTOT", rytot); + Query.AddParam(cmd, "RYYST", ryyst); + Query.AddParam(cmd, "RYH01", ryh01); + Query.AddParam(cmd, "RYH02", ryh02); + Query.AddParam(cmd, "RYH03", ryh03); + Query.AddParam(cmd, "RYH04", ryh04); + Query.AddParam(cmd, "RYH05", ryh05); + Query.AddParam(cmd, "RYH06", ryh06); + Query.AddParam(cmd, "RYH07", ryh07); + Query.AddParam(cmd, "RYH08", ryh08); + Query.AddParam(cmd, "RYH09", ryh09); + Query.AddParam(cmd, "RYH10", ryh10); + Query.AddParam(cmd, "RYH11", ryh11); + Query.AddParam(cmd, "RYH12", ryh12); + Query.AddParam(cmd, "RYD01", ryd01); + Query.AddParam(cmd, "RYD02", ryd02); + Query.AddParam(cmd, "RYD03", ryd03); + Query.AddParam(cmd, "RYD04", ryd04); + Query.AddParam(cmd, "RYD05", ryd05); + Query.AddParam(cmd, "RYD06", ryd06); + Query.AddParam(cmd, "RYD07", ryd07); + Query.AddParam(cmd, "RYD08", ryd08); + Query.AddParam(cmd, "RYD09", ryd09); + Query.AddParam(cmd, "RYD10", ryd10); + Query.AddParam(cmd, "RYD11", ryd11); + Query.AddParam(cmd, "RYD12", ryd12); + Query.AddParam(cmd, "RYSLY", rysly); + Query.AddParam(cmd, "RYNXT", rynxt); + Query.AddParam(cmd, "RYRMK", ryrmk); + Query.ExecuteNonQuery(cmd); + } + else + { + cmd.CommandText = + @"UPDATE RYER + SET TRDAT = GETDATE() , + TRMOD = 'UPDATE' , + TRUSR = @TRUSR , + RYTOT = @RYTOT , + RYYST = @RYYST , + RYH01 = @RYH01 , + RYH02 = @RYH02 , + RYH03 = @RYH03 , + RYH04 = @RYH04 , + RYH05 = @RYH05 , + RYH06 = @RYH06 , + RYH07 = @RYH07 , + RYH08 = @RYH08 , + RYH09 = @RYH09 , + RYH10 = @RYH10 , + RYH11 = @RYH11 , + RYH12 = @RYH12 , + RYD01 = @RYD01 , + RYD02 = @RYD02 , + RYD03 = @RYD03 , + RYD04 = @RYD04 , + RYD05 = @RYD05 , + RYD06 = @RYD06 , + RYD07 = @RYD07 , + RYD08 = @RYD08 , + RYD09 = @RYD09 , + RYD10 = @RYD10 , + RYD11 = @RYD11 , + RYD12 = @RYD12 , + RYSLY = @RYSLY , + RYNXT = @RYNXT , + RYRMK = @RYRMK + WHERE RYENO = @OLD_RYENO + AND RYYER = @OLD_RYYER"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "TRUSR", trusr); + Query.AddParam(cmd, "RYTOT", rytot); + Query.AddParam(cmd, "RYYST", ryyst); + Query.AddParam(cmd, "RYH01", ryh01); + Query.AddParam(cmd, "RYH02", ryh02); + Query.AddParam(cmd, "RYH03", ryh03); + Query.AddParam(cmd, "RYH04", ryh04); + Query.AddParam(cmd, "RYH05", ryh05); + Query.AddParam(cmd, "RYH06", ryh06); + Query.AddParam(cmd, "RYH07", ryh07); + Query.AddParam(cmd, "RYH08", ryh08); + Query.AddParam(cmd, "RYH09", ryh09); + Query.AddParam(cmd, "RYH10", ryh10); + Query.AddParam(cmd, "RYH11", ryh11); + Query.AddParam(cmd, "RYH12", ryh12); + Query.AddParam(cmd, "RYD01", ryd01); + Query.AddParam(cmd, "RYD02", ryd02); + Query.AddParam(cmd, "RYD03", ryd03); + Query.AddParam(cmd, "RYD04", ryd04); + Query.AddParam(cmd, "RYD05", ryd05); + Query.AddParam(cmd, "RYD06", ryd06); + Query.AddParam(cmd, "RYD07", ryd07); + Query.AddParam(cmd, "RYD08", ryd08); + Query.AddParam(cmd, "RYD09", ryd09); + Query.AddParam(cmd, "RYD10", ryd10); + Query.AddParam(cmd, "RYD11", ryd11); + Query.AddParam(cmd, "RYD12", ryd12); + Query.AddParam(cmd, "RYSLY", rysly); + Query.AddParam(cmd, "RYNXT", rynxt); + Query.AddParam(cmd, "RYRMK", ryrmk); + Query.AddParam(cmd, "OLD_RYENO", old_ryeno); + Query.AddParam(cmd, "OLD_RYYER", old_ryyer); + Query.ExecuteNonQuery(cmd); + } + } + + [DataObjectMethod(DataObjectMethodType.Delete)] + public void DeleteOne(string OLD_RYENO, int OLD_RYYER) + { + DbCommand cmd = Query.NewCommand(); + + cmd.CommandText = + @"UPDATE FROM RYER + WHERE RYENO = @RYENO + AND RYYER = @RYYER"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "RYENO", OLD_RYENO); + Query.AddParam(cmd, "RYYER", OLD_RYYER); + Query.ExecuteNonQuery(cmd); + } + + public bool CheckExists(string RYENO, int RYYER) + { + DbCommand cmd = Query.NewCommand(); + + cmd.CommandText = + @"SELECT COUNT(1) FROM RYER + WHERE RYENO = @RYENO + AND RYYER = @RYYER"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "RYENO", RYENO); + Query.AddParam(cmd, "RYYER", RYYER); + return GetInt32Value(Query.ExecuteScalar(cmd)) > 0; + } + + /// + /// 沖特休 + /// + /// 員工編號 + /// 年 + /// 特休分鐘數 + /// + public void 沖特休(string RYENO, int RYYER, int 特休, DbTransaction tran) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = + @"UPDATE RYER + SET RYUST = ISNULL(RYUST, 0) + @RYUST + WHERE RYENO=@RYENO AND RYYER=@RYYER"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "RYENO", RYENO); + Query.AddParam(cmd, "RYYER", RYYER); + Query.AddParam(cmd, "RYUST", 特休); + + if (tran != null) + { + cmd.Connection = tran.Connection; + cmd.Transaction = tran; + cmd.ExecuteNonQuery(); + } + else + { + Query.ExecuteNonQuery(cmd); + } + } + + public void 取消沖特休(DbTransaction tran, string _RPREN) + { + DbCommand cmd = Query.NewCommand(); + cmd.CommandText = @"SELECT RPNUM, RPRDT, RPTCT FROM RPAR WHERE RPREN=@RPREN"; + Query.AddParam(cmd, "RPREN", _RPREN); + DataTable t = Query.Select(cmd, tran); + + if (t.Rows.Count > 0) + { + string 舊User = WDAC.GetStringValue(t.Rows[0]["RPNUM"]); + DateTime 舊日期 = WDAC.GetDateTimeValue(t.Rows[0]["RPRDT"]); + int 舊時數 = WDAC.GetInt32Value(t.Rows[0]["RPTCT"]); + + 沖特休(舊User, 舊日期.Year, -舊時數, tran); + } + } + + /// + /// 結算特休 + /// + /// 員工編號 + /// 年度 + /// 操作人員 + public string Final( + string ryeno + , int ryyer + , string trusr + ) + { + var rasnDao = new RasnDAC(Query); + var rsajDao = new RsajDAC(Query); + var bpaaDao = new BpaaDAC(Query); + MWEB unmweb = new MWEB(); + DbCommand cmd = Query.NewCommand(); + + // 取出今年 + cmd.CommandText = @"select * from RYER where RYENO=@RYENO AND RYYER=@RYYER"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "RYENO", ryeno); + Query.AddParam(cmd, "RYYER", ryyer); + var thisYear = Query.Select(cmd); + + if (thisYear.Rows.Count <= 0) + { + throw new Exception("找不到可結算的資料"); + } + + var thisRecord = thisYear.Rows[0]; + if (GetInt32Value(thisRecord["RYNXT"]) + GetInt32Value(thisRecord["RYSLY"]) != Get可用特休(ryeno, ryyer, 12, 31)) + { + throw new Exception("折算薪資時數 + 遞延下年時數 應等於 本年未休時數"); + } + + // 計算下年時數 + + // 取得派駐專案 + var project = rasnDao.SelectRecentByDate(ryeno, new DateTime(ryyer, 12, 01)); + var rapyn = GetStringValue(project.Rows[0]["RAPYN"]); + // 取得派駐專案的年初特休計算方式 + var alt = bpaaDao.GetYearBeginAnnualLeaveType(rapyn); + + // 年初時數 + var ryyst = 0; + if (alt == "S") + { + ryyst = GetInt32Value(thisRecord["RYYST"]); + for (int m = 1; m <= 12; m++) + { + var ryhmm = GetInt32Value(thisRecord[string.Format("RYH{0:D2}", m)]); + ryyst += ryhmm > 0 ? ryhmm : 0; + } + } + + var ryyxt = GetInt32Value(thisRecord["RYNXT"]); // 遞延下年時數 + var rysly = GetInt32Value(thisRecord["RYSLY"]); // 結算薪資時數 + + // 若未輸入離職日期 + var bpsnDao = new BpsnDAC(Query); + var bpedy = bpsnDao.GetBPEDY(ryeno); + if (bpedy.Ticks == 0) + { + if (!CheckExists(ryeno, ryyer + 1)) + { + cmd.CommandText = + @"INSERT INTO RYER + (TRDAT, TRMOD, TRUSR, RYENO, RYYER, RYTOT, RYUST, RYYST, + RYH01, RYH02, RYH03, RYH04, RYH05, RYH06, RYH07, RYH08, RYH09, RYH10, RYH11, RYH12, + RYD01, RYD02, RYD03, RYD04, RYD05, RYD06, RYD07, RYD08, RYD09, RYD10, RYD11, RYD12, + RYSLY, RYNXT, RYRMK, RYYXT + ) + VALUES + (GETDATE(), 'INSERT', @TRUSR, @RYENO, @RYYER, @RYTOT, 0, @RYYST, + @RYH01, @RYH02, @RYH03, @RYH04, @RYH05, @RYH06, @RYH07, @RYH08, @RYH09, @RYH10, @RYH11, @RYH12, + @RYD01, @RYD02, @RYD03, @RYD04, @RYD05, @RYD06, @RYD07, @RYD08, @RYD09, @RYD10, @RYD11, @RYD12, + @RYSLY, @RYNXT, @RYRMK, @RYYXT + )"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "TRUSR", trusr); + Query.AddParam(cmd, "RYENO", ryeno); + Query.AddParam(cmd, "RYYER", ryyer + 1); + Query.AddParam(cmd, "RYTOT", ryyst); + Query.AddParam(cmd, "RYYST", ryyst); + Query.AddParam(cmd, "RYH01", 0); + Query.AddParam(cmd, "RYH02", 0); + Query.AddParam(cmd, "RYH03", 0); + Query.AddParam(cmd, "RYH04", 0); + Query.AddParam(cmd, "RYH05", 0); + Query.AddParam(cmd, "RYH06", 0); + Query.AddParam(cmd, "RYH07", 0); + Query.AddParam(cmd, "RYH08", 0); + Query.AddParam(cmd, "RYH09", 0); + Query.AddParam(cmd, "RYH10", 0); + Query.AddParam(cmd, "RYH11", 0); + Query.AddParam(cmd, "RYH12", 0); + Query.AddParam(cmd, "RYD01", 1); + Query.AddParam(cmd, "RYD02", 1); + Query.AddParam(cmd, "RYD03", 1); + Query.AddParam(cmd, "RYD04", 1); + Query.AddParam(cmd, "RYD05", 1); + Query.AddParam(cmd, "RYD06", 1); + Query.AddParam(cmd, "RYD07", 1); + Query.AddParam(cmd, "RYD08", 1); + Query.AddParam(cmd, "RYD09", 1); + Query.AddParam(cmd, "RYD10", 1); + Query.AddParam(cmd, "RYD11", 1); + Query.AddParam(cmd, "RYD12", 1); + Query.AddParam(cmd, "RYSLY", 0); + Query.AddParam(cmd, "RYNXT", 0); + Query.AddParam(cmd, "RYRMK", ""); + Query.AddParam(cmd, "RYYXT", ryyxt); + Query.ExecuteNonQuery(cmd); + } + else + { + cmd.CommandText = + @"UPDATE RYER + SET TRDAT = GETDATE() , + TRMOD = 'UPDATE' , + TRUSR = @TRUSR , + RYTOT = @RYTOT , + RYYST = @RYYST , + RYSLY = @RYSLY , + RYNXT = @RYNXT , + RYYXT = @RYYXT + WHERE RYENO = @OLD_RYENO + AND RYYER = @OLD_RYYER"; + cmd.Parameters.Clear(); + Query.AddParam(cmd, "TRUSR", trusr); + Query.AddParam(cmd, "RYTOT", ryyst); + Query.AddParam(cmd, "RYYST", ryyst); + Query.AddParam(cmd, "RYSLY", 0); + Query.AddParam(cmd, "RYNXT", 0); + Query.AddParam(cmd, "RYYXT", ryyxt); + Query.AddParam(cmd, "OLD_RYENO", ryeno); + Query.AddParam(cmd, "OLD_RYYER", ryyer + 1); + Query.ExecuteNonQuery(cmd); + } + + var finalDate = new DateTime(ryyer, 12, 01); + + // 取得派駐專案 + project = rasnDao.SelectRecentByDate(ryeno, finalDate); + if (project.Rows.Count == 0) + { + throw new Exception("人員無派遣紀錄,無法結算"); + } + rapyn = GetStringValue(project.Rows[0]["RAPYN"]); + // 取得結算單號 + var finalREN = rsajDao.GetAnnualLeaveSalaryREN(finalDate, ryeno, rapyn); + // 若結算單號已存在,需要有權限的人員才可以執行 + if (!string.IsNullOrEmpty(finalREN) && !unmweb.CheckRight("RYER_FINAL", WRightName.Execute, UserId)) + { + throw new Exception("已經結算過,你沒有權限再次結算"); + } + + WriteAnnualLeaveSalary(ryeno, finalDate, rysly, false); + return "年度結算"; + } + // 離職日期是今年才要結算 + else if (bpedy.Year == ryyer) + { + var finalDate = new DateTime(bpedy.Year, bpedy.Month, 01); + + // 取得派駐專案 + project = rasnDao.SelectRecentByDate(ryeno, finalDate); + if (project.Rows.Count == 0) + { + throw new Exception("人員無派遣紀錄,無法結算"); + } + rapyn = GetStringValue(project.Rows[0]["RAPYN"]); + // 取得結算單號 + var finalREN = rsajDao.GetAnnualLeaveSalaryREN(finalDate, ryeno, rapyn); + // 若結算單號已存在,需要有權限的人員才可以執行 + if (!string.IsNullOrEmpty(finalREN) && !unmweb.CheckRight("RYER_FINAL", WRightName.Execute, UserId)) + { + throw new Exception("已經結算過,你沒有權限再次結算"); + } + + WriteAnnualLeaveSalary(ryeno, finalDate, rysly, true); + return "離職結算"; + } + // + throw new Exception("離職日期年度不是本年,不予結算"); + } + + /// + /// 寫入特休薪資結算 + /// + /// 人員編號 + /// 結算日期 + /// 結算時數 + /// 是否離職 + internal void WriteAnnualLeaveSalary(string ryeno, DateTime date, int rysly, bool isQuit) + { + var rasnDao = new RasnDAC(Query); + var rsajDao = new RsajDAC(Query); + GetData getData = new GetData(); + Calculate calc = new Calculate(); + getData.Query = Query; + + // 取得派駐專案 + var project = rasnDao.SelectRecentByDate(ryeno, date); + if (project.Rows.Count == 0) + { + throw new Exception("人員無派遣紀錄,無法結算"); + } + var rapyn = GetStringValue(project.Rows[0]["RAPYN"]); + + // 取得月薪 + // 取得計算公式 + int bpsrm; // 月薪 + int bpp02; // 伙食津貼 + double dumm1; // 前二加班比率 + double dumm2; // 後二加班比率 + double dumm3; // 假日加班比率 + string bpovr; // 加班費公式 + string dumm4; // 請假扣款公式 + string dumm5; // 加班費計算方式 + // 取得月薪、伙食津貼、前二加班比率、後二加班比率、假日加班比率、加班費公式、請假扣款公式 + getData.GetRASN_Date_Bppyn_Bpeno_Overwork_Rate( + date, rapyn, ryeno, out bpsrm, out bpp02, out dumm1, out dumm2, out dumm3, out bpovr, out dumm4, out dumm5); + + // 計算特休薪資 + var rsamt = GetInt32Value(Math.Truncate(calc.CalcOverTime(bpsrm, bpp02, rysly, 1.0, 1.0, bpovr))); + + // 寫入離職當月薪資加減項 + var rsdoc = isQuit + ? string.Format("{0}離職特休結算{1}小時", date.ToString("yyyyMMdd", WGuard1.TaiwanCulture), (int)(rysly / 60)) + : string.Format("{0}年度特休結算{1}小時", date.ToString("yyyy", WGuard1.TaiwanCulture), (int)(rysly / 60)); + var rsajRen = rsajDao.WriteAnnualLeaveSalary(date, ryeno, rapyn, rsamt, rsdoc); + } + +} + +public class RyerSaveItem +{ + public int result; + public string message; + public string userid; + public string ryeno; + public int ryyer; + public int? ryyst; + public int? ryyst_h; + public int? ryyst_m; + public int ryyxt; + public string ryyxt_d; + public int ryh01; + public int ryh02; + public int ryh03; + public int ryh04; + public int ryh05; + public int ryh06; + public int ryh07; + public int ryh08; + public int ryh09; + public int ryh10; + public int ryh11; + public int ryh12; + public int ryd01; + public int ryd02; + public int ryd03; + public int ryd04; + public int ryd05; + public int ryd06; + public int ryd07; + public int ryd08; + public int ryd09; + public int ryd10; + public int ryd11; + public int ryd12; + public int? rysly; + public int? rysly_h; + public int? rysly_m; + public int? rynxt; + public int? rynxt_h; + public int? rynxt_m; + public string ryrmk; + public string ryvld; + public string ryust; + public string rylft; + public string ryeny; + public int rymmy; + public int ryslq; + public string ryenq; + public int rymmq; +} \ No newline at end of file diff --git a/Web/App_Code/DAC/SsmsDAC.cs b/Web/App_Code/DAC/SsmsDAC.cs new file mode 100644 index 0000000..6628c7c --- /dev/null +++ b/Web/App_Code/DAC/SsmsDAC.cs @@ -0,0 +1,1020 @@ +using System; +using System.Data; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Data.SqlClient; + +public class SsmsDAC : Wellan.Data.WDAC +{ + private DbCommand cmdSelectSSMS; + private DbCommand cmdInsertSSMS; + private DbCommand cmdUpdateSSMS; + private DbCommand cmdDeleteSSMS; + private DbCommand cmdDeleteOneSSMS; + private string _trusr = "X001"; + + public SsmsDAC() + { + cmdSelectSSMS = Query.NewCommand( + @"SELECT + SSYMM, SSENO, SSNUM, SSPYN, SSITM, SSJNO, SSCNO, SSBRH, SSD01, SSD02, SSSRD, + SSP00, SSP01, SSP02, SSP03, SSP04, SSP05, SSP06, SSP07, SSP08, SSP09, SSP10, + SSP11, SSP12, SSP13, SSP14, SSP15, SSP99, SSS01, SSS02, SSS03, SSS04, SSS05, + SSS06, SSS07, SSS08, SSS09, SSS10, SSS11, SSS12, SSS13, SSS14, SSS15, SSS99, + SSH01, SSH02, SSH03, SSH04, SSH05, SSH06, SSH07, SSH08, SSH09, SSH10, SST01, + SST02, SST03, SST04, SST05, SST06, SST07, SST08, SST09, SST10, SST11, SST12, + SST13, SST14, SST15, SST16, SST17, SST18, SST19, SST20, SST21, SST22, SST13, + SST14, SST15, SSL01, SSL02, SSL03, SSL04, SSL05, SSC01, SSC02, SSC03, SSC04, + SSC05, SSC06, SSC07, SSC08, SSC09, SSC10 + FROM dbo.SSMS + WHERE SSYMM=@SSYMM + AND SSENO=@SSENO + AND SSPYN=@SSPYN + AND SSITM=@SSITM"); + cmdSelectSSMS.Parameters.Add(Query.NewParameter("SSYMM", DbType.DateTime)); + cmdSelectSSMS.Parameters.Add(Query.NewParameter("SSENO", DbType.String)); + cmdSelectSSMS.Parameters.Add(Query.NewParameter("SSPYN", DbType.String)); + cmdSelectSSMS.Parameters.Add(Query.NewParameter("SSITM", DbType.String)); + + cmdInsertSSMS = Query.NewCommand( + @"INSERT INTO dbo.SSMS + (SSYMM, SSENO, SSNUM, SSPYN, SSITM, SSJNO, SSCNO, SSBRH, SSD01, SSD02, SSSRD, + SSP00, SSP01, SSP02, SSP03, SSP04, SSP05, SSP06, SSP07, SSP08, SSP09, SSP10, + SSP11, SSP12, SSP13, SSP14, SSP15, SSP99, SSS01, SSS02, SSS03, SSS04, SSS05, + SSS06, SSS07, SSS08, SSS09, SSS10, SSS11, SSS12, SSS13, SSS14, SSS15, SSS99, + SSH01, SSH02, SSH03, SSH04, SSH05, SSH06, SSH07, SSH08, SSH09, SSH10, SST01, + SST02, SST03, SST04, SST05, SST06, SST07, SST08, SST09, SST10, SST11, SST12, + SST13, SST14, SST15, SST16, SST17, SST18, SST19, SST20, SST21, SST22, SST23, + SST24, SST25, SSL01, SSL02, SSL03, SSL04, SSL05, SSC01, SSC02, SSC03, SSC04, + SSC05, SSC06, SSC07, SSC08, SSC09, SSC10, TRDAT, TRMOD, TRUSR) + VALUES + (@SSYMM, @SSENO, @SSNUM, @SSPYN, @SSITM, @SSJNO, @SSCNO, @SSBRH, @SSD01, @SSD02, @SSSRD, + @SSP00, @SSP01, @SSP02, @SSP03, @SSP04, @SSP05, @SSP06, @SSP07, @SSP08, @SSP09, @SSP10, + @SSP11, @SSP12, @SSP13, @SSP14, @SSP15, @SSP99, @SSS01, @SSS02, @SSS03, @SSS04, @SSS05, + @SSS06, @SSS07, @SSS08, @SSS09, @SSS10, @SSS11, @SSS12, @SSS13, @SSS14, @SSS15, @SSS99, + @SSH01, @SSH02, @SSH03, @SSH04, @SSH05, @SSH06, @SSH07, @SSH08, @SSH09, @SSH10, @SST01, + @SST02, @SST03, @SST04, @SST05, @SST06, @SST07, @SST08, @SST09, @SST10, @SST11, @SST12, + @SST13, @SST14, @SST15, @SST16, @SST17, @SST18, @SST19, @SST20, @SST21, @SST22, @SST23, + @SST24, @SST25, @SSL01, @SSL02, @SSL03, @SSL04, @SSL05, @SSC01, @SSC02, @SSC03, @SSC04, + @SSC05, @SSC06, @SSC07, @SSC08, @SSC09, @SSC10, GETDATE(), 'INSERT', @TRUSR)"); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSYMM", DbType.DateTime)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSENO", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSNUM", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSPYN", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSITM", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSJNO", DbType.AnsiString)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSCNO", DbType.AnsiString)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSBRH", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSD01", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSD02", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSSRD", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP00", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP01", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP02", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP03", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP04", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP05", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP06", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP07", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP08", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP09", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP10", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP11", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP12", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP13", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP14", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP15", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSP99", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS01", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS02", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS03", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS04", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS05", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS06", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS07", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS08", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS09", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS10", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS11", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS12", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS13", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS14", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS15", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSS99", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSH01", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSH02", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSH03", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSH04", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSH05", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSH06", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSH07", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSH08", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSH09", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSH10", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST01", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST02", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST03", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST04", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST05", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST06", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST07", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST08", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST09", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST10", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST11", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST12", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST13", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST14", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST15", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST16", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST17", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST18", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST19", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST20", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST21", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST22", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST23", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST24", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SST25", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSL01", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSL02", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSL03", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSL04", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSL05", DbType.Int32)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSC01", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSC02", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSC03", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSC04", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSC05", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSC06", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSC07", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSC08", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSC09", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("SSC10", DbType.String)); + cmdInsertSSMS.Parameters.Add(Query.NewParameter("TRUSR", DbType.String)); + + cmdUpdateSSMS = Query.NewCommand( + @"UPDATE dbo.SSMS SET + SSNUM=@SSNUM, SSJNO=@SSJNO, + SSCNO=@SSCNO, SSBRH=@SSBRH, SSD01=@SSD01, SSD02=@SSD02, SSSRD=@SSSRD, + SSP00=@SSP00, SSP01=@SSP01, SSP02=@SSP02, SSP03=@SSP03, SSP04=@SSP04, + SSP05=@SSP05, SSP06=@SSP06, SSP07=@SSP07, SSP08=@SSP08, SSP09=@SSP09, + SSP10=@SSP10, SSP11=@SSP11, SSP12=@SSP12, SSP13=@SSP13, SSP14=@SSP14, + SSP15=@SSP15, SSP99=@SSP99, SSS01=@SSS01, SSS02=@SSS02, SSS03=@SSS03, + SSS04=@SSS04, SSS05=@SSS05, SSS06=@SSS06, SSS07=@SSS07, SSS08=@SSS08, + SSS09=@SSS09, SSS10=@SSS10, SSS11=@SSS11, SSS12=@SSS12, SSS13=@SSS13, + SSS14=@SSS14, SSS15=@SSS15, SSS99=@SSS99, SSH01=@SSH01, SSH02=@SSH02, + SSH03=@SSH03, SSH04=@SSH04, SSH05=@SSH05, SSH06=@SSH06, SSH07=@SSH07, + SSH08=@SSH08, SSH09=@SSH09, SSH10=@SSH10, SST01=@SST01, SST02=@SST02, + SST03=@SST03, SST04=@SST04, SST05=@SST05, SST06=@SST06, SST07=@SST07, + SST08=@SST08, SST09=@SST09, SST10=@SST10, SST11=@SST11, SST12=@SST12, + SST13=@SST13, SST14=@SST14, SST15=@SST15, SST16=@SST16, SST17=@SST17, + SST18=@SST18, SST19=@SST19, SST20=@SST20, SST21=@SST21, SST22=@SST22, + SST23=@SST23, SST24=@SST24, SST25=@SST25, SSL01=@SSL01, SSL02=@SSL02, + SSL03=@SSL03, SSL04=@SSL04, SSL05=@SSL05, SSC01=@SSC01, SSC02=@SSC02, + SSC03=@SSC03, SSC04=@SSC04, SSC05=@SSC05, SSC06=@SSC06, SSC07=@SSC07, + SSC08=@SSC08, SSC09=@SSC09, SSC10=@SSC10, TRDAT=GETDATE(), TRMOD='UPDATE', + TRUSR=@TRUSR + WHERE SSYMM=@OLD_SSYMM + AND SSENO=@OLD_SSENO + AND SSPYN=@OLD_SSPYN + AND SSITM=@OLD_SSITM"); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSNUM", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSJNO", DbType.AnsiString)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSCNO", DbType.AnsiString)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSBRH", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSD01", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSD02", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSSRD", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP00", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP01", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP02", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP03", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP04", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP05", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP06", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP07", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP08", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP09", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP10", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP11", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP12", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP13", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP14", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP15", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSP99", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS01", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS02", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS03", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS04", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS05", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS06", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS07", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS08", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS09", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS10", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS11", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS12", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS13", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS14", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS15", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSS99", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSH01", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSH02", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSH03", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSH04", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSH05", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSH06", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSH07", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSH08", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSH09", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSH10", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST01", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST02", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST03", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST04", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST05", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST06", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST07", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST08", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST09", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST10", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST11", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST12", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST13", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST14", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST15", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST16", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST17", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST18", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST19", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST20", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST21", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST22", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST23", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST24", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SST25", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSL01", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSL02", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSL03", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSL04", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSL05", DbType.Int32)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSC01", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSC02", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSC03", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSC04", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSC05", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSC06", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSC07", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSC08", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSC09", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("SSC10", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("TRUSR", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("OLD_SSYMM", DbType.DateTime)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("OLD_SSENO", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("OLD_SSPYN", DbType.String)); + cmdUpdateSSMS.Parameters.Add(Query.NewParameter("OLD_SSITM", DbType.String)); + + cmdDeleteSSMS = Query.NewCommand( + @"DELETE FROM SSMS WHERE SSYMM=@SSYMM AND SSPYN=@SSPYN"); + cmdDeleteSSMS.Parameters.Add(Query.NewParameter("SSYMM", DbType.DateTime)); + cmdDeleteSSMS.Parameters.Add(Query.NewParameter("SSPYN", DbType.String)); + + cmdDeleteOneSSMS = Query.NewCommand( + @"DELETE FROM SSMS WHERE SSYMM=@SSYMM AND SSENO=@SSENO AND SSPYN=@SSPYN"); + cmdDeleteOneSSMS.Parameters.Add(Query.NewParameter("SSYMM", DbType.DateTime)); + cmdDeleteOneSSMS.Parameters.Add(Query.NewParameter("SSENO", DbType.String)); + cmdDeleteOneSSMS.Parameters.Add(Query.NewParameter("SSPYN", DbType.String)); + cmdDeleteOneSSMS.Parameters.Add(Query.NewParameter("SSITM", DbType.String)); + } + + public SsmsDAC(WQuery Query) + : this() + { + this._query = Query; + } + + public string TRUSR + { + get + { + return _trusr; + } + set + { + _trusr = value; + } + } + + public void InsertOne(DbTransaction tran, SsmsRecord newRecord) + { + if (tran != null) + { + cmdInsertSSMS.Connection = tran.Connection; + cmdInsertSSMS.Transaction = tran; + } + else if (_query != null) + { + cmdInsertSSMS.Connection = _query.NewConnection(); + } + else + { + return; + } + + cmdInsertSSMS.Parameters["SSYMM"].Value = newRecord.SSYMM; // 薪資月份 + cmdInsertSSMS.Parameters["SSENO"].Value = newRecord.SSENO; // 人員編號 + cmdInsertSSMS.Parameters["SSNUM"].Value = newRecord.SSNUM; // 客戶編號 + cmdInsertSSMS.Parameters["SSPYN"].Value = newRecord.SSPYN; // 專案年度編號 + cmdInsertSSMS.Parameters["SSITM"].Value = // 項次 + WGuard1.WNextRen(newRecord.SSYMM, "SSMS", "SSITM", "<999>", + String.Format("SSYMM='{0:s}' AND SSENO='{1:s}' AND SSPYN='{2:s}'", + newRecord.SSYMM.ToString("yyyy/MM/dd", WGuard1.InvariantCulture), + newRecord.SSENO, + newRecord.SSPYN), + tran); + cmdInsertSSMS.Parameters["SSJNO"].Value = newRecord.SSJNO; // 職稱 + cmdInsertSSMS.Parameters["SSCNO"].Value = newRecord.SSCNO; // 等級 + cmdInsertSSMS.Parameters["SSBRH"].Value = newRecord.SSBRH; // 站別 + cmdInsertSSMS.Parameters["SSD01"].Value = newRecord.SSD01; // 到職天數 + cmdInsertSSMS.Parameters["SSD02"].Value = newRecord.SSD02; // 勞保到職天數 + cmdInsertSSMS.Parameters["SSSRD"].Value = newRecord.SSSRD; // 時薪 + cmdInsertSSMS.Parameters["SSP00"].Value = newRecord.SSP00; // 本薪 + cmdInsertSSMS.Parameters["SSP01"].Value = newRecord.SSP01; // 全勤獎金 + cmdInsertSSMS.Parameters["SSP02"].Value = newRecord.SSP02; // 伙食津貼 + cmdInsertSSMS.Parameters["SSP03"].Value = newRecord.SSP03; // 職務加給 + cmdInsertSSMS.Parameters["SSP04"].Value = newRecord.SSP04; // 派駐津貼 + cmdInsertSSMS.Parameters["SSP05"].Value = newRecord.SSP05; // 其他津貼 + cmdInsertSSMS.Parameters["SSP06"].Value = newRecord.SSP06; // 前二加班 + cmdInsertSSMS.Parameters["SSP07"].Value = newRecord.SSP07; // 後二加班 + cmdInsertSSMS.Parameters["SSP08"].Value = newRecord.SSP08; // 假日加班 + cmdInsertSSMS.Parameters["SSP09"].Value = newRecord.SSP09; // 短差 + cmdInsertSSMS.Parameters["SSP10"].Value = newRecord.SSP10; // 長差 + cmdInsertSSMS.Parameters["SSP11"].Value = newRecord.SSP11; // 電話費 + cmdInsertSSMS.Parameters["SSP12"].Value = newRecord.SSP12; // 油料費 + cmdInsertSSMS.Parameters["SSP13"].Value = newRecord.SSP13; // 獎金 + cmdInsertSSMS.Parameters["SSP14"].Value = newRecord.SSP14; // 加項14 + cmdInsertSSMS.Parameters["SSP15"].Value = newRecord.SSP15; // 加項15 + cmdInsertSSMS.Parameters["SSP99"].Value = newRecord.SSP99; // 其他加項 + cmdInsertSSMS.Parameters["SSS01"].Value = newRecord.SSS01; // 病假扣款 + cmdInsertSSMS.Parameters["SSS02"].Value = newRecord.SSS02; // 事假扣款 + cmdInsertSSMS.Parameters["SSS03"].Value = newRecord.SSS03; // 所得稅 + cmdInsertSSMS.Parameters["SSS04"].Value = newRecord.SSS04; // 勞保費 + cmdInsertSSMS.Parameters["SSS05"].Value = newRecord.SSS05; // 健保費 + cmdInsertSSMS.Parameters["SSS06"].Value = newRecord.SSS06; // 勞退自提 + cmdInsertSSMS.Parameters["SSS07"].Value = newRecord.SSS07; // 福利金 + cmdInsertSSMS.Parameters["SSS08"].Value = newRecord.SSS08; // 減項08 + cmdInsertSSMS.Parameters["SSS09"].Value = newRecord.SSS09; // 減項09 + cmdInsertSSMS.Parameters["SSS10"].Value = newRecord.SSS10; // 減項10 + cmdInsertSSMS.Parameters["SSS11"].Value = newRecord.SSS11; // 減項11 + cmdInsertSSMS.Parameters["SSS12"].Value = newRecord.SSS12; // 減項12 + cmdInsertSSMS.Parameters["SSS13"].Value = newRecord.SSS13; // 減項13 + cmdInsertSSMS.Parameters["SSS14"].Value = newRecord.SSS14; // 減項14 + cmdInsertSSMS.Parameters["SSS15"].Value = newRecord.SSS15; // 減項15 + cmdInsertSSMS.Parameters["SSS99"].Value = newRecord.SSS99; // 其他減項 + cmdInsertSSMS.Parameters["SSH01"].Value = newRecord.SSH01; // 雇主勞保費 + cmdInsertSSMS.Parameters["SSH02"].Value = newRecord.SSH02; // 職災保險 + cmdInsertSSMS.Parameters["SSH03"].Value = newRecord.SSH03; // 就業保險 + cmdInsertSSMS.Parameters["SSH04"].Value = newRecord.SSH04; // 工資墊償 + cmdInsertSSMS.Parameters["SSH05"].Value = newRecord.SSH05; // 雇主健保費 + cmdInsertSSMS.Parameters["SSH06"].Value = newRecord.SSH06; // 勞退提撥 + cmdInsertSSMS.Parameters["SSH07"].Value = newRecord.SSH07; // 雇主07 + cmdInsertSSMS.Parameters["SSH08"].Value = newRecord.SSH08; // 雇主08 + cmdInsertSSMS.Parameters["SSH09"].Value = newRecord.SSH09; // 雇主09 + cmdInsertSSMS.Parameters["SSH10"].Value = newRecord.SSH10; // 雇主10 + cmdInsertSSMS.Parameters["SST01"].Value = newRecord.SST01; // 前二加班時數 + cmdInsertSSMS.Parameters["SST02"].Value = newRecord.SST02; // 後二加班時數 + cmdInsertSSMS.Parameters["SST03"].Value = newRecord.SST03; // 假日加班時數 + cmdInsertSSMS.Parameters["SST04"].Value = newRecord.SST04; // 累積補休時數 + cmdInsertSSMS.Parameters["SST05"].Value = newRecord.SST05; // 補休時數 + cmdInsertSSMS.Parameters["SST06"].Value = newRecord.SST06; // 特休時數 + cmdInsertSSMS.Parameters["SST07"].Value = newRecord.SST07; // 事假時數 + cmdInsertSSMS.Parameters["SST08"].Value = newRecord.SST08; // 病假時數 + cmdInsertSSMS.Parameters["SST09"].Value = newRecord.SST09; // 喪假時數 + cmdInsertSSMS.Parameters["SST10"].Value = newRecord.SST10; // 產假時數 + cmdInsertSSMS.Parameters["SST11"].Value = newRecord.SST11; // 婚假時數 + cmdInsertSSMS.Parameters["SST12"].Value = newRecord.SST12; // 陪產假時數 + cmdInsertSSMS.Parameters["SST13"].Value = newRecord.SST13; // 公假時數 + cmdInsertSSMS.Parameters["SST14"].Value = newRecord.SST14; // 公傷假時數 + cmdInsertSSMS.Parameters["SST15"].Value = newRecord.SST15; // 生理假時數 + cmdInsertSSMS.Parameters["SST16"].Value = newRecord.SST16; // 家庭照顧假時數 + cmdInsertSSMS.Parameters["SST17"].Value = newRecord.SST17; // 育嬰假時數 + cmdInsertSSMS.Parameters["SST18"].Value = newRecord.SST18; // 時數18 + cmdInsertSSMS.Parameters["SST19"].Value = newRecord.SST19; // 時數19 + cmdInsertSSMS.Parameters["SST20"].Value = newRecord.SST20; // 時數20 + cmdInsertSSMS.Parameters["SST21"].Value = newRecord.SST21; // 時數21 + cmdInsertSSMS.Parameters["SST22"].Value = newRecord.SST22; // 時數22 + cmdInsertSSMS.Parameters["SST23"].Value = newRecord.SST23; // 時數23 + cmdInsertSSMS.Parameters["SST24"].Value = newRecord.SST24; // 時數24 + cmdInsertSSMS.Parameters["SST25"].Value = newRecord.SST25; // 時數25 + cmdInsertSSMS.Parameters["SSL01"].Value = newRecord.SSL01; // 勞保投保等級 + cmdInsertSSMS.Parameters["SSL02"].Value = newRecord.SSL02; // 健保投保等級 + cmdInsertSSMS.Parameters["SSL03"].Value = newRecord.SSL03; // 勞退提撥等級 + cmdInsertSSMS.Parameters["SSL04"].Value = newRecord.SSL04; // 等級04 + cmdInsertSSMS.Parameters["SSL05"].Value = newRecord.SSL05; // 等級05 + cmdInsertSSMS.Parameters["SSC01"].Value = newRecord.SSC01; // 請假備註 + cmdInsertSSMS.Parameters["SSC02"].Value = newRecord.SSC02; // 加班備註 + cmdInsertSSMS.Parameters["SSC03"].Value = newRecord.SSC03; // 電話費備註 + cmdInsertSSMS.Parameters["SSC04"].Value = newRecord.SSC04; // 油料費備註 + cmdInsertSSMS.Parameters["SSC05"].Value = newRecord.SSC05; // 差勤備註 + cmdInsertSSMS.Parameters["SSC06"].Value = newRecord.SSC06; // 薪資加減備註 + cmdInsertSSMS.Parameters["SSC07"].Value = newRecord.SSC07; // 備註07 + cmdInsertSSMS.Parameters["SSC08"].Value = newRecord.SSC08; // 備註08 + cmdInsertSSMS.Parameters["SSC09"].Value = newRecord.SSC09; // 備註09 + cmdInsertSSMS.Parameters["SSC10"].Value = newRecord.SSC10; // 備註10 + cmdInsertSSMS.Parameters["TRUSR"].Value = _trusr; + cmdInsertSSMS.ExecuteNonQuery(); + } + + public void UpdateOne(DbTransaction tran, SsmsRecord record) + { + if (tran != null) + { + cmdUpdateSSMS.Connection = tran.Connection; + cmdUpdateSSMS.Transaction = tran; + } + else if (_query != null) + { + cmdUpdateSSMS.Connection = _query.NewConnection(); + } + else + { + return; + } + + cmdUpdateSSMS.Parameters["OLD_SSYMM"].Value = record.SSYMM; // 薪資月份 + cmdUpdateSSMS.Parameters["OLD_SSENO"].Value = record.SSENO; // 人員編號 + cmdUpdateSSMS.Parameters["OLD_SSPYN"].Value = record.SSPYN; // 專案年度編號 + cmdUpdateSSMS.Parameters["OLD_SSITM"].Value = record.SSITM; // 項次 + cmdUpdateSSMS.Parameters["SSNUM"].Value = record.SSNUM; // 客戶編號 + cmdUpdateSSMS.Parameters["SSJNO"].Value = record.SSJNO; // 職稱 + cmdUpdateSSMS.Parameters["SSCNO"].Value = record.SSCNO; // 等級 + cmdUpdateSSMS.Parameters["SSBRH"].Value = record.SSBRH; // 站別 + cmdUpdateSSMS.Parameters["SSD01"].Value = record.SSD01; // 到職天數 + cmdUpdateSSMS.Parameters["SSD02"].Value = record.SSD02; // 勞保到職天數 + cmdUpdateSSMS.Parameters["SSSRD"].Value = record.SSSRD; // 時薪 + cmdUpdateSSMS.Parameters["SSP00"].Value = record.SSP00; // 本薪 + cmdUpdateSSMS.Parameters["SSP01"].Value = record.SSP01; // 全勤獎金 + cmdUpdateSSMS.Parameters["SSP02"].Value = record.SSP02; // 伙食津貼 + cmdUpdateSSMS.Parameters["SSP03"].Value = record.SSP03; // 職務加給 + cmdUpdateSSMS.Parameters["SSP04"].Value = record.SSP04; // 派駐津貼 + cmdUpdateSSMS.Parameters["SSP05"].Value = record.SSP05; // 其他津貼 + cmdUpdateSSMS.Parameters["SSP06"].Value = record.SSP06; // 前二加班 + cmdUpdateSSMS.Parameters["SSP07"].Value = record.SSP07; // 後二加班 + cmdUpdateSSMS.Parameters["SSP08"].Value = record.SSP08; // 假日加班 + cmdUpdateSSMS.Parameters["SSP09"].Value = record.SSP09; // 短差 + cmdUpdateSSMS.Parameters["SSP10"].Value = record.SSP10; // 長差 + cmdUpdateSSMS.Parameters["SSP11"].Value = record.SSP11; // 電話費 + cmdUpdateSSMS.Parameters["SSP12"].Value = record.SSP12; // 油料費 + cmdUpdateSSMS.Parameters["SSP13"].Value = record.SSP13; // 加項13 + cmdUpdateSSMS.Parameters["SSP14"].Value = record.SSP14; // 加項14 + cmdUpdateSSMS.Parameters["SSP15"].Value = record.SSP15; // 加項15 + cmdUpdateSSMS.Parameters["SSP99"].Value = record.SSP99; // 其他加項 + cmdUpdateSSMS.Parameters["SSS01"].Value = record.SSS01; // 病假扣款 + cmdUpdateSSMS.Parameters["SSS02"].Value = record.SSS02; // 事假扣款 + cmdUpdateSSMS.Parameters["SSS03"].Value = record.SSS03; // 所得稅 + cmdUpdateSSMS.Parameters["SSS04"].Value = record.SSS04; // 勞保費 + cmdUpdateSSMS.Parameters["SSS05"].Value = record.SSS05; // 健保費 + cmdUpdateSSMS.Parameters["SSS06"].Value = record.SSS06; // 勞退自提 + cmdUpdateSSMS.Parameters["SSS07"].Value = record.SSS07; // 福利金 + cmdUpdateSSMS.Parameters["SSS08"].Value = record.SSS08; // 減項08 + cmdUpdateSSMS.Parameters["SSS09"].Value = record.SSS09; // 減項09 + cmdUpdateSSMS.Parameters["SSS10"].Value = record.SSS10; // 減項10 + cmdUpdateSSMS.Parameters["SSS11"].Value = record.SSS11; // 減項11 + cmdUpdateSSMS.Parameters["SSS12"].Value = record.SSS12; // 減項12 + cmdUpdateSSMS.Parameters["SSS13"].Value = record.SSS13; // 減項13 + cmdUpdateSSMS.Parameters["SSS14"].Value = record.SSS14; // 減項14 + cmdUpdateSSMS.Parameters["SSS15"].Value = record.SSS15; // 減項15 + cmdUpdateSSMS.Parameters["SSS99"].Value = record.SSS99; // 其他減項 + cmdUpdateSSMS.Parameters["SSH01"].Value = record.SSH01; // 雇主勞保費 + cmdUpdateSSMS.Parameters["SSH02"].Value = record.SSH02; // 職災保險 + cmdUpdateSSMS.Parameters["SSH03"].Value = record.SSH03; // 就業保險 + cmdUpdateSSMS.Parameters["SSH04"].Value = record.SSH04; // 工資墊償 + cmdUpdateSSMS.Parameters["SSH05"].Value = record.SSH05; // 雇主健保費 + cmdUpdateSSMS.Parameters["SSH06"].Value = record.SSH06; // 勞退提撥 + cmdUpdateSSMS.Parameters["SSH07"].Value = record.SSH07; // 雇主07 + cmdUpdateSSMS.Parameters["SSH08"].Value = record.SSH08; // 雇主08 + cmdUpdateSSMS.Parameters["SSH09"].Value = record.SSH09; // 雇主09 + cmdUpdateSSMS.Parameters["SSH10"].Value = record.SSH10; // 雇主10 + cmdUpdateSSMS.Parameters["SST01"].Value = record.SST01; // 前二加班時數 + cmdUpdateSSMS.Parameters["SST02"].Value = record.SST02; // 後二加班時數 + cmdUpdateSSMS.Parameters["SST03"].Value = record.SST03; // 假日加班時數 + cmdUpdateSSMS.Parameters["SST04"].Value = record.SST04; // 累積補休時數 + cmdUpdateSSMS.Parameters["SST05"].Value = record.SST05; // 補休時數 + cmdUpdateSSMS.Parameters["SST06"].Value = record.SST06; // 特休時數 + cmdUpdateSSMS.Parameters["SST07"].Value = record.SST07; // 事假時數 + cmdUpdateSSMS.Parameters["SST08"].Value = record.SST08; // 病假時數 + cmdUpdateSSMS.Parameters["SST09"].Value = record.SST09; // 喪假時數 + cmdUpdateSSMS.Parameters["SST10"].Value = record.SST10; // 產假時數 + cmdUpdateSSMS.Parameters["SST11"].Value = record.SST11; // 婚假時數 + cmdUpdateSSMS.Parameters["SST12"].Value = record.SST12; // 陪產假時數 + cmdUpdateSSMS.Parameters["SST13"].Value = record.SST13; // 公假時數 + cmdUpdateSSMS.Parameters["SST14"].Value = record.SST14; // 公傷假時數 + cmdUpdateSSMS.Parameters["SST15"].Value = record.SST15; // 生理假時數 + cmdUpdateSSMS.Parameters["SST16"].Value = record.SST16; // 家庭照顧假時數 + cmdUpdateSSMS.Parameters["SST17"].Value = record.SST17; // 育嬰假時數 + cmdUpdateSSMS.Parameters["SST18"].Value = record.SST18; // 時數18 + cmdUpdateSSMS.Parameters["SST19"].Value = record.SST19; // 時數19 + cmdUpdateSSMS.Parameters["SST20"].Value = record.SST20; // 時數20 + cmdUpdateSSMS.Parameters["SST21"].Value = record.SST21; // 時數21 + cmdUpdateSSMS.Parameters["SST22"].Value = record.SST22; // 時數22 + cmdUpdateSSMS.Parameters["SST23"].Value = record.SST23; // 時數23 + cmdUpdateSSMS.Parameters["SST24"].Value = record.SST24; // 時數24 + cmdUpdateSSMS.Parameters["SST25"].Value = record.SST25; // 時數25 + cmdUpdateSSMS.Parameters["SSL01"].Value = record.SSL01; // 勞保投保等級 + cmdUpdateSSMS.Parameters["SSL02"].Value = record.SSL02; // 健保投保等級 + cmdUpdateSSMS.Parameters["SSL03"].Value = record.SSL03; // 勞退提撥等級 + cmdUpdateSSMS.Parameters["SSL04"].Value = record.SSL04; // 等級04 + cmdUpdateSSMS.Parameters["SSL05"].Value = record.SSL05; // 等級05 + cmdUpdateSSMS.Parameters["SSC01"].Value = record.SSC01; // 請假備註 + cmdUpdateSSMS.Parameters["SSC02"].Value = record.SSC02; // 加班備註 + cmdUpdateSSMS.Parameters["SSC03"].Value = record.SSC03; // 電話費備註 + cmdUpdateSSMS.Parameters["SSC04"].Value = record.SSC04; // 油料費備註 + cmdUpdateSSMS.Parameters["SSC05"].Value = record.SSC05; // 差勤備註 + cmdUpdateSSMS.Parameters["SSC06"].Value = record.SSC06; // 薪資加減備註 + cmdUpdateSSMS.Parameters["SSC07"].Value = record.SSC07; // 備註07 + cmdUpdateSSMS.Parameters["SSC08"].Value = record.SSC08; // 備註08 + cmdUpdateSSMS.Parameters["SSC09"].Value = record.SSC09; // 備註09 + cmdUpdateSSMS.Parameters["SSC10"].Value = record.SSC10; // 備註10 + cmdUpdateSSMS.Parameters["TRUSR"].Value = _trusr; + cmdUpdateSSMS.ExecuteNonQuery(); + } + + public void Delete(DbTransaction tran, DateTime aYYMM, string sspyn) + { + if (tran != null) + { + cmdDeleteSSMS.Connection = tran.Connection; + cmdDeleteSSMS.Transaction = tran; + } + else if (_query != null) + { + cmdDeleteSSMS.Connection = _query.NewConnection(); + } + else + { + return; + } + + cmdDeleteSSMS.Parameters["SSYMM"].Value = aYYMM; + cmdDeleteSSMS.Parameters["SSPYN"].Value = sspyn; + cmdDeleteSSMS.ExecuteNonQuery(); + } + + public void DeleteOne(DbTransaction tran, DateTime aYYMM, string sseno, string sspyn, string ssitm) + { + if (tran != null) + { + cmdDeleteOneSSMS.Connection = tran.Connection; + cmdDeleteOneSSMS.Transaction = tran; + } + else if (_query != null) + { + cmdDeleteOneSSMS.Connection = _query.NewConnection(); + } + else + { + return; + } + + cmdDeleteOneSSMS.Parameters["SSYMM"].Value = aYYMM; + cmdDeleteOneSSMS.Parameters["SSENO"].Value = sseno; + cmdDeleteOneSSMS.Parameters["SSPYN"].Value = sspyn; + cmdDeleteOneSSMS.Parameters["SSITM"].Value = ssitm; + cmdDeleteOneSSMS.ExecuteNonQuery(); + } + + public SsmsRecord SelectOne(DbTransaction tran, DateTime aYYMM, string sseno, string sspyn, string ssitm) + { + if (tran != null) + { + cmdSelectSSMS.Connection = tran.Connection; + cmdSelectSSMS.Transaction = tran; + } + else if (_query != null) + { + cmdSelectSSMS.Connection = _query.NewConnection(); + } + else + { + return null; + } + + cmdSelectSSMS.Parameters["SSYMM"].Value = aYYMM; + cmdSelectSSMS.Parameters["SSENO"].Value = sseno; + cmdSelectSSMS.Parameters["SSPYN"].Value = sspyn; + cmdSelectSSMS.Parameters["SSITM"].Value = ssitm; + + SsmsRecord result = new SsmsRecord(); + ConnectionState oldState = cmdSelectSSMS.Connection.State; + + if (cmdSelectSSMS.Connection.State == ConnectionState.Closed) + cmdSelectSSMS.Connection.Open(); + + try + { + DbDataReader reader = cmdSelectSSMS.ExecuteReader(); + if (reader.Read()) + result.Fill(reader); + else + result = null; + reader.Close(); + } + finally + { + if (oldState == ConnectionState.Closed && cmdSelectSSMS.Connection.State == ConnectionState.Open) + cmdSelectSSMS.Connection.Close(); + } + + return result; + } +} + +public class SsmsRecord +{ + public DateTime SSYMM; + public string SSENO; + public string SSNUM; + public string SSPYN; + public string SSITM; + public string SSJNO; + public string SSCNO; + public string SSBRH; + public int SSD01; + public int SSD02; + public int SSSRD; + public int SSP00; + public int SSP01; + public int SSP02; + public int SSP03; + public int SSP04; + public int SSP05; + public int SSP06; + public int SSP07; + public int SSP08; + public int SSP09; + public int SSP10; + public int SSP11; + public int SSP12; + public int SSP13; + public int SSP14; + public int SSP15; + public int SSP99; + public int SSS01; + public int SSS02; + public int SSS03; + public int SSS04; + public int SSS05; + public int SSS06; + public int SSS07; + public int SSS08; + public int SSS09; + public int SSS10; + public int SSS11; + public int SSS12; + public int SSS13; + public int SSS14; + public int SSS15; + public int SSS99; + public int SSH01; + public int SSH02; + public int SSH03; + public int SSH04; + public int SSH05; + public int SSH06; + public int SSH07; + public int SSH08; + public int SSH09; + public int SSH10; + public int SST01; + public int SST02; + public int SST03; + public int SST04; + public int SST05; + public int SST06; + public int SST07; + public int SST08; + public int SST09; + public int SST10; + public int SST11; + public int SST12; + public int SST13; + public int SST14; + public int SST15; + public int SST16; + public int SST17; + public int SST18; + public int SST19; + public int SST20; + public int SST21; + public int SST22; + public int SST23; + public int SST24; + public int SST25; + public int SSL01; + public int SSL02; + public int SSL03; + public int SSL04; + public int SSL05; + public string SSC01; + public string SSC02; + public string SSC03; + public string SSC04; + public string SSC05; + public string SSC06; + public string SSC07; + public string SSC08; + public string SSC09; + public string SSC10; + + public SsmsRecord() + { + SSYMM = new DateTime(); + SSENO = ""; + SSNUM = ""; + SSPYN = ""; + SSITM = ""; + SSJNO = ""; + SSCNO = ""; + SSBRH = ""; + SSD01 = 0; + SSD02 = 0; + SSSRD = 0; + SSP00 = 0; + SSP01 = 0; + SSP02 = 0; + SSP03 = 0; + SSP04 = 0; + SSP05 = 0; + SSP06 = 0; + SSP07 = 0; + SSP08 = 0; + SSP09 = 0; + SSP10 = 0; + SSP11 = 0; + SSP12 = 0; + SSP13 = 0; + SSP14 = 0; + SSP15 = 0; + SSP99 = 0; + SSS01 = 0; + SSS02 = 0; + SSS03 = 0; + SSS04 = 0; + SSS05 = 0; + SSS06 = 0; + SSS07 = 0; + SSS08 = 0; + SSS09 = 0; + SSS10 = 0; + SSS11 = 0; + SSS12 = 0; + SSS13 = 0; + SSS14 = 0; + SSS15 = 0; + SSS99 = 0; + SSH01 = 0; + SSH02 = 0; + SSH03 = 0; + SSH04 = 0; + SSH05 = 0; + SSH06 = 0; + SSH07 = 0; + SSH08 = 0; + SSH09 = 0; + SSH10 = 0; + SST01 = 0; + SST02 = 0; + SST03 = 0; + SST04 = 0; + SST05 = 0; + SST06 = 0; + SST07 = 0; + SST08 = 0; + SST09 = 0; + SST10 = 0; + SST11 = 0; + SST12 = 0; + SST13 = 0; + SST14 = 0; + SST15 = 0; + SST16 = 0; + SST17 = 0; + SST18 = 0; + SST19 = 0; + SST20 = 0; + SST21 = 0; + SST22 = 0; + SST23 = 0; + SST24 = 0; + SST25 = 0; + SSL01 = 0; + SSL02 = 0; + SSL03 = 0; + SSL04 = 0; + SSL05 = 0; + SSC01 = ""; + SSC02 = ""; + SSC03 = ""; + SSC04 = ""; + SSC05 = ""; + SSC06 = ""; + SSC07 = ""; + SSC08 = ""; + SSC09 = ""; + SSC10 = ""; + } + + public void Fill(DbDataReader reader) + { + int i = 0; + SSYMM = !reader.IsDBNull(i) ? reader.GetDateTime(i) : new DateTime(); + i++; + SSENO = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSNUM = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSPYN = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSITM = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSJNO = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSCNO = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSBRH = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSD01 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSD02 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSSRD = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP00 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP01 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP02 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP03 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP04 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP05 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP06 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP07 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP08 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP09 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP10 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP11 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP12 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP13 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP14 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP15 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSP99 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS01 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS02 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS03 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS04 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS05 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS06 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS07 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS08 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS09 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS10 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS11 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS12 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS13 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS14 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS15 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSS99 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSH01 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSH02 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSH03 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSH04 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSH05 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSH06 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSH07 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSH08 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSH09 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSH10 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST01 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST02 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST03 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST04 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST05 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST06 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST07 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST08 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST09 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST10 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST11 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST12 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST13 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST14 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST15 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST16 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST17 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST18 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST19 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST20 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST21 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST22 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST23 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST24 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SST25 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSL01 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSL02 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSL03 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSL04 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSL05 = !reader.IsDBNull(i) ? reader.GetInt32(i) : 0; + i++; + SSC01 = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSC02 = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSC03 = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSC04 = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSC05 = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSC06 = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSC07 = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSC08 = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSC09 = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + i++; + SSC10 = !reader.IsDBNull(i) ? reader.GetString(i) : ""; + } +} \ No newline at end of file diff --git a/Web/App_Code/GetDataService.cs b/Web/App_Code/GetDataService.cs new file mode 100644 index 0000000..efdd832 --- /dev/null +++ b/Web/App_Code/GetDataService.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Services; +using System.Web.Script.Services; +using Newtonsoft.Json.Linq; +using Wellan.Common; +using Wellan.Data; +using System.Data; + +/// +/// GetData 的摘要描述 +/// +[WebService(Namespace = "http://tempuri.org/")] +[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] +[ScriptService] +public class GetDataService : System.Web.Services.WebService +{ + + public GetDataService() + { + } + + + [WebMethod(EnableSession = true)] + [ScriptMethod(ResponseFormat = ResponseFormat.Json)] + public GetDataResponse GetOverTimeBegin(string date, string userid) + { + DateTime aDate; + int result = -1; + string beginHour = string.Empty; + string beginMinute = string.Empty; + TimeCalc timeCalc = new TimeCalc(); + + if (WGuard1.CheckDate(date, out aDate)) + { + aDate = aDate.AddYears(WGuard1.CY11); + RcrdDAC rcrdDAC = new RcrdDAC(WGuard1.Query); + DataTable dt = rcrdDAC.ReadByDate(userid, aDate); + if (dt.Rows.Count > 0) + { + string begintime = WDAC.GetStringValue(dt.Rows[0]["RCC01"]); + + if (!string.IsNullOrEmpty(begintime)) + { + begintime = TimeCalc.加分鐘數(begintime, 540); + beginHour = begintime.Substring(0, 2); + beginMinute = begintime.Substring(3, 2); + result = 0; + } + } + } + + //JObject data = new JObject(); + //data.Add("beginhour", new JValue(beginHour)); + //data.Add("beginminute", new JValue(beginMinute)); + + return new GetDataResponse() + { + Result = result, + Data = new { beginhour = beginHour , beginminute = beginMinute } + }; + } + + [WebMethod(EnableSession = true)] + [ScriptMethod(ResponseFormat = ResponseFormat.Json)] + public GetDataResponse CheckAvailHours(string USERID, string RPPYN, string RPREN, string RPTYP, string RPRDT, string RPRTM, string RPEDT, string RPETM) + { + // 從設定檔中取得連線字串 + var ConnectionConfigName = WConfig.GetConnectionConfigName(); + WConnectionString.ConnectionConfigFile = WConfig.GetConnectionConfig(); + var ConnectionString = WConnectionString.GetConnectionString(ConnectionConfigName); + var ConnectionType = WConnectionString.GetConnectionType(ConnectionConfigName); + var Query = new WQuery(ConnectionType, ConnectionString); + WGuard1.SetQuery(ConnectionType, ConnectionString); + + DateTime rprdt, rpedt; + //if (WGuard1.CheckDate(RPRDT, out rprdt)) + //{ + // rprdt = rprdt.AddYears(WGuard1.CY11); + //} + //if (WGuard1.CheckDate(RPEDT, out rpedt)) + //{ + // rpedt = rpedt.AddYears(WGuard1.CY11); + //} + WGuard1.CheckDate(RPRDT, out rprdt); + WGuard1.CheckDate(RPEDT, out rpedt); + + #region 取剩餘時數 + var rparDao = new RparDAC(Query); + int 年度事假; + int 年度病假; + int availHours = 0; + if (int.TryParse(WGuard1.WSetR("UNRPARTIME", 5), out 年度事假)) + 年度事假 = 年度事假 * 60; + else + 年度事假 = 112 * 60; + if (int.TryParse(WGuard1.WSetR("UNRPARTIME", 6), out 年度病假)) + 年度病假 = 年度病假 * 60; + else + 年度病假 = 240 * 60; + + if (rprdt.Ticks == 0 || rpedt.Ticks == 0 || string.IsNullOrEmpty(RPRTM) || string.IsNullOrEmpty(RPETM)) + { + availHours = - 1; + } + if (RPTYP == RPAR_TYPE.T02_事假 || RPTYP == RPAR_TYPE.T0B_家庭照顧假) + { + availHours = 年度事假 - rparDao.Get已請事假(USERID, rprdt, RPREN) - new TimeCalc().計算請假總時數(USERID, rprdt, rpedt, RPRTM, RPETM, RPTYP, true); + } + if (RPTYP == RPAR_TYPE.T03_病假) + { + availHours = 年度病假 - rparDao.Get已請病假(USERID, rprdt, RPREN) - new TimeCalc().計算請假總時數(USERID, rprdt, rpedt, RPRTM, RPETM, RPTYP, true); + } + #endregion + + + #region + var bpsnDao = new BpsnDAC(Query); + var rdt_rppyn = string.Empty; + var edt_rppyn = string.Empty; + var dateMessage = new List(); + if (rprdt.Ticks > 0) + { + rdt_rppyn = bpsnDao.GetProjectByDate(USERID, rprdt); + if (RPPYN.CompareTo(rdt_rppyn) != 0) + { + dateMessage.Add(string.Format("{0}日期不在目前專案的範圍", rprdt.Ticks > 0 && rpedt.Ticks > 0 ? "開始" : "")); + } + } + if (rpedt.Ticks > 0) + { + edt_rppyn = bpsnDao.GetProjectByDate(USERID, rpedt); + if (RPPYN.CompareTo(edt_rppyn) != 0) + { + dateMessage.Add("結束日期不在目前專案的範圍"); + } + } + + + #endregion + + return new GetDataResponse() + { + Result = 0, + Data = new { + availHours = availHours, + dateMessage = dateMessage + } + }; + } +} + +public class GetDataResponse +{ + public int Result; + public object Data; + public string Message; +} \ No newline at end of file diff --git a/Web/App_Code/Module/RPAR.cs b/Web/App_Code/Module/RPAR.cs new file mode 100644 index 0000000..5ef9dda --- /dev/null +++ b/Web/App_Code/Module/RPAR.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.ComponentModel; + +/// +/// RPAR 的摘要描述 +/// +public partial class RPAR +{ + public string RPREN { get; set; } + public string RPNUM { get; set; } + public int RAITM { get; set; } + public string RPCNM { get; set; } + public string RPPYN { get; set; } + public DateTime RPRDT { get; set; } + public DateTime RPEDT { get; set; } + public string RPTYP { get; set; } + public double RPFTR { get; set; } + public string RPDOC { get; set; } + public int APPNO { get; set; } + public DateTime RPADT { get; set; } + public string RPAPN { get; set; } + public string RPANO { get; set; } + public string RPAPP { get; set; } + public DateTime RPAPD { get; set; } + public string RPAPU { get; set; } + public string RPAGT { get; set; } + public string RPAGM { get; set; } + public string RPRTM { get; set; } + public string RPETM { get; set; } + public int RPUST { get; set; } + public string RPRSN { get; set; } + public string RPPLC { get; set; } + public string RPFPC { get; set; } + public string RPFAD { get; set; } + public decimal RPKMS { get; set; } + public DateTime TRDAT { get; set; } + public string TRMOD { get; set; } + public string TRUSR { get; set; } + public int RPTCT { get; set; } + public int RPTMT { get; set; } + public int RPTC1 { get; set; } + public int RPTM1 { get; set; } + public int RPTC2 { get; set; } + public int RPTM2 { get; set; } + public int RPTC3 { get; set; } + public int RPTM3 { get; set; } + public int RPTC4 { get; set; } + public int RPTM4 { get; set; } + public int RPTC5 { get; set; } + public int RPTM5 { get; set; } + public int RPTA1 { get; set; } + public int RPTA2 { get; set; } + public int RPTA3 { get; set; } + public int RPTA4 { get; set; } + public int RPTA5 { get; set; } +} + + +public class RPAR_TYPE +{ + public const string T0_請假 = "0"; + public const string T00_補休 = "00"; + public const string T01_特休 = "01"; + public const string T02_事假 = "02"; + public const string T03_病假 = "03"; + public const string T04_喪假 = "04"; + public const string T05_產假 = "05"; + public const string T06_婚假 = "06"; + public const string T07_陪產假 = "07"; + public const string T08_公假 = "08"; + public const string T09_公傷假 = "09"; + public const string T0A_生理假 = "0A"; + public const string T0B_家庭照顧假 = "0B"; + public const string T0C_育嬰假 = "0C"; + public const string T0D_原民祭儀假 = "0D"; + public const string T0E_產檢假 = "0E"; + public const string T0F_防疫照顧假 = "0F"; + public const string T0G_無薪假 = "0G"; + public const string T0H_防疫隔離假 = "0H"; + + public const string T1_加班 = "1"; + public const string T11_非休息日累積補休時數 = "11"; + public const string T12_非休息日請領加班費 = "12"; + public const string T13_休息日累積補休時數 = "13"; + public const string T14_休息日請領加班費 = "14"; + public const string T15_國定假日累積補休時數 = "15"; + public const string T16_國定假日請領加班費 = "16"; + public const string T17_例假日累積補休時數 = "17"; + public const string T18_例假日請領加班費 = "18"; + + public const string T2_電話油料 = "2"; + public const string T21_電話費 = "21"; + public const string T22_油料費 = "22"; + + public const string T3_出差 = "3"; + public const string T31_短程出差 = "31"; + public const string T32_長程出差 = "32"; + public const string T33_公出 = "33"; + public const string T34_公假 = "34"; + + public static bool 休息日加班(string rparType) + { + return rparType == T13_休息日累積補休時數 || rparType == T14_休息日請領加班費; + } +} \ No newline at end of file diff --git a/Web/App_Code/Module/RPARList.cs b/Web/App_Code/Module/RPARList.cs new file mode 100644 index 0000000..5082045 --- /dev/null +++ b/Web/App_Code/Module/RPARList.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Web; +using Wellan.Data; +using System.Data.Common; + +/// +/// RPARList 的摘要描述 +/// +public partial class RPARList : List, IDataList +{ + public void Fill(DbDataReader reader) + { + while (reader.Read()) + { + RPAR newItem = new RPAR + { + RPREN = WDAC.GetStringValue(reader["RPREN"]), + RPNUM = WDAC.GetStringValue(reader["RPNUM"]), + RAITM = WDAC.GetInt32Value(reader["RAITM"]), + RPCNM = WDAC.GetStringValue(reader["RPCNM"]), + RPPYN = WDAC.GetStringValue(reader["RPPYN"]), + RPRDT = WDAC.GetDateTimeValue(reader["RPRDT"]), + RPEDT = WDAC.GetDateTimeValue(reader["RPEDT"]), + RPTYP = WDAC.GetStringValue(reader["RPTYP"]), + RPFTR = WDAC.GetDoubleValue(reader["RPFTR"]), + RPDOC = WDAC.GetStringValue(reader["RPDOC"]), + APPNO = WDAC.GetInt32Value(reader["APPNO"]), + RPADT = WDAC.GetDateTimeValue(reader["RPADT"]), + RPAPN = WDAC.GetStringValue(reader["RPAPN"]), + RPANO = WDAC.GetStringValue(reader["RPANO"]), + RPAPP = WDAC.GetStringValue(reader["RPAPP"]), + RPAPD = WDAC.GetDateTimeValue(reader["RPAPD"]), + RPAPU = WDAC.GetStringValue(reader["RPAPU"]), + RPAGT = WDAC.GetStringValue(reader["RPAGT"]), + RPAGM = WDAC.GetStringValue(reader["RPAGM"]), + RPRTM = WDAC.GetStringValue(reader["RPRTM"]), + RPETM = WDAC.GetStringValue(reader["RPETM"]), + RPUST = WDAC.GetInt32Value(reader["RPUST"]), + RPRSN = WDAC.GetStringValue(reader["RPRSN"]), + RPPLC = WDAC.GetStringValue(reader["RPPLC"]), + RPFPC = WDAC.GetStringValue(reader["RPFPC"]), + RPFAD = WDAC.GetStringValue(reader["RPFAD"]), + RPKMS = WDAC.GetDecimalValue(reader["RPKMS"]), + TRDAT = WDAC.GetDateTimeValue(reader["TRDAT"]), + TRMOD = WDAC.GetStringValue(reader["TRMOD"]), + TRUSR = WDAC.GetStringValue(reader["TRUSR"]), + RPTCT = WDAC.GetInt32Value(reader["RPTCT"]), + RPTMT = WDAC.GetInt32Value(reader["RPTMT"]), + RPTC1 = WDAC.GetInt32Value(reader["RPTC1"]), + RPTM1 = WDAC.GetInt32Value(reader["RPTM1"]), + RPTC2 = WDAC.GetInt32Value(reader["RPTC2"]), + RPTM2 = WDAC.GetInt32Value(reader["RPTM2"]), + RPTC3 = WDAC.GetInt32Value(reader["RPTC3"]), + RPTM3 = WDAC.GetInt32Value(reader["RPTM3"]), + RPTC4 = WDAC.GetInt32Value(reader["RPTC4"]), + RPTM4 = WDAC.GetInt32Value(reader["RPTM4"]), + RPTC5 = WDAC.GetInt32Value(reader["RPTC5"]), + RPTM5 = WDAC.GetInt32Value(reader["RPTM5"]), + }; + Add(newItem); + } + } +} \ No newline at end of file diff --git a/Web/App_Code/PublicVariable.cs b/Web/App_Code/PublicVariable.cs new file mode 100644 index 0000000..0347247 --- /dev/null +++ b/Web/App_Code/PublicVariable.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +/// +/// 專案內的公用變數 +/// +public class PublicVariable +{ + public PublicVariable() + { + } + + /// + /// 內部人員部門 + /// + public static string InnerDepartment = " ('A01','B01','B01-1','B01-2','C01','C01-1','C01-2','D01','E01','E01-1','E01-2','E02','E02-1','E02-2','E03','E03-1','E03-2') "; + + public static string RPARAttachPath = ""; + + /// + /// 是否使用 SSL 登入發郵件 + /// + public static bool SendMailBySSL = false; + + /// + /// 郵件發送主機 + /// + public static string SendMailHost = ""; + + /// + /// 郵件發送通訊埠,不使用 SSL 的通常是 25,使用 SSL 的通常是 465 + /// + public static int SendMailPort = 25; + + /// + /// 郵件發送帳號 + /// + public static string SendMailUserName = ""; + + /// + /// 郵件發送密碼 + /// + public static string SendMailPassword = ""; +} \ No newline at end of file diff --git a/Web/App_Code/Report/CRAXFileTransfer.cs b/Web/App_Code/Report/CRAXFileTransfer.cs new file mode 100644 index 0000000..ae8030c --- /dev/null +++ b/Web/App_Code/Report/CRAXFileTransfer.cs @@ -0,0 +1,75 @@ +using System; +using System.Web; +using System.Web.Services; +using System.Web.Services.Protocols; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using System.IO.Compression; + +[WebService(Namespace = "http://www.maolaoda.com/CRAXFileTransfer")] +[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] +public class CRAXFileTransfer : System.Web.Services.WebService +{ + public CRAXFileTransfer() + { + //Uncomment the following line if using designed components + //InitializeComponent(); + } + + [WebMethod] + public GetFileResponse GetFile(string filename, bool compress) + { + GetFileResponse response = new GetFileResponse(); + try + { + response.FileName = filename; + + if (compress) + { + FileStream readStream = File.Open(Server.MapPath(filename), FileMode.Open, FileAccess.Read); + byte[] buffer = new byte[readStream.Length]; + int count = readStream.Read(buffer, 0, buffer.Length); + readStream.Close(); + if (count != buffer.Length) + { + response.Message = "Unable to read data from " + filename; + } + else + { + MemoryStream outputStream = new MemoryStream(); + GZipStream compressStream = new GZipStream(outputStream, CompressionMode.Compress, true); + compressStream.Write(buffer, 0, buffer.Length); + compressStream.Flush(); + compressStream.Close(); + response.FileContents = outputStream.GetBuffer(); + } + } + else + { + response.FileContents = File.ReadAllBytes(Server.MapPath(filename)); + } + + response.Message = "OK"; + } + catch (Exception ex) + { + response.Message = "ERROR:" + ex.Message; + } + return response; + } + + [XmlRoot("getFileResponse", Namespace = "http://www.maolaoda.com/CRAXFileTransfer")] + public class GetFileResponse + { + [XmlElement("fileName", IsNullable = false)] + public string FileName; + + [XmlElement("message", IsNullable = false)] + public string Message; + + [XmlElement("fileData", IsNullable = true)] + public byte[] FileContents; + } + +} diff --git a/Web/App_Code/Report/Excel.cs b/Web/App_Code/Report/Excel.cs new file mode 100644 index 0000000..ef061ed --- /dev/null +++ b/Web/App_Code/Report/Excel.cs @@ -0,0 +1,315 @@ +using System; +using NPOI.SS.UserModel; +using NPOI.SS.Util; +using NPOI.HSSF.UserModel; +using NPOI.HSSF.Util; +using System.IO; + +public class Excel +{ + public HSSFWorkbook WorkBook + { + get; + set; + } + + public HSSFSheet Sheet + { + get; + set; + } + + /// + /// 建立或取得指定行列的儲存格 + /// + /// 列 + /// 行 + /// + public ICell Cell(int row, int col) + { + if (Sheet.GetRow(row) == null) + Sheet.CreateRow(row); + if (Sheet.GetRow(row).GetCell(col) == null) + Sheet.GetRow(row).CreateCell(col); + return Sheet.GetRow(row).GetCell(col); + } + + public string RCtoA1(int row, int col) + { + string colX; + + if (col <= 25) + colX = Char.ConvertFromUtf32(65 + col); + else + { + col = col - 26; + colX = Char.ConvertFromUtf32(65 + (int)(col / 26)) + Char.ConvertFromUtf32(65 + (col % 26)); + } + + return String.Format("{0}{1}", colX, row + 1); + } + + /// + /// 建立新字體 + /// + public IFont NewFont(string fontName) + { + return NewFont(fontName, 9, FontBoldWeight.Normal, HSSFColor.COLOR_NORMAL); + } + + /// + /// 建立新字體 + /// + public IFont NewFont(string fontName, short fontSize) + { + return NewFont(fontName, fontSize, FontBoldWeight.Normal, HSSFColor.COLOR_NORMAL); + } + + /// + /// 建立新字體 + /// + public IFont NewFont(string fontName, short fontSize, FontBoldWeight fontWeight) + { + return NewFont(fontName, fontSize, fontWeight, HSSFColor.COLOR_NORMAL); + } + + /// + /// 建立新字體 + /// + public IFont NewFont(string fontName, short fontSize, FontBoldWeight fontWeight, short color) + { + IFont result = WorkBook.CreateFont(); // 抬頭字體 + result.FontName = fontName; + result.FontHeightInPoints = fontSize; + result.Boldweight = (short)fontWeight; + result.Color = color; + return result; + } + + /// + /// 建立新樣式 + /// + public ICellStyle NewCellStyle(IFont font, HorizontalAlignment align, VerticalAlignment valign, bool warpText) + { + ICellStyle style = WorkBook.CreateCellStyle(); + style.SetFont(font); + style.Alignment = align; + style.VerticalAlignment = valign; + style.WrapText = warpText; + return style; + } + + /// + /// 合併儲存格 + /// + public void MergeCell(int row1, int col1, int row2, int col2) + { + // 建立範圍內所有儲存格 + for (int row = row1; row <= row2; row++) + for (int col = col1; col <= col2; col++) + Cell(row, col); + + CellRangeAddress region = new CellRangeAddress(row1, row2, col1, col2); // Region.ConvertToCellRangeAddress(new Region(row1, col1, row2, col2)); + Sheet.AddMergedRegion(region); + } + + /// + /// 合併儲存格,並設定合併後的邊框樣式 + /// + public void MergeCell(int row1, int col1, int row2, int col2, BorderStyle bordertype) + { + // 建立範圍內所有儲存格 + for (int row = row1; row <= row2; row++) + for (int col = col1; col <= col2; col++) + Cell(row, col); + + CellRangeAddress region = new CellRangeAddress(row1, row2, col1, col2); //Region.ConvertToCellRangeAddress(new Region(row1, col1, row2, col2)); + Sheet.AddMergedRegion(region); + SetRangeOuterBorder(region, bordertype); + } + + /// + /// 設定單一儲存格的邊框樣式 + /// + public void SetCellBorder(int row, int col, BorderStyle bordertype) + { + CellRangeAddress region = new CellRangeAddress(row, row, col, col); + HSSFRegionUtil.SetBorderTop(bordertype, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderLeft(bordertype, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderBottom(bordertype, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderRight(bordertype, region, Sheet as HSSFSheet, WorkBook); + } + + /// + /// 設定一個儲存格範圍的外圍邊框樣式 + /// + public void SetRangeOuterBorder(int row1, int col1, int row2, int col2, BorderStyle bordertype) + { + CellRangeAddress region = new CellRangeAddress(row1, row2, col1, col2); + HSSFRegionUtil.SetBorderTop(bordertype, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderLeft(bordertype, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderBottom(bordertype, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderRight(bordertype, region, Sheet as HSSFSheet, WorkBook); + } + + /// + /// 設定一個儲存格範圍的外圍邊框樣式 + /// + public void SetRangeOuterBorder(int row1, int col1, int row2, int col2, BorderStyle bordertypeTop, BorderStyle bordertypeLeft, BorderStyle bordertypeBottom, BorderStyle bordertypeRight) + { + CellRangeAddress region = new CellRangeAddress(row1, row2, col1, col2); + HSSFRegionUtil.SetBorderTop(bordertypeTop, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderLeft(bordertypeLeft, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderBottom(bordertypeBottom, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderRight(bordertypeRight, region, Sheet as HSSFSheet, WorkBook); + } + + /// + /// 設定一個儲存格範圍的外圍邊框樣式 + /// + public void SetRangeOuterBorder(CellRangeAddress region, BorderStyle bordertype) + { + HSSFRegionUtil.SetBorderTop(bordertype, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderLeft(bordertype, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderBottom(bordertype, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderRight(bordertype, region, Sheet as HSSFSheet, WorkBook); + } + + /// + /// 設定一個儲存格範圍的外圍邊框樣式 + /// + public void SetRangeOuterBorder(CellRangeAddress region, BorderStyle bordertypeTop, BorderStyle bordertypeLeft, BorderStyle bordertypeBottom, BorderStyle bordertypeRight) + { + HSSFRegionUtil.SetBorderTop(bordertypeTop, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderLeft(bordertypeLeft, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderBottom(bordertypeBottom, region, Sheet as HSSFSheet, WorkBook); + HSSFRegionUtil.SetBorderRight(bordertypeRight, region, Sheet as HSSFSheet, WorkBook); + } + + /// + /// 設定一個儲存格範圍的內部格線樣式 (慢,建議僅使用於小範圍!) + /// + public void SetRangeInnerGrid(int row1, int col1, int row2, int col2, BorderStyle bordertype) + { + /* + CellRangeAddress region = new CellRangeAddress(row1, row2, col1, col2); + Sheet.SetEnclosedBorderOfRegion(region, bordertype, HSSFColor.COLOR_NORMAL); + */ + + for (int col = col1; col <= col2; col++) + { + SetRangeOuterBorder(row1, col, row2, col, bordertype); + } + for (int row = row1; row <= row2; row++) + { + SetRangeOuterBorder(row, col1, row, col2, bordertype); + } + } + + public void SetCellStyle(int row, int col, ICellStyle style) + { + Cell(row, col).CellStyle = style; + } + + public void SetCellValue(int row, int col, bool value, ICellStyle style) + { + Cell(row, col).SetCellValue(value); + Cell(row, col).CellStyle = style; + } + + public void SetCellValue(int row, int col, DateTime value, ICellStyle style) + { + Cell(row, col).SetCellValue(value); + Cell(row, col).CellStyle = style; + } + + public void SetCellValue(int row, int col, double value, ICellStyle style) + { + Cell(row, col).SetCellValue(value); + Cell(row, col).CellStyle = style; + } + + public void SetCellValue(int row, int col, IRichTextString value, ICellStyle style) + { + Cell(row, col).SetCellValue(value); + Cell(row, col).CellStyle = style; + } + + public void SetCellValue(int row, int col, string value, ICellStyle style) + { + Cell(row, col).SetCellValue(value); + Cell(row, col).CellStyle = style; + } + + public void SetCellValue(int row, int col, bool value) + { + Cell(row, col).SetCellValue(value); + } + + public void SetCellValue(int row, int col, DateTime value) + { + Cell(row, col).SetCellValue(value); + } + + public void SetCellValue(int row, int col, double value) + { + Cell(row, col).SetCellValue(value); + } + + public void SetCellValue(int row, int col, IRichTextString value) + { + Cell(row, col).SetCellValue(value); + } + + public void SetCellValue(int row, int col, string value) + { + Cell(row, col).SetCellValue(value); + } + + public void SetCellFormula(int row, int col, string formula) + { + Cell(row, col).CellFormula = formula; + } + + public void SetCellFormula(int row, int col, string formula, ICellStyle style) + { + Cell(row, col).CellFormula = formula; + Cell(row, col).CellStyle = style; + } + + private HSSFPatriarch patriarch = null; + public void DrawLine(int col1, int row1, int dx1, int dy1, int col2, int row2, int dx2, int dy2, LineStyle lineStyle, int lineWidth) + { + if (patriarch == null) + patriarch = Sheet.CreateDrawingPatriarch() as HSSFPatriarch; + + HSSFClientAnchor a = new HSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2); + HSSFSimpleShape s = patriarch.CreateSimpleShape(a); + s.ShapeType = HSSFSimpleShape.OBJECT_TYPE_LINE; // 設定線條類型為線條 + s.LineStyle = lineStyle; // 設定為實線 + s.LineWidth = lineWidth; + } + + public void DrawPicture(int col1, int row1, int dx1, int dy1, int col2, int row2, int dx2, int dy2, string pictureFileName) + { + if (patriarch == null) + patriarch = Sheet.CreateDrawingPatriarch() as HSSFPatriarch; + + byte[] picture = File.ReadAllBytes(pictureFileName); + int pictureIdx = WorkBook.AddPicture(picture, PictureType.JPEG); + + HSSFClientAnchor a = new HSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2); + HSSFPicture p = patriarch.CreatePicture(a, pictureIdx) as HSSFPicture; + //p.Resize(); + } + + public void SetColumnWidth(int column, int width) + { + Sheet.SetColumnWidth(column, width * 256 + 182); + } + + public void SetRowHeight(int row, int height) + { + Sheet.GetRow(row).HeightInPoints = height; + } +} diff --git a/Web/App_Code/Report/ReportBase.cs b/Web/App_Code/Report/ReportBase.cs new file mode 100644 index 0000000..c8a2d74 --- /dev/null +++ b/Web/App_Code/Report/ReportBase.cs @@ -0,0 +1,313 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Data; +using System.Data.Common; +using NPOI.SS.UserModel; +using NPOI.HSSF.UserModel; +using NPOI.HSSF.Util; +using System.IO; +using NPOI.SS.Util; + +/// +/// 報表基礎類別 +/// +public abstract class ExcelReportBase +{ + protected HSSFWorkbook workbook; + protected HSSFSheet sheet; + protected Excel excel; + protected IFont headerFont; + protected IFont footerFont; + protected IFont titleFont; + protected IFont titleFontBoldUnderLine; + protected IFont bodyFont; + protected IFont bodyFontS; + protected IFont bodyFont6PT; + protected IFont bodyFont8PT; + protected ICellStyle headerStyle; + protected ICellStyle footerStyle; + protected ICellStyle titleStyleLeft; + protected ICellStyle titleStyleRight; + protected ICellStyle titleStyleCenter; + protected ICellStyle titleStyleCenterYellowBGC; + protected ICellStyle titleStyleCenterBottom; + protected ICellStyle titleStyleLeftNoBorder; + protected ICellStyle titleStyleRightNoBorder; + protected ICellStyle titleStyleCenterNoBorder; + protected ICellStyle titleStyleCenterBottomNoBorder; + protected ICellStyle titleStyleCenterUDBorder; + protected ICellStyle bodyStyleLeft; + protected ICellStyle bodyStyleRight; + protected ICellStyle bodyStyleCenter; + protected ICellStyle bodyStyleLeftNoBorder; + protected ICellStyle bodyStyleRightNoBorder; + protected ICellStyle bodyStyleCenterNoBorder; + + protected ICellStyle bodyNumberStyle; + protected ICellStyle bodyNumberStyleNoBorder; + protected ICellStyle bodyNumberStyleUDBorder; + protected ICellStyle bodyNumberStyle2; + protected ICellStyle bodyStyleCenterS; + protected ICellStyle bodyStyleCenterXS; + protected int HeaderRowHeight = 27; + protected int BodyRowHeight = 24; + protected int thisYy; + protected int thisMm; + protected int prevYy; + protected int prevMm; + + public ExcelReportBase() + { + Init(); + } + + public DataSet 資料來源 + { + get; + set; + } + + public string 公司名稱 + { + get; + set; + } + + public string 客戶名稱 + { + get; + set; + } + + public string 專案名稱 + { + get; + set; + } + + public string 報表名稱 + { + get; + set; + } + + public DateTime 報表時間 + { + get; + set; + } + + public string 客戶編號 + { + get; + set; + } + + public string 專案編號 + { + get; + set; + } + + public string 年度 + { + get; + set; + } + + public string 月份 + { + get; + set; + } + + public Dictionary 報表參數 + { + get; + set; + } + + public bool 以時分顯示時數 { get; set; } + + protected virtual void Init() + { + workbook = new HSSFWorkbook(); + sheet = workbook.CreateSheet("報表") as HSSFSheet; + sheet.ForceFormulaRecalculation = true; + excel = new Excel(); + excel.WorkBook = workbook; + excel.Sheet = sheet; + numberFormat = workbook.CreateDataFormat(); + + SetPaperAndMargin(sheet); + + headerFont = excel.NewFont("標楷體", 16, FontBoldWeight.Bold); + footerFont = excel.NewFont("標楷體", 16); + titleFont = excel.NewFont("標楷體", 12); + titleFontBoldUnderLine = excel.NewFont("標楷體", 12, FontBoldWeight.Bold); + titleFontBoldUnderLine.Underline = FontUnderlineType.Single; + bodyFont = excel.NewFont("標楷體", 12); + bodyFontS = excel.NewFont("標楷體", 10); + bodyFont6PT = excel.NewFont("標楷體", 6); + bodyFont8PT = excel.NewFont("標楷體", 8); + + headerStyle = excel.NewCellStyle(headerFont, HorizontalAlignment.Center, VerticalAlignment.Top, true); + footerStyle = excel.NewCellStyle(footerFont, HorizontalAlignment.Left, VerticalAlignment.Top, true); + + titleStyleLeft = excel.NewCellStyle(titleFont, HorizontalAlignment.Left, VerticalAlignment.Top, true); + titleStyleLeft.BorderTop = BorderStyle.Thin; + titleStyleLeft.BorderBottom = BorderStyle.Thin; + titleStyleLeft.BorderLeft = BorderStyle.Thin; + titleStyleLeft.BorderRight = BorderStyle.Thin; + + titleStyleRight = excel.NewCellStyle(titleFont, HorizontalAlignment.Right, VerticalAlignment.Top, true); + titleStyleRight.BorderTop = BorderStyle.Thin; + titleStyleRight.BorderBottom = BorderStyle.Thin; + titleStyleRight.BorderLeft = BorderStyle.Thin; + titleStyleRight.BorderRight = BorderStyle.Thin; + + titleStyleCenter = excel.NewCellStyle(titleFont, HorizontalAlignment.Center, VerticalAlignment.Top, true); + titleStyleCenter.BorderTop = BorderStyle.Thin; + titleStyleCenter.BorderBottom = BorderStyle.Thin; + titleStyleCenter.BorderLeft = BorderStyle.Thin; + titleStyleCenter.BorderRight = BorderStyle.Thin; + + titleStyleCenterYellowBGC = excel.NewCellStyle(titleFont, HorizontalAlignment.Center, VerticalAlignment.Top, true); + titleStyleCenterYellowBGC.BorderTop = BorderStyle.Thin; + titleStyleCenterYellowBGC.BorderBottom = BorderStyle.Thin; + titleStyleCenterYellowBGC.BorderLeft = BorderStyle.Thin; + titleStyleCenterYellowBGC.BorderRight = BorderStyle.Thin; + titleStyleCenterYellowBGC.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index; + titleStyleCenterYellowBGC.FillPattern = FillPattern.SolidForeground; + titleStyleCenterYellowBGC.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index; + + titleStyleCenterBottom = excel.NewCellStyle(titleFont, HorizontalAlignment.Center, VerticalAlignment.Bottom, true); + titleStyleCenterBottom.BorderTop = BorderStyle.Thin; + titleStyleCenterBottom.BorderBottom = BorderStyle.Thin; + titleStyleCenterBottom.BorderLeft = BorderStyle.Thin; + titleStyleCenterBottom.BorderRight = BorderStyle.Thin; + + titleStyleLeftNoBorder = excel.NewCellStyle(titleFont, HorizontalAlignment.Left, VerticalAlignment.Top, true); + titleStyleRightNoBorder = excel.NewCellStyle(titleFont, HorizontalAlignment.Right, VerticalAlignment.Top, true); + titleStyleCenterNoBorder = excel.NewCellStyle(titleFont, HorizontalAlignment.Center, VerticalAlignment.Top, true); + titleStyleCenterBottomNoBorder = excel.NewCellStyle(titleFont, HorizontalAlignment.Center, VerticalAlignment.Bottom, true); + + titleStyleCenterUDBorder = excel.NewCellStyle(titleFont, HorizontalAlignment.Center, VerticalAlignment.Top, true); + titleStyleCenterUDBorder.BorderTop = BorderStyle.Thin; + titleStyleCenterUDBorder.BorderBottom = BorderStyle.Thin; + + bodyStyleLeft = excel.NewCellStyle(bodyFont, HorizontalAlignment.Left, VerticalAlignment.Top, true); + bodyStyleLeft.BorderTop = BorderStyle.Thin; + bodyStyleLeft.BorderBottom = BorderStyle.Thin; + bodyStyleLeft.BorderLeft = BorderStyle.Thin; + bodyStyleLeft.BorderRight = BorderStyle.Thin; + bodyStyleLeft.WrapText = true; + + bodyStyleRight = excel.NewCellStyle(bodyFont, HorizontalAlignment.Right, VerticalAlignment.Top, true); + bodyStyleRight.BorderTop = BorderStyle.Thin; + bodyStyleRight.BorderBottom = BorderStyle.Thin; + bodyStyleRight.BorderLeft = BorderStyle.Thin; + bodyStyleRight.BorderRight = BorderStyle.Thin; + bodyStyleRight.WrapText = true; + + bodyStyleCenter = excel.NewCellStyle(bodyFont, HorizontalAlignment.Center, VerticalAlignment.Top, true); + bodyStyleCenter.BorderTop = BorderStyle.Thin; + bodyStyleCenter.BorderBottom = BorderStyle.Thin; + bodyStyleCenter.BorderLeft = BorderStyle.Thin; + bodyStyleCenter.BorderRight = BorderStyle.Thin; + bodyStyleCenter.WrapText = true; + + bodyStyleLeftNoBorder = excel.NewCellStyle(bodyFont, HorizontalAlignment.Left, VerticalAlignment.Top, true); + bodyStyleLeftNoBorder.WrapText = true; + + bodyStyleRightNoBorder = excel.NewCellStyle(bodyFont, HorizontalAlignment.Right, VerticalAlignment.Top, true); + bodyStyleRightNoBorder.WrapText = true; + + bodyStyleCenterNoBorder = excel.NewCellStyle(bodyFont, HorizontalAlignment.Center, VerticalAlignment.Top, true); + bodyStyleCenterNoBorder.WrapText = true; + + bodyStyleCenterS = excel.NewCellStyle(bodyFontS, HorizontalAlignment.Center, VerticalAlignment.Top, true); + bodyStyleCenterS.BorderTop = BorderStyle.Thin; + bodyStyleCenterS.BorderBottom = BorderStyle.Thin; + bodyStyleCenterS.BorderLeft = BorderStyle.Thin; + bodyStyleCenterS.BorderRight = BorderStyle.Thin; + bodyStyleCenterS.WrapText = true; + + bodyStyleCenterXS = excel.NewCellStyle(bodyFont6PT, HorizontalAlignment.Center, VerticalAlignment.Top, true); + bodyStyleCenterXS.BorderTop = BorderStyle.Thin; + bodyStyleCenterXS.BorderBottom = BorderStyle.Thin; + bodyStyleCenterXS.BorderLeft = BorderStyle.Thin; + bodyStyleCenterXS.BorderRight = BorderStyle.Thin; + bodyStyleCenterXS.WrapText = true; + + bodyNumberStyle = excel.NewCellStyle(bodyFont, HorizontalAlignment.Right, VerticalAlignment.Top, true); + bodyNumberStyle.DataFormat = numberFormat.GetFormat("###,###,##0"); + bodyNumberStyle.BorderTop = BorderStyle.Thin; + bodyNumberStyle.BorderBottom = BorderStyle.Thin; + bodyNumberStyle.BorderLeft = BorderStyle.Thin; + bodyNumberStyle.BorderRight = BorderStyle.Thin; + bodyNumberStyle.WrapText = true; + + bodyNumberStyle2 = excel.NewCellStyle(bodyFont, HorizontalAlignment.Right, VerticalAlignment.Top, true); + bodyNumberStyle2.DataFormat = numberFormat.GetFormat("###,###,##0.00"); + bodyNumberStyle2.BorderTop = BorderStyle.Thin; + bodyNumberStyle2.BorderBottom = BorderStyle.Thin; + bodyNumberStyle2.BorderLeft = BorderStyle.Thin; + bodyNumberStyle2.BorderRight = BorderStyle.Thin; + bodyNumberStyle2.WrapText = true; + + bodyNumberStyleNoBorder = excel.NewCellStyle(bodyFont, HorizontalAlignment.Right, VerticalAlignment.Top, true); + bodyNumberStyleNoBorder.DataFormat = numberFormat.GetFormat("###,###,##0"); + bodyNumberStyleNoBorder.WrapText = true; + + bodyNumberStyleUDBorder = excel.NewCellStyle(bodyFont, HorizontalAlignment.Right, VerticalAlignment.Top, true); + bodyNumberStyleUDBorder.DataFormat = numberFormat.GetFormat("###,###,##0"); + bodyNumberStyleUDBorder.BorderTop = BorderStyle.Thin; + bodyNumberStyleUDBorder.BorderBottom = BorderStyle.Thin; + bodyNumberStyleUDBorder.WrapText = true; + + 資料來源 = new DataSet(); + } + + private IDataFormat numberFormat; + protected IDataFormat NumberFormat { get { return numberFormat; } } + + protected void SetPaperAndMargin(HSSFSheet Asheet) + { + // 設定紙張 + Asheet.PrintSetup.PaperSize = 9; // A4 + Asheet.PrintSetup.Landscape = false; // 橫向 + + // 列印格式 + Asheet.PrintSetup.UsePage = true; + Asheet.PrintSetup.FitWidth = 1; // 將所有欄擠進 1 頁寬 + Asheet.PrintSetup.FitHeight = 0; // 0 表示不指定幾頁 + + // 頁首頁尾 + Asheet.Footer.Left = "列印日期:&D"; + Asheet.Footer.Right = "頁數:&P"; + + // 紙張邊界 + Asheet.PrintSetup.HeaderMargin = 0d; + Asheet.PrintSetup.FooterMargin = 0.3d; + Asheet.SetMargin(MarginType.TopMargin, 0.5d); + Asheet.SetMargin(MarginType.BottomMargin, 0.5d); + Asheet.SetMargin(MarginType.LeftMargin, 0.3d); + Asheet.SetMargin(MarginType.RightMargin, 0.3d); + } + + protected string MinuteToTime(int minute) + { + int hh = minute / 60; + int mm = minute % 60; + + if (以時分顯示時數) + return String.Format("{0:##0}:{1:00}", hh, mm); + else + return hh.ToString(); + } + + public abstract MemoryStream 產生報表(); + +} \ No newline at end of file diff --git a/Web/App_Code/Report/ReportParameter.cs b/Web/App_Code/Report/ReportParameter.cs new file mode 100644 index 0000000..8b43372 --- /dev/null +++ b/Web/App_Code/Report/ReportParameter.cs @@ -0,0 +1,75 @@ +using System; +using System.Data; +using System.Configuration; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Collections.Generic; +using System.Text; +using System.IO; + +/// +/// Summary description for ReportParameter +/// +public class ReportParameter +{ + private SortedList _paramList = new SortedList(); + + public ReportParameter() + { + } + + public void Add(string name, string value) + { + if (!_paramList.ContainsKey(name)) + _paramList.Add(name, value); + else + _paramList[name] = value; + } + + public void Clear() + { + _paramList.Clear(); + } + + public string Save(string fileName, bool random) + { + string realFileName = GetRealFileName(fileName, random); + if (File.Exists(realFileName)) + File.Delete(realFileName); + using (StreamWriter sw = File.CreateText(realFileName)) + { + for (int i = 0; i < _paramList.Count; i++) + { + sw.WriteLine(String.Format("{0}={1}", _paramList.Keys[i], _paramList.Values[i])); + } + sw.Close(); + } + return realFileName; + } + + /// + /// ɮצW٥[WHr + /// + private string GetRealFileName(string fileName, bool random) + { + if (!random) + return fileName; + + string ext = Path.GetExtension(fileName); + string s = Path.ChangeExtension(fileName, null); + do + { + Random r = new Random(); + int suffix = r.Next(int.MaxValue); + fileName = String.Format("{0}_{1:x8}{2}", s, suffix, ext); + } + while (File.Exists(fileName)); + + return fileName; + } + +} diff --git a/Web/App_Code/Report/SalaryStrip.cs b/Web/App_Code/Report/SalaryStrip.cs new file mode 100644 index 0000000..f89c330 --- /dev/null +++ b/Web/App_Code/Report/SalaryStrip.cs @@ -0,0 +1,220 @@ +using System; +using System.Data; +using System.Configuration; +using System.Drawing; +using System.IO; +using System.Collections.Generic; + +/// +/// 畫薪資條 +/// +public class SalaryStrip +{ + public string 公司名稱 = ""; + public string 薪資別 = ""; + public string 發薪年月 = ""; + public string 部門 = ""; + public string 員工代號 = ""; + public string 姓名 = ""; + public string 職務 = ""; + + public int 公司提繳 = 0; + public int 津貼合計 = 0; + public int 課稅金額 = 0; + public int 應發金額 = 0; + public int 員工累計 = 0; + public int 扣款合計 = 0; + public int 所得稅 = 0; + public int 實發金額 = 0; + public int 公司累計 = 0; + public string 帳號 = ""; + public int 薪資條樣板 = 0; + + public bool 列印公司提繳 = true; + public bool 列印津貼合計 = true; + public bool 列印課稅金額 = true; + public bool 列印應發金額 = true; + public bool 列印員工累計 = true; + public bool 列印扣款合計 = true; + public bool 列印所得稅 = true; + public bool 列印實發金額 = true; + public bool 列印公司累計 = true; + public bool 列印帳號 = true; + + #region 私用變數 + + private Font companyFont = new Font("細明體", 18, FontStyle.Bold); + private Font titleFont = new Font("細明體", 11, FontStyle.Regular); + private Font detailFont = new Font("細明體", 10, FontStyle.Regular); + + // 定義各點位置 + private PointF pt公司名稱 = new PointF(379, 35); + private PointF pt薪資別 = new PointF(100, 76); + private PointF pt發薪年月 = new PointF(633, 76); + private PointF pt部門 = new PointF(100, 98); + private PointF pt員工代號 = new PointF(290, 98); + private PointF pt姓名 = new PointF(442, 98); + private PointF pt職務 = new PointF(633, 98); + + private PointF pt加項1 = new PointF(40, 180); + private PointF pt減項1 = new PointF(267, 180); + private PointF pt出勤1 = new PointF(494, 180); + private PointF pt加項2 = new PointF(126, 180); + private PointF pt減項2 = new PointF(352, 180); + private PointF pt出勤2 = new PointF(668, 180); + + private PointF pt公司提繳 = new PointF(192, 404); + private PointF pt津貼合計 = new PointF(343, 404); + private PointF pt課稅金額 = new PointF(494, 404); + private PointF pt應發金額 = new PointF(645, 404); + private PointF pt員工累計 = new PointF(192, 424); + private PointF pt扣款合計 = new PointF(343, 424); + private PointF pt所得稅 = new PointF(494, 424); + private PointF pt實發金額 = new PointF(645, 424); + private PointF pt公司累計 = new PointF(192, 443); + private PointF pt帳號 = new PointF(343, 443); + + // 定義加項名稱 + private List PlusNames = new List(); + private List PlusAmounts = new List(); + + // 定義減項名稱 + private List MinusNames = new List(); + private List MinusAmounts = new List(); + + // 定義出勤名稱 + private List PresentNames = new List(); + private List PresentAmounts = new List(); + + #endregion + + #region 私用方法 + + private string[] 薪資條樣板檔案 = { @"picture\SalaryStrip.dib", @"picture\SalaryStrip_Bonus.dib" }; + + private void DrawTitle(Graphics g) + { + DrawString(g, 公司名稱, companyFont, pt公司名稱, "C"); + DrawString(g, 薪資別, titleFont, pt薪資別, "L"); + DrawString(g, 發薪年月, titleFont, pt發薪年月, "L"); + DrawString(g, 部門, titleFont, pt部門, "L"); + DrawString(g, 員工代號, titleFont, pt員工代號, "L"); + DrawString(g, 姓名, titleFont, pt姓名, "L"); + DrawString(g, 職務, titleFont, pt職務, "L"); + + if (列印公司提繳) + DrawString(g, String.Format("{0,9:#,###,##0}", 公司提繳), titleFont, pt公司提繳, "L"); + if (列印津貼合計) + DrawString(g, String.Format("{0,9:#,###,##0}", 津貼合計), titleFont, pt津貼合計, "L"); + if (列印課稅金額) + DrawString(g, String.Format("{0,9:#,###,##0}", 課稅金額), titleFont, pt課稅金額, "L"); + if (列印應發金額) + DrawString(g, String.Format("{0,9:#,###,##0}", 應發金額), titleFont, pt應發金額, "L"); + if (列印員工累計) + DrawString(g, String.Format("{0,9:#,###,##0}", 員工累計), titleFont, pt員工累計, "L"); + if (列印扣款合計) + DrawString(g, String.Format("{0,9:#,###,##0}", 扣款合計), titleFont, pt扣款合計, "L"); + if (列印所得稅) + DrawString(g, String.Format("{0,9:#,###,##0}", 所得稅), titleFont, pt所得稅, "L"); + if (列印實發金額) + DrawString(g, String.Format("{0,9:#,###,##0}", 實發金額), titleFont, pt實發金額, "L"); + if (列印公司累計) + DrawString(g, String.Format("{0,9:#,###,##0}", 公司累計), titleFont, pt公司累計, "L"); + if (列印帳號) + DrawString(g, 帳號, titleFont, pt帳號, "L"); + } + + private void DrawItems(Graphics g) + { + for (int i = 0; i < PlusNames.Count; i++) + g.DrawString(PlusNames[i], detailFont, Brushes.Black, pt加項1.X, pt加項1.Y + (i * 18)); + for (int i = 0; i < PlusAmounts.Count; i++) + g.DrawString(String.Format("{0,9:#,###,##0}", PlusAmounts[i]), detailFont, Brushes.Black, pt加項2.X, pt加項2.Y + (i * 18)); + + for (int i = 0; i < MinusNames.Count; i++) + g.DrawString(MinusNames[i], detailFont, Brushes.Black, pt減項1.X, pt減項1.Y + (i * 18)); + for (int i = 0; i < MinusAmounts.Count; i++) + g.DrawString(String.Format("{0,9:#,###,##0}", MinusAmounts[i]), detailFont, Brushes.Black, pt減項2.X, pt減項2.Y + (i * 18)); + + for (int i = 0; i < PresentNames.Count; i++) + g.DrawString(PresentNames[i], detailFont, Brushes.Black, pt出勤1.X, pt出勤1.Y + (i * 18)); + for (int i = 0; i < PresentAmounts.Count; i++) + g.DrawString(String.Format("{0,6:c}", PresentAmounts[i]), detailFont, Brushes.Black, pt出勤2.X, pt出勤2.Y + (i * 18)); + } + + private void DrawString(Graphics g, string s, Font f, PointF pt, string align) + { + PointF pt1 = new PointF() { X = pt.X, Y = pt.Y }; + SizeF size = g.MeasureString(s, f); + + if (align == "R") + pt1.X -= size.Width; + else if (align == "C") + pt1.X -= size.Width / 2; + + g.DrawString(s, f, Brushes.Black, pt1); + } + + #endregion + + public void AddPlus(string name, int amount) + { + PlusNames.Add(name); + PlusAmounts.Add(amount); + } + + public void AddMinus(string name, int amount) + { + MinusNames.Add(name); + MinusAmounts.Add(amount); + } + + public void AddPresent(string name, string amount) + { + PresentNames.Add(name); + PresentAmounts.Add(amount); + } + + public MemoryStream Draw(string rootpath) + { + Image img = Image.FromFile(rootpath + 薪資條樣板檔案[薪資條樣板]); + Graphics g = Graphics.FromImage(img); + DrawTitle(g); + DrawItems(g); + MemoryStream result = new MemoryStream(); + img.Save(result, System.Drawing.Imaging.ImageFormat.Gif); + img.Dispose(); + g.Dispose(); + return result; + } + + public void Clear() + { + PlusNames.Clear(); + PlusAmounts.Clear(); + MinusNames.Clear(); + MinusAmounts.Clear(); + PresentNames.Clear(); + PresentAmounts.Clear(); + + 公司名稱 = ""; + 薪資別 = ""; + 發薪年月 = ""; + 部門 = ""; + 員工代號 = ""; + 姓名 = ""; + 職務 = ""; + + 公司提繳 = 0; + 津貼合計 = 0; + 課稅金額 = 0; + 應發金額 = 0; + 員工累計 = 0; + 扣款合計 = 0; + 所得稅 = 0; + 實發金額 = 0; + 公司累計 = 0; + 帳號 = ""; + } +} + diff --git a/Web/App_Code/Report/出差申請單.cs b/Web/App_Code/Report/出差申請單.cs new file mode 100644 index 0000000..e12dde9 --- /dev/null +++ b/Web/App_Code/Report/出差申請單.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Data; +using System.Data.Common; +using NPOI.SS.UserModel; +using NPOI.HSSF.UserModel; +using NPOI.HSSF.Util; +using System.IO; +using NPOI.SS.Util; +using Wellan.Data; + +/// +/// 出差申請單 +/// +public class 出差申請單 : ExcelReportBase +{ + public 出差申請單() + { + 報表名稱 = "出差申請單"; + } + + public override MemoryStream 產生報表() + { + BodyRowHeight = 35; + + #region 報表抬頭 + + excel.MergeCell(0, 0, 0, 9); + excel.SetCellValue(0, 0, String.Format("{0}\r\n承辦{1}\r\n『{2}』\r\n{3}", 公司名稱, 客戶名稱, 專案名稱, 報表名稱), headerStyle); + excel.SetCellValue(1, 0, "月份:", titleStyleRightNoBorder); + excel.MergeCell(1, 1, 1, 2); + excel.SetCellValue(1, 1, 報表時間.ToString("MM月"), titleStyleLeftNoBorder); + excel.SetCellValue(1, 3, "單位:", titleStyleRightNoBorder); + excel.SetCellValue(1, 4, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["站別"]), titleStyleLeftNoBorder); + excel.SetCellValue(1, 5, "職稱:", titleStyleRightNoBorder); + excel.SetCellValue(1, 6, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["職稱"]), titleStyleLeftNoBorder); + excel.SetCellValue(1, 7, "姓名:", titleStyleRightNoBorder); + excel.SetCellValue(1, 8, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["BPNME"]), titleStyleLeftNoBorder); + excel.SetRowHeight(0, HeaderRowHeight * 4); + excel.SetRowHeight(1, BodyRowHeight); + + excel.MergeCell(2, 0, 2, 2); + excel.SetRangeOuterBorder(2, 0, 2, 2, BorderStyle.Thin); + excel.SetCellValue(2, 0, "公差日期", titleStyleCenter); + excel.SetCellValue(2, 3, "類別", titleStyleCenter); + excel.SetCellValue(2, 4, "開始時間", titleStyleCenter); + excel.SetCellValue(2, 5, "結束時間", titleStyleCenter); + excel.SetCellValue(2, 6, "時數", titleStyleCenter); + excel.SetCellValue(2, 7, "公差地點", titleStyleCenter); + excel.SetCellValue(2, 8, "公差事由", titleStyleCenter); + excel.SetCellValue(2, 9, "備註", titleStyleCenter); + excel.SetRowHeight(2, BodyRowHeight); + + #endregion + + #region 報表資料 + int rowId = 3; + foreach (DataRow r in 資料來源.Tables[0].Rows) + { + excel.SetCellValue(rowId, 0, WDAC.GetDateTimeValue(r["RPRDT"]).ToString("MM月dd日"), titleStyleCenter); + excel.SetCellValue(rowId, 1, "~", titleStyleCenter); + excel.SetCellValue(rowId, 2, WDAC.GetDateTimeValue(r["RPEDT"]).ToString("MM月dd日"), titleStyleCenter); + excel.SetCellValue(rowId, 3, WDAC.GetStringValue(r["類別"]), titleStyleCenter); + excel.SetCellValue(rowId, 4, WDAC.GetStringValue(r["RPRTM"]), titleStyleCenter); + excel.SetCellValue(rowId, 5, WDAC.GetStringValue(r["RPETM"]), titleStyleCenter); + excel.SetCellValue(rowId, 6, MinuteToTime(WDAC.GetInt32Value(r["RPTCT"])), titleStyleCenter); + excel.SetCellValue(rowId, 7, WDAC.GetStringValue(r["RPPLC"]), titleStyleCenter); + excel.SetCellValue(rowId, 8, WDAC.GetStringValue(r["RPRSN"]), bodyStyleCenterS); + excel.SetCellValue(rowId, 9, WDAC.GetStringValue(r["RPDOC"]), bodyStyleCenterS); + excel.SetRowHeight(rowId, BodyRowHeight); + rowId++; + } + + #endregion + + #region 表尾批示 + + //excel.MergeCell(rowId + 2, 0, rowId + 2, 9); + //excel.SetCellValue(rowId + 2, 0, "申請人:               計畫督導:               人事單位:", titleStyleLeftNoBorder); + //excel.SetRowHeight(rowId + 2, BodyRowHeight); + + //excel.MergeCell(rowId + 1, 1, rowId + 1, 3); + //excel.MergeCell(rowId + 2, 1, rowId + 2, 3); + //excel.SetCellValue(rowId + 1, 1, "申請人", titleStyleCenter); + //excel.SetRangeOuterBorder(rowId + 1, 1, rowId + 1, 3, BorderStyle.Thin); + //excel.SetRangeOuterBorder(rowId + 2, 1, rowId + 2, 3, BorderStyle.Thin); + + //excel.MergeCell(rowId + 1, 4, rowId + 1, 6); + //excel.MergeCell(rowId + 2, 4, rowId + 2, 6); + //excel.SetCellValue(rowId + 1, 4, "公司計畫督導", titleStyleCenter); + //excel.SetRangeOuterBorder(rowId + 1, 4, rowId + 1, 6, BorderStyle.Thin); + //excel.SetRangeOuterBorder(rowId + 2, 4, rowId + 2, 6, BorderStyle.Thin); + + //excel.MergeCell(rowId + 1, 7, rowId + 1, 8); + //excel.MergeCell(rowId + 2, 7, rowId + 2, 8); + //excel.SetCellValue(rowId + 1, 7, "公司計畫主持人", titleStyleCenter); + //excel.SetRangeOuterBorder(rowId + 1, 7, rowId + 1, 8, BorderStyle.Thin); + //excel.SetRangeOuterBorder(rowId + 2, 7, rowId + 2, 8, BorderStyle.Thin); + + //excel.SetRowHeight(rowId + 1, BodyRowHeight); + //excel.SetRowHeight(rowId + 2, BodyRowHeight); + + #endregion + + excel.SetColumnWidth(0, 11); + excel.SetColumnWidth(1, 4); + excel.SetColumnWidth(2, 11); + excel.SetColumnWidth(3, 11); + excel.SetColumnWidth(4, 11); + excel.SetColumnWidth(5, 11); + excel.SetColumnWidth(6, 12); + excel.SetColumnWidth(7, 12); + excel.SetColumnWidth(8, 30); + excel.SetColumnWidth(9, 15); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } +} \ No newline at end of file diff --git a/Web/App_Code/Report/出缺勤情形統計表.cs b/Web/App_Code/Report/出缺勤情形統計表.cs new file mode 100644 index 0000000..262dac5 --- /dev/null +++ b/Web/App_Code/Report/出缺勤情形統計表.cs @@ -0,0 +1,370 @@ +using System; +using System.Collections.Generic; +using System.Data; +using NPOI.SS.UserModel; +using System.IO; +using Wellan.Data; +using Wellan.Common; + +/// +/// 出缺勤情形統計表 的摘要描述 +/// +public class 出缺勤情形統計表 : ExcelReportBase +{ + public 出缺勤情形統計表() + { + } + + private ICellStyle bodyNumberStyleNoBorderD2; + + protected override void Init() + { + base.Init(); + titleStyleCenterNoBorder.SetFont(bodyFont); + bodyStyleCenterNoBorder.SetFont(bodyFont); + bodyNumberStyleNoBorder.SetFont(bodyFont); + titleStyleRightNoBorder.SetFont(bodyFont); + titleStyleLeftNoBorder.SetFont(bodyFont); + + bodyNumberStyleNoBorderD2 = excel.NewCellStyle(bodyFont, HorizontalAlignment.Right, VerticalAlignment.Top, true); + bodyNumberStyleNoBorderD2.DataFormat = NumberFormat.GetFormat("###,###,##0.00"); + bodyNumberStyleNoBorderD2.WrapText = true; + } + + public override MemoryStream 產生報表() + { + #region 報表抬頭 + var row = 0; + + excel.MergeCell(row, 0, row, 19, BorderStyle.None); + excel.SetCellValue(row, 0, 公司名稱, headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 19, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("承辦{0}", 客戶名稱), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 19, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("『{0}』", 專案名稱), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 19, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("{0}【{1}{2}】", 報表名稱, 年度, 月份), headerStyle); + excel.SetRowHeight(row, 20); + row++; + + excel.MergeCell(row, 4, row, 19, BorderStyle.None); + excel.SetCellValue(row, 4, string.Format("{0}{1}出缺勤情形(單位:時)", 年度, 月份), titleStyleCenterNoBorder); + row++; + + excel.SetCellValue(row, 0, "序號", titleStyleCenterNoBorder); + excel.SetCellValue(row, 1, "站別", titleStyleCenterNoBorder); + excel.SetCellValue(row, 2, "人員姓名", titleStyleCenterNoBorder); + excel.SetCellValue(row, 3, "補休", titleStyleCenterNoBorder); + excel.SetCellValue(row, 4, "特休", titleStyleCenterNoBorder); + excel.SetCellValue(row, 5, "產假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 6, "公假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 7, "事假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 8, "喪假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 9, "病假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 10, "加班一", titleStyleCenterNoBorder); + excel.SetCellValue(row, 11, "加班二", titleStyleCenterNoBorder); + excel.SetCellValue(row, 12, "婚假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 13, "工傷假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 14, "生理假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 15, "家庭照顧假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 16, "陪產假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 17, "原民祭儀假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 18, "產檢假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 19, "其他假別(一)", titleStyleCenterNoBorder); + excel.SetRowHeight(row, 20); + row++; + + #endregion + + #region 報表資料 + + int beginRow = row; + int serial = 1; + int SST05_SUM = 0; + int SST06_SUM = 0; + int SST10_SUM = 0; + int SST13_SUM = 0; + int SST07_SUM = 0; + int SST09_SUM = 0; + int SST08_SUM = 0; + int 加班_SUM = 0; + int SST04_SUM = 0; + int SST11_SUM = 0; + int SST14_SUM = 0; + int SST15_SUM = 0; + int SST16_SUM = 0; + int SST12_SUM = 0; + int SST19_SUM = 0; + int SST20_SUM = 0; + int SST23_SUM = 0; + int 全勤人數 = 0; + + foreach (DataRow r in 資料來源.Tables[0].Rows) + { + var 加班 = WDAC.GetInt32Value(r["SST01"]) * 60 + WDAC.GetInt32Value(r["SST01M"]) + + WDAC.GetInt32Value(r["SST02"]) * 60 + WDAC.GetInt32Value(r["SST02M"]) + + WDAC.GetInt32Value(r["SST03"]) * 60 + WDAC.GetInt32Value(r["SST03M"]) + + WDAC.GetInt32Value(r["SST21"]) * 60 + WDAC.GetInt32Value(r["SST21M"]) + + WDAC.GetInt32Value(r["SST22"]) * 60 + WDAC.GetInt32Value(r["SST22M"]); + + SST05_SUM += WDAC.GetInt32Value(r["SST05"]) * 60 + WDAC.GetInt32Value(r["SST05M"]); + SST06_SUM += WDAC.GetInt32Value(r["SST06"]) * 60 + WDAC.GetInt32Value(r["SST06M"]); + SST10_SUM += WDAC.GetInt32Value(r["SST10"]) * 60 + WDAC.GetInt32Value(r["SST10M"]); + SST13_SUM += WDAC.GetInt32Value(r["SST13"]) * 60 + WDAC.GetInt32Value(r["SST13M"]); + SST07_SUM += WDAC.GetInt32Value(r["SST07"]) * 60 + WDAC.GetInt32Value(r["SST07M"]); + SST09_SUM += WDAC.GetInt32Value(r["SST09"]) * 60 + WDAC.GetInt32Value(r["SST09M"]); + SST08_SUM += WDAC.GetInt32Value(r["SST08"]) * 60 + WDAC.GetInt32Value(r["SST08M"]); + 加班_SUM += 加班; + SST04_SUM += WDAC.GetInt32Value(r["SST04"]) * 60 + WDAC.GetInt32Value(r["SST04M"]); + SST11_SUM += WDAC.GetInt32Value(r["SST11"]) * 60 + WDAC.GetInt32Value(r["SST11M"]); + SST14_SUM += WDAC.GetInt32Value(r["SST14"]) * 60 + WDAC.GetInt32Value(r["SST14M"]); + SST15_SUM += WDAC.GetInt32Value(r["SST15"]) * 60 + WDAC.GetInt32Value(r["SST15M"]); + SST16_SUM += WDAC.GetInt32Value(r["SST16"]) * 60 + WDAC.GetInt32Value(r["SST16M"]); + SST12_SUM += WDAC.GetInt32Value(r["SST12"]) * 60 + WDAC.GetInt32Value(r["SST12M"]); + SST19_SUM += WDAC.GetInt32Value(r["SST19"]) * 60 + WDAC.GetInt32Value(r["SST19M"]); + SST20_SUM += WDAC.GetInt32Value(r["SST20"]) * 60 + WDAC.GetInt32Value(r["SST20M"]); + SST23_SUM += WDAC.GetInt32Value(r["SST23"]) * 60 + WDAC.GetInt32Value(r["SST23M"]); + 全勤人數 += WDAC.GetInt32Value(r["SST07"]) == 0 && + WDAC.GetInt32Value(r["SST08"]) == 0 && + WDAC.GetInt32Value(r["SST10"]) == 0 && + WDAC.GetInt32Value(r["SST12"]) == 0 ? 1 : 0; + + excel.SetCellValue(row, 0, serial, bodyStyleCenterNoBorder); + excel.SetCellValue(row, 1, WDAC.GetStringValue(r["SSBRHX"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 2, WDAC.GetStringValue(r["BPNME"]), bodyStyleCenterNoBorder); + + if (以時分顯示時數) + { + excel.SetCellValue(row, 3, string.Format("{0:#00}:{1:00}", r["SST05"], r["SST05M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 4, string.Format("{0:#00}:{1:00}", r["SST06"], r["SST06M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 5, string.Format("{0:#00}:{1:00}", r["SST10"], r["SST10M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 6, string.Format("{0:#00}:{1:00}", r["SST13"], r["SST13M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 7, string.Format("{0:#00}:{1:00}", r["SST07"], r["SST07M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 8, string.Format("{0:#00}:{1:00}", r["SST09"], r["SST09M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 9, string.Format("{0:#00}:{1:00}", r["SST08"], r["SST08M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 10, string.Format("{0:#00}:{1:00}", (int)Math.Floor(加班 / 60.0), 加班 % 60), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 11, string.Format("{0:#00}:{1:00}", r["SST04"], r["SST04M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 12, string.Format("{0:#00}:{1:00}", r["SST11"], r["SST11M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 13, string.Format("{0:#00}:{1:00}", r["SST14"], r["SST14M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 14, string.Format("{0:#00}:{1:00}", r["SST15"], r["SST15M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 15, string.Format("{0:#00}:{1:00}", r["SST16"], r["SST16M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 16, string.Format("{0:#00}:{1:00}", r["SST12"], r["SST12M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 17, string.Format("{0:#00}:{1:00}", r["SST19"], r["SST19M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 18, string.Format("{0:#00}:{1:00}", r["SST20"], r["SST20M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 19, string.Format("{0:#00}:{1:00}", r["SST23"], r["SST23M"]), bodyStyleCenterNoBorder); + } + else + { + excel.SetCellValue(row, 3, WDAC.GetInt32Value(r["SST05"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 4, WDAC.GetInt32Value(r["SST06"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 5, WDAC.GetInt32Value(r["SST10"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 6, WDAC.GetInt32Value(r["SST13"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 7, WDAC.GetInt32Value(r["SST07"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 8, WDAC.GetInt32Value(r["SST09"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 9, WDAC.GetInt32Value(r["SST08"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 10, (int)Math.Floor(加班 / 60.0), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 11, WDAC.GetInt32Value(r["SST04"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 12, WDAC.GetInt32Value(r["SST11"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 13, WDAC.GetInt32Value(r["SST14"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 14, WDAC.GetInt32Value(r["SST15"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 15, WDAC.GetInt32Value(r["SST16"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 16, WDAC.GetInt32Value(r["SST12"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 17, WDAC.GetInt32Value(r["SST19"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 18, WDAC.GetInt32Value(r["SST20"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 19, WDAC.GetInt32Value(r["SST23"]), bodyNumberStyleNoBorder); + } + row++; + serial++; + } + + #endregion + + #region 合計及表尾批示 + var 人數 = (float)資料來源.Tables[0].Rows.Count; + + // 表尾合計 + excel.MergeCell(row, 0, row, 2, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("{0} 位合計", 人數), titleStyleLeftNoBorder); + + if (以時分顯示時數) + { + excel.SetCellValue(row, 3, MinuteToTime(SST05_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 4, MinuteToTime(SST06_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 5, MinuteToTime(SST10_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 6, MinuteToTime(SST13_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 7, MinuteToTime(SST07_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 8, MinuteToTime(SST09_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 9, MinuteToTime(SST08_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 10, MinuteToTime(加班_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 11, MinuteToTime(SST04_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 12, MinuteToTime(SST11_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 13, MinuteToTime(SST14_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 14, MinuteToTime(SST15_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 15, MinuteToTime(SST16_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 16, MinuteToTime(SST12_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 17, MinuteToTime(SST19_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 18, MinuteToTime(SST20_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 19, MinuteToTime(SST23_SUM), bodyStyleCenterNoBorder); + } + else + { + excel.SetCellFormula(row, 3, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 3), excel.RCtoA1(row - 1, 3)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 4, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 4), excel.RCtoA1(row - 1, 4)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 5, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 5), excel.RCtoA1(row - 1, 5)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 6, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 6), excel.RCtoA1(row - 1, 6)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 7, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 7), excel.RCtoA1(row - 1, 7)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 8, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 8), excel.RCtoA1(row - 1, 8)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 9, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 9), excel.RCtoA1(row - 1, 9)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 10, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 10), excel.RCtoA1(row - 1, 10)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 11, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 11), excel.RCtoA1(row - 1, 11)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 12, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 12), excel.RCtoA1(row - 1, 12)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 13, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 13), excel.RCtoA1(row - 1, 13)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 14, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 14), excel.RCtoA1(row - 1, 14)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 15, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 15), excel.RCtoA1(row - 1, 15)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 16, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 16), excel.RCtoA1(row - 1, 16)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 17, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 17), excel.RCtoA1(row - 1, 17)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 18, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 18), excel.RCtoA1(row - 1, 18)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 19, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 19), excel.RCtoA1(row - 1, 19)), bodyNumberStyleNoBorder); + } + row++; + + // 表尾平均、備註 + excel.MergeCell(row, 0, row, 2, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("{0} 位平均", 人數), titleStyleLeftNoBorder); + + if (以時分顯示時數) + { + var SST05_AVG = SST05_SUM / 人數; + var SST06_AVG = SST06_SUM / 人數; + var SST10_AVG = SST10_SUM / 人數; + var SST13_AVG = SST13_SUM / 人數; + var SST07_AVG = SST07_SUM / 人數; + var SST09_AVG = SST09_SUM / 人數; + var SST08_AVG = SST08_SUM / 人數; + var 加班_AVG = 加班_SUM / 人數; + var SST04_AVG = SST04_SUM / 人數; + var SST11_AVG = SST11_SUM / 人數; + var SST14_AVG = SST14_SUM / 人數; + var SST15_AVG = SST15_SUM / 人數; + var SST16_AVG = SST16_SUM / 人數; + var SST12_AVG = SST12_SUM / 人數; + var SST19_AVG = SST19_SUM / 人數; + var SST20_AVG = SST20_SUM / 人數; + var SST23_AVG = SST23_SUM / 人數; + + excel.SetCellValue(row, 3, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST05_AVG / 60.0), (int)Math.Floor(SST05_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 4, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST06_AVG / 60.0), (int)Math.Floor(SST06_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 5, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST10_AVG / 60.0), (int)Math.Floor(SST10_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 6, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST13_AVG / 60.0), (int)Math.Floor(SST13_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 7, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST07_AVG / 60.0), (int)Math.Floor(SST07_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 8, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST09_AVG / 60.0), (int)Math.Floor(SST09_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 9, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST08_AVG / 60.0), (int)Math.Floor(SST08_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 10, string.Format("{0:#00}:{1:00}", (int)Math.Floor(加班_AVG / 60.0), (int)Math.Floor(加班_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 11, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST04_AVG / 60.0), (int)Math.Floor(SST04_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 12, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST11_AVG / 60.0), (int)Math.Floor(SST11_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 13, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST14_AVG / 60.0), (int)Math.Floor(SST14_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 14, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST15_AVG / 60.0), (int)Math.Floor(SST15_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 15, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST16_AVG / 60.0), (int)Math.Floor(SST16_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 16, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST12_AVG / 60.0), (int)Math.Floor(SST12_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 17, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST19_AVG / 60.0), (int)Math.Floor(SST19_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 18, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST20_AVG / 60.0), (int)Math.Floor(SST20_AVG % 60)), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 19, string.Format("{0:#00}:{1:00}", (int)Math.Floor(SST23_AVG / 60.0), (int)Math.Floor(SST23_AVG % 60)), bodyStyleCenterNoBorder); + row++; + + excel.MergeCell(row, 0, row, 2, BorderStyle.None); + excel.SetCellValue(row, 0, "備註:1.", titleStyleRightNoBorder); + excel.MergeCell(row, 3, row, 19, BorderStyle.None); + excel.SetCellValue(row, 3, "加班1為加班採申請加班費方式;加班2為加班採補休方式申請。", titleStyleLeftNoBorder); + row++; + + excel.MergeCell(row, 3, row, 19, BorderStyle.None); + excel.SetCellValue(row, 3, string.Format("本月平均加班時數為 {0:#00}:{1:00} 小時。", (int)Math.Floor(加班_AVG / 60.0), (int)Math.Floor(加班_AVG % 60)), titleStyleLeftNoBorder); + row++; + + excel.MergeCell(row, 0, row, 2, BorderStyle.None); + excel.SetCellValue(row, 0, "2.", titleStyleRightNoBorder); + excel.MergeCell(row, 3, row, 19, BorderStyle.None); + excel.SetCellValue(row, 3, string.Format("{0}全勤(不含補休、特休及公假)共 {1} 位,全勤占 {2:##0.0}%。", 月份, 全勤人數, ((double)全勤人數 / (double)人數 * 100.0)), titleStyleLeftNoBorder); + row++; + } + else + { + var 加班_AVG = (double)加班_SUM / (double)人數; + + excel.SetCellFormula(row, 3, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 3), excel.RCtoA1(row - 2, 3)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 4, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 4), excel.RCtoA1(row - 2, 4)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 5, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 5), excel.RCtoA1(row - 2, 5)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 6, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 6), excel.RCtoA1(row - 2, 6)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 7, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 7), excel.RCtoA1(row - 2, 7)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 8, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 8), excel.RCtoA1(row - 2, 8)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 9, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 9), excel.RCtoA1(row - 2, 9)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 10, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 10), excel.RCtoA1(row - 2, 10)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 11, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 11), excel.RCtoA1(row - 2, 11)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 12, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 12), excel.RCtoA1(row - 2, 12)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 13, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 13), excel.RCtoA1(row - 2, 13)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 14, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 14), excel.RCtoA1(row - 2, 14)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 15, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 15), excel.RCtoA1(row - 2, 15)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 16, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 16), excel.RCtoA1(row - 2, 16)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 17, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 17), excel.RCtoA1(row - 2, 17)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 18, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 18), excel.RCtoA1(row - 2, 18)), bodyNumberStyleNoBorderD2); + excel.SetCellFormula(row, 19, String.Format("AVERAGE({0}:{1})", excel.RCtoA1(beginRow, 19), excel.RCtoA1(row - 2, 19)), bodyNumberStyleNoBorderD2); + row++; + + excel.MergeCell(row, 0, row, 2, BorderStyle.None); + excel.SetCellValue(row, 0, "備註:1.", titleStyleRightNoBorder); + excel.MergeCell(row, 3, row, 19, BorderStyle.None); + excel.SetCellValue(row, 3, "加班1為加班採申請加班費方式;加班2為加班採補休方式申請。", titleStyleLeftNoBorder); + row++; + + excel.MergeCell(row, 3, row, 19, BorderStyle.None); + excel.SetCellValue(row, 3, string.Format("本月平均加班時數為 {0:#00.00} 小時。", 加班_AVG), titleStyleLeftNoBorder); + row++; + + excel.MergeCell(row, 0, row, 2, BorderStyle.None); + excel.SetCellValue(row, 0, "2.", titleStyleRightNoBorder); + excel.MergeCell(row, 3, row, 19, BorderStyle.None); + excel.SetCellValue(row, 3, string.Format("{0}全勤(不含補休、特休及公假)共 {1} 位,全勤占 {2:##0.0}%。", 月份, 全勤人數, ((double)全勤人數 / (double)人數 * 100.0)), titleStyleLeftNoBorder); + row++; + } + + excel.MergeCell(row, 0, row, 6, BorderStyle.None); + excel.SetCellValue(row, 0, "承辦人:", titleStyleLeftNoBorder); + excel.MergeCell(row, 7, row, 13, BorderStyle.None); + excel.SetCellValue(row, 7, "業務主管:", titleStyleLeftNoBorder); + excel.MergeCell(row, 14, row, 19, BorderStyle.None); + excel.SetCellValue(row, 14, "公司章:", titleStyleLeftNoBorder); + + #endregion + + excel.SetColumnWidth(0, 6); + excel.SetColumnWidth(1, 10); + excel.SetColumnWidth(2, 10); + excel.SetColumnWidth(3, 10); + excel.SetColumnWidth(4, 10); + excel.SetColumnWidth(5, 10); + excel.SetColumnWidth(6, 10); + excel.SetColumnWidth(7, 10); + excel.SetColumnWidth(8, 10); + excel.SetColumnWidth(9, 10); + excel.SetColumnWidth(10, 10); + excel.SetColumnWidth(11, 10); + excel.SetColumnWidth(12, 10); + excel.SetColumnWidth(13, 10); + excel.SetColumnWidth(14, 10); + excel.SetColumnWidth(15, 10); + excel.SetColumnWidth(16, 10); + excel.SetColumnWidth(17, 10); + excel.SetColumnWidth(18, 10); + excel.SetColumnWidth(19, 10); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } +} \ No newline at end of file diff --git a/Web/App_Code/Report/加班申請單.cs b/Web/App_Code/Report/加班申請單.cs new file mode 100644 index 0000000..781c32b --- /dev/null +++ b/Web/App_Code/Report/加班申請單.cs @@ -0,0 +1,246 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Data; +using System.Data.Common; +using NPOI.SS.UserModel; +using NPOI.HSSF.UserModel; +using NPOI.HSSF.Util; +using System.IO; +using NPOI.SS.Util; +using Wellan.Data; + +/// +/// 加班申請單 +/// +public class 加班申請單 : ExcelReportBase +{ + public 加班申請單() + { + 報表名稱 = "加班申請單"; + } + + public override MemoryStream 產生報表() + { + BodyRowHeight = 35; + + #region 報表抬頭 + + excel.MergeCell(0, 0, 0, 8); + excel.SetCellValue(0, 0, String.Format("{0}\r\n承辦{1}\r\n『{2}』\r\n{3}", 公司名稱, 客戶名稱, 專案名稱, 報表名稱), headerStyle); + excel.SetCellValue(1, 0, "月份:", titleStyleRightNoBorder); + excel.SetCellValue(1, 1, 報表時間.ToString("MM月"), titleStyleLeftNoBorder); + excel.SetCellValue(1, 2, "單位:", titleStyleRightNoBorder); + excel.SetCellValue(1, 3, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["站別"]), titleStyleLeftNoBorder); + excel.SetCellValue(1, 4, "職稱:", titleStyleRightNoBorder); + excel.SetCellValue(1, 5, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["職稱"]), titleStyleLeftNoBorder); + excel.SetCellValue(1, 6, "姓名:", titleStyleRightNoBorder); + excel.SetCellValue(1, 7, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["BPNME"]), titleStyleLeftNoBorder); + excel.SetRowHeight(0, HeaderRowHeight * 4); + excel.SetRowHeight(1, BodyRowHeight); + + excel.SetCellValue(2, 0, "加班日期", titleStyleCenter); + excel.SetCellValue(2, 1, "開始時間", titleStyleCenter); + excel.SetCellValue(2, 2, "結束時間", titleStyleCenter); + excel.SetCellValue(2, 3, "核定加班時數", titleStyleCenter); + excel.SetCellValue(2, 4, "核定加班費時數", titleStyleCenter); + excel.SetCellValue(2, 5, "核定補休時數", titleStyleCenter); + excel.MergeCell(2, 6, 2, 7); + excel.SetCellValue(2, 6, "加班事由", titleStyleCenter); + excel.SetRangeOuterBorder(2, 6, 2, 7, BorderStyle.Thin); + excel.SetCellValue(2, 8, "備註", titleStyleCenter); + excel.SetRowHeight(2, BodyRowHeight * 2); + + #endregion + + #region 報表資料 + + int RPTC1_SUM = 0; + int RPTC2_SUM = 0; + int RPTC3_SUM = 0; + int RPTC4_SUM = 0; + int RPTC5_SUM = 0; + int RPTCT_SUM = 0; + int FEE_THIS = 0; + int RST_THIS = 0; + int RST_SUM = 0; + int FEE_SUM = 0; + + int rowId = 3; + foreach (DataRow r in 資料來源.Tables[0].Rows) + { + int RPTCT = WDAC.GetInt32Value(r["RPTCT"]); + RPTCT_SUM += RPTCT; + + #region 區分假別統計 + switch (WDAC.GetStringValue(r["RPTYP"])) + { + case RPAR_TYPE.T11_非休息日累積補休時數: + case RPAR_TYPE.T13_休息日累積補休時數: + case RPAR_TYPE.T15_國定假日累積補休時數: + case RPAR_TYPE.T17_例假日累積補休時數: + RST_SUM += RPTCT; + RST_THIS = RPTCT; + FEE_THIS = 0; + break; + default: + RPTC1_SUM += WDAC.GetInt32Value(r["RPTC1"]); + RPTC2_SUM += WDAC.GetInt32Value(r["RPTC2"]); + RPTC3_SUM += WDAC.GetInt32Value(r["RPTC3"]); + RPTC4_SUM += WDAC.GetInt32Value(r["RPTC4"]); + RPTC5_SUM += WDAC.GetInt32Value(r["RPTC5"]); + FEE_SUM += RPTCT; + RST_THIS = 0; + FEE_THIS = RPTCT; + break; + } + #endregion + + excel.SetCellValue(rowId, 0, WDAC.GetDateTimeValue(r["RPRDT"]).ToString("MM月dd日"), titleStyleCenter); + excel.SetCellValue(rowId, 1, WDAC.GetStringValue(r["RPRTM"]), titleStyleCenter); + excel.SetCellValue(rowId, 2, WDAC.GetStringValue(r["RPETM"]), titleStyleCenter); + + if (以時分顯示時數) + { + excel.SetCellValue(rowId, 3, String.Format("{0:00}:{1:00}", RPTCT / 60, RPTCT % 60), titleStyleCenter); + excel.SetCellValue(rowId, 4, String.Format("{0:00}:{1:00}", FEE_THIS / 60, FEE_THIS % 60), titleStyleCenter); + excel.SetCellValue(rowId, 5, String.Format("{0:00}:{1:00}", RST_THIS / 60, RST_THIS % 60), titleStyleCenter); + } + else + { + excel.SetCellValue(rowId, 3, String.Format("{0:00}", RPTCT / 60), titleStyleCenter); + excel.SetCellValue(rowId, 4, String.Format("{0:00}", FEE_THIS / 60), titleStyleCenter); + excel.SetCellValue(rowId, 5, String.Format("{0:00}", RST_THIS / 60), titleStyleCenter); + } + + excel.MergeCell(rowId, 6, rowId, 7); + excel.SetCellValue(rowId, 6, WDAC.GetStringValue(r["RPRSN"]), bodyStyleCenterS); + excel.SetRangeOuterBorder(rowId, 6, rowId, 7, BorderStyle.Thin); + excel.SetCellValue(rowId, 8, WDAC.GetStringValue(r["RPDOC"]), bodyStyleCenterS); + excel.SetRowHeight(rowId, BodyRowHeight); + rowId++; + } + + #region 底下的統計 + // 左 + excel.MergeCell(rowId + 2, 0, rowId + 7, 0); + excel.MergeCell(rowId + 2, 1, rowId + 7, 1); + excel.MergeCell(rowId + 2, 2, rowId + 7, 2); + excel.SetCellValue(rowId + 2, 0, "總加班時數:", titleStyleRightNoBorder); + if (以時分顯示時數) + excel.SetCellValue(rowId + 2, 1, String.Format("{0:00}:{1:00}", RPTCT_SUM / 60, RPTCT_SUM % 60), titleStyleCenterNoBorder); + else + excel.SetCellValue(rowId + 2, 1, String.Format("{0:00}", RPTCT_SUM / 60), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 2, 2, "hrs", titleStyleLeftNoBorder); + excel.SetRangeOuterBorder(rowId + 2, 0, rowId + 7, 2, BorderStyle.Thin); + + // 中 + excel.SetCellValue(rowId + 2, 3, "申請加班費:", titleStyleLeftNoBorder); + excel.SetCellValue(rowId + 7, 3, "申請補休:", titleStyleLeftNoBorder); + if (以時分顯示時數) + { + excel.SetCellValue(rowId + 2, 4, String.Format("{0:00}:{1:00}", FEE_SUM / 60, FEE_SUM % 60), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 7, 4, String.Format("{0:00}:{1:00}", RST_SUM / 60, RST_SUM % 60), titleStyleCenterNoBorder); + } + else + { + excel.SetCellValue(rowId + 2, 4, String.Format("{0:00}", FEE_SUM / 60), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 7, 4, String.Format("{0:00}", RST_SUM / 60), titleStyleCenterNoBorder); + } + excel.SetCellValue(rowId + 2, 5, "hrs", titleStyleLeftNoBorder); + excel.SetCellValue(rowId + 7, 5, "hrs", titleStyleLeftNoBorder); + excel.SetRangeOuterBorder(rowId + 2, 3, rowId + 6, 5, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId + 7, 3, rowId + 7, 5, BorderStyle.Thin); + + // 右 + excel.SetCellValue(rowId + 2, 6, "一又三分之一:", titleStyleLeftNoBorder); + excel.SetCellValue(rowId + 3, 6, "一又三分之二:", titleStyleLeftNoBorder); + excel.SetCellValue(rowId + 4, 6, "國定假日:", titleStyleLeftNoBorder); + excel.SetCellValue(rowId + 5, 6, "休息日再延長:", titleStyleLeftNoBorder); + excel.SetCellValue(rowId + 6, 6, "例假日再延長:", titleStyleLeftNoBorder); + if (以時分顯示時數) + { + excel.SetCellValue(rowId + 2, 7, String.Format("{0:00}:{1:00}", RPTC1_SUM / 60, RPTC1_SUM % 60), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 3, 7, String.Format("{0:00}:{1:00}", RPTC2_SUM / 60, RPTC2_SUM % 60), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 4, 7, String.Format("{0:00}:{1:00}", RPTC3_SUM / 60, RPTC3_SUM % 60), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 5, 7, String.Format("{0:00}:{1:00}", RPTC4_SUM / 60, RPTC4_SUM % 60), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 6, 7, String.Format("{0:00}:{1:00}", RPTC5_SUM / 60, RPTC5_SUM % 60), titleStyleCenterNoBorder); + } + else + { + excel.SetCellValue(rowId + 2, 7, String.Format("{0:00}", RPTC1_SUM / 60), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 3, 7, String.Format("{0:00}", RPTC2_SUM / 60), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 4, 7, String.Format("{0:00}", RPTC3_SUM / 60), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 5, 7, String.Format("{0:00}", RPTC4_SUM / 60), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 6, 7, String.Format("{0:00}", RPTC5_SUM / 60), titleStyleCenterNoBorder); + } + excel.SetCellValue(rowId + 2, 8, "hrs", titleStyleLeftNoBorder); + excel.SetCellValue(rowId + 3, 8, "hrs", titleStyleLeftNoBorder); + excel.SetCellValue(rowId + 4, 8, "hrs", titleStyleLeftNoBorder); + excel.SetCellValue(rowId + 5, 8, "hrs", titleStyleLeftNoBorder); + excel.SetCellValue(rowId + 6, 8, "hrs", titleStyleLeftNoBorder); + + excel.SetRangeOuterBorder(rowId + 2, 6, rowId + 2, 8, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId + 3, 6, rowId + 3, 8, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId + 4, 6, rowId + 4, 8, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId + 5, 6, rowId + 5, 8, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId + 6, 6, rowId + 6, 8, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId + 7, 6, rowId + 7, 8, BorderStyle.Thin); + + excel.SetRowHeight(rowId + 2, BodyRowHeight); + excel.SetRowHeight(rowId + 3, BodyRowHeight); + excel.SetRowHeight(rowId + 4, BodyRowHeight); + excel.SetRowHeight(rowId + 5, BodyRowHeight); + excel.SetRowHeight(rowId + 6, BodyRowHeight); + excel.SetRowHeight(rowId + 7, BodyRowHeight); + + rowId += 7; + #endregion + + #region 表尾批示 + + //excel.MergeCell(rowId + 7, 0, rowId + 7, 8); + //excel.SetCellValue(rowId + 7, 0, "申請人:               計畫督導:               人事單位:", titleStyleLeftNoBorder); + //excel.SetRowHeight(rowId + 7, BodyRowHeight); + + //excel.MergeCell(rowId + 2, 0, rowId + 2, 2); + //excel.MergeCell(rowId + 3, 0, rowId + 3, 2); + //excel.SetCellValue(rowId + 2, 0, "申請人", titleStyleCenter); + //excel.SetRangeOuterBorder(rowId + 2, 0, rowId + 2, 2, BorderStyle.Thin); + //excel.SetRangeOuterBorder(rowId + 3, 0, rowId + 3, 2, BorderStyle.Thin); + + //excel.MergeCell(rowId + 2, 3, rowId + 2, 5); + //excel.MergeCell(rowId + 3, 3, rowId + 3, 5); + //excel.SetCellValue(rowId + 2, 3, "公司計畫督導", titleStyleCenter); + //excel.SetRangeOuterBorder(rowId + 2, 3, rowId + 2, 5, BorderStyle.Thin); + //excel.SetRangeOuterBorder(rowId + 3, 3, rowId + 3, 5, BorderStyle.Thin); + + //excel.MergeCell(rowId + 2, 6, rowId + 2, 8); + //excel.MergeCell(rowId + 3, 6, rowId + 3, 8); + //excel.SetCellValue(rowId + 2, 6, "公司計畫主持人", titleStyleCenter); + //excel.SetRangeOuterBorder(rowId + 2, 6, rowId + 2, 8, BorderStyle.Thin); + //excel.SetRangeOuterBorder(rowId + 3, 6, rowId + 3, 8, BorderStyle.Thin); + + //excel.SetRowHeight(rowId + 2, BodyRowHeight); + //excel.SetRowHeight(rowId + 3, BodyRowHeight); + + #endregion + + + #endregion + + excel.SetColumnWidth(0, 15); + excel.SetColumnWidth(1, 12); + excel.SetColumnWidth(2, 12); + excel.SetColumnWidth(3, 15); + excel.SetColumnWidth(4, 15); + excel.SetColumnWidth(5, 15); + excel.SetColumnWidth(6, 15); + excel.SetColumnWidth(7, 15); + excel.SetColumnWidth(8, 15); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } +} \ No newline at end of file diff --git a/Web/App_Code/Report/加班費印領清冊.cs b/Web/App_Code/Report/加班費印領清冊.cs new file mode 100644 index 0000000..4fd637a --- /dev/null +++ b/Web/App_Code/Report/加班費印領清冊.cs @@ -0,0 +1,491 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Data; +using System.Data.Common; +using NPOI.SS.UserModel; +using NPOI.HSSF.UserModel; +using NPOI.HSSF.Util; +using System.IO; +using NPOI.SS.Util; +using Wellan.Common; +using Wellan.Data; +using System.Linq; +using Microsoft.Win32; + +/// +/// 加班費印領清冊 的摘要描述 +/// +public class 加班費印領清冊 : ExcelReportBase +{ + public 加班費印領清冊() + { + 報表名稱 = "加班費明細表"; + } + + private int r = 2; + private DataRow[] data; + private int 加班費加總 = 0; + private int bodyBeginRow, dataBeginRow; + + public override MemoryStream 產生報表() + { + // 只要領加班費的紀錄 + data = 資料來源.Tables[0].Select( + string.Format("RPTYP = '{0}' OR RPTYP = '{1}' OR RPTYP = '{2}' OR RPTYP = '{3}'", + RPAR_TYPE.T12_非休息日請領加班費, + RPAR_TYPE.T14_休息日請領加班費, + RPAR_TYPE.T16_國定假日請領加班費, + RPAR_TYPE.T18_例假日請領加班費) , + "RPRDT"); + + foreach (DataRow r in data) + { + 加班費加總 += WDAC.GetInt32Value(r["RPAC1"]) + + WDAC.GetInt32Value(r["RPAC2"]) + + WDAC.GetInt32Value(r["RPAC3"]) + + WDAC.GetInt32Value(r["RPAC4"]) + + WDAC.GetInt32Value(r["RPAC5"]); + } + + 產生抬頭(); + 產生表身(); + 產生結尾(); + 設定欄寬及列印範圍(); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + + private void 產生抬頭() + { + excel.MergeCell(r, 0, r, 13); + excel.SetCellValue(r, 0, 公司名稱, headerStyle); + excel.SetRowHeight(r, 30); + r++; + + excel.MergeCell(r, 0, r, 13); + excel.SetCellValue(r, 0, 專案名稱, headerStyle); + excel.SetRowHeight(r, 30); + r++; + + excel.MergeCell(r, 0, r, 13); + excel.SetCellValue(r, 0, 報表名稱, headerStyle); + excel.SetRowHeight(r, 30); + r++; + + excel.MergeCell(r, 0, r, 13); + excel.SetCellValue(r, 0, "金額(此欄填寫數字)", bodyStyleCenter); + excel.SetRowHeight(r, 20); + r++; + + excel.MergeCell(r, 0, r, 3); + excel.SetCellValue(r, 0, "萬", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 0, r, 3, BorderStyle.Thin); + excel.MergeCell(r, 4, r, 6); + excel.SetCellValue(r, 4, "仟", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 4, r, 6, BorderStyle.Thin); + excel.MergeCell(r, 7, r, 7); + excel.SetCellValue(r, 7, "佰", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 7, r, 7, BorderStyle.Thin); + excel.MergeCell(r, 8, r, 10); + excel.SetCellValue(r, 8, "拾", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 8, r, 10, BorderStyle.Thin); + excel.MergeCell(r, 11, r, 13); + excel.SetCellValue(r, 11, "元", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 11, r, 13, BorderStyle.Thin); + excel.SetRowHeight(r, 30); + r++; + + string s加班費加總 = String.Format("{0:00000}", 加班費加總) + "00000"; + excel.MergeCell(r, 0, r, 3); + excel.SetCellValue(r, 0, s加班費加總[0].ToString(), bodyStyleCenter); + excel.SetRangeOuterBorder(r, 0, r, 3, BorderStyle.Thin); + excel.MergeCell(r, 4, r, 6); + excel.SetCellValue(r, 4, s加班費加總[1].ToString(), bodyStyleCenter); + excel.SetRangeOuterBorder(r, 4, r, 6, BorderStyle.Thin); + excel.MergeCell(r, 7, r, 7); + excel.SetCellValue(r, 7, s加班費加總[2].ToString(), bodyStyleCenter); + excel.SetRangeOuterBorder(r, 7, r, 7, BorderStyle.Thin); + excel.MergeCell(r, 8, r, 10); + excel.SetCellValue(r, 8, s加班費加總[3].ToString(), bodyStyleCenter); + excel.SetRangeOuterBorder(r, 8, r, 10, BorderStyle.Thin); + excel.MergeCell(r, 11, r, 13); + excel.SetCellValue(r, 11, s加班費加總[4].ToString(), bodyStyleCenter); + excel.SetRangeOuterBorder(r, 11, r, 13, BorderStyle.Thin); + excel.SetRangeOuterBorder(r - 2, 0, r, 13, BorderStyle.Thick); + excel.SetRowHeight(r, 25); + r++; + + excel.SetCellValue(r, 11, String.Format("{0:yyyy}年度", 報表時間, WGuard1.TaiwanCulture), bodyStyleRightNoBorder); + excel.SetCellValue(r, 12, String.Format("{0:MM}", 報表時間), bodyStyleCenterNoBorder); + excel.SetCellValue(r, 13, "月", bodyStyleLeftNoBorder); + excel.SetRowHeight(r, 25); + r++; + + bodyBeginRow = r; + excel.MergeCell(r, 0, r, 1); + excel.SetCellValue(r, 0, "姓名", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 0, r, 1, BorderStyle.Thin); + excel.MergeCell(r, 2, r, 5); + excel.SetCellValue(r, 2, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["BPNME"]), bodyStyleCenter); + excel.SetRangeOuterBorder(r, 2, r, 5, BorderStyle.Thin); + excel.SetCellValue(r, 6, "單位", bodyStyleCenter); + excel.MergeCell(r, 7, r, 10); + excel.SetCellValue(r, 7, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["站別"]), bodyStyleCenter); + excel.SetRangeOuterBorder(r, 7, r, 10, BorderStyle.Thin); + excel.SetCellValue(r, 11, "職稱", bodyStyleCenter); + excel.MergeCell(r, 12, r, 13); + excel.SetCellValue(r, 12, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["職稱"]), bodyStyleCenter); + excel.SetRangeOuterBorder(r, 12, r, 13, BorderStyle.Thin); + excel.SetRowHeight(r, 35); + r++; + + excel.MergeCell(r, 0, r, 6); + excel.SetCellValue(r, 0, "加班日及起迄時間", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 0, r, 6, BorderStyle.Thin); + excel.MergeCell(r, 7, r + 1, 8); + excel.SetCellValue(r, 7, "加班時數", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 7, r + 1, 8, BorderStyle.Thin); + excel.MergeCell(r, 9, r + 1, 10); + excel.SetCellValue(r, 9, "加班費\n金額", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 9, r + 1, 10, BorderStyle.Thin); + //excel.MergeCell(r, 11, r + 1, 11); + //excel.SetCellValue(r, 11, "蓋章", bodyStyleCenter); + //excel.SetRangeOuterBorder(r, 11, r + 1, 11, BorderStyle.Thin); + excel.MergeCell(r, 11, r + 1, 13); + excel.SetCellValue(r, 11, "備註", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 11, r + 1, 13, BorderStyle.Thin); + + excel.SetCellValue(r + 1, 0, "月", bodyStyleCenter); + excel.SetCellValue(r + 1, 1, "日", bodyStyleCenter); + excel.MergeCell(r + 1, 2, r + 1, 3); + excel.SetCellValue(r + 1, 2, "起", bodyStyleCenter); + excel.SetRangeOuterBorder(r + 1, 2, r + 1, 3, BorderStyle.Thin); + excel.MergeCell(r + 1, 4, r + 1, 5); + excel.SetCellValue(r + 1, 4, "至", bodyStyleCenter); + excel.SetRangeOuterBorder(r + 1, 4, r + 1, 5, BorderStyle.Thin); + excel.SetCellValue(r + 1, 6, "迄", bodyStyleCenter); + + // 畫雙線 + excel.SetRangeOuterBorder(r - 1, 0, r - 1, 13, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Double, BorderStyle.Thin); + excel.SetRowHeight(r, 25); + excel.SetRowHeight(r + 1, 25); + r += 2; + dataBeginRow = r; + } + + private void 產生表身() + { + List oneDayItems = new List(); + + TimeCalc timeCalc = new TimeCalc(); + + foreach (DataRow row in data) + { + timeCalc.Init(WDAC.GetStringValue(row["RPNUM"]), WDAC.GetDateTimeValue(row["RPRDT"])); + + int rptc1, rptc2, rptc3, rptc4, rptc5, rpac1, rpac2, rpac3, rpac4, rpac5; + string rptyp; + rptc1 = WDAC.GetInt32Value(row["RPTC1"]); + rptc2 = WDAC.GetInt32Value(row["RPTC2"]); + rptc3 = WDAC.GetInt32Value(row["RPTC3"]); + rptc4 = WDAC.GetInt32Value(row["RPTC4"]); + rptc5 = WDAC.GetInt32Value(row["RPTC5"]); + rpac1 = WDAC.GetInt32Value(row["RPAC1"]); + rpac2 = WDAC.GetInt32Value(row["RPAC2"]); + rpac3 = WDAC.GetInt32Value(row["RPAC3"]); + rpac4 = WDAC.GetInt32Value(row["RPAC4"]); + rpac5 = WDAC.GetInt32Value(row["RPAC5"]); + rptyp = WDAC.GetStringValue(row["RPTYP"]); + + oneDayItems.Clear(); + string beginTime = WDAC.GetStringValue(row["RPRTM"]); + + switch (rptyp) + { + case RPAR_TYPE.T12_非休息日請領加班費: + case RPAR_TYPE.T14_休息日請領加班費: + case RPAR_TYPE.T18_例假日請領加班費: + var skiprest = rptyp != RPAR_TYPE.T12_非休息日請領加班費; + if (rptc1 > 0) + { + var endtime = TimeAddMinutes(beginTime, rptc1, timeCalc.午休開始, timeCalc.午休結束, skiprest); + oneDayItems.Add(new OverTimeItem() + { + BeginTime = beginTime, + EndTime = endtime, + TimeName = "一又三分之一", + Hours = (double)rptc1 / 60D, + Amount = rpac1 + }); + beginTime = endtime; + } + if (rptc2 > 0) + { + var endtime = TimeAddMinutes(beginTime, rptc2, timeCalc.午休開始, timeCalc.午休結束, skiprest); + oneDayItems.Add(new OverTimeItem() + { + BeginTime = beginTime, + EndTime = endtime, + TimeName = "一又三分之二", + Hours = (double)rptc2 / 60D, + Amount = rpac2 + }); + beginTime = endtime; + } + if (rptc3 > 0) + { + var endtime = TimeAddMinutes(beginTime, rptc3, timeCalc.午休開始, timeCalc.午休結束, skiprest); + oneDayItems.Add(new OverTimeItem() + { + BeginTime = beginTime, + EndTime = endtime, + TimeName = "國定假日", + Hours = (double)rptc3 / 60D, + Amount = rpac3 + }); + beginTime = endtime; + } + if (rptc4 > 0) + { + var endtime = TimeAddMinutes(beginTime, rptc4, timeCalc.午休開始, timeCalc.午休結束, skiprest); + oneDayItems.Add(new OverTimeItem() + { + BeginTime = beginTime, + EndTime = endtime, + TimeName = "休息日再延長", + Hours = (double)rptc4 / 60D, + Amount = rpac4 + }); + beginTime = endtime; + } + if (rptc5 > 0) + { + var endtime = TimeAddMinutes(beginTime, rptc5, timeCalc.午休開始, timeCalc.午休結束, skiprest); + oneDayItems.Add(new OverTimeItem() + { + BeginTime = beginTime, + EndTime = endtime, + TimeName = "例假日再延長", + Hours = (double)rptc5 / 60D, + Amount = rpac5 + }); + beginTime = endtime; + } + break; + case RPAR_TYPE.T16_國定假日請領加班費: + if (rptc3 > 0) + { + var endtime = TimeAddMinutes(beginTime, rptc3, timeCalc.午休開始, timeCalc.午休結束, false); + oneDayItems.Add(new OverTimeItem() + { + BeginTime = beginTime, + EndTime = endtime, + TimeName = "國定假日", + Hours = (double)rptc3 / 60D, + Amount = rpac3 + }); + beginTime = endtime; + } + if (rptc1 > 0) + { + var endtime = TimeAddMinutes(beginTime, rptc1, timeCalc.午休開始, timeCalc.午休結束, false); + oneDayItems.Add(new OverTimeItem() + { + BeginTime = beginTime, + EndTime = endtime, + TimeName = "國定假日延長(9-10)", + Hours = (double)rptc1 / 60D, + Amount = rpac1 + }); + beginTime = endtime; + } + if (rptc2 > 0) + { + var endtime = TimeAddMinutes(beginTime, rptc2, timeCalc.午休開始, timeCalc.午休結束, false); + oneDayItems.Add(new OverTimeItem() + { + BeginTime = beginTime, + EndTime = endtime, + TimeName = "國定假日延長(11-12)", + Hours = (double)rptc2 / 60D, + Amount = rpac2 + }); + beginTime = endtime; + } + break; + } + + for (int i = 0; i < oneDayItems.Count; i++) + { + OverTimeItem item = oneDayItems[i]; + + excel.SetCellValue(r + i, 0, String.Format("{0:MM}", row["RPRDT"]), bodyStyleCenter); + excel.SetCellValue(r + i, 1, String.Format("{0:dd}", row["RPRDT"]), bodyStyleCenter); + + excel.MergeCell(r + i, 11, r + i, 13); + excel.SetCellValue(r + i, 11, String.Format("{0}", row["RPDOC"]), bodyStyleCenter); + excel.SetRangeOuterBorder(r + i, 11, r + i, 13, BorderStyle.Thin); + + excel.MergeCell(r + i, 2, r + i, 3); + excel.SetCellValue(r + i, 2, item.BeginTime, bodyStyleCenter); + excel.SetRangeOuterBorder(r + i, 2, r + i, 3, BorderStyle.Thin); + + excel.MergeCell(r + i, 4, r + i, 5); + excel.SetCellValue(r + i, 4, "~", bodyStyleCenter); + excel.SetRangeOuterBorder(r + i, 4, r + i, 5, BorderStyle.Thin); + + excel.SetCellValue(r + i, 6, item.EndTime, bodyStyleCenter); + + excel.SetCellValue(r + i, 7, item.TimeName, bodyStyleCenter); + + excel.SetCellValue(r + i, 8, item.Hours, bodyStyleCenter); + + excel.MergeCell(r + i, 9, r + i, 10); + excel.SetCellValue(r + i, 9, item.Amount, bodyStyleCenter); + excel.SetRangeOuterBorder(r + i, 9, r + i, 10, BorderStyle.Thin); + + excel.SetRowHeight(r + i, 35); + } + + r += oneDayItems.Count; + + } + + // 蓋章 + //excel.MergeCell(dataBeginRow, 11, r - 1, 11); + //excel.SetCellValue(dataBeginRow, 11, "", bodyStyleCenter); + //excel.SetRangeOuterBorder(dataBeginRow, 11, r - 1, 11, BorderStyle.Thin); + + // 合計 + excel.SetCellValue(r, 6, "合計", bodyStyleCenter); + excel.SetCellFormula(r, 7, String.Format("SUM({0}:{1})", excel.RCtoA1(dataBeginRow, 8), excel.RCtoA1(r - 1, 8)), bodyStyleCenter); + excel.SetCellValue(r, 8, "小時", bodyStyleCenter); + excel.SetCellFormula(r, 9, String.Format("SUM({0}:{1})", excel.RCtoA1(dataBeginRow, 9), excel.RCtoA1(r - 1, 9)), bodyStyleCenter); + excel.SetCellValue(r, 10, "元", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 7, r, 7, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.None); + excel.SetRangeOuterBorder(r, 8, r, 8, BorderStyle.Thin, BorderStyle.None, BorderStyle.Thin, BorderStyle.Thin); + excel.SetRangeOuterBorder(r, 9, r, 9, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.None); + excel.SetRangeOuterBorder(r, 10, r, 10, BorderStyle.Thin, BorderStyle.None, BorderStyle.Thin, BorderStyle.Thin); + excel.SetRowHeight(r, 25); + r++; + } + + private void 產生結尾() + { + excel.MergeCell(r, 0, r, 3); + excel.SetCellValue(r, 0, "茲收到加班費新台幣", bodyStyleCenter); + excel.MergeCell(r, 4, r, 9); + excel.SetCellValue(r, 4, WGuard1.WNTSA(加班費加總, "", true), bodyStyleRight); + excel.MergeCell(r, 10, r, 13); + excel.SetCellValue(r, 10, "此 據 (金額請大寫)", bodyStyleCenter); + excel.SetRowHeight(r, 30); + excel.SetRangeOuterBorder(r, 0, r, 3, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.None); + excel.SetRangeOuterBorder(r, 4, r, 9, BorderStyle.Thin, BorderStyle.None, BorderStyle.Thin, BorderStyle.None); + excel.SetRangeOuterBorder(r, 10, r, 13, BorderStyle.Thin, BorderStyle.None, BorderStyle.Thin, BorderStyle.Thin); + r++; + + excel.MergeCell(r, 0, r, 5); + excel.SetCellValue(r, 0, "申請人", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 0, r, 5, BorderStyle.Thin); + excel.MergeCell(r, 6, r, 9); + excel.SetCellValue(r, 6, "計劃督導", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 6, r, 9, BorderStyle.Thin); + excel.MergeCell(r, 10, r, 13); + excel.SetCellValue(r, 10, "計劃主持人", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 10, r, 13, BorderStyle.Thin); + excel.SetRowHeight(r, 30); + r++; + + excel.MergeCell(r, 0, r, 5); + excel.SetCellValue(r, 0, "", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 0, r, 5, BorderStyle.Thin); + excel.MergeCell(r, 6, r, 9); + excel.SetCellValue(r, 6, "", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 6, r, 9, BorderStyle.Thin); + excel.MergeCell(r, 10, r, 13); + excel.SetCellValue(r, 10, "", bodyStyleCenter); + excel.SetRangeOuterBorder(r, 10, r, 13, BorderStyle.Thin); + excel.SetRowHeight(r, 50); + + excel.SetRangeOuterBorder(bodyBeginRow, 0, r, 13, BorderStyle.Thick); + } + + private void 設定欄寬及列印範圍() + { + excel.SetColumnWidth(0, 6); + excel.SetColumnWidth(1, 6); + excel.SetColumnWidth(2, 2); + excel.SetColumnWidth(3, 7); + excel.SetColumnWidth(4, 3); + excel.SetColumnWidth(5, 5); + excel.SetColumnWidth(6, 11); + excel.SetColumnWidth(7, 18); + excel.SetColumnWidth(8, 7); + excel.SetColumnWidth(9, 8); + excel.SetColumnWidth(10, 3); + excel.SetColumnWidth(11, 11); + excel.SetColumnWidth(12, 7); + excel.SetColumnWidth(13, 8); + } + + private string TimeAddMinutes(string time, int addMinutes, string restBegin, string restEnd, bool skipRest) + { + int restBeginHour = 0; + int restBeginMin = 0; + int restEndHour = 0; + int restEndMin = 0; + int restBeginTime = 0; + int restEndTime = 0; + if (!string.IsNullOrEmpty(restBegin)) + { + string[] tp1 = restBegin.Split(':'); + if (int.TryParse(tp1[0], out restBeginHour) && int.TryParse(tp1[1], out restBeginMin)) + restBeginTime = restBeginHour * 60 + restBeginMin; + } + if (!string.IsNullOrEmpty(restEnd)) + { + string[] tp1 = restEnd.Split(':'); + if (int.TryParse(tp1[0], out restEndHour) && int.TryParse(tp1[1], out restEndMin)) + restEndTime = restEndHour * 60 + restEndMin; + } + + string[] timepart = time.Split(':'); + int hour, min; + if (int.TryParse(timepart[0], out hour) && int.TryParse(timepart[1], out min)) + { + int beginTime = hour * 60 + min; + int extraAddMinutes = 0; + + if (beginTime <= restBeginTime && beginTime + addMinutes >= restBeginTime) + { + int tempEndTime = beginTime + addMinutes; + // 跨越中午休息時間,要摳掉 + if (tempEndTime >= restEndTime && skipRest) + extraAddMinutes = restEndTime - restBeginTime; + // 跨進,但未跨越,不要摳掉 + if (tempEndTime < restEndTime) + // extraAddMinutes = (int)Math.Truncate((restEndTime - tempEndTime).TotalMinutes); + extraAddMinutes = 0; + } + + var result = beginTime + addMinutes + extraAddMinutes; + return string.Format("{0:00}:{1:00}", (int)Math.Truncate((double)result / (double)60), result % 60); + } + else + { + return ""; + } + } +} + +class OverTimeItem +{ + public string BeginTime { get; set; } + public string EndTime { get; set; } + public string TimeName { get; set; } + public double Hours { get; set; } + public double Amount { get; set; } +} diff --git a/Web/App_Code/Report/加班費明細.cs b/Web/App_Code/Report/加班費明細.cs new file mode 100644 index 0000000..5c02957 --- /dev/null +++ b/Web/App_Code/Report/加班費明細.cs @@ -0,0 +1,197 @@ +using System; +using System.Collections.Generic; +using System.Data; +using NPOI.SS.UserModel; +using System.IO; +using Wellan.Data; +using Wellan.Common; + +/// +/// 加班費明細 的摘要描述 +/// +public class 加班費明細 : ExcelReportBase +{ + public 加班費明細() + { + } + + protected override void Init() + { + base.Init(); + titleStyleCenterNoBorder.SetFont(bodyFont); + bodyStyleCenterNoBorder.SetFont(bodyFont); + bodyStyleLeftNoBorder.SetFont(bodyFont8PT); + bodyNumberStyleNoBorder.SetFont(bodyFont); + titleStyleRightNoBorder.SetFont(bodyFont); + titleStyleLeftNoBorder.SetFont(bodyFont); + } + + public override MemoryStream 產生報表() + { + #region 報表抬頭 + + var row = 0; + + excel.MergeCell(row, 0, row, 15, BorderStyle.None); + excel.SetCellValue(row, 0, 公司名稱, headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 15, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("承辦{0}", 客戶名稱), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 15, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("『{0}』", 專案名稱), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 15, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("{0}【{1}{2}】", 報表名稱, 年度, 月份), headerStyle); + excel.SetRowHeight(row, 20); + row++; + + excel.MergeCell(row, 4, row, 14, BorderStyle.None); + excel.SetCellValue(row, 4, "加班時數 / 金額", titleStyleCenterNoBorder); + row++; + + excel.SetCellValue(row, 0, "序號", titleStyleCenterNoBorder); + excel.SetCellValue(row, 1, "站別", titleStyleCenterNoBorder); + excel.SetCellValue(row, 2, "人員姓名", titleStyleCenterNoBorder); + excel.SetCellValue(row, 3, "薪資", titleStyleCenterNoBorder); + excel.SetCellValue(row, 4, string.Format("前段*{0}", 報表參數["前段"]), titleStyleCenterNoBorder); + excel.SetCellValue(row, 5, "小計", titleStyleCenterNoBorder); + excel.SetCellValue(row, 6, string.Format("後段*{0}", 報表參數["後段"]), titleStyleCenterNoBorder); + excel.SetCellValue(row, 7, "小計", titleStyleCenterNoBorder); + excel.SetCellValue(row, 8, string.Format("休息日再延長*{0}", 報表參數["休息日延長"]), titleStyleCenterNoBorder); + excel.SetCellValue(row, 9, "小計", titleStyleCenterNoBorder); + excel.SetCellValue(row, 10, string.Format("假日*{0}", 報表參數["假日"]), titleStyleCenterNoBorder); + excel.SetCellValue(row, 11, "小計", titleStyleCenterNoBorder); + excel.SetCellValue(row, 12, string.Format("例假日再延長*{0}", 報表參數["例假日延長"]), titleStyleCenterNoBorder); + excel.SetCellValue(row, 13, "小計", titleStyleCenterNoBorder); + excel.SetCellValue(row, 14, "請領金額", titleStyleCenterNoBorder); + excel.SetCellValue(row, 15, "備註", titleStyleCenterNoBorder); + excel.SetRowHeight(row, 24); + row++; + + #endregion + + #region 報表資料 + + int beginRow = row; + int serial = 1; + int SST01_SUM = 0; + int SST02_SUM = 0; + int SST03_SUM = 0; + int SST21_SUM = 0; + int SST22_SUM = 0; + + foreach (DataRow r in 資料來源.Tables[0].Rows) + { + var 月薪 = WDAC.GetInt32Value(r["SSP00"]) + WDAC.GetInt32Value(r["SSP02"]); + var 加班費合計 = WDAC.GetInt32Value(r["SSP06"]) + + WDAC.GetInt32Value(r["SSP07"]) + + WDAC.GetInt32Value(r["SSP08"]) + + WDAC.GetInt32Value(r["SSP13"]) + + WDAC.GetInt32Value(r["SSP14"]); + + excel.SetCellValue(row, 0, serial, bodyStyleCenterNoBorder); + excel.SetCellValue(row, 1, WDAC.GetStringValue(r["SSBRHX"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 2, WDAC.GetStringValue(r["BPNME"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 3, 月薪, bodyNumberStyleNoBorder); + excel.SetCellValue(row, 5, WDAC.GetInt32Value(r["SSP06"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 7, WDAC.GetInt32Value(r["SSP07"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 9, WDAC.GetInt32Value(r["SSP13"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 11, WDAC.GetInt32Value(r["SSP08"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 13, WDAC.GetInt32Value(r["SSP14"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 14, 加班費合計, bodyNumberStyleNoBorder); + excel.SetCellValue(row, 15, WDAC.GetStringValue(r["SSC02"]), bodyStyleLeftNoBorder); + + if (以時分顯示時數) + { + excel.SetCellValue(row, 4, string.Format("{0:#00}:{1:00}", r["SST01"], r["SST01M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 6, string.Format("{0:#00}:{1:00}", r["SST02"], r["SST02M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 8, string.Format("{0:#00}:{1:00}", r["SST21"], r["SST21M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 10, string.Format("{0:#00}:{1:00}", r["SST03"], r["SST03M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 12, string.Format("{0:#00}:{1:00}", r["SST22"], r["SST22M"]), bodyStyleCenterNoBorder); + } + else + { + excel.SetCellValue(row, 4, WDAC.GetInt32Value(r["SST01"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 6, WDAC.GetInt32Value(r["SST02"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 8, WDAC.GetInt32Value(r["SST21"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 10, WDAC.GetInt32Value(r["SST03"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 12, WDAC.GetInt32Value(r["SST22"]), bodyNumberStyleNoBorder); + } + + SST01_SUM += WDAC.GetInt32Value(r["SST01"]) * 60 + WDAC.GetInt32Value(r["SST01M"]); + SST02_SUM += WDAC.GetInt32Value(r["SST02"]) * 60 + WDAC.GetInt32Value(r["SST02M"]); + SST03_SUM += WDAC.GetInt32Value(r["SST03"]) * 60 + WDAC.GetInt32Value(r["SST03M"]); + SST21_SUM += WDAC.GetInt32Value(r["SST21"]) * 60 + WDAC.GetInt32Value(r["SST21M"]); + SST22_SUM += WDAC.GetInt32Value(r["SST22"]) * 60 + WDAC.GetInt32Value(r["SST22M"]); + + row++; + serial++; + } + + #endregion + + #region 合計及表尾批示 + excel.MergeCell(row, 0, row, 1, BorderStyle.None); + excel.SetCellValue(row, 0, "合計", titleStyleLeftNoBorder); + + excel.SetCellFormula(row, 5, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 5), excel.RCtoA1(row - 1, 5)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 7, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 7), excel.RCtoA1(row - 1, 7)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 9, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 9), excel.RCtoA1(row - 1, 9)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 11, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 11), excel.RCtoA1(row - 1, 11)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 13, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 13), excel.RCtoA1(row - 1, 13)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 14, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 14), excel.RCtoA1(row - 1, 14)), bodyNumberStyleNoBorder); + + if (以時分顯示時數) + { + excel.SetCellValue(row, 4, MinuteToTime(SST01_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 6, MinuteToTime(SST02_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 8, MinuteToTime(SST21_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 10, MinuteToTime(SST03_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 12, MinuteToTime(SST22_SUM), bodyStyleCenterNoBorder); + } + else + { + excel.SetCellFormula(row, 4, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 4), excel.RCtoA1(row - 1, 4)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 6, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 6), excel.RCtoA1(row - 1, 6)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 8, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 8), excel.RCtoA1(row - 1, 8)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 10, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 10), excel.RCtoA1(row - 1, 10)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 12, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 12), excel.RCtoA1(row - 1, 12)), bodyNumberStyleNoBorder); + } + row++; + + excel.MergeCell(row, 0, row, 5, BorderStyle.None); + excel.SetCellValue(row, 0, "承辦人:", titleStyleLeftNoBorder); + excel.MergeCell(row, 6, row, 10, BorderStyle.None); + excel.SetCellValue(row, 6, "業務主管:", titleStyleLeftNoBorder); + excel.MergeCell(row, 11, row, 15, BorderStyle.None); + excel.SetCellValue(row, 11, "公司章:", titleStyleLeftNoBorder); + + #endregion + + excel.SetColumnWidth(0, 6); + excel.SetColumnWidth(1, 10); + excel.SetColumnWidth(2, 10); + excel.SetColumnWidth(3, 10); + excel.SetColumnWidth(4, 10); + excel.SetColumnWidth(5, 10); + excel.SetColumnWidth(6, 10); + excel.SetColumnWidth(7, 10); + excel.SetColumnWidth(8, 10); + excel.SetColumnWidth(9, 10); + excel.SetColumnWidth(10, 10); + excel.SetColumnWidth(11, 10); + excel.SetColumnWidth(12, 10); + excel.SetColumnWidth(13, 10); + excel.SetColumnWidth(14, 10); + excel.SetColumnWidth(15, 50); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + +} \ No newline at end of file diff --git a/Web/App_Code/Report/各項法定提撥費用明細表.cs b/Web/App_Code/Report/各項法定提撥費用明細表.cs new file mode 100644 index 0000000..e8531cb --- /dev/null +++ b/Web/App_Code/Report/各項法定提撥費用明細表.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Data; +using NPOI.SS.UserModel; +using System.IO; +using Wellan.Data; +using Wellan.Common; + +/// +/// 各項法定提撥費用明細表 的摘要描述 +/// +public class 各項法定提撥費用明細表 : ExcelReportBase +{ + public 各項法定提撥費用明細表() + { + } + + protected override void Init() + { + base.Init(); + titleStyleCenterNoBorder.SetFont(bodyFont); + bodyStyleCenterNoBorder.SetFont(bodyFont); + bodyNumberStyleNoBorder.SetFont(bodyFont); + titleStyleRightNoBorder.SetFont(bodyFont); + titleStyleLeftNoBorder.SetFont(bodyFont); + } + + public override MemoryStream 產生報表() + { + #region 報表抬頭 + + var row = 0; + + excel.MergeCell(row, 0, row, 14, BorderStyle.None); + excel.SetCellValue(row, 0, 公司名稱, headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 14, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("承辦{0}", 客戶名稱), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 14, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("『{0}』", 專案名稱), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 14, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("{0}【{1}{2}】", 報表名稱, 年度, 月份), headerStyle); + excel.SetRowHeight(row, 20); + row++; + + excel.MergeCell(row, 5, row, 8, BorderStyle.None); + excel.SetCellValue(row, 5, "員工自負額", titleStyleCenterNoBorder); + excel.MergeCell(row, 9, row, 14, BorderStyle.None); + excel.SetCellValue(row, 9, "雇主負擔部分", titleStyleCenterNoBorder); + row++; + + excel.SetCellValue(row, 0, "序號", titleStyleCenterNoBorder); + excel.SetCellValue(row, 1, "派遣者", titleStyleCenterNoBorder); + excel.SetCellValue(row, 2, "薪資", titleStyleCenterNoBorder); + excel.SetCellValue(row, 3, "投保等級", titleStyleCenterNoBorder); + excel.SetCellValue(row, 4, "到職天數", titleStyleCenterNoBorder); + excel.SetCellValue(row, 5, "勞保", titleStyleCenterNoBorder); + excel.SetCellValue(row, 6, "健保", titleStyleCenterNoBorder); + excel.SetCellValue(row, 7, "福利金", titleStyleCenterNoBorder); + excel.SetCellValue(row, 8, "勞退自提", titleStyleCenterNoBorder); + excel.SetCellValue(row, 9, "勞保", titleStyleCenterNoBorder); + excel.SetCellValue(row, 10, "職災保險", titleStyleCenterNoBorder); + excel.SetCellValue(row, 11, "就業保險", titleStyleCenterNoBorder); + excel.SetCellValue(row, 12, "工資墊償", titleStyleCenterNoBorder); + excel.SetCellValue(row, 13, "健保", titleStyleCenterNoBorder); + excel.SetCellValue(row, 14, "勞退提撥", titleStyleCenterNoBorder); + row++; + + #endregion + + #region 報表資料 + + int beginRow = row; + int serial = 1; + foreach (DataRow r in 資料來源.Tables[0].Rows) + { + excel.SetCellValue(row, 0, serial, bodyStyleCenterNoBorder); + excel.SetCellValue(row, 1, WDAC.GetStringValue(r["BPNME"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 2, WDAC.GetInt32Value(r["SSP00"]) + WDAC.GetInt32Value(r["SSP02"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 3, WDAC.GetInt32Value(r["SSL01"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 4, WDAC.GetInt32Value(r["SSD02"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 5, WDAC.GetInt32Value(r["SSS04"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 6, WDAC.GetInt32Value(r["SSS05"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 7, WDAC.GetInt32Value(r["SSS07"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 8, WDAC.GetInt32Value(r["SSS06"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 9, WDAC.GetInt32Value(r["SSH01"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 10, WDAC.GetInt32Value(r["SSH02"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 11, WDAC.GetInt32Value(r["SSH03"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 12, WDAC.GetInt32Value(r["SSH04"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 13, WDAC.GetInt32Value(r["SSH05"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 14, WDAC.GetInt32Value(r["SSH06"]), bodyNumberStyleNoBorder); + row++; + serial++; + } + + #endregion + + #region 合計及表尾批示 + excel.MergeCell(row, 0, row, 1, BorderStyle.None); + excel.SetCellValue(row, 0, "合計", titleStyleLeftNoBorder); + + excel.SetCellFormula(row, 5, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 5), excel.RCtoA1(row - 1, 5)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 6, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 6), excel.RCtoA1(row - 1, 6)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 7, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 7), excel.RCtoA1(row - 1, 7)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 8, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 8), excel.RCtoA1(row - 1, 8)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 9, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 9), excel.RCtoA1(row - 1, 9)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 10, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 10), excel.RCtoA1(row - 1, 10)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 11, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 11), excel.RCtoA1(row - 1, 11)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 12, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 12), excel.RCtoA1(row - 1, 12)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 13, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 13), excel.RCtoA1(row - 1, 13)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 14, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 14), excel.RCtoA1(row - 1, 14)), bodyNumberStyleNoBorder); + row++; + + excel.SetCellValue(row, 9, "雇主勞保", titleStyleRightNoBorder); + excel.MergeCell(row, 10, row, 11, BorderStyle.None); + excel.SetCellFormula(row, 10, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 9), excel.RCtoA1(row - 2, 11)), bodyNumberStyleNoBorder); + row++; + + excel.MergeCell(row, 0, row, 4, BorderStyle.None); + excel.SetCellValue(row, 0, "承辦人:", titleStyleLeftNoBorder); + excel.MergeCell(row, 5, row, 9, BorderStyle.None); + excel.SetCellValue(row, 5, "業務主管:", titleStyleLeftNoBorder); + excel.MergeCell(row, 10, row, 14, BorderStyle.None); + excel.SetCellValue(row, 10, "公司章:", titleStyleLeftNoBorder); + + #endregion + + excel.SetColumnWidth(0, 6); + excel.SetColumnWidth(1, 10); + excel.SetColumnWidth(2, 10); + excel.SetColumnWidth(3, 10); + excel.SetColumnWidth(4, 10); + excel.SetColumnWidth(5, 10); + excel.SetColumnWidth(6, 10); + excel.SetColumnWidth(7, 10); + excel.SetColumnWidth(8, 10); + excel.SetColumnWidth(9, 10); + excel.SetColumnWidth(10, 10); + excel.SetColumnWidth(11, 10); + excel.SetColumnWidth(12, 10); + excel.SetColumnWidth(13, 10); + excel.SetColumnWidth(14, 10); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + +} \ No newline at end of file diff --git a/Web/App_Code/Report/外勤工作明細表.cs b/Web/App_Code/Report/外勤工作明細表.cs new file mode 100644 index 0000000..464fc9e --- /dev/null +++ b/Web/App_Code/Report/外勤工作明細表.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Data; +using NPOI.SS.UserModel; +using System.IO; +using Wellan.Data; +using Wellan.Common; + +/// +/// 外勤工作明細表 的摘要描述 +/// +public class 外勤工作明細表 : ExcelReportBase +{ + public 外勤工作明細表() + { + } + + protected override void Init() + { + base.Init(); + titleStyleCenterNoBorder.SetFont(bodyFont); + bodyStyleCenterNoBorder.SetFont(bodyFont); + bodyNumberStyleNoBorder.SetFont(bodyFont); + bodyStyleLeftNoBorder.SetFont(bodyFont8PT); + titleStyleRightNoBorder.SetFont(bodyFont); + titleStyleLeftNoBorder.SetFont(bodyFont); + } + + public override MemoryStream 產生報表() + { + #region 報表抬頭 + + var row = 0; + + excel.MergeCell(row, 0, row, 7, BorderStyle.None); + excel.SetCellValue(row, 0, 公司名稱, headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 7, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("承辦{0}", 客戶名稱), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 7, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("『{0}』", 專案名稱), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 7, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("{0}【{1}{2}】", 報表名稱, 年度, 月份), headerStyle); + excel.SetRowHeight(row, 20); + row++; + + excel.MergeCell(row, 4, row, 5, BorderStyle.None); + excel.SetCellValue(row, 4, "差旅費", titleStyleCenterNoBorder); + row++; + + excel.SetCellValue(row, 0, "序號", titleStyleCenterNoBorder); + excel.SetCellValue(row, 1, "站別", titleStyleCenterNoBorder); + excel.SetCellValue(row, 2, "人員姓名", titleStyleCenterNoBorder); + excel.SetCellValue(row, 3, "薪資", titleStyleCenterNoBorder); + excel.SetCellValue(row, 4, "長差", titleStyleCenterNoBorder); + excel.SetCellValue(row, 5, "短差", titleStyleCenterNoBorder); + excel.SetCellValue(row, 6, "差旅費", titleStyleCenterNoBorder); + excel.SetCellValue(row, 7, "備註", titleStyleCenterNoBorder); + row++; + + #endregion + + #region 報表資料 + + int beginRow = row; + int serial = 1; + + foreach (DataRow r in 資料來源.Tables[0].Rows) + { + var 月薪 = WDAC.GetInt32Value(r["SSP00"]) + WDAC.GetInt32Value(r["SSP02"]); + var 差旅費 = WDAC.GetInt32Value(r["SSP09"]) + + WDAC.GetInt32Value(r["SSP10"]); + + excel.SetCellValue(row, 0, serial, bodyStyleCenterNoBorder); + excel.SetCellValue(row, 1, WDAC.GetStringValue(r["SSBRHX"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 2, WDAC.GetStringValue(r["BPNME"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 3, 月薪, bodyNumberStyleNoBorder); + excel.SetCellValue(row, 4, WDAC.GetInt32Value(r["SSP10"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 5, WDAC.GetInt32Value(r["SSP09"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 6, 差旅費, bodyNumberStyleNoBorder); + excel.SetCellValue(row, 7, WDAC.GetStringValue(r["SSC07"]), bodyStyleLeftNoBorder); + + row++; + serial++; + } + + #endregion + + #region 合計及表尾批示 + excel.MergeCell(row, 0, row, 1, BorderStyle.None); + excel.SetCellValue(row, 0, "合計", titleStyleLeftNoBorder); + + excel.SetCellFormula(row, 4, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 4), excel.RCtoA1(row - 1, 4)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 5, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 5), excel.RCtoA1(row - 1, 5)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 6, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 6), excel.RCtoA1(row - 1, 6)), bodyNumberStyleNoBorder); + row++; + + excel.MergeCell(row, 0, row, 2, BorderStyle.None); + excel.SetCellValue(row, 0, "承辦人:", titleStyleLeftNoBorder); + excel.MergeCell(row, 3, row, 5, BorderStyle.None); + excel.SetCellValue(row, 3, "業務主管:", titleStyleLeftNoBorder); + excel.MergeCell(row, 6, row, 7, BorderStyle.None); + excel.SetCellValue(row, 6, "公司章:", titleStyleLeftNoBorder); + + #endregion + + excel.SetColumnWidth(0, 6); + excel.SetColumnWidth(1, 10); + excel.SetColumnWidth(2, 10); + excel.SetColumnWidth(3, 10); + excel.SetColumnWidth(4, 10); + excel.SetColumnWidth(5, 10); + excel.SetColumnWidth(6, 10); + excel.SetColumnWidth(7, 80); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + +} \ No newline at end of file diff --git a/Web/App_Code/Report/差勤日報表.cs b/Web/App_Code/Report/差勤日報表.cs new file mode 100644 index 0000000..f2e9c1e --- /dev/null +++ b/Web/App_Code/Report/差勤日報表.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Data; +using System.Data.Common; +using NPOI.SS.UserModel; +using NPOI.HSSF.UserModel; +using NPOI.HSSF.Util; +using System.IO; +using NPOI.SS.Util; +using Wellan.Data; +using System.Linq; +using System.Diagnostics.Eventing.Reader; + +/// +/// 差勤日報表 +/// +public class 差勤日報表 : ExcelReportBase +{ + + public 差勤日報表() + { + 報表名稱 = "差勤日報表"; + } + + public DateTime 開始日期 { get; set; } + public DateTime 結束日期 { get; set; } + + public List 人員Data { get; set; } + public List<差勤日報表Item> 請假Data { get; set; } + public List<差勤日報表Item> 加班Data { get; set; } + public List<差勤日報表Item> 出差Data { get; set; } + public List 站別分組 { get; set; } + + private RparDAC rparDao = new RparDAC(); + + public override MemoryStream 產生報表() + { + var groupIdList = new List(); + foreach (var 站別 in 站別分組) + { + if (!groupIdList.Contains(站別.GroupID)) + groupIdList.Add(站別.GroupID); + } + + var row = 0; + foreach (var groupId in groupIdList) + { + var 本組站別 = 站別分組.FindAll(p => p.GroupID.CompareTo(groupId) == 0); + var branchID = String.Join(",", (from 站別 in 本組站別 select 站別.BranchID).ToArray()); + var branchName = String.Join("+", (from 站別 in 本組站別 select 站別.BranchName).ToArray()); + + row += 產生單位報表(row, branchName, branchID) + 2; + } + + excel.SetColumnWidth(0, 8); + excel.SetColumnWidth(1, 20); + excel.SetColumnWidth(2, 40); + excel.SetColumnWidth(3, 20); + excel.SetColumnWidth(4, 40); + excel.SetColumnWidth(5, 20); + excel.SetColumnWidth(6, 40); + excel.SetColumnWidth(7, 60); + excel.SetColumnWidth(8, 20); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + + + public int 產生單位報表(int startRow, string branchName, string branchID) + { + var rows = 報表抬頭(startRow, branchName); + rows += 報表明細與結尾(startRow + rows, branchID); + return rows; + } + + public int 報表抬頭(int startRow, string branchName) + { + excel.MergeCell(startRow + 0, 0, startRow + 1, 0); + excel.SetCellValue(startRow + 0, 0, "單位", titleStyleCenter); + excel.SetRangeOuterBorder(startRow + 0, 0, startRow + 1, 0, BorderStyle.Thin); + + excel.MergeCell(startRow + 0, 1, startRow + 1, 1); + excel.SetCellValue(startRow + 0, 1, branchName, titleStyleCenter); + excel.SetRangeOuterBorder(startRow + 0, 1, startRow + 1, 1, BorderStyle.Thin); + + excel.MergeCell(startRow + 0, 2, startRow + 0, 3); + excel.SetCellValue(startRow + 0, 2, String.Format("日期-{0:MM月dd日}", 開始日期), titleStyleCenter); + excel.SetRangeOuterBorder(startRow + 0, 2, startRow + 0, 3, BorderStyle.Thin); + + excel.MergeCell(startRow + 1, 2, startRow + 1, 3); + excel.SetCellValue(startRow + 1, 2, "加班申請", titleStyleCenter); + excel.SetRangeOuterBorder(startRow + 1, 2, startRow + 1, 3, BorderStyle.Thin); + + excel.MergeCell(startRow + 0, 4, startRow + 0, 7); + excel.SetCellValue(startRow + 0, 4, String.Format("日期-{0:MM月dd日}", 結束日期), titleStyleCenter); + excel.SetRangeOuterBorder(startRow + 0, 4, startRow + 0, 7, BorderStyle.Thin); + + excel.MergeCell(startRow + 1, 4, startRow + 1, 5); + excel.SetCellValue(startRow + 1, 4, "請假申請", titleStyleCenter); + excel.SetRangeOuterBorder(startRow + 1, 4, startRow + 1, 5, BorderStyle.Thin); + + excel.MergeCell(startRow + 1, 6, startRow + 1, 7); + excel.SetCellValue(startRow + 1, 6, "出差申請", titleStyleCenter); + excel.SetRangeOuterBorder(startRow + 1, 6, startRow + 1, 7, BorderStyle.Thin); + + excel.MergeCell(startRow + 0, 8, startRow + 1, 8); + excel.SetCellValue(startRow + 0, 8, "備註說明", titleStyleCenter); + excel.SetRangeOuterBorder(startRow + 0, 8, startRow + 1, 8, BorderStyle.Thin); + + excel.SetCellValue(startRow + 2, 0, "序號", titleStyleCenter); + excel.SetCellValue(startRow + 2, 1, "姓名", titleStyleCenter); + excel.SetCellValue(startRow + 2, 2, "起迄時間", titleStyleCenter); + excel.SetCellValue(startRow + 2, 3, "時數", titleStyleCenter); + excel.SetCellValue(startRow + 2, 4, "起迄時間", titleStyleCenter); + excel.SetCellValue(startRow + 2, 5, "假別/事由", titleStyleCenter); + excel.SetCellValue(startRow + 2, 6, "起迄時間", titleStyleCenter); + excel.SetCellValue(startRow + 2, 7, "地點", titleStyleCenter); + excel.SetCellValue(startRow + 2, 8, "剩餘補休時數", titleStyleCenter); + + return 3; + } + + public int 報表明細與結尾(int startRow, string branchID) + { + int rows = 0; + + var 人員Data1 = 人員Data.FindAll(p => branchID.Contains(p.BPBRH)).OrderBy(p => p.BPENO); + + foreach (var 人員Item in 人員Data1) + { + excel.SetCellValue(startRow + rows, 0, rows + 1, bodyStyleCenter); + excel.SetCellValue(startRow + rows, 1, 人員Item.BPNME, bodyStyleCenter); + + var 加班 = ""; + var 加班時數 = 0D; + foreach (var 加班Item in 加班Data.FindAll(p => p.員工編號 == 人員Item.BPENO).OrderBy(p => p.起日)) + { + 加班 += (加班.Length > 0 ? "\n" : "") + String.Format("{0:yyyy/MM/dd} {1}~{2}", 加班Item.起日, 加班Item.起時, 加班Item.迄時); + 加班時數 += 加班Item.時數; + } + excel.SetCellValue(startRow + rows, 2, 加班, bodyStyleCenter); + if (加班時數 > 0) + excel.SetCellValue(startRow + rows, 3, (int)加班時數, bodyStyleCenter); + else + excel.SetCellValue(startRow + rows, 3, "", bodyStyleCenter); + + + var 請假 = ""; + var 請假假別 = ""; + foreach (var 請假Item in 請假Data.FindAll(p => p.員工編號 == 人員Item.BPENO).OrderBy(p => p.起日)) + { + 請假 += (請假.Length > 0 ? "\n" : "") + + (請假Item.起日 == 請假Item.迄日 + ? String.Format("{0:yyyy/MM/dd} {1}~{2}", 請假Item.起日, 請假Item.起時, 請假Item.迄時) + : String.Format("{0:yyyy/MM/dd} {1}~{2:yyyy/MM/dd} {3}", 請假Item.起日, 請假Item.起時, 請假Item.迄日, 請假Item.迄時)); + 請假假別 += (請假假別.Length > 0 ? "\n" : "") + 請假Item.類別名稱; + } + + excel.SetCellValue(startRow + rows, 4, 請假, bodyStyleCenter); + excel.SetCellValue(startRow + rows, 5, 請假假別, bodyStyleCenter); + + var 出差 = ""; + var 出差地點 = ""; + foreach (var 出差Item in 出差Data.FindAll(p => p.員工編號 == 人員Item.BPENO).OrderBy(p => p.起日)) + { + 出差 += (出差.Length > 0 ? "\n" : "") + + (出差Item.起日 == 出差Item.迄日 + ? String.Format("{0:yyyy/MM/dd} {1}~{2}", 出差Item.起日, 出差Item.起時, 出差Item.迄時) + : String.Format("{0:yyyy/MM/dd} {1}~{2:yyyy/MM/dd} {3}", 出差Item.起日, 出差Item.起時, 出差Item.迄日, 出差Item.迄時)); + 出差地點 += (出差地點.Length > 0 ? "\n" : "") + 出差Item.出差地點; + } + + excel.SetCellValue(startRow + rows, 6, 出差, bodyStyleCenter); + excel.SetCellValue(startRow + rows, 7, 出差地點, bodyStyleCenter); + + + var 補休分數 = 0D; + var 補休明細 = ""; + foreach (var 補休Item in rparDao.取得補休明細資料(人員Item.BPENO)) + { + 補休分數 += 補休Item.可用時數 * 60 + 補休Item.可用分數; + if (以時分顯示時數) + 補休明細 += (補休明細.Length > 0 ? "\n" : "") + + String.Format("{0}:{1:00} {2:yyyy/MM/dd}", 補休Item.可用時數, 補休Item.可用分數, 補休Item.有效期限); + else + 補休明細 += (補休明細.Length > 0 ? "\n" : "") + + String.Format("{0}H {1:yyyy/MM/dd}", 補休Item.可用時數, 補休Item.有效期限); + } + + if (補休分數 > 0) { + if (以時分顯示時數) + excel.SetCellValue(startRow + rows, 8, String.Format("{0}:{1:00}\n{2}", (int)補休分數 / 60, (int)補休分數 % 60, 補休明細), bodyStyleCenter); + else + excel.SetCellValue(startRow + rows, 8, String.Format("{0}H\n{1}", (int)補休分數 / 60, 補休明細), bodyStyleCenter); + } + else + excel.SetCellValue(startRow + rows, 8, "", bodyStyleCenter); + + excel.SetRowHeight(startRow + rows, 35); + + rows++; + } + + excel.SetCellValue(startRow + rows, 0, "小計", bodyStyleCenter); + excel.SetCellValue(startRow + rows, 1, String.Format("共 {0} 位", 人員Data1.ToList().Count), bodyStyleCenter); + excel.SetCellValue(startRow + rows, 2, "總申請時數", bodyStyleCenter); + if (人員Data1.ToList().Count > 0) + excel.SetCellFormula(startRow + rows, 3, String.Format("SUM({0}:{1})", excel.RCtoA1(startRow, 3), excel.RCtoA1(startRow + rows - 1, 3)) , bodyStyleCenter); + else + excel.SetCellValue(startRow + rows, 3, 0, bodyStyleCenter); + excel.SetCellValue(startRow + rows, 4, "", bodyStyleCenter); + excel.SetCellValue(startRow + rows, 5, "", bodyStyleCenter); + excel.SetCellValue(startRow + rows, 6, "", bodyStyleCenter); + excel.SetCellValue(startRow + rows, 7, "", bodyStyleCenter); + excel.SetCellValue(startRow + rows, 8, "", bodyStyleCenter); + + rows++; + return rows; + } +} \ No newline at end of file diff --git a/Web/App_Code/Report/差勤月報表.cs b/Web/App_Code/Report/差勤月報表.cs new file mode 100644 index 0000000..308fae9 --- /dev/null +++ b/Web/App_Code/Report/差勤月報表.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Data; +using System.Data.Common; +using NPOI.SS.UserModel; +using NPOI.HSSF.UserModel; +using NPOI.HSSF.Util; +using System.IO; +using NPOI.SS.Util; +using Wellan.Data; + +/// +/// 差勤月報表 +/// +public class 差勤月報表 : ExcelReportBase +{ + public 差勤月報表() + { + 報表名稱 = "差勤月報表"; + } + + public override MemoryStream 產生報表() + { + BodyRowHeight = 35; + + #region 報表抬頭 + + excel.MergeCell(0, 0, 0, 10); + excel.SetCellValue(0, 0, String.Format("{0}\r\n承辦{1}\r\n『{2}』\r\n{3}", 公司名稱, 客戶名稱, 專案名稱, 報表名稱), headerStyle); + excel.SetCellValue(1, 0, "月份:", titleStyleRightNoBorder); + excel.SetCellValue(1, 1, 報表時間.ToString("MM月"), titleStyleLeftNoBorder); + excel.SetCellValue(1, 2, "單位:", titleStyleRightNoBorder); + excel.SetCellValue(1, 3, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["單位"]), titleStyleLeftNoBorder); + excel.SetCellValue(1, 4, "職稱:", titleStyleRightNoBorder); + excel.SetCellValue(1, 5, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["職稱"]), titleStyleLeftNoBorder); + excel.SetCellValue(1, 6, "姓名:", titleStyleRightNoBorder); + excel.SetCellValue(1, 7, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["姓名"]), titleStyleLeftNoBorder); + excel.SetRowHeight(0, HeaderRowHeight * 4); + excel.SetRowHeight(1, BodyRowHeight); + + excel.MergeCell(2, 0, 2, 1); + excel.SetRangeOuterBorder(2, 0, 2, 1, BorderStyle.Thin); + excel.SetCellValue(2, 0, "日期", titleStyleCenter); + excel.SetCellValue(2, 2, "出勤別", titleStyleCenter); + excel.SetCellValue(2, 3, "實際上班", titleStyleCenter); + excel.SetCellValue(2, 4, "出差外出", titleStyleCenter); + excel.SetCellValue(2, 5, "出差返回", titleStyleCenter); + excel.SetCellValue(2, 6, "實際下班", titleStyleCenter); + excel.SetCellValue(2, 7, "請假", titleStyleCenter); + excel.SetCellValue(2, 8, "加班", titleStyleCenter); + excel.SetCellValue(2, 9, "公差", titleStyleCenter); + excel.SetCellValue(2, 10, "備註", titleStyleCenter); + excel.SetRowHeight(2, BodyRowHeight); + + #endregion + + #region 報表資料 + + int rowId = 3; + ICellStyle rowStyle; + + foreach (DataRow r in 資料來源.Tables[0].Rows) + { + string 請假 = WDAC.GetStringValue(r["請假"]); + string 加班 = WDAC.GetStringValue(r["加班"]); + string 公差 = WDAC.GetStringValue(r["公差"]); + string 出勤別 = WDAC.GetStringValue(r["出勤別"]); + + if (出勤別 == "上班") + rowStyle = titleStyleCenter; + else + rowStyle = titleStyleCenterYellowBGC; + + excel.SetCellValue(rowId, 0, WDAC.GetDateTimeValue(r["日期"]).ToString("MM月dd日"), rowStyle); + excel.SetCellValue(rowId, 1, WDAC.GetDateTimeValue(r["日期"]).ToString("dddd"), rowStyle); + excel.SetCellValue(rowId, 2, 出勤別, rowStyle); + excel.SetCellValue(rowId, 3, WDAC.GetStringValue(r["上班"]), rowStyle); + excel.SetCellValue(rowId, 4, WDAC.GetStringValue(r["出差外出"]), rowStyle); + excel.SetCellValue(rowId, 5, WDAC.GetStringValue(r["出差返回"]), rowStyle); + excel.SetCellValue(rowId, 6, WDAC.GetStringValue(r["下班"]), rowStyle); + + if (請假 != "0:00") + excel.SetCellValue(rowId, 7, 請假, rowStyle); + else + excel.SetCellValue(rowId, 7, "", rowStyle); + + if (加班 != "0:00") + excel.SetCellValue(rowId, 8, 加班, rowStyle); + else + excel.SetCellValue(rowId, 8, "", rowStyle); + + if (公差 != "0:00") + excel.SetCellValue(rowId, 9, 公差, rowStyle); + else + excel.SetCellValue(rowId, 9, "", rowStyle); + + excel.SetCellValue(rowId, 10, string.Format("{0} {1} {2}", r["班別名稱"], r["班別時間"], r["出勤異常"]), rowStyle); + excel.SetRowHeight(rowId, BodyRowHeight); + rowId++; + } + + #endregion + + #region 表尾批示 + + //excel.MergeCell(rowId + 2, 0, rowId + 2, 8); + //excel.SetCellValue(rowId + 2, 0, "申請人:             計畫督導:             人事單位:", titleStyleLeftNoBorder); + //excel.SetRowHeight(rowId + 2, BodyRowHeight); + + #endregion + + excel.SetColumnWidth(0, 11); + excel.SetColumnWidth(1, 11); + excel.SetColumnWidth(2, 10); + excel.SetColumnWidth(3, 15); + excel.SetColumnWidth(4, 15); + excel.SetColumnWidth(5, 15); + excel.SetColumnWidth(6, 15); + excel.SetColumnWidth(7, 15); + excel.SetColumnWidth(8, 15); + excel.SetColumnWidth(9, 15); + excel.SetColumnWidth(10, 15); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } +} \ No newline at end of file diff --git a/Web/App_Code/Report/支出憑證黏存單.cs b/Web/App_Code/Report/支出憑證黏存單.cs new file mode 100644 index 0000000..1776530 --- /dev/null +++ b/Web/App_Code/Report/支出憑證黏存單.cs @@ -0,0 +1,338 @@ +using System; +using System.Collections.Generic; +using System.Data; +using NPOI.SS.UserModel; +using System.IO; +using Wellan.Data; +using Wellan.Common; + +/// +/// 支出憑證黏存單 +/// +public class 支出憑證黏存單 : ExcelReportBase +{ + public 支出憑證黏存單() + { + 報表名稱 = "支出憑證黏存單"; + } + + protected override void Init() + { + base.Init(); + bodyStyleCenterXS.SetFont(bodyFont8PT); + } + + public override MemoryStream 產生報表() + { + int 總金額 = 0; + int 總天數 = 0; + List 出差事由List = new List(); + string 出差事由 = ""; + + #region 先加總所有金額以及產生摘要 + + foreach (DataRow r in 資料來源.Tables[0].Rows) + { + 總天數 += (WDAC.GetDateTimeValue(r["RPEDT"]) - WDAC.GetDateTimeValue(r["RPRDT"])).Days + 1; + 出差事由List.Add(WDAC.GetStringValue(r["RPRSN"])); + } + + for (int i = 0; i < 出差事由List.Count; i++) + { + 出差事由 += String.Format("{0}.{1}\n", i + 1, 出差事由List[i]); + } + if (出差事由.Length > 0) + 出差事由 = 出差事由.Substring(0, 出差事由.Length - 1); + + foreach (DataRow r in 資料來源.Tables[1].Rows) + { + 總金額 += WDAC.GetInt32Value(r["總計"]); + } + + #endregion + + #region 報表抬頭 + + excel.MergeCell(0, 0, 0, 16); + excel.SetCellValue(0, 0, String.Format("{0}\n承辦{1}\n『{2}』\n{3}", 公司名稱, 客戶名稱, 專案名稱, 報表名稱), headerStyle); + + excel.MergeCell(1, 0, 1, 16); + excel.SetCellValue(1, 0, String.Format("所屬年度:{0}年度", WGuard1.WNTSA(報表時間.Year - WGuard1.CY11, "", false)), titleStyleLeftNoBorder); + excel.MergeCell(1, 0, 1, 16); + + excel.MergeCell(2, 0, 2, 4); + excel.SetCellValue(2, 0, "傳票(付款憑單)編號:", titleStyleLeftNoBorder); + excel.MergeCell(2, 15, 2, 16); + excel.SetCellValue(2, 15, "黏貼單據___張", titleStyleRightNoBorder); + excel.SetRangeOuterBorder(2, 0, 2, 16, BorderStyle.Thin); + + excel.MergeCell(3, 0, 5, 1); + excel.SetCellValue(3, 0, "第 號", titleStyleCenterNoBorder); + excel.SetRangeOuterBorder(3, 0, 5, 1, BorderStyle.Thin); + excel.MergeCell(3, 2, 3, 7); + excel.SetCellValue(3, 2, "金 額", titleStyleCenterNoBorder); + excel.SetRangeOuterBorder(3, 2, 3, 7, BorderStyle.Thin); + excel.SetCellValue(4, 2, "拾", titleStyleCenter); + excel.SetCellValue(4, 3, "萬", titleStyleCenter); + excel.SetCellValue(4, 4, "仟", titleStyleCenter); + excel.SetCellValue(4, 5, "佰", titleStyleCenter); + excel.SetCellValue(4, 6, "拾", titleStyleCenter); + excel.SetCellValue(4, 7, "元", titleStyleCenter); + + string s總金額 = String.Format("{0:000000}", 總金額); + excel.SetCellValue(5, 2, Convert.ToString(s總金額[0]), titleStyleCenter); + excel.SetCellValue(5, 3, Convert.ToString(s總金額[1]), titleStyleCenter); + excel.SetCellValue(5, 4, Convert.ToString(s總金額[2]), titleStyleCenter); + excel.SetCellValue(5, 5, Convert.ToString(s總金額[3]), titleStyleCenter); + excel.SetCellValue(5, 6, Convert.ToString(s總金額[4]), titleStyleCenter); + excel.SetCellValue(5, 7, Convert.ToString(s總金額[5]), titleStyleCenter); + + excel.MergeCell(3, 8, 4, 10); + excel.SetCellValue(3, 8, "用途別", titleStyleCenterNoBorder); + excel.SetRangeOuterBorder(3, 8, 4, 10, BorderStyle.Thin); + excel.MergeCell(5, 8, 5, 10); + excel.SetCellValue(5, 8, "用途摘要", titleStyleCenterNoBorder); + excel.SetRangeOuterBorder(5, 8, 5, 10, BorderStyle.Thin); + excel.MergeCell(3, 11, 4, 16); + excel.SetCellValue(3, 11, "國內旅費", titleStyleLeftNoBorder); + excel.SetRangeOuterBorder(3, 11, 4, 16, BorderStyle.Thin); + excel.MergeCell(5, 11, 5, 16); + excel.SetCellValue(5, 11, String.Format("{0:MM}月出差", 報表時間), titleStyleLeftNoBorder); + excel.SetRangeOuterBorder(5, 11, 5, 16, BorderStyle.Thin); + + excel.MergeCell(6, 8, 6, 12); + excel.SetCellValue(6, 8, "國內出差旅費報告單", headerStyle); + excel.MergeCell(6, 13, 6, 16); + excel.SetCellValue(6, 13, String.Format("{0:填表日期:yyyy年MM月dd日}", DateTime.UtcNow.AddHours(8).Date), titleStyleRightNoBorder); + excel.SetRangeOuterBorder(6, 0, 6, 16, BorderStyle.Thin); + + excel.MergeCell(7, 0, 7, 2); + excel.MergeCell(7, 3, 7, 6); + excel.MergeCell(7, 7, 7, 8); + excel.MergeCell(7, 9, 7, 11); + excel.MergeCell(7, 12, 7, 13); + excel.MergeCell(7, 14, 7, 16); + excel.SetCellValue(7, 0, "姓 名", titleStyleCenterNoBorder); + excel.SetCellValue(7, 3, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["BPNME"]), titleStyleCenterNoBorder); + excel.SetCellValue(7, 7, "單 位", titleStyleCenterNoBorder); + excel.SetCellValue(7, 9, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["站別"]), titleStyleCenterNoBorder); + excel.SetCellValue(7, 12, "職 稱", titleStyleCenterNoBorder); + excel.SetCellValue(7, 14, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["職稱"]), titleStyleCenterNoBorder); + excel.SetRangeOuterBorder(7, 0, 7, 2, BorderStyle.Thin); + excel.SetRangeOuterBorder(7, 3, 7, 6, BorderStyle.Thin); + excel.SetRangeOuterBorder(7, 7, 7, 8, BorderStyle.Thin); + excel.SetRangeOuterBorder(7, 9, 7, 11, BorderStyle.Thin); + excel.SetRangeOuterBorder(7, 12, 7, 13, BorderStyle.Thin); + excel.SetRangeOuterBorder(7, 14, 7, 16, BorderStyle.Thin); + + excel.MergeCell(8, 0, 8, 2); + excel.MergeCell(8, 3, 8, 16); + excel.SetCellValue(8, 0, "出差事由", titleStyleCenterNoBorder); + excel.SetCellValue(8, 3, 出差事由, titleStyleLeftNoBorder); + excel.SetRangeOuterBorder(8, 0, 8, 2, BorderStyle.Thin); + excel.SetRangeOuterBorder(8, 3, 8, 16, BorderStyle.Thin); + + excel.MergeCell(9, 0, 9, 16); + excel.SetCellValue(9, 0, String.Format("中華民國 {0:yyyy} 年 {0:MM} 月 {0:dd} 日 至 {1:yyyy} 年 {1:MM} 月 {1:dd} 日止 共計 {2} 天 附單據___張", + 報表時間, 報表時間.AddMonths(1).AddDays(-1), 總天數), titleStyleCenterNoBorder); + excel.SetRangeOuterBorder(9, 0, 9, 16, BorderStyle.Thin); + + excel.MergeCell(10, 0, 10, 1); + excel.MergeCell(10, 2, 11, 4); + excel.MergeCell(10, 5, 11, 7); + excel.MergeCell(10, 8, 10, 11); + excel.MergeCell(10, 12, 11, 12); + excel.MergeCell(10, 13, 11, 13); + excel.MergeCell(10, 14, 11, 14); + excel.MergeCell(10, 15, 11, 15); + excel.MergeCell(10, 16, 11, 16); + excel.SetCellValue(10, 0, String.Format("{0:yyyy}年", 報表時間), titleStyleCenterNoBorder); + excel.SetCellValue(11, 0, "月", titleStyleCenter); + excel.SetCellValue(11, 1, "日", titleStyleCenter); + excel.SetCellValue(10, 2, "起訖地點", titleStyleCenterNoBorder); + excel.SetCellValue(10, 5, "工作摘要", titleStyleCenterNoBorder); + excel.SetCellValue(10, 8, "交通費", titleStyleCenterNoBorder); + excel.SetCellValue(11, 8, "捷運\n及\n汽車", titleStyleCenter); + excel.SetCellValue(11, 9, "火\n車", titleStyleCenter); + excel.SetCellValue(11, 10, "高\n鐵", titleStyleCenter); + excel.SetCellValue(11, 11, "飛\n機", titleStyleCenter); + excel.SetCellValue(10, 12, "住宿費\n+\n過路費", titleStyleCenterNoBorder); + excel.SetCellValue(10, 13, "雜費", titleStyleCenterNoBorder); + excel.SetCellValue(10, 14, "單據\n號數", titleStyleCenterNoBorder); + excel.SetCellValue(10, 15, "總計", titleStyleCenterNoBorder); + excel.SetCellValue(10, 16, "備註", titleStyleCenterNoBorder); + excel.SetRangeOuterBorder(10, 0, 10, 1, BorderStyle.Thin); + excel.SetRangeOuterBorder(10, 2, 11, 4, BorderStyle.Thin); + excel.SetRangeOuterBorder(10, 5, 11, 7, BorderStyle.Thin); + excel.SetRangeOuterBorder(10, 8, 10, 11, BorderStyle.Thin); + excel.SetRangeOuterBorder(10, 12, 11, 12, BorderStyle.Thin); + excel.SetRangeOuterBorder(10, 13, 11, 13, BorderStyle.Thin); + excel.SetRangeOuterBorder(10, 14, 11, 14, BorderStyle.Thin); + excel.SetRangeOuterBorder(10, 15, 11, 15, BorderStyle.Thin); + excel.SetRangeOuterBorder(10, 16, 11, 16, BorderStyle.Thin); + + excel.SetRowHeight(0, HeaderRowHeight * 4); + excel.SetRowHeight(1, BodyRowHeight); + excel.SetRowHeight(2, BodyRowHeight); + excel.SetRowHeight(3, BodyRowHeight); + excel.SetRowHeight(4, BodyRowHeight); + excel.SetRowHeight(5, BodyRowHeight * 2); + excel.SetRowHeight(6, BodyRowHeight * 2); + excel.SetRowHeight(7, BodyRowHeight); + excel.SetRowHeight(8, BodyRowHeight * (資料來源.Tables[0].Rows.Count > 4 ? 資料來源.Tables[0].Rows.Count : 4)); + excel.SetRowHeight(9, BodyRowHeight); + excel.SetRowHeight(10, BodyRowHeight); + excel.SetRowHeight(11, BodyRowHeight * 2); + + #endregion + + #region 報表資料 + + int rowId = 12; + int beginRow = 12; + foreach (DataRow r in 資料來源.Tables[1].Rows) + { + DataRow[] master = 資料來源.Tables[0].Select("RPREN='" + WDAC.GetStringValue(r["單號"]) + "'"); + + excel.SetCellValue(rowId, 0, String.Format("{0:MM}", r["日期"]), bodyStyleCenter); + excel.SetCellValue(rowId, 1, String.Format("{0:dd}", r["日期"]), bodyStyleCenter); + excel.MergeCell(rowId, 2, rowId, 4); + excel.SetCellValue(rowId, 2, WDAC.GetStringValue(r["起地點"]) + "~" + WDAC.GetStringValue(r["迄地點"]), bodyStyleCenterS); + excel.SetRangeOuterBorder(rowId, 2, rowId, 4, BorderStyle.Thin); + + excel.MergeCell(rowId, 5, rowId, 7); + 出差事由 = WDAC.GetStringValue(master[0]["RPRSN"]); + if (master.Length > 0 && 出差事由List.Contains(出差事由)) + excel.SetCellValue(rowId, 5, String.Format("同出差事由 {0}", 出差事由List.IndexOf(出差事由) + 1), bodyStyleCenterS); + else + excel.SetCellValue(rowId, 5, "", bodyStyleCenter); + excel.SetRangeOuterBorder(rowId, 5, rowId, 7, BorderStyle.Thin); + + excel.SetCellValue(rowId, 8, WDAC.GetDoubleValue(r["捷運"]) + WDAC.GetDoubleValue(r["汽車"]), bodyStyleCenter); + excel.SetCellValue(rowId, 9, WDAC.GetDoubleValue(r["火車"]), bodyStyleCenter); + excel.SetCellValue(rowId, 10, WDAC.GetDoubleValue(r["高鐵"]), bodyStyleCenter); + excel.SetCellValue(rowId, 11, WDAC.GetDoubleValue(r["飛機"]), bodyStyleCenter); + excel.SetCellValue(rowId, 12, WDAC.GetDoubleValue(r["住宿費"]) + WDAC.GetDoubleValue(r["過路費"]), bodyStyleCenter); + excel.SetCellValue(rowId, 13, WDAC.GetDoubleValue(r["雜費"]), bodyStyleCenter); + excel.SetCellValue(rowId, 14, WDAC.GetStringValue(r["單據號數"]), bodyStyleCenter); + excel.SetCellValue(rowId, 15, WDAC.GetDoubleValue(r["總計"]), bodyStyleCenter); + excel.SetCellValue(rowId, 16, WDAC.GetStringValue(r["備註"]), bodyStyleCenterXS); + + excel.SetRowHeight(rowId, (int)(BodyRowHeight * 1.5)); + rowId++; + } + + // 補空行 + if (資料來源.Tables[1].Rows.Count < 10) + { + for (int n = 資料來源.Tables[1].Rows.Count; n < 10; n++) + { + excel.SetCellValue(rowId, 0, "", bodyStyleCenter); + excel.SetCellValue(rowId, 1, "", bodyStyleCenter); + excel.MergeCell(rowId, 2, rowId, 4); + excel.SetCellValue(rowId, 2, "", bodyStyleCenter); + excel.SetRangeOuterBorder(rowId, 2, rowId, 4, BorderStyle.Thin); + + excel.MergeCell(rowId, 5, rowId, 7); + excel.SetCellValue(rowId, 5, "", bodyStyleCenter); + excel.SetRangeOuterBorder(rowId, 5, rowId, 7, BorderStyle.Thin); + + excel.SetCellValue(rowId, 8, "", bodyStyleCenter); + excel.SetCellValue(rowId, 9, "", bodyStyleCenter); + excel.SetCellValue(rowId, 10, "", bodyStyleCenter); + excel.SetCellValue(rowId, 11, "", bodyStyleCenter); + excel.SetCellValue(rowId, 12, "", bodyStyleCenter); + excel.SetCellValue(rowId, 13, "", bodyStyleCenter); + excel.SetCellValue(rowId, 14, "", bodyStyleCenter); + excel.SetCellValue(rowId, 15, "", bodyStyleCenter); + excel.SetCellValue(rowId, 16, "", bodyStyleCenter); + + excel.SetRowHeight(rowId, (int)(BodyRowHeight * 0.8)); + + rowId++; + } + } + + + #endregion + + #region 合計及表尾批示 + excel.MergeCell(rowId, 0, rowId, 4); + excel.SetCellValue(rowId, 0, "合 計", titleStyleCenter); + excel.SetRangeOuterBorder(rowId, 0, rowId, 4, BorderStyle.Thin); + excel.MergeCell(rowId, 5, rowId, 7); + excel.SetRangeOuterBorder(rowId, 5, rowId, 7, BorderStyle.Thin); + excel.SetCellFormula(rowId, 8, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 8), excel.RCtoA1(rowId - 1, 8)), bodyStyleCenter); + excel.SetCellFormula(rowId, 9, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 9), excel.RCtoA1(rowId - 1, 9)), bodyStyleCenter); + excel.SetCellFormula(rowId, 10, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 10), excel.RCtoA1(rowId - 1, 10)), bodyStyleCenter); + excel.SetCellFormula(rowId, 11, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 11), excel.RCtoA1(rowId - 1, 11)), bodyStyleCenter); + excel.SetCellFormula(rowId, 12, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 12), excel.RCtoA1(rowId - 1, 12)), bodyStyleCenter); + excel.SetCellFormula(rowId, 13, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 13), excel.RCtoA1(rowId - 1, 13)), bodyStyleCenter); + excel.SetCellValue(rowId, 14, "", titleStyleCenter); + excel.SetCellFormula(rowId, 15, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 15), excel.RCtoA1(rowId - 1, 15)), bodyStyleCenter); + excel.SetCellValue(rowId, 16, "", titleStyleCenter); + excel.SetRowHeight(rowId, BodyRowHeight); + + rowId++; + excel.MergeCell(rowId, 0, rowId, 4); + excel.MergeCell(rowId, 5, rowId, 9); + excel.MergeCell(rowId, 10, rowId, 13); + excel.MergeCell(rowId, 14, rowId, 16); + + if (專案編號.Length >= 6 && 專案編號.Substring(專案編號.Length - 6, 6) == "B00001") + { + excel.SetCellValue(rowId, 0, "申 請 人", titleStyleCenter); + excel.SetCellValue(rowId, 5, "單 位 主 管", titleStyleCenter); + excel.SetCellValue(rowId, 10, "財 會 經 辦", titleStyleCenter); + excel.SetCellValue(rowId, 14, "人 資 單 位", titleStyleCenter); + } + else + { + excel.SetCellValue(rowId, 0, "申 請 人", titleStyleCenter); + excel.SetCellValue(rowId, 5, "計 畫 督 導", titleStyleCenter); + excel.SetCellValue(rowId, 10, "人 事 單 位", titleStyleCenter); + excel.SetCellValue(rowId, 14, "財 務 主 管", titleStyleCenter); + } + excel.SetRangeOuterBorder(rowId, 0, rowId, 4, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId, 5, rowId, 9, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId, 10, rowId, 13, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId, 14, rowId, 16, BorderStyle.Thin); + excel.SetRowHeight(rowId, BodyRowHeight); + + rowId++; + excel.MergeCell(rowId, 0, rowId, 4); + excel.SetCellValue(rowId, 0, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["BPNME"]), bodyStyleCenter); + excel.MergeCell(rowId, 5, rowId, 9); + excel.MergeCell(rowId, 10, rowId, 13); + excel.MergeCell(rowId, 14, rowId, 16); + excel.SetRangeOuterBorder(rowId, 0, rowId, 4, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId, 5, rowId, 9, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId, 10, rowId, 13, BorderStyle.Thin); + excel.SetRangeOuterBorder(rowId, 14, rowId, 16, BorderStyle.Thin); + excel.SetRowHeight(rowId, BodyRowHeight * 3); + + #endregion + + excel.SetColumnWidth(0, 4); + excel.SetColumnWidth(1, 4); + excel.SetColumnWidth(2, 4); + excel.SetColumnWidth(3, 4); + excel.SetColumnWidth(4, 4); + excel.SetColumnWidth(5, 4); + excel.SetColumnWidth(6, 4); + excel.SetColumnWidth(7, 4); + excel.SetColumnWidth(8, 7); + excel.SetColumnWidth(9, 7); + excel.SetColumnWidth(10, 7); + excel.SetColumnWidth(11, 7); + excel.SetColumnWidth(12, 7); + excel.SetColumnWidth(13, 7); + excel.SetColumnWidth(14, 7); + excel.SetColumnWidth(15, 9); + excel.SetColumnWidth(16, 20); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } +} \ No newline at end of file diff --git a/Web/App_Code/Report/薪資清冊.cs b/Web/App_Code/Report/薪資清冊.cs new file mode 100644 index 0000000..1d9ef97 --- /dev/null +++ b/Web/App_Code/Report/薪資清冊.cs @@ -0,0 +1,194 @@ +using System; +using System.Collections.Generic; +using System.Data; +using NPOI.SS.UserModel; +using System.IO; +using Wellan.Data; +using Wellan.Common; + +/// +/// 薪資清冊 的摘要描述 +/// +public class 薪資清冊 : ExcelReportBase +{ + public 薪資清冊() + { + } + + protected override void Init() + { + base.Init(); + titleStyleCenterNoBorder.SetFont(bodyFont); + bodyStyleCenterNoBorder.SetFont(bodyFont); + bodyNumberStyleNoBorder.SetFont(bodyFont); + titleStyleRightNoBorder.SetFont(bodyFont); + titleStyleLeftNoBorder.SetFont(bodyFont); + } + + public override MemoryStream 產生報表() + { + #region 報表抬頭 + + var row = 0; + + excel.MergeCell(row, 0, row, 20, BorderStyle.None); + excel.SetCellValue(row, 0, 公司名稱, headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 20, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("承辦{0}", 客戶名稱), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 20, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("『{0}』", 專案名稱.Trim()), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 20, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("{0}【{1}{2}】", 報表名稱, 年度, 月份), headerStyle); + excel.SetRowHeight(row, 20); + row++; + + excel.SetCellValue(row, 0, "序號", titleStyleCenterNoBorder); + excel.SetCellValue(row, 1, "站別", titleStyleCenterNoBorder); + excel.SetCellValue(row, 2, "職務", titleStyleCenterNoBorder); + excel.SetCellValue(row, 3, "姓名", titleStyleCenterNoBorder); + excel.SetCellValue(row, 4, "到職日", titleStyleCenterNoBorder); + excel.SetCellValue(row, 5, "派遣開始日", titleStyleCenterNoBorder); + excel.SetCellValue(row, 6, "核定薪資", titleStyleCenterNoBorder); + excel.SetCellValue(row, 7, "本薪", titleStyleCenterNoBorder); + excel.SetCellValue(row, 8, "其他津貼", titleStyleCenterNoBorder); + excel.SetCellValue(row, 9, "事假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 10, "病假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 11, "其他假別(一)", titleStyleCenterNoBorder); + excel.SetCellValue(row, 12, "應領薪資", titleStyleCenterNoBorder); + excel.SetCellValue(row, 13, "加班費", titleStyleCenterNoBorder); + excel.SetCellValue(row, 14, "外勤工作費", titleStyleCenterNoBorder); + excel.SetCellValue(row, 15, "勞保", titleStyleCenterNoBorder); + excel.SetCellValue(row, 16, "健保", titleStyleCenterNoBorder); + excel.SetCellValue(row, 17, "福利金", titleStyleCenterNoBorder); + excel.SetCellValue(row, 18, "個人提繳勞退金", titleStyleCenterNoBorder); + excel.SetCellValue(row, 19, "其他加扣款", titleStyleCenterNoBorder); + excel.SetCellValue(row, 20, "實領薪資", titleStyleCenterNoBorder); + excel.SetRowHeight(row, 26); + row++; + + #endregion + + #region 報表資料 + + int beginRow = row; + int serial = 1; + foreach (DataRow r in 資料來源.Tables[0].Rows) + { + var 月薪 = WDAC.GetInt32Value(r["SSP00"]) + WDAC.GetInt32Value(r["SSP02"]); + var 應領薪資 = 月薪 + + WDAC.GetInt32Value(r["SSP01"]) + + WDAC.GetInt32Value(r["SSP03"]) + + WDAC.GetInt32Value(r["SSP04"]) + + WDAC.GetInt32Value(r["SSP05"]) + - WDAC.GetInt32Value(r["SSS01"]) + - WDAC.GetInt32Value(r["SSS02"]) + - WDAC.GetInt32Value(r["SSS09"]); + var 加班費 = WDAC.GetInt32Value(r["SSP06"]) + + WDAC.GetInt32Value(r["SSP07"]) + + WDAC.GetInt32Value(r["SSP08"]) + + WDAC.GetInt32Value(r["SSP13"]) + + WDAC.GetInt32Value(r["SSP14"]); + var 外勤工作費 = WDAC.GetInt32Value(r["SSP09"]) + + WDAC.GetInt32Value(r["SSP10"]) + + WDAC.GetInt32Value(r["SSP12"]); + var 其他加扣 = WDAC.GetInt32Value(r["SSP99"]) - WDAC.GetInt32Value(r["SSS99"]); + var 實領薪資 = 應領薪資 + + 外勤工作費 + + 加班費 + + WDAC.GetInt32Value(r["SSP11"]) + - WDAC.GetInt32Value(r["SSS04"]) + - WDAC.GetInt32Value(r["SSS05"]) + - WDAC.GetInt32Value(r["SSS06"]) + - WDAC.GetInt32Value(r["SSS07"]) + + 其他加扣; + + excel.SetCellValue(row, 0, serial, bodyStyleCenterNoBorder); + excel.SetCellValue(row, 1, WDAC.GetStringValue(r["SSBRHX"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 2, WDAC.GetStringValue(r["BPJME"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 3, WDAC.GetStringValue(r["BPNME"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 4, string.Format("{0:yyyy/MM/dd}", r["BPSDY"], WGuard1.TaiwanCulture), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 5, string.Format("{0:yyyy/MM/dd}", r["RASDT"], WGuard1.TaiwanCulture), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 6, WDAC.GetInt32Value(r["BPSRM"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 7, 月薪, bodyNumberStyleNoBorder); + excel.SetCellValue(row, 8, WDAC.GetInt32Value(r["SSP05"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 9, WDAC.GetInt32Value(r["SSS02"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 10, WDAC.GetInt32Value(r["SSS01"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 11, WDAC.GetInt32Value(r["SSS09"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 12, 應領薪資, bodyNumberStyleNoBorder); + excel.SetCellValue(row, 13, 加班費, bodyNumberStyleNoBorder); + excel.SetCellValue(row, 14, 外勤工作費, bodyNumberStyleNoBorder); + excel.SetCellValue(row, 15, WDAC.GetInt32Value(r["SSS04"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 16, WDAC.GetInt32Value(r["SSS05"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 17, WDAC.GetInt32Value(r["SSS07"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 18, WDAC.GetInt32Value(r["SSS06"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 19, 其他加扣, bodyNumberStyleNoBorder); + excel.SetCellValue(row, 20, 實領薪資, bodyNumberStyleNoBorder); + row++; + serial++; + } + + #endregion + + #region 合計及表尾批示 + excel.MergeCell(row, 0, row, 1, BorderStyle.None); + excel.SetCellValue(row, 0, "合計", titleStyleLeftNoBorder); + + excel.SetCellFormula(row, 7, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 7), excel.RCtoA1(row - 1, 7)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 8, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 8), excel.RCtoA1(row - 1, 8)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 9, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 9), excel.RCtoA1(row - 1, 9)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 10, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 10), excel.RCtoA1(row - 1, 10)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 11, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 11), excel.RCtoA1(row - 1, 11)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 12, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 12), excel.RCtoA1(row - 1, 12)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 13, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 13), excel.RCtoA1(row - 1, 13)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 14, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 14), excel.RCtoA1(row - 1, 14)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 15, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 15), excel.RCtoA1(row - 1, 15)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 16, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 16), excel.RCtoA1(row - 1, 16)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 17, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 17), excel.RCtoA1(row - 1, 17)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 18, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 18), excel.RCtoA1(row - 1, 18)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 19, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 19), excel.RCtoA1(row - 1, 19)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 20, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 20), excel.RCtoA1(row - 1, 20)), bodyNumberStyleNoBorder); + row++; + + excel.MergeCell(row, 0, row, 6, BorderStyle.None); + excel.SetCellValue(row, 0, "承辦人:", titleStyleLeftNoBorder); + excel.MergeCell(row, 7, row, 13, BorderStyle.None); + excel.SetCellValue(row, 7, "業務主管:", titleStyleLeftNoBorder); + excel.MergeCell(row, 14, row, 20, BorderStyle.None); + excel.SetCellValue(row, 14, "公司章:", titleStyleLeftNoBorder); + + #endregion + + excel.SetColumnWidth(0, 6); + excel.SetColumnWidth(1, 10); + excel.SetColumnWidth(2, 14); + excel.SetColumnWidth(3, 10); + excel.SetColumnWidth(4, 12); + excel.SetColumnWidth(5, 12); + excel.SetColumnWidth(6, 10); + excel.SetColumnWidth(7, 10); + excel.SetColumnWidth(8, 10); + excel.SetColumnWidth(9, 10); + excel.SetColumnWidth(10, 10); + excel.SetColumnWidth(11, 10); + excel.SetColumnWidth(12, 10); + excel.SetColumnWidth(13, 10); + excel.SetColumnWidth(14, 10); + excel.SetColumnWidth(15, 10); + excel.SetColumnWidth(16, 10); + excel.SetColumnWidth(17, 10); + excel.SetColumnWidth(18, 10); + excel.SetColumnWidth(19, 10); + excel.SetColumnWidth(20, 10); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + +} \ No newline at end of file diff --git a/Web/App_Code/Report/請假明細.cs b/Web/App_Code/Report/請假明細.cs new file mode 100644 index 0000000..b6ef5cf --- /dev/null +++ b/Web/App_Code/Report/請假明細.cs @@ -0,0 +1,264 @@ +using System; +using System.Collections.Generic; +using System.Data; +using NPOI.SS.UserModel; +using System.IO; +using Wellan.Data; +using Wellan.Common; + +/// +/// 請假明細 的摘要描述 +/// +public class 請假明細 : ExcelReportBase +{ + public 請假明細() + { + } + + protected override void Init() + { + base.Init(); + titleStyleCenterNoBorder.SetFont(bodyFont); + bodyStyleCenterNoBorder.SetFont(bodyFont); + bodyNumberStyleNoBorder.SetFont(bodyFont); + titleStyleRightNoBorder.SetFont(bodyFont); + titleStyleLeftNoBorder.SetFont(bodyFont); + } + + public override MemoryStream 產生報表() + { + #region 報表抬頭 + + var row = 0; + + excel.MergeCell(row, 0, row, 22, BorderStyle.None); + excel.SetCellValue(row, 0, 公司名稱, headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 22, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("承辦{0}", 客戶名稱), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 22, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("『{0}』", 專案名稱), headerStyle); + excel.SetRowHeight(row, 20); + row++; + excel.MergeCell(row, 0, row, 22, BorderStyle.None); + excel.SetCellValue(row, 0, string.Format("{0}【{1}{2}】", 報表名稱, 年度, 月份), headerStyle); + excel.SetRowHeight(row, 20); + row++; + + excel.MergeCell(row, 4, row, 20, BorderStyle.None); + excel.SetCellValue(row, 4, "請假時數 / 金額", titleStyleCenterNoBorder); + row++; + + excel.SetCellValue(row, 0, "序號", titleStyleCenterNoBorder); + excel.SetCellValue(row, 1, "站別", titleStyleCenterNoBorder); + excel.SetCellValue(row, 2, "人員姓名", titleStyleCenterNoBorder); + excel.SetCellValue(row, 3, "薪資", titleStyleCenterNoBorder); + excel.SetCellValue(row, 4, "補休", titleStyleCenterNoBorder); + excel.SetCellValue(row, 5, "特休", titleStyleCenterNoBorder); + excel.SetCellValue(row, 6, "產假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 7, "陪產假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 8, "產檢假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 9, "婚假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 10, "公假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 11, "工傷假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 12, "喪假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 13, "事假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 14, "家庭照顧假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 15, "原民祭儀假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 16, "其他(一)", titleStyleCenterNoBorder); + excel.SetCellValue(row, 17, "小計", titleStyleCenterNoBorder); + excel.SetCellValue(row, 18, "病假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 19, "生理假", titleStyleCenterNoBorder); + excel.SetCellValue(row, 20, "小計", titleStyleCenterNoBorder); + excel.SetCellValue(row, 21, "合計金額", titleStyleCenterNoBorder); + excel.SetCellValue(row, 22, "備註", titleStyleCenterNoBorder); + excel.SetRowHeight(row, 18); + row++; + + #endregion + + #region 報表資料 + + int beginRow = row; + int serial = 1; + var SST05_SUM = 0; + var SST06_SUM = 0; + var SST10_SUM = 0; + var SST12_SUM = 0; + var SST20_SUM = 0; + var SST11_SUM = 0; + var SST13_SUM = 0; + var SST14_SUM = 0; + var SST09_SUM = 0; + var SST07_SUM = 0; + var SST16_SUM = 0; + var SST19_SUM = 0; + var SST23_SUM = 0; + var SST08_SUM = 0; + var SST15_SUM = 0; + + foreach (DataRow r in 資料來源.Tables[0].Rows) + { + var 月薪 = WDAC.GetInt32Value(r["SSP00"]) + WDAC.GetInt32Value(r["SSP02"]); + var 無薪小計 = WDAC.GetInt32Value(r["SSS02"]) + WDAC.GetInt32Value(r["SSS09"]); + var 扣款合計 = WDAC.GetInt32Value(r["SSS01"]) + WDAC.GetInt32Value(r["SSS02"]) + WDAC.GetInt32Value(r["SSS09"]); + + excel.SetCellValue(row, 0, serial, bodyStyleCenterNoBorder); + excel.SetCellValue(row, 1, WDAC.GetStringValue(r["SSBRHX"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 2, WDAC.GetStringValue(r["BPNME"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 3, 月薪, bodyNumberStyleNoBorder); + + SST05_SUM += WDAC.GetInt32Value(r["SST05"]) * 60 + WDAC.GetInt32Value(r["SST05M"]); + SST06_SUM += WDAC.GetInt32Value(r["SST06"]) * 60 + WDAC.GetInt32Value(r["SST06M"]); + SST10_SUM += WDAC.GetInt32Value(r["SST10"]) * 60 + WDAC.GetInt32Value(r["SST10M"]); + SST12_SUM += WDAC.GetInt32Value(r["SST12"]) * 60 + WDAC.GetInt32Value(r["SST12M"]); + SST20_SUM += WDAC.GetInt32Value(r["SST20"]) * 60 + WDAC.GetInt32Value(r["SST20M"]); + SST11_SUM += WDAC.GetInt32Value(r["SST11"]) * 60 + WDAC.GetInt32Value(r["SST11M"]); + SST13_SUM += WDAC.GetInt32Value(r["SST13"]) * 60 + WDAC.GetInt32Value(r["SST13M"]); + SST14_SUM += WDAC.GetInt32Value(r["SST14"]) * 60 + WDAC.GetInt32Value(r["SST14M"]); + SST09_SUM += WDAC.GetInt32Value(r["SST09"]) * 60 + WDAC.GetInt32Value(r["SST09M"]); + SST07_SUM += WDAC.GetInt32Value(r["SST07"]) * 60 + WDAC.GetInt32Value(r["SST07M"]); + SST16_SUM += WDAC.GetInt32Value(r["SST16"]) * 60 + WDAC.GetInt32Value(r["SST16M"]); + SST19_SUM += WDAC.GetInt32Value(r["SST19"]) * 60 + WDAC.GetInt32Value(r["SST19M"]); + SST23_SUM += WDAC.GetInt32Value(r["SST23"]) * 60 + WDAC.GetInt32Value(r["SST23M"]); + SST08_SUM += WDAC.GetInt32Value(r["SST08"]) * 60 + WDAC.GetInt32Value(r["SST08M"]); + SST15_SUM += WDAC.GetInt32Value(r["SST15"]) * 60 + WDAC.GetInt32Value(r["SST15M"]); + + if (以時分顯示時數) + { + excel.SetCellValue(row, 4, string.Format("{0:#00}:{1:00}", r["SST05"], r["SST05M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 5, string.Format("{0:#00}:{1:00}", r["SST06"], r["SST06M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 6, string.Format("{0:#00}:{1:00}", r["SST10"], r["SST10M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 7, string.Format("{0:#00}:{1:00}", r["SST12"], r["SST12M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 8, string.Format("{0:#00}:{1:00}", r["SST20"], r["SST20M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 9, string.Format("{0:#00}:{1:00}", r["SST11"], r["SST11M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 10, string.Format("{0:#00}:{1:00}", r["SST13"], r["SST13M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 11, string.Format("{0:#00}:{1:00}", r["SST14"], r["SST14M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 12, string.Format("{0:#00}:{1:00}", r["SST09"], r["SST09M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 13, string.Format("{0:#00}:{1:00}", r["SST07"], r["SST07M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 14, string.Format("{0:#00}:{1:00}", r["SST16"], r["SST16M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 15, string.Format("{0:#00}:{1:00}", r["SST19"], r["SST19M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 16, string.Format("{0:#00}:{1:00}", r["SST23"], r["SST23M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 17, 無薪小計, bodyNumberStyleNoBorder); + excel.SetCellValue(row, 18, string.Format("{0:#00}:{1:00}", r["SST08"], r["SST08M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 19, string.Format("{0:#00}:{1:00}", r["SST15"], r["SST15M"]), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 20, WDAC.GetInt32Value(r["SSS01"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 21, 扣款合計, bodyNumberStyleNoBorder); + } + else + { + excel.SetCellValue(row, 4, WDAC.GetInt32Value(r["SST05"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 5, WDAC.GetInt32Value(r["SST06"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 6, WDAC.GetInt32Value(r["SST10"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 7, WDAC.GetInt32Value(r["SST12"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 8, WDAC.GetInt32Value(r["SST20"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 9, WDAC.GetInt32Value(r["SST11"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 10, WDAC.GetInt32Value(r["SST13"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 11, WDAC.GetInt32Value(r["SST14"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 12, WDAC.GetInt32Value(r["SST09"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 13, WDAC.GetInt32Value(r["SST07"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 14, WDAC.GetInt32Value(r["SST16"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 15, WDAC.GetInt32Value(r["SST19"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 16, WDAC.GetInt32Value(r["SST23"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 17, 無薪小計, bodyNumberStyleNoBorder); + excel.SetCellValue(row, 18, WDAC.GetInt32Value(r["SST08"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 19, WDAC.GetInt32Value(r["SST15"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 20, WDAC.GetInt32Value(r["SSS01"]), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 21, 扣款合計, bodyNumberStyleNoBorder); + } + row++; + serial++; + } + + #endregion + + #region 合計及表尾批示 + excel.MergeCell(row, 0, row, 1, BorderStyle.None); + excel.SetCellValue(row, 0, "合計", titleStyleLeftNoBorder); + + if (以時分顯示時數) + { + excel.SetCellValue(row, 4, MinuteToTime(SST05_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 5, MinuteToTime(SST06_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 6, MinuteToTime(SST10_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 7, MinuteToTime(SST12_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 8, MinuteToTime(SST20_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 9, MinuteToTime(SST11_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 10, MinuteToTime(SST13_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 11, MinuteToTime(SST14_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 12, MinuteToTime(SST09_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 13, MinuteToTime(SST07_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 14, MinuteToTime(SST16_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 15, MinuteToTime(SST19_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 16, MinuteToTime(SST23_SUM), bodyStyleCenterNoBorder); + excel.SetCellFormula(row, 17, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 17), excel.RCtoA1(row - 1, 17)), bodyNumberStyleNoBorder); + excel.SetCellValue(row, 18, MinuteToTime(SST08_SUM), bodyStyleCenterNoBorder); + excel.SetCellValue(row, 19, MinuteToTime(SST15_SUM), bodyStyleCenterNoBorder); + excel.SetCellFormula(row, 20, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 20), excel.RCtoA1(row - 1, 20)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 21, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 21), excel.RCtoA1(row - 1, 21)), bodyNumberStyleNoBorder); + } + else + { + excel.SetCellFormula(row, 4, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 4), excel.RCtoA1(row - 1, 4)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 5, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 5), excel.RCtoA1(row - 1, 5)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 6, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 6), excel.RCtoA1(row - 1, 6)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 7, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 7), excel.RCtoA1(row - 1, 7)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 8, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 8), excel.RCtoA1(row - 1, 8)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 9, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 9), excel.RCtoA1(row - 1, 9)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 10, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 10), excel.RCtoA1(row - 1, 10)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 11, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 11), excel.RCtoA1(row - 1, 11)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 12, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 12), excel.RCtoA1(row - 1, 12)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 13, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 13), excel.RCtoA1(row - 1, 13)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 14, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 14), excel.RCtoA1(row - 1, 14)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 15, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 15), excel.RCtoA1(row - 1, 15)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 16, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 16), excel.RCtoA1(row - 1, 16)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 17, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 17), excel.RCtoA1(row - 1, 17)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 18, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 18), excel.RCtoA1(row - 1, 18)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 19, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 19), excel.RCtoA1(row - 1, 19)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 20, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 20), excel.RCtoA1(row - 1, 20)), bodyNumberStyleNoBorder); + excel.SetCellFormula(row, 21, String.Format("SUM({0}:{1})", excel.RCtoA1(beginRow, 21), excel.RCtoA1(row - 1, 21)), bodyNumberStyleNoBorder); + } + row++; + + excel.MergeCell(row, 0, row, 6, BorderStyle.None); + excel.SetCellValue(row, 0, "承辦人:", titleStyleLeftNoBorder); + excel.MergeCell(row, 7, row, 13, BorderStyle.None); + excel.SetCellValue(row, 7, "業務主管:", titleStyleLeftNoBorder); + excel.MergeCell(row, 14, row, 22, BorderStyle.None); + excel.SetCellValue(row, 14, "公司章:", titleStyleLeftNoBorder); + + #endregion + + excel.SetColumnWidth(0, 6); + excel.SetColumnWidth(1, 10); + excel.SetColumnWidth(2, 10); + excel.SetColumnWidth(3, 10); + excel.SetColumnWidth(4, 10); + excel.SetColumnWidth(5, 10); + excel.SetColumnWidth(6, 10); + excel.SetColumnWidth(7, 10); + excel.SetColumnWidth(8, 10); + excel.SetColumnWidth(9, 10); + excel.SetColumnWidth(10, 10); + excel.SetColumnWidth(11, 10); + excel.SetColumnWidth(12, 10); + excel.SetColumnWidth(13, 10); + excel.SetColumnWidth(14, 10); + excel.SetColumnWidth(15, 10); + excel.SetColumnWidth(16, 10); + excel.SetColumnWidth(17, 10); + excel.SetColumnWidth(18, 10); + excel.SetColumnWidth(19, 10); + excel.SetColumnWidth(20, 10); + excel.SetColumnWidth(21, 10); + excel.SetColumnWidth(22, 10); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + +} \ No newline at end of file diff --git a/Web/App_Code/Report/請假申請單.cs b/Web/App_Code/Report/請假申請單.cs new file mode 100644 index 0000000..0899a3f --- /dev/null +++ b/Web/App_Code/Report/請假申請單.cs @@ -0,0 +1,211 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Data; +using System.Data.Common; +using NPOI.SS.UserModel; +using NPOI.HSSF.UserModel; +using NPOI.HSSF.Util; +using System.IO; +using NPOI.SS.Util; +using Wellan.Data; +using System.Linq; + +/// +/// 請假申請單 +/// +public class 請假申請單 : ExcelReportBase +{ + public 請假申請單() + { + 報表名稱 = "請假申請單"; + } + + public override MemoryStream 產生報表() + { + BodyRowHeight = 35; + TimeCalc timeCalc = new TimeCalc(); + + #region 報表抬頭 + + excel.MergeCell(0, 0, 0, 9); + excel.SetCellValue(0, 0, String.Format("{0}\r\n承辦{1}\r\n『{2}』\r\n{3}", 公司名稱, 客戶名稱, 專案名稱, 報表名稱), headerStyle); + excel.SetCellValue(1, 0, "月份:", titleStyleRightNoBorder); + excel.MergeCell(1, 1, 1, 2); + excel.SetCellValue(1, 1, 報表時間.ToString("MM月"), titleStyleLeftNoBorder); + excel.SetCellValue(1, 3, "單位:", titleStyleRightNoBorder); + excel.SetCellValue(1, 4, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["站別"]), titleStyleLeftNoBorder); + excel.SetCellValue(1, 5, "職稱:", titleStyleRightNoBorder); + excel.SetCellValue(1, 6, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["職稱"]), titleStyleLeftNoBorder); + excel.SetCellValue(1, 7, "姓名:", titleStyleRightNoBorder); + excel.SetCellValue(1, 8, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["BPNME"]), titleStyleLeftNoBorder); + excel.SetRowHeight(0, HeaderRowHeight * 4); + excel.SetRowHeight(1, BodyRowHeight); + + excel.MergeCell(2, 0, 2, 2); + excel.SetRangeOuterBorder(2, 0, 2, 2, BorderStyle.Thin); + excel.SetCellValue(2, 0, "請假日期", titleStyleCenter); + excel.SetCellValue(2, 3, "開始時間", titleStyleCenter); + excel.SetCellValue(2, 4, "結束時間", titleStyleCenter); + excel.SetCellValue(2, 5, "請假類別", titleStyleCenter); + excel.SetCellValue(2, 6, "請假時數", titleStyleCenter); + excel.SetCellValue(2, 7, "代理人", titleStyleCenter); + excel.SetCellValue(2, 8, "請假事由", titleStyleCenter); + excel.SetCellValue(2, 9, "備註", titleStyleCenter); + excel.SetRowHeight(2, BodyRowHeight); + + #endregion + + #region 報表資料 + + DateTime 月初 = 報表時間; + DateTime 月底 = 報表時間.AddMonths(1).AddDays(-1); + + var summarys = new List() + { + new Summary() { Title = "補休" , RparTyps = new List() { RPAR_TYPE.T00_補休 } }, + new Summary() { Title = "特休" , RparTyps = new List() { RPAR_TYPE.T01_特休 } } , + new Summary() { Title = "事假" , RparTyps = new List() { RPAR_TYPE.T02_事假 } }, + new Summary() { Title = "病假" , RparTyps = new List() { RPAR_TYPE.T03_病假 } }, + new Summary() { Title = "喪假" , RparTyps = new List() { RPAR_TYPE.T04_喪假 } }, + new Summary() { Title = "產假" , RparTyps = new List() { RPAR_TYPE.T05_產假 } }, + new Summary() { Title = "婚假" , RparTyps = new List() { RPAR_TYPE.T06_婚假 } }, + new Summary() { Title = "陪產假" , RparTyps = new List() { RPAR_TYPE.T07_陪產假 } }, + new Summary() { Title = "公假(出)" , RparTyps = new List() { RPAR_TYPE.T08_公假 } }, + new Summary() { Title = "公傷假" , RparTyps = new List() { RPAR_TYPE.T09_公傷假 } }, + new Summary() { Title = "生理假" , RparTyps = new List() { RPAR_TYPE.T0A_生理假 } }, + new Summary() { Title = "家庭照顧假" , RparTyps = new List() { RPAR_TYPE.T0B_家庭照顧假 } }, + new Summary() { Title = "育嬰假" , RparTyps = new List() { RPAR_TYPE.T0C_育嬰假 } }, + new Summary() { Title = "原民祭儀假" , RparTyps = new List() { RPAR_TYPE.T0D_原民祭儀假 } }, + new Summary() { Title = "產檢假" , RparTyps = new List() { RPAR_TYPE.T0E_產檢假 } }, + new Summary() { Title = "其他假別(一)", RparTyps = new List() { RPAR_TYPE.T0F_防疫照顧假, + RPAR_TYPE.T0G_無薪假, + RPAR_TYPE.T0H_防疫隔離假 } } + }; + + int 總時數 = 0; + + int rowId = 3; + foreach (DataRow r in 資料來源.Tables[0].Rows) + { + DateTime 起日 = WDAC.GetDateTimeValue(r["RPRDT"]); + DateTime 迄日 = WDAC.GetDateTimeValue(r["RPEDT"]); + string 起時 = WDAC.GetStringValue(r["RPRTM"]); + string 迄時 = WDAC.GetStringValue(r["RPETM"]); + string 類別 = WDAC.GetStringValue(r["RPTYP"]); + + if (起日 < 月初) + { + 起日 = 月初; + 起時 = timeCalc.上班時間; + } + if (迄日 > 月底) + { + 迄日 = 月底; + 迄時 = timeCalc.下班時間; + } + + //Double 時數 = WDAC.GetDoubleValue(r["RPTCT"]) / 60; + int 時數 = timeCalc.計算請假總時數(WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["RPNUM"]), 起日, 迄日, 起時, 迄時, 類別, !以時分顯示時數); + 總時數 += 時數; + + #region 區分假別統計 + var summary = summarys.FirstOrDefault(p => p.RparTyps.Contains(類別)); + if (summary != null) { + summary.Minutes += 時數; + } + #endregion + + excel.SetCellValue(rowId, 0, 起日.ToString("MM月dd日"), titleStyleCenter); + excel.SetCellValue(rowId, 1, "~", titleStyleCenter); + excel.SetCellValue(rowId, 2, 迄日.ToString("MM月dd日"), titleStyleCenter); + excel.SetCellValue(rowId, 3, 起時, titleStyleCenter); + excel.SetCellValue(rowId, 4, 迄時, titleStyleCenter); + excel.SetCellValue(rowId, 5, WDAC.GetStringValue(r["類別"]), titleStyleCenter); + excel.SetCellValue(rowId, 6, MinuteToTime(時數), titleStyleCenter); + excel.SetCellValue(rowId, 7, WDAC.GetStringValue(r["RPAGT"]), titleStyleCenter); + excel.SetCellValue(rowId, 8, WDAC.GetStringValue(r["RPRSN"]), bodyStyleCenterS); + excel.SetCellValue(rowId, 9, WDAC.GetStringValue(r["RPDOC"]), bodyStyleCenterS); + excel.SetRowHeight(rowId, BodyRowHeight); + rowId++; + } + + #region 底下的統計 + var summaryRows = summarys.Count + 1; + + excel.MergeCell(rowId + 2, 2, rowId + summaryRows, 3); + excel.MergeCell(rowId + 2, 4, rowId + summaryRows, 4); + excel.MergeCell(rowId + 2, 5, rowId + summaryRows, 5); + excel.SetCellValue(rowId + 2, 2, "總請假時數:", titleStyleRightNoBorder); + excel.SetCellValue(rowId + 2, 4, MinuteToTime(總時數), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + 2, 5, "hrs", titleStyleLeftNoBorder); + excel.SetRangeOuterBorder(rowId + 2, 2, rowId + summaryRows, 5, BorderStyle.Thin); + + var rr = 2; + foreach (var symmary in summarys) + { + excel.SetCellValue(rowId + rr, 6, symmary.Title + ":", titleStyleLeftNoBorder); + excel.SetCellValue(rowId + rr, 7, MinuteToTime(symmary.Minutes), titleStyleCenterNoBorder); + excel.SetCellValue(rowId + rr, 8, "hrs", titleStyleLeftNoBorder); + excel.SetRangeOuterBorder(rowId + rr, 6, rowId + rr, 8, BorderStyle.Thin); + excel.SetRowHeight(rowId + rr, BodyRowHeight); + rr++; + } + + rowId += summaryRows; + #endregion + + #region 表尾批示 + + //excel.MergeCell(rowId + 10, 0, rowId + 10, 9); + //excel.SetCellValue(rowId + 10, 0, "申請人:             計畫督導:             人事單位:", titleStyleLeftNoBorder); + //excel.SetRowHeight(rowId + 10, BodyRowHeight); + + //excel.MergeCell(rowId + 1, 1, rowId + 1, 3); + //excel.MergeCell(rowId + 2, 1, rowId + 2, 3); + //excel.SetCellValue(rowId + 1, 1, "申請人", titleStyleCenter); + //excel.SetRangeOuterBorder(rowId + 1, 1, rowId + 1, 3, BorderStyle.Thin); + //excel.SetRangeOuterBorder(rowId + 2, 1, rowId + 2, 3, BorderStyle.Thin); + + //excel.MergeCell(rowId + 1, 4, rowId + 1, 6); + //excel.MergeCell(rowId + 2, 4, rowId + 2, 6); + //excel.SetCellValue(rowId + 1, 4, "公司計畫督導", titleStyleCenter); + //excel.SetRangeOuterBorder(rowId + 1, 4, rowId + 1, 6, BorderStyle.Thin); + //excel.SetRangeOuterBorder(rowId + 2, 4, rowId + 2, 6, BorderStyle.Thin); + + //excel.MergeCell(rowId + 1, 7, rowId + 1, 8); + //excel.MergeCell(rowId + 2, 7, rowId + 2, 8); + //excel.SetCellValue(rowId + 1, 7, "公司計畫主持人", titleStyleCenter); + //excel.SetRangeOuterBorder(rowId + 1, 7, rowId + 1, 8, BorderStyle.Thin); + //excel.SetRangeOuterBorder(rowId + 2, 7, rowId + 2, 8, BorderStyle.Thin); + + //excel.SetRowHeight(rowId + 1, BodyRowHeight); + //excel.SetRowHeight(rowId + 2, BodyRowHeight); + + #endregion + + #endregion + + excel.SetColumnWidth(0, 11); + excel.SetColumnWidth(1, 4); + excel.SetColumnWidth(2, 11); + excel.SetColumnWidth(3, 11); + excel.SetColumnWidth(4, 11); + excel.SetColumnWidth(5, 11); + excel.SetColumnWidth(6, 18); + excel.SetColumnWidth(7, 12); + excel.SetColumnWidth(8, 20); + excel.SetColumnWidth(9, 15); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } +} + +class Summary +{ + public string Title; + public int Minutes; + public List RparTyps; +} \ No newline at end of file diff --git a/Web/App_Code/Task/MailTask.cs b/Web/App_Code/Task/MailTask.cs new file mode 100644 index 0000000..e9a9dc4 --- /dev/null +++ b/Web/App_Code/Task/MailTask.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Timers; +using System.Net.Mail; +using System.Data; +using Wellan.Data; +using System.Text; +using System.IO; + +/// +/// 定時發送郵件 +/// +/// 1. 代理人代理前一天發送郵件通知 +/// +public class MailTask +{ + private Timer timer1; + private static MailTask instance = null; + + private MailTask() + { + timer1 = new Timer(); + timer1.Interval = 1000; + timer1.AutoReset = true; + timer1.Elapsed += Timer1_Elapsed; + } + + private void Timer1_Elapsed(object sender, ElapsedEventArgs e) + { + var nowTime = DateTime.UtcNow.AddHours(8).ToString("HHmmss"); + + // 每日定時工作 + if (nowTime == "000000") + { + 發代理人提醒郵件(); + } + + // 每小時定時工作 + if (nowTime.EndsWith("0000")) + { + + } + + // 每分鐘定時工作 + if (nowTime.EndsWith("00")) + { + + } + } + private static void EnsureInstance() + { + if (instance == null) + instance = new MailTask(); + } + + public static bool Enabled + { + get + { + EnsureInstance(); + return instance.timer1.Enabled; + } + set + { + EnsureInstance(); + instance.timer1.Enabled = value; + } + } + + private void 發代理人提醒郵件() + { + RparDAC dao = new RparDAC(); + var notofyList = dao.代理人提醒(DateTime.UtcNow.AddHours(8).Date.AddDays(1)); + + // RPPYN 年度接單編號 + // RPREN 單號 + // RPNUM 差假員工編號 + // BPNME 差假員工姓名 + // BPEML 差假員工電郵 + // RPTYP 差假類別代碼 + // BSSCR 差假類別名稱 + // RPAGT 代理人姓名 + // RPAGM 代理人電郵 + // RPRDT 差假開始日期 + // RPRTM 差假開始時間 + // RPEDT 差假結束日期 + // RPETM 差假結束時間 + + foreach (DataRow r in notofyList.Rows) + { + var 單號 = WDAC.GetStringValue(r["RPREN"]); + var 類別 = WDAC.GetStringValue(r["RPTYP"]); + + switch (類別.Substring(0, 1)) + { + // 請假 + case RPAR_TYPE.T0_請假: + 類別 = "請假"; + break; + // 差旅 + case RPAR_TYPE.T3_出差: + 類別 = "差旅"; + break; + default: + return; + } + + MailMessage mm = new MailMessage(); + mm.Subject = String.Format("{1}代理提醒 [單號:{0}]", 單號, 類別); + mm.To.Add(new MailAddress(WDAC.GetStringValue(r["RPAGM"]))); + mm.BodyEncoding = Encoding.UTF8; + mm.IsBodyHtml = true; + mm.Body = File.ReadAllText(HttpContext.Current.Server.MapPath("~/Template/代理人提醒.html")) + .Replace("{類別}", 類別) + .Replace("{單號}", 單號) + .Replace("{差勤人}", WDAC.GetStringValue(r["BPNME"])) + .Replace("{事由}", 類別 == "請假" ? WDAC.GetStringValue(r["RPRSN"]) : WDAC.GetStringValue(r["RPDOC"])) + .Replace("{起日}", String.Format("{0:yyyy-MM-dd}", r["RPRDT"])) + .Replace("{起時}", String.Format("{0}", r["RPRTM"])) + .Replace("{迄日}", String.Format("{0:yyyy-MM-dd}", r["RPEDT"])) + .Replace("{迄時}", String.Format("{0}", r["RPETM"])) + ; + // 發送郵件 + try + { + Wellan.Service.WMailSender.GetInstance().Send(mm, string.Format("代理提醒 單號:{0}", 單號)); + } + catch + { } + } + + } + +} \ No newline at end of file diff --git a/Web/App_Code/wmBpsn.cs b/Web/App_Code/wmBpsn.cs new file mode 100644 index 0000000..336871c --- /dev/null +++ b/Web/App_Code/wmBpsn.cs @@ -0,0 +1,214 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Script.Services; +using System.Web.Services; +using Wellan.Common; +using Wellan.Data; + +/// +/// wmBpsn 的摘要描述 +/// +[WebService(Namespace = "http://tempuri.org/")] +[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] +[ScriptService] +public class wmBpsn : System.Web.Services.WebService +{ + + public wmBpsn() + { + System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("zh-TW"); + ci.DateTimeFormat.Calendar = new System.Globalization.TaiwanCalendar(); + System.Threading.Thread.CurrentThread.CurrentCulture = ci; + } + + private WQuery GetQuery() + { + string ConnectionConfigName = WConfig.GetConnectionConfigName(); + WConnectionString.ConnectionConfigFile = WConfig.GetConnectionConfig(); + string ConnectionString = WConnectionString.GetConnectionString(ConnectionConfigName); + string ConnectionType = WConnectionString.GetConnectionType(ConnectionConfigName); + return new WQuery(ConnectionType, ConnectionString); + } + + private GetDataResponse CheckInput(RPSBItem prev, RPSBSaveItem saveRecord) + { + var result = 0; + var message = ""; + + if (!saveRecord.IsValid) + { + result = -1; + message = saveRecord.Message; + } + else if (prev != null) + { + if (saveRecord.RPDAT_DATE < prev.RPDAT) + { + result = -1; + message = "異動日期不可小於前一筆的異動日期"; + } + else if (prev.OnBoard && saveRecord.OnBoard) + { + result = -1; + message = "異動類別不合理(連續兩個在職)"; + } + else if (prev.OffBoard && !prev.Quit && saveRecord.OffBoard && !saveRecord.Quit) + { + result = -1; + message = "異動類別不合理(連續兩個留職停薪)"; + } + else if (prev.Quit && saveRecord.Quit) + { + result = -1; + message = "異動類別不合理(連續兩個離職)"; + } + else if (prev.Quit && saveRecord.OffBoard && !saveRecord.Quit) + { + result = -1; + message = "異動類別不合理(離職後留職停薪)"; + } + else if (prev.OffBoard && saveRecord.DeptChange) + { + result = -1; + message = "異動類別不合理(不在職時部門調動)"; + } + } + + if (result == 0) + { + return null; + } + else + { + return new GetDataResponse() + { + Result = -1, + Data = null, + Message = message + }; + } + } + + [WebMethod(EnableSession = true)] + [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] + public GetDataResponse GetRPSBList(string rpeno) + { + var query = GetQuery(); + var dao = new RpsbDAC(query); + var d = dao.Select(rpeno); + return new GetDataResponse() + { + Result = 0, + Data = Newtonsoft.Json.JsonConvert.SerializeObject(d) + }; + } + + [WebMethod(EnableSession = true)] + [ScriptMethod(ResponseFormat = ResponseFormat.Json)] + public GetDataResponse AddRPSB(string record) + { + var saveRecord = Newtonsoft.Json.JsonConvert.DeserializeObject(record); + if (!saveRecord.IsValid) + { + return new GetDataResponse() + { + Result = -1, + Data = null, + Message = saveRecord.Message + }; + } + + var query = GetQuery(); + var dao = new RpsbDAC(query); + var rpitm = dao.NextRPITM(saveRecord.RPENO); + var prev = dao.SelectLast(saveRecord.RPENO, 0); + + var checkResult = CheckInput(prev, saveRecord); + if (checkResult != null) + { + return checkResult; + } + + var newRecord = new RPSBItem() + { + RPENO = saveRecord.RPENO, + RPITM = rpitm, + RPCLS = saveRecord.RPCLS, + RPDAT = saveRecord.RPDAT_DATE, + RPODT = saveRecord.DeptChange ? dao.PrevRPDPT(saveRecord.RPENO, rpitm) : "", + RPDPT = saveRecord.RPDPT, + RPDOC = saveRecord.RPDOC + }; + + var d = dao.InsertOne(newRecord); + return new GetDataResponse() + { + Result = d ? 0 : -1, + Data = d.ToString() + }; + } + + [WebMethod(EnableSession = true)] + [ScriptMethod(ResponseFormat = ResponseFormat.Json)] + public GetDataResponse UpdateRPSB(string record) + { + var saveRecord = Newtonsoft.Json.JsonConvert.DeserializeObject(record); + var query = GetQuery(); + var dao = new RpsbDAC(query); + var prev = dao.SelectLast(saveRecord.RPENO, saveRecord.RPITM); + + var checkResult = CheckInput(prev, saveRecord); + if (checkResult != null) + { + return checkResult; + } + + var updateRecord = new RPSBItem() + { + RPENO = saveRecord.RPENO, + RPITM = saveRecord.RPITM, + RPCLS = saveRecord.RPCLS, + RPDAT = saveRecord.RPDAT_DATE, + RPODT = saveRecord.DeptChange ? dao.PrevRPDPT(saveRecord.RPENO, saveRecord.RPITM) : "", + RPDPT = saveRecord.RPDPT, + RPDOC = saveRecord.RPDOC + }; + + var d = dao.UpdateOne(updateRecord); + return new GetDataResponse() + { + Result = d ? 0 : -1, + Data = d.ToString() + }; + } + + [WebMethod(EnableSession = true)] + [ScriptMethod(ResponseFormat = ResponseFormat.Json)] + public GetDataResponse DeleteRPSB(string rpeno, int rpitm) + { + var query = GetQuery(); + var dao = new RpsbDAC(query); + var d = dao.DeleteOne(rpeno, rpitm); + return new GetDataResponse() + { + Result = d ? 0 : -1, + Data = d.ToString() + }; + } + + [WebMethod(EnableSession = true)] + [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] + public GetDataResponse GetRASNList(string bpeno) + { + var query = GetQuery(); + var dao = new RasnDAC(query); + var d = dao.SelectHistoryByEmployee(bpeno); + return new GetDataResponse() + { + Result = 0, + Data = Newtonsoft.Json.JsonConvert.SerializeObject(d) + }; + } +} diff --git a/Web/App_Code/wmRyer.cs b/Web/App_Code/wmRyer.cs new file mode 100644 index 0000000..81c8d09 --- /dev/null +++ b/Web/App_Code/wmRyer.cs @@ -0,0 +1,200 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Script.Services; +using System.Web.Services; +using Wellan.Common; +using Wellan.Data; + +/// +/// wmRyer 的摘要描述 +/// +[WebService(Namespace = "http://tempuri.org/")] +[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] +[ScriptService] +public class wmRyer : System.Web.Services.WebService +{ + + public wmRyer() + { + } + + private static WQuery CreateQuery() + { + string ConnectionConfigName = WConfig.GetConnectionConfigName(); + WConnectionString.ConnectionConfigFile = WConfig.GetConnectionConfig(); + string ConnectionString = WConnectionString.GetConnectionString(ConnectionConfigName); + string ConnectionType = WConnectionString.GetConnectionType(ConnectionConfigName); + WQuery Query = new WQuery(ConnectionType, ConnectionString); + return Query; + } + + private static void CheckInput(RyerSaveItem item) + { + if (item.ryd01 <= 0) item.ryd01 = 1; + if (item.ryd02 <= 0) item.ryd02 = 1; + if (item.ryd03 <= 0) item.ryd03 = 1; + if (item.ryd04 <= 0) item.ryd04 = 1; + if (item.ryd05 <= 0) item.ryd05 = 1; + if (item.ryd06 <= 0) item.ryd06 = 1; + if (item.ryd07 <= 0) item.ryd07 = 1; + if (item.ryd08 <= 0) item.ryd08 = 1; + if (item.ryd09 <= 0) item.ryd09 = 1; + if (item.ryd10 <= 0) item.ryd10 = 1; + if (item.ryd11 <= 0) item.ryd11 = 1; + if (item.ryd12 <= 0) item.ryd12 = 1; + + if (item.ryd01 > 31) item.ryd01 = 31; + if (item.ryd02 > 31) item.ryd02 = 31; + if (item.ryd03 > 31) item.ryd03 = 31; + if (item.ryd04 > 31) item.ryd04 = 31; + if (item.ryd05 > 31) item.ryd05 = 31; + if (item.ryd06 > 31) item.ryd06 = 31; + if (item.ryd07 > 31) item.ryd07 = 31; + if (item.ryd08 > 31) item.ryd08 = 31; + if (item.ryd09 > 31) item.ryd09 = 31; + if (item.ryd10 > 31) item.ryd10 = 31; + if (item.ryd11 > 31) item.ryd11 = 31; + if (item.ryd12 > 31) item.ryd12 = 31; + + item.ryyst_h = item.ryyst_h ?? 0; + item.ryyst_m = item.ryyst_m ?? 0; + item.rysly_h = item.rysly_h ?? 0; + item.rysly_m = item.rysly_m ?? 0; + item.rynxt_h = item.rynxt_h ?? 0; + item.rynxt_m = item.rynxt_m ?? 0; + + if (item.ryyst_h < 0) + { + throw new Exception("年初小時數錯誤,應大於等於 0"); + } + if (item.ryyst_m < 0 || item.ryyst_m > 59) + { + throw new Exception("年初分鐘數錯誤,應從 0 至 59"); + } + if (item.rysly_h < 0) + { + throw new Exception("折算薪資小時數錯誤,應大於等於 0"); + } + if (item.rysly_m < 0 || item.rysly_m > 59) + { + throw new Exception("折算薪資分鐘數錯誤,應從 0 至 59"); + } + if (item.rynxt_h < 0) + { + throw new Exception("遞延下年小時數錯誤,應大於等於 0"); + } + if (item.rynxt_m < 0 || item.rynxt_m > 59) + { + throw new Exception("遞延下年分鐘數錯誤,應從 0 至 59"); + } + + item.ryyst = item.ryyst_h * 60 + item.ryyst_m; + item.rysly = item.rysly_h * 60 + item.rysly_m; + item.rynxt = item.rynxt_h * 60 + item.rynxt_m; + } + + + [WebMethod(EnableSession = true)] + [ScriptMethod(ResponseFormat = ResponseFormat.Json)] + public RyerSaveItem Save(RyerSaveItem item) + { + try + { + CheckInput(item); + + WQuery Query = CreateQuery(); + RyerDAC ryerdao = new RyerDAC(Query); + var nowtime = DateTime.UtcNow.AddHours(8); + int month = nowtime.Month; + int day = nowtime.Day; + if (item.ryyer < nowtime.Year) + { + month = 12; + day = 31; + } + + ryerdao.UpdateOne( + item.ryeno + , item.ryyer + , item.ryyst.Value + (item.ryh01 + item.ryh02 + item.ryh03 + item.ryh04 + item.ryh05 + item.ryh06 + item.ryh07 + item.ryh08 + item.ryh09 + item.ryh10 + item.ryh11 + item.ryh12) * 60 + , item.userid + , item.ryyst.Value + , item.ryh01 * 60, item.ryh02 * 60, item.ryh03 * 60, item.ryh04 * 60, item.ryh05 * 60, item.ryh06 * 60, item.ryh07 * 60, item.ryh08 * 60, item.ryh09 * 60, item.ryh10 * 60, item.ryh11 * 60, item.ryh12 * 60 + , item.ryd01, item.ryd02, item.ryd03, item.ryd04, item.ryd05, item.ryd06, item.ryd07, item.ryd08, item.ryd09, item.ryd10, item.ryd11, item.ryd12 + , item.rysly.Value, item.rynxt.Value, item.ryrmk); + + int 可用特休 = ryerdao.Get可用特休(item.ryeno, item.ryyer, month, day); + int 至今生效特休 = ryerdao.Get至今生效特休(item.ryeno, item.ryyer, month, day); + int 已休特休 = ryerdao.Get年初特休(item.ryeno, item.ryyer) + 至今生效特休 - 可用特休; + + item.ryyxt_d = String.Format("{0}:{1:00}", Convert.ToInt32(item.ryyxt / 60), item.ryyxt % 60); + item.ryvld = String.Format("{0}:{1:00}", Convert.ToInt32(至今生效特休 / 60), 至今生效特休 % 60); + item.ryust = String.Format("{0}:{1:00}", Convert.ToInt32(已休特休 / 60), 已休特休 % 60); + item.rylft = String.Format("{0}:{1:00}", Convert.ToInt32(可用特休 / 60), 可用特休 % 60); + item.result = 0; + } + catch (Exception ex) + { + item.result = -1; + item.message = ex.Message; + } + return item; + } + + [WebMethod(EnableSession = true)] + [ScriptMethod(ResponseFormat = ResponseFormat.Json)] + public RyerSaveItem Final(RyerSaveItem item) + { + try + { + CheckInput(item); + + WQuery Query = CreateQuery(); + RyerDAC ryerdao = new RyerDAC(Query); + var nowtime = DateTime.UtcNow.AddHours(8); + int month = nowtime.Month; + int day = nowtime.Day; + if (item.ryyer < nowtime.Year) + { + month = 12; + day = 31; + } + + ryerdao.UpdateOne( + item.ryeno + , item.ryyer + , item.ryyst.Value + (item.ryh01 + item.ryh02 + item.ryh03 + item.ryh04 + item.ryh05 + item.ryh06 + item.ryh07 + item.ryh08 + item.ryh09 + item.ryh10 + item.ryh11 + item.ryh12) * 60 + , item.userid + , item.ryyst.Value + , item.ryh01 * 60, item.ryh02 * 60, item.ryh03 * 60, item.ryh04 * 60, item.ryh05 * 60, item.ryh06 * 60, item.ryh07 * 60, item.ryh08 * 60, item.ryh09 * 60, item.ryh10 * 60, item.ryh11 * 60, item.ryh12 * 60 + , item.ryd01, item.ryd02, item.ryd03, item.ryd04, item.ryd05, item.ryd06, item.ryd07, item.ryd08, item.ryd09, item.ryd10, item.ryd11, item.ryd12 + , item.rysly.Value, item.rynxt.Value, item.ryrmk); + + var finalResult = ryerdao.Final( + item.ryeno + , item.ryyer + , item.userid); + + int 可用特休 = ryerdao.Get可用特休(item.ryeno, item.ryyer, month, day); + int 至今生效特休 = ryerdao.Get至今生效特休(item.ryeno, item.ryyer, month, day); + int 已休特休 = ryerdao.Get年初特休(item.ryeno, item.ryyer) + 至今生效特休 - 可用特休; + item.ryyxt_d = String.Format("{0}:{1:00}", Convert.ToInt32(item.ryyxt / 60), item.ryyxt % 60); + item.ryvld = String.Format("{0}:{1:00}", Convert.ToInt32(至今生效特休 / 60), 至今生效特休 % 60); + item.ryust = String.Format("{0}:{1:00}", Convert.ToInt32(已休特休 / 60), 已休特休 % 60); + item.rylft = String.Format("{0}:{1:00}", Convert.ToInt32(可用特休 / 60), 可用特休 % 60); + item.result = 0; + if (finalResult == "年度結算") + item.message = string.Format("人員編號 {0} 年度 {1} 結算成功", item.ryeno, item.ryyer - 1911); + if (finalResult == "離職結算") + item.message = string.Format("人員編號 {0} 離職結算成功", item.ryeno); + } + catch (Exception ex) + { + item.result = -1; + item.message = string.Format("人員編號 {0} 結算失敗:{1}", item.ryeno, ex.Message); + } + return item; + } +} diff --git a/Web/App_Data/PublishProfiles/Release.pubxml b/Web/App_Data/PublishProfiles/Release.pubxml new file mode 100644 index 0000000..5d1521b --- /dev/null +++ b/Web/App_Data/PublishProfiles/Release.pubxml @@ -0,0 +1,23 @@ + + + + + FileSystem + Release + Any CPU + + True + D:\VS.NET\Thinkyu\PrecompiledWeb + True + True + True + False + True + MergeAllPagesAndControlToASingleAssembly + True + WEB + + \ No newline at end of file diff --git a/Web/App_Themes/DefaultTheme/Img/TabBase.png b/Web/App_Themes/DefaultTheme/Img/TabBase.png new file mode 100644 index 0000000..ba81755 Binary files /dev/null and b/Web/App_Themes/DefaultTheme/Img/TabBase.png differ diff --git a/Web/App_Themes/DefaultTheme/Img/TabGreen.png b/Web/App_Themes/DefaultTheme/Img/TabGreen.png new file mode 100644 index 0000000..dfa9692 Binary files /dev/null and b/Web/App_Themes/DefaultTheme/Img/TabGreen.png differ diff --git a/Web/App_Themes/DefaultTheme/Img/TabNavy.png b/Web/App_Themes/DefaultTheme/Img/TabNavy.png new file mode 100644 index 0000000..5d6cf7a Binary files /dev/null and b/Web/App_Themes/DefaultTheme/Img/TabNavy.png differ diff --git a/Web/App_Themes/DefaultTheme/Img/TabYellow.png b/Web/App_Themes/DefaultTheme/Img/TabYellow.png new file mode 100644 index 0000000..9376c97 Binary files /dev/null and b/Web/App_Themes/DefaultTheme/Img/TabYellow.png differ diff --git a/Web/App_Themes/DefaultTheme/Skin.skin b/Web/App_Themes/DefaultTheme/Skin.skin new file mode 100644 index 0000000..52c7800 --- /dev/null +++ b/Web/App_Themes/DefaultTheme/Skin.skin @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Web/App_Themes/DefaultTheme/Style.css b/Web/App_Themes/DefaultTheme/Style.css new file mode 100644 index 0000000..5f8bc84 --- /dev/null +++ b/Web/App_Themes/DefaultTheme/Style.css @@ -0,0 +1,390 @@ +body, div { + padding: 0; + margin: 0; +} + +body, div, table, th, td, span, a, button { + font-family: Arial,'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; + font-size: 10pt; +} + +input, select, a { + box-sizing: border-box; +} + input[disabled="disabled"], button[disabled="disabled"], select[disabled="disabled"] { + color: #666 !important; + background-color: #E0E0E0; + } + +h1 { + font-size: 24pt; + color: White; +} + +table { + font-size: 10pt; + text-decoration: none; + border-collapse: collapse; +} + +th { + background-color: #4682b4; + color: White; + height: 24px; +} + + th.breakall, td.breakall { + word-break: break-all; + } + +.menu { + display: inline; + font-size: 12pt; + font-weight: 500; + line-height: 22px; + padding: 0; +} + +a.menuItem { + display: block; + width: 100%; + height: 26px; + line-height: 26px; + padding: 2px 8px; + font-size: 12pt; + font-weight: 500; + z-index: 1000; +} + + a.menuItem:hover { + background-color: #ff9e28; + } + + a.menuItem[disabled=true] { + color: #888; + } + +a.tabButton { + font-size: 10pt; + text-decoration: none; + text-align: center; + display: inline-block; + vertical-align: top; + width: 179px; + height: 27px; + line-height: 27px; + background-image: Url(Img/TabYellow.png); + background-repeat: no-repeat; + background-position: 0 0; + color: Black; + font-weight: 400; +} + +a.tabButtonSelected { + font-size: 10pt; + text-decoration: none; + text-align: center; + display: inline-block; + vertical-align: top; + width: 179px; + height: 27px; + line-height: 27px; + background-image: Url(Img/TabYellow.png); + background-repeat: no-repeat; + background-position: 0 -27px; + color: Black; + font-weight: 700; +} + +.titleBar { + background-color: #4682b4; + height: 40px; + margin: 0; + padding: 0 8px; + vertical-align: middle; +} + +.systemTitle { + font-size: 16pt; + font-weight: 700; +} + +.pageTitle { + font-size: 14pt; + color: #4682b4; + font-weight: 900; + line-height: 1.2em; + display: block; +} + +.textDisplay { + font-size: 10pt; + background-color: #D0D0D0; + width: 100%; + border-color: gray; + border-style: solid; + border-width: 1px; +} + +.controlLabel { + font-size: 10pt; + text-decoration: none; +} + +.errorLabel { + font-size: 10pt; + color: Red; +} + +.hintLabel { + font-weight: 700; + color: #000; + display: none; + padding: 2px; +} + +:disabled { + pointer-events: none; + cursor: not-allowed; +} + +input[type="button"], +input[type="submit"], +input[type="reset"], +button { + padding: 4px 8px; + font-size: 10pt; + border: solid 1px #CCC; + border-radius: 3px; + cursor: pointer; +} + input[type="button"]:hover, + input[type="submit"]:hover, + input[type="reset"]:hover, + button:hover { + border: solid 1px #CCC; + background-color: #CCC; + color: #000; + } + +.dataDisplayCell, .dataDisplayCell1 { + background-color: #E0E0E0; + line-height: 20px; + min-height: 25px; + padding: 3px 6px; + box-sizing: border-box; + background-clip: padding-box; + border: solid 1px #FFF; + border-radius: 3px; +} + +.dataEditCell { + background-color: #FFFFFF; + line-height: 20px; + min-height: 25px; + padding: 3px 0; + box-sizing: border-box; + background-clip: padding-box; + border: solid 1px #FFF; + border-radius: 3px; +} + +.tableRow { + line-height: 25px; + min-height: 25px; +} + +.gridLine { + background-color: #EFF3FB; + border-collapse: collapse; + border-color: #ddd; + border-style: solid; + border-width: 1px; + padding: 4px; +} + +.gridAlternativeLine { + background-color: #FFF; + border-collapse: collapse; + border-color: #ddd; + border-style: solid; + border-width: 1px; + padding: 4px; +} + +.gridSelectedLine { + font-weight: bold; + color: #333333; + background-color: #D1DDF1; +} + +.gridEditingLine { + background-color: #2461BF; + color: White; +} + +.gridPager { + font-weight: bold; + background-color: #4682b4; + color: White; + text-align: left; +} + +.Pickup { + position: absolute; + left: 0; + top: 0; +} + +.PickupCloseButton { + font-size: 10pt; + color: Black; +} + +.hide { + display: none; +} + +.fixtable { + table-layout: fixed; +} + +.pageText { + font-size: 10pt; + color: White; +} + +.gridLine1 { + border-collapse: collapse; + table-layout: fixed; + border-color: #ddd; + border-style: solid; + border-width: 1px; +} + +.gridLine2 { + border-collapse: collapse; + table-layout: fixed; + border-color: #ddd; + border-style: none; + border-width: 0; + border-top: solid 1px #000; + border-bottom: solid 1px #000; +} + + .gridLine2 tr { + width: 100%; + border-style: none; + border-width: 0; + } + +.inputPad { + display: inline-block; + background-color: White; + border: none; + margin: 0; + padding: 5px 5px 10px; +} + +.phraselink { + padding-right: 10px; +} + +A.grid:active, A.grid:hover { + color: Red; + text-decoration: none; +} + +A.grid:link, A.grid:visited { + color: Blue; + text-decoration: none; +} + +.textInput, .nonTextInput { + font-size: 10pt; + width: 100%; + box-sizing: border-box; +} + +.dataEditCell1, .gridAlternativeLine { + background-color: #FFFFFF; +} + +.gridHeader, .gridFooter { + background-color: #4682b4; + color: White; + font-weight: bold; +} + +input[type="text"], +input[type="number"], +input[type="password"], +input[type="date"], +input[type="datetime"], +input[type="email"], +textarea, +select { + padding: 4px; + border: solid 1px #ccc; + border-radius: 2px; +} + + input[type="text"]:focus, + input[type="number"]:focus, + input[type="password"]:focus, + input[type="date"]:focus, + input[type="datetime"]:focus, + input[type="email"]:focus, + textarea:focus, + select:focus { + outline: none; + background-color: #fff5bc; + border-color: #ffac00; + box-shadow: 0 0 3px #efcc00; + -moz-box-shadow: 0 0 3px #efcc00; + -webkit-box-shadow: 0 0 3px #efcc00; + } + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-top { + vertical-align: top; +} + +.validation-summary { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + min-width: 400px; + color: Red; + font-weight: bold; + z-index: 9999; + background: #fed5d5; + padding: 12px 40px; + border: solid 2px red; + border-radius: 8px; + text-align: center; + line-height: 1.5em; + font-size: 1.2em; +} + +.validation-summary-close { + width: 24px; + height: 24px; + line-height: 26px; + border-radius: 12px; + text-align: center; + position: absolute; + right: 9px; + top: 9px; + cursor: pointer; + background: red; + color: white; +} \ No newline at end of file diff --git a/Web/App_Themes/DefaultTheme2/Img/TabBase.png b/Web/App_Themes/DefaultTheme2/Img/TabBase.png new file mode 100644 index 0000000..ba81755 Binary files /dev/null and b/Web/App_Themes/DefaultTheme2/Img/TabBase.png differ diff --git a/Web/App_Themes/DefaultTheme2/Img/TabGreen.png b/Web/App_Themes/DefaultTheme2/Img/TabGreen.png new file mode 100644 index 0000000..dfa9692 Binary files /dev/null and b/Web/App_Themes/DefaultTheme2/Img/TabGreen.png differ diff --git a/Web/App_Themes/DefaultTheme2/Img/TabNavy.png b/Web/App_Themes/DefaultTheme2/Img/TabNavy.png new file mode 100644 index 0000000..5d6cf7a Binary files /dev/null and b/Web/App_Themes/DefaultTheme2/Img/TabNavy.png differ diff --git a/Web/App_Themes/DefaultTheme2/Img/TabYellow.png b/Web/App_Themes/DefaultTheme2/Img/TabYellow.png new file mode 100644 index 0000000..9376c97 Binary files /dev/null and b/Web/App_Themes/DefaultTheme2/Img/TabYellow.png differ diff --git a/Web/App_Themes/DefaultTheme2/Skin.skin b/Web/App_Themes/DefaultTheme2/Skin.skin new file mode 100644 index 0000000..52c7800 --- /dev/null +++ b/Web/App_Themes/DefaultTheme2/Skin.skin @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Web/App_Themes/DefaultTheme2/Style.css b/Web/App_Themes/DefaultTheme2/Style.css new file mode 100644 index 0000000..5f8bc84 --- /dev/null +++ b/Web/App_Themes/DefaultTheme2/Style.css @@ -0,0 +1,390 @@ +body, div { + padding: 0; + margin: 0; +} + +body, div, table, th, td, span, a, button { + font-family: Arial,'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; + font-size: 10pt; +} + +input, select, a { + box-sizing: border-box; +} + input[disabled="disabled"], button[disabled="disabled"], select[disabled="disabled"] { + color: #666 !important; + background-color: #E0E0E0; + } + +h1 { + font-size: 24pt; + color: White; +} + +table { + font-size: 10pt; + text-decoration: none; + border-collapse: collapse; +} + +th { + background-color: #4682b4; + color: White; + height: 24px; +} + + th.breakall, td.breakall { + word-break: break-all; + } + +.menu { + display: inline; + font-size: 12pt; + font-weight: 500; + line-height: 22px; + padding: 0; +} + +a.menuItem { + display: block; + width: 100%; + height: 26px; + line-height: 26px; + padding: 2px 8px; + font-size: 12pt; + font-weight: 500; + z-index: 1000; +} + + a.menuItem:hover { + background-color: #ff9e28; + } + + a.menuItem[disabled=true] { + color: #888; + } + +a.tabButton { + font-size: 10pt; + text-decoration: none; + text-align: center; + display: inline-block; + vertical-align: top; + width: 179px; + height: 27px; + line-height: 27px; + background-image: Url(Img/TabYellow.png); + background-repeat: no-repeat; + background-position: 0 0; + color: Black; + font-weight: 400; +} + +a.tabButtonSelected { + font-size: 10pt; + text-decoration: none; + text-align: center; + display: inline-block; + vertical-align: top; + width: 179px; + height: 27px; + line-height: 27px; + background-image: Url(Img/TabYellow.png); + background-repeat: no-repeat; + background-position: 0 -27px; + color: Black; + font-weight: 700; +} + +.titleBar { + background-color: #4682b4; + height: 40px; + margin: 0; + padding: 0 8px; + vertical-align: middle; +} + +.systemTitle { + font-size: 16pt; + font-weight: 700; +} + +.pageTitle { + font-size: 14pt; + color: #4682b4; + font-weight: 900; + line-height: 1.2em; + display: block; +} + +.textDisplay { + font-size: 10pt; + background-color: #D0D0D0; + width: 100%; + border-color: gray; + border-style: solid; + border-width: 1px; +} + +.controlLabel { + font-size: 10pt; + text-decoration: none; +} + +.errorLabel { + font-size: 10pt; + color: Red; +} + +.hintLabel { + font-weight: 700; + color: #000; + display: none; + padding: 2px; +} + +:disabled { + pointer-events: none; + cursor: not-allowed; +} + +input[type="button"], +input[type="submit"], +input[type="reset"], +button { + padding: 4px 8px; + font-size: 10pt; + border: solid 1px #CCC; + border-radius: 3px; + cursor: pointer; +} + input[type="button"]:hover, + input[type="submit"]:hover, + input[type="reset"]:hover, + button:hover { + border: solid 1px #CCC; + background-color: #CCC; + color: #000; + } + +.dataDisplayCell, .dataDisplayCell1 { + background-color: #E0E0E0; + line-height: 20px; + min-height: 25px; + padding: 3px 6px; + box-sizing: border-box; + background-clip: padding-box; + border: solid 1px #FFF; + border-radius: 3px; +} + +.dataEditCell { + background-color: #FFFFFF; + line-height: 20px; + min-height: 25px; + padding: 3px 0; + box-sizing: border-box; + background-clip: padding-box; + border: solid 1px #FFF; + border-radius: 3px; +} + +.tableRow { + line-height: 25px; + min-height: 25px; +} + +.gridLine { + background-color: #EFF3FB; + border-collapse: collapse; + border-color: #ddd; + border-style: solid; + border-width: 1px; + padding: 4px; +} + +.gridAlternativeLine { + background-color: #FFF; + border-collapse: collapse; + border-color: #ddd; + border-style: solid; + border-width: 1px; + padding: 4px; +} + +.gridSelectedLine { + font-weight: bold; + color: #333333; + background-color: #D1DDF1; +} + +.gridEditingLine { + background-color: #2461BF; + color: White; +} + +.gridPager { + font-weight: bold; + background-color: #4682b4; + color: White; + text-align: left; +} + +.Pickup { + position: absolute; + left: 0; + top: 0; +} + +.PickupCloseButton { + font-size: 10pt; + color: Black; +} + +.hide { + display: none; +} + +.fixtable { + table-layout: fixed; +} + +.pageText { + font-size: 10pt; + color: White; +} + +.gridLine1 { + border-collapse: collapse; + table-layout: fixed; + border-color: #ddd; + border-style: solid; + border-width: 1px; +} + +.gridLine2 { + border-collapse: collapse; + table-layout: fixed; + border-color: #ddd; + border-style: none; + border-width: 0; + border-top: solid 1px #000; + border-bottom: solid 1px #000; +} + + .gridLine2 tr { + width: 100%; + border-style: none; + border-width: 0; + } + +.inputPad { + display: inline-block; + background-color: White; + border: none; + margin: 0; + padding: 5px 5px 10px; +} + +.phraselink { + padding-right: 10px; +} + +A.grid:active, A.grid:hover { + color: Red; + text-decoration: none; +} + +A.grid:link, A.grid:visited { + color: Blue; + text-decoration: none; +} + +.textInput, .nonTextInput { + font-size: 10pt; + width: 100%; + box-sizing: border-box; +} + +.dataEditCell1, .gridAlternativeLine { + background-color: #FFFFFF; +} + +.gridHeader, .gridFooter { + background-color: #4682b4; + color: White; + font-weight: bold; +} + +input[type="text"], +input[type="number"], +input[type="password"], +input[type="date"], +input[type="datetime"], +input[type="email"], +textarea, +select { + padding: 4px; + border: solid 1px #ccc; + border-radius: 2px; +} + + input[type="text"]:focus, + input[type="number"]:focus, + input[type="password"]:focus, + input[type="date"]:focus, + input[type="datetime"]:focus, + input[type="email"]:focus, + textarea:focus, + select:focus { + outline: none; + background-color: #fff5bc; + border-color: #ffac00; + box-shadow: 0 0 3px #efcc00; + -moz-box-shadow: 0 0 3px #efcc00; + -webkit-box-shadow: 0 0 3px #efcc00; + } + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-top { + vertical-align: top; +} + +.validation-summary { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + min-width: 400px; + color: Red; + font-weight: bold; + z-index: 9999; + background: #fed5d5; + padding: 12px 40px; + border: solid 2px red; + border-radius: 8px; + text-align: center; + line-height: 1.5em; + font-size: 1.2em; +} + +.validation-summary-close { + width: 24px; + height: 24px; + line-height: 26px; + border-radius: 12px; + text-align: center; + position: absolute; + right: 9px; + top: 9px; + cursor: pointer; + background: red; + color: white; +} \ No newline at end of file diff --git a/Web/App_Themes/Green/Skin.skin b/Web/App_Themes/Green/Skin.skin new file mode 100644 index 0000000..00e2069 --- /dev/null +++ b/Web/App_Themes/Green/Skin.skin @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Web/App_Themes/Green/Style.css b/Web/App_Themes/Green/Style.css new file mode 100644 index 0000000..c8f0a23 --- /dev/null +++ b/Web/App_Themes/Green/Style.css @@ -0,0 +1,236 @@ +/* 定義頁面基本字形(不含表格) */ +BODY +{ + font-family: "Arial"; + font-size: 10pt; +} + +H1 +{ + font-family: "Arial"; + font-size: 24pt; + color: White; +} + +/* 定義表格基本字形 */ +TABLE +{ + font-family: "Arial"; + font-size: 10pt; + text-decoration: none; +} + +A.grid:active +{ + color: Red; + text-decoration: none; +} + +A.grid:link +{ + color: Blue; + text-decoration: none; +} + +A.grid:visited +{ + color: Blue; + text-decoration: none; +} + +A.grid:hover +{ + color: Red; + text-decoration: none; +} + +/* 定義功能表字型 */ +.menuItem +{ + font-family: "Arial"; + font-size: 12pt; + font-weight:bold; +} + +/* 定義系統抬頭列 */ +.titleBar +{ + background-color: #43B277; + padding: 5px; +} + +/* 定義系統名稱字型 */ +.systemTitle +{ + font-family: "Arial"; + font-size: 16pt; + font-weight: bold; +} + +/* 定義頁面標題字形 */ +.pageTitle +{ + font-family: "Arial"; + font-size: 14pt; + color: #268E45; + font-weight: bold; + line-height: 100%; + display:block; +} + +/* 定義文字輸入用control樣式(滿格) */ +.textInput +{ + font-family: "Arial"; + font-size: 10pt; + width: 100%; +} + +/* 定義文字顯示用control樣式(滿格) */ +.textDisplay +{ + font-family: "Arial"; + font-size: 10pt; + border-style: solid; + border-width: 1px; + border-color: #D0D0D0; + background-color: #D0D0D0; + width: 100%; +} + +/* 定義文字輸入用control樣式(不滿格,需另外設定 column 屬性) */ +.textInput1 +{ + font-family: "Arial"; + font-size: 10pt; +} + +/* 定義非文字輸入用control樣式 */ +.nonTextInput +{ + font-family: "Arial"; + font-size: 10pt; + width: 100%; +} + +/* 定義輸入control左方之label樣式 */ +.controlLabel +{ + font-family: "Arial"; + font-size: 10pt; + text-decoration: none; +} + +/* 定義顯示錯誤訊息用之label樣式 */ +.errorLabel +{ + font-family: "Arial"; + font-size: 10pt; + color: Red; +} + +/* 首頁提示文字的樣式 */ +.hintLabel +{ + font-weight:bold; + color: Green; + display: none; + padding-right: 2px; + padding-left: 2px; + padding-bottom: 2px; + padding-top: 2px; +} + +/* 定義按鈕樣式 1 (定寬)*/ +.button +{ + font-family: "Arial"; + font-size: 10pt; + width: 75px; + height: 23px; +} + +/* 定義按鈕樣式 2 (不定寬)*/ +.button1 +{ + font-family: "Arial"; + font-size: 10pt; + height: 23px; +} + +/* 定義資料顯示用儲存格樣式 */ +.dataDisplayCell +{ + background-color: #CEEFD7; + height: 25px; +} + +.dataDisplayCell1 +{ + background-color: #CEEFD7; +} + +.dataEditCell +{ + background-color: #FFFFFF; + height: 25px; +} + +.dataEditCell1 +{ + background-color: #FFFFFF; +} + +/* 定義 control 排列用 table 列高 */ +.tableRow +{ + height: 25px; +} + +.Pickup +{ + position: absolute; + left: 0; + top: 0; +} + +.PickupList +{ + font-family: "Arial"; + font-size: 10pt; +} + +.PickupCloseButton +{ + font-family: Arial; + font-size: 10pt; + color: Black; +} + +.hide +{ + display: none; +} + +.fixtable +{ + table-layout:fixed; +} + +.pageText +{ + font-family: Arial; + font-size: 10pt; + color: White; +} + +.pageButton +{ + font-family: Arial; + font-size: 10pt; +} + +.gridViewMouseOver +{ + background-color: #43B277; +} \ No newline at end of file diff --git a/Web/App_Themes/Pink/Skin.skin b/Web/App_Themes/Pink/Skin.skin new file mode 100644 index 0000000..855c833 --- /dev/null +++ b/Web/App_Themes/Pink/Skin.skin @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Web/App_Themes/Pink/Style.css b/Web/App_Themes/Pink/Style.css new file mode 100644 index 0000000..e215ac6 --- /dev/null +++ b/Web/App_Themes/Pink/Style.css @@ -0,0 +1,231 @@ +/* 定義頁面基本字形(不含表格) */ +BODY +{ + font-family: "Arial"; + font-size: 10pt; +} + +H1 +{ + font-family: "Arial"; + font-size: 24pt; + color: White; +} + +/* 定義表格基本字形 */ +TABLE +{ + font-family: "Arial"; + font-size: 10pt; + text-decoration: none; +} + +A.grid:active +{ + color: Red; + text-decoration: none; +} + +A.grid:link +{ + color: Blue; + text-decoration: none; +} + +A.grid:visited +{ + color: Blue; + text-decoration: none; +} + +A.grid:hover +{ + color: Red; + text-decoration: none; +} + +/* 定義功能表字型 */ +.menuItem +{ + font-family: "Arial"; + font-size: 12pt; + font-weight:bold; +} + +/* 定義系統抬頭列 */ +.titleBar +{ + background-color: #AF41AF; + padding: 5px; +} + +/* 定義系統名稱字型 */ +.systemTitle +{ + font-family: "Arial"; + font-size: 16pt; + font-weight: bold; +} + +/* 定義頁面標題字形 */ +.pageTitle +{ + font-family: "Arial"; + font-size: 14pt; + color: #8C248C; + font-weight: bold; + line-height: 100%; + display:block; +} + +/* 定義文字輸入用control樣式(滿格) */ +.textInput +{ + font-family: "Arial"; + font-size: 10pt; + width: 100%; +} + +/* 定義文字顯示用control樣式(滿格) */ +.textDisplay +{ + font-family: "Arial"; + font-size: 10pt; + border-style: solid; + border-width: 1px; + border-color: #D0D0D0; + background-color: #D0D0D0; + width: 100%; +} + +/* 定義文字輸入用control樣式(不滿格,需另外設定 column 屬性) */ +.textInput1 +{ + font-family: "Arial"; + font-size: 10pt; +} + +/* 定義非文字輸入用control樣式 */ +.nonTextInput +{ + font-family: "Arial"; + font-size: 10pt; + width: 100%; +} + +/* 定義輸入control左方之label樣式 */ +.controlLabel +{ + font-family: "Arial"; + font-size: 10pt; + text-decoration: none; +} + +/* 定義顯示錯誤訊息用之label樣式 */ +.errorLabel +{ + font-family: "Arial"; + font-size: 10pt; + color: Red; +} + +/* 首頁提示文字的樣式 */ +.hintLabel +{ + font-weight:bold; + color: #8C248C; + display: none; + padding-right: 2px; + padding-left: 2px; + padding-bottom: 2px; + padding-top: 2px; +} + +/* 定義按鈕樣式 1 (定寬)*/ +.button +{ + font-family: "Arial"; + font-size: 10pt; + width: 75px; + height: 23px; +} + +/* 定義按鈕樣式 2 (不定寬)*/ +.button1 +{ + font-family: "Arial"; + font-size: 10pt; + height: 23px; +} + +/* 定義資料顯示用儲存格樣式 */ +.dataDisplayCell +{ + background-color: #EDCBED; + height: 25px; +} + +.dataDisplayCell1 +{ + background-color: #EDCBED; +} + +.dataEditCell +{ + background-color: #FFFFFF; + height: 25px; +} + +.dataEditCell1 +{ + background-color: #FFFFFF; +} + +/* 定義 control 排列用 table 列高 */ +.tableRow +{ + height: 25px; +} + +.Pickup +{ + position: absolute; + left: 0; + top: 0; +} + +.PickupList +{ + font-family: "Arial"; + font-size: 10pt; +} + +.PickupCloseButton +{ + font-family: Arial; + font-size: 10pt; + color: Black; +} + +.hide +{ + display: none; +} + +.fixtable +{ + table-layout:fixed; +} + +.pageText +{ + font-family: Arial; + font-size: 10pt; + color: White; +} + +.pageButton +{ + font-family: Arial; + font-size: 10pt; +} \ No newline at end of file diff --git a/Web/CRAX/CRAXFileTransfer.asmx b/Web/CRAX/CRAXFileTransfer.asmx new file mode 100644 index 0000000..aec322e --- /dev/null +++ b/Web/CRAX/CRAXFileTransfer.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="CRAXFileTransfer.cs" Class="CRAXFileTransfer" %> diff --git a/Web/CRAX/Web.Config b/Web/CRAX/Web.Config new file mode 100644 index 0000000..1854852 --- /dev/null +++ b/Web/CRAX/Web.Config @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/Default.aspx b/Web/Default.aspx new file mode 100644 index 0000000..7cee354 --- /dev/null +++ b/Web/Default.aspx @@ -0,0 +1,208 @@ + + +<%@ Page AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" + Language="C#" EnableViewStateMac="true" Theme="DefaultTheme" + StylesheetTheme="DefaultTheme" + MaintainScrollPositionOnPostback="true" +%> + +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> + + + + <%-- + + + + + --%> + + + + + + <%=lbSystemCaption.Text%> + + + + + + <%-- + + --%> + + + + + + + + + + + +
+
+
+ + + + + +
+ 系統名稱 + + 歡迎 + + +    + LOGOUT +
+
+ +
+
+ + 功能建構中... +
+
+
+ + + +
+ +
+
+ + + + + diff --git a/Web/Default.aspx.cs b/Web/Default.aspx.cs new file mode 100644 index 0000000..14f2cb2 --- /dev/null +++ b/Web/Default.aspx.cs @@ -0,0 +1,468 @@ +using System; +using System.Data; +using System.Configuration; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Collections; +using Wellan.Web.UI; +using Wellan.Web.View; +using Wellan.Common; +using System.Text; +using Wellan.Service; +using System.Net.Mail; + +public partial class _Default : System.Web.UI.Page +{ + protected string FuserLang = ""; + private string CurrPage = ""; + private string FReportDataPath = ""; + private string CurrPageKey = "__CURRPAGE__"; + private string ParamListKey = "__PARAMLIST__"; + + + /// + /// 頁面的初始化之前事件 + /// + protected void Page_PreInit(object sender, EventArgs e) + { + // 設定頁面主題 + //Page.Theme = "DefaultTheme"; + lbSystemCaption.Text = WConfig.GetCompanyName() + " " + WConfig.GetSystemName(); + + if (Request.ServerVariables["http_user_agent"].IndexOf("Safari", StringComparison.CurrentCultureIgnoreCase) != -1) + Page.ClientTarget = "uplevel"; + //if (Request.UserAgent.Contains("AppleWebKit")) + // Request.Browser.Adapters.Clear(); + } + + /* + public override string StyleSheetTheme + { + get + { + return "DefaultTheme"; + } + set + { + base.StyleSheetTheme = value; + } + } + */ + + protected void Page_Init(object sender, EventArgs e) + { + ScriptManager.RegisterClientScriptInclude(Page, Page.GetType(), "vue", + ConfigurationManager.AppSettings["DEBUG"].ToUpper() == "Y" ? "utility/vue_dev.js" : "utility/vue.js"); + /* + Hashtable ParamList; + if (Session[ParamListKey] != null) + ParamList = Session[ParamListKey] as Hashtable; + else + ParamList = new Hashtable(); + + // 需要直接載入某功能 + if (!IsPostBack && Request[WConstants.LoadForm] != null) + { + CurrPage = Request[WConstants.LoadForm].ToString(); + // 取出 Request 的各參數,放入準備傳入 user control 的參數列表中 + foreach (string key in Request.QueryString.AllKeys) + { + ParamList.Add(key, Request[key]); + } + Session.Remove(CurrPageKey); + } + // 載入目前選到的功能 + else if (Session[CurrPageKey] != null) + { + CurrPage = Session[CurrPageKey].ToString(); + // 移除目前頁的 Session 儲存,以免被誤用 + Session.Remove(CurrPageKey); + } + ParamList[WConstants.ReportDataPath] = FReportDataPath; + LoadForm(ParamList); + */ + } + + /* + /// + /// 樣式表主題 + /// + public override string StyleSheetTheme + { + get + { + return "Default"; + } + set + { + base.StyleSheetTheme = value; + } + } + */ + + protected void Page_Load(object sender, EventArgs e) + { + // 若 session 已消失,則登出 + if (Session[WConstants.UserId] == null) + { + btnLogout_Click(sender, e); + return; + } + + // 擷取瀏覽器語言設定 + GetBrowserLanguage(); + + // 取得報表實體目錄 + FReportDataPath = Server.MapPath(@"~\reportData\"); + + // 建立主功能表 + WMenuGenerator menuGen = new WMenuGenerator(); + menuGen.menu = MainMenu; + menuGen.UserLang = FuserLang; + menuGen.UserId = Session[WConstants.UserId].ToString(); + menuGen.MenuConfigFile = WConfig.GetMenuConfig(); + menuGen.GenerateMenu(WConfig.GetMenuTree()); + + // 取出之前儲存的 ParamList + Hashtable ParamList; + if (Session[ParamListKey] != null) + ParamList = Session[ParamListKey] as Hashtable; + else + ParamList = new Hashtable(); + + // 需要直接載入某功能 + if (!IsPostBack && Request[WConstants.LoadForm] != null) + { + CurrPage = Request[WConstants.LoadForm].ToString(); + // 取出 Request 的各參數,放入準備傳入 user control 的參數列表中 + foreach (string key in Request.QueryString.AllKeys) + { + if (!ParamList.ContainsKey(key)) + ParamList.Add(key, Request[key]); + else + ParamList[key] = Request[key]; + } + Session.Remove(CurrPageKey); + } + // 載入目前選到的功能 + else if (Session[CurrPageKey] != null) + { + CurrPage = Session[CurrPageKey].ToString(); + // 移除目前頁的 Session 儲存,以免被誤用 + Session.Remove(CurrPageKey); + } + ParamList[WConstants.ReportDataPath] = FReportDataPath; + + LoadForm(ParamList); + + // 顯示使用者名稱 + lbCUSRNAME.Text = Session[WConstants.UserName] != null ? Session[WConstants.UserName].ToString() : ""; + //lbCCUSTNAME.Text = Session[WConstants.CustName] != null ? Session[WConstants.CustName].ToString() : ""; + + // 如果沒有密碼,顯示無密碼提示訊息 + if (Session["NOPASSWORD"] != null && Session["NOPASSWORD"].ToString() == "TRUE") + lbNOPassword.Style[HtmlTextWriterStyle.Display] = "inline"; + else + lbNOPassword.Style[HtmlTextWriterStyle.Display] = "none"; + + /* + * 移至 Global.asax + * + // 啟動檔案定時清除 + // 要停止檔案定時清除,必須停止網站應用程式,或是設定 Enabled = false + WDeleteFileService dfs = WDeleteFileService.GetInstance(); + if (!dfs.Enabled) + { + dfs.DeletePatterns.Clear(); + dfs.DeletePatterns.Add(FReportDataPath + "*.mdb"); + dfs.DeletePatterns.Add(FReportDataPath + "*.rpp"); + dfs.Interval = 600; // 每幾秒清除一次檔案 + dfs.FileAgeToDelete = 600; // 要清除最後寫入時間是幾秒之前的檔案 + dfs.Enabled = true; + } + + // 啟動郵件傳送服務 + // 郵件伺服器相關設定,在 Web.Config 中的 System.Net 節 + WMailSender mailSender = WMailSender.GetInstance(); + if (!mailSender.Enabled) + { + mailSender.Interval = 10; + mailSender.Enabled = true; + } + */ + + // 輸出 CR Viewer 標籤 + ltCRX.Text = CRAX.CRAXHelper.GetCRAXViewerDeclaration(Context); + + //Page.ClientScript.RegisterStartupScript(Page.GetType(), + // "FixMenu", + // // "if (typeof(FixMenu) !== \"undefined\") { FixMenu(document.getElementById(\"" + MainMenu.ClientID + "\")); }", true); + // "FixMenu(document.getElementById(\"" + MainMenu.ClientID + "\");", true); + } + + /// + /// 將瀏覽器語言設定與應用程式提供的語言設定作比對 + /// 選出最適合的語系設定 + /// + private void GetBrowserLanguage() + { + FuserLang = ""; + + // 取得應用程式提供之語言設定 + string[] MyLanguages = WConfig.GetLanguages(); + + if (Request != null && Request.UserLanguages != null) + { + foreach (string s1 in Request.UserLanguages) + { + foreach (string s2 in MyLanguages) + { + if (s1.ToLower().CompareTo(s2.ToLower()) == 0) + { + FuserLang = s1; + } + } + } + } + + // 如果找不到,則設定為繁體中文 + if (FuserLang == "") + FuserLang = "zh-tw"; + + //設定台灣日曆 + if (WConfig.GetCY11() == 1911) + { + System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("zh-TW"); + ci.DateTimeFormat.Calendar = new System.Globalization.TaiwanCalendar(); + System.Threading.Thread.CurrentThread.CurrentCulture = ci; + } + + // 將 Javascript 中使用的訊息變數及內容輸出至網頁 + StringBuilder sb = new StringBuilder(); + sb.Append(WConstants.JavaScriptStart); + sb.Append("\n\n"); + sb.Append(WConstants.JavaScriptEnd); + ClientScript.RegisterStartupScript(Page.GetType(), "__LANGJS__", sb.ToString()); + } + + /// + /// 載入功能 + /// + /// 要傳入的參數 + private void LoadForm(Hashtable ParamList) + { + WUserControlBase wctrl = null; + + if (CurrPage != "") + { + WWebFormController controller = WWebFormController.GetInstance(); + Control ctrl1 = null; + + try + { + ctrl1 = LoadControl(controller.FindWebPart(CurrPage)); + ctrl1.ID = CurrPage; + } + catch (Exception ex) + { + Session.Remove(CurrPageKey); + FormPlace.Controls.Clear(); + lbFuncNotExist.Visible = true; + lbFuncNotExist.Text = ex.Message; + return; + } + + /* 轉型 WUserControlbase,轉型不成功時,會回傳 null + * 當轉型成功後,作以下事情: + * 1. 傳入參數 + * 2. 設定使用者選擇的瀏覽器語言 + * 3. 執行 DoInit() 自訂方法 + * 4. 將主程式的 AfterCommand 事件處理器掛上去 + */ + try + { + wctrl = (WUserControlBase)ctrl1; + } + catch + { + wctrl = null; + } + + + /* 清除原來放在 PlaceHolder 中的控制項 + * 並將剛才載入的控制項放進去 + */ + try + { + FormPlace.Controls.Clear(); + + if (wctrl != null) + { + wctrl.FunctionName = CurrPage; + wctrl.ParamList = ParamList; + wctrl.userLang = FuserLang; + wctrl.MainMenuId = MainMenu.ClientID; + wctrl.AfterCommand += new Wellan.Web.UI.AfterCommandDelegate(AfterCommand); + } + + FormPlace.Controls.Add(ctrl1); + + lbFuncNotExist.Visible = false; + lbFuncNotExist.Text = ""; + } + catch (Exception ex) + { + FormPlace.Controls.Clear(); + + lbFuncNotExist.Visible = true; + lbFuncNotExist.Text = ex.Message; + } + + Session[CurrPageKey] = CurrPage; + Session[ParamListKey] = ParamList; + + // 從主功能表中找出 MenuItem + // 還有問題,先不用 + // lbSiteMap.Text = GetMenuItemPath(MainMenu.Items); + } + else + { + Session.Remove(CurrPageKey); + FormPlace.Controls.Clear(); + } + } + + private string GetMenuItemPath(MenuItemCollection Items) + { + string result = ""; + if (Items == null) + return result; + + foreach (MenuItem item in Items) + { + if (item.Value.Contains("webPart=" + CurrPage)) + { + result = item.Text; + return result; + } + result += GetMenuItemPath(item.ChildItems); + } + + return result; + } + + + + /// + /// 處理 WUserControlBase 的 AfterCommand 事件 + /// + /// 觸發此事件的 User Control + /// 觸發者自訂的命令識別字 + /// 下一個 web part 在 PageDefine 配置檔中的名稱 + /// 觸發此事件的 User Control 要傳給下一步的參數 + private void AfterCommand( + WUserControlBase Sender, + string CommandName, + ref Hashtable ParamList) + { + WWebFormController controller = WWebFormController.GetInstance(); + try + { + WWebFormForward forward = controller.FindForward(CurrPage, CommandName); + CurrPage = forward.DestinationName; + ParamList[WConstants.ForwardSource] = CurrPage; + ParamList[WConstants.ForwardCommand] = CommandName; + LoadForm(ParamList); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + throw; + } + } + + protected void MainMenu_MenuItemClick(object sender, MenuEventArgs e) + { + if (e.Item.Value != "") + { + if (e.Item.Value.StartsWith("webPart=")) + { + FormPlace.Controls.Clear(); + + // 取出 webpart 的名字 + string[] menuInfos = e.Item.Value.Split(','); + CurrPage = menuInfos[0].Substring(8); + + // 取出要帶進去的參數列 + Hashtable paramList = new Hashtable(); + paramList[WConstants.ForwardSource] = ""; + + if (menuInfos.Length > 1) + { + string[] menuItemParams = menuInfos[1].Split('|'); + for (int i = 0; i < menuItemParams.Length; i++) + { + if (!menuItemParams[i].StartsWith("parameters=")) + continue; + + string[] s1 = menuItemParams[i].Substring(11).Split('&'); + string aName = ""; + string aType = ""; + string aValue = ""; + for (int j = 0; j < s1.Length; j++) + { + if (s1[j].StartsWith("name:")) + aName = s1[j].Substring(5); + if (s1[j].StartsWith("type:")) + aType = s1[j].Substring(5); + if (s1[j].StartsWith("value:")) + aValue = s1[j].Substring(6); + } + if (aName != "" && aType != "" && aValue != "") + { + switch (aType) + { + case "string": + paramList.Add(aName, aValue); + break; + case "int": + paramList.Add(aName, Convert.ToInt32(aValue)); + break; + case "double": + paramList.Add(aName, Convert.ToDouble(aValue)); + break; + case "datetime": + paramList.Add(aName, Convert.ToDateTime(aValue)); + break; + } + } + } + } + + e.Item.Selected = false; + LoadForm(paramList); + } + } + } + + public string UserLang + { + get { return FuserLang; } + } + + protected void btnLogout_Click(object sender, EventArgs e) + { + Session.Remove(CurrPageKey); + + FormsAuthentication.SignOut(); + FormsAuthentication.RedirectToLoginPage(); + } +} diff --git a/Web/Global.asax b/Web/Global.asax new file mode 100644 index 0000000..4775788 --- /dev/null +++ b/Web/Global.asax @@ -0,0 +1,149 @@ +<%@ Application Language="C#" %> +<%@ Import Namespace="Wellan.Service" %> + + + diff --git a/Web/Template/代理人差假通知原差勤人.html b/Web/Template/代理人差假通知原差勤人.html new file mode 100644 index 0000000..d8a7113 --- /dev/null +++ b/Web/Template/代理人差假通知原差勤人.html @@ -0,0 +1,31 @@ + + + + + + +

代理人請假/差旅通知

+ 您好!您的{類別}單代理人{代理人}需請假/差旅
+ 若尚未簽核,請更換代理人;若已經簽核,請抽單重新申請。

+ + +
單號{單號}

+ (本郵件由系統自動發送,請勿直接回覆) + + \ No newline at end of file diff --git a/Web/Template/代理人差假通知督導.html b/Web/Template/代理人差假通知督導.html new file mode 100644 index 0000000..9b0ed58 --- /dev/null +++ b/Web/Template/代理人差假通知督導.html @@ -0,0 +1,32 @@ + + + + + + +

代理人請假/差旅通知

+ 您好!{差勤人}的{類別}單代理人{代理人}需請假/差旅
+ 請確認更換代理人事宜。

+ + + +
單號{單號}
代理人電話{代理人電話}

+ (本郵件由系統自動發送,請勿直接回覆) + + \ No newline at end of file diff --git a/Web/Template/代理人提醒.html b/Web/Template/代理人提醒.html new file mode 100644 index 0000000..fcb1e90 --- /dev/null +++ b/Web/Template/代理人提醒.html @@ -0,0 +1,35 @@ + + + + + + + +

{類別}代理人提醒

+ 您好!提醒您以下人員{類別}期間職務由您代理。

+ + + + + + +
單號{單號}
人員{差勤人}
事由{事由}
起始時間{起日} {起時}
結束時間{迄日} {迄時}

+ (本郵件由系統自動發送,請勿直接回覆) + + \ No newline at end of file diff --git a/Web/Template/代理人通知.html b/Web/Template/代理人通知.html new file mode 100644 index 0000000..5adf929 --- /dev/null +++ b/Web/Template/代理人通知.html @@ -0,0 +1,35 @@ + + + + + + + +

{類別}代理人通知

+ 您好!通知您以下人員{類別}期間職務由您代理。

+ + + + + + +
單號{單號}
人員{差勤人}
事由{事由}
起始時間{起日} {起時}
結束時間{迄日} {迄時}

+ (本郵件由系統自動發送,請勿直接回覆) + + \ No newline at end of file diff --git a/Web/Template/出勤異常督導通知.html b/Web/Template/出勤異常督導通知.html new file mode 100644 index 0000000..2d0c74e --- /dev/null +++ b/Web/Template/出勤異常督導通知.html @@ -0,0 +1,37 @@ + + + + + + + +

{年月} 打卡異常通知

+

您好!您督導的 [{專案編號}] {專案名稱} 專案有打卡異常如附件

+

(本郵件由系統自動發送,請勿直接回覆)

+ + \ No newline at end of file diff --git a/Web/Template/出勤異常通知.html b/Web/Template/出勤異常通知.html new file mode 100644 index 0000000..66b2270 --- /dev/null +++ b/Web/Template/出勤異常通知.html @@ -0,0 +1,37 @@ + + + + + + + +

打卡異常通知

+

您好!提醒您在 {日期} 有打卡異常的狀況:

+

{異常狀況}

+ (本郵件由系統自動發送,請勿直接回覆) + + \ No newline at end of file diff --git a/Web/Template/抽單通知.html b/Web/Template/抽單通知.html new file mode 100644 index 0000000..ba32ebb --- /dev/null +++ b/Web/Template/抽單通知.html @@ -0,0 +1,34 @@ + + + + + + +

{類別}單抽單通知

+ 您好!通知您以下人員{類別}單已由申請人抽單。

+ + + + + + +
單號{單號}
人員{差勤人}
事由{事由}
起始時間{起日} {起時}
結束時間{迄日} {迄時}

+ (本郵件由系統自動發送,請勿直接回覆) + + \ No newline at end of file diff --git a/Web/Template/簽核意見通知.html b/Web/Template/簽核意見通知.html new file mode 100644 index 0000000..55616a6 --- /dev/null +++ b/Web/Template/簽核意見通知.html @@ -0,0 +1,34 @@ + + + + + + + +

{類別}單簽核意見通知

+ 您好!通知您的{類別}單有簽核意見詳情如下:

+ + + + + +
單號{單號}
簽核人員{簽核人員}
簽核結果{簽核結果}
簽核意見{簽核意見}

+ (本郵件由系統自動發送,請勿直接回覆) + + \ No newline at end of file diff --git a/Web/UploadedPicture/RPAR_ATTACHMENT/2016120002.jpg b/Web/UploadedPicture/RPAR_ATTACHMENT/2016120002.jpg new file mode 100644 index 0000000..51d4d34 Binary files /dev/null and b/Web/UploadedPicture/RPAR_ATTACHMENT/2016120002.jpg differ diff --git a/Web/UploadedPicture/T_00001.jpg b/Web/UploadedPicture/T_00001.jpg new file mode 100644 index 0000000..11e6654 Binary files /dev/null and b/Web/UploadedPicture/T_00001.jpg differ diff --git a/Web/UploadedPicture/T_00002.jpg b/Web/UploadedPicture/T_00002.jpg new file mode 100644 index 0000000..b1fbfd8 Binary files /dev/null and b/Web/UploadedPicture/T_00002.jpg differ diff --git a/Web/UploadedPicture/T_00003.jpg b/Web/UploadedPicture/T_00003.jpg new file mode 100644 index 0000000..8cff22c Binary files /dev/null and b/Web/UploadedPicture/T_00003.jpg differ diff --git a/Web/UploadedPicture/T_01371.jpg b/Web/UploadedPicture/T_01371.jpg new file mode 100644 index 0000000..5d7acea Binary files /dev/null and b/Web/UploadedPicture/T_01371.jpg differ diff --git a/Web/UserLogin.aspx b/Web/UserLogin.aspx new file mode 100644 index 0000000..1119aea --- /dev/null +++ b/Web/UserLogin.aspx @@ -0,0 +1,114 @@ + + +<%@ Page Language="C#" AutoEventWireup="true" + CodeFile="UserLogin.aspx.cs" Inherits="UserLogin" EnableViewStateMac="false" %> + +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + <%=lbSystemCaption.Text%> + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + + +
+ + + +
+ +       +
+ +
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ + diff --git a/Web/UserLogin.aspx.cs b/Web/UserLogin.aspx.cs new file mode 100644 index 0000000..a46297c --- /dev/null +++ b/Web/UserLogin.aspx.cs @@ -0,0 +1,264 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using Wellan.Common; +using Wellan.Data; +using System.Data.Common; +using System.Text; +using System.Text.RegularExpressions; +using System.Net; +using System.IO; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Linq; + +public partial class UserLogin : System.Web.UI.Page +{ + protected string FuserLang = ""; + private string FTreeName = ""; + + protected void Page_Load(object sender, EventArgs e) + { + Session.Clear(); + + lbCompanyName.Text = WConfig.GetCompanyName(); + lbSystemCaption.Text = WConfig.GetSystemName(); + FTreeName = WConfig.GetMenuTree(); + + if (IsMobile()) + return; + + // 擷取瀏覽器語言設定 + GetBrowserLanguage(); + txtUserId.Focus(); + } + + protected void btnLogin_Click(object sender, EventArgs e) + { + if (IsMobile()) + return; + + bool loginOk = false; + string errMsg = ""; + string userName = ""; + bool noPassword = false; + + lbErrMsg.Visible = false; + lbErrMsg.Text = ""; + + if (txtUserId.Text.Length == 0) + { + lbErrMsg.Visible = true; + lbErrMsg.Text = "請輸入使用者代號"; + return; + } + + if (txtUserId.Text.ToUpper().Substring(0, 1) == "Z") + { + // 外部人員登入 + if (FTreeName == "TREE0") + { + lbErrMsg.Visible = true; + lbErrMsg.Text = "您沒有使用這個系統的權限"; + return; + } + + LoginBPAP login = new LoginBPAP(); + login.UserId = txtUserId.Text.ToUpper(); + login.Password = txtPassword.Text; + login.UserLang = FuserLang; + + loginOk = login.GetResult(); + errMsg = login.ErrorMessage; + userName = login.UserName; + noPassword = login.NoPassword; + } + else + { + // 內部人員登入 + LoginBPSN login = new LoginBPSN(); + login.UserId = txtUserId.Text.ToUpper(); + login.Password = txtPassword.Text; + login.UserLang = FuserLang; + + loginOk = login.GetResult(); + errMsg = login.ErrorMessage; + userName = login.UserName; + noPassword = login.NoPassword; + } + + if (loginOk) + { + Session[WConstants.UserId] = txtUserId.Text.ToUpper(); + Session[WConstants.UserName] = userName; + Session["NOPASSWORD"] = noPassword ? "TRUE" : "FALSE"; + new RlogDAC().InsertOne(txtUserId.Text.ToUpper(), "LOGIN", Request.UserHostAddress, "LOGIN 成功"); + FormsAuthentication.RedirectFromLoginPage(txtUserId.Text.ToUpper(), false); + } + else + { + lbErrMsg.Visible = true; + lbErrMsg.Text = errMsg; + new RlogDAC().InsertOne(txtUserId.Text.ToUpper(), "LOGIN", Request.UserHostAddress, "LOGIN 失敗: " + errMsg); + } + } + + /// + /// 將瀏覽器語言設定與應用程式提供的語言設定作比對 + /// 選出最適合的語系設定 + /// + private void GetBrowserLanguage() + { + FuserLang = ""; + + // 取得應用程式提供之語言設定 + string[] MyLanguages = WConfig.GetLanguages(); + + if (Request.UserLanguages != null) + { + foreach (string s1 in Request.UserLanguages) + { + foreach (string s2 in MyLanguages) + { + if (s1.ToLower().CompareTo(s2.ToLower()) == 0) + { + FuserLang = s1; + } + } + } + } + + // 如果找不到,則設定為繁體中文 + if (FuserLang == "") + FuserLang = "zh-tw"; + + // 將引用語言設定宣告的 Javascript 放入輸出網頁 + StringBuilder sb = new StringBuilder(); + sb.Append("var UserLangId=\"" + FuserLang + "\";\n"); + sb.Append(WStringTable.GetInstance().GetJSMessages(FuserLang)); + + ClientScript.RegisterStartupScript(Page.GetType(), "__LANGJS__", sb.ToString(), true); + } + + private bool IsMobile() + { + // 差勤網站不可使用手機上網 + if (FTreeName == "TREE1") + { + // 先用 user-agent 查是否為手機瀏覽器 + String u = Request.ServerVariables["HTTP_USER_AGENT"]; + Regex b = new Regex(@"android.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino", RegexOptions.IgnoreCase); + Regex v = new Regex(@"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase); + + if (b.IsMatch(u) || v.IsMatch((u + "0000").Substring(0, 4))) + { + Response.Clear(); + Response.Write("" + + "





" + + "!! 請勿使用手機上網進入差勤系統 !!

"); + Response.End(); + + return true; + } + + // 再用 IP 查是否為行動上網區段 + WConnectionString.ConnectionConfigFile = WConfig.GetConnectionConfig(); + string ConnName = WConfig.GetConnectionConfigName(); + string ConnType = WConnectionString.GetConnectionType(ConnName); + string ConnStr = WConnectionString.GetConnectionString(ConnName); + WQuery query = new WQuery(ConnType, ConnStr); + DataTable mobileIP = query.Select("SELECT BSSCR FROM BCLS WHERE BSPAR='MOBILEIP' AND BLOCK=1"); + DataTable mobileISP = query.Select("SELECT BSSCR FROM BCLS WHERE BSPAR='MOBILEISP' AND BLOCK=1"); + List mobileIPList = new List(); + List mobileISPList = new List(); + foreach (DataRow r in mobileIP.Rows) + { + mobileIPList.Add(WQuery.GetStringValue(r[0])); + } + foreach (DataRow r in mobileISP.Rows) + { + mobileISPList.Add(WQuery.GetStringValue(r[0])); + } + + string userISP = QueryIP.QueryISP(Request.UserHostAddress); + lbClientMsg.Text = string.Format("IP:{0} ISP:{1}", Request.UserHostAddress, userISP); + + // 阻擋已知的手機 IP 區段與 ISP 名稱 + bool ipMatch = !String.IsNullOrEmpty(mobileIPList.FirstOrDefault(p => Request.UserHostAddress.StartsWith(p))); + bool ispMatch = !String.IsNullOrEmpty(mobileISPList.FirstOrDefault(p => userISP == p)); + bool isMobile = ipMatch || ispMatch; + + new RlogDAC().InsertOne("", "QUERYIP", Request.UserHostAddress, userISP); + + if (isMobile) + { + Response.Clear(); + Response.Write("" + + "





" + + "!! 請勿使用 [手機上網] 或 [VPN] 進入差勤系統 !!

"); + Response.End(); + + return true; + } + } + return false; + } + + public string UserLang + { + get + { + return FuserLang; + } + } + + public class QueryIP + { + public static string QueryISP(string ipAddress) + { + try + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format("http://ip-api.com/json/{0}", ipAddress)); + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + Stream receiveStream = response.GetResponseStream(); + StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8); + string resultContent = readStream.ReadToEnd(); + response.Close(); + readStream.Close(); + + QueryIP queryResponse = (QueryIP)JsonConvert.DeserializeObject(resultContent, typeof(QueryIP)); + if (queryResponse.status == "success") + { + return queryResponse.isp; + } + return ""; + } + catch + { + return ""; + } + } + + public string status { get; set; } + public string country { get; set; } + public string countryCode { get; set; } + public string region { get; set; } + public string regionName { get; set; } + public string city { get; set; } + public string zip { get; set; } + public float lat { get; set; } + public float lon { get; set; } + public string timezone { get; set; } + public string isp { get; set; } + public string org { get; set; } + public string _as { get; set; } + public string query { get; set; } + } +} diff --git a/Web/Web.Config b/Web/Web.Config new file mode 100644 index 0000000..e51a3ba --- /dev/null +++ b/Web/Web.Config @@ -0,0 +1,259 @@ + + + + + + +
+ +
+
+
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web/config/ConnectionConfig.xml b/Web/config/ConnectionConfig.xml new file mode 100644 index 0000000..ffea80b --- /dev/null +++ b/Web/config/ConnectionConfig.xml @@ -0,0 +1,49 @@ + + + + + + + + \ No newline at end of file diff --git a/Web/config/ConnectionConfig.xsd b/Web/config/ConnectionConfig.xsd new file mode 100644 index 0000000..18c3d60 --- /dev/null +++ b/Web/config/ConnectionConfig.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web/config/ConnectionConfig.xsx b/Web/config/ConnectionConfig.xsx new file mode 100644 index 0000000..bc1a95e --- /dev/null +++ b/Web/config/ConnectionConfig.xsx @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Web/config/LookupConfig.xml b/Web/config/LookupConfig.xml new file mode 100644 index 0000000..627d4b2 --- /dev/null +++ b/Web/config/LookupConfig.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/config/LookupConfig.xsd b/Web/config/LookupConfig.xsd new file mode 100644 index 0000000..5a25f50 --- /dev/null +++ b/Web/config/LookupConfig.xsd @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web/config/LookupConfig.xsx b/Web/config/LookupConfig.xsx new file mode 100644 index 0000000..53cfc18 --- /dev/null +++ b/Web/config/LookupConfig.xsx @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Web/config/MenuConfig.xml b/Web/config/MenuConfig.xml new file mode 100644 index 0000000..b7ee500 --- /dev/null +++ b/Web/config/MenuConfig.xml @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/config/MenuConfig.xsd b/Web/config/MenuConfig.xsd new file mode 100644 index 0000000..438b7f7 --- /dev/null +++ b/Web/config/MenuConfig.xsd @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web/config/MenuConfig.xsx b/Web/config/MenuConfig.xsx new file mode 100644 index 0000000..f53151c --- /dev/null +++ b/Web/config/MenuConfig.xsx @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web/config/PageDefine.xml b/Web/config/PageDefine.xml new file mode 100644 index 0000000..07f891a --- /dev/null +++ b/Web/config/PageDefine.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web/config/PageDefine.xsd b/Web/config/PageDefine.xsd new file mode 100644 index 0000000..3ee4ec4 --- /dev/null +++ b/Web/config/PageDefine.xsd @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web/config/PageDefine.xsx b/Web/config/PageDefine.xsx new file mode 100644 index 0000000..8b3ac9e --- /dev/null +++ b/Web/config/PageDefine.xsx @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web/config/WNetStyle.css b/Web/config/WNetStyle.css new file mode 100644 index 0000000..aa5bbfb --- /dev/null +++ b/Web/config/WNetStyle.css @@ -0,0 +1,250 @@ +/* 定義頁面基本字形(不含表格) */ +BODY +{ + font-family: "Arial"; + font-size: 10pt; +} + +H1 +{ + font-family: "Arial"; + font-size: 24pt; + color: White; +} + +/* 定義表格基本字形 */ +TABLE +{ + font-family: "Arial"; + font-size: 10pt; + text-decoration: none; +} + +A.grid:active +{ + color: Red; + text-decoration: none; +} + +A.grid:link +{ + color: Blue; + text-decoration: none; +} + +A.grid:visited +{ + color: Blue; + text-decoration: none; +} + +A.grid:hover +{ + color: Red; + text-decoration: none; +} + +/* 定義功能表字型 */ +.menuItem +{ + font-family: "Arial"; + font-size: 12pt; + font-weight:bold; +} + +/* 定義系統名稱字型 */ +.systemTitle +{ + font-family: "Arial"; + font-size: 16pt; + font-weight: bold; +} + +/* 定義頁面標題字形 */ +.pageTitle +{ + font-family: "Arial"; + font-size: 14pt; + color: #4169E1; + font-weight: bold; + line-height: 100%; + display:block; +} + +/* 定義文字輸入用control樣式(滿格) */ +.textInput +{ + font-family: "Arial"; + font-size: 10pt; + width: 100%; +} + +/* 定義文字顯示用control樣式(滿格) */ +.textDisplay +{ + font-family: "Arial"; + font-size: 10pt; + border-style: solid; + border-width: 1px; + border-color: #D0D0D0; + background-color: #D0D0D0; + width: 100%; +} + +/* 定義文字輸入用control樣式(不滿格,需另外設定 column 屬性) */ +.textInput1 +{ + font-family: "Arial"; + font-size: 10pt; +} + +/* 定義非文字輸入用control樣式 */ +.nonTextInput +{ + font-family: "Arial"; + font-size: 10pt; + width: 100%; +} + +/* 定義輸入control左方之label樣式 */ +.controlLabel +{ + font-family: "Arial"; + font-size: 10pt; + text-decoration: none; +} + +/* 定義顯示錯誤訊息用之label樣式 */ +.errorLabel +{ + font-family: "Arial"; + font-size: 10pt; + color: Red; +} + +/* 定義按鈕樣式 1 (定寬)*/ +.button +{ + font-family: "Arial"; + font-size: 10pt; + width: 75px; + height: 23px; +} + +/* 定義按鈕樣式 2 (不定寬)*/ +.button1 +{ + font-family: "Arial"; + font-size: 10pt; + height: 23px; +} + +/* 定義資料顯示用儲存格樣式 */ +.dataDisplayCell +{ + background-color: #D1DDF1; + height: 25px; +} + +.dataDisplayCell1 +{ + background-color: #D1DDF1; +} + +.dataEditCell +{ + background-color: #FFFFFF; + height: 25px; +} + +.dataEditCell1 +{ + background-color: #FFFFFF; +} + +/* 定義 control 排列用 table 列高 */ +.tableRow +{ + height: 25px; +} + +/* 定義DataGrid表頭樣式 */ +.gridHeader +{ + background-color: #006699; + color: White; +} + +/* 定義DataGrid表身樣式 */ +.gridItem +{ +} + +/* 定義DataGrid表身(偶數行)樣式 */ +.gridAlternativeItem +{ + background-color: #ACD6FF; +} + +/* 定義DataGrid表身(當前選擇)樣式 */ +.gridSelectedItem +{ + background-color: #004F75; + color: White; +} + +/* 定義DataGrid分頁行樣式 */ +.gridPager +{ + font-weight: bold; +} + +/* 定義DataGrid表尾樣式 */ +.gridFooter +{ + background-color: #006699; + color: White; +} + +.Pickup +{ + position: absolute; + left: 0; + top: 0; +} + +.PickupList +{ + font-family: "Arial"; + font-size: 10pt; +} + +.PickupCloseButton +{ + font-family: Arial; + font-size: 10pt; + color: Black; +} + +.hide +{ + display: none; +} + +.fixtable +{ + table-layout:fixed; +} + +.pageText +{ + font-family: Arial; + font-size: 10pt; + color: White; +} + +.pageButton +{ + font-family: Arial; + font-size: 10pt; +} \ No newline at end of file diff --git a/Web/forms/basedata/fmBCLS.ascx b/Web/forms/basedata/fmBCLS.ascx new file mode 100644 index 0000000..3c1258d --- /dev/null +++ b/Web/forms/basedata/fmBCLS.ascx @@ -0,0 +1,38 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmBCLS.ascx.cs" Inherits="forms_basedata_fmBcls" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + +
+ 類別: + + 人員類別 + 最高學歷 + 畢肄業 + 兵役狀況 + 身份類別 + 補助比例 + 薪資領取方式 + +
+
+ + + + + + +
diff --git a/Web/forms/basedata/fmBCLS.ascx.cs b/Web/forms/basedata/fmBCLS.ascx.cs new file mode 100644 index 0000000..295c2d5 --- /dev/null +++ b/Web/forms/basedata/fmBCLS.ascx.cs @@ -0,0 +1,32 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; + +public partial class forms_basedata_fmBcls : Wellan.Web.UI.WUserControlBase +{ + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + } + + protected void Next_Click(object sender, EventArgs e) + { + ParamList["BSPAR"] = ddlBSPAR.SelectedValue; + DoAfterCommand("BSPAR"); + } +} diff --git a/Web/forms/basedata/fmBPAP.ascx b/Web/forms/basedata/fmBPAP.ascx new file mode 100644 index 0000000..67c6658 --- /dev/null +++ b/Web/forms/basedata/fmBPAP.ascx @@ -0,0 +1,168 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmBPAP.ascx.cs" + Inherits="forms_basedata_fmBPAP" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> +外部人員帳號設定 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + + + +   + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/forms/basedata/fmBPAP.ascx.cs b/Web/forms/basedata/fmBPAP.ascx.cs new file mode 100644 index 0000000..defa897 --- /dev/null +++ b/Web/forms/basedata/fmBPAP.ascx.cs @@ -0,0 +1,66 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections.Generic; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Text; + +/// +/// 外部人員帳號設定 +/// +public partial class forms_basedata_fmBPAP : Wellan.Web.UI.WUserControlBase +{ + private BpapDAC bpabDao; + + protected void Page_Load(object sender, EventArgs e) + { + //if (IsPostBack) + // GridView1.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + bpabDao = new BpapDAC(Query); + dsBPZON.ConnectionString = ConnectionString; + dsBPBRH.ConnectionString = ConnectionString; + dsBPZON.SelectCommand = GetListSql("BCLSEDIT", "BSPAR='BCUSZON'"); + dsBPBRH.SelectCommand = GetListSql("BCLSEDIT", "BSPAR='BPSNBRH' AND SUBSTRING(BSCLS, LEN(BSCLS) - 1, 2) = '00'"); + } + + protected void dsBPAP_ObjectCreating(object sender, ObjectDataSourceEventArgs e) + { + e.ObjectInstance = bpabDao; + } + + protected void btnInsert_Click(object sender, EventArgs e) + { + if (!Page.IsValid) + return; + + try + { + bpabDao.InsertOne(txtBPNME.Text, txtBPEML.Text, ddlBPZON.SelectedValue, ddlBPBRH.SelectedValue, UserId); + txtBPNME.Text = ""; + txtBPEML.Text = ""; + ddlBPZON.SelectedValue = ""; + ddlBPBRH.SelectedValue = ""; + GridView1.DataBind(); + } + catch (Exception ex) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = ex.Message; + } + } + + protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) + { + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } +} \ No newline at end of file diff --git a/Web/forms/basedata/fmBPSE.ascx b/Web/forms/basedata/fmBPSE.ascx new file mode 100644 index 0000000..e44d3b2 --- /dev/null +++ b/Web/forms/basedata/fmBPSE.ascx @@ -0,0 +1,105 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmBPSE.ascx.cs" Inherits="forms_basedata_fmBPSE" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> +片語設定 + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + +
+ + + + + +   + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/forms/basedata/fmBPSE.ascx.cs b/Web/forms/basedata/fmBPSE.ascx.cs new file mode 100644 index 0000000..2dbb2fd --- /dev/null +++ b/Web/forms/basedata/fmBPSE.ascx.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +public partial class forms_basedata_fmBPSE : Wellan.Web.UI.WUserControlBase +{ + private BpseDAC bpseDao; + + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + bpseDao = new BpseDAC(Query); + } + + protected void btnInsert_Click(object sender, EventArgs e) + { + if (!Page.IsValid) + return; + + try + { + bpseDao.InsertOne(txtBPTYP.Text, txtBPCNT.Text, UserId); + txtBPTYP.Text = ""; + txtBPCNT.Text = ""; + GridView1.DataBind(); + } + catch (Exception ex) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = ex.Message; + } + } + + protected void dsBPSE_ObjectCreating(object sender, ObjectDataSourceEventArgs e) + { + e.ObjectInstance = bpseDao; + } +} \ No newline at end of file diff --git a/Web/forms/basedata/fmBTME.ascx b/Web/forms/basedata/fmBTME.ascx new file mode 100644 index 0000000..410f53c --- /dev/null +++ b/Web/forms/basedata/fmBTME.ascx @@ -0,0 +1,308 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmBTME.ascx.cs" Inherits="forms_basedata_fmBTME" %> + +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> + +<%@ Register Src="../../utility/TimeInput.ascx" TagName="TimeInput" TagPrefix="uc1" %> + +班表設定 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 班表編號: + + 班表名稱: +
+ 上班時間: + + 下班時間: +
+ 午休開始時間: + + 午休結束時間: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 班表編號: + + + + 班表名稱: + + +
+ 上班時間: + + + + 下班時間: + + +
+ 午休開始時間: + + + + 午休結束時間: + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 班表編號: + + + + 班表名稱: + + +
+ 上班時間: + + + + 下班時間: + + +
+ 午休開始時間: + + + + 午休結束時間: + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 班表編號: + + + + 班表名稱: + + +
+ 上班時間: + + + + 下班時間: + + +
+ 午休開始時間: + + + + 午休結束時間: + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+<%= string.Format("提示:預設班表不需要設定
  • 上班時間:{0}
  • 下班時間:{1}
  • 午休開始:{2}
  • 午休結束:{3}
", + Wellan.Common.WGuard1.WSetR("UNRPARTIME", 1), + Wellan.Common.WGuard1.WSetR("UNRPARTIME", 2), + Wellan.Common.WGuard1.WSetR("UNRPARTIME", 3), + Wellan.Common.WGuard1.WSetR("UNRPARTIME", 4)) %> diff --git a/Web/forms/basedata/fmBTME.ascx.cs b/Web/forms/basedata/fmBTME.ascx.cs new file mode 100644 index 0000000..484a09c --- /dev/null +++ b/Web/forms/basedata/fmBTME.ascx.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using Wellan.Data; + +public partial class forms_basedata_fmBTME : Wellan.Web.UI.WUserControlBase +{ + protected void Page_Load(object sender, EventArgs e) + { + //if (IsPostBack) + // gvBTME.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + Form_View = fvBTME; + Grid_View = gvBTME; + CustomMessage = cvMessage; + } + + protected override bool CheckInput(IOrderedDictionary values) + { + var BTNME = WDAC.GetStringValue(values["BTNME"]).Trim(); + var BTSTM = WDAC.GetStringValue(values["BTSTM"]).Trim(); + var BTETM = WDAC.GetStringValue(values["BTETM"]).Trim(); + var BTRST = WDAC.GetStringValue(values["BTRST"]).Trim(); + var BTRED = WDAC.GetStringValue(values["BTRED"]).Trim(); + + bool result = true; + CustomMessage.ErrorMessage = string.Empty; + CustomMessage.IsValid = true; + + if (string.IsNullOrEmpty(BTNME)) + { + result = false; + CustomMessage.IsValid = false; + CustomMessage.ErrorMessage += "班表名稱必須輸入
"; + } + + if (string.IsNullOrEmpty(BTSTM)) + { + result = false; + CustomMessage.IsValid = false; + CustomMessage.ErrorMessage += "上班時間必須輸入
"; + } + + if (string.IsNullOrEmpty(BTETM)) + { + result = false; + CustomMessage.IsValid = false; + CustomMessage.ErrorMessage += "下班時間必須輸入
"; + } + + if (!string.IsNullOrEmpty(BTSTM) && !string.IsNullOrEmpty(BTETM) && BTSTM.CompareTo(BTETM) >= 0) + { + result = false; + CustomMessage.IsValid = false; + CustomMessage.ErrorMessage += "上班時間必須早於下班時間
"; + } + + if (string.IsNullOrEmpty(BTRST) ^ string.IsNullOrEmpty(BTRED)) + { + result = false; + CustomMessage.IsValid = false; + CustomMessage.ErrorMessage += "午休開始時間與午休結束時間必須同時輸入或同時不輸入
"; + } + + if (!string.IsNullOrEmpty(BTRST) && !string.IsNullOrEmpty(BTRED) && BTRST.CompareTo(BTRED) >= 0) + { + result = false; + CustomMessage.IsValid = false; + CustomMessage.ErrorMessage += "午休開始時間必須早於午休結束時間
"; + } + + ProcessCustomValidatorMessage(CustomMessage); + return result; + } +} \ No newline at end of file diff --git a/Web/forms/basedata/fmBhrd.ascx b/Web/forms/basedata/fmBhrd.ascx new file mode 100644 index 0000000..a1f6c8a --- /dev/null +++ b/Web/forms/basedata/fmBhrd.ascx @@ -0,0 +1,63 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmBhrd.ascx.cs" Inherits="forms_basedata_fmBhrd" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> +行事曆設定 +
+
+ + + + + + + + +
+ + + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + + + + +
+ + + + + + + + +
+ + + + diff --git a/Web/forms/basedata/fmBhrd.ascx.cs b/Web/forms/basedata/fmBhrd.ascx.cs new file mode 100644 index 0000000..c1ec79a --- /dev/null +++ b/Web/forms/basedata/fmBhrd.ascx.cs @@ -0,0 +1,155 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections.Generic; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Text; +using Wellan.Common; + +public partial class forms_basedata_fmBhrd : Wellan.Web.UI.WUserControlBase +{ + private string[] holidayData = null; + + protected void Page_Load(object sender, EventArgs e) + { + if (txtYear.Text == "") + { + txtYear.Text = DateTime.UtcNow.AddHours(8).ToString("yyyy"); + ddlMonth.SelectedValue = DateTime.UtcNow.AddHours(8).ToString("MM"); + Calendar1.VisibleDate = DateTime.UtcNow.AddHours(8).Date; + StoreYYMM(); + } + } + + private void StoreYYMM() + { + hfYear.Value = Calendar1.VisibleDate.ToString("yyyy", WGuard1.InvariantCulture); + hfMonth.Value = Calendar1.VisibleDate.ToString("MM"); + } + + protected void Calendar1_PreRender(object sender, EventArgs e) + { + // 取得節假日資料 + holidayData = new BhrdDAC().GetYear(Calendar1.VisibleDate.Year); + } + + protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) + { + e.Cell.Style["padding"] = "3px"; + e.Cell.Style["border"] = "2px solid white"; + + // 非本月,結束處理 + if (e.Day.IsOtherMonth) + return; + + // 本月,清除重畫 + e.Cell.Controls.Clear(); + Label aLabel = new Label(); + aLabel.Text = e.Day.Date.Day.ToString(); + aLabel.Font.Name = "Tahoma"; + aLabel.Font.Size = new FontUnit("16pt"); + aLabel.Font.Bold = true; + aLabel.ForeColor = System.Drawing.Color.Black; + e.Cell.Controls.Add(aLabel); + + // 加入換行的 Literal + Literal aBR = new Literal(); + aBR.Text = "
"; + e.Cell.Controls.Add(aBR); + + //加入 DropDownList 用以挑選假日型態 + DropDownList aDDL = new DropDownList(); + aDDL.ID = String.Format("HolidayType{0:00}", e.Day.Date.Day); + aDDL.Style.Add("width", "95%"); + // aDDL.Style.Add("position", "relative"); + aDDL.Style.Add("top", "2px"); + aDDL.Style.Add("font-size", "9pt"); + aDDL.Items.Add(new ListItem("上班", "-")); + aDDL.Items.Add(new ListItem("補班", "B")); + aDDL.Items.Add(new ListItem("國定/民俗", "N")); + aDDL.Items.Add(new ListItem("例假日", "H")); + aDDL.Items.Add(new ListItem("彈性休假", "V")); + aDDL.Items.Add(new ListItem("補假", "O")); + aDDL.Items.Add(new ListItem("颱風假", "T")); + aDDL.Items.Add(new ListItem("選舉假", "E")); + aDDL.Items.Add(new ListItem("公司活動", "A")); + + //if (Request["HolidayType01"] == null || holidayData == null) + if (holidayData == null) + { + if (e.Day.IsWeekend) + aDDL.SelectedValue = "H"; + else + aDDL.SelectedValue = "-"; + } + else + { + aDDL.SelectedValue = holidayData[e.Day.Date.Month - 1].Substring(e.Day.Date.Day - 1, 1); + } + + switch (aDDL.SelectedValue) + { + case "-": + e.Cell.BackColor = System.Drawing.Color.White; + break; + case "H": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xFF99CC); + break; + case "B": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xFFFF99); + break; + case "N": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x0099FF); + break; + case "V": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xFF9900); + break; + case "O": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x99CC00); + break; + case "T": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x999999); + break; + case "E": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xCC7FFF); + break; + case "A": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x7FCCFF); + break; + } + + + + e.Cell.Controls.Add(aDDL); + } + + protected void btnSave_Click(object sender, EventArgs e) + { + StringBuilder sb = new StringBuilder(); + for (int i = 1; i <= 31; i++) + { + sb.Append(Request[String.Format("HolidayType{0:00}", i)]); + } + BhrdDAC bhrd = new BhrdDAC(); + bhrd.SetMonth(Convert.ToInt32(hfYear.Value), Convert.ToInt32(hfMonth.Value), sb.ToString()); + Calendar1.VisibleDate = Convert.ToDateTime(hfYear.Value + "/" + hfMonth.Value + "/01", WGuard1.InvariantCulture); + } + + protected void btnGoto_Click(object sender, EventArgs e) + { + Calendar1.VisibleDate = Convert.ToDateTime(txtYear.Text + "/" + ddlMonth.SelectedValue + "/01"); + StoreYYMM(); + } + + protected void Calendar1_VisibleMonthChanged(object sender, MonthChangedEventArgs e) + { + txtYear.Text = Calendar1.VisibleDate.ToString("yyyy"); + ddlMonth.SelectedValue = Calendar1.VisibleDate.ToString("MM"); + StoreYYMM(); + } +} diff --git a/Web/forms/customer/fmBcus.ascx b/Web/forms/customer/fmBcus.ascx new file mode 100644 index 0000000..2265f41 --- /dev/null +++ b/Web/forms/customer/fmBcus.ascx @@ -0,0 +1,686 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBcus.ascx.cs" Inherits="forms_customer_fmBcus" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 客戶編號: + + + + 客戶名稱: + + + + 客戶簡稱: + + +
+ 統一編號: + + + + 產業類別: + + + + 員工人數: + + + + 資本額: + + +
+ 公司地址: + () +
+ 電話: + + 傳真: + + 人事聯絡人: +
+ 公司網站: + +
+ 公司簡介: + +
+ 服務項目: + +
+ 福利制度: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 客戶編號: + + + 客戶名稱: + + + 客戶簡稱: + +
+ 統一編號: + + + 產業類別: + + + 員工人數: + + + 資本額: + +
+ 公司地址: + +
+ 電話: + + 傳真: + + 人事聯絡人: +
+ 公司網站: + +
+ 公司簡介: + +
+ 服務項目: + +
+ 福利制度: + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 分類: + + + 區域: + +
+ 客戶編號: + + (系統自動編號) + 客戶名稱: + + + 客戶簡稱: + +
+ 統一編號: + + + 產業類別: + + + 員工人數: + + + 資本額: + +
+ 公司地址: + +
+ 電話: + + 傳真: + + 人事聯絡人: +
+ 公司網站: + +
+ 公司簡介: + +
+ 服務項目: + +
+ 福利制度: + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/Web/forms/customer/fmBcus.ascx.cs b/Web/forms/customer/fmBcus.ascx.cs new file mode 100644 index 0000000..11a6af0 --- /dev/null +++ b/Web/forms/customer/fmBcus.ascx.cs @@ -0,0 +1,343 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; + +public partial class forms_customer_fmBcus : Wellan.Web.UI.WUserControlBase +{ + private string _BCNUM = ""; + private string _BCNAM = ""; + private string _OLD_BCNUM = ""; + private string select = "SELECT * "; + private string from = " FROM BCUS "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY BCNUM"; + private string _bcusCls = ""; + private string _bcusZon = ""; + + protected void Page_Load(object sender, EventArgs e) + { + _BCNUM = ViewState["BCNUM"] != null ? ViewState["BCNUM"].ToString() : ""; + _BCNAM = ViewState["BCNAM"] != null ? ViewState["BCNAM"].ToString() : ""; + + //if (IsPostBack) + // gvBCUS.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsBCUSForm.ConnectionString = ConnectionString; + dsBCUSGrid.ConnectionString = ConnectionString; + + GetGridViewRowColor(gvBCUS); + + switch (MultiView1.ActiveViewIndex) + { + case 0: + { + break; + } + case 1: + { + Search(); + break; + } + } + } + + // 查詢按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + ViewState["BCNUM"] = txtBCNUM.Text; + ViewState["BCNAM"] = txtBCNAM.Text; + + _BCNUM = txtBCNUM.Text; + _BCNAM = txtBCNAM.Text; + + + if (_BCNUM.Length == 0 && + _BCNAM.Length == 0) + { + cvMessage.ErrorMessage = GetString("NOSRHCOND"); + cvMessage.IsValid = false; + } + else + { + MultiView1.ActiveViewIndex = 1; + + Search(); + + gvBCUS.PageIndex = 0; + gvBCUS.SelectedIndex = 0; + gvBCUS.DataBind(); + } + } + + // 取消查詢按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + MultiView1.ActiveViewIndex = 1; + } + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsBCUSGrid.SelectParameters.Clear(); + AddSearch(sql, dsBCUSGrid, "BCNUM", _BCNUM, "", true); + AddSearch(sql, dsBCUSGrid, "BCNAM", _BCNAM, "", true); + sql.Append(order); + dsBCUSGrid.SelectCommand = sql.ToString(); + } + + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + } + + // dataSource 新增存檔之前 + protected void dsBCUSForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + e.Command.Parameters["@BCNUM"].Value = + WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "BCUS", "BCNUM", String.Format("\"{0}{1}\"<9999>", _bcusZon, _bcusCls), " LEN(BCNUM)=6 "); + } + + // dataSource 更正存檔之前 + protected void dsBCUSForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + } + + protected void gvBCUS_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (gvBCUS.SelectedIndex == -1) + gvBCUS.SelectedIndex = 0; + + // 返回時,回到之前選擇的那一筆 + if (ParamList.ContainsKey("BCNUM")) + { + string bcnum = WDAC.GetStringValue(ParamList["BCNUM"]); + + DataView dv = dsBCUSGrid.Select(new DataSourceSelectArguments()) as DataView; + dv.RowFilter = String.Format("BCNUM='{0}'", bcnum); + if (dv.Count > 0) + { + int rowIndex = dv.Table.Rows.IndexOf(dv[0].Row); + gvBCUS.PageIndex = (rowIndex / gvBCUS.PageSize); + gvBCUS.SelectedIndex = rowIndex - gvBCUS.PageIndex * gvBCUS.PageSize; + } + + ParamList.Remove("BCNUM"); + } + + fvBCUS.DataBind(); + } + + protected void gvBCUS_PageIndexChanged(object sender, EventArgs e) + { + Search(); + gvBCUS.SelectedIndex = 0; + gvBCUS.DataBind(); + } + + protected void dsBCUSGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + if (MultiView1.ActiveViewIndex == 0) + { + cvMessage.ErrorMessage = GetString("NODATA"); + cvMessage.IsValid = false; + } + + MultiView1.ActiveViewIndex = 0; + cvMessage.ErrorMessage = GetString("NODATA"); + cvMessage.IsValid = false; + } + } + + protected void fvBCUS_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Search": + MultiView1.ActiveViewIndex = 0; + SetClientFocus(txtBCNUM); + break; + case "Cancel": + Search(); + fvBCUS.ChangeMode(FormViewMode.ReadOnly); + fvBCUS_ModeChanged(sender, e); + break; + case "BPRJ": + fvBCUS.DataBind(); + if (fvBCUS.DataItem != null) + { + DataRowView rv = fvBCUS.DataItem as DataRowView; + ParamList.Clear(); + ParamList.Add("BCNUM", rv["BCNUM"]); + DoAfterCommand("BPRJ"); + } + break; + } + } + + protected void fvBCUS_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + gvBCUS.DataBind(); + fvBCUS.DataBind(); + } + + protected void fvBCUS_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void fvBCUS_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void fvBCUS_ModeChanged(object sender, EventArgs e) + { + if (fvBCUS.CurrentMode == FormViewMode.ReadOnly) + { + gvBCUS.Visible = true; + gvBCUS.DataBind(); + if (gvBCUS.Rows.Count > 0 && gvBCUS.SelectedIndex == -1) + { + gvBCUS.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert) + { + gvBCUS.PageIndex = gvBCUS.PageCount - 1; + gvBCUS.DataBind(); + gvBCUS.SelectedIndex = gvBCUS.Rows.Count - 1; + } + + fvBCUS.DataBind(); + } + else + { + switch (fvBCUS.CurrentMode) + { + case FormViewMode.Edit: + break; + case FormViewMode.Insert: + break; + } + + gvBCUS.Visible = false; + } + } + + protected void fvBCUS_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void fvBCUS_DataBound(object sender, EventArgs e) + { + switch (fvBCUS.CurrentMode) + { + case FormViewMode.Insert: + SetClientFocus(fvBCUS, "txtBCUS_BCNAM"); + break; + case FormViewMode.Edit: + SetClientFocus(fvBCUS, "txtBCUS_BCNAM"); + break; + case FormViewMode.ReadOnly: + if (fvBCUS.DataItem != null) + ViewState["OLD_BCNUM"] = (fvBCUS.DataItem as DataRowView)["BCNUM"]; + break; + } + } + + protected void rvBCNUM1_ServerValidate(object source, ServerValidateEventArgs args) + { + // 檢查客戶編號是否重複 + _OLD_BCNUM = ViewState["OLD_BCNUM"] != null ? ViewState["OLD_BCNUM"].ToString() : ""; + args.IsValid = true; + + if (args.Value == _OLD_BCNUM) + return; + + DbCommand cmd = Query.NewCommand("SELECT COUNT(1) FROM BCUS WHERE BCNUM=@BCNUM"); + cmd.Parameters.Add(Query.NewParameter("BCNUM", args.Value)); + object o = Query.ExecuteScalar(cmd); + args.IsValid = (o == null || Convert.ToInt32(o) == 0); + } + + protected void gvBCUS_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(gvBCUS, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void gvBCUS_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in gvBCUS.Rows) + SetGridViewMouseBehavier(gvBCUS, row); + } + + protected void cvBCIDN_ServerValidate(object source, ServerValidateEventArgs args) + { + // 檢查統一編號是否正確 + args.IsValid = WGuard1.WCheckUbiNumber(args.Value) == 0; + } + + protected void cvBCMQT_ServerValidate(object source, ServerValidateEventArgs args) + { + // 檢查員工人數應為正數 + int i; + args.IsValid = args.Value != "" && int.TryParse(args.Value, out i) && i > 0; + } + + protected void fvBCUS_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 刪除前檢查 + // 檢查是否有專案資料 + DbCommand cmd = Query.NewCommand("SELECT COUNT(1) FROM BPRJ WHERE BPNUM=@BPNUM"); + cmd.Parameters.Add(Query.NewParameter("BPNUM", e.Keys["BCNUM"])); + object o = Query.ExecuteScalar(cmd); + if (o != null && Convert.ToInt32(o) > 0) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "此客戶有專案資料,不可刪除"; + e.Cancel = true; + } + } + + protected void fvBCUS_ItemInserting(object sender, FormViewInsertEventArgs e) + { + _bcusCls = (fvBCUS.FindControl("ddlClass") as DropDownList).SelectedValue; + _bcusZon = (fvBCUS.FindControl("ddlZone") as DropDownList).SelectedValue; + } + + // 查詢畫面的新增按鈕 + protected void btnInsert_Click(object sender, EventArgs e) + { + gvBCUS.Visible = false; + fvBCUS.ChangeMode(FormViewMode.Insert); + MultiView1.ActiveViewIndex = 1; + } +} diff --git a/Web/forms/customer/fmBpaa.ascx b/Web/forms/customer/fmBpaa.ascx new file mode 100644 index 0000000..de7c270 --- /dev/null +++ b/Web/forms/customer/fmBpaa.ascx @@ -0,0 +1,613 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBpaa.ascx.cs" Inherits="forms_customer_fmBpaa" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +    + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 專案編號: + + 專案名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 年度: + + 年度預算: +
+ 專案年度編號: + + 專案年度名稱: +
+ 差勤結算日: + + 破月薪資計算方式: + + 時數計算方式: + + 加班補休期限(月): +
+ 年初特休計算方式: +
+
+ +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 專案編號: + + 專案名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 年度: + + (民國年) + 年度預算: +
+ 專案年度編號: + + 專案年度名稱: +
+ 差勤結算日: + + 破月薪資計算方式: + + + 時數計算方式: + + + 加班補休期限(月): +
+ 年初特休計算方式: + + +
+
+ +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 專案編號: + + 專案名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 年度: + + 年度預算: +
+ 專案年度編號: + + 專案年度名稱: +
+ 差勤結算日: + + 破月薪資計算方式: + + + 時數計算方式: + + + 加班補休期限(月): +
+ 年初特休計算方式: + + +
+ +
+
+ + + + + + + + + + + + + + + +
+
+
diff --git a/Web/forms/customer/fmBpaa.ascx.cs b/Web/forms/customer/fmBpaa.ascx.cs new file mode 100644 index 0000000..e68f063 --- /dev/null +++ b/Web/forms/customer/fmBpaa.ascx.cs @@ -0,0 +1,457 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; + +/// +/// 專案年度接單處理 +/// +public partial class forms_customer_fmBpaa : Wellan.Web.UI.WUserControlBase +{ + protected string _BPNUM = ""; + protected string _BPPNM = ""; + private string _BPYER = ""; + private string _BPPYN = ""; + private string _BPPYM = ""; + //private int _OLD_BPYER = 0; + //private string _OLD_BPPYN = ""; + private string select = "SELECT * "; + private string from = " FROM BPAA "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY BPPNM, BPYER"; + + protected void Page_Load(object sender, EventArgs e) + { + //if (IsPostBack) + // gvBPAA.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsBPAAForm.ConnectionString = ConnectionString; + dsBPAAGrid.ConnectionString = ConnectionString; + + //_BPPNM = ViewState["BPPNM"] != null ? ViewState["BPPNM"].ToString() : ""; + //_BPYER = ViewState["BPYER"] != null ? ViewState["BPYER"].ToString() : ""; + //_BPPYN = ViewState["BPPYN"] != null ? ViewState["BPPYN"].ToString() : ""; + //_BPPYM = ViewState["BPPYM"] != null ? ViewState["BPPYM"].ToString() : ""; + + if (_BPNUM == "") + _BPNUM = GetStringParam("BPNUM"); + if (_BPPNM == "") + _BPPNM = GetStringParam("BPPNM"); + + GetGridViewRowColor(gvBPAA); + + switch (MultiView1.ActiveViewIndex) + { + case 0: + { + SetClientFocus(txtBPNUM); + break; + } + case 1: + { + Search(); + break; + } + } + } + + // 查詢按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + ViewState["BPPNM"] = txtBPPNM.Text; + ViewState["BPYER"] = txtBPYER.Text; + ViewState["BPPYN"] = txtBPPYN.Text; + ViewState["BPPYM"] = txtBPPYM.Text; + + _BPPNM = txtBPPNM.Text; + _BPYER = txtBPYER.Text; + _BPPYN = txtBPPYN.Text; + _BPPYM = txtBPPYM.Text; + + if (_BPPNM.Length == 0 && + _BPYER.Length == 0 && + _BPPYN.Length == 0 && + _BPPYM.Length == 0) + { + lbMessage.Text = GetString("NOSRHCOND"); + lbMessage.Visible = true; + } + else + { + MultiView1.ActiveViewIndex = 1; + + Search(); + + gvBPAA.PageIndex = 0; + gvBPAA.SelectedIndex = 0; + gvBPAA.DataBind(); + } + } + + // 取消查詢按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + MultiView1.ActiveViewIndex = 1; + } + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsBPAAGrid.SelectParameters.Clear(); + AddSearch(sql, dsBPAAGrid, "BPPNM", _BPPNM, "", true); + AddSearch(sql, dsBPAAGrid, "BPYER", _BPYER, "", true); + AddSearch(sql, dsBPAAGrid, "BPPYN", _BPPYN, "", true); + AddSearch(sql, dsBPAAGrid, "BPPYM", _BPPYM, "", true); + sql.Append(order); + dsBPAAGrid.SelectCommand = sql.ToString(); + } + + private void CalcFields(System.Collections.Specialized.IOrderedDictionary values) + { + Decimal bpbgt; + if (Decimal.TryParse(values["BPBGT"].ToString(), out bpbgt)) + values["BPBGT"] = bpbgt; + else + values["BPBGT"] = 0; + } + + protected void dsBPAAForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + } + + protected void dsBPAAForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + } + + protected void dsBPAAForm_Updated(object sender, SqlDataSourceStatusEventArgs e) + { + } + + protected void gvBPAA_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (gvBPAA.Rows.Count > 0) + { + if (gvBPAA.SelectedIndex == -1) + gvBPAA.SelectedIndex = 0; + + // 返回時,回到之前選擇的那一筆 + if (ParamList.ContainsKey("BPPNM") && ParamList.ContainsKey("BPYER")) + { + DataView dv = dsBPAAGrid.Select(new DataSourceSelectArguments()) as DataView; + dv.RowFilter = String.Format("BPPNM='{0}' and BPYER={1}", ParamList["BPPNM"], ParamList["BPYER"]); + if (dv.Count > 0) + { + int rowIndex = dv.Table.Rows.IndexOf(dv[0].Row); + gvBPAA.PageIndex = (rowIndex / gvBPAA.PageSize); + gvBPAA.SelectedIndex = rowIndex - gvBPAA.PageIndex * gvBPAA.PageSize; + } + + // ParamList.Remove("BPPNM"); + ParamList.Remove("BPYER"); + } + + fvBPAA.DataBind(); + } + } + + protected void gvBPAA_PageIndexChanged(object sender, EventArgs e) + { + Search(); + gvBPAA.SelectedIndex = 0; + gvBPAA.DataBind(); + } + + protected void dsBPAAGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + fvBPAA.ChangeMode(FormViewMode.Insert); + fvBPAA_ModeChanged(sender, e); + } + } + + protected void fvBPAA_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Insert": + break; + case "Edit": + break; + case "Cancel": + Search(); + fvBPAA.ChangeMode(FormViewMode.ReadOnly); + fvBPAA_ModeChanged(sender, e); + if (gvBPAA.Rows.Count == 0) + DoAfterCommand("BPRJ"); + break; + case "Return": + DoAfterCommand("BPRJ"); + break; + case "Detail": + fvBPAA.DataBind(); + if (fvBPAA.DataItem != null) + { + DataRowView rv = fvBPAA.DataItem as DataRowView; + ParamList["BPNUM"] = _BPNUM; + ParamList["BPPNM"] = rv["BPPNM"]; + ParamList["BPPYN"] = rv["BPPYN"]; + ParamList["BPYER"] = rv["BPYER"].ToString(); + DoAfterCommand("BPAB"); + } + break; + case "BPJA": + fvBPAA.DataBind(); + + if (fvBPAA.DataItem != null) + { + DataRowView rv = fvBPAA.DataItem as DataRowView; + //ParamList.Clear(); + ParamList["BPNUM"] = _BPNUM; + ParamList["BPPNM"] = rv["BPPNM"]; + ParamList["BPPYN"] = rv["BPPYN"]; + ParamList["BPYER"] = rv["BPYER"].ToString(); + DoAfterCommand("BPJA"); + } + break; + case "RASN": + fvBPAA.DataBind(); + + if (fvBPAA.DataItem != null) + { + DataRowView rv = fvBPAA.DataItem as DataRowView; + //ParamList.Clear(); + ParamList["BPNUM"] = _BPNUM; + ParamList["BPPNM"] = rv["BPPNM"]; + ParamList["BPPYN"] = rv["BPPYN"]; + ParamList["BPYER"] = rv["BPYER"].ToString(); + //ParamList.Add("RACNM", _BPNUM); + //ParamList.Add("RASNM", rv["BPPYN"]); + DoAfterCommand("RASN"); + } + break; + case "SubjectAssign": + fvBPAA.DataBind(); + if (fvBPAA.DataItem != null) + { + DataRowView rv = fvBPAA.DataItem as DataRowView; + //ParamList.Clear(); + ParamList["BPNUM"] = _BPNUM; + ParamList["BPPNM"] = rv["BPPNM"]; + ParamList["BPPYN"] = rv["BPPYN"]; + ParamList["BPYER"] = rv["BPYER"].ToString(); + DoAfterCommand("BPAASUB"); + } + break; + } + } + + protected void fvBPAA_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + gvBPAA.DataBind(); + if (gvBPAA.SelectedIndex > gvBPAA.Rows.Count - 1) + { + gvBPAA.SelectedIndex = gvBPAA.Rows.Count - 1; + gvBPAA.DataBind(); + } + fvBPAA.DataBind(); + } + + protected void fvBPAA_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void fvBPAA_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void fvBPAA_ModeChanged(object sender, EventArgs e) + { + switch (fvBPAA.CurrentMode) + { + case FormViewMode.ReadOnly: + gvBPAA.Visible = true; + gvBPAA.DataBind(); + if (gvBPAA.Rows.Count > 0) + { + if (gvBPAA.SelectedIndex == -1) + { + gvBPAA.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert) + { + gvBPAA.PageIndex = gvBPAA.PageCount - 1; + gvBPAA.DataBind(); + gvBPAA.SelectedIndex = gvBPAA.Rows.Count - 1; + } + gvBPAA.DataBind(); + fvBPAA.DataBind(); + } + break; + + case FormViewMode.Edit: + gvBPAA.Visible = false; + break; + + case FormViewMode.Insert: + gvBPAA.Visible = false; + break; + } + } + + protected void fvBPAA_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void fvBPAA_DataBound(object sender, EventArgs e) + { + switch (fvBPAA.CurrentMode) + { + case FormViewMode.Edit: + SetClientFocus(fvBPAA, "txtBPAA_BPBGT"); + break; + case FormViewMode.Insert: + SetClientFocus(fvBPAA, "txtBPAA_BPYER"); + break; + } + } + + protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args) + { + CustomValidator v = source as CustomValidator; + + // 檢查年度是否為數字 + int bpyer; + + if (!int.TryParse((fvBPAA.FindControl("txtBPAA_BPYER") as ITextControl).Text, out bpyer)) + { + args.IsValid = false; + v.ErrorMessage = "年度請輸入民國年"; + return; + } + + switch (fvBPAA.CurrentMode) + { + case FormViewMode.Insert: + DbCommand cmd = Query.NewCommand("SELECT COUNT(1) FROM BPAA WHERE BPPNM=@BPPNM AND BPYER=@BPYER"); + cmd.Parameters.Add(Query.NewParameter("BPPNM", _BPPNM)); + cmd.Parameters.Add(Query.NewParameter("BPYER", bpyer)); + object o = Query.ExecuteScalar(cmd); + // 重複 + if (o != null && Convert.ToInt32(o) != 0) + { + args.IsValid = false; + v.ErrorMessage = "本年度已開帳!請取消新增之後,用更正來修改預算及年度專案名稱"; + return; + } + + break; + case FormViewMode.Edit: + break; + } + } + + protected void fvBPAA_ItemCreated(object sender, EventArgs e) + { + switch (fvBPAA.CurrentMode) + { + case FormViewMode.Insert: + (fvBPAA.FindControl("lbBPAA_BPPNM") as ITextControl).Text = _BPPNM; + break; + } + } + + protected void gvBPAA_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(gvBPAA, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void gvBPAA_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in gvBPAA.Rows) + SetGridViewMouseBehavier(gvBPAA, row); + } + + protected void fvBPAA_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 刪除前檢查 + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + // 1. 是否已有科目設定 + DbCommand cmd1 = Query.NewCommand("SELECT COUNT(1) FROM BPAB WHERE BPPYN=@BPPYN"); + cmd1.Parameters.Add(Query.NewParameter("BPPYN", e.Values["BPPYN"])); + int i = Convert.ToInt32(Query.ExecuteScalar(cmd1)); + if (i > 0) + { + cvMessage.ErrorMessage += "本年度已有科目設定。不可刪除!
"; + cvMessage.IsValid = false; + } + + // 2. 是否已有職稱設定 + cmd1.CommandText = "SELECT COUNT(1) FROM BPJA WHERE BPPYN=@BPPYN"; + cmd1.Parameters.Clear(); + cmd1.Parameters.Add(Query.NewParameter("BPPYN", e.Values["BPPYN"])); + i = Convert.ToInt32(Query.ExecuteScalar(cmd1)); + if (i > 0) + { + cvMessage.ErrorMessage += "本年度已有職稱設定。不可刪除!
"; + cvMessage.IsValid = false; + } + + ProcessCustomValidatorMessage(cvMessage); + e.Cancel = !cvMessage.IsValid; + } + + protected void fvBPAA_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + CalcFields(e.NewValues); + // 記住連鎖更正之舊值 + //_OLD_BPPYN = e.OldValues["BPPYN"].ToString(); + //e.NewValues["BPPYN"] = String.Format("{0:000}{1}", Convert.ToInt32(e.NewValues["BPYER"]), e.NewValues["BPPNM"]); + } + + protected void fvBPAA_ItemInserting(object sender, FormViewInsertEventArgs e) + { + e.Values["BPPYN"] = String.Format("{0:000}{1}", Convert.ToInt32(e.Values["BPYER"]), e.Values["BPPNM"]); + CalcFields(e.Values); + } + + protected void cvBPFED_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i >= 1 && i <= 31; + } + + protected void fvBPAA_DataBinding(object sender, EventArgs e) + { + + } +} diff --git a/Web/forms/customer/fmBpaaSub.ascx b/Web/forms/customer/fmBpaaSub.ascx new file mode 100644 index 0000000..c864823 --- /dev/null +++ b/Web/forms/customer/fmBpaaSub.ascx @@ -0,0 +1,356 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBpaaSub.ascx.cs" + Inherits="forms_customer_fmBpaaSub" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ 專案編號: + + 專案名稱: +
+ 年度: +
+ 專案年度編號: + + 專案年度名稱: +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ BPAA.BPS01: + + + BPAA.BPS15: + +
+ BPAA.BPS02: + + + BPAA.BPS13: + +
+ BPAA.BPS03: + + + BPAA.BPS14: + +
+ BPAA.BPS04: + + + +
+ BPAA.BPS05: + + + +
+ BPAA.BPS06: + + + +
+ BPAA.BPS07: + + + +
+ BPAA.BPS08: + + + +
+ BPAA.BPS09: + + + +
+ +
+
diff --git a/Web/forms/customer/fmBpaaSub.ascx.cs b/Web/forms/customer/fmBpaaSub.ascx.cs new file mode 100644 index 0000000..f56dfd5 --- /dev/null +++ b/Web/forms/customer/fmBpaaSub.ascx.cs @@ -0,0 +1,61 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; + +/// +/// 年度接單科目對應設定 +/// +public partial class forms_customer_fmBpaaSub : Wellan.Web.UI.WUserControlBase +{ + private string _BPNUM = ""; + private string _BPPNM = ""; + private string _BPPYN = ""; + private string _BPYER = ""; + + protected void Page_Load(object sender, EventArgs e) + { + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsBPAA.ConnectionString = ConnectionString; + dsBPAB.ConnectionString = ConnectionString; + dsBPABBig.ConnectionString = ConnectionString; + dsBPABSmall.ConnectionString = ConnectionString; + + _BPNUM = GetStringParam("BPNUM"); + _BPPNM = GetStringParam("BPPNM"); + _BPPYN = GetStringParam("BPPYN"); + _BPYER = GetStringParam("BPYER"); + + dsBPAA.SelectParameters["BPPNM"].DefaultValue = _BPPNM; + dsBPAA.SelectParameters["BPYER"].DefaultValue = _BPYER; + + dsBPAB.SelectParameters["BPPYN"].DefaultValue = _BPPYN; + dsBPABBig.SelectParameters["BPPYN"].DefaultValue = _BPPYN; + dsBPABSmall.SelectParameters["BPPYN"].DefaultValue = _BPPYN; + } + + protected void BPAAForm_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Cancel": + DoAfterCommand("BPAA"); + break; + } + } + + protected void BPAAForm_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + DoAfterCommand("BPAA"); + } +} diff --git a/Web/forms/customer/fmBpab.ascx b/Web/forms/customer/fmBpab.ascx new file mode 100644 index 0000000..7e4fbdf --- /dev/null +++ b/Web/forms/customer/fmBpab.ascx @@ -0,0 +1,697 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmBpab.ascx.cs" + Inherits="forms_customer_fmBpab" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> + + + + + + + + + + + + + + + +
+ 年度: + + + + +
+ 專案: + + + + +   +
+ + + + + + + + + +
+ + +
+
+ + + + + + +
+
+ + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +   + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + + + 專案年度名稱: + + +
+ 客戶編號: + + + + 客戶名稱: + + +
+ 大類: + + + + 小類: + + + + 順序: + + +
+ 科目編號: + + + + 科目名稱: + + + + 年度預算: + + +
+ 備註: + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + + + 專案年度名稱: + + +
+ 客戶編號: + + + + 客戶名稱: + + +
+ 大類: + + + + 小類: + + + + 順序: + + +
+ 科目編號: + + (自動編號) + + 科目名稱: + + + + 年度預算: + + +
+ 備註: + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + + + 專案年度名稱: + + +
+ 客戶編號: + + + + 客戶名稱: + + +
+ 大類: + + + + 小類: + + + + 順序: + + +
+ 科目編號: + + (自動編號) + + 科目名稱: + + + + 年度預算: + + +
+ 備註: + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + diff --git a/Web/forms/customer/fmBpab.ascx.cs b/Web/forms/customer/fmBpab.ascx.cs new file mode 100644 index 0000000..b8b7361 --- /dev/null +++ b/Web/forms/customer/fmBpab.ascx.cs @@ -0,0 +1,516 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; + +/// +/// 年度科目設定(科目) +/// +public partial class forms_customer_fmBpab : Wellan.Web.UI.WUserControlBase +{ + protected string _BPNUM = ""; + protected string _BPPYN = ""; + private string _OLD_BPACC = ""; + private string select = "SELECT * "; + private string from = " FROM BPAB "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY BPPYN, BPCLS"; + private DbCommand cmdTree; + + protected void Page_Load(object sender, EventArgs e) + { + //if (IsPostBack) + // gvBPAB.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + + Page.ClientScript.RegisterStartupScript(Page.GetType(), "RestoreDivPosition", "RestoreDivPosition();", true); + + dsBPABForm.ConnectionString = ConnectionString; + dsBPABGrid.ConnectionString = ConnectionString; + dsBPABBig.ConnectionString = ConnectionString; + dsBPABSmall.ConnectionString = ConnectionString; + + _BPNUM = GetStringParam("BPNUM"); + _BPPYN = GetStringParam("BPPYN"); + + dsBPABBig.SelectParameters["BPPYN"].DefaultValue = _BPPYN; + dsBPABSmall.SelectParameters["BPPYN"].DefaultValue = _BPPYN; + + GetGridViewRowColor(gvBPAB); + + Search(); + } + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + + dsBPABGrid.SelectParameters.Clear(); + AddSearch(sql, dsBPABGrid, "BPPYN", _BPPYN, "", true); + sql.Append(" AND SUBSTRING(BPACC,3,2) <> '00' AND SUBSTRING(BPACC,5,2) <> '00' "); + sql.Append(order); + dsBPABGrid.SelectCommand = sql.ToString(); + } + + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + Decimal bpbgt; + if (Decimal.TryParse(e.Command.Parameters["@BPBGT"].Value.ToString(), out bpbgt)) + e.Command.Parameters["@BPBGT"].Value = bpbgt; + else + e.Command.Parameters["@BPBGT"].Value = 0; + } + + protected void dsBPABForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + } + + protected void dsBPABForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + + e.Command.Connection.Open(); + e.Command.Transaction = e.Command.Connection.BeginTransaction(); + } + + protected void dsBPABForm_Updated(object sender, SqlDataSourceStatusEventArgs e) + { + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + ChainUpdateBPAA(e.Command.Parameters["@OLD_BPACC"].Value.ToString(), + e.Command.Parameters["@BPACC"].Value.ToString(), + e.Command.Transaction); + e.Command.Transaction.Commit(); + e.Command.Connection.Close(); + //cvMessage.IsValid = cvMessage.ErrorMessage == ""; + } + + protected void gvBPAB_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (gvBPAB.Rows.Count > 0) + { + if (gvBPAB.SelectedIndex == -1) + gvBPAB.SelectedIndex = 0; + + fvBPAB.DataBind(); + + if (fvBPAB.DataItem != null) + ViewState["OLD_BPACC"] = (fvBPAB.DataItem as DataRowView)["BPACC"]; + } + } + + protected void gvBPAB_PageIndexChanged(object sender, EventArgs e) + { + Search(); + GridView gv = sender as GridView; + gv.SelectedIndex = 0; + gv.DataBind(); + } + + protected void dsBPABGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + gvBPAB.Visible = false; + fvBPAB.ChangeMode(FormViewMode.Insert); + fvBPAB_ModeChanged(sender, e); + } + } + + protected void fvBPAB_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Insert": + break; + case "Edit": + break; + case "Delete": + break; + case "Cancel": + Search(); + fvBPAB.ChangeMode(FormViewMode.ReadOnly); + fvBPAB_ModeChanged(sender, e); + if (gvBPAB.Rows.Count == 0) + DoAfterCommand("SMALL"); + break; + case "Small": + DoAfterCommand("SMALL"); + break; + case "Big": + DoAfterCommand("BIG"); + break; + case "Return": + DoAfterCommand("BPAA"); + break; + } + } + + protected void fvBPAB_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + gvBPAB.DataBind(); + if (gvBPAB.SelectedIndex > gvBPAB.Rows.Count - 1) + { + gvBPAB.SelectedIndex = gvBPAB.Rows.Count - 1; + gvBPAB.DataBind(); + } + fvBPAB.DataBind(); + } + + protected void fvBPAB_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void fvBPAB_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void fvBPAB_ModeChanged(object sender, EventArgs e) + { + switch (fvBPAB.CurrentMode) + { + case FormViewMode.ReadOnly: + gvBPAB.Visible = true; + gvBPAB.DataBind(); + if (gvBPAB.Rows.Count > 0) + { + if (gvBPAB.SelectedIndex == -1) + { + gvBPAB.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert) + { + gvBPAB.PageIndex = gvBPAB.PageCount - 1; + gvBPAB.DataBind(); + gvBPAB.SelectedIndex = gvBPAB.Rows.Count - 1; + } + + fvBPAB.DataBind(); + } + break; + + case FormViewMode.Edit: + gvBPAB.Visible = false; + break; + + case FormViewMode.Insert: + gvBPAB.Visible = false; + break; + } + } + + protected void fvBPAB_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void RegisterJS(FormView fv) + { + HtmlSelect dlBig = fv.FindControl("dlBPAB_BPACCBig") as HtmlSelect; + HtmlSelect dlSmall = fv.FindControl("dlBPAB_BPACCSmall") as HtmlSelect; + HiddenField hfBig = fv.FindControl("hfBPACCBig") as HiddenField; + HiddenField hfSmall = fv.FindControl("hfBPACCSmall") as HiddenField; + dlBig.Attributes["onchange"] = String.Format("javascript:BPACCBigChange('{0:c}', '{1:c}', '{2:c}', '{3:c}');", + dlBig.ClientID, dlSmall.ClientID, hfBig.ClientID, hfSmall.ClientID); + dlSmall.Attributes["onchange"] = String.Format("javascript:BPACCSmallChange('{0:c}', '{1:c}');", + dlSmall.ClientID, hfSmall.ClientID); + + StringBuilder sb1 = new StringBuilder(); + StringBuilder sb2 = new StringBuilder(); + + for (int i = 0; i < dlSmall.Items.Count; i++) + { + sb1.Append("\"" + dlSmall.Items[i].Value + "\","); + sb2.Append("\"" + dlSmall.Items[i].Text + "\","); + } + + Page.ClientScript.RegisterArrayDeclaration("smallValue", sb1.ToString().Remove(sb1.Length - 1)); + Page.ClientScript.RegisterArrayDeclaration("smallText", sb2.ToString().Remove(sb2.Length - 1)); + + Button btnSave = fv.FindControl("btnSave") as Button; + btnSave.OnClientClick = String.Format("javascript:CopyBPACCValue('{0:c}', '{1:c}', '{2:c}', '{3:c}');return confirm(msgConfirmSave);", + dlBig.ClientID, dlSmall.ClientID, hfBig.ClientID, hfSmall.ClientID); + + if (fv.DataItem != null) + { + string bpacc = (fv.DataItem as DataRowView)["BPACC"].ToString(); + dlBig.Value = bpacc.Substring(0, 2) + "0000"; + + for (int i = dlSmall.Items.Count - 1; i >= 0; i--) + { + if (dlSmall.Items[i].Value.Substring(0, 2) != bpacc.Substring(0, 2)) + dlSmall.Items.Remove(dlSmall.Items[i]); + } + + if (bpacc != "") + dlSmall.Value = bpacc.Substring(0, 4) + "00"; + } + else + { + for (int i = dlSmall.Items.Count - 1; i >= 0; i--) + { + if (dlSmall.Items[i].Value.Substring(0, 2) != dlBig.Value.Substring(0, 2)) + dlSmall.Items.Remove(dlSmall.Items[i]); + } + } + } + + protected void fvBPAB_DataBound(object sender, EventArgs e) + { + FormView fv = sender as FormView; + + switch (fv.CurrentMode) + { + case FormViewMode.Edit: + SetClientFocus(fv, "dlBPAB_BPACCBig"); + RegisterJS(fv); + break; + case FormViewMode.Insert: + SetClientFocus(fv, "dlBPAB_BPACCBig"); + RegisterJS(fv); + break; + case FormViewMode.ReadOnly: + break; + } + } + + protected void fvBPAB_ItemCreated(object sender, EventArgs e) + { + FormView fv = sender as FormView; + switch (fv.CurrentMode) + { + case FormViewMode.Insert: + (fv.FindControl("lbBPAB_BPNUM") as ITextControl).Text = _BPNUM; + (fv.FindControl("lbBPAB_BPPYN") as ITextControl).Text = _BPPYN; + break; + } + } + + protected void gvBPAB_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(sender as GridView, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void gvBPAB_SelectedIndexChanged(object sender, EventArgs e) + { + GridView gv = sender as GridView; + foreach (GridViewRow row in gv.Rows) + SetGridViewMouseBehavier(gv, row); + } + + protected void fvBPAB_ItemInserting(object sender, FormViewInsertEventArgs e) + { + string bpaccSmall = (fvBPAB.FindControl("hfBPACCSmall") as HiddenField).Value; + e.Values["BPACC"] = WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "BPAB", "BPACC", + String.Format("\"{0}\"<99>", bpaccSmall.Substring(0, 4)), String.Format(" BPPYN='{0}' ", _BPPYN)); + + // 取得小類的排序號 + int newBpord = Convert.ToInt32(e.Values["BPORD"]); + DbCommand cmd1 = Query.NewCommand("SELECT BPCLS FROM BPAB WHERE BPACC=@BPACC"); + cmd1.Parameters.Add(Query.NewParameter("BPACC", bpaccSmall)); + string bpclsSmall = Query.ExecuteScalar(cmd1).ToString(); + + e.Values["BPCLS"] = String.Format("{0}{1:00}", bpclsSmall.Substring(0, 4), newBpord); + } + + protected void fvBPAB_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + _OLD_BPACC = ViewState["OLD_BPACC"] != null ? ViewState["OLD_BPACC"].ToString() : ""; + string bpaccSmall = (fvBPAB.FindControl("hfBPACCSmall") as HiddenField).Value; + if (_OLD_BPACC.Substring(0, 4) != bpaccSmall.Substring(0, 4)) + e.NewValues["BPACC"] = WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "BPAB", "BPACC", String.Format("\"{0}\"<99>", bpaccSmall.Substring(0, 4)), ""); + + // 取得小類的排序號 + int newBpord = Convert.ToInt32(e.NewValues["BPORD"]); + DbCommand cmd1 = Query.NewCommand("SELECT BPCLS FROM BPAB WHERE BPACC=@BPACC"); + cmd1.Parameters.Add(Query.NewParameter("BPACC", bpaccSmall)); + string bpclsSmall = Query.ExecuteScalar(cmd1).ToString(); + + e.NewValues["BPCLS"] = String.Format("{0}{1:00}", bpclsSmall.Substring(0, 4), newBpord); + } + + protected string GetBPACC(string bpacc) + { + DbCommand cmd = Query.NewCommand("SELECT BPAME FROM BPAB WHERE BPPYN=@BPPYN AND BPACC=@BPACC"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", _BPPYN)); + cmd.Parameters.Add(Query.NewParameter("BPACC", bpacc)); + object o = Query.ExecuteScalar(cmd); + if (o == null || o == DBNull.Value) + return ""; + else + return o.ToString(); + } + + protected string GetBPACCBig(string bpacc) + { + return GetBPACC(bpacc.Substring(0, 2) + "0000"); + } + + protected string GetBPACCSmall(string bpacc) + { + return GetBPACC(bpacc.Substring(0, 4) + "00"); + } + + protected void dsBPABForm_Selecting(object sender, SqlDataSourceSelectingEventArgs e) + { + + } + + protected void cvBPBGT_ServerValidate(object source, ServerValidateEventArgs args) + { + // 檢查預算是否輸入合理的數字 + int i; + args.IsValid = int.TryParse(args.Value, out i) && i >= 0; + } + + protected void cvBPORD_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = int.TryParse(args.Value, out i) && i > 0 && i < 100; + } + + protected void ChainUpdateBPAA(string old_bpacc, string new_bpacc, DbTransaction tran) + { + // 取得專案科目對應資料 + GetData gd = new GetData(); + gd.Query = Query; + DataTable bpaa = gd.GetBPAA_BPPYN(_BPPYN); + DataRow bpaaRow = bpaa.Rows[0]; + DbCommand cmdUpdateBPAA = Query.NewCommand(); + cmdUpdateBPAA.Connection = tran.Connection; + cmdUpdateBPAA.Transaction = tran; + cmdUpdateBPAA.Parameters.Add(Query.NewParameter("TRUSR", UserId)); + cmdUpdateBPAA.Parameters.Add(Query.NewParameter("BPPYN", _BPPYN)); + cmdUpdateBPAA.Parameters.Add(Query.NewParameter("BPSXX", new_bpacc)); + + // 核對科目對應資料,如果已有科目對應,則清除科目對應 + string[] fieldNames = {"BPS01", "BPS02", "BPS03", "BPS04", "BPS05", + "BPS06", "BPS07", "BPS08", "BPS09", "BPS10", + "BPS11", "BPS12", "BPS13", "BPS14", "BPS15", + "BPS16", "BPS17", "BPS18", "BPS19", "BPS20", + "BPS21", "BPS22", "BPS23", "BPS24", "BPS25", + "BPS26", "BPS27", "BPS28", "BPS29", "BPS30"}; + for (int i = 0; i < fieldNames.Length; i++) + { + if (bpaaRow[fieldNames[i]] != DBNull.Value && bpaaRow[fieldNames[i]].ToString() == old_bpacc) + { + cvMessage.ErrorMessage += String.Format("\"{0}\" 的科目對應因科目刪除而清除
", GetString("BPAA." + fieldNames[i])); + cmdUpdateBPAA.CommandText = String.Format("UPDATE BPAA SET {0}=@BPSXX, TRDAT=GETDATE(), TRMOD='UPDATE', TRUSR=@TRUSR WHERE BPPYN=@BPPYN", fieldNames[i]); + cmdUpdateBPAA.ExecuteNonQuery(); + } + } + } + + protected void dsBPABForm_Deleting(object sender, SqlDataSourceCommandEventArgs e) + { + e.Command.Connection.Open(); + e.Command.Transaction = e.Command.Connection.BeginTransaction(); + } + + protected void dsBPABForm_Deleted(object sender, SqlDataSourceStatusEventArgs e) + { + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + ChainUpdateBPAA(e.Command.Parameters["@OLD_BPACC"].Value.ToString(), "", e.Command.Transaction); + e.Command.Transaction.Commit(); + e.Command.Connection.Close(); + cvMessage.IsValid = cvMessage.ErrorMessage == ""; + } + + + + #region 新作法 + + protected void btnYY_Click(object sender, EventArgs e) + { + int year; + if (!Int32.TryParse(txtYY.Text.Trim(), out year)) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "請輸入正確的年度"; + return; + } + + ddlRPPYN.DataSource = new BpaaDAC().GetBpaaWithTY(year + WGuard1.CY11); + ddlRPPYN.DataBind(); + } + + + protected void ddlRPPYN_SelectedIndexChanged(object sender, EventArgs e) + { + DrawTree("", tvBPAB.Nodes); + } + + protected void DrawTree(string parent, TreeNodeCollection nodes) + { + if (cmdTree == null) + cmdTree = Query.NewCommand(); + + string sql1 = "SELECT BPACC, BPAME, BPORD FROM BPAB WHERE BPPYN=@BPPYN"; + + switch (parent.Length) + { + case 0: + cmdTree.CommandText = sql1 + " AND SUBSTRING(BPACC,3,4) = '0000'"; + break; + case 2: + cmdTree.CommandText = sql1 + " AND SUBSTRING(BPACC,1,2) = @PARENT AND SUBSTRING(BPACC,3,2) <> '00' AND SUBSTRING(BPACC,5,2) = '00'"; + break; + case 4: + cmdTree.CommandText = sql1 + " AND SUBSTRING(BPACC,1,4) = @PARENT AND SUBSTRING(BPACC,5,2) <> '00'"; + break; + } + cmdTree.CommandText += " ORDER BY BPORD "; + Query.AddParam(cmdTree, "BPPYN", ddlRPPYN.SelectedValue); + Query.AddParam(cmdTree, "PARENT", parent); + + DataTable treeData = Query.Select(cmdTree); + + foreach (DataRow row in treeData.Rows) + { + string bpacc = WQuery.GetStringValue(row["BPACC"]); + string bpame = WQuery.GetStringValue(row["BPAME"]); + + TreeNode newNode = new TreeNode("(" + bpacc + ") " + bpame, bpacc); + newNode.Expanded = true; + nodes.Add(newNode); + + // 第二層 + if (bpacc.Substring(2, 4) == "0000") + DrawTree(bpacc.Substring(0, 2), newNode.ChildNodes); + + // 第三層 + if (bpacc.Substring(4, 2) == "00") + DrawTree(bpacc.Substring(0, 4), newNode.ChildNodes); + } + } + + #endregion +} diff --git a/Web/forms/customer/fmBpabBig.ascx b/Web/forms/customer/fmBpabBig.ascx new file mode 100644 index 0000000..4a9359a --- /dev/null +++ b/Web/forms/customer/fmBpabBig.ascx @@ -0,0 +1,421 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBpabBig.ascx.cs" + Inherits="forms_customer_fmBpabBig" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + 專案年度名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 大類名稱: + + 順序: +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + 專案年度名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 大類名稱: + + 順序: +
+
+ + + + + + + +
+ + + + + +  
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + 專案年度名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 大類名稱: + + 順序: +
+
+
+ + + + + + + + + + + + + + + + + +
+
diff --git a/Web/forms/customer/fmBpabBig.ascx.cs b/Web/forms/customer/fmBpabBig.ascx.cs new file mode 100644 index 0000000..f2e04f2 --- /dev/null +++ b/Web/forms/customer/fmBpabBig.ascx.cs @@ -0,0 +1,312 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; + +/// +/// 年度科目設定(大類) +/// +public partial class forms_customer_fmBpabBig : Wellan.Web.UI.WUserControlBase +{ + protected string _BPNUM = ""; + protected string _BPPYN = ""; + private string select = "SELECT * "; + private string from = " FROM BPAB "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY BPPYN, BPCLS, BPORD"; + + protected void Page_Load(object sender, EventArgs e) + { + //if (IsPostBack) + // gvBPAB.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsBPABForm.ConnectionString = ConnectionString; + dsBPABGrid.ConnectionString = ConnectionString; + + _BPNUM = GetStringParam("BPNUM"); + _BPPYN = GetStringParam("BPPYN"); + + GetGridViewRowColor(gvBPAB); + + Search(); + } + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + + dsBPABGrid.SelectParameters.Clear(); + AddSearch(sql, dsBPABGrid, "BPPYN", _BPPYN, "", true); + sql.Append(" AND SUBSTRING(BPACC,3,4) = '0000' "); + sql.Append(order); + dsBPABGrid.SelectCommand = sql.ToString(); + } + + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + } + + protected void dsBPABForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + e.Command.Parameters["@BPACC"].Value = + WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "BPAB", "BPACC", "<99>\"0000\"", String.Format("BPPYN='{0}'", _BPPYN)); + e.Command.Parameters["@BPCLS"].DbType = DbType.String; + e.Command.Parameters["@BPCLS"].Size = 8; + e.Command.Parameters["@BPCLS"].Value = + String.Format("{0:00}", Convert.ToInt32(e.Command.Parameters["@BPORD"].Value)) + "0000"; + } + + protected void dsBPABForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + int newBpord = Convert.ToInt32(e.Command.Parameters["@BPORD"].Value); + e.Command.Parameters["@BPCLS"].Value = String.Format("{0:00}", newBpord) + "0000"; + + e.Command.Connection.Open(); + e.Command.Transaction = e.Command.Connection.BeginTransaction(); + } + + protected void dsBPABForm_Updated(object sender, SqlDataSourceStatusEventArgs e) + { + int newBpord = Convert.ToInt32(e.Command.Parameters["@BPORD"].Value); + int oldBpord = ViewState["OLD_BPORD"] != null && ViewState["OLD_BPORD"].ToString() != "" ? Convert.ToInt32(ViewState["OLD_BPORD"]) : 0; + string oldBpacc = e.Command.Parameters["@OLD_BPACC"].Value.ToString(); + + try + { + if (newBpord != oldBpord) + { + DbCommand cmd = Query.NewCommand( + @"UPDATE BPAB + SET BPCLS = @NEW_BPORD + SUBSTRING(BPCLS, 3, 4) + WHERE SUBSTRING(BPACC, 1, 2)=@BPACC"); + cmd.Parameters.Add(Query.NewParameter("NEW_BPORD", newBpord.ToString("00"))); + cmd.Parameters.Add(Query.NewParameter("BPACC", oldBpacc.Substring(0, 2))); + cmd.Connection = e.Command.Connection; + cmd.Transaction = e.Command.Transaction; + cmd.ExecuteNonQuery(); + } + e.Command.Transaction.Commit(); + e.Command.Connection.Close(); + } + catch + { + e.Command.Transaction.Rollback(); + e.Command.Connection.Close(); + } + } + + protected void gvBPAB_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (gvBPAB.Rows.Count > 0) + { + if (gvBPAB.SelectedIndex == -1) + gvBPAB.SelectedIndex = 0; + + fvBPAB.DataBind(); + + if (fvBPAB.DataItem != null) + ViewState["OLD_BPORD"] = (fvBPAB.DataItem as DataRowView)["BPORD"].ToString(); + } + } + + protected void gvBPAB_PageIndexChanged(object sender, EventArgs e) + { + Search(); + gvBPAB.SelectedIndex = 0; + gvBPAB.DataBind(); + } + + protected void dsBPABGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + gvBPAB.Visible = false; + fvBPAB.ChangeMode(FormViewMode.Insert); + fvBPAB_ModeChanged(sender, e); + } + } + + protected void fvBPAB_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Insert": + break; + case "Edit": + break; + case "Delete": + break; + case "Cancel": + Search(); + fvBPAB.ChangeMode(FormViewMode.ReadOnly); + fvBPAB_ModeChanged(sender, e); + if (gvBPAB.Rows.Count == 0) + { + //ParamList.Clear(); + DoAfterCommand("BPAA"); + } + break; + + case "Small": + DoAfterCommand("SMALL"); + break; + + case "Detail": + DoAfterCommand("DETAIL"); + break; + + case "Return": + //ParamList.Clear(); + DoAfterCommand("BPAA"); + break; + } + } + + protected void fvBPAB_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + + gvBPAB.DataBind(); + if (gvBPAB.SelectedIndex > gvBPAB.Rows.Count - 1) + { + gvBPAB.SelectedIndex = gvBPAB.Rows.Count - 1; + gvBPAB.DataBind(); + } + fvBPAB.DataBind(); + } + + protected void fvBPAB_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void fvBPAB_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void fvBPAB_ModeChanged(object sender, EventArgs e) + { + switch (fvBPAB.CurrentMode) + { + case FormViewMode.ReadOnly: + gvBPAB.Visible = true; + gvBPAB.DataBind(); + if (gvBPAB.Rows.Count > 0) + { + if (gvBPAB.SelectedIndex == -1) + { + gvBPAB.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert) + { + gvBPAB.PageIndex = gvBPAB.PageCount - 1; + gvBPAB.DataBind(); + gvBPAB.SelectedIndex = gvBPAB.Rows.Count - 1; + } + + fvBPAB.DataBind(); + } + break; + + case FormViewMode.Edit: + gvBPAB.Visible = false; + break; + + case FormViewMode.Insert: + gvBPAB.Visible = false; + break; + } + } + + protected void fvBPAB_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void fvBPAB_DataBound(object sender, EventArgs e) + { + switch (fvBPAB.CurrentMode) + { + case FormViewMode.Edit: + SetClientFocus(fvBPAB, "txtBPAB_BPAME"); + break; + case FormViewMode.Insert: + SetClientFocus(fvBPAB, "txtBPAB_BPAME"); + break; + case FormViewMode.ReadOnly: + if (fvBPAB.DataItem != null) + ViewState["OLD_BPORD"] = (fvBPAB.DataItem as DataRowView)["BPORD"].ToString(); + break; + } + } + + protected void fvBPAB_ItemCreated(object sender, EventArgs e) + { + switch (fvBPAB.CurrentMode) + { + case FormViewMode.Insert: + (fvBPAB.FindControl("lbBPAB_BPPYN") as ITextControl).Text = _BPPYN; + //(fvBPAB.FindControl("lbBPAB_BPYER") as ITextControl).Text = _BPYER.ToString(); + break; + } + } + + protected void gvBPAB_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(sender as GridView, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void gvBPAB_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in gvBPAB.Rows) + SetGridViewMouseBehavier(gvBPAB, row); + } + + protected void fvBPAB_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 刪除前檢查 + // 1. 是否已有科目設定 + DbCommand cmd1 = Query.NewCommand("SELECT COUNT(1) FROM BPAB WHERE BPPYN=@BPPYN AND BPACC >= @BPACC + '0001' AND BPACC <= @BPACC + '9999'"); + cmd1.Parameters.Add(Query.NewParameter("BPPYN", e.Values["BPPYN"])); + cmd1.Parameters.Add(Query.NewParameter("BPACC", e.Values["BPACC"].ToString().Substring(0, 2))); + int i = Convert.ToInt32(Query.ExecuteScalar(cmd1)); + if (i > 0) + { + cvMessage.ErrorMessage = "本大類之下有小類及科目。不可刪除!"; + cvMessage.IsValid = false; + e.Cancel = true; + } + } + + protected void cvBPORD_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = int.TryParse(args.Value, out i) && i > 0 && i < 100; + } +} diff --git a/Web/forms/customer/fmBpabSmall.ascx b/Web/forms/customer/fmBpabSmall.ascx new file mode 100644 index 0000000..1efbb6c --- /dev/null +++ b/Web/forms/customer/fmBpabSmall.ascx @@ -0,0 +1,526 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBpabSmall.ascx.cs" Inherits="forms_customer_fmBpabSmall" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + 專案年度名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 大類: + +
+ 小類名稱: + + 年度預算: + + 順序: +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + 專案年度名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 大類: +
+ 小類名稱: + + 年度預算: + + 順序: +
+
+ + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + 專案年度名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 大類: +
+ 小類名稱: + + 年度預算: + + 順序: +
+
+
+ + + + + + + + + + + + + + + + + + + + +
+
diff --git a/Web/forms/customer/fmBpabSmall.ascx.cs b/Web/forms/customer/fmBpabSmall.ascx.cs new file mode 100644 index 0000000..08ed2e3 --- /dev/null +++ b/Web/forms/customer/fmBpabSmall.ascx.cs @@ -0,0 +1,453 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; + +/// +/// 年度科目設定(小類) +/// +public partial class forms_customer_fmBpabSmall : Wellan.Web.UI.WUserControlBase +{ + protected string _BPNUM = ""; + protected string _BPPYN = ""; + private string _OLD_BPACC = ""; + private string select = "SELECT * "; + private string from = " FROM BPAB "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY BPPYN, BPCLS, BPORD"; + + protected void Page_Load(object sender, EventArgs e) + { + //if (IsPostBack) + // gvBPAB.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsBPABForm.ConnectionString = ConnectionString; + dsBPABGrid.ConnectionString = ConnectionString; + dsBPABBig.ConnectionString = ConnectionString; + + _BPNUM = GetStringParam("BPNUM"); + _BPPYN = GetStringParam("BPPYN"); + + dsBPABBig.SelectParameters["BPPYN"].DefaultValue = _BPPYN; + + GetGridViewRowColor(gvBPAB); + + Search(); + } + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + + dsBPABGrid.SelectParameters.Clear(); + AddSearch(sql, dsBPABGrid, "BPPYN", _BPPYN, "", true); + sql.Append(" AND SUBSTRING(BPACC,3,2) <> '00' AND SUBSTRING(BPACC,5,2) = '00' "); + sql.Append(order); + dsBPABGrid.SelectCommand = sql.ToString(); + } + + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + Decimal bpbgt; + if (Decimal.TryParse(e.Command.Parameters["@BPBGT"].Value.ToString(), out bpbgt)) + e.Command.Parameters["@BPBGT"].Value = bpbgt; + else + e.Command.Parameters["@BPBGT"].Value = 0; + } + + // 取得大類的排序號 + private string GetBigBPCLS(string bpacc, DbConnection conn, DbTransaction tran) + { + DbCommand cmd1 = Query.NewCommand("SELECT BPCLS FROM BPAB WHERE BPACC=@BPACC"); + cmd1.Connection = conn; + cmd1.Transaction = tran; + cmd1.Parameters.Add(Query.NewParameter("BPACC", bpacc.Substring(0, 2) + "0000")); + return cmd1.ExecuteScalar().ToString(); + } + + protected void dsBPABForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + string newBpacc = e.Command.Parameters["@BPACC"].Value.ToString(); + int newBpord = Convert.ToInt32(e.Command.Parameters["@BPORD"].Value); + e.Command.Connection.Open(); + e.Command.Parameters["@BPCLS"].Value = + String.Format("{0}{1:00}00", GetBigBPCLS(newBpacc, e.Command.Connection, e.Command.Transaction).Substring(0, 2), newBpord); + } + + protected void dsBPABForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + + e.Command.Connection.Open(); + e.Command.Transaction = e.Command.Connection.BeginTransaction(); + + // 修改自己的排序號碼 + int newBpord = Convert.ToInt32(e.Command.Parameters["@BPORD"].Value); + string oldBpcls = ViewState["OLD_BPCLS"] != null ? ViewState["OLD_BPCLS"].ToString() : ""; + string newBpacc = e.Command.Parameters["@BPACC"].Value.ToString(); + e.Command.Parameters["@BPCLS"].Value = + String.Format("{0}{1:00}00", GetBigBPCLS(newBpacc, e.Command.Connection, e.Command.Transaction).Substring(0, 2), newBpord); + } + + protected void dsBPABForm_Updated(object sender, SqlDataSourceStatusEventArgs e) + { + int newBpord = Convert.ToInt32(e.Command.Parameters["@BPORD"].Value); + int oldBpord = ViewState["OLD_BPORD"] != null && ViewState["OLD_BPORD"].ToString() != "" ? Convert.ToInt32(ViewState["OLD_BPORD"]) : 0; + string oldBpcls = ViewState["OLD_BPCLS"] != null ? ViewState["OLD_BPCLS"].ToString() : ""; + string newBpacc = e.Command.Parameters["@BPACC"].Value.ToString(); + string oldBpacc = e.Command.Parameters["@OLD_BPACC"].Value.ToString(); + + try + { + if (oldBpacc.Substring(0, 2) != newBpacc.Substring(0, 2) || newBpord != oldBpord) + { + StringBuilder sb = new StringBuilder(); + sb.Append("UPDATE BPAB SET TRDAT=GETDATE(), TRMOD='UPDATE', TRUSR=@TRUSR, APPNO = APPNO + 1 "); + DbCommand cmd = Query.NewCommand(); + cmd.Connection = e.Command.Connection; + cmd.Transaction = e.Command.Transaction; + cmd.Parameters.Add(Query.NewParameter("TRUSR", UserId)); + + // 取得新大類的排序號 + string newBigBpcls = GetBigBPCLS(newBpacc, e.Command.Connection, e.Command.Transaction); + + // 如果修改了大類,這個小類底下的科目都要移動過去 + if (oldBpacc.Substring(0, 2) != newBpacc.Substring(0, 2)) + { + sb.Append(" , BPACC = @NEW_BPACC + SUBSTRING(BPACC, 5, 2) "); + cmd.Parameters.Add(Query.NewParameter("NEW_BPACC", newBpacc.Substring(0, 4))); + + sb.Append(" , BPCLS = @NEW_BPORD + SUBSTRING(BPCLS, 5, 2) "); + cmd.Parameters.Add(Query.NewParameter("NEW_BPORD", newBigBpcls.Substring(0, 2) + newBpord.ToString("00"))); + } + // 如果修改了排序號,那麼小類底下的排序號也要移動過去 + else if (newBpord != oldBpord) + { + sb.Append(" , BPCLS = @NEW_BPORD + SUBSTRING(BPCLS, 5, 2) "); + cmd.Parameters.Add(Query.NewParameter("NEW_BPORD", newBigBpcls.Substring(0, 2) + newBpord.ToString("00"))); + } + + sb.Append(" WHERE SUBSTRING(BPACC, 1, 4)=@OLD_BPACC"); + cmd.CommandText = sb.ToString(); + cmd.Parameters.Add(Query.NewParameter("OLD_BPACC", oldBpacc.Substring(0, 4))); + cmd.ExecuteNonQuery(); + cmd.Dispose(); + } + + // 連鎖更新科目對應 + ChainUpdateBPAA(oldBpacc, newBpacc, e.Command.Transaction); + + e.Command.Transaction.Commit(); + e.Command.Connection.Close(); + } + catch + { + e.Command.Transaction.Rollback(); + e.Command.Connection.Close(); + } + } + + protected void gvBPAB_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (gvBPAB.Rows.Count > 0) + { + if (gvBPAB.SelectedIndex == -1) + gvBPAB.SelectedIndex = 0; + + fvBPAB.DataBind(); + + if (fvBPAB.DataItem != null) + { + ViewState["OLD_BPACC"] = (fvBPAB.DataItem as DataRowView)["BPACC"]; + ViewState["OLD_BPCLS"] = (fvBPAB.DataItem as DataRowView)["BPCLS"]; + ViewState["OLD_BPORD"] = (fvBPAB.DataItem as DataRowView)["BPORD"]; + } + } + } + + protected void gvBPAB_PageIndexChanged(object sender, EventArgs e) + { + Search(); + gvBPAB.SelectedIndex = 0; + gvBPAB.DataBind(); + } + + protected void dsBPABGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + gvBPAB.Visible = false; + fvBPAB.ChangeMode(FormViewMode.Insert); + fvBPAB_ModeChanged(sender, e); + } + } + + protected void fvBPAB_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Insert": + break; + case "Edit": + break; + case "Delete": + break; + case "Cancel": + Search(); + fvBPAB.ChangeMode(FormViewMode.ReadOnly); + fvBPAB_ModeChanged(sender, e); + if (gvBPAB.Rows.Count == 0) + DoAfterCommand("BIG"); + break; + + case "Big": + DoAfterCommand("BIG"); + break; + + case "Small": + DoAfterCommand("SMALL"); + break; + + case "Detail": + DoAfterCommand("DETAIL"); + break; + + case "Return": + //ParamList.Clear(); + DoAfterCommand("BPAA"); + break; + } + } + + protected void fvBPAB_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + + gvBPAB.DataBind(); + if (gvBPAB.SelectedIndex > gvBPAB.Rows.Count - 1) + { + gvBPAB.SelectedIndex = gvBPAB.Rows.Count - 1; + gvBPAB.DataBind(); + } + fvBPAB.DataBind(); + } + + protected void fvBPAB_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void fvBPAB_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void fvBPAB_ModeChanged(object sender, EventArgs e) + { + switch (fvBPAB.CurrentMode) + { + case FormViewMode.ReadOnly: + gvBPAB.Visible = true; + gvBPAB.DataBind(); + if (gvBPAB.Rows.Count > 0) + { + if (gvBPAB.SelectedIndex == -1) + { + gvBPAB.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert) + { + gvBPAB.PageIndex = gvBPAB.PageCount - 1; + gvBPAB.DataBind(); + gvBPAB.SelectedIndex = gvBPAB.Rows.Count - 1; + } + + fvBPAB.DataBind(); + } + break; + + case FormViewMode.Edit: + gvBPAB.Visible = false; + break; + + case FormViewMode.Insert: + gvBPAB.Visible = false; + break; + } + } + + protected void fvBPAB_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void fvBPAB_DataBound(object sender, EventArgs e) + { + switch (fvBPAB.CurrentMode) + { + case FormViewMode.Edit: + SetClientFocus(fvBPAB, "txtBPAB_BPAME"); + break; + case FormViewMode.Insert: + SetClientFocus(fvBPAB, "txtBPAB_BPAME"); + break; + case FormViewMode.ReadOnly: + if (fvBPAB.DataItem != null) + { + ViewState["OLD_BPACC"] = (fvBPAB.DataItem as DataRowView)["BPACC"]; + ViewState["OLD_BPCLS"] = (fvBPAB.DataItem as DataRowView)["BPCLS"]; + ViewState["OLD_BPORD"] = (fvBPAB.DataItem as DataRowView)["BPORD"]; + } + break; + } + } + + protected void fvBPAB_ItemCreated(object sender, EventArgs e) + { + switch (fvBPAB.CurrentMode) + { + case FormViewMode.Insert: + (fvBPAB.FindControl("lbBPAB_BPNUM") as ITextControl).Text = _BPNUM; + (fvBPAB.FindControl("lbBPAB_BPPYN") as ITextControl).Text = _BPPYN; + break; + } + } + + protected void gvBPAB_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(sender as GridView, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void gvBPAB_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in gvBPAB.Rows) + SetGridViewMouseBehavier(gvBPAB, row); + } + + // 取得大類名稱 + protected string GetBPACCBig(string bpacc) + { + DbCommand cmd = Query.NewCommand("SELECT BPAME FROM BPAB WHERE BPPYN=@BPPYN AND BPACC=@BPACC"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", _BPPYN)); + cmd.Parameters.Add(Query.NewParameter("BPACC", bpacc.Substring(0, 2) + "0000")); + object o = Query.ExecuteScalar(cmd); + if (o == null || o == DBNull.Value) + return ""; + else + return o.ToString(); + } + + // 取得自動編號的科目編號 + private string GetNewBPACC(string bpaccBig) + { + return WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "BPAB", "BPACC", String.Format("\"{0}\"<99>\"00\"", bpaccBig.Substring(0, 2)), string.Format(" BPPYN='{0}'", _BPPYN)); + } + + protected void fvBPAB_ItemInserting(object sender, FormViewInsertEventArgs e) + { + string bpaccBig = (fvBPAB.FindControl("dlBPAB_BPACCBig") as DropDownList).SelectedValue; + e.Values["BPACC"] = GetNewBPACC(bpaccBig); + } + + protected void fvBPAB_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + _OLD_BPACC = ViewState["OLD_BPACC"] != null ? ViewState["OLD_BPACC"].ToString() : ""; + string bpaccBig = (fvBPAB.FindControl("dlBPAB_BPACCBig") as DropDownList).SelectedValue; + if (_OLD_BPACC.Substring(0, 2) != bpaccBig.Substring(0, 2)) + e.NewValues["BPACC"] = GetNewBPACC(bpaccBig); + } + + protected void cvBPORD_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = int.TryParse(args.Value, out i) && i > 0 && i < 100; + } + + protected void fvBPAB_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 刪除前檢查 + // 1. 是否已有科目設定 + DbCommand cmd1 = Query.NewCommand("SELECT COUNT(1) FROM BPAB WHERE BPPYN=@BPPYN AND BPACC >= @BPACC + '01' AND BPACC <= @BPACC + '99'"); + cmd1.Parameters.Add(Query.NewParameter("BPPYN", e.Values["BPPYN"])); + cmd1.Parameters.Add(Query.NewParameter("BPACC", e.Values["BPACC"].ToString().Substring(0, 4))); + int i = Convert.ToInt32(Query.ExecuteScalar(cmd1)); + if (i > 0) + { + cvMessage.ErrorMessage = "本小類之下有科目。不可刪除!"; + cvMessage.IsValid = false; + e.Cancel = true; + } + } + + protected void dsBPABForm_Deleting(object sender, SqlDataSourceCommandEventArgs e) + { + e.Command.Connection.Open(); + e.Command.Transaction = e.Command.Connection.BeginTransaction(); + } + + protected void ChainUpdateBPAA(string old_bpacc, string new_bpacc, DbTransaction tran) + { + // 取得專案科目對應資料 + GetData gd = new GetData(); + gd.Query = Query; + DataTable bpaa = gd.GetBPAA_BPPYN(_BPPYN); + DataRow bpaaRow = bpaa.Rows[0]; + DbCommand cmdUpdateBPAA = Query.NewCommand(); + cmdUpdateBPAA.Connection = tran.Connection; + cmdUpdateBPAA.Transaction = tran; + cmdUpdateBPAA.Parameters.Add(Query.NewParameter("TRUSR", UserId)); + cmdUpdateBPAA.Parameters.Add(Query.NewParameter("BPPYN", _BPPYN)); + cmdUpdateBPAA.Parameters.Add(Query.NewParameter("BPSXX", new_bpacc)); + + // 核對科目對應資料,如果已有科目對應,則清除科目對應 + string[] fieldNames = {"BPS01", "BPS02", "BPS03", "BPS04", "BPS05", + "BPS06", "BPS07", "BPS08", "BPS09", "BPS10", + "BPS11", "BPS12", "BPS13", "BPS14", "BPS15", + "BPS16", "BPS17", "BPS18", "BPS19", "BPS20", + "BPS21", "BPS22", "BPS23", "BPS24", "BPS25", + "BPS26", "BPS27", "BPS28", "BPS29", "BPS30"}; + for (int i = 0; i < fieldNames.Length; i++) + { + if (bpaaRow[fieldNames[i]] != DBNull.Value && bpaaRow[fieldNames[i]].ToString() == old_bpacc) + { + cvMessage.ErrorMessage += String.Format("\"{0}\" 的科目對應因科目刪除而清除
", GetString("BPAA." + fieldNames[i])); + cmdUpdateBPAA.CommandText = String.Format("UPDATE BPAA SET {0}=@BPSXX, TRDAT=GETDATE(), TRMOD='UPDATE', TRUSR=@TRUSR WHERE BPPYN=@BPPYN", fieldNames[i]); + cmdUpdateBPAA.ExecuteNonQuery(); + } + } + } + + protected void dsBPABForm_Deleted(object sender, SqlDataSourceStatusEventArgs e) + { + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + ChainUpdateBPAA(e.Command.Parameters["@OLD_BPACC"].Value.ToString(), "", e.Command.Transaction); + e.Command.Transaction.Commit(); + e.Command.Connection.Close(); + cvMessage.IsValid = cvMessage.ErrorMessage == ""; + } +} diff --git a/Web/forms/customer/fmBpja.ascx b/Web/forms/customer/fmBpja.ascx new file mode 100644 index 0000000..bcf11ec --- /dev/null +++ b/Web/forms/customer/fmBpja.ascx @@ -0,0 +1,463 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBpja.ascx.cs" Inherits="forms_customer_fmBpja" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 專案年度編號: + + 專案年度名稱: + +
+ 客戶編號: + + 客戶名稱: + +
+ 職稱代號: + + 職稱類別: + + + + 人數: + + +
+ 職稱名稱: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 專案年度編號: + + 專案年度名稱: + +
+ 客戶編號: + + 客戶名稱: + +
+ 職稱代號: + (自動編號) + 職稱類別: + + + + + 人數: + + +
+ 職稱名稱: + + + + + + +
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 專案年度編號: + + 專案年度名稱: + +
+ 客戶編號: + + 客戶名稱: + +
+ 職稱代號: + + 職稱類別: + + + + + 人數: + + +
+ 職稱名稱: + + + + + + +
+ + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
+
diff --git a/Web/forms/customer/fmBpja.ascx.cs b/Web/forms/customer/fmBpja.ascx.cs new file mode 100644 index 0000000..28e1a6f --- /dev/null +++ b/Web/forms/customer/fmBpja.ascx.cs @@ -0,0 +1,293 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; + +/// +/// 年度職稱設定 +/// +public partial class forms_customer_fmBpja : Wellan.Web.UI.WUserControlBase +{ + protected string _BPNUM = ""; + protected string _BPPYN = ""; + private string select = "SELECT * "; + private string from = " FROM BPJA "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY BPPYN, BPJNO"; + + protected void Page_Load(object sender, EventArgs e) + { + //if (IsPostBack) + // gvBPJA.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsBPJAForm.ConnectionString = ConnectionString; + dsBPJAGrid.ConnectionString = ConnectionString; + + _BPPYN = GetStringParam("BPPYN"); + _BPNUM = GetStringParam("BPNUM"); + + GetGridViewRowColor(gvBPJA); + + Search(); + } + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsBPJAGrid.SelectParameters.Clear(); + AddSearch(sql, dsBPJAGrid, "BPPYN", _BPPYN, "", true); + sql.Append(order); + dsBPJAGrid.SelectCommand = sql.ToString(); + } + + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + } + + protected void dsBPJAForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + e.Command.Parameters["@BPPYN"].Value = _BPPYN; + e.Command.Parameters["@BPJNO"].Value = WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "BPJA", "BPJNO", "", String.Format(" BPPYN='{0}'", _BPPYN)); + } + + protected void dsBPJAForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + } + + protected void gvBPJA_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (gvBPJA.Rows.Count > 0) + { + if (gvBPJA.SelectedIndex == -1) + gvBPJA.SelectedIndex = 0; + + // 返回時,回到之前選擇的那一筆 + // BPPYN,BPJNO + if (ParamList.ContainsKey("BPPYN") && ParamList.ContainsKey("BPJNO")) + { + DataView dv = dsBPJAGrid.Select(new DataSourceSelectArguments()) as DataView; + dv.RowFilter = String.Format("BPPYN='{0}' and BPJNO='{1}'", ParamList["BPPYN"], ParamList["BPJNO"]); + if (dv.Count > 0) + { + int rowIndex = dv.Table.Rows.IndexOf(dv[0].Row); + gvBPJA.PageIndex = (rowIndex / gvBPJA.PageSize); + gvBPJA.SelectedIndex = rowIndex - gvBPJA.PageIndex * gvBPJA.PageSize; + } + + // ParamList.Remove("BPPYN"); + ParamList.Remove("BPJNO"); + } + + fvBPJA.DataBind(); + } + } + + protected void gvBPJA_PageIndexChanged(object sender, EventArgs e) + { + Search(); + gvBPJA.SelectedIndex = 0; + gvBPJA.DataBind(); + } + + protected void dsBPJAGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + fvBPJA.ChangeMode(FormViewMode.Insert); + fvBPJA_ModeChanged(sender, e); + } + } + + protected void fvBPJA_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Insert": + break; + case "Edit": + break; + case "Cancel": + Search(); + fvBPJA.ChangeMode(FormViewMode.ReadOnly); + fvBPJA_ModeChanged(sender, e); + if (gvBPJA.Rows.Count == 0) + DoAfterCommand("BPAA"); + break; + case "Return": + DoAfterCommand("BPAA"); + break; + case "Detail": + fvBPJA.DataBind(); + if (fvBPJA.DataItem != null) + { + DataRowView rv = fvBPJA.DataItem as DataRowView; + ParamList["BPPYN"] = rv["BPPYN"]; + ParamList["BPJNO"] = rv["BPJNO"]; + ParamList["BPJME"] = rv["BPJME"]; + DoAfterCommand("BPJB"); + } + break; + } + } + + protected void fvBPJA_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + gvBPJA.DataBind(); + if (gvBPJA.SelectedIndex > gvBPJA.Rows.Count - 1) + { + gvBPJA.SelectedIndex = gvBPJA.Rows.Count - 1; + gvBPJA.DataBind(); + } + fvBPJA.DataBind(); + } + + protected void fvBPJA_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void fvBPJA_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void fvBPJA_ModeChanged(object sender, EventArgs e) + { + switch (fvBPJA.CurrentMode) + { + case FormViewMode.ReadOnly: + gvBPJA.Visible = true; + gvBPJA.DataBind(); + if (gvBPJA.Rows.Count > 0) + { + if (gvBPJA.SelectedIndex == -1) + { + gvBPJA.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert) + { + gvBPJA.PageIndex = gvBPJA.PageCount - 1; + gvBPJA.DataBind(); + gvBPJA.SelectedIndex = gvBPJA.Rows.Count - 1; + } + gvBPJA.DataBind(); + fvBPJA.DataBind(); + } + break; + + case FormViewMode.Edit: + gvBPJA.Visible = false; + break; + + case FormViewMode.Insert: + gvBPJA.Visible = false; + break; + } + } + + protected void fvBPJA_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void fvBPJA_DataBound(object sender, EventArgs e) + { + switch (fvBPJA.CurrentMode) + { + case FormViewMode.Edit: + Control ddlBPJA_BPCLS = fvBPJA.FindControl("ddlBPJA_BPCLS"); + RegisterLookupEvent(fvBPJA, "txtBPJA_BPJME_WQRY", "txtBPJA_BPJME", "txtBPJA_BPJME", "BCLS_BPJA_BPNAM", " BSCLS LIKE '\" + document.getElementById(\"" + ddlBPJA_BPCLS.ClientID + "\").value + \"%'"); + SetClientFocus(fvBPJA, "txtBPJA_BPJME"); + break; + case FormViewMode.Insert: + ddlBPJA_BPCLS = fvBPJA.FindControl("ddlBPJA_BPCLS"); + RegisterLookupEvent(fvBPJA, "txtBPJA_BPJME_WQRY", "txtBPJA_BPJME", "txtBPJA_BPJME", "BCLS_BPJA_BPNAM", " BSCLS LIKE '\" + document.getElementById(\"" + ddlBPJA_BPCLS.ClientID + "\").value + \"%'"); + SetClientFocus(fvBPJA, "txtBPJA_BPJME"); + break; + } + } + + protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args) + { + CustomValidator v = source as CustomValidator; + int i; + args.IsValid = args.Value != "" && int.TryParse(args.Value, out i) && i > 0; + } + + protected void fvBPJA_ItemCreated(object sender, EventArgs e) + { + switch (fvBPJA.CurrentMode) + { + case FormViewMode.Insert: + (fvBPJA.FindControl("lbBPJA_BPPYN") as ITextControl).Text = _BPPYN; + break; + } + } + + protected void gvBPJA_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(gvBPJA, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void gvBPJA_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in gvBPJA.Rows) + SetGridViewMouseBehavier(gvBPJA, row); + } + + protected void fvBPJA_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 刪除前檢查 + // 1. 是否已有科目設定 + DbCommand cmd1 = Query.NewCommand("SELECT COUNT(1) FROM BPJB WHERE BPPYN=@BPPYN AND BPJNO=@BPJNO"); + cmd1.Parameters.Add(Query.NewParameter("BPPYN", e.Values["BPPYN"])); + cmd1.Parameters.Add(Query.NewParameter("BPJNO", e.Values["BPJNO"])); + int i = Convert.ToInt32(Query.ExecuteScalar(cmd1)); + cmd1.Dispose(); + if (i > 0) + { + cvMessage.ErrorMessage = "本職稱已有等級設定。不可刪除!"; + cvMessage.IsValid = false; + e.Cancel = true; + } + + // 2. 是否有派遣人員使用此職稱 + DbCommand cmd2 = Query.NewCommand("SELECT COUNT(1) FROM RASN WHERE RAPYN=@BPPYN AND RAJNO=@BPJNO"); + cmd2.Parameters.Add(Query.NewParameter("BPPYN", e.Values["BPPYN"])); + cmd2.Parameters.Add(Query.NewParameter("BPJNO", e.Values["BPJNO"])); + i = Convert.ToInt32(Query.ExecuteScalar(cmd2)); + cmd2.Dispose(); + if (i > 0) + { + cvMessage.ErrorMessage = "本職稱已有派遣人員使用。不可刪除!"; + cvMessage.IsValid = false; + e.Cancel = true; + } + } +} diff --git a/Web/forms/customer/fmBpjb.ascx b/Web/forms/customer/fmBpjb.ascx new file mode 100644 index 0000000..66fc407 --- /dev/null +++ b/Web/forms/customer/fmBpjb.ascx @@ -0,0 +1,789 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBpjb.ascx.cs" Inherits="forms_customer_fmBpjb" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + 專案年度名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 職稱代號: + + 職稱名稱: +
+ 等級代號: + + 等級名稱: +
+ 月薪: + + 時薪: + + 全勤獎金: + + 伙食津貼: + + +
+ 職務加給: + + 派駐津貼: + + 其他津貼: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + 專案年度名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 職稱代號: + + 職稱名稱: +
+ 等級代號: + + 等級名稱: + +
+ 月薪: + + + 時薪: + + + 全勤獎金: + + + 伙食津貼: + + +
+ 職務加給: + + + 派駐津貼: + + + 其他津貼: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + 專案年度名稱: +
+ 客戶編號: + + 客戶名稱: +
+ 職稱代號: + + 職稱名稱: +
+ 等級代號: + + 等級名稱: + +
+ 月薪: + + + 時薪: + + + 全勤獎金: + + + 伙食津貼: + + +
+ 職務加給: + + + 派駐津貼: + + + 其他津貼: + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/Web/forms/customer/fmBpjb.ascx.cs b/Web/forms/customer/fmBpjb.ascx.cs new file mode 100644 index 0000000..21dd28b --- /dev/null +++ b/Web/forms/customer/fmBpjb.ascx.cs @@ -0,0 +1,276 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; + +/// +/// 職稱等級設定 +/// +public partial class forms_customer_fmBpjb : Wellan.Web.UI.WUserControlBase +{ + protected string _BPNUM = ""; + protected string _BPPYN = ""; + protected string _BPJNO = ""; + protected string _BPJME = ""; + private string select = "SELECT * "; + private string from = " FROM BPJB "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY BPPYN, BPJNO, BPCNO"; + + protected void Page_Load(object sender, EventArgs e) + { + //if (IsPostBack) + // gvBPJB.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsBPJBForm.ConnectionString = ConnectionString; + dsBPJBGrid.ConnectionString = ConnectionString; + + _BPNUM = GetStringParam("BPNUM"); + _BPPYN = GetStringParam("BPPYN"); + _BPJNO = GetStringParam("BPJNO"); + _BPJME = GetStringParam("BPJME"); + + GetGridViewRowColor(gvBPJB); + + Search(); + } + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsBPJBGrid.SelectParameters.Clear(); + AddSearch(sql, dsBPJBGrid, "BPPYN", _BPPYN, "", true); + AddSearch(sql, dsBPJBGrid, "BPJNO", _BPJNO, "", true); + sql.Append(order); + dsBPJBGrid.SelectCommand = sql.ToString(); + } + + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + if (e.Command.Parameters["@BPSRM"].Value == null || e.Command.Parameters["@BPSRM"].Value.ToString() == "") + e.Command.Parameters["@BPSRM"].Value = 0; + if (e.Command.Parameters["@BPSRD"].Value == null || e.Command.Parameters["@BPSRD"].Value.ToString() == "") + e.Command.Parameters["@BPSRD"].Value = 0; + if (e.Command.Parameters["@BPP01"].Value == null || e.Command.Parameters["@BPP01"].Value.ToString() == "") + e.Command.Parameters["@BPP01"].Value = 0; + if (e.Command.Parameters["@BPP03"].Value == null || e.Command.Parameters["@BPP03"].Value.ToString() == "") + e.Command.Parameters["@BPP03"].Value = 0; + if (e.Command.Parameters["@BPP04"].Value == null || e.Command.Parameters["@BPP04"].Value.ToString() == "") + e.Command.Parameters["@BPP04"].Value = 0; + if (e.Command.Parameters["@BPP05"].Value == null || e.Command.Parameters["@BPP05"].Value.ToString() == "") + e.Command.Parameters["@BPP05"].Value = 0; + + // 伙食費固定為 1800 + // e.Command.Parameters["@BPP02"].Value = 1800; + } + + protected void dsBPJBForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + e.Command.Parameters["@BPPYN"].Value = _BPPYN; + e.Command.Parameters["@BPJNO"].Value = _BPJNO; + e.Command.Parameters["@BPCNO"].Value = WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "BPJB", "BPCNO", "", String.Format(" BPPYN='{0}' AND BPJNO='{1}'", _BPPYN, _BPJNO)); + } + + protected void dsBPJBForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + } + + protected void gvBPJB_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (gvBPJB.Rows.Count > 0) + { + if (gvBPJB.SelectedIndex == -1) + gvBPJB.SelectedIndex = 0; + fvBPJB.DataBind(); + } + } + + protected void gvBPJB_PageIndexChanged(object sender, EventArgs e) + { + Search(); + gvBPJB.SelectedIndex = 0; + gvBPJB.DataBind(); + } + + protected void dsBPJBGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + fvBPJB.ChangeMode(FormViewMode.Insert); + fvBPJB_ModeChanged(sender, e); + } + } + + protected void fvBPJB_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Insert": + break; + case "Edit": + break; + case "Cancel": + Search(); + fvBPJB.ChangeMode(FormViewMode.ReadOnly); + fvBPJB_ModeChanged(sender, e); + if (gvBPJB.Rows.Count == 0) + DoAfterCommand("BPJA"); + break; + case "Return": + DoAfterCommand("BPJA"); + break; + } + } + + protected void fvBPJB_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + gvBPJB.DataBind(); + if (gvBPJB.SelectedIndex > gvBPJB.Rows.Count - 1) + { + gvBPJB.SelectedIndex = gvBPJB.Rows.Count - 1; + gvBPJB.DataBind(); + } + fvBPJB.DataBind(); + } + + protected void fvBPJB_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void fvBPJB_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void fvBPJB_ModeChanged(object sender, EventArgs e) + { + switch (fvBPJB.CurrentMode) + { + case FormViewMode.ReadOnly: + gvBPJB.Visible = true; + gvBPJB.DataBind(); + if (gvBPJB.Rows.Count > 0) + { + if (gvBPJB.SelectedIndex == -1) + { + gvBPJB.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert) + { + gvBPJB.PageIndex = gvBPJB.PageCount - 1; + gvBPJB.DataBind(); + gvBPJB.SelectedIndex = gvBPJB.Rows.Count - 1; + } + gvBPJB.DataBind(); + fvBPJB.DataBind(); + } + break; + + case FormViewMode.Edit: + gvBPJB.Visible = false; + break; + + case FormViewMode.Insert: + gvBPJB.Visible = false; + break; + } + } + + protected void fvBPJB_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void fvBPJB_DataBound(object sender, EventArgs e) + { + switch (fvBPJB.CurrentMode) + { + case FormViewMode.Edit: + SetClientFocus(fvBPJB, "txtBPJB_BPCME"); + break; + case FormViewMode.Insert: + (fvBPJB.FindControl("txtBPJB_BPSRM") as ITextControl).Text = "0"; + (fvBPJB.FindControl("txtBPJB_BPSRD") as ITextControl).Text = "0"; + (fvBPJB.FindControl("txtBPJB_BPP01") as ITextControl).Text = "0"; + (fvBPJB.FindControl("txtBPJB_BPP02") as ITextControl).Text = "0"; + (fvBPJB.FindControl("txtBPJB_BPP03") as ITextControl).Text = "0"; + (fvBPJB.FindControl("txtBPJB_BPP04") as ITextControl).Text = "0"; + (fvBPJB.FindControl("txtBPJB_BPP05") as ITextControl).Text = "0"; + SetClientFocus(fvBPJB, "txtBPJB_BPCME"); + break; + } + } + + protected void fvBPJB_ItemCreated(object sender, EventArgs e) + { + switch (fvBPJB.CurrentMode) + { + case FormViewMode.Insert: + (fvBPJB.FindControl("lbBPJB_BPPYN") as ITextControl).Text = _BPPYN; + (fvBPJB.FindControl("lbBPJB_BPNUM") as ITextControl).Text = _BPNUM; + break; + } + } + + protected void gvBPJB_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(gvBPJB, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void gvBPJB_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in gvBPJB.Rows) + SetGridViewMouseBehavier(gvBPJB, row); + } + + protected void fvBPJB_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 刪除前檢查 + // 是否有派遣人員使用此職稱 + DbCommand cmd1 = Query.NewCommand("SELECT COUNT(1) FROM RASN WHERE RAPYN=@BPPYN AND RAJNO=@BPJNO AND RACNO=@BPCNO"); + cmd1.Parameters.Add(Query.NewParameter("BPPYN", e.Values["BPPYN"])); + cmd1.Parameters.Add(Query.NewParameter("BPJNO", e.Values["BPJNO"])); + cmd1.Parameters.Add(Query.NewParameter("BPCNO", e.Values["BPCNO"])); + int i = Convert.ToInt32(Query.ExecuteScalar(cmd1)); + cmd1.Dispose(); + if (i > 0) + { + cvMessage.ErrorMessage = "本職稱等級已有派遣人員使用。不可刪除!"; + cvMessage.IsValid = false; + e.Cancel = true; + } + } + + protected void cvBPSRM_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i >= 0 && i <= 999999; + } +} diff --git a/Web/forms/customer/fmBprj.ascx b/Web/forms/customer/fmBprj.ascx new file mode 100644 index 0000000..4f42648 --- /dev/null +++ b/Web/forms/customer/fmBprj.ascx @@ -0,0 +1,869 @@ + +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBprj.ascx.cs" Inherits="forms_customer_fmBprj" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<%-- + + + --%> + + + + + + + + + + + + + + + + + + + + + + + +
+ 公司別: + + +
+ 專案編號: + + + + 專案名稱: + + +
+ 客戶編號: + + 客戶名稱: +
+ 專案主管: + + + 專案地點: + +
+ 專案聯絡人: + + + 聯絡人電話: + +
+ 上班時間: + + 下班時間: + + 預設班表: + + + 是否需輪班: +
+ 前二加班: + + 後二加班: + + 假日加班: +
+ 加班費計算方式: + + 請假計算方式: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<%-- + + + --%> + + + + + + + + + + + + + + + + + + +
+ 公司別: + + + +
+ 專案編號: + + + + 專案名稱: + + +
+ 客戶編號: + + + + + + +
+ +
+
+ 客戶名稱: + +
+ 專案主管: + + + + 專案地點: + + +
+ 專案聯絡人: + + + + 聯絡人電話: + + +
+ 上班時間: + + 下班時間: + + 預設班表: + + +
+ 前二加班: + + 後二加班: + + 假日加班: +
+ 加班費計算方式: + + + 請假計算方式: + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<%-- + + + --%> + + + + + + + + + + + + + + + + + + +
+ 業態: + + + + + 公司別: + + + +
+ 專案編號: + + + + 專案名稱: + + +
+ 客戶編號: + + + + + + +
+ + + +
+
+ 客戶名稱: + + +
+ 專案主管: + + + + 專案地點: + + +
+ 專案聯絡人: + + + + 聯絡人電話: + + +
+ 上班時間: + + + + 下班時間: + + + + 預設班表: + + + +
+ 前二加班: + + + + 後二加班: + + + + 假日加班: + + +
+ 加班費計算方式: + + + + + 請假計算方式: + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/Web/forms/customer/fmBprj.ascx.cs b/Web/forms/customer/fmBprj.ascx.cs new file mode 100644 index 0000000..04efc9c --- /dev/null +++ b/Web/forms/customer/fmBprj.ascx.cs @@ -0,0 +1,420 @@ +/****************************************************************************** + * 程式名稱:fmBprj 客戶專案處理 + * 作 者:楊樹人 + * 日 期:2007/12/06 + ******************************************************************************/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Data.Common; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.HtmlControls; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using Wellan.Common; +using Wellan.Data; + +/// +/// 客戶專案處理 +/// +public partial class forms_customer_fmBprj : Wellan.Web.UI.WUserControlBase +{ + private string _BPNUM = ""; + private string _BPPNM = ""; + private string _BPPME = ""; + //private string _CurrentBPNUM = ""; + //private string _CurrentBPPNM = ""; + private string select = "SELECT *, (SELECT TOP 1 BPYER FROM BPAA WHERE BPAA.BPPNM = BPRJ.BPPNM ORDER BY BPYER DESC) LAST_YEAR "; + private string from = " FROM BPRJ "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY LAST_YEAR DESC"; + + protected void Page_Load(object sender, EventArgs e) + { + _BPNUM = ViewState["BPNUM"] != null ? ViewState["BPNUM"].ToString() : ""; + _BPPNM = ViewState["BPPNM"] != null ? ViewState["BPPNM"].ToString() : ""; + _BPPME = ViewState["BPPME"] != null ? ViewState["BPPME"].ToString() : ""; + //_CurrentBPNUM = ViewState["CurrentBPNUM"] != null ? ViewState["CurrentBPNUM"].ToString() : ""; + //_CurrentBPPNM = ViewState["CurrentBPPNM"] != null ? ViewState["CurrentBPPNM"].ToString() : ""; + //if (IsPostBack) + // gvBPRJ.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsBPRJForm.ConnectionString = ConnectionString; + dsBPRJGrid.ConnectionString = ConnectionString; + + _BPNUM = ForwardSource != "" ? GetStringParam("BCNUM") : _BPNUM; + + GetGridViewRowColor(gvBPRJ); + + switch (MultiView1.ActiveViewIndex) + { + case 0: + { + if (ForwardSource != "") + { + btnCancel.Text = "C.返回客戶資料"; + btnCancel.Width = new Unit(105); + } + SetClientFocus(txtBPPNM); + break; + } + case 1: + { + Search(); + break; + } + } + } + + // 查詢畫面的查詢按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + ViewState["BPNUM"] = txtBPNUM.Text; + ViewState["BPPNM"] = txtBPPNM.Text; + ViewState["BPPME"] = txtBPPME.Text; + + _BPNUM = txtBPNUM.Text; + _BPPNM = txtBPPNM.Text; + _BPPME = txtBPPME.Text; + + if (_BPNUM.Length == 0 && + _BPPNM.Length == 0 && + _BPPME.Length == 0) + { + cvMessage.ErrorMessage = GetString("NOSRHCOND"); + cvMessage.IsValid = false; + } + else + { + MultiView1.ActiveViewIndex = 1; + + Search(); + + gvBPRJ.PageIndex = 0; + gvBPRJ.SelectedIndex = 0; + gvBPRJ.DataBind(); + } + } + + // 查詢畫面的新增按鈕 + protected void btnInsert_Click(object sender, EventArgs e) + { + gvBPRJ.Visible = false; + fvBPRJ.ChangeMode(FormViewMode.Insert); + MultiView1.ActiveViewIndex = 1; + } + + // 查詢畫面的取消按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + MultiView1.ActiveViewIndex = 1; + if (ForwardSource != "") + DoAfterCommand("BCUS"); + } + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsBPRJGrid.SelectParameters.Clear(); + AddSearch(sql, dsBPRJGrid, "BPNUM", _BPNUM, "", true); + AddSearch(sql, dsBPRJGrid, "BPPNM", _BPPNM, "", true); + AddSearch(sql, dsBPRJGrid, "BPPME", "%" + _BPPME, "", true); + sql.Append(order); + dsBPRJGrid.SelectCommand = sql.ToString(); + } + + protected string GetBtmeName(object bptme) + { + var btmestr = (bptme == null || bptme == DBNull.Value) ? null : bptme.ToString(); + var dv = dsBTME.Select() as List; + if (dv == null) { return btmestr; } + var btmeItem = dv.FirstOrDefault(p => p.BTTID == btmestr); + if (btmeItem != null) { return btmeItem.BTNME; } + return btmestr; + } + + protected void gvBPRJ_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (gvBPRJ.SelectedIndex == -1) + gvBPRJ.SelectedIndex = 0; + + // 返回時,回到之前選擇的那一筆 + if (ParamList.ContainsKey("BPNUM") && ParamList.ContainsKey("BPPNM")) + { + string bpnum = WDAC.GetStringValue(ParamList["BPNUM"]); + string bppnm = WDAC.GetStringValue(ParamList["BPPNM"]); + + DataView dv = dsBPRJGrid.Select(new DataSourceSelectArguments()) as DataView; + dv.RowFilter = String.Format("BPNUM='{0}' and BPPNM='{1}'", bpnum, bppnm); + if (dv.Count > 0) + { + int rowIndex = dv.Table.Rows.IndexOf(dv[0].Row); + gvBPRJ.PageIndex = (rowIndex / gvBPRJ.PageSize); + gvBPRJ.SelectedIndex = rowIndex - gvBPRJ.PageIndex * gvBPRJ.PageSize; + } + + ParamList.Remove("BPNUM"); + ParamList.Remove("BPPNM"); + } + + fvBPRJ.DataBind(); + } + + protected void gvBPRJ_PageIndexChanged(object sender, EventArgs e) + { + Search(); + gvBPRJ.SelectedIndex = 0; + gvBPRJ.DataBind(); + } + + // 資料擷取完後的事件 + protected void dsBPRJGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + // 沒有資料,回到查詢畫面 + if (e.AffectedRows == 0) + { + if (MultiView1.ActiveViewIndex != 0) + MultiView1.ActiveViewIndex = 0; + + if (ForwardSource == "") + cvMessage.ErrorMessage = GetString("NODATA"); + else + { + cvMessage.ErrorMessage = "此客戶沒有專案資料,請重新輸入條件查詢"; + btnCancel.Text = "C.返回客戶資料"; + btnCancel.Width = new Unit(105); + } + + SetClientFocus(txtBPPNM); + cvMessage.IsValid = false; + } + } + + protected void fvBPRJ_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Search": + MultiView1.ActiveViewIndex = 0; + SetClientFocus(txtBPPNM); + break; + case "Cancel": + Search(); + fvBPRJ.ChangeMode(FormViewMode.ReadOnly); + fvBPRJ_ModeChanged(sender, e); + break; + case "BPAA": + case "BPRM": + fvBPRJ.DataBind(); + + if (fvBPRJ.DataItem != null) + { + DataRowView rv = fvBPRJ.DataItem as DataRowView; + // ParamList.Clear(); + ParamList.Add("BPNUM", rv["BPNUM"]); + ParamList.Add("BPPNM", rv["BPPNM"]); + DoAfterCommand(e.CommandName); + } + break; + case "BCUS": + DoAfterCommand("BCUS"); + break; + } + } + + protected void fvBPRJ_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + gvBPRJ.DataBind(); + if (gvBPRJ.SelectedIndex > gvBPRJ.Rows.Count - 1) + { + gvBPRJ.SelectedIndex = gvBPRJ.Rows.Count - 1; + gvBPRJ.DataBind(); + } + fvBPRJ.DataBind(); + } + + protected void fvBPRJ_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void fvBPRJ_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + // FormView 模式切換後的事件 + protected void fvBPRJ_ModeChanged(object sender, EventArgs e) + { + if (fvBPRJ.CurrentMode == FormViewMode.ReadOnly) + { + gvBPRJ.Visible = true; + gvBPRJ.DataBind(); + if (gvBPRJ.Rows.Count > 0 && gvBPRJ.SelectedIndex == -1) + { + gvBPRJ.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert) + { + gvBPRJ.PageIndex = gvBPRJ.PageCount - 1; + gvBPRJ.DataBind(); + gvBPRJ.SelectedIndex = gvBPRJ.Rows.Count - 1; + } + + fvBPRJ.DataBind(); + } + else + { + gvBPRJ.Visible = false; + } + } + + protected void fvBPRJ_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void fvBPRJ_DataBound(object sender, EventArgs e) + { + if (fvBPRJ.CurrentMode == FormViewMode.Insert || fvBPRJ.CurrentMode == FormViewMode.Edit) + { + RegisterLookupEvent(fvBPRJ, "btnBPRJ_BPNUM_WQRY", "txtBPRJ_BPNUM", "txtBPRJ_BPNUM,lbBPRJ_BPNUMX", "BCUS"); + + switch (fvBPRJ.CurrentMode) + { + case FormViewMode.Edit: + SetControlFocus(fvBPRJ, "txtBPRJ_BPPME"); + break; + case FormViewMode.Insert: + SetControlFocus(fvBPRJ, "txtBPRJ_BPPNM"); + break; + } + } + else + { + SetControlEnabled(fvBPRJ, "btnBPRM", CheckRight("FMBPRM", WRightName.Execute)); + } + } + + protected void CalcFields(System.Collections.Specialized.IOrderedDictionary values) + { + //values["BPSSB"] = (fvBPRJ.FindControl("cbBPRJ_BPSSB") as CheckBox).Checked ? "Y" : "N"; + values["BPWTN"] = (fvBPRJ.FindControl("cbBPRJ_BPWTN") as CheckBox).Checked ? "Y" : "N"; + } + + // 新增存檔前 + protected void fvBPRJ_ItemInserting(object sender, FormViewInsertEventArgs e) + { + CalcFields(e.Values); + // 取消自動編號 2011-01-11 SRYANG + // string _bprjTrd = (fvBPRJ.FindControl("ddlTrade") as DropDownList).SelectedValue; + // string _bcusHdr = e.Values["BPNUM"].ToString().Substring(0, 2); + // e.Values["BPPNM"] = WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "BPRJ", "BPPNM", String.Format("\"{0}{1}\"<999>", _bcusHdr, _bprjTrd), ""); + } + + // 更正存檔前 + protected void fvBPRJ_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + CalcFields(e.NewValues); + } + + // 刪除前 + protected void fvBPRJ_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 刪除前檢查 + // 檢查是否有專案預算資料 + DbCommand cmd = Query.NewCommand("SELECT COUNT(1) FROM BPAA WHERE BPPNM=@BPPNM"); + cmd.Parameters.Add(Query.NewParameter("BPPNM", e.Keys["BPPNM"])); + object o = Query.ExecuteScalar(cmd); + if (o != null && Convert.ToInt32(o) > 0) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "此專案有專案預算資料,不可刪除"; + e.Cancel = true; + } + + // TODO: 檢查是否有專案派遣資料 + // TODO: 檢查是否有專案核銷資料 + } + + protected void cvBPNUM_ServerValidate(object source, ServerValidateEventArgs args) + { + CustomValidator v = source as CustomValidator; + + // 檢查客戶編號是否輸入,是否存在 + if (args.Value == "") + { + args.IsValid = false; + v.Text = "請輸入客戶編號"; + } + + DbCommand cmd = Query.NewCommand("SELECT COUNT(1) FROM BCUS WHERE BCNUM=@BCNUM"); + cmd.Parameters.Add(Query.NewParameter("BCNUM", args.Value)); + object o = Query.ExecuteScalar(cmd); + if (o == null || Convert.ToInt32(o) == 0) + { + args.IsValid = false; + v.Text = "客戶編號不存在!請重新輸入。"; + } + + args.IsValid = true; + } + + protected void MultiView1_ActiveViewChanged(object sender, EventArgs e) + { + switch (MultiView1.ActiveViewIndex) + { + case 0: + break; + case 1: + break; + } + } + + protected void gvBPRJ_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(sender as GridView, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void gvBPRJ_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in (sender as GridView).Rows) + SetGridViewMouseBehavier(sender as GridView, row); + } + + protected void cvOverTime_ServerValidate(object source, ServerValidateEventArgs args) + { + CustomValidator cv = source as CustomValidator; + double i; + args.IsValid = args.Value != "" && double.TryParse(args.Value, out i) && i >= 0d && i <= 3d; + } + + protected void cvBPPNM_ServerValidate(object source, ServerValidateEventArgs args) + { + // 新增時 專案編號 重複檢查 + DbCommand cmd = Query.NewCommand("SELECT COUNT(1) FROM BPRJ WHERE BPPNM=@BPPNM"); + cmd.Parameters.Add(Query.NewParameter("BPPNM", args.Value)); + object o = Query.ExecuteScalar(cmd); + args.IsValid = o == null || Convert.ToInt32(o) == 0; + } +} diff --git a/Web/forms/customer/fmBprm.ascx b/Web/forms/customer/fmBprm.ascx new file mode 100644 index 0000000..201644e --- /dev/null +++ b/Web/forms/customer/fmBprm.ascx @@ -0,0 +1,413 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBprm.ascx.cs" Inherits="forms_customer_fmBprm" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + +
+ 輸入年度: + + + +  
+ 選擇客戶: + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + +
+ + + + + +
+
+
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案編號: + + + + +
+ 人員編號: + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案編號: + + + + +
+ 人員編號: + + + + + + +
+ + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案編號: + + + + +
+ 人員編號: + + + + + + +
+ + + +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + +
+
diff --git a/Web/forms/customer/fmBprm.ascx.cs b/Web/forms/customer/fmBprm.ascx.cs new file mode 100644 index 0000000..c763e34 --- /dev/null +++ b/Web/forms/customer/fmBprm.ascx.cs @@ -0,0 +1,365 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Text; +using Wellan.Common; +using Wellan.Data; +using System.Data.Common; + +/// +/// 專案處理人員 +/// +public partial class forms_customer_fmBprm : Wellan.Web.UI.WUserControlBase +{ + protected string _BPPNM = ""; + private string select = "SELECT * "; + private string from = " FROM BPRM "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY BPENO"; + + protected void Page_Load(object sender, EventArgs e) + { + //if (IsPostBack) + // gvBPRM.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + + if (ddlBCUS.Items.Count == 0) + { + DbCommand cmd1 = Query.NewCommand(); + cmd1.CommandText = + @"SELECT '' AS BCNUM, '(請選擇客戶)' AS BCNAM + UNION ALL + SELECT BCNUM, '(' + BCNUM + ') ' + BCNAM AS BCNAM + FROM BCUS + ORDER BY BCNUM"; + ddlBCUS.DataSource = Query.Select(cmd1); + ddlBCUS.DataValueField = "BCNUM"; + ddlBCUS.DataTextField = "BCNAM"; + ddlBCUS.DataBind(); + } + + BindBPRJListBox(); + + /* 舊作法程式 + dsBPRMForm.ConnectionString = ConnectionString; + dsBPRMGrid.ConnectionString = ConnectionString; + _BPPNM = GetStringParam("BPPNM"); + GetGridViewRowColor(gvBPRM); + Search(); + */ + } + + #region 新作法程式 + + protected void BindBPRJListBox() + { + DbCommand cmd1 = Query.NewCommand(); + cmd1.CommandText = + @"SELECT BPPNM, '(' + BPPNM + ') ' + BPPME AS BPPME + FROM BPRJ + WHERE BPNUM=@BPNUM + AND EXISTS (SELECT 1 FROM BPAA WHERE BPAA.BPPNM=BPRJ.BPPNM AND (BPAA.BPPNM = 'TYB00001' OR BPAA.BPPNM = 'JYB00001' OR BPAA.BPYER=@BPYER)) + ORDER BY BPPNM"; + Query.AddParam(cmd1, "BPNUM", ddlBCUS.SelectedValue); + Query.AddParam(cmd1, "BPYER", WQuery.GetInt32Value(txtYear.Text)); + + lbProject.DataSource = Query.Select(cmd1); + lbProject.DataValueField = "BPPNM"; + lbProject.DataTextField = "BPPME"; + lbProject.DataBind(); + + if (lbProject.Items.Count > 0 && lbProject.SelectedIndex == -1) + { + lbProject.SelectedIndex = 0; + BindWorkerListBox(); + } + } + + protected void BindWorkerListBox() + { + DbCommand cmd1 = Query.NewCommand(); + cmd1.CommandText = String.Format( + @"SELECT BPENO, '(' + BPENO + ') ' + BPNME AS BPNME FROM BPSNView + WHERE BPEDY IS NULL + AND BPDPT IN {0} + AND EXISTS (SELECT BWEH.BPENO FROM BWEH WHERE BWEH.BPGLP='03' AND BWEH.BPENO=BPSNView.BPENO) + AND EXISTS (SELECT * FROM BPRM WHERE BPPNM=@BPPNM AND BPRM.BPENO=BPSNView.BPENO)", PublicVariable.InnerDepartment); + Query.AddParam(cmd1, "BPPNM", lbProject.SelectedValue); + + DbCommand cmd2 = Query.NewCommand(); + cmd2.CommandText = String.Format( + @"SELECT BPENO, '(' + BPENO + ') ' + BPNME AS BPNME FROM BPSNView + WHERE BPEDY IS NULL + AND BPDPT IN {0} + AND EXISTS (SELECT BWEH.BPENO FROM BWEH WHERE BWEH.BPGLP='03' AND BWEH.BPENO=BPSNView.BPENO) + AND NOT EXISTS (SELECT * FROM BPRM WHERE BPPNM=@BPPNM AND BPRM.BPENO=BPSNView.BPENO)", PublicVariable.InnerDepartment); + Query.AddParam(cmd2, "BPPNM", lbProject.SelectedValue); + + lbInWork.DataSource = Query.Select(cmd1); + lbInWork.DataValueField = "BPENO"; + lbInWork.DataTextField = "BPNME"; + lbInWork.DataBind(); + + lbOutWork.DataSource = Query.Select(cmd2); + lbOutWork.DataValueField = "BPENO"; + lbOutWork.DataTextField = "BPNME"; + lbOutWork.DataBind(); + } + + protected void WButton1_Click(object sender, EventArgs e) + { + BindBPRJListBox(); + } + + protected void lbProject_SelectedIndexChanged(object sender, EventArgs e) + { + BindWorkerListBox(); + } + + protected void btnMoveIn_Click(object sender, ImageClickEventArgs e) + { + DbCommand cmd1 = Query.NewCommand(); + cmd1.CommandText = + @"SELECT BPENO FROM BPRM WHERE BPPNM=@BPPNM AND BPENO=@BPENO"; + + DbCommand cmd2 = Query.NewCommand(); + cmd2.CommandText = + @"INSERT INTO BPRM (BPPNM, BPENO, APPNO) VALUES (@BPPNM, @BPENO, 1)"; + + foreach (ListItem item in lbOutWork.Items) + { + if (!item.Selected) + continue; + + Query.AddParam(cmd1, "BPPNM", lbProject.SelectedValue); + Query.AddParam(cmd1, "BPENO", item.Value); + if (Query.Select(cmd1).Rows.Count == 0) + { + Query.AddParam(cmd2, "BPPNM", lbProject.SelectedValue); + Query.AddParam(cmd2, "BPENO", item.Value); + Query.ExecuteNonQuery(cmd2); + } + } + + BindWorkerListBox(); + } + + protected void btnMoveOut_Click(object sender, ImageClickEventArgs e) + { + DbCommand cmd1 = Query.NewCommand(); + cmd1.CommandText = + @"DELETE FROM BPRM WHERE BPPNM=@BPPNM AND BPENO=@BPENO"; + + foreach (ListItem item in lbInWork.Items) + { + if (!item.Selected) + continue; + + Query.AddParam(cmd1, "BPPNM", lbProject.SelectedValue); + Query.AddParam(cmd1, "BPENO", item.Value); + Query.ExecuteNonQuery(cmd1); + } + + BindWorkerListBox(); + } + + #endregion + + #region 舊作法程式 + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsBPRMGrid.SelectParameters.Clear(); + AddSearch(sql, dsBPRMGrid, "BPPNM", _BPPNM, "", true); + sql.Append(order); + dsBPRMGrid.SelectCommand = sql.ToString(); + } + + protected void dsBPRM_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + fvBPRM.ChangeMode(FormViewMode.Insert); + } + } + + protected void fvBPRM_DataBound(object sender, EventArgs e) + { + switch (fvBPRM.CurrentMode) + { + case FormViewMode.Insert: + case FormViewMode.Edit: + RegisterLookupEvent(fvBPRM, "btnBPRM_BPENO_WQRY", "txtBPRM_BPENO", "txtBPRM_BPENO,lbBPRM_BPENOX", "BPSN", + String.Format("BPEDY IS NULL AND BPDPT IN {0} AND NOT EXISTS (SELECT * FROM BPRM WHERE BPRM.BPPNM='" + _BPPNM + "' AND BPRM.BPENO=BPSNView.BPENO)", PublicVariable.InnerDepartment)); + SetClientFocus(fvBPRM, "txtBPRM_BPENO"); + break; + } + } + + protected void gvBPRM_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (gvBPRM.SelectedIndex == -1 && gvBPRM.Rows.Count > 0) + gvBPRM.SelectedIndex = 0; + fvBPRM.DataBind(); + } + + protected void gvBPRM_PageIndexChanged(object sender, EventArgs e) + { + Search(); + gvBPRM.SelectedIndex = 0; + gvBPRM.DataBind(); + } + + protected void fvBPRM_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Cancel": + Search(); + fvBPRM.ChangeMode(FormViewMode.ReadOnly); + fvBPRM_ModeChanged(sender, e); + break; + case "BPRJ": + DoAfterCommand("BPRJ"); + break; + } + } + + protected void fvBPRM_ModeChanged(object sender, EventArgs e) + { + if (fvBPRM.CurrentMode == FormViewMode.ReadOnly) + { + gvBPRM.Visible = true; + gvBPRM.DataBind(); + if (gvBPRM.Rows.Count > 0 && gvBPRM.SelectedIndex == -1) + { + gvBPRM.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert && gvBPRM.Rows.Count > 0) + { + gvBPRM.PageIndex = gvBPRM.PageCount - 1; + gvBPRM.DataBind(); + gvBPRM.SelectedIndex = gvBPRM.Rows.Count - 1; + } + + fvBPRM.DataBind(); + } + else + { + gvBPRM.Visible = false; + } + } + + protected void fvBPRM_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void CalcFields(System.Collections.Specialized.IOrderedDictionary values) + { + } + + protected bool CheckDuplicate(string bpeno) + { + DbCommand cmd = Query.NewCommand( + @"SELECT COUNT(1) FROM BPRM WHERE BPPNM=@BPPNM AND BPENO=@BPENO"); + cmd.Parameters.Add(Query.NewParameter("BPPNM", _BPPNM)); + cmd.Parameters.Add(Query.NewParameter("BPENO", bpeno)); + object o = Query.ExecuteScalar(cmd); + return (o == null || o == DBNull.Value || Convert.ToInt32(o) == 0); + } + + protected void fvBPRM_ItemInserting(object sender, FormViewInsertEventArgs e) + { + // 檢查是否重複 + if (!CheckDuplicate(e.Values["BPENO"].ToString())) + { + cvMessage.ErrorMessage = "員工編號重複,請重新輸入"; + cvMessage.IsValid = false; + e.Cancel = true; + } + + CalcFields(e.Values); + e.Values["BPPNM"] = _BPPNM; + } + + protected void fvBPRM_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + // 檢查是否重複 + if (e.OldValues["BPENO"].ToString() != e.NewValues["BPENO"].ToString() && !CheckDuplicate(e.NewValues["BPENO"].ToString())) + { + cvMessage.ErrorMessage = "員工編號重複,請重新輸入"; + cvMessage.IsValid = false; + e.Cancel = true; + } + + CalcFields(e.NewValues); + } + + protected void gvBPRM_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(sender as GridView, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void gvBPRM_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in (sender as GridView).Rows) + SetGridViewMouseBehavier(sender as GridView, row); + } + + protected void cvBPENO_ServerValidate(object source, ServerValidateEventArgs args) + { + BPSN_DAC bpsn = new BPSN_DAC(WConfig.GetConnectionConfig(), WConfig.GetConnectionConfigName()); + args.IsValid = args.Value != "" && bpsn.IsExist(args.Value, true) && bpsn.GetDepartment(args.Value) != "X"; + } + + protected void dsBPRMForm_Selecting(object sender, SqlDataSourceSelectingEventArgs e) + { + e.Command.Parameters["@BPPNM"].Value = _BPPNM; + } + + protected void fvBPRM_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + gvBPRM.DataBind(); + if (gvBPRM.SelectedIndex > gvBPRM.Rows.Count - 1) + { + gvBPRM.SelectedIndex = gvBPRM.Rows.Count - 1; + gvBPRM.DataBind(); + } + fvBPRM.DataBind(); + } + + protected void fvBPRM_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void fvBPRM_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + #endregion + + +} diff --git a/Web/forms/customer/fmRasn.ascx b/Web/forms/customer/fmRasn.ascx new file mode 100644 index 0000000..379c857 --- /dev/null +++ b/Web/forms/customer/fmRasn.ascx @@ -0,0 +1,1050 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmRasn.ascx.cs" Inherits="forms_customer_fmRasn" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 年度: + +
+ 專案: + + +
+ + + + + + + + + + + + +<%-- + + + + --%> +<%-- + + + + --%> + + + + + + + + +
+ + + + + + + +
+ + + +
+
+ +
+ + + + + + + +
+ + + +
+
+ +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 客戶編號: + + + 生效日期: + + + + + +
+ + + +
+
+ 專案年度編號: + +
+ 人員編號: + + + 派遣次數: + + 異動次數:
+ 派遣開始日期: + + + + + + +
+ + + +
+
+ 派遣結束日期: + + + + + + +
+ + + +
+
+ 職稱: + + + 等級: + +
+ 站別: + + + 工作地時區: + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 客戶編號: + +
+ 專案年度編號: + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 職稱: + + + 等級: + +
+ 站別: + + + 派遣開始日期: + + + + + +
+ + + +
+
+ 工作地時區: + + +
+ 人員編號: +
+ + +
+
+
+
+ + + + + + + + + + + + +
+ 已派遣人數:
已派遣人員各站別人數
+ + + + + + + + + + + + + + + + + + 無資料 + + + + + + + + + + + + + + + + + + + 無資料 + + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 客戶編號: + + + 生效日期: +
+ 專案年度編號: + +
+ 人員編號: + + + 派遣項次: + + 異動次數:
+ 派遣開始日期: + + + 派遣結束日期: + + + 職稱: + + 等級: +
+ 站別: + + 工作地時區: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 月薪: + + 時薪: + + 本薪: +
+ 全勤獎金: + + 伙食費: + + 職務加給: + + 派駐津貼: +
+ 其他津貼: +
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + diff --git a/Web/forms/customer/fmRasn.ascx.cs b/Web/forms/customer/fmRasn.ascx.cs new file mode 100644 index 0000000..4e68da4 --- /dev/null +++ b/Web/forms/customer/fmRasn.ascx.cs @@ -0,0 +1,800 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; +using System.Collections.Generic; + +/// +/// 專案人員派遣 +/// +public partial class forms_customer_fmRasn : Wellan.Web.UI.WUserControlBase +{ + protected string _RACNM = ""; + protected string _RAPYN = ""; + protected string _BPENO = ""; + protected string _BPNME = ""; + + protected int _YY = 0; + //private string select = "SELECT A.*, B.BPSRM, B.BPSRD, B.BPP01, B.BPP02, B.BPP03, B.BPP04, B.BPP05, (CASE WHEN A.RAEDT IS NULL THEN 1 ELSE 2 END) RAEND "; + //private string from = + // @" FROM RASN A + // LEFT OUTER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO + // LEFT OUTER JOIN BPSNView C ON A.RANUM=C.BPENO "; + //private string where = " WHERE 1=1 "; + //// private string order = " ORDER BY RACNM, RAPYN, RAEND, RANUM, RAITM"; + //private string order = " ORDER BY RAPYN, RAEND, RANUM, RAITM"; + //private string hq_order = " ORDER BY RAEDT, RANUM"; + protected bool canSeeSalary = false; + + protected void Page_Load(object sender, EventArgs e) + { + _RACNM = ViewState["RACNM"] != null ? ViewState["RACNM"].ToString() : ""; + _RAPYN = ViewState["RAPYN"] != null ? ViewState["RAPYN"].ToString() : ""; + _BPENO = ViewState["BPENO"] != null ? ViewState["BPENO"].ToString() : ""; + _BPNME = ViewState["BPNME"] != null ? ViewState["BPNME"].ToString() : ""; + + //if (IsPostBack) + // RASNGrid.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsRASNForm.ConnectionString = ConnectionString; + dsRASNGrid.ConnectionString = ConnectionString; + dsRASN_RABRH.ConnectionString = ConnectionString; + dsRASN_RANUM.ConnectionString = ConnectionString; + dsRASN_BPJNO.ConnectionString = ConnectionString; + dsRASN_BPCNO.ConnectionString = ConnectionString; + dsRASN_RAENO1.ConnectionString = ConnectionString; + dsRASN_RABRH1.ConnectionString = ConnectionString; + dsRASN_RAWTZ.ConnectionString = ConnectionString; + + _YY = GetIntParam("YY"); + + if (ForwardSource != "") + { + _RAPYN = GetStringParam("RAPYN"); + ViewState["RAPYN"] = _RAPYN; + + DbCommand cmdRacnm = Query.NewCommand( + @"SELECT A.BCNUM FROM BCUS A + INNER JOIN BPRJ B ON A.BCNUM=B.BPNUM + INNER JOIN BPAA C ON B.BPPNM=C.BPPNM + WHERE C.BPPYN=@BPPYN"); + cmdRacnm.Parameters.Add(Query.NewParameter("BPPYN", _RAPYN)); + object o = Query.ExecuteScalar(cmdRacnm); + if (o == null) + _RACNM = ""; + else + _RACNM = o.ToString(); + } + + if (_YY > 0) + { + txtYY.Text = _YY.ToString(); + + ddlBPPYN.DataSource = new BpaaDAC().GetBpaa(_YY + WGuard1.CY11); + ddlBPPYN.DataBind(); + ListItem item = ddlBPPYN.Items.FindByValue(_RAPYN); + if (item != null) + item.Selected = true; + } + else + { + txtYY.Focus(); + } + + MultiView1.Visible = _RAPYN != ""; + + dsRASN_BPJNO.SelectParameters["BPPYN"].DefaultValue = _RAPYN; + dsRASN_BPCNO.SelectParameters["BPPYN"].DefaultValue = _RAPYN; + + string zone; + string bscls; + if (_RAPYN.Length > 4) + zone = _RAPYN.Substring(3, 1); + else + zone = ""; + + switch (zone) + { + case "A": // A 北基宜 + bscls = "1%"; + break; + case "B": // B 桃竹苗 + bscls = "2%"; + break; + case "C": // C 中彰投 + bscls = "3%"; + break; + case "D": // D 雲嘉南 + bscls = "4%"; + break; + case "E": // E 高屏澎東 + bscls = "5%"; + break; + case "F": // 台北市 (預留) + bscls = "6%"; + break; + case "G": // 高雄市 (預留) + bscls = "7%"; + break; + default: + bscls = "%"; + break; + } + dsRASN_RABRH.SelectParameters["BSCLS"].DefaultValue = bscls; + + GetGridViewRowColor(RASNGrid); + + switch (MultiView1.ActiveViewIndex) + { + case 0: + { + //RegisterLookupEvent(this, "btnRASN_RACNM_WQRY", "txtRACNM", "txtRACNM,txtRACNMX", "BCUS"); + //RegisterLookupEvent(this, "btnRASN_RAPYN_WQRY", "txtRAPYN", "txtRAPYN,txtRAPYNX", "BPRJ"); + break; + } + case 1: + { + Search(); + break; + } + } + + // 依權限顯示隱藏資料 + canSeeSalary = CheckRight(WRightName.Update); + + RASNGrid.Columns[5].Visible = canSeeSalary; + RASNGrid.Columns[6].Visible = canSeeSalary; + RASNGrid.Columns[7].Visible = canSeeSalary; + RASNGrid.Columns[8].Visible = canSeeSalary; + RASNGrid.Columns[9].Visible = canSeeSalary; + RASNGrid.Columns[10].Visible = canSeeSalary; + RASNGrid.Columns[11].Visible = canSeeSalary; + RASNGrid.Columns[12].Visible = canSeeSalary; + } + + // 查詢按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + // _RACNM = txtRACNM.Text; + // _RAPYN = txtRAPYN.Text; + _BPENO = txtBPENO.Text; + _BPNME = txtBPNME.Text; + + if (//_RACNM.Length == 0 && + //_RAPYN.Length == 0 && + _BPENO.Length == 0 && + _BPNME.Length == 0) + { + lbMessage.Text = GetString("NOSRHCOND"); + lbMessage.Visible = true; + } + else + { + MultiView1.ActiveViewIndex = 1; + + Search(); + + RASNGrid.PageIndex = 0; + RASNGrid.SelectedIndex = 0; + RASNGrid.DataBind(); + + // 查詢有資料時,才將查詢條件紀錄在 ViewState 中 + if (RASNGrid.Rows.Count > 0) + { + // ViewState["RACNM"] = txtRACNM.Text; + // ViewState["RAPYN"] = txtRAPYN.Text; + ViewState["BPENO"] = txtBPENO.Text; + ViewState["BPNME"] = txtBPNME.Text; + } + } + } + + // 取消查詢按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + //ViewState.Remove("RACNM"); + //ViewState.Remove("RAPYN"); + ViewState.Remove("BPENO"); + ViewState.Remove("BPNME"); + Search(); + MultiView1.ActiveViewIndex = 1; + } + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + List HQ_RAPYNS = new List() { "103TYB00001", "103JYB00001" }; + String searchOrder1 = String.Empty, searchOrder2 = String.Empty; + if (HQ_RAPYNS.IndexOf(_RAPYN) < 0) + { + searchOrder1 = "RANUM"; + searchOrder2 = "RAEDT, RANUM"; + } + else + { + searchOrder1 = "RAEDT, RANUM"; + searchOrder2 = "RAEDT, RANUM"; + } + + sql.Append(string.Format(@" +SELECT A.*, B.BPSRM, B.BPSRD, B.BPP01, B.BPP02, B.BPP03, B.BPP04, B.BPP05 +FROM + ( + SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY {0}) ROWNUM FROM RASN WHERE RAPYN=@RAPYN AND RAEDT IS NULL) T1 + UNION ALL + SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY {1}) ROWNUM FROM RASN WHERE RAPYN=@RAPYN AND RAEDT IS NOT NULL) T2 + ) A + LEFT OUTER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO + LEFT OUTER JOIN BPSNView C ON A.RANUM=C.BPENO +WHERE 1=1 +", searchOrder1, searchOrder2)); + if (!string.IsNullOrEmpty(txtYY.Text) && HQ_RAPYNS.IndexOf(_RAPYN) < 0) + { + sql.Append(string.Format(" AND ((RASDT >= '{0}/01/01' AND RASDT <= '{0}/12/31') OR (RAEDT >= '{0}/01/01' AND RAEDT <= '{0}/12/31') OR (RASDT <= '{0}/01/01' AND RAEDT >= '{0}/12/31') ) ", WQuery.GetInt32Value(txtYY.Text) + WGuard1.CY11)); + } + + dsRASNGrid.SelectParameters.Clear(); + dsRASNGrid.SelectParameters.Add(new Parameter("RAPYN", DbType.String, _RAPYN)); + // AddSearch(sql, dsRASNGrid, "RAPYN", _RAPYN, "", true); + AddSearch(sql, dsRASNGrid, "C.BPENO", _BPENO, "", true); + AddSearch(sql, dsRASNGrid, "C.BPNME", _BPNME, "", true); + + dsRASNGrid.SelectCommand = sql.ToString(); + } + + // 存檔前的計算動作 + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + } + + protected void dsRASNForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + } + + protected void dsRASNForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + } + + protected void RASNGrid_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (RASNGrid.Rows.Count > 0) + { + RASNGrid.Visible = true; + if (RASNGrid.SelectedIndex == -1) + RASNGrid.SelectedIndex = 0; + if (RASNGrid.SelectedIndex > RASNGrid.Rows.Count - 1) + RASNGrid.SelectedIndex = RASNGrid.Rows.Count - 1; + + if (RASNGrid.SelectedIndex != -1) + { + dsRASN_BPJNO.SelectParameters["BPPYN"].DefaultValue = RASNGrid.SelectedDataKey["RAPYN"].ToString(); + dsRASN_BPCNO.SelectParameters["BPPYN"].DefaultValue = RASNGrid.SelectedDataKey["RAPYN"].ToString(); + } + + RASNForm.DataBind(); + } + } + + protected void RASNGrid_PageIndexChanged(object sender, EventArgs e) + { + Search(); + RASNGrid.SelectedIndex = 0; + RASNGrid.DataBind(); + } + + protected void dsRASNGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + if (ForwardSource != "") + RASNForm.ChangeMode(FormViewMode.Insert); + else + { + MultiView1.ActiveViewIndex = 0; + + lbMessage.Text = GetString("NODATA"); + lbMessage.Visible = true; + } + } + } + + protected void RASNForm_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Search": + MultiView1.ActiveViewIndex = 0; + break; + case "Save": + cvMessage.ErrorMessage = ""; + bool passed = true; + + string bpjno = (RASNForm.FindControl("hfBPJNO") as HiddenField).Value; + string bpcno = (RASNForm.FindControl("hfBPCNO") as HiddenField).Value.Split('_')[0]; + string rasdt = (RASNForm.FindControl("txtRASN_RASDT") as TextBox).Text; + string rabrh = (RASNForm.FindControl("ddlRASN_RABRH") as DropDownList).SelectedValue; + string rawtz = (RASNForm.FindControl("ddlRASN_RAWTZ") as DropDownList).SelectedValue; + if (string.IsNullOrEmpty(rawtz)) + rawtz = "台北"; + + int selected = 0; + foreach (ListItem item in (RASNForm.FindControl("selRASN_RANUM") as CheckBoxList).Items) + selected += item.Selected ? 1 : 0; + if (selected == 0) + { + cvMessage.ErrorMessage += "請選擇人員
"; + cvMessage.IsValid = false; + passed = false; + } + + if (bpjno == "") + { + cvMessage.ErrorMessage += "請選擇職稱
"; + cvMessage.IsValid = false; + passed = false; + } + + if (bpcno == "") + { + cvMessage.ErrorMessage += "請選擇等級
"; + cvMessage.IsValid = false; + passed = false; + } + + if (rabrh == "") + { + cvMessage.ErrorMessage += "請選擇站別
"; + cvMessage.IsValid = false; + passed = false; + } + + DateTime rasdtValue = (DateTime)CheckDate(rasdt, "請輸入正確的派遣開始日期", ref passed, cvMessage); + + DataTable bpjb = GetBPJB(bpjno, bpcno); + if (bpjb.Rows.Count == 0) + { + cvMessage.ErrorMessage += "請檢查專案年度職稱與等級資料是否設定正確
"; + cvMessage.IsValid = false; + passed = false; + } + + if (!passed) + { + RegisterJS(RASNForm); + ProcessCustomValidatorMessage(cvMessage); + break; + } + + // 準備新增 + DbCommand cmdInsertRASN = Query.NewCommand( + @"INSERT INTO RASN + (RANUM, RAITM, RACNM, RAPYN, RASDT, RAEDT, RAJNO, RACNO, RABRH, RAWTZ, + APPNO, TRDAT, TRMOD, TRUSR) + VALUES + (@RANUM, @RAITM, @RACNM, @RAPYN, @RASDT, NULL, @RAJNO, @RACNO, @RABRH, @RAWTZ, + 1, GETDATE(), 'INSERT', @TRUSR)"); + cmdInsertRASN.Parameters.Add(Query.NewParameter("RANUM", DbType.String)); + cmdInsertRASN.Parameters.Add(Query.NewParameter("RAITM", DbType.Int32)); + cmdInsertRASN.Parameters.Add(Query.NewParameter("RACNM", _RACNM)); + cmdInsertRASN.Parameters.Add(Query.NewParameter("RAPYN", _RAPYN)); + cmdInsertRASN.Parameters.Add(Query.NewParameter("RASDT", rasdtValue.ToString(WGuard1.InvariantCulture))); + cmdInsertRASN.Parameters.Add(Query.NewParameter("RAJNO", bpjno)); + cmdInsertRASN.Parameters.Add(Query.NewParameter("RACNO", bpcno)); + cmdInsertRASN.Parameters.Add(Query.NewParameter("RABRH", rabrh)); + cmdInsertRASN.Parameters.Add(Query.NewParameter("RAWTZ", rawtz)); + cmdInsertRASN.Parameters.Add(Query.NewParameter("TRUSR", UserId)); + DbConnection conn = Query.NewConnection(); + cmdInsertRASN.Connection = conn; + conn.Open(); + DbTransaction tran = conn.BeginTransaction(); + + cmdInsertRASN.Transaction = tran; + try + { + foreach (ListItem item in (RASNForm.FindControl("selRASN_RANUM") as CheckBoxList).Items) + if (item.Selected) + { + // 新增人員派遣紀錄 + // 取新的項次 + object o = Query.ExecuteScalar(String.Format("SELECT ISNULL(MAX(RAITM), 0) + 1 FROM RASN WHERE RANUM='{0}'", item.Value)); + if (o == null) + cmdInsertRASN.Parameters["RAITM"].Value = 1; + else + cmdInsertRASN.Parameters["RAITM"].Value = Convert.ToInt32(o); + cmdInsertRASN.Parameters["RANUM"].Value = item.Value; + cmdInsertRASN.ExecuteNonQuery(); + + /* + dsRASNForm.InsertParameters.UpdateValues(Context, this); + dsRASNForm.InsertParameters["RANUM"].DefaultValue = item.Value; + dsRASNForm.InsertParameters["RACNM"].DefaultValue = _RACNM; + dsRASNForm.InsertParameters["RAPYN"].DefaultValue = _RAPYN; + dsRASNForm.InsertParameters["RAJNO"].DefaultValue = bpjno; + dsRASNForm.InsertParameters["RACNO"].DefaultValue = bpcno; + dsRASNForm.InsertParameters["RASDT"].DefaultValue = rasdtValue.ToString(System.Globalization.CultureInfo.InvariantCulture); + dsRASNForm.InsertParameters["RABRH"].DefaultValue = rabrh; + */ + /* + dsRASNForm.InsertParameters["RAMSL"].DefaultValue = bpjb.Rows[0]["BPSRM"].ToString(); + dsRASNForm.InsertParameters["RAHSL"].DefaultValue = bpjb.Rows[0]["BPSRD"].ToString(); + dsRASNForm.InsertParameters["RAP01"].DefaultValue = bpjb.Rows[0]["BPP01"].ToString(); + dsRASNForm.InsertParameters["RAP02"].DefaultValue = bpjb.Rows[0]["BPP02"].ToString(); + dsRASNForm.InsertParameters["RAP03"].DefaultValue = bpjb.Rows[0]["BPP03"].ToString(); + dsRASNForm.InsertParameters["RAP04"].DefaultValue = bpjb.Rows[0]["BPP04"].ToString(); + dsRASNForm.InsertParameters["RAP05"].DefaultValue = bpjb.Rows[0]["BPP05"].ToString(); + */ + //dsRASNForm.InsertParameters["RAS01"].DefaultValue = ras01; + + //dsRASNForm.Insert(); + } + //throw new Exception("失敗測試"); + tran.Commit(); + ClientShowMessage("人員派遣新增成功!"); + } + catch (Exception ex) + { + tran.Rollback(); + ClientShowMessage("人員派遣新增失敗!原因為:\\n" + ex.Message); + } + finally + { + conn.Close(); + (RASNForm.FindControl("selRASN_RANUM") as CheckBoxList).DataBind(); + (RASNForm.FindControl("gvRASN_RAENO") as GridView).DataBind(); + (RASNForm.FindControl("gvRASN_RABRH") as GridView).DataBind(); + RegisterJS(RASNForm); + } + + break; + case "Cancel": + Search(); + /* + RASNForm.ChangeMode(FormViewMode.ReadOnly); + RASNForm_ModeChanged(sender, e); + if (RASNGrid.Rows.Count == 0) + { + DoAfterCommand("BPRJ"); + } + */ + break; + case "Return": + DoAfterCommand("BPRJ"); + break; + } + } + + // 取得該職稱及等級之薪資資料 + protected DataTable GetBPJB(string bpjno, string bpcno) + { + DbCommand cmd = Query.NewCommand( + @"SELECT BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05 FROM BPJB + WHERE BPPYN=@BPPYN AND BPJNO=@BPJNO AND BPCNO=@BPCNO "); + cmd.Parameters.Add(Query.NewParameter("BPPYN", _RAPYN)); + cmd.Parameters.Add(Query.NewParameter("BPJNO", bpjno)); + cmd.Parameters.Add(Query.NewParameter("BPCNO", bpcno)); + return Query.Select(cmd); + } + + protected void RASNForm_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + RASNGrid.DataBind(); + RASNForm.DataBind(); + } + + protected void RASNForm_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void RASNForm_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void RASNForm_ModeChanged(object sender, EventArgs e) + { + if (RASNForm.CurrentMode == FormViewMode.ReadOnly) + { + RASNGrid.Visible = true; + RASNGrid.DataBind(); + if (RASNGrid.Rows.Count > 0 && RASNGrid.SelectedIndex == -1) + { + RASNGrid.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert && RASNGrid.Rows.Count > 0) + { + RASNGrid.PageIndex = RASNGrid.PageCount - 1; + RASNGrid.DataBind(); + RASNGrid.SelectedIndex = RASNGrid.Rows.Count - 1; + } + } + else + { + switch (RASNForm.CurrentMode) + { + case FormViewMode.Edit: + break; + case FormViewMode.Insert: + break; + } + + RASNGrid.Visible = false; + } + } + + protected void RASNForm_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void RASNForm_DataBound(object sender, EventArgs e) + { + if (RASNForm.CurrentMode == FormViewMode.Insert || RASNForm.CurrentMode == FormViewMode.Edit) + { + RegisterCalendarEvent(RASNForm, "btnRASN_RASDT_DATE", "txtRASN_RASDT"); + if (RASNForm.CurrentMode == FormViewMode.Edit) + RegisterCalendarEvent(RASNForm, "btnRASN_RAEDT_DATE", "txtRASN_RAEDT"); + RegisterJS(RASNForm); + + switch (RASNForm.CurrentMode) + { + case FormViewMode.Insert: + SetClientFocus(RASNForm, "selRASN_RANUM"); + dsRASN_RAENO1.SelectParameters["RAPYN"].DefaultValue = _RAPYN; + dsRASN_RABRH1.SelectParameters["RAPYN"].DefaultValue = _RAPYN; + break; + case FormViewMode.Edit: + SetControlFocus(RASNForm, "txtRASN_RASDT"); + break; + } + } + else if (RASNForm.CurrentMode == FormViewMode.ReadOnly) + { + SetControlVisible(RASNForm, "Panel2", canSeeSalary); + } + } + + protected void dsRASNForm_Deleted(object sender, SqlDataSourceStatusEventArgs e) + { + } + + protected void RegisterJS(FormView fv) + { + HtmlSelect dlBPJNO = fv.FindControl("ddlBPJNO") as HtmlSelect; + HtmlSelect dlBPCNO = fv.FindControl("ddlBPCNO") as HtmlSelect; + HiddenField hfBPJNO = fv.FindControl("hfBPJNO") as HiddenField; + HiddenField hfBPCNO = fv.FindControl("hfBPCNO") as HiddenField; + dlBPJNO.Attributes["onchange"] = String.Format("javascript:BPJNOChange('{0:c}', '{1:c}', '{2:c}', '{3:c}');", + dlBPJNO.ClientID, dlBPCNO.ClientID, hfBPJNO.ClientID, hfBPCNO.ClientID); + dlBPCNO.Attributes["onchange"] = String.Format("javascript:BPCNOChange('{0:c}', '{1:c}');", + dlBPCNO.ClientID, hfBPCNO.ClientID); + + StringBuilder sb1 = new StringBuilder(); + StringBuilder sb2 = new StringBuilder(); + + dlBPCNO.DataBind(); + for (int i = 0; i < dlBPCNO.Items.Count; i++) + { + sb1.Append("\"" + dlBPCNO.Items[i].Value + "\"" + (i < dlBPCNO.Items.Count - 1 ? "," : "")); + sb2.Append("\"" + dlBPCNO.Items[i].Text + "\"" + (i < dlBPCNO.Items.Count - 1 ? "," : "")); + } + + Page.ClientScript.RegisterArrayDeclaration("BPCNOValue", sb1.ToString()); + Page.ClientScript.RegisterArrayDeclaration("BPCNOText", sb2.ToString()); + + Button btnSave = fv.FindControl("btnSave") as Button; + btnSave.OnClientClick = String.Format("javascript:CopyValue('{0:c}', '{1:c}', '{2:c}', '{3:c}');return confirm(msgConfirmSave);", + dlBPJNO.ClientID, dlBPCNO.ClientID, hfBPJNO.ClientID, hfBPCNO.ClientID); + + if (fv.DataItem != null) + { + DataRowView row = fv.DataItem as DataRowView; + dlBPJNO.Value = row["RAJNO"].ToString(); + } + + for (int i = dlBPCNO.Items.Count - 1; i >= 0; i--) + { + string[] bpcnos = dlBPCNO.Items[i].Value.Split('_'); + if (bpcnos.Length > 1) + dlBPCNO.Items[i].Value = bpcnos[1]; + if (bpcnos[0] != dlBPJNO.Value) + dlBPCNO.Items.Remove(dlBPCNO.Items[i]); + } + + if (fv.DataItem != null) + { + DataRowView row = fv.DataItem as DataRowView; + dlBPCNO.Value = row["RACNO"].ToString(); + } + } + + protected void RASNGrid_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in RASNGrid.Rows) + SetGridViewMouseBehavier(RASNGrid, row); + } + + protected void RASNGrid_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(RASNGrid, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected string GetRAJNOName(string rapyn, string rajno) + { + DbCommand cmd = Query.NewCommand("SELECT BPJME FROM BPJA WHERE (BPPYN = @BPPYN) AND (BPJNO=@BPJNO)"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", rapyn)); + cmd.Parameters.Add(Query.NewParameter("BPJNO", rajno)); + + object o = Query.ExecuteScalar(cmd); + if (o == null) + return ""; + else + return o.ToString(); + } + + protected string GetRACNOName(string rapyn, string rajno, string racno) + { + DbCommand cmd = Query.NewCommand("SELECT BPCME FROM BPJB WHERE (BPPYN = @BPPYN) AND (BPJNO=@BPJNO) AND (BPCNO=@BPCNO)"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", rapyn)); + cmd.Parameters.Add(Query.NewParameter("BPJNO", rajno)); + cmd.Parameters.Add(Query.NewParameter("BPCNO", racno)); + + object o = Query.ExecuteScalar(cmd); + if (o == null) + return ""; + else + return o.ToString(); + } + + protected void RASNForm_ItemCreated(object sender, EventArgs e) + { + if (RASNForm.CurrentMode == FormViewMode.Insert) + { + (RASNForm.FindControl("txtRASN_RASDT") as TextBox).Text = _RAPYN.Substring(0, _RAPYN.Length - 4) + "0101"; + } + } + + protected new bool CheckInput(System.Collections.Specialized.IOrderedDictionary values) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + bool result = true; + + // 檢查日期 + values["RASDT"] = CheckDate(values["RASDT"], "請輸入正確的派遣開始日期", ref result, cvMessage); + if (values["RAEDT"].ToString() != "") + { + values["RAEDT"] = CheckDate(values["RAEDT"], "請輸入正確的派遣結束日期", ref result, cvMessage); + if (result && Convert.ToDateTime(values["RAEDT"]).CompareTo(values["RASDT"]) < 0) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage += "派遣結束日期 不可小於 派遣開始日期"; + result = false; + } + } + ProcessCustomValidatorMessage(cvMessage); + return result; + } + + protected void RASNForm_ItemInserting(object sender, FormViewInsertEventArgs e) + { + e.Cancel = !CheckInput(e.Values); + } + + protected void RASNForm_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + // 更正前檢查,檢查專案年度職稱與等級資料是否設定正確 + e.Cancel = !CheckInput(e.NewValues); + + string bpjno = (RASNForm.FindControl("hfBPJNO") as HiddenField).Value; + string bpcno = (RASNForm.FindControl("hfBPCNO") as HiddenField).Value.Split('_')[0]; + e.NewValues["RAJNO"] = bpjno; + e.NewValues["RACNO"] = bpcno; + + DataTable bpjb = GetBPJB(bpjno, bpcno); + + if (bpjb.Rows.Count == 0) + { + e.Cancel = true; + cvMessage.ErrorMessage += "請先檢查專案年度職稱與等級資料是否設定正確
"; + cvMessage.IsValid = false; + } + } + + protected void Next_Click(object sender, EventArgs e) + { + string rapyn = ddlBPPYN.SelectedValue; + + // 檢查此使用者是否有權限處理這個專案 + BprmDAC bprm = new BprmDAC(Query); + if (!bprm.GetRight(rapyn, UserId)) + { + MultiView1.Visible = false; + cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + cvMessage.IsValid = false; + return; + } + + // 檢查職稱與等級是否有設定 + dsRASN_BPJNO.SelectParameters["BPPYN"].DefaultValue = rapyn; + DataView dv = dsRASN_BPJNO.Select(new DataSourceSelectArguments()) as DataView; + if (dv.Count == 0) + { + MultiView1.Visible = false; + cvMessage.ErrorMessage = "此專案年度接單尚未設定職稱"; + cvMessage.IsValid = false; + return; + } + + dsRASN_BPCNO.SelectParameters["BPPYN"].DefaultValue = rapyn; + dv = dsRASN_BPCNO.Select(new DataSourceSelectArguments()) as DataView; + if (dv.Count == 0) + { + MultiView1.Visible = false; + cvMessage.ErrorMessage = "此專案年度接單尚未設定職稱等級"; + cvMessage.IsValid = false; + return; + } + + ParamList["RAPYN"] = rapyn; + DoAfterCommand("RASN"); + } + + protected void RASNForm_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 刪除前檢查 + // 1. 有結束日期不可刪除 + } + + protected void cvBPJNO_ServerValidate(object source, ServerValidateEventArgs args) + { + args.IsValid = args.Value != ""; + } + + protected void gvRASN_RAENO_DataBound(object sender, EventArgs e) + { + // 填入新增畫面上「已派遣人數」 + (RASNForm.FindControl("lbRAENOCount") as ITextControl).Text = + (RASNForm.FindControl("gvRASN_RAENO") as GridView).Rows.Count.ToString(); + } + + protected void btnYY_Click(object sender, EventArgs e) + { + int year; + if (!Int32.TryParse(txtYY.Text.Trim(), out year)) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "請輸入正確的年度"; + return; + } + + MultiView1.Visible = false; + ParamList["YY"] = year; + ParamList["RAPYN"] = ""; + DoAfterCommand("RASN"); + } +} diff --git a/Web/forms/customer/fmRpfe.ascx b/Web/forms/customer/fmRpfe.ascx new file mode 100644 index 0000000..3da22b6 --- /dev/null +++ b/Web/forms/customer/fmRpfe.ascx @@ -0,0 +1,629 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmRpfe.ascx.cs" Inherits="forms_customer_fmRpfe" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 年度: + + +
+ 專案: + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + 月份 + 科目 + 金額 + 備註
+ 1 + + + + + +
+ 2 + + + + + +
+ 3 + + + + + +
+ 4 + + + + + +
+ 5 + + + + + +
+ 6 + + + + + +
+ 7 + + + + + +
+ 8 + + + + + +
+ 9 + + + + + +
+ 10 + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + + + +
+ 單號: +
+ 日期: + + 科目: + + 金額: +
+ 備註: +
+ +
+ +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 專案年度編號: + +
+ 單號: +
+ 日期: + + 科目: + + + 金額: +
+ 備註: +
+ +
+   +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + diff --git a/Web/forms/customer/fmRpfe.ascx.cs b/Web/forms/customer/fmRpfe.ascx.cs new file mode 100644 index 0000000..4f0ddcf --- /dev/null +++ b/Web/forms/customer/fmRpfe.ascx.cs @@ -0,0 +1,623 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; +using CRAX; + +/// +/// 專案憑證處理 +/// +public partial class forms_customer_fmRpfe : Wellan.Web.UI.WUserControlBase +{ + private string _RPPYN = ""; + private int _YY = 0; + private string select = "SELECT * "; + private string from = " FROM RPFE "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY RPPYN, RPREN"; + private TextBox[] RPDATs = new TextBox[10]; + private DropDownList[] RPACCs = new DropDownList[10]; + private TextBox[] RPAMTs = new TextBox[10]; + private TextBox[] RPDOCs = new TextBox[10]; + private DateTime[] RPDATValues = new DateTime[10]; + private int[] RPAMTValues = new int[10]; + DataTable reportData; + + protected void Page_Load(object sender, EventArgs e) + { + //ddlBPPNM.DataSource = new BpaaDAC().GetBpaa(); + //ddlBPPNM.DataBind(); + //if (IsPostBack) + // RPFEGrid.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsRPFEForm.ConnectionString = ConnectionString; + dsRPFEGrid.ConnectionString = ConnectionString; + dsRPFE_RPACC.ConnectionString = ConnectionString; + dsRPFE_RPENO.ConnectionString = ConnectionString; + + _RPPYN = GetStringParam("RPPYN"); + _YY = GetIntParam("YY"); + + if (_YY > 0) + { + txtYY.Text = _YY.ToString(); + ddlBPPNM.DataSource = new BpaaDAC().GetBpaa(_YY + WGuard1.CY11); + ddlBPPNM.DataBind(); + ListItem item = ddlBPPNM.Items.FindByValue(_RPPYN); + if (item != null) + item.Selected = true; + } + else + { + txtYY.Focus(); + } + + MultiView1.Visible = _RPPYN != ""; + + dsRPFE_RPACC.SelectParameters["RPPYN"].DefaultValue = _RPPYN; + dsRPFE_RPENO.SelectParameters["RPPYN"].DefaultValue = _RPPYN; + + RPDATs[0] = txtRPFE_RPDAT_01; + RPDATs[1] = txtRPFE_RPDAT_02; + RPDATs[2] = txtRPFE_RPDAT_03; + RPDATs[3] = txtRPFE_RPDAT_04; + RPDATs[4] = txtRPFE_RPDAT_05; + RPDATs[5] = txtRPFE_RPDAT_06; + RPDATs[6] = txtRPFE_RPDAT_07; + RPDATs[7] = txtRPFE_RPDAT_08; + RPDATs[8] = txtRPFE_RPDAT_09; + RPDATs[9] = txtRPFE_RPDAT_10; + + RPACCs[0] = ddlRPFE_RPACC_01; + RPACCs[1] = ddlRPFE_RPACC_02; + RPACCs[2] = ddlRPFE_RPACC_03; + RPACCs[3] = ddlRPFE_RPACC_04; + RPACCs[4] = ddlRPFE_RPACC_05; + RPACCs[5] = ddlRPFE_RPACC_06; + RPACCs[6] = ddlRPFE_RPACC_07; + RPACCs[7] = ddlRPFE_RPACC_08; + RPACCs[8] = ddlRPFE_RPACC_09; + RPACCs[9] = ddlRPFE_RPACC_10; + + RPAMTs[0] = txtRPFE_RPAMT_01; + RPAMTs[1] = txtRPFE_RPAMT_02; + RPAMTs[2] = txtRPFE_RPAMT_03; + RPAMTs[3] = txtRPFE_RPAMT_04; + RPAMTs[4] = txtRPFE_RPAMT_05; + RPAMTs[5] = txtRPFE_RPAMT_06; + RPAMTs[6] = txtRPFE_RPAMT_07; + RPAMTs[7] = txtRPFE_RPAMT_08; + RPAMTs[8] = txtRPFE_RPAMT_09; + RPAMTs[9] = txtRPFE_RPAMT_10; + + RPDOCs[0] = txtRPFE_RPDOC_01; + RPDOCs[1] = txtRPFE_RPDOC_02; + RPDOCs[2] = txtRPFE_RPDOC_03; + RPDOCs[3] = txtRPFE_RPDOC_04; + RPDOCs[4] = txtRPFE_RPDOC_05; + RPDOCs[5] = txtRPFE_RPDOC_06; + RPDOCs[6] = txtRPFE_RPDOC_07; + RPDOCs[7] = txtRPFE_RPDOC_08; + RPDOCs[8] = txtRPFE_RPDOC_09; + RPDOCs[9] = txtRPFE_RPDOC_10; + + //_RPPYN = ViewState["RPNUM"] != null ? ViewState["RPNUM"].ToString() : ""; + //_RPRDT1 = ViewState["RPRDT1"] != null ? ViewState["RPRDT1"].ToString() : ""; + //_RPRDT2 = ViewState["RPRDT2"] != null ? ViewState["RPRDT2"].ToString() : ""; + + StringBuilder sb1 = new StringBuilder(); + StringBuilder sb2 = new StringBuilder(); + StringBuilder sb3 = new StringBuilder(); + for (int i = 0; i < 10; i++) + { + sb1.Append(String.Format("\"{0}\"", RPDATs[i].ClientID) + (i < 9 ? "," : "")); + sb2.Append(String.Format("\"{0}\"", RPAMTs[i].ClientID) + (i < 9 ? "," : "")); + sb3.Append(String.Format("\"{0}\"", RPDOCs[i].ClientID) + (i < 9 ? "," : "")); + } + Page.ClientScript.RegisterArrayDeclaration("RPDATIds", sb1.ToString()); + Page.ClientScript.RegisterArrayDeclaration("RPAMTIds", sb2.ToString()); + Page.ClientScript.RegisterArrayDeclaration("RPDOCIds", sb3.ToString()); + + GetGridViewRowColor(RPFEGrid); + + reportData = new DataTable(); + reportData.Columns.Add("RPREN", typeof(String)); + reportData.Columns.Add("RPPYN", typeof(String)); + reportData.Columns.Add("ProjectName", typeof(String)); + reportData.Columns.Add("Amount", typeof(Int32)); + reportData.Columns.Add("Document", typeof(String)); + + if (MultiView1.ActiveViewIndex == 0) + SetClientFocus(txtRPFE_RPDAT_01); + + Search(); + } + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsRPFEGrid.SelectParameters.Clear(); + AddSearch(sql, dsRPFEGrid, "RPPYN", _RPPYN, "", true); + sql.Append(order); + dsRPFEGrid.SelectCommand = sql.ToString(); + } + + private int CheckInsertInput(int index) + { + RPDATs[index].Text = RPDATs[index].Text.Trim(); + RPAMTs[index].Text = RPAMTs[index].Text.Trim(); + RPDOCs[index].Text = RPDOCs[index].Text.Trim(); + + // 有輸入的條件為:日期有輸入且合理,金額大於0,備註無所謂 + bool rpdatValid = false; + bool rpamtValid = false; + rpdatValid = CheckDate(RPDATs[index].Text + "01", out RPDATValues[index]); + rpamtValid = Int32.TryParse(RPAMTs[index].Text, out RPAMTValues[index]); + if (RPDATs[index].Text != "" && rpdatValid && + RPAMTs[index].Text != "" && rpamtValid && RPAMTValues[index] > 0) + { + return 0; + } + if (RPDATs[index].Text == "" && RPAMTs[index].Text == "") + { + return 1; + } + + int returnValue = 0; + if (RPDATs[index].Text != "" && !rpdatValid) + { + returnValue -= 1; + } + if (RPAMTs[index].Text != "" && !rpamtValid) + { + returnValue -= 2; + } + return returnValue; + } + + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + } + + protected void dsRPFEForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + } + + protected void dsRPFEForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + } + + protected void RPFEGrid_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (RPFEGrid.Rows.Count > 0) + { + if (RPFEGrid.SelectedIndex == -1) + RPFEGrid.SelectedIndex = 0; + if (RPFEGrid.SelectedIndex > RPFEGrid.Rows.Count - 1) + RPFEGrid.SelectedIndex = RPFEGrid.Rows.Count - 1; + RPFEForm.DataBind(); + } + } + + protected void RPFEGrid_PageIndexChanged(object sender, EventArgs e) + { + Search(); + RPFEGrid.SelectedIndex = 0; + RPFEGrid.DataBind(); + } + + protected void dsRPFEGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + //RPFEForm.ChangeMode(FormViewMode.Insert); + //RPFEForm_ModeChanged(sender, e); + } + } + + protected void RPFEForm_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "APPEND": + MultiView1.ActiveViewIndex = 0; + break; + case "Print": + RPFEForm.DataBind(); + if (RPFEForm.DataItem != null) + { + DataRowView rv = RPFEForm.DataItem as DataRowView; + AddReportData(rv["RPREN"].ToString(), + rv["RPPYN"].ToString(), + GetLookup("BPAA", rv["RPPYN"].ToString(), "BPPYM", ""), + Convert.ToInt32(rv["RPAMT"]), + rv["RPACC"].ToString(), + Convert.ToDateTime(rv["RPDAT"]), + rv["RPDOC"].ToString()); + PrintReport(); + } + break; + case "Cancel": + Search(); + RPFEForm.ChangeMode(FormViewMode.ReadOnly); + RPFEForm_ModeChanged(sender, e); + break; + } + } + + protected void RPFEForm_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + RPFEGrid.DataBind(); + if (RPFEGrid.SelectedIndex > RPFEGrid.Rows.Count - 1) + { + RPFEGrid.SelectedIndex = RPFEGrid.Rows.Count - 1; + RPFEGrid.DataBind(); + } + RPFEForm.DataBind(); + } + + protected void RPFEForm_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void RPFEForm_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void RPFEForm_ModeChanged(object sender, EventArgs e) + { + switch (RPFEForm.CurrentMode) + { + case FormViewMode.ReadOnly: + RPFEGrid.Visible = true; + RPFEGrid.DataBind(); + if (RPFEGrid.Rows.Count > 0) + { + if (RPFEGrid.SelectedIndex == -1) + { + RPFEGrid.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert) + { + RPFEGrid.PageIndex = RPFEGrid.PageCount - 1; + RPFEGrid.DataBind(); + RPFEGrid.SelectedIndex = RPFEGrid.Rows.Count - 1; + } + RPFEGrid.DataBind(); + RPFEForm.DataBind(); + } + break; + + case FormViewMode.Edit: + RPFEGrid.Visible = false; + break; + + case FormViewMode.Insert: + RPFEGrid.Visible = false; + break; + } + } + + protected void RPFEForm_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void RPFEForm_DataBound(object sender, EventArgs e) + { + switch (RPFEForm.CurrentMode) + { + case FormViewMode.Edit: + SetClientFocus(RPFEForm, "txtRPFE_RPDAT"); + break; + } + } + + protected void RPFEGrid_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(RPFEGrid, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void RPFEGrid_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in RPFEGrid.Rows) + SetGridViewMouseBehavier(RPFEGrid, row); + } + + protected void RPFEForm_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 刪除前檢查 + // TODO: 檢查關帳日 + } + + protected new bool CheckInput(System.Collections.Specialized.IOrderedDictionary values) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + bool result = true; + values["RPDAT"] = CheckDate(values["RPDAT"].ToString() + "01", "請輸入正確的日期", ref result, cvMessage); + + ProcessCustomValidatorMessage(cvMessage); + return result; + } + + protected void RPFEForm_ItemInserting(object sender, FormViewInsertEventArgs e) + { + //e.Values["RPTYP"] = (RPFEForm.FindControl("ddlRPFE_RPTYP") as DropDownList).SelectedValue; + //e.Cancel = !CheckInput(e.Values); + } + + protected void RPFEForm_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + e.Cancel = !CheckInput(e.NewValues); + } + + protected void cvRPTCT_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i); + } + + // 新增畫面之存檔按鈕 + protected void btnSave1_Click(object sender, EventArgs e) + { + // 存檔 + // 1. 檢查各組輸入 + int[] hasInput = new int[10]; + bool valid = true; + bool saveOk = false; + bool needSave = false; + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + for (int i = 0; i < RPACCs.Length; i++) + { + hasInput[i] = CheckInsertInput(i); + switch (hasInput[i]) + { + case 0: + needSave = true; + break; + case -1: + valid = false; + cvMessage.ErrorMessage += String.Format("第{0}組輸入月份不合理
", i + 1); + break; + case -2: + valid = false; + cvMessage.ErrorMessage += String.Format("第{0}組輸入金額不合理
", i + 1); + break; + case -3: + valid = false; + cvMessage.ErrorMessage += String.Format("第{0}組輸入月份與金額不合理
", i + 1); + break; + } + } + + if (!valid) + { + cvMessage.IsValid = false; + ProcessCustomValidatorMessage(cvMessage); + return; + } + + if (!needSave) + return; + + // 2. 各組輸入存檔 + DbCommand cmd1 = Query.NewCommand( + @"INSERT INTO RPFE + (RPREN, RPPYN, RPDAT, RPACC, RPAMT, RPDOC, + APPNO, TRDAT, TRMOD, TRUSR) + VALUES + (@RPREN, @RPPYN, @RPDAT, @RPACC, @RPAMT, @RPDOC, + 1, GETDATE(), 'INSERT', @TRUSR)"); + cmd1.Parameters.Add(Query.NewParameter("RPREN", DbType.String)); + cmd1.Parameters.Add(Query.NewParameter("RPPYN", _RPPYN)); + cmd1.Parameters.Add(Query.NewParameter("RPDAT", DbType.DateTime)); + cmd1.Parameters.Add(Query.NewParameter("RPACC", DbType.String)); + cmd1.Parameters.Add(Query.NewParameter("RPAMT", DbType.Int32)); + cmd1.Parameters.Add(Query.NewParameter("RPDOC", DbType.String)); + cmd1.Parameters.Add(Query.NewParameter("TRUSR", UserId)); + + // 取得專案年度名稱 + string bppym = GetLookup("BPAA", _RPPYN, "BPPYM", ""); + if (bppym == "") + { + string[] tmp = ddlBPPNM.SelectedItem.Text.Split('】'); + bppym = tmp.Length > 1 ? tmp[1] : ddlBPPNM.SelectedItem.Text; + } + + DbConnection conn = Query.NewConnection(ConnectionString); + cmd1.Connection = conn; + conn.Open(); + DbTransaction tran = conn.BeginTransaction(); + cmd1.Transaction = tran; + try + { + for (int i = 0; i < RPACCs.Length; i++) + { + if (hasInput[i] == 0) + { + string rpren = WGuard1.WNextRen(RPDATValues[i], "RPFE", "RPREN", "YYYYMM<999999>", "", tran); + + cmd1.Parameters["RPREN"].Value = rpren; + cmd1.Parameters["RPDAT"].Value = RPDATValues[i]; + cmd1.Parameters["RPACC"].Value = RPACCs[i].SelectedValue; + cmd1.Parameters["RPAMT"].Value = RPAMTValues[i]; + cmd1.Parameters["RPDOC"].Value = RPDOCs[i].Text; + cmd1.ExecuteNonQuery(); + + // 將資料放進報表要用的 DataTable + AddReportData(rpren, _RPPYN, bppym, RPAMTValues[i], RPACCs[i].Text, RPDATValues[i], RPDOCs[i].Text); + } + } + tran.Commit(); + saveOk = true; + + // 清除畫面資料 + for (int i = 0; i < RPDATs.Length; i++) + { + RPDATs[i].Text = ""; + RPAMTs[i].Text = ""; + RPDOCs[i].Text = ""; + } + } + catch (Exception ex) + { + tran.Rollback(); + cvMessage.ErrorMessage = ex.Message; + cvMessage.IsValid = false; + } + finally + { + conn.Close(); + } + + // 3. 是否要列印單據黏貼條 + if (saveOk && cbWantPrint.Checked) + { + PrintReport(); + } + } + + // 將資料加入報表資料中 + protected void AddReportData(string rpren, string rppyn, string projectName, int amount, string rpacc, DateTime rpdat, string rpdoc) + { + reportData.Rows.Add(rpren, rppyn, projectName, amount, rpdat.ToString("yyyy\"年\"MM\"月\"") + GetBPACC(rpacc) + (rpdoc != "" ? "(" + rpdoc + ")" : "")); + } + + // 列印報表 + protected void PrintReport() + { + WTableTr tableTr = new WTableTr(); + string realFileName = tableTr.ExportToMDB(reportData, ReportDataPath + "RPFE_01.mdb", "RPFE_01", true, true, false); + realFileName = "reportData/" + Path.GetFileName(realFileName); + reportData.Dispose(); + tableTr = null; + + //WCrExport crex = new WCrExport(); + //crex.LoadReport(ReportDataPath + "RPFE_01.rpt", realFileName); + //crex.WebExportAsPdf(Response); + //crex.CloseReport(); + //RegisterStartupScript("REPORT_OBJECT", CRAXHelper.GetCRAXViewerDeclaration()); + ReportParameter rp = new ReportParameter(); + rp.Add("公司名稱", GetString("COMPANY.NAME")); + string realParamFileName = "reportData/" + Path.GetFileName(rp.Save(ReportDataPath + "RPFE_01.rpp", true)); + + RegisterStartupScript("REPORT_JS", + CRAXHelper.GetReportScript(Context, + GetWebRootUrl() + "CRAX/", + "../report/RPFE_01.rpt", + "../" + realFileName, + "../" + realParamFileName, + "", + "RPFE_01.rpt", + "RPFE_01.mdb", + "RPFE_01.rpp", + "", + "", + "", + "", + "", + 0, + 0)); + } + + // 新增畫面之取消按鈕 + protected void btnCancel1_Click(object sender, EventArgs e) + { + // 回到處理畫面 + MultiView1.ActiveViewIndex = 1; + } + + protected string GetBPACC(string bpacc) + { + DbCommand cmd = Query.NewCommand("SELECT BPAME FROM BPAB WHERE BPPYN=@BPPYN AND BPACC=@BPACC"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", _RPPYN)); + cmd.Parameters.Add(Query.NewParameter("BPACC", bpacc)); + object o = Query.ExecuteScalar(cmd); + if (o == null || o == DBNull.Value) + return ""; + else + return o.ToString(); + } + + protected void cvRPAMT_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i > 0; + } + + protected void Next_Click(object sender, EventArgs e) + { + string rppyn = ddlBPPNM.SelectedValue; + + // 檢查此使用者是否有權限處理這個專案 + BprmDAC bprm = new BprmDAC(Query); + if (!bprm.GetRight(rppyn, UserId)) + { + MultiView1.Visible = false; + cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + cvMessage.IsValid = false; + return; + } + + // 檢查科目是否有設定 + dsRPFE_RPACC.SelectParameters["RPPYN"].DefaultValue = rppyn; + DataView dv = dsRPFE_RPACC.Select(new DataSourceSelectArguments()) as DataView; + if (dv.Count == 0) + { + MultiView1.Visible = false; + cvMessage.ErrorMessage = "此專案年度接單尚未設定科目"; + cvMessage.IsValid = false; + return; + } + + ParamList["RPPYN"] = rppyn; + DoAfterCommand("RPFE"); + } + + protected void btnYY_Click(object sender, EventArgs e) + { + int year; + if (!Int32.TryParse(txtYY.Text.Trim(), out year)) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "請輸入正確的年度"; + return; + } + + MultiView1.Visible = false; + ParamList["YY"] = year; + ParamList["RPPYN"] = ""; + DoAfterCommand("RPFE"); + } +} diff --git a/Web/forms/flow/fmBSGP.ascx b/Web/forms/flow/fmBSGP.ascx new file mode 100644 index 0000000..b1e70f7 --- /dev/null +++ b/Web/forms/flow/fmBSGP.ascx @@ -0,0 +1,133 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmBSGP.ascx.cs" Inherits="forms_flow_fmBSGP" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> +差勤表單簽核人員設定 + + + + + + + + + + + + + +
+ 年度: + +
+ 專案: + + +
+ + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
+ (1)





關 +
+ + + +
+
+ +
+ (2)











+
+ + + +
+
+ +
+ (3)





關 +
+ + + +
+
+ +
+
+ +
+ +
+ +
+ +
+
+ + + diff --git a/Web/forms/flow/fmBSGP.ascx.cs b/Web/forms/flow/fmBSGP.ascx.cs new file mode 100644 index 0000000..fc0adbc --- /dev/null +++ b/Web/forms/flow/fmBSGP.ascx.cs @@ -0,0 +1,248 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections.Generic; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Text; +using Wellan.Data; +using Wellan.Common; + +public partial class forms_flow_fmBSGP : Wellan.Web.UI.WUserControlBase +{ + private BpapDAC bpabDao; + private BsgpDAC bsgpDao; + private string _RPPYN; + private int _YY; + + protected void Page_Load(object sender, EventArgs e) + { + _RPPYN = WDAC.GetStringValue(ViewState["RPPYN"]); + _YY = WDAC.GetInt32Value(ViewState["YY"]); + + if (_YY > 0) + { + txtYY.Text = _YY.ToString(); + ListItem item = ddlRPPYN.Items.FindByValue(_RPPYN); + if (item != null) + item.Selected = true; + } + else + { + txtYY.Focus(); + } + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + bpabDao = new BpapDAC(Query); + bsgpDao = new BsgpDAC(Query); + } + + private void BindListBox(bool clear) + { + if (lbBPSN.Items.Count == 0) + { + DataTable bpsnData = GetListData("BPSN", + String.Format("BPEDY IS NULL AND BPDPT IN {0} AND EXISTS (SELECT RANUM FROM RASN WHERE RAPYN IN ('103JYB00001', '103TYB00001') AND RANUM=BPENO AND RAEDT IS NULL)", PublicVariable.InnerDepartment)); + + foreach (DataRow r in bpsnData.Rows) + { + string bpeno = WDAC.GetStringValue(r["BPENO"]); + string bpnme = WDAC.GetStringValue(r["BPNME"]); + lbBPSN.Items.Add(new ListItem(bpeno + " " + bpnme, bpeno)); + } + } + + if (lbBPAP.Items.Count == 0) + { + DataTable bpapData = bpabDao.SelectAll(); + + foreach (DataRow r in bpapData.Rows) + { + string bpeno = WDAC.GetStringValue(r["BPENO"]); + string bpnme = WDAC.GetStringValue(r["BPNME"]); + lbBPAP.Items.Add(new ListItem(bpeno + " " + bpnme, bpeno)); + } + } + + if (clear || lbLVL1.Items.Count == 0) + { + DataTable t1 = bsgpDao.SelectByLevel(_RPPYN, "差勤", 1); + lbLVL1.Items.Clear(); + + foreach (DataRow r in t1.Rows) + { + string eno = WDAC.GetStringValue(r["BSENO"]); + string nme = WDAC.GetStringValue(r["BSNME"]); + lbLVL1.Items.Add(new ListItem(eno + " " + nme, eno)); + } + } + + if (clear || lbLVL2.Items.Count == 0) + { + DataTable t1 = bsgpDao.SelectByLevel(_RPPYN, "差勤", 2); + lbLVL2.Items.Clear(); + + foreach (DataRow r in t1.Rows) + { + string eno = WDAC.GetStringValue(r["BSENO"]); + string nme = WDAC.GetStringValue(r["BSNME"]); + lbLVL2.Items.Add(new ListItem(eno + " " + nme, eno)); + } + } + + if (clear || lbLVL3.Items.Count == 0) + { + DataTable t1 = bsgpDao.SelectByLevel(_RPPYN, "差勤", 3); + lbLVL3.Items.Clear(); + + foreach (DataRow r in t1.Rows) + { + string eno = WDAC.GetStringValue(r["BSENO"]); + string nme = WDAC.GetStringValue(r["BSNME"]); + lbLVL3.Items.Add(new ListItem(eno + " " + nme, eno)); + } + } + } + + // 加入群組 + protected void btnMoveIn_Click(object sender, ImageClickEventArgs e) + { + if (!CheckProjectRight()) + return; + + int bslvl; + switch ((sender as Control).ID) + { + case "btnIn1": + bslvl = 1; + break; + case "btnIn2": + bslvl = 2; + break; + case "btnIn3": + bslvl = 3; + break; + default: + return; + } + + foreach (ListItem itm in lbBPSN.Items) + { + if (itm.Selected) + bsgpDao.InsertOne(_RPPYN, "差勤", bslvl, itm.Value, UserId); + itm.Selected = false; + } + + foreach (ListItem itm in lbBPAP.Items) + { + if (itm.Selected) + bsgpDao.InsertOne(_RPPYN, "差勤", bslvl, itm.Value, UserId); + itm.Selected = false; + } + + BindListBox(true); + } + + // 移出群組 + protected void btnMoveOut_Click(object sender, ImageClickEventArgs e) + { + if (!CheckProjectRight()) + return; + + int bslvl; + ListBox lb; + switch ((sender as Control).ID) + { + case "btnOut1": + bslvl = 1; + lb = lbLVL1; + break; + case "btnOut2": + bslvl = 2; + lb = lbLVL2; + break; + case "btnOut3": + bslvl = 3; + lb = lbLVL3; + break; + default: + return; + } + + foreach (ListItem itm in lb.Items) + { + if (itm.Selected) + bsgpDao.DeleteOne(_RPPYN, "差勤", bslvl, itm.Value); + itm.Selected = false; + } + + BindListBox(true); + } + + protected void btnYY_Click(object sender, EventArgs e) + { + if (!Int32.TryParse(txtYY.Text.Trim(), out _YY)) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "請輸入正確的年度"; + return; + } + + ddlRPPYN.DataSource = new BpaaDAC().GetBpaa(_YY + WGuard1.CY11); + ddlRPPYN.DataBind(); + + ViewState["YY"] = _YY; + _RPPYN = ""; + ViewState["RPPYN"] = ""; + Panel1.Visible = false; + } + + protected void Next_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + _RPPYN = ddlRPPYN.SelectedValue; + ViewState["RPPYN"] = _RPPYN; + + Panel1.Visible = true; + BindListBox(true); + } + + protected void btnClear_Click(object sender, EventArgs e) + { + switch ((sender as Control).ID) + { + case "btnClear1": + lbBPSN.ClearSelection(); + break; + case "btnClear2": + lbBPAP.ClearSelection(); + break; + default: + return; + } + } + + protected bool CheckProjectRight() + { + // 檢查此使用者是否有權限處理這個專案 + BprmDAC bprm = new BprmDAC(Query); + if (!bprm.GetRight(ddlRPPYN.SelectedValue, UserId)) + { + //MultiView1.Visible = false; + cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + cvMessage.IsValid = false; + return false; + } + return true; + } + +} \ No newline at end of file diff --git a/Web/forms/flow/fmRparManager.ascx b/Web/forms/flow/fmRparManager.ascx new file mode 100644 index 0000000..259f2b7 --- /dev/null +++ b/Web/forms/flow/fmRparManager.ascx @@ -0,0 +1,1699 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmRparManager.ascx.cs" + Inherits="forms_manager_fmRpar" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> +<%@ Register Src="../../utility/TimeInput.ascx" TagName="TimeInput" + TagPrefix="uc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 可用補休: + + 0 + + 小時 + + 可用特休: + + 0 + + 小時 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 請假類別: + + +
+ 開始日期: + + + + + + +
+ + + +
+
+ 開始時間: + + +     
+ 結束日期: + + + + + + +
+ + + +
+
+ 結束時間: + + +     
+ 代理人: + + + + + + +
+ + + +
+
+ 代理人電郵: + + +  
+ 請假事由: + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + + + 請假類別: + + +
+ 開始日期: + + + + 開始時間: + + +    
+ 結束日期: + + + + 結束時間: + + + + 請假時數: + + +
+ 代理人姓名: + + + + 代理人電郵: + + +
+ 請假事由: + + +
+ 備註: + + +
+ 附件: + + +
+ + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + + 加班類別: + + +
+ 開始日期: + + + + + + +
+ + + + +
+
+ 開始時間: + + + + 結束時間: + + +
+ 1又1/3時數: + + + + 1又2/3時數: + + + + 1倍時數: + + +
+ 休息日再延長時數: + + + + 例假日再延長時數: + + +
+ 加班事由: + + +
+ 備註: + + +
  + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 加班類別: + + +
+ 日期: + + + + 開始時間: + + + + 結束時間: + + +
+ 加班時數: + + + + 加班費: + + +    
+ 1又1/3時數: + + + + 1又2/3時數: + + + + 1倍時數: + + +
+ 休息日再延長時數: + + + + 例假日再延長時數: + + +
+ 加班事由: + + +
+ 備註: + + +
+ 附件: + + +
+ + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 差旅類別: + + +
+ 開始日期: + + + + + + +
+ + + +
+
+ 開始時間: + + + + 差旅地點: + + +  
+ 結束日期: + + + + + + +
+ + + +
+
+ 結束時間: + + +    
+ 代理人姓名: + + + + + + +
+ + + +
+
+ 代理人電郵: + + +
+ 差旅事由: + + +
+ 差旅地點(最遠): + + + + 差旅起-迄點公里數: + + +
+ 差旅地點(最遠)-地址: + + +
+ 備註: + + +
  + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 差旅類別: + + +
+ 開始時間: + + + + 開始日期: + + + + 差旅地點: + + +
+ 結束日期: + + + + 結束時間: + + + + 差旅費: + + +
+ 代理人姓名: + + + + 代理人電郵: + + +
+ 差旅事由: + + +
+ 差旅地點(最遠): + + + + 差旅起-迄點公里數: + + +
+ 差旅地點(最遠)-地址: + + +
+ 備註: + + +
+ 附件: + + +
+ + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ diff --git a/Web/forms/flow/fmRparManager.ascx.cs b/Web/forms/flow/fmRparManager.ascx.cs new file mode 100644 index 0000000..fa36c6e --- /dev/null +++ b/Web/forms/flow/fmRparManager.ascx.cs @@ -0,0 +1,913 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; +using System.Net.Mail; +using System.Transactions; + +/// +/// 人員出缺勤紀錄 (員工自行輸入) +/// 請假處理 +/// 加班處理 +/// 電話費處理 +/// 油料費處理 +/// 差勤處理 +/// +public partial class forms_manager_fmRpar : Wellan.Web.UI.WUserControlBase +{ + private string _RPPYN = ""; + private int _YY = 0; + private string select = + @"SELECT TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, RPTYP, + RPFTR, RPDOC, RPRSN, RPAGM, RPPLC, APPNO, RPAPP, RPAPD, RPAPU, RPADT, RPAPN, + RPANO, RPAGT, RPRTM, RPETM, RPUST, RPFPC, RPFAD, RPKMS, + FLOOR(RPTCT / 60) AS RPTCT, RPTCT - FLOOR(RPTCT / 60) * 60 AS RPTMT, + FLOOR(RPTC1 / 60) AS RPTC1, RPTC1 - FLOOR(RPTC1 / 60) * 60 AS RPTM1, + FLOOR(RPTC2 / 60) AS RPTC2, RPTC2 - FLOOR(RPTC2 / 60) * 60 AS RPTM2, + FLOOR(RPTC3 / 60) AS RPTC3, RPTC3 - FLOOR(RPTC3 / 60) * 60 AS RPTM3 "; + private string from = " FROM RPAR "; + private FormView RPARForm; + private Panel RPARPanel; + private string rparType; + private BpsnDAC bpsnDao; + private RparDAC rparDao; + private DbConnection conn; + private string oldRPTYP; + private BhrdDAC bhrdDao; + private RpadDAC rpadDao; + private RyerDAC ryerDao; + private string _RPREN; + private string _RPSTP; + private string _RPEDP; + private GetData _getData; + private DateTime 關帳日期; + private int 可用補休; + private int 可用特休; + private TimeCalc timeCalc = new TimeCalc(); + private bool 時數計算至小時; + + public bool 可編輯 + { + get; + set; + } + + public string 單號 + { + get { return _RPREN; } + set { _RPREN = value; } + } + + protected void Page_Load(object sender, EventArgs e) + { + _RPREN = WDAC.GetStringValue(ViewState["RPREN"]); + _RPSTP = WDAC.GetStringValue(ViewState["RPSTP"]); + _RPEDP = WDAC.GetStringValue(ViewState["RPEDP"]); + //if (IsPostBack) + //{ + // gvRPAD.DataBind(); + //} + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsRPARForm.ConnectionString = ConnectionString; + dsRPAR_RPTYP.ConnectionString = ConnectionString; + + bpsnDao = new BpsnDAC(Query); + rparDao = new RparDAC(Query); + bhrdDao = new BhrdDAC(Query); + rpadDao = new RpadDAC(Query); + ryerDao = new RyerDAC(Query); + + /* + _RPPYN = WDAC.GetStringValue(ViewState["RPPYN"]); + if (_RPPYN == null || _RPPYN.Length == 0) + { + _RPPYN = bpsnDao.GetCurrentProject(UserId); + if (_RPPYN == null || _RPPYN.Length == 0) + _RPPYN = "000000001"; + ViewState["RPPYN"] = _RPPYN; + } + */ + + rparType = GetStringParam("type"); + dsRPAR_RPTYP.SelectParameters["BSCLS"].DefaultValue = rparType + "%"; + _YY = GetIntParam("YY"); + + // 取得時數計算至小時 + _getData = new GetData(); + _getData.Query = Query; + BPAARecord bpaaRecord = new BPAARecord(); + DataTable bpaa = _getData.GetBPAA_BPPYN(_RPPYN); + if (bpaa.Rows.Count == 0) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "無此專案"; + return; + } + bpaaRecord.FillRecord(bpaa.Rows[0]); + // 關帳日期 = bpaaRecord.BPMSD.AddMonths(1).AddDays(-1); + 時數計算至小時 = bpaaRecord.BPOTT == "1"; + + // 取得上下班時間、午休時間設定資料 + //上班時間 = WGuard1.WSetR("UNRPARTIME", 1); + //下班時間 = WGuard1.WSetR("UNRPARTIME", 2); + //午休開始 = WGuard1.WSetR("UNRPARTIME", 3); + //午休結束 = WGuard1.WSetR("UNRPARTIME", 4); + //上班分鐘數 = TimeCalc.計算分鐘數(上班時間, 下班時間) - TimeCalc.計算分鐘數(午休開始, 午休結束); + //午休分鐘數 = TimeCalc.計算分鐘數(午休開始, 午休結束); + + // 補休時數 + GetHours(DateTime.UtcNow.AddHours(8).Date); + + Search(); + } + + // 查詢動作 + private new void Search() + { + switch (rparType) + { + case RPAR_TYPE.T0_請假: + RPARForm = RPARForm0; + RPARPanel = Panel1; + break; + case RPAR_TYPE.T1_加班: + RPARForm = RPARForm1; + RPARPanel = Panel2; + break; + case RPAR_TYPE.T3_出差: + RPARForm = RPARForm3; + RPARPanel = Panel3; + break; + } + RPARForm.Visible = true; + RPARPanel.Visible = true; + + dsRPARForm.SelectCommand = select + from + " WHERE RPREN=@RPREN "; + } + + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + // 藉由人員編號以及日期,找出相應的派遣紀錄,填入相關欄位 + /* + DbCommand cmd = Query.NewCommand("SELECT TOP 1 RAITM, RACNM, RAPYN FROM RASN WHERE RANUM=@RPNUM AND ((RASDT <= @RPRDT AND RAEDT >= @RPRDT) OR (RASDT <= @RPRDT AND RAEDT IS NULL)) ORDER BY RAITM"); + cmd.Parameters.Add(Query.NewParameter("RPNUM", UserId)); + cmd.Parameters.Add(Query.NewParameter("RPRDT", e.Command.Parameters["@RPRDT"].Value)); + DataTable rasn = Query.Select(cmd); + if (rasn.Rows.Count > 0) + { + e.Command.Parameters["@RAITM"].Value = rasn.Rows[0]["RAITM"]; + e.Command.Parameters["@RPCNM"].Value = rasn.Rows[0]["RACNM"]; + e.Command.Parameters["@RPPYN"].Value = rasn.Rows[0]["RAPYN"]; + } + */ + + // 電話費、油料費,填入類別 + /* + if (rparType.StartsWith("2")) + e.Command.Parameters["@RPTYP"].Value = rparType; + */ + + // 取出計算需要的資料 + string rpnum = e.Command.Parameters["@RPNUM"].Value.ToString(); + string rptyp = e.Command.Parameters["@RPTYP"].Value.ToString(); + int rptct = Convert.ToInt32(e.Command.Parameters["@RPTCT"].Value); + int rpftr = Convert.ToInt32(e.Command.Parameters["@RPFTR"].Value); + DateTime rprdt = Convert.ToDateTime(e.Command.Parameters["@RPRDT"].Value); + GetData calc = new GetData(); + calc.Query = Query; + int bpsrm; + int bpp02; + double bpbft; + double bpaft; + double bphol; + string bpovr; + string bplve; + string bpott; + + // 取得月薪、伙食津貼、前二加班比率、後二加班比率、假日加班比率、加班費公式、請假扣款公式 + calc.GetRASN_Date_Bppyn_Bpeno_Overwork_Rate( + rprdt, _RPPYN, rpnum, out bpsrm, out bpp02, out bpbft, out bpaft, out bphol, out bpovr, out bplve, out bpott); + + e.Command.Parameters["@RPADT"].Value = DateTime.UtcNow.AddHours(8).Date; + e.Command.Parameters["@RPAPN"].Value = "2"; + + string 起時; + string 迄時; + switch (rparType) + { + case RPAR_TYPE.T0_請假: // 請假,要計算缺勤扣款與請假時數 + // 計算請假時數 + DateTime rpedt = Convert.ToDateTime(e.Command.Parameters["@RPEDT"].Value); + 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); + 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); + + rptct = timeCalc.計算請假總時數(rpnum, rprdt, rpedt, 起時, 迄時, rptyp, bpott == "1"); + e.Command.Parameters["@RPTCT"].Value = rptct; + + // 計算請假扣款 + Absent absent = new Absent(); + absent.bpsrm = bpsrm; + absent.bpp02 = bpp02; + absent.Formula = bplve; + // e.Command.Parameters["@RPFTR"].Value = absent.Add(rptyp, rptct); + e.Command.Parameters["@RPFTR"].Value = absent.Add(rpnum, rptyp, rprdt, rpedt, 起時, 迄時, rprdt, rpedt, bpott == "1"); + + // 若請假 >= 3 天,要批三關 + /* + if ((rpedt.Date - rprdt.Date).Days + 1 >= 3) + e.Command.Parameters["@RPAPN"].Value = "3"; + */ + break; + case RPAR_TYPE.T1_加班: // 加班,要計算加班費與前二、後二、假日加班時數 + // 計算加班時數 + 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); + 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); + + rptct = timeCalc.計算加班時數(rpnum, rprdt, 起時, 迄時, RPAR_TYPE.休息日加班(rptyp)); + e.Command.Parameters["@RPTCT"].Value = rptct; + + // 計算加班費以及前二、後二、假日加班時數 + int RPTC1 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC1"].Value) * 60; + int RPTC2 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC2"].Value) * 60; + int RPTC3 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC3"].Value) * 60; + int RPTC4 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC4"].Value) * 60; + int RPTC5 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC5"].Value) * 60; + e.Command.Parameters["@RPTC1"].Value = RPTC1; + e.Command.Parameters["@RPTC2"].Value = RPTC2; + e.Command.Parameters["@RPTC3"].Value = RPTC3; + e.Command.Parameters["@RPTC4"].Value = RPTC4; + e.Command.Parameters["@RPTC5"].Value = RPTC5; + if (rptct < RPTC1 + RPTC2 + RPTC3 + RPTC4 + RPTC5) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "各項時數之和 不可大於 加班時數!"; + e.Cancel = true; + } + + ExtraWork extraWork = new ExtraWork(); + extraWork.Add(rptyp, rprdt, rptct, bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5); + e.Command.Parameters["@RPFTR"].Value = + extraWork.RPTA1 + extraWork.RPTA2 + extraWork.RPTA3 + extraWork.RPTA4 + extraWork.RPTA5; + e.Command.Parameters["@RPTA1"].Value = extraWork.RPTA1; + e.Command.Parameters["@RPTA2"].Value = extraWork.RPTA2; + e.Command.Parameters["@RPTA3"].Value = extraWork.RPTA3; + e.Command.Parameters["@RPTA4"].Value = extraWork.RPTA4; + e.Command.Parameters["@RPTA5"].Value = extraWork.RPTA5; + e.Command.Parameters["@RPUST"].Value = 0; + + break; + case RPAR_TYPE.T3_出差: + rpedt = Convert.ToDateTime(e.Command.Parameters["@RPEDT"].Value); + 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); + 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); + rptct = timeCalc.計算差旅時數(rpnum, rprdt, rpedt, 起時, 迄時); + e.Command.Parameters["@RPTCT"].Value = rptct; + break; + } + } + + protected void dsRPARForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + if (e.Cancel) + return; + + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(); + try + { + e.Command.Connection = conn; + e.Command.Transaction = tran; + + _RPREN = WDAC.GetStringValue(e.Command.Parameters["@RPREN"].Value); + string 新類別 = WDAC.GetStringValue(e.Command.Parameters["@RPTYP"].Value); + DateTime 新日期 = WDAC.GetDateTimeValue(e.Command.Parameters["@RPRDT"].Value); + int 新時數 = WDAC.GetInt32Value(e.Command.Parameters["@RPTCT"].Value); + + // 如果是請假 + if (rparType == RPAR_TYPE.T0_請假) + { + // 舊資料如果是補休,要取消沖補休 + if (oldRPTYP == RPAR_TYPE.T00_補休) + { + rparDao.取消沖補休(tran, _RPREN); + } + + // 舊資料如果是特休,要取消沖特休 + if (oldRPTYP == RPAR_TYPE.T01_特休) + { + ryerDao.取消沖特休(tran, _RPREN); + } + + // 新資料如果是補休,要沖補休 + if (新類別 == RPAR_TYPE.T00_補休) + { + e.Command.Parameters["@RPDOC"].Value = + rparDao.沖補休(tran, _RPREN, UserId, 新日期, 新時數); + } + + // 新資料如果是特休,要沖特休 + if (新類別 == RPAR_TYPE.T01_特休) + { + ryerDao.沖特休(UserId, 新日期.Year, 新時數, tran); + } + } + } + catch + { + tran.Rollback(); + tran = null; + e.Cancel = true; + throw; + } + } + + protected void dsRPARForm_Updated(object sender, SqlDataSourceStatusEventArgs e) + { + if (tran != null) + { + tran.Commit(); + tran = null; + } + + if (conn != null && conn.State == ConnectionState.Open) + { + conn.Close(); + conn.Dispose(); + conn = null; + } + } + + protected void RPARForm_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Cancel": + Search(); + RPARForm.ChangeMode(FormViewMode.ReadOnly); + RPARForm_ModeChanged(sender, e); + break; + case "Detail": // 差旅費 + pnlRPAD.Visible = !pnlRPAD.Visible; + + if (pnlRPAD.Visible) + { + _RPREN = WDAC.GetStringValue(e.CommandArgument); + ViewState["RPREN"] = _RPREN; + _RPSTP = bpsnDao.GetCurrentSite(UserId); + if (_RPSTP.EndsWith("站") || _RPSTP.EndsWith("台")) + _RPSTP = _RPSTP.Substring(0, _RPSTP.Length - 1); + ViewState["RPSTP"] = _RPSTP; + _RPEDP = (RPARForm.FindControl("lbRPAR_RPPLC") as ITextControl).Text; + ViewState["RPEDP"] = _RPEDP; + txtRPSTP.Text = _RPSTP; + txtRPEDP.Text = _RPEDP; + gvRPAD.DataBind(); + } + break; + } + } + + protected void RPARForm_ModeChanged(object sender, EventArgs e) + { + switch (RPARForm.CurrentMode) + { + case FormViewMode.Edit: + pnlRPAD.Visible = false; + break; + } + } + + protected void RPARForm_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + private void GetHours(DateTime rprdt) + { + 可用補休 = rparDao.Get可用補休(UserId, rprdt); + 可用特休 = ryerDao.Get可用特休(UserId, rprdt.Year, rprdt.Month, rprdt.Day); + lb可用補休.Text = (可用補休 / 60).ToString(); + lb可用特休.Text = (可用特休 / 60).ToString(); + } + + protected void RPARForm_DataBound(object sender, EventArgs e) + { + switch (RPARForm.CurrentMode) + { + case FormViewMode.Edit: + (RPARForm.FindControl("lbRPAR_RPNUM") as ITextControl).Text = UserId; + (RPARForm.FindControl("lbRPAR_RPNUMX") as ITextControl).Text = UserName; + + RegisterCalendarEvent(RPARForm, "btnRPAR_RPRDT_DATE", "txtRPAR_RPRDT"); + RegisterCalendarEvent(RPARForm, "btnRPAR_RPEDT_DATE", "txtRPAR_RPEDT"); + RegisterLookupEvent(RPARForm, "btnRPAR_RPAGT_WQRY", "txtRPAR_RPAGT", + "txtRPAR_RPAGT,txtRPAR_RPAGM", "BPSNEML", + "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)", + false); + + SetClientFocus(RPARForm, "txtRPAR_RPRDT"); + break; + case FormViewMode.ReadOnly: + if (rparType == RPAR_TYPE.T3_出差 && pnlRPAD.Visible) + { + _RPEDP = (RPARForm.FindControl("lbRPAR_RPPLC") as ITextControl).Text; + ViewState["RPEDP"] = _RPEDP; + txtRPEDP.Text = _RPEDP; + } + break; + } + GetHours(DateTime.UtcNow.AddHours(8).Date); + } + + protected new bool CheckInput(System.Collections.Specialized.IOrderedDictionary values) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + //BhrdDAC bhrd = new BhrdDAC(); + string rptyp = WDAC.GetStringValue(values["RPTYP"]); + string rppyn = WDAC.GetStringValue(values["RPPYN"]); + string rpnum = WDAC.GetStringValue(values["RPNUM"]); + string rpren = WDAC.GetStringValue(values["RPREN"]); + + bool result = true; + switch (rparType) + { + case RPAR_TYPE.T0_請假: // 請假 + values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的開始日期", ref result, cvMessage); + values["RPEDT"] = CheckDate(values["RPEDT"], "請輸入正確的結束日期", ref result, cvMessage); + + DateTime sdt = WDAC.GetDateTimeValue(values["RPRDT"]); + DateTime edt = WDAC.GetDateTimeValue(values["RPEDT"]); + string stm = WDAC.GetStringValue(values["RPRTM"]); + string etm = WDAC.GetStringValue(values["RPETM"]); + + // 關帳 + if (!CheckCloseAccount(rppyn, sdt, edt)) + { + result = false; + cvMessage.ErrorMessage += "此月份已關帳,不可輸入單據"; + cvMessage.IsValid = false; + } + + // 日期 + if (result && sdt > edt) + { + result = false; + cvMessage.ErrorMessage += "開始日期 不可大於 結束日期"; + cvMessage.IsValid = false; + } + + // 時間必須輸入 + if (stm == "") + { + result = false; + cvMessage.ErrorMessage += "開始時間必須輸入"; + cvMessage.IsValid = false; + } + if (etm == "") + { + result = false; + cvMessage.ErrorMessage += "結束時間必須輸入"; + cvMessage.IsValid = false; + } + if (sdt == edt && stm.CompareTo(etm) > 0) + { + result = false; + cvMessage.ErrorMessage += "開始時間必須早於結束時間"; + cvMessage.IsValid = false; + } + + // 假日,檢查頭尾是否為假日,但是產假不用檢查 + if (rptyp != RPAR_TYPE.T05_產假 && bhrdDao.IsHoliday(UserId, sdt)) + { + result = false; + cvMessage.ErrorMessage += String.Format("{0:yyyy-MM-dd} 是假日,不需請假。", sdt); + cvMessage.IsValid = false; + } + + if (rptyp != RPAR_TYPE.T05_產假 && bhrdDao.IsHoliday(UserId, edt)) + { + result = false; + cvMessage.ErrorMessage += String.Format("{0:yyyy-MM-dd} 是假日,不需請假。", edt); + cvMessage.IsValid = false; + } + + // 計算時數 + int rptct = timeCalc.計算請假總時數(rpnum, sdt, edt, stm, etm, rptyp, 時數計算至小時); + + // 補休時數不足 + if (rptyp == RPAR_TYPE.T00_補休 && 可用補休 < rptct) + { + result = false; + cvMessage.ErrorMessage += "補休時數不足!"; + cvMessage.IsValid = false; + } + + // 特休時數不足 + if (rptyp == RPAR_TYPE.T01_特休 && 可用特休 < rptct) + { + result = false; + cvMessage.ErrorMessage += "特休時數不足!"; + cvMessage.IsValid = false; + } + + break; + case RPAR_TYPE.T1_加班: // 加班 + values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的日期", ref result, cvMessage); + sdt = WDAC.GetDateTimeValue(values["RPRDT"]); + edt = WDAC.GetDateTimeValue(values["RPEDT"]); + stm = WDAC.GetStringValue(values["RPRTM"]); + etm = WDAC.GetStringValue(values["RPETM"]); + + // 計算時數 + rptct = timeCalc.計算加班時數(UserId, sdt, stm, etm, RPAR_TYPE.休息日加班(rparType)); + + // 關帳檢查 + if (!CheckCloseAccount(rppyn, values["RPRDT"], new DateTime())) + { + result = false; + cvMessage.ErrorMessage += "此月份已關帳,不可輸入單據"; + cvMessage.IsValid = false; + } + + // 時間必須輸入 + if (stm == "") + { + result = false; + cvMessage.ErrorMessage += "開始時間必須輸入"; + cvMessage.IsValid = false; + } + if (etm == "") + { + result = false; + cvMessage.ErrorMessage += "結束時間必須輸入"; + cvMessage.IsValid = false; + } + if (sdt == edt && stm.CompareTo(etm) > 0) + { + result = false; + cvMessage.ErrorMessage += "開始時間必須早於結束時間"; + cvMessage.IsValid = false; + } + + // 檢查休息日加班 + if (RPAR_TYPE.休息日加班(rptyp)) + { + string message; + if (!rparDao.檢查休息日加班(rpnum, sdt, rpren, out message)) + { + result = false; + cvMessage.ErrorMessage = message; + cvMessage.IsValid = false; + } + } + + // 全月加班時數限制 46 小時 + var ot_time = rparDao.Select當月加班時數(sdt, UserId, rpren) + rptct; + if (ot_time > 46 * 60) + { + result = false; + cvMessage.ErrorMessage = "加班日的同月加班時數已超過 46 小時"; + cvMessage.IsValid = false; + } + + // 計算加班時數 + //rptct = timeCalc.計算加班時數(rpnum, WDAC.GetDateTimeValue(values["RPRDT"]), stm, etm, false); + //int 前二 = WDAC.GetInt32Value(values["RPTC1"]) * 60; + //int 後二 = WDAC.GetInt32Value(values["RPTC2"]) * 60; + //int 假日 = WDAC.GetInt32Value(values["RPTC3"]) * 60; + + //if (rptct < 前二 + 後二 + 假日) + //{ + // result = false; + // cvMessage.ErrorMessage = "前二時數 + 後二時數 + 假日時數 不可大於 加班時數!"; + // cvMessage.IsValid = false; + //} + break; + case RPAR_TYPE.T3_出差: // 差旅 + values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的開始日期", ref result, cvMessage); + values["RPEDT"] = CheckDate(values["RPEDT"], "請輸入正確的結束日期", ref result, cvMessage); + sdt = WDAC.GetDateTimeValue(values["RPRDT"]); + edt = WDAC.GetDateTimeValue(values["RPEDT"]); + stm = WDAC.GetStringValue(values["RPRTM"]); + etm = WDAC.GetStringValue(values["RPETM"]); + + // 關帳檢查 + if (!CheckCloseAccount(rppyn, values["RPRDT"], values["RPEDT"])) + { + result = false; + cvMessage.ErrorMessage += "此月份已關帳,不可輸入單據"; + cvMessage.IsValid = false; + } + + if (result && Convert.ToDateTime(values["RPRDT"]).CompareTo(values["RPEDT"]) > 0) + { + result = false; + cvMessage.ErrorMessage += "開始日期 不可大於 結束日期"; + cvMessage.IsValid = false; + } + // 時間必須輸入 + if (stm == "") + { + result = false; + cvMessage.ErrorMessage += "開始時間必須輸入"; + cvMessage.IsValid = false; + } + if (etm == "") + { + result = false; + cvMessage.ErrorMessage += "結束時間必須輸入"; + cvMessage.IsValid = false; + } + if (sdt == edt && stm.CompareTo(etm) > 0) + { + result = false; + cvMessage.ErrorMessage += "開始時間必須早於結束時間"; + cvMessage.IsValid = false; + } + + if (WDAC.GetStringValue(values["RPPLC"]).Trim().Length == 0) + { + result = false; + cvMessage.ErrorMessage += "差旅地點必須輸入"; + cvMessage.IsValid = false; + } + if (WDAC.GetStringValue(values["RPRSN"]).Trim().Length == 0) + { + result = false; + cvMessage.ErrorMessage += "差旅事由必須輸入"; + cvMessage.IsValid = false; + } + break; + } + + ProcessCustomValidatorMessage(cvMessage); + return result; + } + + protected void RPARForm_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + if (RPARForm.FindControl("ddlRPAR_RPTYP") != null) + e.NewValues["RPTYP"] = (RPARForm.FindControl("ddlRPAR_RPTYP") as DropDownList).SelectedValue; + + e.Cancel = !CheckInput(e.NewValues); + + // 記住舊類別,以便做請補休假的判斷 + oldRPTYP = WDAC.GetStringValue(e.OldValues["RPTYP"]); + } + + protected void RPARForm_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void cvRPTCT_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i > 0; + } + + protected void cvRPNUM_ServerValidate(object source, ServerValidateEventArgs args) + { + args.IsValid = args.Value != "" && bpsnDao.IsExist(args.Value, true); + } + + protected void btnInsertRPAD_Click(object sender, EventArgs e) + { + DateTime rpdat; + CheckDate(txtRPDAT.Text, out rpdat); + + rpadDao.InsertOne(UserId, _RPREN, txtRPSTP.Text, txtRPEDP.Text, + WDAC.GetInt32Value(txtRPF01.Text), + WDAC.GetInt32Value(txtRPF02.Text), + WDAC.GetInt32Value(txtRPF03.Text), + WDAC.GetInt32Value(txtRPF04.Text), + WDAC.GetInt32Value(txtRPF05.Text), + WDAC.GetInt32Value(txtRPF06.Text), + WDAC.GetInt32Value(txtRPF07.Text), + WDAC.GetInt32Value(txtRPF08.Text), + 0, + 0, + rpdat, + txtRPVCH.Text, + txtRPDOC.Text); + + gvRPAD.DataBind(); + RPARForm.DataBind(); + + txtRPDAT.Text = ""; + txtRPSTP.Text = _RPSTP; + txtRPEDP.Text = _RPEDP; + txtRPF01.Text = ""; + txtRPF02.Text = ""; + txtRPF03.Text = ""; + txtRPF04.Text = ""; + txtRPF05.Text = ""; + txtRPF06.Text = ""; + txtRPF07.Text = ""; + txtRPF08.Text = ""; + txtRPVCH.Text = ""; + txtRPDOC.Text = ""; + } + + protected void dsRpad_ObjectCreating(object sender, ObjectDataSourceEventArgs e) + { + e.ObjectInstance = rpadDao; + } + + protected void dsRpad_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + //_RPREN = WDAC.GetStringValue(ViewState["RPREN"]); + e.InputParameters["rpren"] = _RPREN; + } + + protected void dsRpad_Updated(object sender, ObjectDataSourceStatusEventArgs e) + { + RPARForm.DataBind(); + } + + protected void dsRpad_Deleted(object sender, ObjectDataSourceStatusEventArgs e) + { + RPARForm.DataBind(); + } + + protected void btnHideRPAD_Click(object sender, EventArgs e) + { + pnlRPAD.Visible = false; + } + + /// + /// 關帳檢查 + /// + /// 起始日 + /// 結束日 + /// True=通過檢查, False=不通過檢查 + protected bool CheckCloseAccount(object rppyn, object rprdt, object rpedt) + { + DateTime rdt = WDAC.GetDateTimeValue(rprdt); + DateTime edt = WDAC.GetDateTimeValue(rpedt); + + _getData = new GetData(); + _getData.Query = Query; + BPAARecord bpaaRecord = new BPAARecord(); + DataTable bpaa = _getData.GetBPAA_BPPYN(WDAC.GetStringValue(rppyn)); + if (bpaa.Rows.Count == 0) + { + return false; + } + bpaaRecord.FillRecord(bpaa.Rows[0]); + // 關帳日期 = bpaaRecord.BPMSD.AddMonths(1).AddDays(-1); + 關帳日期 = bpaaRecord.BPMSD; + + if (edt.Ticks != 0) + return (關帳日期 < rdt && 關帳日期 < edt); + else + return (關帳日期 < rdt); + } + + /// + /// 是否可編輯 + /// + /// 起始日 + /// 結束日 + /// 已簽核次數 + /// + protected bool CanEdit(object rppyn, object rprdt, object rpedt, object rpano, object rpapd) + { + string ano = WDAC.GetStringValue(rpano); + DateTime apd = WDAC.GetDateTimeValue(rpapd); + return CheckCloseAccount(rppyn, rprdt, rpedt) && (ano == "1") && (apd.Ticks == 0); + } + + /// + /// 是否可編輯 + /// + /// 單號 + protected bool CanEdit(object rpren) + { + if (rpren == null) + return false; + + RPARList d = rparDao.SelectOne(WDAC.GetStringValue(rpren)); + if (d.Count > 0) + return CanEdit(d[0].RPPYN, d[0].RPRDT, d[0].RPEDT, d[0].RPANO, d[0].RPAPD); + else + return false; + } + + protected void dsBSGP_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + e.InputParameters["BSPYN"] = _RPPYN; + } + + protected new string GetBPNME(object RPENO) + { + string rpeno = WDAC.GetStringValue(RPENO); + + if (rpeno.Length > 0 && rpeno.Substring(0, 1) == "Z") + { + return GetLookup("BPAP", rpeno, "BPNME", ""); + } + else + { + return GetLookup("BPSN", rpeno, "BPNME", ""); + } + } + + protected void gvRPAD_DataBound(object sender, EventArgs e) + { + //btnInsertRPAD.Enabled = CanEdit(RPARGrid.SelectedValue); + } + + protected void dsRpad_Updating(object sender, ObjectDataSourceMethodEventArgs e) + { + DateTime rpdat; + CheckDate(WDAC.GetStringValue(e.InputParameters["rpdat"]), out rpdat); + e.InputParameters["rpdat"] = rpdat; + e.InputParameters["rpf09"] = 0; + e.InputParameters["rpf10"] = 0; + } + + protected void dsBPSE_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + switch (rparType) + { + case RPAR_TYPE.T1_加班: + e.InputParameters["BPTYP"] = "加班"; + break; + case RPAR_TYPE.T3_出差: + e.InputParameters["BPTYP"] = "差旅"; + break; + } + } + + protected string GetPhraseClientClick(object BPCNT) + { + string CID = ""; + switch (rparType) + { + case RPAR_TYPE.T1_加班: + CID = (RPARForm1.FindControl("txtRPAR_RPDOC") as Control).ClientID; + break; + case RPAR_TYPE.T3_出差: + CID = (RPARForm3.FindControl("txtRPAR_RPDOC") as Control).ClientID; + break; + } + if (CID.Length > 0) + return String.Format("javascript:FillMessage(\"{0}\", \"{1}\");return false;", CID, BPCNT); + else + return "javascript:return false;"; + } + + protected string Get關卡名稱(object RPANO, object RPAPN) + { + string rpano = WDAC.GetStringValue(RPANO); + string rpapn = WDAC.GetStringValue(RPAPN); + + if (rpano == "1") + return "第 1 關"; + else if ((rpano == "2" && rpapn == "2") || (rpano == "3" && rpapn == "3")) + return "第 2 關"; + else if (rpano == "3" && rpapn == "2") + return "長官關"; + else if (rpano == "D") + return "抽單"; + else + return rpano; + } + + protected void dsRPARForm_Selecting(object sender, SqlDataSourceSelectingEventArgs e) + { + e.Command.Parameters["RPREN"].Value = _RPREN; + } + + protected string GetAttachLink(string RPREN) + { + return RparDAC.GetAttachLink(RPREN, Page); + //string f = string.Format("{0}\\{1}.jpg", Server.MapPath("~/UploadedPicture/RPAR_ATTACHMENT"), RPREN); + + //if (File.Exists(f)) + // return string.Format("附件檢視", + // ResolveClientUrl("~/UploadedPicture/RPAR_ATTACHMENT/"), RPREN); + //else + // return "無附件"; + } +} diff --git a/Web/forms/flow/fmSign.ascx b/Web/forms/flow/fmSign.ascx new file mode 100644 index 0000000..0aed599 --- /dev/null +++ b/Web/forms/flow/fmSign.ascx @@ -0,0 +1,2731 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmSign.ascx.cs" + Inherits="forms_flow_fmSign" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> +<%@ Register Src="~/forms/punchcard/fmCardSearch.ascx" TagName="fmCardSearch" + TagPrefix="uc1" %> +<%@ Register Src="../../utility/TimeInput.ascx" TagName="TimeInput" + TagPrefix="uc3" %> + +簽核表單 + +
+ + + + + + +
+
+ + +
+ (一) 需要您簽核的表單 +
+ +
+
+ +
+
+
+ +
+
+
+ 類別: +
+
+
+ +
+
+ + 請假單    + 加班單    + 差旅單 + +
+
+
+
+ 人員: +
+
+
+ +
+
+ + +
+
+
(過濾篩選條件全不選 = 不使用這個過濾條件)
+
+
+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<%-- + + --%> + + + + + + + + + + + + <% if (!cb過濾篩選.Checked) + { %> + + <% } + else + { %> + + <% }%> + + + + + +
+ +
+ + (二) 您已簽核的表單 (下一關尚未簽核,可取消) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<%-- + + --%> + + + + + + + <%# RparDAC.GetAttachLink(Eval("RPREN", "{0}"), Page) %> + + + + + + + + + + + + + + (三) 您申請的表單 + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 請假單 + 加班單 + 差旅單 + +   + + + + 全部 + 核准 + 不核准 + 尚未簽核 + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%# RparDAC.GetAttachLink(Eval("RPREN", "{0}"), Page) %> + + + + + + + + + + + +
+ + (四) 您督導專案的表單 + + + + + + + <%-- --%> + <%-- --%> + + + + + + + + + + + + + + + + + + + <%-- --%> + <%-- --%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 請假單 + 加班單 + 差旅單 + + + + + + + + +
+ + + + + + +
+ + + <%-- + --%> + + + + + + +
+ + + + + + + + + +
+ + + + + + + +
匯出格式: + + + 明細 + 統計 + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<%-- + + --%> + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + (六) 班表查詢 + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + +
+ + + +
+
+ + + + +
+ + + + + + + + + + +
+ + + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + + + 本月班別: + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + + 請假類別: + + +
+ 開始日期: + + + + 開始時間: + + +        
+ 結束日期: + + + + 結束時間: + + + + 請假時數: + + +    
+ 代理人姓名: + + + + 代理人電郵: + + +
+ 請假事由: + + +
+ 備註: + + +
+ 附件: + + +
  + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 請假類別: + + + +
+ 開始日期: + + + + 開始時間: + + +     
+ 結束日期: + + + + 結束時間: + + +      
+ 代理人: + + + + + + +
+ + + +
+
+ 代理人電郵: + + +  
+ 請假事由: + + +
  + +
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<%-- + --%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 加班類別: + + +
+ 日期: + + + + 開始時間: + + + + 結束時間: + + +
+ 加班時數: + + + + + 加班費: + + +    
+ 1又1/3時數: + + + + 1又2/3時數: + + + + 1倍時數: + + +
+ 休息日再延長時數: + + + + 例假日再延長時數: + + +
+ 加班事由: + + +
+ 備註: + + +
+ 附件: + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + + 加班類別: + + + +
+ 開始日期: + + + + 開始時間: + + + + 結束時間: + + +
+ 1又1/3時數: + + + + + + + + 1又2/3時數: + + + + + + + + 1倍時數: + + + + + + +
+ 休息日再延長時數: + + + + + + + + 例假日再延長時數: + + + + + + +
+ 加班事由: + + +
+ 備註: + + +
  + + + + + + +
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 差旅類別: + + +
+ 開始日期: + + + + 開始時間: + + + + 差旅費: +   + +
+ 結束日期: + + + + 結束時間: + + +
+ 差旅地點: + + +
+ 代理人姓名: + + + + 代理人電郵: + + +
+ 差旅事由: + + +
+ 差旅地點(最遠): + + + + 差旅起-迄點公里數: + + +
+ 差旅地點(最遠)-地址: + + +
+ 備註: + + +
+ 附件: + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 差旅類別: + + + +
+ 開始日期: + + + + 開始時間: + + +
+ 結束日期: + + + + 結束時間: + + +    
+ 差旅地點: + + +
+ 代理人姓名: + + + + + + +
+ + + +
+
+ 代理人電郵: + + +
+ 差旅事由: + + +
+ 差旅地點(最遠): + + + + 差旅起-迄點公里數: + + +
+ 差旅地點(最遠)-地址: + + +
+ 備註: + + +
  + + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +  
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + +
+
+
+
+
+
+ + + + + + + + + + +
+ + + +
+ + + + + + + + + +
+ 簽核: + + + 核准 + 不核准 + +
+ 簽核意見: + + +
+ + + + + + +
+ 下一關簽核人: + + + + +
+
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ diff --git a/Web/forms/flow/fmSign.ascx.cs b/Web/forms/flow/fmSign.ascx.cs new file mode 100644 index 0000000..9e86332 --- /dev/null +++ b/Web/forms/flow/fmSign.ascx.cs @@ -0,0 +1,2217 @@ +using NPOI.HSSF.UserModel; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.IO; +using System.Linq; +using System.Net.Mail; +using System.Text; +using System.Web.UI; +using System.Web.UI.WebControls; +using Wellan.Common; +using Wellan.Data; + + +public partial class forms_flow_fmSign : Wellan.Web.UI.WUserControlBase +{ + private RparDAC rparDao; + private RpabDAC rpabDao; + private BsgpDAC bsgpDao; + private RyerDAC ryerDao; + private RpadDAC rpadDao; + private BpsnDAC bpsnDao; + private DbConnection conn; + private BtmeDAC btmeDao; + private RtmeDAC rtmeDao; + private BhrdDAC bhrdDao; + private List BtmeList; + private List RtmeList; + private string monthBhrd; + private string[] holidayData = null; + + protected void Page_Load(object sender, EventArgs e) + { + btnPage4.Visible = bsgpDao.是否是主要簽核(UserId); + // btnPage5.Visible = btnPage4.Visible; + + AddTabButton(MV主要, 0, btnPage1); + AddTabButton(MV主要, 1, btnPage2); + AddTabButton(MV主要, 2, btnPage3); + AddTabButton(MV主要, 3, btnPage4); + AddTabButton(MV主要, 4, btnPage5); + AddTabButton(MV主要, 5, btnPage6); + + if (txtDATE1.Text.Length == 0) + txtDATE1.Text = WGuard1.WDAYTRAN(DateTime.UtcNow.AddHours(8).Date, 1).ToString("yyyyMMdd"); + if (txtDATE2.Text.Length == 0) + txtDATE2.Text = WGuard1.WDAYTRAN(DateTime.UtcNow.AddHours(8).Date, 31).ToString("yyyyMMdd"); + if (txtDATE3.Text.Length == 0) + txtDATE3.Text = WGuard1.WDAYTRAN(DateTime.UtcNow.AddHours(8).Date, 1).ToString("yyyyMMdd"); + if (txtDATE4.Text.Length == 0) + txtDATE4.Text = WGuard1.WDAYTRAN(DateTime.UtcNow.AddHours(8).Date, 31).ToString("yyyyMMdd"); + if (txtYear.Text.Length == 0) + txtYear.Text = DateTime.UtcNow.AddHours(8).Date.ToString("yyyy"); + + btmeDao = new BtmeDAC(Query); + rtmeDao = new RtmeDAC(Query); + bhrdDao = new BhrdDAC(Query); + + if (txtCalendarYear.Text == "") + { + txtCalendarYear.Text = DateTime.UtcNow.AddHours(8).ToString("yyyy"); + ddlCalendarMonth.SelectedValue = DateTime.UtcNow.AddHours(8).ToString("MM"); + Calendar1.VisibleDate = DateTime.UtcNow.AddHours(8).Date; + StoreYYMM(); + } + + if (!IsPostBack) + { + cb不分頁.Checked = WGuard1.WSetR(Query, string.Format("SIGN_NP_1_{0}", UserId), 1) == "Y"; + cb過濾篩選.Checked = WGuard1.WSetR(Query, string.Format("SIGN_FT_1_{0}", UserId), 1) == "Y"; + + if (cb不分頁.Checked) + { + cb不分頁_CheckedChanged(sender, e); + } + if (cb過濾篩選.Checked) + { + cb過濾篩選_CheckedChanged(sender, e); + } + + rblRPTYP2_SelectedIndexChanged(sender, e); + } + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsRPAB.ConnectionString = ConnectionString; + dsRPARForm.ConnectionString = ConnectionString; + dsRPAR_RPTYP.ConnectionString = ConnectionString; + dsRPAB2.ConnectionString = ConnectionString; + rparDao = new RparDAC(Query); + rpabDao = new RpabDAC(Query); + bsgpDao = new BsgpDAC(Query); + ryerDao = new RyerDAC(Query); + rpadDao = new RpadDAC(Query); + bpsnDao = new BpsnDAC(Query); + RegisterLookupEvent(this, "btnCalendarUser", "txtCalendarUser", "txtCalendarUser,lbCalendarUserName", "BPSN1", ""); + } + + protected void dsRPARGrid_Selecting(object sender, SqlDataSourceSelectingEventArgs e) + { + e.Command.Parameters["@RPAPU"].Value = UserId; + } + + protected void RPARGrid_PageIndexChanged(object sender, EventArgs e) + { + (sender as GridView).SelectedIndex = 0; + (sender as GridView).DataBind(); + OpenSignForm(); + } + + protected void RPARGrid_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in (sender as GridView).Rows) + SetGridViewMouseBehavier((sender as GridView), row); + + OpenSignForm(); + } + + protected void RPARGrid_DataBound(object sender, EventArgs e) + { + GridView GV = sender as GridView; + + gvRPAB2.Visible = GV.Rows.Count > 0; + + if (GV.Rows.Count == 0) + { + GV.SelectedIndex = -1; + pnlSheet.Visible = false; + pnlSign.Visible = false; + } + else + { + if (GV.Rows.Count > 0 && GV.SelectedIndex == -1) + { + GV.SelectedIndex = 0; + } + else if (GV.Rows.Count > 0 && GV.Rows.Count - 1 < GV.SelectedIndex) + { + GV.SelectedIndex = GV.Rows.Count - 1; + } + OpenSignForm(); + } + } + + protected override void BindTabContent() + { + base.BindTabContent(); + OpenSignForm(); + } + + private void OpenSignForm() + { + if (MV主要.ActiveViewIndex == 0 && RPARGrid.SelectedIndex == -1) + { + pnlSheet.Visible = false; + pnlSign.Visible = false; + return; + } + + if (MV主要.ActiveViewIndex == 3 && RPARGrid2.SelectedIndex == -1) + { + pnlSheet.Visible = false; + pnlSign.Visible = false; + return; + } + + string rpren = ""; + if (MV主要.ActiveViewIndex == 0) + rpren = WDAC.GetStringValue(RPARGrid.SelectedValue); + else if (MV主要.ActiveViewIndex == 3) + rpren = WDAC.GetStringValue(RPARGrid2.SelectedValue); + else + { + pnlSheet.Visible = false; + pnlSign.Visible = false; + return; + } + + RPARList t = rparDao.SelectOne(rpren); + if (t.Count == 0) + { + pnlSheet.Visible = false; + pnlSign.Visible = false; + return; + } + + // RPAPN 應簽關卡數 RPANO 本關關卡 應撈第幾關簽核人 + // ============== ============= ============== + // 3 1 2 + // 3 2 3 + // 3 3 - + // 2 1 3 + // 2 2 - + + string rpapn = WDAC.GetStringValue(t[0].RPAPN); + string rpano = WDAC.GetStringValue(t[0].RPANO); + string rppyn = WDAC.GetStringValue(t[0].RPPYN); + string rptyp = WDAC.GetStringValue(t[0].RPTYP); + string bslvl = ""; + + switch (rptyp.Substring(0, 1)) + { + case RPAR_TYPE.T0_請假: + dsRPAR_RPTYP.SelectParameters["BSCLS"].DefaultValue = "0%"; + MultiView1.SetActiveView(View請假); + RPARForm01.ChangeMode(FormViewMode.ReadOnly); + RPARForm01.DataBind(); + break; + case RPAR_TYPE.T1_加班: + dsRPAR_RPTYP.SelectParameters["BSCLS"].DefaultValue = "1%"; + MultiView1.SetActiveView(View加班); + RPARForm02.ChangeMode(FormViewMode.ReadOnly); + RPARForm02.DataBind(); + break; + case RPAR_TYPE.T3_出差: + dsRPAR_RPTYP.SelectParameters["BSCLS"].DefaultValue = "3%"; + MultiView1.SetActiveView(View差勤); + RPARForm03.ChangeMode(FormViewMode.ReadOnly); + RPARForm03.DataBind(); + break; + default: + pnlSheet.Visible = false; + pnlSign.Visible = false; + return; + } + + hfRPREN.Value = rpren; + hfRPAPN.Value = rpapn; + hfRPANO.Value = rpano; + + if (rpapn == "3" && rpano == "1") + bslvl = "2"; + if (rpapn == "3" && rpano == "2") + bslvl = "3"; + if (rpapn == "2" && rpano == "1") + bslvl = "3"; + + if (bslvl == "") + { + pnlNext.Visible = false; + } + else + { + pnlNext.Visible = true; + dsBSGP.SelectParameters["BSPYN"].DefaultValue = rppyn; + dsBSGP.SelectParameters["BSLVL"].DefaultValue = bslvl; + ddlNext.DataSource = dsBSGP; + ddlNext.DataBind(); + } + + pnlSheet.Visible = (MV主要.ActiveViewIndex == 0) || (MV主要.ActiveViewIndex == 3); + pnlSign.Visible = MV主要.ActiveViewIndex == 0; + + if (pnlSheet.Visible) + gvRPAD.DataBind(); + + if (MV主要.ActiveViewIndex == 3) + gvRPAB2.DataBind(); + } + + protected void RPARGrid_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(sender as GridView, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + // 簽核確定 + protected void btnSave_Click(object sender, EventArgs e) + { + string rpapn = hfRPAPN.Value; + string rpano = hfRPANO.Value; + + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(); + try + { + // 核准 + if (rblApprove.SelectedValue == "Y") + { + // 本關簽核確定 + rpabDao.核准(tran, hfRPREN.Value, rpano, DateTime.UtcNow.AddHours(8), txtComment.Text, UserId); + + // 若有下關,送簽 + if (rpapn.CompareTo(rpano) > 0) + { + string 下一關 = Convert.ToString(Convert.ToInt32(rpano) + 1); + rpabDao.送簽(tran, hfRPREN.Value, rpapn, 下一關, ddlNext.SelectedValue, UserId); + rparDao.送簽(tran, hfRPREN.Value, 下一關, ddlNext.SelectedValue); + } + // 若無則更新簽核狀況 + else + { + rparDao.簽核(tran, hfRPREN.Value, "Y", DateTime.UtcNow.AddHours(8)); + } + } + // 不核准 + else + { + rpabDao.不核准(tran, hfRPREN.Value, rpano, DateTime.UtcNow.AddHours(8), txtComment.Text, UserId); + rparDao.簽核(tran, hfRPREN.Value, "N", DateTime.UtcNow.AddHours(8)); + } + + tran.Commit(); + } + catch (Exception ex) + { + tran.Rollback(); + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "更新資料過程中發生錯誤:\"" + ex.Message + "\""; + } + finally + { + if (tran != null) + { + tran.Dispose(); + tran = null; + } + if (conn != null && conn.State == ConnectionState.Open) + { + conn.Close(); + conn.Dispose(); + conn = null; + } + } + + if (txtComment.Text.Trim().Length > 0) + { + string name = GetLookup("BPSN", UserId, "BPNME"); + 發簽核有意見郵件(hfRPREN.Value, + name, + rblApprove.SelectedValue == "Y" ? "核准" : "不核准", + txtComment.Text); + } + + txtComment.Text = ""; + rblApprove.SelectedValue = "Y"; + + RPARGrid.DataBind(); + RPARGrid0.DataBind(); + } + + protected void RPARGrid0_RowCommand(object sender, GridViewCommandEventArgs e) + { + if (e.CommandName == "CancelSign") + { + string[] args = e.CommandArgument.ToString().Split('|'); + if (args.Length > 4) + { + string rpren = args[0]; + string 本關 = Convert.ToString(args[1]); + string 總關 = Convert.ToString(args[2]); + string rpapd = args[3]; + string rpapp = args[4]; + + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(); + try + { + // 不核准的取消 = 取消本關 + if (rpapp == "N") + { + rpabDao.取消本關(tran, rpren, 本關, UserId); + rparDao.取消本關(tran, rpren); + } + // 不是最後一關 + else if (總關.CompareTo(本關) > 0) + { + string 上一關簽核人 = rpabDao.退回上一關(tran, rpren, 本關, UserId); + if (上一關簽核人.Length > 0) + rparDao.退回上一關(tran, rpren, 上一關簽核人); + } + // 已經送到最後一關,但是最後一關還沒簽 + else if (總關 == 本關 && rpapd == "") + { + string 上一關簽核人 = rpabDao.退回上一關(tran, rpren, 本關, UserId); + if (上一關簽核人.Length > 0) + rparDao.退回上一關(tran, rpren, 上一關簽核人); + } + // 已經送到最後一關,而且最後一關已簽 + else if (總關 == 本關 && rpapd != "") + { + rpabDao.取消本關(tran, rpren, 本關, UserId); + rparDao.取消本關(tran, rpren); + } + + tran.Commit(); + } + catch (Exception ex) + { + tran.Rollback(); + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "更新資料過程中發生錯誤:\"" + ex.Message + "\""; + } + finally + { + if (tran != null) + { + tran.Dispose(); + tran = null; + } + if (conn != null) + { + if (conn.State == ConnectionState.Open) + conn.Close(); + conn.Dispose(); + conn = null; + } + } + } + } + RPARGrid.DataBind(); + RPARGrid0.DataBind(); + } + + /* + protected override string GetBPNME(object RPENO) + { + return base.GetBPNME(RPENO); + } + */ + + protected string Get單據種類(object RPTYP, object RPAPN) + { + string rptyp = WDAC.GetStringValue(RPTYP) + " "; + string rpapn = WDAC.GetStringValue(RPAPN) + " "; + string s1, s2; + + switch (rptyp[0].ToString()) + { + case RPAR_TYPE.T0_請假: + s1 = "[請假單]"; + break; + case RPAR_TYPE.T1_加班: + s1 = "[加班單]"; + break; + case RPAR_TYPE.T3_出差: + s1 = "[差旅單]"; + break; + default: + s1 = ""; + break; + } + + switch (rpapn[0]) + { + case 'D': + s2 = "(抽單)"; + break; + default: + s2 = ""; + break; + } + + return s1 + s2; + } + + protected System.Drawing.Color Get單據類別顏色(object RPAPN, object RPAPP) + { + string rpapn = WDAC.GetStringValue(RPAPN).Trim(); + string rpapp = WDAC.GetStringValue(RPAPP).Trim(); + + if (rpapn == "D" || rpapp == "N") + return System.Drawing.Color.Red; + else + return System.Drawing.Color.Blue; + } + + //protected void btnChangePage_Click(object sender, EventArgs e) + //{ + // switch ((sender as Control).ID) + // { + // case "btnPage1": + // MV主要.SetActiveView(View1); + // break; + // case "btnPage2": + // MV主要.SetActiveView(View2); + // break; + // case "btnPage3": + // MV主要.SetActiveView(View3); + // break; + // } + //} + + protected void dsRPAR我的_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + DateTime dt; + e.Cancel = !CheckDate(txtDATE1.Text, out dt); + e.InputParameters["Date1"] = dt; + e.Cancel = !CheckDate(txtDATE2.Text, out dt); + e.InputParameters["Date2"] = dt; + } + + protected void dsRPAR我的督導_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + DateTime dt; + e.Cancel = !CheckDate(txtDATE3.Text, out dt); + e.InputParameters["Date1"] = dt; + e.Cancel = !CheckDate(txtDATE4.Text, out dt); + e.InputParameters["Date2"] = dt; + + List RPNUMs = new List(); + foreach (ListItem item in cblRPNUM4.Items) + { + if (item.Selected) + RPNUMs.Add(item.Value); + } + + cblRPNUM4.DataBind(); + foreach (string rpnum in RPNUMs) + { + if (cblRPNUM4.Items.FindByValue(rpnum) != null) + { + cblRPNUM4.Items.FindByValue(rpnum).Selected = true; + } + } + + RPNUMs.Clear(); + foreach (ListItem item in cblRPNUM4.Items) + { + if (item.Selected) + RPNUMs.Add(item.Value); + } + + e.InputParameters["RPNUM"] = RPNUMs; + + var rptyp = GetListItemCollectionSelectedValue(cblRPTYP_DETAIL.Items, ",", '\''); + e.InputParameters["RPTYP"] = string.IsNullOrEmpty(rptyp) ? rblRPTYP2.SelectedValue : rptyp; + e.InputParameters["RPPYN"] = GetListItemCollectionSelectedValue(cbl我督導的專案.Items, ",", '\''); + } + + protected void btnSearch我的_Click(object sender, EventArgs e) + { + RPARGrid1.DataBind(); + if (RPARGrid1.PageCount > 0) + RPARGrid1.PageIndex = 0; + } + + protected void btnSearch我的督導_Click(object sender, EventArgs e) + { + string 表單 = rblRPTYP2.SelectedValue.ToString().ToUpper(); + RPARGrid2.DataBind(); + } + + protected void btnExport我的督導_Click(object sender, EventArgs e) + { + DateTime date1, date2; + CheckDate(txtDATE3.Text, out date1); + CheckDate(txtDATE4.Text, out date2); + + List RPNUMs = new List(); + foreach (ListItem item in cblRPNUM4.Items) + { + if (item.Selected) + RPNUMs.Add(item.Value); + } + + cblRPNUM4.DataBind(); + foreach (string rpnum in RPNUMs) + { + if (cblRPNUM4.Items.FindByValue(rpnum) != null) + { + cblRPNUM4.Items.FindByValue(rpnum).Selected = true; + } + } + + RPNUMs.Clear(); + foreach (ListItem item in cblRPNUM4.Items) + { + if (item.Selected) + RPNUMs.Add(item.Value); + } + + var rptyp = GetListItemCollectionSelectedValue(cblRPTYP_DETAIL.Items, ",", '\''); + + if ("|明細|統計|".IndexOf("|" + rblExportType.SelectedValue + "|") < 0) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "請選擇匯出格式"; + return; + } + + DataTable t = rparDao.Select我的督導專案( + UserId + , date1 + , date2 + , (string.IsNullOrEmpty(rptyp) ? rblRPTYP2.SelectedValue : rptyp) + , GetListItemCollectionSelectedValue(cbl我督導的專案.Items, ",", '\'') + , RPNUMs + , false); + List rows = t.Select().ToList(); + + if (t.Rows.Count == 0) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "沒有合乎條件的資料"; + return; + } + + switch (rblExportType.SelectedValue) + { + case "明細": + Do明細表(rows); + break; + case "統計": + Do統計表(rows); + break; + } + } + + private void Do明細表(List rows) + { + MemoryStream ms; + switch (rblRPTYP2.SelectedValue) + { + case "0%": + ms = Do請假明細(rows); + ResponseWriteFile(ms, String.Format("請假明細匯出_{0:yyyyMMddHHmmss}.xls", DateTime.UtcNow.AddHours(8))); + break; + case "1%": + ms = Do加班明細(rows); + ResponseWriteFile(ms, String.Format("加班明細匯出_{0:yyyyMMddHHmmss}.xls", DateTime.UtcNow.AddHours(8))); + break; + case "3%": + ms = Do差旅明細(rows); + ResponseWriteFile(ms, String.Format("差旅明細匯出_{0:yyyyMMddHHmmss}.xls", DateTime.UtcNow.AddHours(8))); + break; + } + } + + private MemoryStream Do差旅明細(List rows) + { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.CreateSheet("差旅單明細") as HSSFSheet; + sheet.ForceFormulaRecalculation = true; + Excel excel = new Excel(); + excel.WorkBook = workbook; + excel.Sheet = sheet; + int row = 0; + int col = 0; + + // 標題 + excel.SetCellValue(row, col++, "單號"); + excel.SetCellValue(row, col++, "人員編號"); + excel.SetCellValue(row, col++, "開始日期"); + excel.SetCellValue(row, col++, "結束日期"); + excel.SetCellValue(row, col++, "開始時間"); + excel.SetCellValue(row, col++, "結束時間"); + excel.SetCellValue(row, col++, "類別"); + excel.SetCellValue(row, col++, "時數"); + excel.SetCellValue(row, col++, "汽車"); // F01 + excel.SetCellValue(row, col++, "火車"); // F02 + excel.SetCellValue(row, col++, "捷運"); // F03 + excel.SetCellValue(row, col++, "高鐵"); // F04 + excel.SetCellValue(row, col++, "飛機"); // F07 + excel.SetCellValue(row, col++, "住宿費"); // F05 + excel.SetCellValue(row, col++, "雜費"); // F06 + excel.SetCellValue(row, col++, "過路費"); // F08 + excel.SetCellValue(row, col++, "差旅費合計"); + excel.SetCellValue(row, col++, "事由"); + excel.SetCellValue(row, col++, "備註"); + row++; + + // 內容 + int totalRPF01 = 0; + int totalRPF02 = 0; + int totalRPF03 = 0; + int totalRPF04 = 0; + int totalRPF05 = 0; + int totalRPF06 = 0; + int totalRPF07 = 0; + int totalRPF08 = 0; + foreach (DataRow r in rows) + { + // 從 RPAD 取出差旅費明細 + DataTable detail = rpadDao.SelectRpar(r["RPREN"].ToString()); + // 加總各類費用 + int sumRPF01 = detail.Select().Sum((x) => WDAC.GetInt32Value(x["RPF01"])); + int sumRPF02 = detail.Select().Sum((x) => WDAC.GetInt32Value(x["RPF02"])); + int sumRPF03 = detail.Select().Sum((x) => WDAC.GetInt32Value(x["RPF03"])); + int sumRPF04 = detail.Select().Sum((x) => WDAC.GetInt32Value(x["RPF04"])); + int sumRPF05 = detail.Select().Sum((x) => WDAC.GetInt32Value(x["RPF05"])); + int sumRPF06 = detail.Select().Sum((x) => WDAC.GetInt32Value(x["RPF06"])); + int sumRPF07 = detail.Select().Sum((x) => WDAC.GetInt32Value(x["RPF07"])); + int sumRPF08 = detail.Select().Sum((x) => WDAC.GetInt32Value(x["RPF08"])); + + totalRPF01 += sumRPF01; + totalRPF02 += sumRPF02; + totalRPF03 += sumRPF03; + totalRPF04 += sumRPF04; + totalRPF05 += sumRPF05; + totalRPF06 += sumRPF06; + totalRPF07 += sumRPF07; + totalRPF08 += sumRPF08; + + col = 0; + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPREN"])); + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , WDAC.GetStringValue(r["RPNUM"]) + , GetLookup("BPSN", WDAC.GetStringValue(r["RPNUM"]), "BPNME", ""))); + excel.SetCellValue(row, col++, string.Format("{0:yyyyMMdd}", WDAC.GetDateTimeValue(r["RPRDT"]))); + excel.SetCellValue(row, col++, string.Format("{0:yyyyMMdd}", WDAC.GetDateTimeValue(r["RPEDT"]))); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPRTM"])); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPETM"])); + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , WDAC.GetStringValue(r["RPTYP"]) + , GetLookup("BCLS", WDAC.GetStringValue(r["RPTYP"]), "BSSCR", "BSPAR=`RPARTYP` "))); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , WDAC.GetInt32Value(r["RPTCT"]) + , WDAC.GetInt32Value(r["RPTMT"]))); + excel.SetCellValue(row, col++, sumRPF01); + excel.SetCellValue(row, col++, sumRPF02); + excel.SetCellValue(row, col++, sumRPF03); + excel.SetCellValue(row, col++, sumRPF04); + excel.SetCellValue(row, col++, sumRPF07); + excel.SetCellValue(row, col++, sumRPF05); + excel.SetCellValue(row, col++, sumRPF06); + excel.SetCellValue(row, col++, sumRPF08); + excel.SetCellValue(row, col++, WDAC.GetInt32Value(r["RPFTR"])); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPRSN"])); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPDOC"])); + row++; + } + + // 合計 + var totalRPTCT = rows.Select((x) => WDAC.GetInt32Value(x["RPTCT"])).Sum(); + var totalRPTMT = rows.Select((x) => WDAC.GetInt32Value(x["RPTMT"])).Sum(); + var totalRPFTR = rows.Select((x) => WDAC.GetInt32Value(x["RPFTR"])).Sum(); + + totalRPTCT += (int)Math.Truncate((double)totalRPTMT / (double)60); + totalRPTMT = totalRPTMT % 60; + col = 0; + excel.SetCellValue(row, col++, "合計"); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, string.Format("{0:####0}:{1:00}", totalRPTCT, totalRPTMT)); + excel.SetCellValue(row, col++, totalRPF01); + excel.SetCellValue(row, col++, totalRPF02); + excel.SetCellValue(row, col++, totalRPF03); + excel.SetCellValue(row, col++, totalRPF04); + excel.SetCellValue(row, col++, totalRPF07); + excel.SetCellValue(row, col++, totalRPF05); + excel.SetCellValue(row, col++, totalRPF06); + excel.SetCellValue(row, col++, totalRPF08); + excel.SetCellValue(row, col++, totalRPFTR); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + + // 寬度 + col = 0; + excel.SetColumnWidth(col++, 20); + excel.SetColumnWidth(col++, 20); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 40); + excel.SetColumnWidth(col++, 40); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + + private MemoryStream Do加班明細(List rows) + { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.CreateSheet("加班單明細") as HSSFSheet; + sheet.ForceFormulaRecalculation = true; + Excel excel = new Excel(); + excel.WorkBook = workbook; + excel.Sheet = sheet; + int row = 0; + int col = 0; + + // 標題 + excel.SetCellValue(row, col++, "單號"); + excel.SetCellValue(row, col++, "人員編號"); + excel.SetCellValue(row, col++, "日期"); + excel.SetCellValue(row, col++, "開始時間"); + excel.SetCellValue(row, col++, "結束時間"); + excel.SetCellValue(row, col++, "類別"); + excel.SetCellValue(row, col++, "時數"); + excel.SetCellValue(row, col++, "加班費"); + excel.SetCellValue(row, col++, "1又1/3時數"); + excel.SetCellValue(row, col++, "1又2/3時數"); + excel.SetCellValue(row, col++, "1倍時數"); + excel.SetCellValue(row, col++, "休息日再延長時數"); + excel.SetCellValue(row, col++, "例假日再延長時數"); + excel.SetCellValue(row, col++, "事由"); + excel.SetCellValue(row, col++, "備註"); + row++; + + // 內容 + foreach (DataRow r in rows) + { + col = 0; + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPREN"])); + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , WDAC.GetStringValue(r["RPNUM"]) + , GetLookup("BPSN", WDAC.GetStringValue(r["RPNUM"]), "BPNME", ""))); + excel.SetCellValue(row, col++, string.Format("{0:yyyyMMdd}", WDAC.GetDateTimeValue(r["RPRDT"]))); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPRTM"])); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPETM"])); + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , WDAC.GetStringValue(r["RPTYP"]) + , GetLookup("BCLS", WDAC.GetStringValue(r["RPTYP"]), "BSSCR", "BSPAR=`RPARTYP` "))); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , WDAC.GetInt32Value(r["RPTCT"]) + , WDAC.GetInt32Value(r["RPTMT"]))); + excel.SetCellValue(row, col++, WDAC.GetInt32Value(r["RPFTR"])); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , WDAC.GetInt32Value(r["RPTC1"]) + , WDAC.GetInt32Value(r["RPTM1"]))); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , WDAC.GetInt32Value(r["RPTC2"]) + , WDAC.GetInt32Value(r["RPTM2"]))); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , WDAC.GetInt32Value(r["RPTC3"]) + , WDAC.GetInt32Value(r["RPTM3"]))); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , WDAC.GetInt32Value(r["RPTC4"]) + , WDAC.GetInt32Value(r["RPTM4"]))); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , WDAC.GetInt32Value(r["RPTC5"]) + , WDAC.GetInt32Value(r["RPTM5"]))); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPRSN"])); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPDOC"])); + row++; + } + + // 合計 + var sumRPTCT = rows.Select((x) => WDAC.GetInt32Value(x["RPTCT"])).Sum(); + var sumRPTMT = rows.Select((x) => WDAC.GetInt32Value(x["RPTMT"])).Sum(); + var sumRPTC1 = rows.Select((x) => WDAC.GetInt32Value(x["RPTC1"])).Sum(); + var sumRPTM1 = rows.Select((x) => WDAC.GetInt32Value(x["RPTM1"])).Sum(); + var sumRPTC2 = rows.Select((x) => WDAC.GetInt32Value(x["RPTC2"])).Sum(); + var sumRPTM2 = rows.Select((x) => WDAC.GetInt32Value(x["RPTM2"])).Sum(); + var sumRPTC3 = rows.Select((x) => WDAC.GetInt32Value(x["RPTC3"])).Sum(); + var sumRPTM3 = rows.Select((x) => WDAC.GetInt32Value(x["RPTM3"])).Sum(); + var sumRPTC4 = rows.Select((x) => WDAC.GetInt32Value(x["RPTC4"])).Sum(); + var sumRPTM4 = rows.Select((x) => WDAC.GetInt32Value(x["RPTM4"])).Sum(); + var sumRPTC5 = rows.Select((x) => WDAC.GetInt32Value(x["RPTC5"])).Sum(); + var sumRPTM5 = rows.Select((x) => WDAC.GetInt32Value(x["RPTM5"])).Sum(); + var sumRPFTR = rows.Select((x) => WDAC.GetInt32Value(x["RPFTR"])).Sum(); + sumRPTCT += (int)Math.Truncate((double)sumRPTMT / (double)60); + sumRPTMT = sumRPTMT % 60; + sumRPTC1 += (int)Math.Truncate((double)sumRPTM1 / (double)60); + sumRPTM1 = sumRPTM1 % 60; + sumRPTC2 += (int)Math.Truncate((double)sumRPTM2 / (double)60); + sumRPTM2 = sumRPTM2 % 60; + sumRPTC3 += (int)Math.Truncate((double)sumRPTM3 / (double)60); + sumRPTM3 = sumRPTM3 % 60; + sumRPTC4 += (int)Math.Truncate((double)sumRPTM4 / (double)60); + sumRPTM4 = sumRPTM4 % 60; + sumRPTC5 += (int)Math.Truncate((double)sumRPTM5 / (double)60); + sumRPTM5 = sumRPTM5 % 60; + + col = 0; + excel.SetCellValue(row, col++, "合計"); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}", sumRPTCT, sumRPTMT)); + excel.SetCellValue(row, col++, sumRPFTR); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}", sumRPTC1, sumRPTM1)); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}", sumRPTC2, sumRPTM2)); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}", sumRPTC3, sumRPTM3)); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}", sumRPTC4, sumRPTM4)); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}", sumRPTC5, sumRPTM5)); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + + + // 寬度 + col = 0; + excel.SetColumnWidth(col++, 20); + excel.SetColumnWidth(col++, 20); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 24); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 18); + excel.SetColumnWidth(col++, 18); + excel.SetColumnWidth(col++, 40); + excel.SetColumnWidth(col++, 40); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + + private MemoryStream Do請假明細(List rows) + { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.CreateSheet("請假單明細") as HSSFSheet; + sheet.ForceFormulaRecalculation = true; + Excel excel = new Excel(); + excel.WorkBook = workbook; + excel.Sheet = sheet; + int row = 0; + int col = 0; + + // 標題 + excel.SetCellValue(row, col++, "單號"); + excel.SetCellValue(row, col++, "人員編號"); + excel.SetCellValue(row, col++, "開始日期"); + excel.SetCellValue(row, col++, "結束日期"); + excel.SetCellValue(row, col++, "開始時間"); + excel.SetCellValue(row, col++, "結束時間"); + excel.SetCellValue(row, col++, "類別"); + excel.SetCellValue(row, col++, "時數"); + excel.SetCellValue(row, col++, "扣薪金額"); + excel.SetCellValue(row, col++, "事由"); + excel.SetCellValue(row, col++, "備註"); + row++; + + // 內容 + foreach (DataRow r in rows) + { + col = 0; + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPREN"])); + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , WDAC.GetStringValue(r["RPNUM"]) + , GetLookup("BPSN", WDAC.GetStringValue(r["RPNUM"]), "BPNME", ""))); + excel.SetCellValue(row, col++, string.Format("{0:yyyyMMdd}", WDAC.GetDateTimeValue(r["RPRDT"]))); + excel.SetCellValue(row, col++, string.Format("{0:yyyyMMdd}", WDAC.GetDateTimeValue(r["RPEDT"]))); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPRTM"])); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPETM"])); + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , WDAC.GetStringValue(r["RPTYP"]) + , GetLookup("BCLS", WDAC.GetStringValue(r["RPTYP"]), "BSSCR", "BSPAR=`RPARTYP` "))); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , WDAC.GetInt32Value(r["RPTCT"]) + , WDAC.GetInt32Value(r["RPTMT"]))); + excel.SetCellValue(row, col++, WDAC.GetInt32Value(r["RPFTR"])); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPRSN"])); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["RPDOC"])); + row++; + } + + // 合計 + var sumRPTCT = rows.Select((x) => WDAC.GetInt32Value(x["RPTCT"])).Sum(); + var sumRPTMT = rows.Select((x) => WDAC.GetInt32Value(x["RPTMT"])).Sum(); + var sumRPFTR = rows.Select((x) => WDAC.GetInt32Value(x["RPFTR"])).Sum(); + sumRPTCT += (int)Math.Truncate((double)sumRPTMT / (double)60); + sumRPTMT = sumRPTMT % 60; + col = 0; + excel.SetCellValue(row, col++, "合計"); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}", sumRPTCT, sumRPTMT)); + excel.SetCellValue(row, col++, sumRPFTR); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + + // 寬度 + col = 0; + excel.SetColumnWidth(col++, 20); + excel.SetColumnWidth(col++, 20); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 40); + excel.SetColumnWidth(col++, 40); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + + private void Do統計表(List rows) + { + var c = new RPARGroupComparer(); + var groups = rows.OrderBy(o => WDAC.GetStringValue(o["RPTYP"])) + .ThenBy(o => WDAC.GetStringValue(o["RPPYN"])) + .ThenBy(o => WDAC.GetStringValue(o["RPNUM"])) + .GroupBy(r => new RPARGroup() + { + RPPYN = WDAC.GetStringValue(r["RPPYN"]), + RPNUM = WDAC.GetStringValue(r["RPNUM"]), + RPTYP = WDAC.GetStringValue(r["RPTYP"]) + }, c); + + MemoryStream ms; + switch (rblRPTYP2.SelectedValue) + { + case "0%": + ms = Do請假統計(rows, groups); + ResponseWriteFile(ms, String.Format("請假統計匯出_{0:yyyyMMddHHmmss}.xls", DateTime.UtcNow.AddHours(8))); + break; + case "1%": + ms = Do加班統計(rows, groups); + ResponseWriteFile(ms, String.Format("加班統計匯出_{0:yyyyMMddHHmmss}.xls", DateTime.UtcNow.AddHours(8))); + break; + case "3%": + ms = Do差旅統計(rows, groups); + ResponseWriteFile(ms, String.Format("差旅統計匯出_{0:yyyyMMddHHmmss}.xls", DateTime.UtcNow.AddHours(8))); + break; + } + + } + + private MemoryStream Do差旅統計(List rows, IEnumerable> groups) + { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.CreateSheet("差旅單統計") as HSSFSheet; + sheet.ForceFormulaRecalculation = true; + Excel excel = new Excel(); + excel.WorkBook = workbook; + excel.Sheet = sheet; + int row = 0; + int col = 0; + + // 標題 + excel.SetCellValue(row, col++, "類別"); + excel.SetCellValue(row, col++, "人員編號"); + excel.SetCellValue(row, col++, "時數"); + excel.SetCellValue(row, col++, "差旅費"); + excel.SetCellValue(row, col++, "專案名稱"); + excel.SetCellValue(row, col++, "備註"); + row++; + + // 明細 + var totalRPTCT = 0; + var totalRPTMT = 0; + var totalRPFTR = 0; + foreach (var g in groups) + { + var k = g.Key; + + var sumRPTCT = g.Select(x => WDAC.GetInt32Value(x["RPTCT"])).Sum(); + var sumRPTMT = g.Select(x => WDAC.GetInt32Value(x["RPTMT"])).Sum(); + var sumRPFTR = g.Select(x => WDAC.GetInt32Value(x["RPFTR"])).Sum(); + var sumRPDOC = string.Join("/", g.Select(x => WDAC.GetStringValue(x["RPDOC"])).ToArray()); + + totalRPTCT += sumRPTCT; + totalRPTMT += sumRPTMT; + totalRPFTR += sumRPFTR; + + sumRPTCT += (int)Math.Truncate((double)sumRPTMT / (double)60); + sumRPTMT = sumRPTMT % 60; + + col = 0; + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , k.RPTYP + , GetLookup("BCLS", k.RPTYP, "BSSCR", "BSPAR=`RPARTYP` "))); + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , k.RPNUM + , GetLookup("BPSN", k.RPNUM, "BPNME", ""))); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , sumRPTCT + , sumRPTMT)); + excel.SetCellValue(row, col++, sumRPFTR); + excel.SetCellValue(row, col++, GetLookup("BPAA", k.RPPYN, "BPPYM", "")); + excel.SetCellValue(row, col++, sumRPDOC); + row++; + } + + // 合計 + totalRPTCT += (int)Math.Truncate((double)totalRPTMT / (double)60); + totalRPTMT = totalRPTMT % 60; + + col = 0; + excel.SetCellValue(row, col++, "合計"); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}", totalRPTCT, totalRPTMT)); + excel.SetCellValue(row, col++, totalRPFTR); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + + // 寬度 + col = 0; + excel.SetColumnWidth(col++, 25); + excel.SetColumnWidth(col++, 15); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 40); + excel.SetColumnWidth(col++, 100); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + + private MemoryStream Do加班統計(List rows, IEnumerable> groups) + { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.CreateSheet("加班單統計") as HSSFSheet; + sheet.ForceFormulaRecalculation = true; + Excel excel = new Excel(); + excel.WorkBook = workbook; + excel.Sheet = sheet; + int row = 0; + int col = 0; + + // 標題 + excel.SetCellValue(row, col++, "類別"); + excel.SetCellValue(row, col++, "人員編號"); + excel.SetCellValue(row, col++, "時數"); + excel.SetCellValue(row, col++, "加班費"); + excel.SetCellValue(row, col++, "1又1/3時數"); + excel.SetCellValue(row, col++, "1又2/3時數"); + excel.SetCellValue(row, col++, "1倍時數"); + excel.SetCellValue(row, col++, "休息日再延長時數"); + excel.SetCellValue(row, col++, "例假日再延長時數"); + excel.SetCellValue(row, col++, "專案名稱"); + excel.SetCellValue(row, col++, "備註"); + row++; + + // 明細 + var totalRPTCT = 0; + var totalRPTMT = 0; + var totalRPFTR = 0; + foreach (var g in groups) + { + var k = g.Key; + + var sumRPTCT = g.Select(x => WDAC.GetInt32Value(x["RPTCT"])).Sum(); + var sumRPTMT = g.Select(x => WDAC.GetInt32Value(x["RPTMT"])).Sum(); + var sumRPTC1 = g.Select(x => WDAC.GetInt32Value(x["RPTC1"])).Sum(); + var sumRPTM1 = g.Select(x => WDAC.GetInt32Value(x["RPTM1"])).Sum(); + var sumRPTC2 = g.Select(x => WDAC.GetInt32Value(x["RPTC2"])).Sum(); + var sumRPTM2 = g.Select(x => WDAC.GetInt32Value(x["RPTM2"])).Sum(); + var sumRPTC3 = g.Select(x => WDAC.GetInt32Value(x["RPTC3"])).Sum(); + var sumRPTM3 = g.Select(x => WDAC.GetInt32Value(x["RPTM3"])).Sum(); + var sumRPTC4 = g.Select(x => WDAC.GetInt32Value(x["RPTC4"])).Sum(); + var sumRPTM4 = g.Select(x => WDAC.GetInt32Value(x["RPTM4"])).Sum(); + var sumRPTC5 = g.Select(x => WDAC.GetInt32Value(x["RPTC5"])).Sum(); + var sumRPTM5 = g.Select(x => WDAC.GetInt32Value(x["RPTM5"])).Sum(); + + var sumRPFTR = g.Select(x => WDAC.GetInt32Value(x["RPFTR"])).Sum(); + var sumRPDOC = string.Join("/", g.Select(x => WDAC.GetStringValue(x["RPDOC"])).ToArray()); + + totalRPTCT += sumRPTCT; + totalRPTMT += sumRPTMT; + totalRPFTR += sumRPFTR; + + sumRPTCT += (int)Math.Truncate((double)sumRPTMT / (double)60); + sumRPTMT = sumRPTMT % 60; + sumRPTC1 += (int)Math.Truncate((double)sumRPTM1 / (double)60); + sumRPTM1 = sumRPTM1 % 60; + sumRPTC2 += (int)Math.Truncate((double)sumRPTM2 / (double)60); + sumRPTM2 = sumRPTM2 % 60; + sumRPTC3 += (int)Math.Truncate((double)sumRPTM3 / (double)60); + sumRPTM3 = sumRPTM3 % 60; + sumRPTC4 += (int)Math.Truncate((double)sumRPTM4 / (double)60); + sumRPTM4 = sumRPTM4 % 60; + sumRPTC5 += (int)Math.Truncate((double)sumRPTM5 / (double)60); + sumRPTM5 = sumRPTM5 % 60; + + col = 0; + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , k.RPTYP + , GetLookup("BCLS", k.RPTYP, "BSSCR", "BSPAR=`RPARTYP` "))); + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , k.RPNUM + , GetLookup("BPSN", k.RPNUM, "BPNME", ""))); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , sumRPTCT + , sumRPTMT)); + excel.SetCellValue(row, col++, sumRPFTR); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , sumRPTC1 + , sumRPTM1)); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , sumRPTC2 + , sumRPTM2)); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , sumRPTC3 + , sumRPTM3)); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , sumRPTC4 + , sumRPTM4)); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , sumRPTC5 + , sumRPTM5)); + excel.SetCellValue(row, col++, GetLookup("BPAA", k.RPPYN, "BPPYM", "")); + excel.SetCellValue(row, col++, sumRPDOC); + row++; + } + + // 合計 + totalRPTCT += (int)Math.Truncate((double)totalRPTMT / (double)60); + totalRPTMT = totalRPTMT % 60; + + col = 0; + excel.SetCellValue(row, col++, "合計"); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}", totalRPTCT, totalRPTMT)); + excel.SetCellValue(row, col++, totalRPFTR); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + + + // 寬度 + col = 0; + excel.SetColumnWidth(col++, 25); + excel.SetColumnWidth(col++, 15); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 15); + excel.SetColumnWidth(col++, 15); + excel.SetColumnWidth(col++, 40); + excel.SetColumnWidth(col++, 100); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + + private MemoryStream Do請假統計(List rows, IEnumerable> groups) + { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.CreateSheet("請假單統計") as HSSFSheet; + sheet.ForceFormulaRecalculation = true; + Excel excel = new Excel(); + excel.WorkBook = workbook; + excel.Sheet = sheet; + int row = 0; + int col = 0; + + // 標題 + excel.SetCellValue(row, col++, "類別"); + excel.SetCellValue(row, col++, "人員編號"); + excel.SetCellValue(row, col++, "時數"); + excel.SetCellValue(row, col++, "扣薪金額"); + excel.SetCellValue(row, col++, "專案名稱"); + excel.SetCellValue(row, col++, "備註"); + row++; + + // 明細 + var totalRPTCT = 0; + var totalRPTMT = 0; + var totalRPFTR = 0; + foreach (var g in groups) + { + var k = g.Key; + + var sumRPTCT = g.Select(x => WDAC.GetInt32Value(x["RPTCT"])).Sum(); + var sumRPTMT = g.Select(x => WDAC.GetInt32Value(x["RPTMT"])).Sum(); + var sumRPFTR = g.Select(x => WDAC.GetInt32Value(x["RPFTR"])).Sum(); + var sumRPDOC = string.Join("/", g.Select(x => WDAC.GetStringValue(x["RPDOC"])).ToArray()); + sumRPTCT += (int)Math.Truncate((double)sumRPTMT / (double)60); + sumRPTMT = sumRPTMT % 60; + + totalRPTCT += sumRPTCT; + totalRPTMT += sumRPTMT; + totalRPFTR += sumRPFTR; + + col = 0; + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , k.RPTYP + , GetLookup("BCLS", k.RPTYP, "BSSCR", "BSPAR=`RPARTYP` "))); + excel.SetCellValue(row, col++, string.Format("{0} {1}" + , k.RPNUM + , GetLookup("BPSN", k.RPNUM, "BPNME", ""))); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}" + , sumRPTCT + , sumRPTMT)); + excel.SetCellValue(row, col++, sumRPFTR); + excel.SetCellValue(row, col++, GetLookup("BPAA", k.RPPYN, "BPPYM", "")); + excel.SetCellValue(row, col++, sumRPDOC); + row++; + } + + // 合計 + totalRPTCT += (int)Math.Truncate((double)totalRPTMT / (double)60); + totalRPTMT = totalRPTMT % 60; + + col = 0; + excel.SetCellValue(row, col++, "合計"); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, string.Format("{0:###0}:{1:00}", totalRPTCT, totalRPTMT)); + excel.SetCellValue(row, col++, totalRPFTR); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + + // 寬度 + col = 0; + excel.SetColumnWidth(col++, 25); + excel.SetColumnWidth(col++, 15); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 40); + excel.SetColumnWidth(col++, 100); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + return ms; + } + + protected string Get關卡名稱(object RPANO, object RPAPN) + { + string rpano = WDAC.GetStringValue(RPANO); + string rpapn = WDAC.GetStringValue(RPAPN); + + if (rpano == "1") + return "第 1 關"; + else if ((rpano == "2" && rpapn == "2") || (rpano == "3" && rpapn == "3")) + return "第 2 關"; + else if (rpano == "2" && rpapn == "3") + return "長官關"; + else if (rpano == "D") + return "抽單"; + else + return rpano; + } + + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + // 取出計算需要的資料 + string rppyn = e.Command.Parameters["@RPPYN"].Value.ToString(); + string rpnum = e.Command.Parameters["@RPNUM"].Value.ToString(); + string rptyp = e.Command.Parameters["@RPTYP"].Value.ToString(); + int rptct = Convert.ToInt32(e.Command.Parameters["@RPTCT"].Value); + int rpftr = Convert.ToInt32(e.Command.Parameters["@RPFTR"].Value); + DateTime rprdt = Convert.ToDateTime(e.Command.Parameters["@RPRDT"].Value); + TimeCalc timeCalc = new TimeCalc(); + + GetData calc = new GetData(); + calc.Query = Query; + int bpsrm; + int bpp02; + double bpbft; + double bpaft; + double bphol; + string bpovr; + string bplve; + string bpott; + + // 取得月薪、伙食津貼、前二加班比率、後二加班比率、假日加班比率、加班費公式、請假扣款公式 + calc.GetRASN_Date_Bppyn_Bpeno_Overwork_Rate( + rprdt, rppyn, rpnum, out bpsrm, out bpp02, out bpbft, out bpaft, out bphol, out bpovr, out bplve, out bpott); + + string 起時; + string 迄時; + switch (MultiView1.ActiveViewIndex) + { + case 0: // 請假,要計算缺勤扣款與請假時數 + // 計算請假時數 + DateTime rpedt = Convert.ToDateTime(e.Command.Parameters["@RPEDT"].Value); + 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); + 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); + + rptct = timeCalc.計算請假總時數(rpnum, rprdt, rpedt, 起時, 迄時, rptyp, bpott == "1"); + e.Command.Parameters["@RPTCT"].Value = rptct; + + // 計算請假扣款 + Absent absent = new Absent(); + absent.bpsrm = bpsrm; + absent.bpp02 = bpp02; + absent.Formula = bplve; + // e.Command.Parameters["@RPFTR"].Value = absent.Add(rptyp, rptct); + e.Command.Parameters["@RPFTR"].Value = absent.Add(rpnum, rptyp, rprdt, rpedt, 起時, 迄時, rprdt, rpedt, bpott == "1"); + + break; + case 1: // 加班,要計算加班費與前二、後二、假日加班時數 + // 計算加班時數 + 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); + 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); + + rptct = timeCalc.計算加班時數(rpnum, rprdt, 起時, 迄時, RPAR_TYPE.休息日加班(rptyp)); + e.Command.Parameters["@RPTCT"].Value = rptct; + + int RPTC1 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC1"].Value) * 60 + (bpott == "2" ? WDAC.GetInt32Value(e.Command.Parameters["@RPTM1"].Value) : 0); + int RPTC2 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC2"].Value) * 60 + (bpott == "2" ? WDAC.GetInt32Value(e.Command.Parameters["@RPTM2"].Value) : 0); + int RPTC3 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC3"].Value) * 60 + (bpott == "2" ? WDAC.GetInt32Value(e.Command.Parameters["@RPTM3"].Value) : 0); + int RPTC4 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC4"].Value) * 60 + (bpott == "2" ? WDAC.GetInt32Value(e.Command.Parameters["@RPTM4"].Value) : 0); + int RPTC5 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC5"].Value) * 60 + (bpott == "2" ? WDAC.GetInt32Value(e.Command.Parameters["@RPTM5"].Value) : 0); + e.Command.Parameters["@RPTC1"].Value = RPTC1; + e.Command.Parameters["@RPTC2"].Value = RPTC2; + e.Command.Parameters["@RPTC3"].Value = RPTC3; + e.Command.Parameters["@RPTC4"].Value = RPTC4; + e.Command.Parameters["@RPTC5"].Value = RPTC5; + if (rptct < RPTC1 + RPTC2 + RPTC3 + RPTC4 + RPTC5) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "各項時數之和 不可大於 加班時數!"; + e.Cancel = true; + } + + ExtraWork extraWork = new ExtraWork(); + extraWork.Add(rptyp, rprdt, rptct, bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5); + e.Command.Parameters["@RPFTR"].Value = + extraWork.RPTA1 + extraWork.RPTA2 + extraWork.RPTA3 + extraWork.RPTA4 + extraWork.RPTA5; + e.Command.Parameters["@RPTA1"].Value = extraWork.RPTA1; + e.Command.Parameters["@RPTA2"].Value = extraWork.RPTA2; + e.Command.Parameters["@RPTA3"].Value = extraWork.RPTA3; + e.Command.Parameters["@RPTA4"].Value = extraWork.RPTA4; + e.Command.Parameters["@RPTA5"].Value = extraWork.RPTA5; + + break; + case 2: + 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); + 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); + rptct = timeCalc.計算加班時數(rpnum, rprdt, 起時, 迄時, "13,14".Contains(rptyp)); + e.Command.Parameters["@RPTCT"].Value = rptct; + break; + } + } + + protected void dsRpad_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + if (MV主要.ActiveViewIndex == 0) + e.InputParameters["rpren"] = RPARGrid.SelectedValue; + else if (MV主要.ActiveViewIndex == 3) + e.InputParameters["rpren"] = RPARGrid2.SelectedValue; + } + + protected void dsRPARForm_Selecting(object sender, SqlDataSourceSelectingEventArgs e) + { + if (MV主要.ActiveViewIndex == 0) + e.Command.Parameters["@RPREN"].Value = RPARGrid.SelectedValue; + else if (MV主要.ActiveViewIndex == 3) + e.Command.Parameters["@RPREN"].Value = RPARGrid2.SelectedValue; + } + + protected void dsRPARForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + bool result = true; + e.Command.Parameters["@RPRDT"].Value = CheckDate(e.Command.Parameters["@RPRDT"].Value, "請輸入正確的開始日期", ref result, cvMessage); + if (MultiView1.ActiveViewIndex == 0 || MultiView1.ActiveViewIndex == 2) + e.Command.Parameters["@RPEDT"].Value = CheckDate(e.Command.Parameters["@RPEDT"].Value, "請輸入正確的結束日期", ref result, cvMessage); + + e.Cancel = !result; + CalcFields(e); + if (e.Cancel) + return; + + TimeCalc timeCalc = new TimeCalc(); + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(); + try + { + e.Command.Connection = conn; + e.Command.Transaction = tran; + + string rpnum = WDAC.GetStringValue(e.Command.Parameters["@RPNUM"].Value); + string rpren = WDAC.GetStringValue(e.Command.Parameters["@RPREN"].Value); + string 新類別 = WDAC.GetStringValue(e.Command.Parameters["@RPTYP"].Value); + DateTime 新日期 = WDAC.GetDateTimeValue(e.Command.Parameters["@RPRDT"].Value); + int 新時數 = WDAC.GetInt32Value(e.Command.Parameters["@RPTCT"].Value); + string rppyn = WDAC.GetStringValue(e.Command.Parameters["@RPPYN"].Value); + string bpott = new BpaaDAC(Query).GetOverTimeType(rppyn); + + string oldRPTYP = WDAC.GetStringValue(Query.ExecuteScalar("SELECT RPTYP FROM RPAR WHERE RPREN='" + rpren + "'", tran)); + + // 如果是請假 + if (MultiView1.ActiveViewIndex == 0) + { + // 舊資料如果是補休,要取消沖補休 + if (oldRPTYP == RPAR_TYPE.T00_補休) + { + rparDao.取消沖補休(tran, rpren); + } + + // 舊資料如果是特休,要取消沖特休 + if (oldRPTYP == RPAR_TYPE.T01_特休) + { + ryerDao.取消沖特休(tran, rpren); + } + + // 新資料如果是補休,要沖補休 + if (新類別 == RPAR_TYPE.T00_補休) + { + e.Command.Parameters["@RPDOC"].Value = + rparDao.沖補休(tran, rpren, rpnum, 新日期, 新時數); + } + + // 新資料如果是特休,要沖特休 + if (新類別 == RPAR_TYPE.T01_特休) + { + ryerDao.沖特休(rpnum, 新日期.Year, 新時數, tran); + } + + // 新資料如果是事假或家庭照顧假,要檢查可用事假時數 + if (新類別 == RPAR_TYPE.T02_事假 || 新類別 == RPAR_TYPE.T0B_家庭照顧假) + { + int 年度事假; + if (int.TryParse(WGuard1.WSetR("UNRPARTIME", 5), out 年度事假)) + 年度事假 = 年度事假 * 60; + else + 年度事假 = 112 * 60; + + if (年度事假 - rparDao.Get已請事假(UserId, 新日期, rpren) - 新時數 < 0) + e.Command.Parameters["@RPALT"].Value = "可用事假時數不足"; + else + e.Command.Parameters["@RPALT"].Value = ""; + } + + // 新資料如果是病假,要檢查可用病假時數 + if (新類別 == RPAR_TYPE.T03_病假) + { + int 年度病假; + if (int.TryParse(WGuard1.WSetR("UNRPARTIME", 6), out 年度病假)) + 年度病假 = 年度病假 * 60; + else + 年度病假 = 240 * 60; + + if (年度病假 - rparDao.Get已請病假(UserId, 新日期, rpren) - 新時數 < 0) + e.Command.Parameters["@RPALT"].Value = "可用病假時數不足"; + else + e.Command.Parameters["@RPALT"].Value = ""; + } + } + // 加班 + else if (MultiView1.ActiveViewIndex == 1) + { + string 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); + string 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); + 新時數 = timeCalc.計算加班時數(rpnum, 新日期, 起時, 迄時, "13,14".Contains(新類別)); + e.Command.Parameters["@RPTCT"].Value = 新時數; + } + // 差旅 + else if (MultiView1.ActiveViewIndex == 2) + { + DateTime 起日 = WDAC.GetDateTimeValue(e.Command.Parameters["@RPRDT"].Value); + DateTime 迄日 = WDAC.GetDateTimeValue(e.Command.Parameters["@RPEDT"].Value); + string 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); + string 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); + 新時數 = timeCalc.計算差旅時數(rpnum, 起日, 迄日, 起時, 迄時); + e.Command.Parameters["@RPTCT"].Value = 新時數; + } + } + catch + { + tran.Rollback(); + tran = null; + e.Cancel = true; + throw; + } + } + + protected void dsRPARForm_Updated(object sender, SqlDataSourceStatusEventArgs e) + { + if (tran != null) + { + tran.Commit(); + tran = null; + } + + if (conn != null && conn.State == ConnectionState.Open) + { + conn.Close(); + conn.Dispose(); + conn = null; + } + } + + protected void RPARForm_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + if (MV主要.ActiveViewIndex == 3) + { + RPARGrid2.DataBind(); + } + } + + protected void btnUpdate_Click(object sender, EventArgs e) + { + switch (MultiView1.ActiveViewIndex) + { + case 0: + RPARForm01.ChangeMode(FormViewMode.Edit); + break; + case 1: + RPARForm02.ChangeMode(FormViewMode.Edit); + break; + case 2: + RPARForm03.ChangeMode(FormViewMode.Edit); + break; + } + } + + protected string GetPhraseClientClick(string rparType, object BPCNT) + { + string CID = ""; + switch (rparType) + { + case "1": + CID = (RPARForm02.FindControl("txtRPAR_RPDOC") as Control).ClientID; + break; + case "3": + CID = (RPARForm03.FindControl("txtRPAR_RPDOC") as Control).ClientID; + break; + } + if (CID.Length > 0) + return String.Format("javascript:FillMessage(\"{0}\", \"{1}\");return false;", CID, BPCNT); + else + return "javascript:return false;"; + } + + protected void btnInsertRPAD_Click(object sender, EventArgs e) + { + string _RPREN = WDAC.GetStringValue(RPARForm03.SelectedValue); + //_RPSTP = WDAC.GetStringValue(ViewState["RPSTP"]); + //_RPEDP = WDAC.GetStringValue(ViewState["RPEDP"]); + + DateTime rpdat; + CheckDate(txtRPDAT.Text, out rpdat); + + rpadDao.InsertOne(UserId, _RPREN, txtRPSTP.Text, txtRPEDP.Text, + WDAC.GetInt32Value(txtRPF01.Text), + WDAC.GetInt32Value(txtRPF02.Text), + WDAC.GetInt32Value(txtRPF03.Text), + WDAC.GetInt32Value(txtRPF04.Text), + WDAC.GetInt32Value(txtRPF05.Text), + WDAC.GetInt32Value(txtRPF06.Text), + WDAC.GetInt32Value(txtRPF07.Text), + WDAC.GetInt32Value(txtRPF08.Text), + 0, + 0, + rpdat, + txtRPVCH.Text, + txtRPDOC.Text); + + gvRPAD.DataBind(); + RPARForm03.DataBind(); + + RPARGrid2.DataBind(); + + txtRPDAT.Text = ""; + //txtRPSTP.Text = _RPSTP; + //txtRPEDP.Text = _RPEDP; + txtRPF01.Text = ""; + txtRPF02.Text = ""; + txtRPF03.Text = ""; + txtRPF04.Text = ""; + txtRPF05.Text = ""; + txtRPF06.Text = ""; + txtRPF07.Text = ""; + txtRPF08.Text = ""; + txtRPVCH.Text = ""; + txtRPDOC.Text = ""; + } + + protected void dsRpad_Updating(object sender, ObjectDataSourceMethodEventArgs e) + { + DateTime rpdat; + CheckDate(WDAC.GetStringValue(e.InputParameters["rpdat"]), out rpdat); + e.InputParameters["rpdat"] = rpdat; + e.InputParameters["rpf09"] = 0; + e.InputParameters["rpf10"] = 0; + } + + protected void dsRpad_Updated(object sender, ObjectDataSourceStatusEventArgs e) + { + if (MV主要.ActiveViewIndex == 3) + { + RPARForm03.DataBind(); + RPARGrid2.DataBind(); + } + } + + protected void dsRpad_Deleted(object sender, ObjectDataSourceStatusEventArgs e) + { + if (MV主要.ActiveViewIndex == 3) + { + RPARForm03.DataBind(); + RPARGrid2.DataBind(); + } + } + protected void gvRPAD_DataBound(object sender, EventArgs e) + { + //gvRPAD.Columns[14].Visible = MV主要.ActiveViewIndex == 3; + pnlRpadInsert.Visible = MV主要.ActiveViewIndex == 3; + } + + protected void RPARForm_DataBound(object sender, EventArgs e) + { + if ((sender as FormView).CurrentMode == FormViewMode.Edit) + { + FormView fv = sender as FormView; + + RegisterLookupEvent(fv, "btnRPAR_RPAGT_WQRY", "txtRPAR_RPAGT", + "txtRPAR_RPAGT,txtRPAR_RPAGM", "BPSNEML", + "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + (fv.FindControl("hfRPAR_RPPYN") as HiddenField).Value + "' AND RANUM=BPENO)", + false); + } + } + + protected void ds我督導專案的人員_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + DateTime dt; + e.Cancel = !CheckDate(txtDATE3.Text, out dt); + e.InputParameters["Date1"] = dt; + e.Cancel = !CheckDate(txtDATE4.Text, out dt); + e.InputParameters["Date2"] = dt; + + var rptyp = GetListItemCollectionSelectedValue(cblRPTYP_DETAIL.Items, ",", '\''); + e.InputParameters["RPTYP"] = string.IsNullOrEmpty(rptyp) ? rblRPTYP2.SelectedValue : rptyp; + e.InputParameters["RPPYN"] = GetListItemCollectionSelectedValue(cbl我督導的專案.Items, ",", '\''); + } + + protected void RPARGrid1_DataBound(object sender, EventArgs e) + { + } + + protected void btnYearOK_Click(object sender, EventArgs e) + { + // ddl我督導的專案.DataBind(); + cbl我督導的專案.DataBind(); + RPARGrid2.DataBind(); + } + + protected void dsRPAB2_Selecting(object sender, SqlDataSourceSelectingEventArgs e) + { + if (RPARGrid2.SelectedValue != null) + e.Command.Parameters["@RPREN"].Value = RPARGrid2.SelectedValue; + //(sender as SqlDataSource).SelectParameters["RPREN"].DefaultValue = WDAC.GetStringValue(RPARGrid2.SelectedValue); + } + + protected string GetAttachLink(string RPREN) + { + return RparDAC.GetAttachLink(RPREN, Page); + //string f = string.Format("{0}\\{1}.jpg", Server.MapPath("~/UploadedPicture/RPAR_ATTACHMENT"), RPREN); + + //if (File.Exists(f)) + // return string.Format("附件檢視", + // ResolveClientUrl("~/UploadedPicture/RPAR_ATTACHMENT/"), RPREN); + //else + // return "無附件"; + } + + private void 發簽核有意見郵件(string _RPREN, string 簽核人員, string 簽核結果, string 簽核意見) + { + RPARList t = rparDao.SelectOne(_RPREN); + if (t.Count > 0) + { + string 員工號 = GetLookup("BPSN", t[0].RPNUM, "BPNME"); + string 員工電郵 = bpsnDao.GetEmail(t[0].RPNUM); + string 類別 = t[0].RPTYP; + + switch (類別.Substring(0, 1)) + { + case RPAR_TYPE.T0_請假: + 類別 = "請假"; + break; + case RPAR_TYPE.T1_加班: + 類別 = "加班"; + break; + case RPAR_TYPE.T3_出差: + 類別 = "差旅"; + break; + default: + return; + } + + // 發送郵件 + try + { + MailMessage mm = new MailMessage(); + mm.Subject = String.Format("{1}簽核意見通知 [單號:{0}]", _RPREN, 類別); + mm.To.Add(new MailAddress(員工電郵)); + mm.BodyEncoding = Encoding.UTF8; + mm.IsBodyHtml = true; + mm.Body = File.ReadAllText(Server.MapPath("~/Template/簽核意見通知.html")) + .Replace("{類別}", 類別) + .Replace("{單號}", _RPREN) + .Replace("{簽核人員}", 簽核人員) + .Replace("{簽核結果}", 簽核結果) + .Replace("{簽核意見}", 簽核意見) + ; + + Wellan.Service.WMailSender.GetInstance().Send(mm, string.Format("簽核意見通知 單號:{0}", _RPREN)); + } + catch + { } + } + } + + protected void RPARGrid0_RowDataBound(object sender, GridViewRowEventArgs e) + { + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void RPARGrid1_RowDataBound(object sender, GridViewRowEventArgs e) + { + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void gvRPAD_RowDataBound(object sender, GridViewRowEventArgs e) + { + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + private void StoreYYMM() + { + hfCalendarYear.Value = Calendar1.VisibleDate.ToString("yyyy", WGuard1.InvariantCulture); + hfCalendarMonth.Value = Calendar1.VisibleDate.ToString("MM"); + } + + protected void btnCalendarGoto_Click(object sender, EventArgs e) + { + Calendar1.VisibleDate = Convert.ToDateTime(txtCalendarYear.Text + "/" + ddlCalendarMonth.SelectedValue + "/01"); + StoreYYMM(); + } + + protected void btnCalendarSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(txtCalendarUser.Text)) + { + return; + } + + for (int i = 1; i <= 31; i++) + { + if (Request[String.Format("BTME{0:00}", i)] != null) + { + var rttid = WDAC.GetStringValue(Request[String.Format("BTME{0:00}", i)]); + + rtmeDao.SetDay(txtCalendarUser.Text, new DateTime(Convert.ToInt32(hfCalendarYear.Value), Convert.ToInt32(hfCalendarMonth.Value), i), + rttid, txtCalendarUser.Text); + } + } + + Calendar1.VisibleDate = Convert.ToDateTime(hfCalendarYear.Value + "/" + hfCalendarMonth.Value + "/01", WGuard1.InvariantCulture); + } + + protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) + { + e.Cell.Style["padding"] = "3px"; + e.Cell.Style["border"] = "2px solid white"; + + // 非本月,結束處理 + if (e.Day.IsOtherMonth) + return; + + // 本月,清除重畫 + e.Cell.Controls.Clear(); + Label aLabel = new Label(); + aLabel.Text = e.Day.Date.Day.ToString(); + aLabel.Font.Name = "Tahoma"; + aLabel.Font.Size = new FontUnit("16pt"); + aLabel.Font.Bold = true; + aLabel.ForeColor = System.Drawing.Color.Black; + e.Cell.Controls.Add(aLabel); + + // 加入換行的 Literal + Literal aBR = new Literal(); + aBR.Text = "
"; + e.Cell.Controls.Add(aBR); + + //加入 DropDownList 用以挑選假日型態 + DropDownList aDDL = new DropDownList(); + aDDL.ID = String.Format("BTME{0:00}", e.Day.Date.Day); + aDDL.Style.Add("width", "95%"); + aDDL.Style.Add("top", "2px"); + aDDL.Style.Add("font-size", "9pt"); + // aDDL.Enabled = false; + + if (monthBhrd == null) + { + if (!e.Day.IsWeekend) + aDDL.CssClass = "NORMAL"; + } + else + { + var d = monthBhrd.Substring(e.Day.Date.Day - 1, 1); + if (d == "-" || d == "B") + aDDL.CssClass = "NORMAL"; + } + + BtmeList.ForEach(btmeItem => + { + aDDL.Items.Add(new ListItem(btmeItem.BTTID, btmeItem.BTTID)); + }); + + var rtmeItem = RtmeList.FirstOrDefault(p => p.RTDAT == e.Day.Date); + if (rtmeItem != null) + { + aDDL.SelectedValue = rtmeItem.RTTID; + } + else + { + aDDL.SelectedValue = ""; + } + e.Cell.Controls.Add(aDDL); + + var dayType = "-"; + if (holidayData == null) + { + if (e.Day.IsWeekend) + dayType = "H"; + else + dayType = "-"; + } + else + { + dayType = holidayData[e.Day.Date.Month - 1].Substring(e.Day.Date.Day - 1, 1); + } + + switch (dayType) + { + case "-": + e.Cell.BackColor = System.Drawing.Color.White; + break; + case "H": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xFF99CC); + break; + case "B": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xFFFF99); + break; + case "N": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x0099FF); + break; + case "V": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xFF9900); + break; + case "O": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x99CC00); + break; + case "T": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x999999); + break; + case "E": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xCC7FFF); + break; + case "A": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x7FCCFF); + break; + } + } + + protected void Calendar1_PreRender(object sender, EventArgs e) + { + // 取得班表資料 + BtmeList = btmeDao.SelectAll(); + BtmeList.Insert(0, new BtmeItem() + { + BTTID = "", + BTNME = "預設班表", + BTSTM = WGuard1.WSetR("UNRPARTIME", 1), + BTETM = WGuard1.WSetR("UNRPARTIME", 2), + BTRST = WGuard1.WSetR("UNRPARTIME", 3), + BTRED = WGuard1.WSetR("UNRPARTIME", 4) + }); + gvBTME.DataSource = BtmeList; + gvBTME.DataBind(); + + ddBhrd.DataSource = BtmeList; + ddBhrd.DataTextField = "BTTID"; + ddBhrd.DataValueField = "BTTID"; + ddBhrd.DataBind(); + + // 取得員工班表資料 + Calendar1.VisibleDate = Convert.ToDateTime(txtCalendarYear.Text + "/" + ddlCalendarMonth.SelectedValue + "/01"); + RtmeList = rtmeDao.SelectMonth(txtCalendarUser.Text, Calendar1.VisibleDate); + monthBhrd = bhrdDao.GetMonth(Calendar1.VisibleDate.Year, Calendar1.VisibleDate.Month); + + // 取得節假日資料 + holidayData = new BhrdDAC().GetYear(Calendar1.VisibleDate.Year); + } + + protected void Calendar1_VisibleMonthChanged(object sender, MonthChangedEventArgs e) + { + txtCalendarYear.Text = Calendar1.VisibleDate.ToString("yyyy"); + ddlCalendarMonth.SelectedValue = Calendar1.VisibleDate.ToString("MM"); + StoreYYMM(); + } + + protected void cbCalendarUser_SelectedIndexChanged(object sender, EventArgs e) + { + // DO NOTHING + } + + protected void btnCalendarUserOK_Click(object sender, EventArgs e) + { + lbCalendarUserName.DataBind(); + } + + protected void dsRPAR未簽_Selected(object sender, ObjectDataSourceStatusEventArgs e) + { + if (e.ReturnValue is DataTable) + { + // 從中取得人員與單據類別 + } + } + + protected void cb不分頁_CheckedChanged(object sender, EventArgs e) + { + RPARGrid.AllowPaging = !cb不分頁.Checked; + WGuard1.WSetW(Query, string.Format("SIGN_NP_1_{0}", UserId), 1, cb不分頁.Checked ? "Y" : "N", UserId); + } + + protected void cb過濾篩選_CheckedChanged(object sender, EventArgs e) + { + pnl過濾篩選.Visible = cb過濾篩選.Checked; + cblRPNUMFilter.Items.Clear(); + cblRPNUMFilter.DataBind(); + RPARGrid.DataBind(); + WGuard1.WSetW(Query, string.Format("SIGN_FT_1_{0}", UserId), 1, cb過濾篩選.Checked ? "Y" : "N", UserId); + } + + protected void cblRPNUMFilter_DataBinding(object sender, EventArgs e) + { + var rows = rparDao.Select未簽核ByUser(UserId, "", ""); + var rpnums = new List(); + foreach (DataRow row in rows.Rows) + { + var v = row["RPNUM"].ToString(); + if (!rpnums.Contains(v)) + { + rpnums.Add(v); + } + } + + rpnums.Sort(); + foreach (var rpnum in rpnums) + { + var bpnme = GetLookup("BPSN", rpnum, "BPNME", ""); + cblRPNUMFilter.Items.Add(new ListItem(string.Format("{0} {1}", rpnum, bpnme), rpnum)); + } + } + + protected void dsRPAR未簽_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + e.InputParameters["RPTYP"] = string.Join(",", + cblRPTYPFilter.Items.Cast() + .Where(p => p.Selected) + .Select(p => p.Value) + .ToArray()); + + e.InputParameters["RPNUM"] = string.Join(",", + cblRPNUMFilter.Items.Cast() + .Where(p => p.Selected) + .Select(p => p.Value) + .ToArray()); + } + + protected void cblRPTYPFilter_SelectedIndexChanged(object sender, EventArgs e) + { + var b = PostBackControlId.Split('$'); + if (b.Length > 2) + { + if (cbRPTYPFilterOne.Checked) + { + for (var i = 0; i < cblRPTYPFilter.Items.Count; i++) + { + if (i.ToString() != b[2]) + cblRPTYPFilter.Items[i].Selected = false; + } + } + } + + RPARGrid.DataBind(); + } + + protected void cblRPNUMFilter_SelectedIndexChanged(object sender, EventArgs e) + { + var b = PostBackControlId.Split('$'); + if (b.Length > 2) + { + if (cbRPNUMFilterOne.Checked) + { + for (var i = 0; i < cblRPNUMFilter.Items.Count; i++) + { + if (i.ToString() != b[2]) + cblRPNUMFilter.Items[i].Selected = false; + } + } + } + + RPARGrid.DataBind(); + } + + protected void btnRPTYPFilterNone_Click(object sender, EventArgs e) + { + foreach (ListItem i in cblRPTYPFilter.Items) + { + i.Selected = false; + } + RPARGrid.DataBind(); + } + + protected void btnRPNUMFilterNone_Click(object sender, EventArgs e) + { + foreach (ListItem i in cblRPNUMFilter.Items) + { + i.Selected = false; + } + RPARGrid.DataBind(); + } + + + protected void cbRPTYPFilterOne_CheckedChanged(object sender, EventArgs e) + { + if (cbRPTYPFilterOne.Checked) + { + foreach (ListItem i in cblRPTYPFilter.Items) + { + if (i.Value != cblRPTYPFilter.SelectedValue) + i.Selected = false; + } + } + } + + protected void cbRPNUMFilterOne_CheckedChanged(object sender, EventArgs e) + { + if (cbRPNUMFilterOne.Checked) + { + foreach (ListItem i in cblRPNUMFilter.Items) + { + if (i.Value != cblRPNUMFilter.SelectedValue) + i.Selected = false; + } + } + } + + protected void rblRPTYP2_SelectedIndexChanged(object sender, EventArgs e) + { + cblRPTYP_DETAIL.DataSource = Query.Select(string.Format("SELECT BSCLS, BSSCR FROM BCLS WHERE BSPAR = 'RPARTYP' AND BSCLS LIKE '{0}' AND BLOCK='Y'", rblRPTYP2.SelectedValue)); + cblRPTYP_DETAIL.DataTextField = "BSSCR"; + cblRPTYP_DETAIL.DataValueField = "BSCLS"; + + switch (rblRPTYP2.SelectedValue) + { + case "0%": + cblRPTYP_DETAIL.RepeatColumns = 7; + break; + case "1%": + cblRPTYP_DETAIL.RepeatColumns = 3; + break; + case "3%": + cblRPTYP_DETAIL.RepeatColumns = 5; + break; + } + cblRPTYP_DETAIL.DataBind(); + cblRPNUM4.DataBind(); + RPARGrid2.DataBind(); + } + + //protected void ddl我督導的專案_SelectedIndexChanged(object sender, EventArgs e) + //{ + // cblRPNUM4.DataBind(); + //} + + protected void cbl我督導的專案_SelectedIndexChanged(object sender, EventArgs e) + { + cblRPNUM4.DataBind(); + RPARGrid2.DataBind(); + } + + protected void cblRPTYP_DETAIL_SelectedIndexChanged(object sender, EventArgs e) + { + cblRPNUM4.DataBind(); + RPARGrid2.DataBind(); + } + + protected void btnDateOK_Click(object sender, EventArgs e) + { + RPARGrid2.DataBind(); + } +} + +internal class RPARGroup +{ + public string RPPYN; + public string RPNUM; + public string RPTYP; +} + +internal class RPARGroupComparer : IEqualityComparer +{ + public bool Equals(RPARGroup x, RPARGroup y) + { + return string.Format("{0}{1}{2}", x.RPNUM, x.RPNUM, x.RPTYP) == string.Format("{0}{1}{2}", y.RPNUM, y.RPNUM, y.RPTYP); + } + + public int GetHashCode(RPARGroup obj) + { + return 0; + } +} \ No newline at end of file diff --git a/Web/forms/message/MessageWriter.ascx b/Web/forms/message/MessageWriter.ascx new file mode 100644 index 0000000..f8ed75f --- /dev/null +++ b/Web/forms/message/MessageWriter.ascx @@ -0,0 +1,117 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MessageWriter.ascx.cs" + Inherits="forms_訊息發送_MessageWriter" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> +訊息發送 + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + +
+ + +
+
+ +
+ + + + +
+ + +
+
+
+ + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + +
+ + +
+
diff --git a/Web/forms/message/MessageWriter.ascx.cs b/Web/forms/message/MessageWriter.ascx.cs new file mode 100644 index 0000000..52d262d --- /dev/null +++ b/Web/forms/message/MessageWriter.ascx.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Net.Mail; +using System.Text; + +public partial class forms_訊息發送_MessageWriter : Wellan.Web.UI.WUserControlBase +{ + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + DropDownList1.DataBind(); + CheckBoxList1.DataBind(); + } + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + SqlDataSource1.ConnectionString = ConnectionString; + SqlDataSource2.ConnectionString = ConnectionString; + } + + protected void Button1_Click(object sender, EventArgs e) + { + + } + protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) + { + CheckBoxList1.DataBind(); + } + + protected void SelectAll_Click(object sender, EventArgs e) + { + foreach (ListItem item in CheckBoxList1.Items) + item.Selected = true; + } + + protected void SelectNone_Click(object sender, EventArgs e) + { + foreach (ListItem item in CheckBoxList1.Items) + item.Selected = false; + } + + protected void btnAdd_Click(object sender, EventArgs e) + { + foreach (ListItem item in CheckBoxList1.Items) + { + if (item.Selected) + { + if (CheckBoxList2.Items.FindByValue(item.Value) == null) + CheckBoxList2.Items.Add(new ListItem(item.Text, item.Value)); + } + } + } + + protected void btnRemove_Click(object sender, EventArgs e) + { + for (int i = CheckBoxList2.Items.Count - 1; i >= 0; i--) + { + if (CheckBoxList2.Items[i].Selected) + CheckBoxList2.Items.RemoveAt(i); + } + } + + protected void btnClear_Click(object sender, EventArgs e) + { + CheckBoxList2.Items.Clear(); + } + + protected void Button4_Click(object sender, EventArgs e) + { + MailMessage message = new MailMessage(); + //SmtpClient sc = new SmtpClient(); + message.Subject = txtSubject.Text; + + foreach (ListItem item in CheckBoxList2.Items) + message.To.Add(new MailAddress(item.Value, item.Text)); + + message.BodyEncoding = Encoding.UTF8; + message.IsBodyHtml = false; + message.Body = txtBody.Text; + + Wellan.Service.WMailSender.GetInstance().Send(message, String.Format("訊息發送 主旨:{0}", txtSubject.Text)); + //sc.Send(message); + } +} \ No newline at end of file diff --git a/Web/forms/punchcard/fmCardSearch.ascx b/Web/forms/punchcard/fmCardSearch.ascx new file mode 100644 index 0000000..cd1508a --- /dev/null +++ b/Web/forms/punchcard/fmCardSearch.ascx @@ -0,0 +1,341 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmCardSearch.ascx.cs" + Inherits="forms_punchcard_fmCardSearch" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ 專案: + + + +
+ 日期: + + + + +
+ 補打時間: + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (請輸入「人員工作地」時間)
+
+
+
+ + + + + + + + + + + + + + + + + +
+ 日期: + + + + + + + +
+ +  ~  + + +
+
+ +
+ 專案: + + + + + +
+ 人員: + + + +
(查詢時不選擇人員,會讓查詢速度緩慢,請斟酌使用) +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Web/forms/punchcard/fmCardSearch.ascx.cs b/Web/forms/punchcard/fmCardSearch.ascx.cs new file mode 100644 index 0000000..91a7cf8 --- /dev/null +++ b/Web/forms/punchcard/fmCardSearch.ascx.cs @@ -0,0 +1,216 @@ +using System; +using System.Data; +using System.Web.UI.WebControls; +using Wellan.Common; +using Wellan.Data; + +public partial class forms_punchcard_fmCardSearch : Wellan.Web.UI.WUserControlBase +{ + private DateTime date; + private RcrdDAC rcrdDao; + + private bool _canEdit = true; + public bool CanEdit + { + get + { + return _canEdit; + } + set + { + _canEdit = value; + } + } + + private void SetColumn() + { + if (_canEdit) + { + MultiView1.ActiveViewIndex = 0; + GridView1.Columns[0].Visible = false; + } + else + { + MultiView1.ActiveViewIndex = 1; + lbFunctionName.Text = "出勤查詢"; + // GridView1.Columns[4].Visible = false; + GridView1.Columns[5].Visible = false; + GridView1.Columns[7].Visible = false; + GridView1.Columns[8].Visible = false; + GridView1.Columns[10].Visible = false; + GridView1.Columns[11].Visible = false; + GridView1.Columns[13].Visible = false; + GridView1.Columns[14].Visible = false; + } + } + + protected void Page_Load(object sender, EventArgs e) + { + if (txtDate.Text == "") + txtDate.Text = DateTime.UtcNow.AddHours(8).Date.ToString("yyyyMMdd"); + + if (txtDate1.Text == "") + txtDate1.Text = WGuard1.WDAYTRAN(DateTime.UtcNow.AddHours(8).Date, 1).ToString("yyyyMMdd"); + + if (txtDate2.Text == "") + txtDate2.Text = WGuard1.WDAYTRAN(DateTime.UtcNow.AddHours(8).Date, 31).ToString("yyyyMMdd"); + + //if (IsPostBack) + // GridView1.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + + rcrdDao = new RcrdDAC(Query); + SetColumn(); + } + + protected void btnYY_Click(object sender, EventArgs e) + { + ddlROPYN.DataSource = new BpaaDAC().GetBpaa(WDAC.GetInt32Value(txtYear.Text) + WGuard1.CY11); + ddlROPYN.DataValueField = "BPPYN"; + ddlROPYN.DataTextField = "BPPYM"; + ddlROPYN.DataBind(); + } + + protected void btnSearch_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + GridView1.DataBind(); + } + + protected void dsCard_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + if (CanEdit) + { + CheckDate(txtDate.Text, out date); + if (date.Ticks == 0) + return; + + e.InputParameters["起日"] = date; + e.InputParameters["迄日"] = date; + e.InputParameters["年度專案"] = ddlROPYN.SelectedValue; + e.InputParameters["人員編號"] = ""; + } + else + { + DateTime date1; + CheckDate(txtDate1.Text, out date1); + DateTime date2; + CheckDate(txtDate2.Text, out date2); + + if (date1.Ticks != 0 && date2.Ticks == 0) + date2 = date1; + else if (date2.Ticks != 0 && date1.Ticks == 0) + date1 = date2; + + e.InputParameters["起日"] = date1; + e.InputParameters["迄日"] = date2; + e.InputParameters["年度專案"] = ddl專案.SelectedValue; + e.InputParameters["人員編號"] = ddl人員.SelectedValue; + } + } + + protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) + { + if (!CheckProjectRight()) + return; + + CheckDate(txtDate.Text, out date); + if (date.Ticks == 0) + return; + + var punchTime = ddlHH.SelectedValue + ":" + ddlMM.SelectedValue + ":00"; + var dataAndTime = new DateAndTime(date, date, punchTime, date, punchTime, "台北", "Taipei Standard Time"); + + switch (e.CommandName) + { + case "PUNCH1": // 補打上班 + rcrdDao.PunchRCC01(dataAndTime, e.CommandArgument.ToString(), "補打卡", true); + break; + case "CLEAR1": // 清除上班 + rcrdDao.ClearRCC01(date, e.CommandArgument.ToString()); + break; + case "PUNCH2": // 補打下班 + rcrdDao.PunchRCC02(dataAndTime, e.CommandArgument.ToString(), "補打卡", true); + break; + case "CLEAR2": // 清除下班 + rcrdDao.ClearRCC02(date, e.CommandArgument.ToString()); + break; + case "PUNCH7": // 補打出差外出 + rcrdDao.PunchRCC07(dataAndTime, e.CommandArgument.ToString(), "補打卡", true); + break; + case "CLEAR7": // 清除出差外出 + rcrdDao.ClearRCC07(date, e.CommandArgument.ToString()); + break; + case "PUNCH8": // 補打出差返回 + rcrdDao.PunchRCC08(dataAndTime, e.CommandArgument.ToString(), "補打卡", true); + break; + case "CLEAR8": // 清除出差返回 + rcrdDao.ClearRCC08(date, e.CommandArgument.ToString()); + break; + } + GridView1.DataBind(); + } + + protected void btn確定日期_Click(object sender, EventArgs e) + { + ddl專案.DataSource = new BsgpDAC().我可簽核的專案(txtDate1.Value.Ticks > 0 ? txtDate1.Value.Year - WGuard1.CY11 : 0, + txtDate2.Value.Ticks > 0 ? txtDate2.Value.Year - WGuard1.CY11 : 0, UserId); + ddl專案.DataValueField = "BSPYN"; + ddl專案.DataTextField = "BPPYM"; + ddl專案.DataBind(); + } + + protected void btn查詢_Click(object sender, EventArgs e) + { + GridView1.PageIndex = 0; + GridView1.DataBind(); + } + + protected void btn確定專案_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + DateTime date1; + CheckDate(txtDate1.Text, out date1); + DateTime date2; + CheckDate(txtDate2.Text, out date2); + + DataTable t = new GetData(Query).GetRASN_DATE_BPPYN(date1, date2, ddl專案.SelectedValue, null); + ddl人員.Items.Clear(); + ddl人員.Items.Add(new ListItem("(請選擇)", "")); + foreach (DataRow r in t.Rows) + { + ddl人員.Items.Add(new ListItem(String.Format("{0} {1}", r["RANUM"], r["BPNME"]), r["RANUM"].ToString())); + } + } + + protected bool CheckProjectRight() + { + // 檢查此使用者是否有權限處理這個專案 + // 20230324 移除專案權限檢查 + //var bppyn = ddlROPYN.SelectedValue; + //if (!CanEdit) + // bppyn = ddl專案.SelectedValue; + //BprmDAC bprm = new BprmDAC(Query); + //if (!bprm.GetRight(bppyn, UserId)) + //{ + // //MultiView1.Visible = false; + // cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + // cvMessage.IsValid = false; + // return false; + //} + return true; + } + + protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) + { + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } +} \ No newline at end of file diff --git a/Web/forms/punchcard/fmPunchCard.ascx b/Web/forms/punchcard/fmPunchCard.ascx new file mode 100644 index 0000000..79264af --- /dev/null +++ b/Web/forms/punchcard/fmPunchCard.ascx @@ -0,0 +1,207 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmPunchCard.ascx.cs" + Inherits="forms_worker_fmPunchCard" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ >台灣 + 0000-00-00 00:00:00 + >
本地
+ >0000-00-00 00:00:00 +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + +
+
+
+ 請注意: +
    +
  1. 打卡時間以主機時間為準,畫面上時間僅為參考之用。
  2. +
  3. 主機每週會與國家時間伺服器對時。
  4. +
  5. 打卡後無法取消,請注意不要按錯。
  6. +
  7. 派遣於桃竹苗分署之人員,若有疑義,服務專線如下:
    + 桃竹苗分署服務專線:03-4855368 分機 1185
    + 傳真:03-4855912
    + email:hanchiang1@wda.gov.tw
  8. +
  9. 派遣於北分署之人員,若有疑義,服務專線如下:
    + 02-22560859 分機 102
  10. +
+
+
+
+ + + diff --git a/Web/forms/punchcard/fmPunchCard.ascx.cs b/Web/forms/punchcard/fmPunchCard.ascx.cs new file mode 100644 index 0000000..90f569c --- /dev/null +++ b/Web/forms/punchcard/fmPunchCard.ascx.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Data; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; + +public partial class forms_worker_fmPunchCard : Wellan.Web.UI.WUserControlBase +{ + private RcrdDAC rcrdDao; + private RasnDAC rasnDao; + + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + rcrdDao = new RcrdDAC(Query); + rasnDao = new RasnDAC(Query); + + ReadCard(); + ReadRasn(); + } + + protected long nowtime + { + get { return (DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks) / 10000; } + } + + protected bool showTWTime { get; set; } + + private void ReadCard() + { + var aNow = DateAndTime.GetNow(UserId); + DataTable data = rcrdDao.ReadToday(UserId, aNow.CardDate); + + if (data.Rows.Count != 0) + { + lbOnDuty.Text = WQuery.GetStringValue(data.Rows[0]["RCC01"]); + lbOffDuty.Text = WQuery.GetStringValue(data.Rows[0]["RCC02"]); + lbOut.Text = WQuery.GetStringValue(data.Rows[0]["RCC07"]); + lbBack.Text = WQuery.GetStringValue(data.Rows[0]["RCC08"]); + } + + // 20220106 解除下班打卡按鈕限制 + btnOnDuty.Enabled = lbOnDuty.Text.Length == 0; + // btnOffDuty.Enabled = lbOffDuty.Text.Length == 0 && lbOnDuty.Text.Length > 0; + btnOffDuty.Enabled = lbOffDuty.Text.Length == 0; + + btnOut.Enabled = lbOut.Text.Length == 0; + // btnBack.Enabled = lbOut.Text.Length > 0 && lbBack.Text.Length == 0; + btnBack.Enabled = lbBack.Text.Length == 0; + + if (lbOnDuty.Text.Length == 0) + lbOnDuty.Text = "(尚未打卡)"; + + if (lbOffDuty.Text.Length == 0) + lbOffDuty.Text = "(尚未打卡)"; + + if (lbOut.Text.Length == 0) + lbOut.Text = "(尚未打卡)"; + + if (lbBack.Text.Length == 0) + lbBack.Text = "(尚未打卡)"; + } + + private void ReadRasn() + { + showTWTime = false; + + var rasnTable = rasnDao.SelectRecent(UserId); + if (rasnTable.Rows.Count > 0) + { + var rawtz = WDAC.GetStringValue(rasnTable.Rows[0]["RAWTZ"]); + if (!string.IsNullOrEmpty(rawtz) && string.Compare(rawtz, "台北") != 0) + { + showTWTime = true; + } + } + } + + + protected bool CheckPunchCardDays() + { + cvMessage.IsValid = true; + cvMessage.ErrorMessage = string.Empty; + + if (rcrdDao.PunchDaysIn7Days(DateAndTime.GetNow(UserId).LocalDate, UserId, false) >= 6) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "不可連續七天打卡"; + return false; + } + return true; + } + + protected void btnOnDuty_Click(object sender, EventArgs e) + { + if (!CheckPunchCardDays()) return; + + var aNow = DateAndTime.GetNow(UserId); + rcrdDao.PunchRCC01(aNow, UserId, Request.UserHostAddress, false); + ReadCard(); + } + + protected void btnOffDuty_Click(object sender, EventArgs e) + { + if (!CheckPunchCardDays()) return; + + var aNow = DateAndTime.GetNow(UserId); + rcrdDao.PunchRCC02(aNow, UserId, Request.UserHostAddress, false); + ReadCard(); + } + + protected void btnOut_Click(object sender, EventArgs e) + { + if (!CheckPunchCardDays()) return; + + var aNow = DateAndTime.GetNow(UserId); + rcrdDao.PunchRCC07(aNow, UserId, Request.UserHostAddress, false); + ReadCard(); + } + + protected void btnBack_Click(object sender, EventArgs e) + { + if (!CheckPunchCardDays()) return; + + var aNow = DateAndTime.GetNow(UserId); + rcrdDao.PunchRCC08(aNow, UserId, Request.UserHostAddress, false); + ReadCard(); + } +} \ No newline at end of file diff --git a/Web/forms/report/fmCardDailyReport.ascx b/Web/forms/report/fmCardDailyReport.ascx new file mode 100644 index 0000000..c28b23e --- /dev/null +++ b/Web/forms/report/fmCardDailyReport.ascx @@ -0,0 +1,79 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmCardDailyReport.ascx.cs" + Inherits="forms_report_fmCardDailyReport" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> +差勤日報表 + + + + + + + + + + + + + + + + + + + + + +
+ 日期: + + + 至 + + +
+ 專案: + + + + + +
+ 站別分組: + +
+ + + + + + + + + + +
+
+ 提醒您: +
    +
  1. 分組順序請填寫數字,相同的會歸在一起。
  2. +
  3. 分組順序空白者報表不出現。
  4. +
  5. 分組順序系統會儲存,供爾後使用。
  6. +
+
+
+
+ +
+ + diff --git a/Web/forms/report/fmCardDailyReport.ascx.cs b/Web/forms/report/fmCardDailyReport.ascx.cs new file mode 100644 index 0000000..482c22c --- /dev/null +++ b/Web/forms/report/fmCardDailyReport.ascx.cs @@ -0,0 +1,191 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Generic; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using Wellan.Common; +using Wellan.Data; +using System.Data.Common; +using CRAX; +using System.IO; + +public partial class forms_report_fmCardDailyReport : Wellan.Web.UI.WUserControlBase +{ + private RasnDAC rasnDao; + private RparDAC rparDao; + private ProjectBranchGroupDAC pbgDao; + + private string 公司名稱; + private string 專案名稱; + private string 客戶名稱; + + private List 人員Data = null; + private List<差勤日報表Item> 請假Data = null; + private List<差勤日報表Item> 加班Data = null; + private List<差勤日報表Item> 出差Data = null; + private List 站別分組 = null; + + protected void Page_Load(object sender, EventArgs e) + { + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + + if (txtDate1.Value.Ticks == 0) + txtDate1.Value = DateTime.UtcNow.AddHours(8).Date; + if (txtDate2.Value.Ticks == 0) + txtDate2.Value = DateTime.UtcNow.AddHours(8).Date; + + SetClientFocus(txtDate1); + + rasnDao = new RasnDAC(Query); + rparDao = new RparDAC(Query); + pbgDao = new ProjectBranchGroupDAC(Query); + } + + protected void btnOk_Click(object sender, EventArgs e) + { + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + + if (!CheckProjectRight()) + return; + + if (!CheckDateValid()) + return; + + // 取得並儲存畫面輸入的站別歸屬 + pbgDao.DeleteByProject(ddlRPPYN.SelectedValue); + foreach (GridViewRow row in gvBranch.Rows) + { + var txtGroup = (row.Cells[0].FindControl("txtGroup") as TextBox); + if (txtGroup != null) + { + var group = txtGroup.Text; + var branchId = txtGroup.Attributes["relatevalue"]; + + if (!string.IsNullOrEmpty(group) && !string.IsNullOrEmpty(branchId)) + { + pbgDao.Insert(ddlRPPYN.SelectedValue, branchId, group); + } + } + } + + 專案名稱 = GetLookup("BPAA", ddlRPPYN.SelectedValue, "BPPYM"); + + // 取得客戶名稱、公司別 + 公司名稱 = CompanyDAC.GetCompanyName(WDAC.GetStringValue(Query.ExecuteScalar( + @"SELECT BPCPY FROM BPRJ B + INNER JOIN BPAA C ON B.BPPNM=C.BPPNM + WHERE C.BPPYN='" + ddlRPPYN.SelectedValue + "'"))); ; + + 客戶名稱 = WDAC.GetStringValue(Query.ExecuteScalar( + @"SELECT BCNAM FROM BCUS A + INNER JOIN BPRJ B ON A.BCNUM=B.BPNUM + INNER JOIN BPAA C ON B.BPPNM=C.BPPNM + WHERE C.BPPYN='" + ddlRPPYN.SelectedValue + "'")); + + 人員Data = new GetData(Query).GetRASN_DATE_BPPYN(txtDate1.Value, txtDate2.Value, ddlRPPYN.SelectedValue); + 請假Data = rparDao.取得差勤日報表資料(ddlRPPYN.SelectedValue, txtDate1.Value, txtDate2.Value, RPAR_TYPE.T0_請假); + 加班Data = rparDao.取得差勤日報表資料(ddlRPPYN.SelectedValue, txtDate1.Value, txtDate2.Value, RPAR_TYPE.T1_加班); + 出差Data = rparDao.取得差勤日報表資料(ddlRPPYN.SelectedValue, txtDate1.Value, txtDate2.Value, RPAR_TYPE.T3_出差); + 站別分組 = rasnDao.SelectBranchForReport(ddlRPPYN.SelectedValue); + + if (人員Data.Count != 0) + { + Do差勤日報表(); + } + else + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "無符合條件的資料"; + } + } + + private void Do差勤日報表() + { + var 報表 = new 差勤日報表(); + 報表.開始日期 = txtDate1.Value; + 報表.結束日期 = txtDate2.Value; + 報表.公司名稱 = 公司名稱; + 報表.客戶名稱 = 客戶名稱; + 報表.專案名稱 = 專案名稱; + 報表.專案編號 = ddlRPPYN.SelectedValue; + 報表.人員Data = 人員Data; + 報表.請假Data = 請假Data; + 報表.加班Data = 加班Data; + 報表.出差Data = 出差Data; + 報表.站別分組 = 站別分組; + 報表.以時分顯示時數 = new GetData(Query).GetOverTimeToMinutes(ddlRPPYN.SelectedValue); + + MemoryStream ms = 報表.產生報表(); + ResponseWriteFile(ms, String.Format("差勤日報表_{0}_{1:yyyyMMdd}_{2:yyyyMMdd}.xls", ddlRPPYN.SelectedValue, txtDate1.Value, txtDate2.Value)); + } + + protected bool CheckProjectRight() + { + // 檢查此使用者是否有權限處理這個專案 + BprmDAC bprm = new BprmDAC(Query); + if (!bprm.GetRight(ddlRPPYN.SelectedValue, UserId)) + { + cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + cvMessage.IsValid = false; + pnlGroup.Visible = false; + return false; + } + return true; + } + + protected void Next_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + pnlGroup.Visible = true; + gvBranch.DataSource = rasnDao.SelectBranchForForm(ddlRPPYN.SelectedValue); + gvBranch.DataBind(); + } + + protected void btnDate_Click(object sender, EventArgs e) + { + if (!CheckDateValid()) + return; + + pnlGroup.Visible = false; + ddlRPPYN.DataSource = new BpaaDAC().GetBpaa(txtDate1.Value.Year); + ddlRPPYN.DataBind(); + } + + private bool CheckDateValid() + { + if (txtDate1.Value.Ticks == 0 && txtDate2.Value.Ticks != 0) + txtDate1.Value = txtDate2.Value; + if (txtDate2.Value.Ticks == 0 && txtDate1.Value.Ticks != 0) + txtDate2.Value = txtDate1.Value; + + if (txtDate1.Value.Ticks == 0 || txtDate2.Value.Ticks == 0) + { + cvMessage.ErrorMessage = "開始日期與結束日期都應輸入!"; + cvMessage.IsValid = false; + return false; + } + + // 檢查日期是否跨年 + if (txtDate1.Value.Year != txtDate2.Value.Year) + { + cvMessage.ErrorMessage = "日期請勿跨年!"; + cvMessage.IsValid = false; + return false; + } + + return true; + } +} \ No newline at end of file diff --git a/Web/forms/report/fmCardReport.ascx b/Web/forms/report/fmCardReport.ascx new file mode 100644 index 0000000..6067eb5 --- /dev/null +++ b/Web/forms/report/fmCardReport.ascx @@ -0,0 +1,44 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmCardReport.ascx.cs" + Inherits="forms_report_fmCardReport" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> +差勤系統報表 + + + + + + + + + + + + + + + + + +
+ 年月: + + +
+ 報表: + + + 差勤月報表 + 請假申請單 + 加班申請單 + 公差申請單 + 差旅費報告單 + 加班費印領清冊 + +
+ +
+ + diff --git a/Web/forms/report/fmCardReport.ascx.cs b/Web/forms/report/fmCardReport.ascx.cs new file mode 100644 index 0000000..8e21a70 --- /dev/null +++ b/Web/forms/report/fmCardReport.ascx.cs @@ -0,0 +1,307 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using Wellan.Common; +using Wellan.Data; +using System.Data.Common; +using CRAX; +using System.IO; + +/// +/// 差勤系統月報表 +/// +public partial class forms_report_fmCardReport : Wellan.Web.UI.WUserControlBase +{ + private DataTable reportData = null; + private DataTable reportData1 = null; + private string reportName = ""; + private string dataFileName = ""; + private string reportTitle = ""; + private DateTime aYYMM; + private RparDAC rparDao; + private BhrdDAC bhrdDao; + private RpadDAC rpadDao; + private RtmeDAC rtmeDao; + private string 專案編號; + private string 公司名稱; + private string 專案名稱; + private string 客戶名稱; + + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + + if (txtYYMM.Text.Length == 0) + txtYYMM.Text = DateTime.UtcNow.AddHours(8).Date.ToString("yyyyMM"); + + SetClientFocus(txtYYMM); + rparDao = new RparDAC(Query); + bhrdDao = new BhrdDAC(Query); + rpadDao = new RpadDAC(Query); + rtmeDao = new RtmeDAC(Query); + } + + protected void btnOk_Click(object sender, EventArgs e) + { + bool result = true; + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + + aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + if (!result) + return; + + if (aYYMM.ToString("yyyyMM").CompareTo("10104") < 0) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "注意!101 年 4 月之後的資料才可以使用此功能"; + return; + } + + 專案編號 = new BpsnDAC(Query).GetProjectByDate(UserId, aYYMM); + 專案名稱 = GetLookup("BPAA", 專案編號, "BPPYM"); + + // 取得客戶名稱、公司別 + 公司名稱 = CompanyDAC.GetCompanyName(WDAC.GetStringValue(Query.ExecuteScalar( + @"SELECT BPCPY FROM BPRJ B + INNER JOIN BPAA C ON B.BPPNM=C.BPPNM + WHERE C.BPPYN='" + 專案編號 + "'"))); ; + + 客戶名稱 = WDAC.GetStringValue(Query.ExecuteScalar( + @"SELECT BCNAM FROM BCUS A + INNER JOIN BPRJ B ON A.BCNUM=B.BPNUM + INNER JOIN BPAA C ON B.BPPNM=C.BPPNM + WHERE C.BPPYN='" + 專案編號 + "'")); + + string[] tmp = ddlReportSelect.SelectedValue.Split(','); + reportName = tmp[0]; + dataFileName = tmp[1]; + reportTitle = tmp[2]; + + bool hasData = false; + switch (dataFileName) + { + case "RPAR": // 差勤月報表 + hasData = Get月差勤表資料(); + break; + case "RPAR_0": // 請假申請單 + hasData = Get出勤資料("請假"); + break; + case "RPAR_1": // 加班申請單, 加班費印領清冊 + hasData = Get出勤資料("加班"); + if (reportName == "RPAR_CARD_06") + hasData = reportData.Select( + string.Format("RPTYP = '{0}' OR RPTYP = '{1}' OR RPTYP = '{2}' OR RPTYP = '{3}'", + RPAR_TYPE.T12_非休息日請領加班費, + RPAR_TYPE.T14_休息日請領加班費, + RPAR_TYPE.T16_國定假日請領加班費, + RPAR_TYPE.T18_例假日請領加班費 + ) + , "RPRDT").Length > 0; + break; + case "RPAR_3": // 公差申請單 + hasData = Get出勤資料("公差"); + break; + case "RPAR_31": // 差旅費報告單 + hasData = Get出勤資料("差旅費"); + Get出差費用資料(); + break; + } + + if (hasData) + { + Do月差勤表(reportTitle); + } + else + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "無符合條件的資料"; + } + } + + private void Do月差勤表(string 類別) + { + ExcelReportBase 報表 = null; + bool 以時分顯示時數 = true; + + switch (類別) + { + case "差勤月報表": + 報表 = new 差勤月報表(); + break; + case "請假申請單": + 報表 = new 請假申請單(); + 以時分顯示時數 = false; + break; + case "加班申請單": + 報表 = new 加班申請單(); + break; + case "公差申請單": + 報表 = new 出差申請單(); + break; + case "差旅費報告單": + 報表 = new 支出憑證黏存單(); + break; + case "加班費印領清冊": + 報表 = new 加班費印領清冊(); + break; + } + + if (報表 == null) + return; + + 報表.資料來源.Tables.Add(reportData); + if (reportData1 != null) + 報表.資料來源.Tables.Add(reportData1); + 報表.報表時間 = aYYMM; + 報表.公司名稱 = 公司名稱; + 報表.客戶名稱 = 客戶名稱; + 報表.專案名稱 = 專案名稱; + 報表.專案編號 = 專案編號; + 報表.以時分顯示時數 = 以時分顯示時數 || new GetData(Query).GetOverTimeToMinutes(專案編號); + + MemoryStream ms = 報表.產生報表(); + ResponseWriteFile(ms, String.Format("{0}_{1}_{2}.xls", UserId, txtYYMM.Text, 類別)); + } + + protected bool Get月差勤表資料() + { + DateTime 日期 = aYYMM; + DateTime 下月 = aYYMM.AddMonths(1); + reportData = new DataTable(); + reportData.Columns.Add("日期", typeof(DateTime)); + reportData.Columns.Add("出勤別", typeof(String)); + reportData.Columns.Add("員編", typeof(String)); + reportData.Columns.Add("單位", typeof(String)); + reportData.Columns.Add("職稱", typeof(String)); + reportData.Columns.Add("姓名", typeof(String)); + reportData.Columns.Add("上班", typeof(String)); + reportData.Columns.Add("下班", typeof(String)); + reportData.Columns.Add("請假", typeof(String)); + reportData.Columns.Add("加班", typeof(String)); + reportData.Columns.Add("公差", typeof(String)); + reportData.Columns.Add("出差外出", typeof(String)); + reportData.Columns.Add("出差返回", typeof(String)); + reportData.Columns.Add("班別名稱", typeof(String)); + reportData.Columns.Add("班別時間", typeof(String)); + reportData.Columns.Add("出勤異常", typeof(String)); + + BatchService batchService = new BatchService(); + + while (日期 < 下月) + { + DataTable 一天資料 = rparDao.Select出勤資料By人員(日期, UserId); + bool 要上班 = !bhrdDao.IsHoliday(UserId, 日期); + string 出勤別 = 要上班 ? "上班" : "休假"; + var btmeItem = rtmeDao.SelectBtmeDay(UserId, 日期); + foreach (DataRow r in 一天資料.Rows) + { + DataRow newRow = reportData.NewRow(); + newRow["日期"] = 日期; + newRow["出勤別"] = 出勤別; + newRow["員編"] = r["RANUM"]; + newRow["單位"] = r["單位"]; + newRow["職稱"] = r["職稱"]; + newRow["姓名"] = r["BPNME"]; + newRow["上班"] = r["RCC01"]; + newRow["下班"] = r["RCC02"]; + newRow["請假"] = string.Format("{0:#0}:{1:00}", r["請假時數"], r["請假分數"]); + newRow["加班"] = string.Format("{0:#0}:{1:00}", r["加班時數"], r["加班分數"]); + newRow["公差"] = string.Format("{0:#0}:{1:00}", r["出差時數"], r["出差分數"]); + newRow["出差外出"] = r["RCC07"]; + newRow["出差返回"] = r["RCC08"]; + newRow["班別名稱"] = btmeItem != null ? btmeItem.BTNME : ""; + newRow["班別時間"] = btmeItem != null ? string.Format("{0}-{1}", btmeItem.BTSTM, btmeItem.BTETM) : ""; + var rapyn = BhrdDAC.GetStringValue(r["RAPYN"]); + + if (!rparDao.IsPunchcardNormal( + 日期 + , UserId + , rapyn + , 要上班 + , WDAC.GetStringValue(r["RCC01"]) + , WDAC.GetStringValue(r["RCC02"]) + , WDAC.GetStringValue(r["RCC07"]) + , WDAC.GetStringValue(r["RCC08"]) + ).正常) + { + newRow["出勤異常"] = "(出勤異常)"; + } + + reportData.Rows.Add(newRow); + } + + 日期 = 日期.AddDays(1); + } + + return reportData.Rows.Count > 0; + } + + protected bool Get出勤資料(string 類型) + { + reportData = rparDao.Select報表資料_013By人員(aYYMM, UserId, 類型); + return reportData.Rows.Count > 0; + } + + protected void Get出差費用資料() + { + reportData1 = new DataTable(); + reportData1.Columns.Add("單號", typeof(String)); + reportData1.Columns.Add("項次", typeof(Int32)); + reportData1.Columns.Add("日期", typeof(DateTime)); + reportData1.Columns.Add("起地點", typeof(String)); + reportData1.Columns.Add("迄地點", typeof(String)); + reportData1.Columns.Add("工作摘要", typeof(String)); + reportData1.Columns.Add("捷運", typeof(Int32)); + reportData1.Columns.Add("汽車", typeof(Int32)); + reportData1.Columns.Add("火車", typeof(Int32)); + reportData1.Columns.Add("高鐵", typeof(Int32)); + reportData1.Columns.Add("飛機", typeof(Int32)); + reportData1.Columns.Add("住宿費", typeof(Int32)); + reportData1.Columns.Add("過路費", typeof(Int32)); + reportData1.Columns.Add("雜費", typeof(Int32)); + reportData1.Columns.Add("總計", typeof(Int32)); + reportData1.Columns.Add("單據號數", typeof(String)); + reportData1.Columns.Add("備註", typeof(String)); + + foreach (DataRow r1 in reportData.Rows) + { + DataTable t2 = rpadDao.SelectRpar(WDAC.GetStringValue(r1["RPREN"])); + foreach (DataRow r2 in t2.Rows) + { + DataRow newRow = reportData1.NewRow(); + newRow["單號"] = r2["RPREN"]; + newRow["項次"] = r2["RPITM"]; + newRow["日期"] = r2["RPDAT"]; + newRow["起地點"] = r2["RPSTP"]; + newRow["迄地點"] = r2["RPEDP"]; + newRow["工作摘要"] = r1["RPRSN"]; + newRow["捷運"] = r2["RPF03"]; + newRow["汽車"] = r2["RPF01"]; + newRow["火車"] = r2["RPF02"]; + newRow["高鐵"] = r2["RPF04"]; + newRow["飛機"] = r2["RPF07"]; + newRow["住宿費"] = r2["RPF05"]; + newRow["過路費"] = r2["RPF08"]; + newRow["雜費"] = r2["RPF06"]; + newRow["總計"] = r2["RPSUM"]; + newRow["單據號數"] = r2["RPVCH"]; + newRow["備註"] = r2["RPDOC"]; + + reportData1.Rows.Add(newRow); + } + } + } +} \ No newline at end of file diff --git a/Web/forms/report/fmDownload.ascx b/Web/forms/report/fmDownload.ascx new file mode 100644 index 0000000..a5b34c8 --- /dev/null +++ b/Web/forms/report/fmDownload.ascx @@ -0,0 +1,94 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmDownload.ascx.cs" Inherits="forms_report_fmDownload" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> +下載報表檢視器 +
+ + + +

下載

+ + +

安裝前注意

+
    +
  1. 若先前安裝過舊版本,請至控制台解除安裝 "Maolaoda Report Viewer"

    +

    Windows 7

    + +

    Windows 10

    + +
  2. +
+ +

安裝步驟

+
    +
  1. + 下載報表檢視器 報表檢視器安裝包 +
  2. +
  3. + 將報表檢視器安裝包解壓縮後,執行 Setup 安裝
    + +
  4. +
  5. + 安裝必要元件 必要元件安裝包 +
  6. +
  7. + 執行 CRRuntime_32bit_13_0_24.msi 進行必要元件安裝 +
  8. +
  9. + 若必要元件安裝失敗,請使用以下步驟: +
      +
    • 將 CRRuntime_32bit_13_0_24.msi 複製至「C:\」,方便接下來的操作
    • +
    • 點擊開始功能表,輸入「CMD」搜尋
    • +
    • 於搜尋結果中的「命令提示字元」上按滑鼠右鍵,選擇「以系統管理員身份執行」
    • +
    • 於「命令提示字元」中輸入「C:\CRRuntime_32bit_13_0_24.msi」按 enter 開始安裝
    • +
    +
  10. +
  11. 安裝成功之後請重新開機或是執行桌面上的「報表檢視器」捷徑
  12. +
  13. 若開機後沒有自動執行,桌面上有「報表檢視器」捷徑,請手動執行
  14. +
  15. 報表檢視器會常駐在工具列上
    + Windows 7:
    +
    + Windows 10:
    +
    + Windows 11:
    + +
  16. +
  17. 可支援各種瀏覽器
  18. +
+ +

注意事項

+
    +
  1. 報表檢視器可能會被瀏覽器或廣告阻擋軟體誤認為是廣告外掛,
    + 若已經安裝好報表檢視器並且已經執行,但依然無法檢視報表時,
    + 請設定廣告阻擋軟體,加入此網站為白名單 +
  2. +
  3. + 若使用 Chrome、Edge 瀏覽器無法使用報表檢視器,請嘗試這個方法:
    +
      +
    • + 於網址列輸入 chrome://flags/ 後按 Enter,開啟瀏覽器的旗標設定畫面
      + +
    • +
    • + 搜尋 Block insecure private network requests
      + +
    • +
    • + 將設定改為「Disabled」,然後重開瀏覽器
      + +
    • +
    +
  4. +
+
+ + diff --git a/Web/forms/report/fmDownload.ascx.cs b/Web/forms/report/fmDownload.ascx.cs new file mode 100644 index 0000000..7ecc72f --- /dev/null +++ b/Web/forms/report/fmDownload.ascx.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +public partial class forms_report_fmDownload : System.Web.UI.UserControl +{ + protected void Page_Load(object sender, EventArgs e) + { + + } +} \ No newline at end of file diff --git a/Web/forms/report/fmMgmtReport.ascx b/Web/forms/report/fmMgmtReport.ascx new file mode 100644 index 0000000..f4ad7e2 --- /dev/null +++ b/Web/forms/report/fmMgmtReport.ascx @@ -0,0 +1,298 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmMgmtReport.ascx.cs" Inherits="forms_report_fmMgmtReport" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + +
+ + + + + + + + + 員工編號 + 專案 +
+ + + 不限 + 在職 + 離職 +
+ + +
+
+
+
+ + + + + +
+ +
+
+ + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ +
+
+ + + + diff --git a/Web/forms/report/fmMgmtReport.ascx.cs b/Web/forms/report/fmMgmtReport.ascx.cs new file mode 100644 index 0000000..6b2566c --- /dev/null +++ b/Web/forms/report/fmMgmtReport.ascx.cs @@ -0,0 +1,488 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Text; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.IO; +using CRAX; + +/// +/// 管理報表 +/// +public partial class forms_report_fmMgmtReport : Wellan.Web.UI.WUserControlBase +{ + private DateTime Date1; + private DateTime Date2; + private DateTime EmpDate; + private ReportParameter rp = new ReportParameter(); + private string reportName = ""; + private string dataFileName = ""; + private string reportTitle = ""; + + protected void Page_Load(object sender, EventArgs e) + { + // 輸出 onclick 事件 + foreach (ListItem item in rblReport.Items) + { + item.Attributes.Add("onclick", "inputControl(\"" + item.Value + "\");"); + } + RegisterCalendarEvent(this, "btnDATE1_DATE", "txtDATE1"); + RegisterCalendarEvent(this, "btnDATE2_DATE", "txtDATE2"); + RegisterCalendarEvent(this, "btnEMPDATE_DATE", "txtEMPDATE"); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + ddlBPPNM.DataSource = new BpaaDAC().GetBpaaWithTYPlusNone(); + ddlBPPNM.DataBind(); + } + + private bool CheckInput() + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + bool result = true; + + if (rblReport.SelectedIndex == -1) + { + cvMessage.ErrorMessage += "請選擇報表"; + result = false; + } + + string[] tmp = rblReport.SelectedValue.Split(','); + if (tmp.Length > 2) + { + reportName = tmp[0]; + dataFileName = tmp[1]; + reportTitle = tmp[2]; + } + + switch (reportName) + { + case "BPSN_01": + if (!cbbBPEDY.Checked && + !cbbBPPNM.Checked && + !cbbBPSDY_PERIOD.Checked && + !cbbBPEDY_PERIOD.Checked && + !cbbBPBDY_PERIOD.Checked && + !cbbBPENO.Checked && + !cbbEMPDATE.Checked) + { + cvMessage.ErrorMessage += "請選擇篩選類型"; + result = false; + } + break; + case "BPSN_02": + if (!cbbBPEDY.Checked && + !cbbBPPNM.Checked && + !cbbBPSDY_PERIOD.Checked && + !cbbBPEDY_PERIOD.Checked && + !cbbBPBDY_PERIOD.Checked && + !cbbEMPDATE.Checked) + { + cvMessage.ErrorMessage += "請選擇篩選類型"; + result = false; + } + break; + + case "RPAR_ALL_1": + if (!cbbBPPNM.Checked && + !cbbPRESENT_PERIOD.Checked) + { + cvMessage.ErrorMessage += "請選擇篩選類型"; + result = false; + } + break; + + case "RPAR_01": + if (!cbbBPEDY.Checked && + !cbbBPPNM.Checked) + { + cvMessage.ErrorMessage += "請選擇篩選類型"; + result = false; + } + break; + } + + if (cbbBPSDY_PERIOD.Checked || + cbbBPEDY_PERIOD.Checked || + cbbPRESENT_PERIOD.Checked) + { + Date1 = CheckDate(txtDATE1.Text, "期間起始日期請輸入正確的日期", ref result, cvMessage); + Date2 = CheckDate(txtDATE2.Text, "期間結束日期請輸入正確的日期", ref result, cvMessage); + } + + if (cbbEMPDATE.Checked) + { + EmpDate = CheckDate(txtEMPDATE.Text, "在職日期請輸入正確的日期", ref result, cvMessage); + } + + cvMessage.IsValid = result; + + RegisterStartupScript("INPUT CONTROL", "inputControl(\"" + rblReport.SelectedValue + "\");"); + + ProcessCustomValidatorMessage(cvMessage); + return result; + } + + protected void btnOk_Click(object sender, EventArgs e) + { + if (!CheckInput()) + return; + + DataTable reportData; + if (!GetData(out reportData)) + { + cvMessage.ErrorMessage = "無符合條件的資料"; + cvMessage.IsValid = false; + return; + } + + // 將資料輸出成 MDB 檔案 + WTableTr tableTr = new WTableTr(); + string realFileName = tableTr.ExportToMDB(reportData, ReportDataPath + dataFileName + ".mdb", dataFileName, true, true, false); + realFileName = "reportData/" + Path.GetFileName(realFileName); + reportData.Dispose(); + tableTr = null; + + // 將參數輸出成 RPP 檔案 + string realParamFileName = "reportData/" + Path.GetFileName(rp.Save(ReportDataPath + reportName + ".rpp", true)); + + RegisterStartupScript("REPORT_JS", + CRAXHelper.GetReportScriptJSONP(Context, + GetWebRootUrl() + "CRAX/", + "../report/" + reportName + ".rpt", + "../" + realFileName, + "../" + realParamFileName, + "", + reportName + ".rpt", + dataFileName + ".mdb", + reportName + ".rpp", + "", + "", + "", + "", + "", + 0, + 0)); + } + + private bool GetData(out DataTable Result) + { + GetData gd = new GetData(); + gd.Query = Query; + + switch (dataFileName) + { + case "BPSN_01": + return GetDataBPSN_01(out Result); + case "RPIR_01": + return GetDataRPIR_01(out Result); + default: + Result = new DataTable(); + return false; + } + } + + private bool GetDataRPIR_01(out DataTable Result) + { + StringBuilder sql = new StringBuilder(); + rp.Clear(); + rp.Add("公司名稱", GetString("COMPANY.NAME")); + rp.Add("報表名稱", reportTitle); + + DbCommand cmd = Query.NewCommand(); + sql.Append( + @"SELECT * FROM + ( + SELECT A.RPREN, 0 AS RPITM, '1899/12/31' AS RPBDT, A.RPENO, A.RPSDT, A.RPEDT, A.RPSLY, A.RPAMT, A.RPFMY, A.RPFM1, A.RPFM2, + A.RPFM3, A.RPSLA, A.RPDIS, A.RPDIH, A.RPOLD, A.RPNAT, A.RPPTP, A.RPLIS, A.RPHIS, A.RPDOC, + B.BPNME, B.BPSDY, B.BPEDY, C.RAPYN, D.BPPYM RAPYNX, A.TRDAT, B.BPIDN + FROM RPIR A + LEFT OUTER JOIN BPSNView B ON A.RPENO=B.BPENO + LEFT OUTER JOIN RASN C ON A.RPENO=C.RANUM AND C.RAEDT IS NULL + LEFT OUTER JOIN BPAA D ON C.RAPYN=D.BPPYN + UNION + SELECT A.RPREN, A.RPITM, A.RPBDT, A.RPENO, A.RPSDT, A.RPEDT, A.RPSLY, A.RPAMT, A.RPFMY, A.RPFM1, A.RPFM2, + A.RPFM3, A.RPSLA, A.RPDIS, A.RPDIH, A.RPOLD, A.RPNAT, A.RPPTP, A.RPLIS, A.RPHIS, A.RPDOC, + B.BPNME, B.BPSDY, B.BPEDY, C.RAPYN, D.BPPYM RAPYNX, A.TRDAT, B.BPIDN + FROM RPIB A + LEFT OUTER JOIN BPSNView B ON A.RPENO=B.BPENO + LEFT OUTER JOIN RASN C ON A.RPENO=C.RANUM AND C.RAEDT IS NULL + LEFT OUTER JOIN BPAA D ON C.RAPYN=D.BPPYN + ) TMP + WHERE 1=1 "); + + string reportFilter = ""; + + // 在職狀況 + //if (RadioButton1.Checked) + if (cbbBPEDY.Checked) + { + switch (ddlBPEDY.SelectedValue) + { + case "0": + //rp.Add("報表條件", "全部員工"); + reportFilter = "在職狀況:全部"; + break; + case "1": + sql.Append(" AND (BPEDY IS NULL OR BPEDY >= @TODAY)"); + //rp.Add("報表條件", "在職員工"); + reportFilter = "在職狀況:在職"; + break; + case "2": + sql.Append(" AND (BPEDY < @TODAY)"); + //rp.Add("報表條件", "離職員工"); + reportFilter = "在職狀況:離職"; + break; + } + cmd.Parameters.Add(Query.NewParameter("TODAY", String.Format(WGuard1.InvariantCulture, "{0:yyyy-MM-dd}", DateTime.UtcNow.AddHours(8).Date))); + } + // 專案名稱 + //else if (RadioButton2.Checked) + if (cbbBPPNM.Checked) + { + if (ddlBPPNM.SelectedValue != "") + { + if (ddlBPPNM.SelectedValue != "000000001") + { + sql.Append(" AND RAPYN=@RAPYN"); + cmd.Parameters.Add(Query.NewParameter("RAPYN", ddlBPPNM.SelectedValue)); + //rp.Add("報表條件", ddlBPPNM.SelectedItem.Text); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "專案名稱:" + ddlBPPNM.SelectedItem.Text; + } + else + { + sql.Append(" AND RAPYN IS NULL"); + //rp.Add("報表條件", ddlBPPNM.SelectedItem.Text); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "專案名稱:" + ddlBPPNM.SelectedItem.Text; + } + } + else + //rp.Add("報表條件", "全部專案"); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "專案名稱:全部專案"; + } + + rp.Add("報表條件", reportFilter); + + switch (rblORDER.SelectedIndex) + { + case 0: + sql.Append(" ORDER BY RPENO, RPREN, RPITM"); + rp.Add("排序方式", "員工編號順序"); + reportName += "_01"; + break; + case 1: + sql.Append(" ORDER BY RAPYN, RPENO, RPREN, RPITM"); + rp.Add("排序方式", "專案順序"); + reportName += "_02"; + break; + } + + cmd.CommandText = sql.ToString(); + DbDataAdapter da = Query.NewDataAdapter(cmd); + DbConnection conn = Query.NewConnection(); + cmd.Connection = conn; + Result = new DataTable(); + da.FillSchema(Result, SchemaType.Mapped); + da.Fill(Result); + + return Result.Rows.Count > 0; + } + + private bool GetDataBPSN_01(out DataTable Result) + { + StringBuilder sql = new StringBuilder(); + rp.Clear(); + rp.Add("公司名稱", GetString("COMPANY.NAME")); + rp.Add("報表名稱", reportTitle); + + DbCommand cmd = Query.NewCommand(); + + // SQL command 第 6 行的換行是故意的,這樣資料中才會有換行符號 + sql.Append( + string.Format(@"SELECT A.*, B.RAPYN, C.BPPYM RAPYNX, B.RABRH, D.BSRMK RABRHX, B.RAJNO, E.BPJME RAJNOX, B.RACNO, F.BPCME RACNOX, + CASE WHEN B.RAPYN IS NOT NULL THEN F.BPSRM ELSE (SELECT TOP 1 BPSRM FROM (SELECT '1899/12/31' BPBDT, BPSRM FROM BPSL WHERE BPENO=A.BPENO UNION SELECT RPBDT AS BPBDT, RPSRM AS BPSRM FROM RPSL WHERE RPENO=A.BPENO) X ORDER BY BPBDT DESC) END AS BPSRM, + CASE WHEN B.RAPYN IS NOT NULL THEN F.BPP02 ELSE (SELECT TOP 1 BPP02 FROM (SELECT '1899/12/31' BPBDT, BPP02 FROM BPSL WHERE BPENO=A.BPENO UNION SELECT RPBDT AS BPBDT, RPP02 AS BPSRM FROM RPSL WHERE RPENO=A.BPENO) Y ORDER BY BPBDT DESC) END AS BPP02, + G.BCNAM AS BCBNKX, + '【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(C.BPPYN,4,1)) + '】 +' + C.BPPYM RAPYNX1, ISNULL(I.RPCPY, H.RPCPY) AS RPCPY + FROM BPSNView A + LEFT OUTER JOIN RASN B ON A.BPENO=B.RANUM AND B.RAEDT IS NULL AND B.RASDT <= '{0}' + LEFT OUTER JOIN BPAA C ON B.RAPYN=C.BPPYN + LEFT OUTER JOIN BCLS D ON D.BSCLS=B.RABRH AND D.BSPAR='BPSNBRH' + LEFT OUTER JOIN BPJA E ON E.BPPYN=B.RAPYN AND E.BPJNO=B.RAJNO + LEFT OUTER JOIN BPJB F ON F.BPPYN=B.RAPYN AND F.BPJNO=B.RAJNO AND F.BPCNO=B.RACNO + LEFT OUTER JOIN BRML G ON A.BPBNK=G.BCNUM + LEFT OUTER JOIN RPIR H ON A.BPENO=H.RPENO AND H.RPREN=(SELECT MAX(RPREN) FROM RPIR WHERE RPENO=A.BPENO) + LEFT OUTER JOIN RPIB I ON H.RPREN=I.RPREN AND I.RPITM=(SELECT MAX(RPITM) FROM RPIB WHERE RPREN=I.RPREN) + WHERE 1=1 ", DateTime.UtcNow.AddHours(8).ToString("yyyy-MM-dd", WGuard1.InvariantCulture) )); + + string reportFilter = ""; + + // 員工學歷統計表 與 員工年齡統計表要抓在職員工 + if (reportName == "BPSN_03" || reportName == "BPSN_04") + { + sql.Append(" AND A.BPEDY IS NULL"); + } + + // 員工編號 + if (cbbBPENO.Checked) + { + if (txtBPENO1.Text.Length > 0 && txtBPENO2.Text.Length > 0) + { + sql.Append(" AND A.BPENO BETWEEN @BPENO1 AND @BPENO2 "); + Query.AddParam(cmd, "BPENO1", txtBPENO1.Text); + Query.AddParam(cmd, "BPENO2", txtBPENO2.Text); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + String.Format("員工編號:{0}至{1}", txtBPENO1.Text, txtBPENO2.Text); + } + if (txtBPENO1.Text.Length > 0 && txtBPENO2.Text.Length == 0) + { + sql.Append(" AND A.BPENO >= @BPENO1 "); + Query.AddParam(cmd, "BPENO1", txtBPENO1.Text); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + String.Format("員工編號:{0}之後", txtBPENO1.Text); + } + if (txtBPENO1.Text.Length == 0 && txtBPENO2.Text.Length > 0) + { + sql.Append(" AND A.BPENO <= @BPENO2 "); + Query.AddParam(cmd, "BPENO2", txtBPENO2.Text); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + String.Format("員工編號:{0}之前", txtBPENO2.Text); + } + } + + // 在職狀況 + if (cbbBPEDY.Checked) + { + switch (ddlBPEDY.SelectedValue) + { + case "0": + //rp.Add("報表條件", "全部員工"); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "在職狀況:全部"; + break; + case "1": + sql.Append(" AND (A.BPEDY IS NULL OR A.BPEDY >= @TODAY)"); + //rp.Add("報表條件", "在職員工"); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "在職狀況:在職"; + break; + case "2": + sql.Append(" AND (A.BPEDY < @TODAY)"); + //rp.Add("報表條件", "離職員工"); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "在職狀況:離職"; + break; + } + cmd.Parameters.Add(Query.NewParameter("TODAY", String.Format(WGuard1.InvariantCulture, "{0:yyyy-MM-dd}", DateTime.UtcNow.AddHours(8).Date))); + } + + // 專案名稱 + if (cbbBPPNM.Checked) + { + if (ddlBPPNM.SelectedValue != "") + { + if (ddlBPPNM.SelectedValue != "000000001") + { + sql.Append(" AND B.RAPYN=@RAPYN"); + Query.AddParam(cmd, "RAPYN", ddlBPPNM.SelectedValue); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "專案名稱:" + ddlBPPNM.SelectedItem.Text; + } + else + { + sql.Append(" AND B.RAPYN IS NULL"); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "專案名稱:" + ddlBPPNM.SelectedItem.Text; + } + } + else + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "專案名稱:全部專案"; + + } + + // 到職期間 + if (cbbBPSDY_PERIOD.Checked) + { + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "到職期間:" + PreparePeriod("A.BPSDY", sql, cmd); + } + + // 離職期間 + if (cbbBPEDY_PERIOD.Checked) + { + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "離職期間:" + PreparePeriod("A.BPEDY", sql, cmd); + } + + // 生日期間 + if (cbbBPBDY_PERIOD.Checked) + { + sql.Append(" AND (RIGHT(CONVERT(VARCHAR(8), A.BPBDY, 112), 4)>=@DATE1 AND RIGHT(CONVERT(VARCHAR(8), A.BPBDY, 112), 4)<=@DATE2) "); + Query.AddParam(cmd, "DATE1", ddlDATE1.SelectedValue); + Query.AddParam(cmd, "DATE2", ddlDATE2.SelectedValue); + + if (ddlDATE1.SelectedIndex != ddlDATE2.SelectedIndex) + { + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "生日月份:" + String.Format("{0} 至 {1}", ddlDATE1.SelectedItem.Text, ddlDATE2.SelectedItem.Text); + } + else + { + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "生日月份:" + String.Format("{0}", ddlDATE1.SelectedItem.Text); + } + } + + // 在職日期 + if (cbbEMPDATE.Checked) + { + sql.Append(" AND (A.BPSDY <= @EMPDATE AND (A.BPEDY > @EMPDATE OR A.BPEDY IS NULL))"); + Query.AddParam(cmd, "EMPDATE", EmpDate); + reportFilter += (reportFilter.Length > 0 ? "/" : "") + "在職日期:" + string.Format("{0:yyyy}年{0:MM}月{0:dd}日", EmpDate); + } + + rp.Add("報表條件", reportFilter); + + sql.Append(String.Format(" ORDER BY {0}", rblORDER.SelectedValue)); + + switch (rblORDER.SelectedIndex) + { + case 0: + rp.Add("排序方式", "員工編號順序"); + break; + case 1: + rp.Add("排序方式", "專案順序"); + break; + } + + cmd.CommandText = sql.ToString(); + Result = Query.Select(cmd); + return Result.Rows.Count > 0; + } + + private string PreparePeriod(string fieldName, StringBuilder sql, DbCommand cmd) + { + if (Date1.Ticks > 0 && Date2.Ticks > 0) + { + sql.Append(" AND (" + fieldName + " > @DATE1 AND " + fieldName + " < @DATE2) "); + cmd.Parameters.Add(Query.NewParameter("DATE1", Date1.AddDays(-1))); + cmd.Parameters.Add(Query.NewParameter("DATE2", Date2.AddDays(1))); + return String.Format("{0:yyyy}年{0:MM}月{0:dd}日 至 {1:yyyy}年{1:MM}月{1:dd}日 ", Date1, Date2); + } + else if (Date1.Ticks > 0 && Date2.Ticks == 0) + { + sql.Append(" AND (" + fieldName + " > @DATE1) "); + cmd.Parameters.Add(Query.NewParameter("DATE1", Date1.AddDays(-1))); + return String.Format("{0:yyyy}年{0:MM}月{0:dd}日後 ", Date1); + } + else if (Date1.Ticks == 0 && Date2.Ticks > 0) + { + sql.Append(" AND (" + fieldName + " < @DATE2) "); + cmd.Parameters.Add(Query.NewParameter("DATE2", Date2.AddDays(1))); + return String.Format("{0:yyyy}年{0:MM}月{0:dd}日前 ", Date2); + } + else + return "所有日期"; + } +} diff --git a/Web/forms/report/fmYearReport.ascx b/Web/forms/report/fmYearReport.ascx new file mode 100644 index 0000000..5469266 --- /dev/null +++ b/Web/forms/report/fmYearReport.ascx @@ -0,0 +1,75 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmYearReport.ascx.cs" + Inherits="forms_report_fmYearReport" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + +
+ 年度(3碼) / 年月(5碼): + +
+ + + + + + + + + + + + + + +
+ 專案: + +
+ 報表: + +<%-- 經費核銷年度總表 + 經費核銷季報表 + 經費核銷月報表--%> + 各項法定提撥費用明細表 + 薪資清冊 +<%-- 薪資清冊(多媽媽)--%> +<%-- 薪資明細表(內部發薪)--%> + 請假明細 + 加班費明細 + 外勤工作明細表 +<%-- 差旅費明細(多媽媽) + 電話費明細(多媽媽) + 油料費明細(多媽媽) + 外勤工作費明細(多媽媽)--%> +<%-- 薪資總表--%> + 出缺勤情形統計表 + +
+
\ No newline at end of file diff --git a/Web/forms/report/fmYearReport.ascx.cs b/Web/forms/report/fmYearReport.ascx.cs new file mode 100644 index 0000000..94ab739 --- /dev/null +++ b/Web/forms/report/fmYearReport.ascx.cs @@ -0,0 +1,397 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using Wellan.Common; +using Wellan.Data; +using System.Data.Common; +using CRAX; +using System.IO; +using System.Linq; +using System.Collections.Generic; + +/// +/// 專案報表 +/// +public partial class forms_report_fmYearReport : Wellan.Web.UI.WUserControlBase +{ + private DataTable reportData; + private string reportName = ""; + private string dataFileName = ""; + private string reportTitle = ""; + private string reportPeriod = ""; + private DateTime aYYMM; + private GetData gd = new GetData(); + private bool OverTimeToMinute; + + protected void Page_Load(object sender, EventArgs e) + { + //ddlBPPNM.DataSource = new BpaaDAC().GetBpaaWithTY(); + //ddlBPPNM.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + SetClientFocus(txtYYMM); + gd.Query = Query; + } + + protected void btnOk_Click(object sender, EventArgs e) + { + // 檢查此使用者是否有權限處理這個專案 + BprmDAC bprm = new BprmDAC(Query); + if (!bprm.GetRight(ddlBPPNM.SelectedValue, UserId)) + { + cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + cvMessage.IsValid = false; + return; + } + + bool result = true; + bool year = false; + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + + string[] tmp = ddlReportSelect.SelectedValue.Split(','); + reportName = tmp[0]; + dataFileName = tmp[1]; + reportTitle = tmp[2]; + reportPeriod = tmp[3]; + + // 加班費明細 與 出缺勤情形統計表 可以輸入三位表示年報表 + if ((reportName == "RPAR_1X" || reportName == "RPAR_ALL_2") && txtYYMM.Text.Length == 3) + { + year = true; + aYYMM = CheckDate(txtYYMM.Text + "0101", "請輸入正確的年度", ref result, cvMessage); + if (!result) + return; + } + else + { + aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + if (!result) + return; + } + + OverTimeToMinute = gd.GetOverTimeToMinutes(ddlBPPNM.SelectedValue); + + // 若是加班費明細表且專案年度接單加班時數計算至分鐘 + // 改用 RPAR_1X_1 報表 + if (reportName == "RPAR_1X" && OverTimeToMinute) + reportName = "RPAR_1X_1"; + if (reportName == "RPAR_0X_1" && OverTimeToMinute) + reportName = "RPAR_0X_1M"; + if (reportName == "RPAR_ALL_2" && OverTimeToMinute) + reportName = "RPAR_ALL_2M"; + + bool hasData = false; + switch (dataFileName) + { + case "SACD_01": + hasData = GetSACDData(); + break; + case "SSMS_01": + hasData = GetSSMSData(year); + break; + case "SSMS_02": + hasData = GetSSMSSummaryData(); + break; + } + + if (hasData) + ExportReport(year); + else + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "無符合條件的資料"; + } + } + + protected void btnYear_Click(object sender, EventArgs e) + { + bool result = true; + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + txtYYMM.Text = txtYYMM.Text.Trim(); + string rp = ""; + + if (txtYYMM.Text.Length == 3) + { + rp = "YEAR"; + aYYMM = CheckDate(txtYYMM.Text + "0101", "請輸入正確的年度", ref result, cvMessage); + if (!result) + return; + } + else + { + rp = "MONTH"; + aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + if (!result) + return; + } + + Panel1.Visible = true; + + for (var i = 0; i < ddlReportSelect.Items.Count; i++) + { + var listItem = ddlReportSelect.Items[i]; + var v = listItem.Value.Split(','); + if (v.Length > 3 && v[3].Contains(rp)) + { + listItem.Enabled = true; + listItem.Attributes.Remove("style"); + } + else + { + listItem.Enabled = false; + listItem.Attributes.Add("style", "color: gray"); + } + } + + ddlBPPNM.DataSource = new BpaaDAC().GetBpaaWithTY(aYYMM.Year); + ddlBPPNM.DataBind(); + } + + /// + /// 取得總表用資料 + /// + protected bool GetSACDData() + { + return gd.GetSACDReportData(ddlBPPNM.SelectedValue, aYYMM, out reportData); + } + + /// + /// 取得薪資勞健保報表資料 + /// + protected bool GetSSMSData(bool year) + { + return gd.GetSSMSReportData(ddlBPPNM.SelectedValue, aYYMM, year, out reportData); + } + + /// + /// 取得薪資總表資料 + /// + protected bool GetSSMSSummaryData() + { + return gd.GetSSMSSummaryReportData(aYYMM, out reportData); + } + + // 列印報表 + protected void PrintReport(bool year) + { + WTableTr tableTr = new WTableTr(); + string realFileName = tableTr.ExportToMDB(reportData, ReportDataPath + dataFileName + ".mdb", dataFileName, true, true, false); + realFileName = "reportData/" + Path.GetFileName(realFileName); + reportData.Dispose(); + tableTr = null; + + // 取得客戶名稱 + string custName = WDAC.GetStringValue(Query.ExecuteScalar( + @"SELECT BCNAM FROM BCUS A + INNER JOIN BPRJ B ON A.BCNUM=B.BPNUM + INNER JOIN BPAA C ON B.BPPNM=C.BPPNM + WHERE C.BPPYN='" + ddlBPPNM.SelectedValue + "'")); + + // 取得公司名稱 + string companyName = CompanyDAC.GetCompanyName(WDAC.GetStringValue(Query.ExecuteScalar( + @"SELECT BPCPY FROM BPRJ B + INNER JOIN BPAA C ON B.BPPNM=C.BPPNM + WHERE C.BPPYN='" + ddlBPPNM.SelectedValue + "'"))); + + // 取得前段、後段、假日加班比例 + double bpbft; + double bpaft; + double bphol; + string bpovr; + string bplve; + gd.GetRASN_Overwork_Rate(ddlBPPNM.SelectedValue, out bpbft, out bpaft, out bphol, out bpovr, out bplve); + + ReportParameter rp = new ReportParameter(); + rp.Add("公司名稱", companyName); + rp.Add("客戶名稱", custName); + rp.Add("報表名稱", reportTitle); + rp.Add("專案名稱", GetLookup("BPAA", ddlBPPNM.SelectedValue, "BPPYM")); + rp.Add("年度", WGuard1.WNTSA(aYYMM.Year - WGuard1.CY11, "", false) + "年"); + rp.Add("月份", year ? "一月至十二月" : aYYMM.ToString("MMM", WGuard1.TaiwanCulture)); + rp.Add("前段", "一又三分之一"); + rp.Add("後段", "一又三分之二"); + rp.Add("假日", "1"); + rp.Add("休息日延長", "二又三分之二"); + rp.Add("例假日延長", "2"); + switch (aYYMM.Month) + { + case 1: + case 2: + case 3: + rp.Add("季", "第一季"); + break; + case 4: + case 5: + case 6: + rp.Add("季", "第二季"); + break; + case 7: + case 8: + case 9: + rp.Add("季", "第三季"); + break; + case 10: + case 11: + case 12: + rp.Add("季", "第四季"); + break; + } + string realParamFileName = "reportData/" + Path.GetFileName(rp.Save(ReportDataPath + reportName + ".rpp", true)); + + RegisterStartupScript("REPORT_JS", + CRAXHelper.GetReportScriptJSONP(Context, + GetWebRootUrl() + "CRAX/", + "../report/" + reportName + ".rpt", + "../" + realFileName, + "../" + realParamFileName, + "", + reportName + ".rpt", + dataFileName + ".mdb", + reportName + ".rpp", + "", + "", + "", + "", + "", + 0, + 0)); + + } + + /// + /// 報表匯出 Excel + /// + /// + protected void ExportReport(bool year) + { + //WTableTr tableTr = new WTableTr(); + //string realFileName = tableTr.ExportToMDB(reportData, ReportDataPath + dataFileName + ".mdb", dataFileName, true, true, false); + //realFileName = "reportData/" + Path.GetFileName(realFileName); + //reportData.Dispose(); + //tableTr = null; + + // 取得客戶名稱 + string custName = WDAC.GetStringValue(Query.ExecuteScalar( + @"SELECT BCNAM FROM BCUS A + INNER JOIN BPRJ B ON A.BCNUM=B.BPNUM + INNER JOIN BPAA C ON B.BPPNM=C.BPPNM + WHERE C.BPPYN='" + ddlBPPNM.SelectedValue + "'")); + + // 取得公司名稱 + string companyName = CompanyDAC.GetCompanyName(WDAC.GetStringValue(Query.ExecuteScalar( + @"SELECT BPCPY FROM BPRJ B + INNER JOIN BPAA C ON B.BPPNM=C.BPPNM + WHERE C.BPPYN='" + ddlBPPNM.SelectedValue + "'"))); + + // 取得前段、後段、假日加班比例 + double bpbft; + double bpaft; + double bphol; + string bpovr; + string bplve; + gd.GetRASN_Overwork_Rate(ddlBPPNM.SelectedValue, out bpbft, out bpaft, out bphol, out bpovr, out bplve); + + var 專案名稱 = GetLookup("BPAA", ddlBPPNM.SelectedValue, "BPPYM").Trim(); + var 年度 = WGuard1.WNTSA(aYYMM.Year - WGuard1.CY11, "", false); + var 月份 = year ? "一月至十二月" : aYYMM.ToString("MMM", WGuard1.TaiwanCulture); + + companyName = companyName.Trim(); + custName = custName.Trim(); + reportTitle = reportTitle.Trim(); + + Dictionary rp = new Dictionary + { + { "公司名稱", companyName }, + { "客戶名稱", custName }, + { "報表名稱", reportTitle }, + { "專案名稱", 專案名稱 }, + { "年度", 年度 + "年" }, + { "月份", 月份 }, + { "前段", "1⅓" }, + { "後段", "1⅔" }, + { "假日", "1" }, + { "休息日延長", "2⅔" }, + { "例假日延長", "2" } + }; + switch (aYYMM.Month) + { + case 1: + case 2: + case 3: + rp.Add("季", "第一季"); + break; + case 4: + case 5: + case 6: + rp.Add("季", "第二季"); + break; + case 7: + case 8: + case 9: + rp.Add("季", "第三季"); + break; + case 10: + case 11: + case 12: + rp.Add("季", "第四季"); + break; + } + + var ms = DoExport(rp); + if (ms != null) + { + ResponseWriteFile(ms, String.Format("{0}_{1}_{2}{3}.xls", 專案名稱, reportTitle, 年度, 月份)); + } + } + + protected MemoryStream DoExport(Dictionary reportParams) + { + ExcelReportBase report = null; + + switch (reportName) + { + case "SSMS_01_1": + report = new 各項法定提撥費用明細表(); break; + case "SSMS_02A_1": + report = new 薪資清冊(); break; + case "RPAR_0X_1": + case "RPAR_0X_1M": + report = new 請假明細(); break; + case "RPAR_1X": + case "RPAR_1X_1": + report = new 加班費明細(); break; + case "RPAR_3X": + report = new 外勤工作明細表(); break; + case "RPAR_ALL_2": + case "RPAR_ALL_2M": + report = new 出缺勤情形統計表(); break; + } + + if (report == null) + return null; + + report.資料來源.Tables.Add(reportData); + report.報表參數 = reportParams; + report.公司名稱 = reportParams["公司名稱"]; + report.客戶名稱 = reportParams["客戶名稱"]; + report.專案名稱 = reportParams["專案名稱"]; + report.報表名稱 = reportParams["報表名稱"]; + report.年度 = reportParams["年度"]; + report.月份 = reportParams["月份"]; + report.以時分顯示時數 = OverTimeToMinute; + + return report.產生報表(); + } +} diff --git a/Web/forms/summary/fmSalaryCalc.ascx b/Web/forms/summary/fmSalaryCalc.ascx new file mode 100644 index 0000000..d69cc9b --- /dev/null +++ b/Web/forms/summary/fmSalaryCalc.ascx @@ -0,0 +1,284 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmSalaryCalc.ascx.cs" + Inherits="forms_summary_fmSalaryCalc" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + +
+ +
+ 年月: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ 年月: + +
+ 專案: + +
+ + +
+ + + +
+ + + + + + + + + + + +
+ + + + +
+
+
+ +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 科目編號 + + 科目名稱 + + 金額 + + 備註 + + 科目編號 + + 科目名稱 + + 金額 + + 備註
+
+ + + + + + + + + + + + + + + +
+ + + + + + + +
+
+
+
+
\ No newline at end of file diff --git a/Web/forms/summary/fmSalaryCalc.ascx.cs b/Web/forms/summary/fmSalaryCalc.ascx.cs new file mode 100644 index 0000000..881bd52 --- /dev/null +++ b/Web/forms/summary/fmSalaryCalc.ascx.cs @@ -0,0 +1,1895 @@ +using Mono.Security.Cryptography; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Security.Cryptography; +using System.Text; +using System.Web.UI; +using System.Web.UI.WebControls; +using Wellan.Data; + +/// +/// 每月出勤薪資匯總計算 +/// +public partial class forms_summary_fmSalaryCalc : Wellan.Web.UI.WUserControlBase +{ + /// + /// 計算年月 + /// + private DateTime aYYMM; + private DbConnection conn; + private DbCommand cmdInsertSACD; + private DbCommand cmdDeleteSACD; + private DbCommand cmdDeleteAllSACD; + private DbCommand cmdSelectSACD; + private DbCommand cmdUpdateSACD; + private DbCommand cmdCloseBPAA; + private string _BPPYN; + protected string _BPYMM; + private GetData _getData; + private Bhif bhif; + private Blif blif; + private Blra blra; + private SsmsDAC ssmsDao; + private RcrdDAC rcrdDao; + private RparDAC rparDao; + + protected void Page_Load(object sender, EventArgs e) + { + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + _getData = new GetData(); + _getData.Query = Query; + conn = Query.NewConnection(); + ssmsDao = new SsmsDAC(Query); + ssmsDao.TRUSR = UserId; + + #region INIT SQLCOMMAND + cmdInsertSACD = Query.NewCommand( + @"INSERT INTO SACD + (SAPYN, SAYMM, SAACC, SAAMT, SADOC, TRDAT, TRMOD, TRUSR) + VALUES + (@SAPYN, @SAYMM, @SAACC, @SAAMT, @SADOC, GETDATE(), 'INSERT', 'X001')"); + cmdInsertSACD.Parameters.Add(Query.NewParameter("SAPYN", DbType.String)); + cmdInsertSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); + cmdInsertSACD.Parameters.Add(Query.NewParameter("SAACC", DbType.String)); + cmdInsertSACD.Parameters.Add(Query.NewParameter("SAAMT", DbType.Int32)); + cmdInsertSACD.Parameters.Add(Query.NewParameter("SADOC", DbType.String)); + cmdInsertSACD.Connection = conn; + + cmdDeleteSACD = Query.NewCommand( + @"DELETE FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM AND SAACC=@SAACC"); + cmdDeleteSACD.Parameters.Add(Query.NewParameter("SAPYN", DbType.String)); + cmdDeleteSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); + cmdDeleteSACD.Parameters.Add(Query.NewParameter("SAACC", DbType.String)); + cmdDeleteSACD.Connection = conn; + + cmdDeleteAllSACD = Query.NewCommand( + @"DELETE FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM"); + cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("SAPYN", DbType.String)); + cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); + cmdDeleteAllSACD.Connection = conn; + + cmdSelectSACD = Query.NewCommand( + @"SELECT COUNT(1) FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM AND SAACC=@SAACC"); + cmdSelectSACD.Parameters.Add(Query.NewParameter("SAPYN", DbType.String)); + cmdSelectSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); + cmdSelectSACD.Parameters.Add(Query.NewParameter("SAACC", DbType.String)); + cmdSelectSACD.Connection = conn; + + cmdUpdateSACD = Query.NewCommand( + @"UPDATE SACD SET + SAAMT=@SAAMT + WHERE + SAPYN=@SAPYN AND SAYMM=@SAYMM AND SAACC=@SAACC"); + cmdUpdateSACD.Parameters.Add(Query.NewParameter("SAAMT", DbType.Int32)); + cmdUpdateSACD.Parameters.Add(Query.NewParameter("SAPYN", DbType.String)); + cmdUpdateSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); + cmdUpdateSACD.Parameters.Add(Query.NewParameter("SAACC", DbType.String)); + cmdUpdateSACD.Connection = conn; + + cmdCloseBPAA = Query.NewCommand("UPDATE BPAA SET BPMSD=@BPMSD WHERE BPPYN=@BPPYN"); + cmdCloseBPAA.Parameters.Add(Query.NewParameter("BPMSD", DbType.DateTime)); + cmdCloseBPAA.Parameters.Add(Query.NewParameter("BPPYN", DbType.String)); + cmdCloseBPAA.Connection = conn; + + #endregion + + _BPPYN = GetStringParam("BPPYN"); + _BPYMM = GetStringParam("BPYMM"); + + if (_BPPYN != "" && _BPYMM != "") + { + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + + MultiView1.ActiveViewIndex = 1; + pnBPSXX.Visible = true; + + bool result = true; + aYYMM = CheckDate(_BPYMM + "01", "請輸入正確的年月", ref result, cvMessage); + + if (!result) + return; + + ddlRSPYN.DataSource = new BpaaDAC().GetBpaaWithTY(aYYMM.Year); + ddlRSPYN.DataBind(); + //ddlRSPYN.SQL = "SELECT BPPYN, BPPYM FROM BPAA WHERE BPYER=" + (aYYMM.Year - WGuard1.CY11).ToString() + " ORDER BY BPPYN"; + ddlRSPYN.SelectedValue = _BPPYN; + lbYYMM.Text = _BPYMM; + } + else + { + SetClientFocus(txtYYMM); + } + } + + protected bool CheckProjectRight() + { + // 檢查此使用者是否有權限處理這個專案 + BprmDAC bprm = new BprmDAC(Query); + if (!bprm.GetRight(ddlRSPYN.SelectedValue, UserId)) + { + //MultiView1.Visible = false; + cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + cvMessage.IsValid = false; + return false; + } + return true; + } + + /// + /// 計算薪資 + /// + /// 起始日期 + /// 結束日期 + /// 月薪 + /// 伙食津貼 + /// 本月天數 + /// 本月月初日 + /// 本月月底日 + /// 到職天數 + /// 本月薪資 + /// 本月伙食津貼 + /// 薪資破月計算方式(1=除以30, 2=除以實際日數) + protected void CalcSalary(DateTime startDate, DateTime endDate, int bpsrm, int bpp02, + int monthEndDay, ref DateTime thisMonthStartDay, ref DateTime thisMonthEndDay, + ref int thisMonthDays, ref int monthSalary, ref int foodBonus, string bpsal) + { + int startDay = startDate <= aYYMM ? 1 : startDate.Day; + int endDay = (endDate.Ticks == 0) || + (aYYMM.Year != endDate.Year || aYYMM.Month != endDate.Month) + ? monthEndDay : endDate.Day; + if (thisMonthStartDay.Ticks == 0) + thisMonthStartDay = aYYMM.AddDays(startDay - 1); + thisMonthEndDay = aYYMM.AddDays(endDay - 1); + + // 決定月天數 (1=30日, 2=該月實際日數) + int calcMonthDays = 30; + if (bpsal == "2") { + calcMonthDays = monthEndDay; + } + + // 若破月,則以 (月薪 / 月天數) * 天數 來計算 + if (startDay != 1 || endDay != monthEndDay) + { + int thisPartDays = endDay - startDay + 1; + thisMonthDays += thisPartDays; + + // 本月開始日是月初,且本月結束日是月底的話,修正天數 + if (thisMonthStartDay == aYYMM && thisMonthEndDay == aYYMM.AddMonths(1).AddDays(-1)) + { + thisMonthDays -= thisPartDays; + thisPartDays = calcMonthDays - thisMonthDays; + thisMonthDays = calcMonthDays; + } + + // 若累積起來的天數超過月天數,修正這部份的天數 + if (thisMonthDays > calcMonthDays) + { + thisPartDays -= thisMonthDays - calcMonthDays; + } + + foodBonus += Convert.ToInt32(Math.Round(Convert.ToDecimal(bpp02) / Convert.ToDecimal(calcMonthDays) * Convert.ToDecimal(thisPartDays), + MidpointRounding.AwayFromZero)); + monthSalary += Convert.ToInt32(Math.Round(Convert.ToDecimal(bpsrm - bpp02) / Convert.ToDecimal(calcMonthDays) * Convert.ToDecimal(thisPartDays), + MidpointRounding.AwayFromZero)); + } + else + { + thisMonthDays += monthEndDay; + foodBonus += bpp02; + monthSalary += bpsrm - bpp02; + } + } + + /// + /// 計算出勤紀錄與加班費,包括單筆輸入的以及匯總輸入的 + /// + /// 計算起始日 + /// 計算結束日 + /// 專案年度編號 + /// 人員編號 + /// 差勤結算日 + /// 月薪 + /// 伙食津貼 + /// 前二比例 + /// 後二比例 + /// 假日比例 + /// 計算公式 + /// 加班時數計算方式 + /// 專案派遣起始日 + /// 專案派遣結束日 + /// 要加入的交易 + /// 加班費計算物件 + /// 加班備註 + protected void CalcWork(DateTime startDay, DateTime endDay, + string rapyn, string bpeno, int bpfed, int bpsrm, int bpp02, double bpbft, + double bpaft, double bphol, string formula, string bpott, + DateTime rasdt, DateTime raedt, + DbTransaction tran, ref ExtraWork extraWork, ref string SSC02) + { + // 出勤紀錄 + //DataTable rcrd = rcrdDao.SelectPeriod(bpeno, startDay, endDay); + + BhrdDAC bhrdDao = new BhrdDAC(); + + RPARRecord rparRecord = new RPARRecord(); + + // 加班單筆輸入 + DataTable rpar1 = _getData.GetRPAR1X(aYYMM, rapyn, startDay, endDay, rasdt, raedt, bpeno, bpfed, tran); + StringBuilder sb1 = new StringBuilder(); + + foreach (DataRow rparRow in rpar1.Rows) + { + rparRecord.FillRecord(rparRow); + ExtraWorkData extraData; + + extraData = extraWork.Add(rparRecord.RPTYP, rparRecord.RPRDT, rparRecord.RPTCT, bpsrm, bpp02, bpbft, bpaft, bphol, + formula, bpott, rparRecord.RPTC1, rparRecord.RPTC2, rparRecord.RPTC3, rparRecord.RPTC4, rparRecord.RPTC5); + + if (rparRecord.RPDOC.Length > 0) + sb1.Append(rparRecord.RPDOC + "/"); + + rparDao.回填加班費(rparRecord.RPREN, + WDAC.GetInt32Value(extraData.RPTA1), + WDAC.GetInt32Value(extraData.RPTA2), + WDAC.GetInt32Value(extraData.RPTA3), + WDAC.GetInt32Value(extraData.RPTA4), + WDAC.GetInt32Value(extraData.RPTA5), + tran); + } + SSC02 += sb1.Length > 0 ? sb1.ToString(0, sb1.Length - 1) : ""; + + // 加班匯總輸入 + DataTable rowk = _getData.GetROWK(aYYMM, rapyn, bpeno, tran); + ROWKRecord rowkRecord = new ROWKRecord(); + + foreach (DataRow rowkRow in rowk.Rows) + { + rowkRecord.FillRecord(rowkRow); + extraWork.Add(rowkRecord); + } + } + + /// + /// 計算缺勤扣款 + /// + /// 計算起始日 + /// 計算結束日 + /// 專案年度編號 + /// 人員編號 + /// 差勤結算日 + /// 月薪 + /// 伙食津貼 + /// 計算公式 + /// 缺勤扣款計算物件 + /// 要加入的交易 + /// 缺勤備註 + protected void CalcAbsent(DateTime startDay, DateTime endDay, + string rapyn, string bpeno, int bpfed, int bpsrm, int bpp02, string formula, + DateTime rasdt, DateTime raedt, + ref Absent absent, DbTransaction tran, ref string SSC01) + { + var bp = bpeno == "01698"; + DataTable rpar = _getData.GetRPAR0X(aYYMM, rapyn, startDay, endDay, rasdt, raedt, bpeno, bpfed, tran); + absent.bpsrm = bpsrm; + absent.bpp02 = bpp02; + absent.Formula = formula; + StringBuilder sb1 = new StringBuilder(); + RPARRecord rparRecord = new RPARRecord(); + + foreach (DataRow rparRow in rpar.Rows) + { + rparRecord.FillRecord(rparRow); + int rpftr = absent.Add(rparRecord, startDay, endDay, true); + if (rparRecord.RPDOC.Length > 0) + sb1.Append(rparRecord.RPDOC + "/"); + + rparDao.回填缺勤扣款(rparRecord.RPREN, rpftr, tran); + } + SSC01 += sb1.Length > 0 ? sb1.ToString(0, sb1.Length - 1) : ""; + } + + /// + /// 計算差旅費 + /// + /// 專案年度編號 + /// 人員編號 + /// 差勤結算日 + /// 差旅費計算物件 + /// 要加入的交易 + /// 差旅費備註 + /// 差旅事由 + protected void CalcOutFee(DateTime startDay, DateTime endDay, string rapyn, string bpeno, int bpfed, + DateTime rasdt, DateTime raedt, + ref OtherFee otherFee, DbTransaction tran, ref string SSC05, ref string SSC07) + { + DataTable rpar3 = _getData.GetRPAR3X(aYYMM, rapyn, startDay, endDay, rasdt, raedt, bpeno, bpfed, tran); + List sb1 = new List(); + List sb2 = new List(); + RPARRecord rparRecord = new RPARRecord(); + + foreach (DataRow rparRow in rpar3.Rows) + { + rparRecord.FillRecord(rparRow); + otherFee.Add(rparRecord); + if (rparRecord.RPDOC.Length > 0) + sb1.Add(rparRecord.RPDOC); + if (rparRecord.RPRSN.Length > 0) + sb2.Add(rparRecord.RPRSN); + } + + SSC05 += String.Join("/", sb1.ToArray()); + SSC07 += String.Join("/", sb2.ToArray()); + } + + /// + /// 計算電話費、油料費 + /// + /// 專案年度編號 + /// 人員編號 + /// 差勤結算日 + /// 差旅費計算物件 + /// 要加入的交易 + /// 電話費備註 + /// 油料費備註 + protected void CalcPhoneAndFuelFee(DateTime startDay, DateTime endDay, string rapyn, string bpeno, int bpfed, + DateTime rasdt, DateTime raedt, + ref OtherFee otherFee, DbTransaction tran, ref string SSC03, ref string SSC04) + { + DataTable rpar2 = _getData.GetRPAR2X(aYYMM, rapyn, startDay, endDay, rasdt, raedt, bpeno, bpfed, tran); + StringBuilder sb1 = new StringBuilder(); + StringBuilder sb2 = new StringBuilder(); + RPARRecord rparRecord = new RPARRecord(); + + foreach (DataRow rparRow in rpar2.Rows) + { + rparRecord.FillRecord(rparRow); + otherFee.Add(rparRecord); + switch (rparRecord.RPTYP) + { + case RPAR_TYPE.T21_電話費: + if (rparRecord.RPDOC.Length > 0) + sb1.Append(rparRecord.RPDOC + "/"); + break; + case RPAR_TYPE.T22_油料費: + if (rparRecord.RPDOC.Length > 0) + sb2.Append(rparRecord.RPDOC + "/"); + break; + } + } + SSC03 += sb1.Length > 0 ? sb1.ToString(0, sb1.Length - 1) : ""; + SSC04 += sb2.Length > 0 ? sb2.ToString(0, sb2.Length - 1) : ""; + } + + /// + /// 計算勞健保費 + /// + /// 計算起始日 + /// 計算結束日 + /// 人員編號 + /// 本月月底日 + /// 要加入的交易 + /// 健保費 + /// 勞保費 + /// 勞退金 + /// 本月到職天數 + /// 公司別 + /// 本月勞保天數 + /// 派遣結束日 + protected void CalcLaborAndHealth(DateTime calcStartDay, DateTime calcEndDay, + string bpeno, int monthEndDay, DbTransaction tran, ref HealthInsuranceFee bhifFee, + ref LaborInsuranceFee blifFee, ref LaborRetireAnnuity blraFee, int thisMonthDays, + string company, ref int thisMonthLaborDays, DateTime rasnEndDate) + { + var bp = bpeno == "02181"; + DataTable rpir勞保 = _getData.GetRPIR(calcStartDay, calcEndDay, bpeno, tran, true); + + DateTime 本月月初 = new DateTime(calcStartDay.Year, calcStartDay.Month, 1); + DateTime 本月月底 = 本月月初.AddMonths(1).AddDays(-1); + + DataTable rpir健保 = _getData.GetRPIR(本月月初, 本月月底, bpeno, tran, false); + RPIRRecord rpirRecord = new RPIRRecord(); + + #region 1. 計算健保費 + if (rpir健保.Rows.Count > 0) + { + // 先以最後一筆來判斷 + rpirRecord.FillRecord(rpir健保.Rows[rpir健保.Rows.Count - 1]); + + // for debug + //WGuard1.WLogFile("D:\\TEMP\\CALC", WGuard1.WLogType.Day, + // bpeno + " 加保日 " + rpirRecord.RPSDT.ToString("yyyy-MM-dd") + " 退保日 " + rpirRecord.RPEDT.ToString("yyyy-MM-dd")); + + // 要計算健保的狀況 + // 1. 非當月退保 + // 2. 當月月底日退保 而且 當月只有一筆加退保資料 + // 3. 當月月底日結束此專案 或 當月月底日仍處於此專案 + bool BhifFlag = false; + BhifFlag = (company == "" || rpirRecord.RPCPY == company) + && rpirRecord.RPEDT.CompareTo(本月月底) >= 0 + && (rasnEndDate.Ticks == 0 || rasnEndDate.CompareTo(本月月底) >= 0); + + if (BhifFlag) + { + // 取最後一筆來計算 + rpirRecord.FillRecord(rpir健保.Rows[rpir健保.Rows.Count - 1]); + + bhifFee.Assign(bhif.GetFee(rpirRecord.RPAM2, + rpirRecord.RPFMY, + rpirRecord.RPFM1, + rpirRecord.RPFM2, + rpirRecord.RPDIH, + rpirRecord.RPHIS, + rpirRecord.RPPTP)); + } + } + #endregion + + #region 2. 計算勞保、勞退金、勞退自提、工資墊償 + foreach (DataRow rpirRow in rpir勞保.Rows) + { + rpirRecord.FillRecord(rpirRow); + DateTime startDay1 = rpirRecord.RPBDT < calcStartDay ? calcStartDay : rpirRecord.RPBDT; + DateTime endDay1 = (rpirRecord.RPXDT.Ticks == 0) || + (aYYMM.Year != rpirRecord.RPXDT.Year || aYYMM.Month != rpirRecord.RPXDT.Month) + ? calcEndDay : rpirRecord.RPXDT; + + // 勞保費 + blif.Add(rpirRecord.RPAMT, startDay1, endDay1, rpirRecord.GoOut, rpirRecord.RPDIS, + rpirRecord.RPLIS, rpirRecord.RPOLD, rpirRecord.RPOVR, rpirRecord.RPPTP, + rpirRecord.RPNAT, ref thisMonthLaborDays); + + // 勞退提撥 + blra.Add(rpirRecord.RPAM3, startDay1, endDay1, rpirRecord.RPSLA, rpirRecord.RPPTP, thisMonthDays, rpirRecord.RPNAT); + } + + // 二月、勞保多筆,整月,要補足 30 天 + if (aYYMM.Month == 2 && rpir勞保.Rows.Count > 1) + { + rpirRecord.FillRecord(rpir勞保.Rows[rpir勞保.Rows.Count - 1]); + if (thisMonthLaborDays == monthEndDay) + { + DateTime startDay1 = new DateTime(aYYMM.Year, aYYMM.Month, monthEndDay == 28 ? 27 : 29); + DateTime endDay1 = new DateTime(aYYMM.Year, aYYMM.Month, monthEndDay == 28 ? 28 : 29); + + bool goOut = rpirRecord.TRTYPE == 2; + + // 勞保費 + blif.Add(rpirRecord.RPAMT, startDay1, endDay1, goOut, rpirRecord.RPDIS, + rpirRecord.RPLIS, rpirRecord.RPOLD, rpirRecord.RPOVR, rpirRecord.RPPTP, + rpirRecord.RPNAT, ref thisMonthLaborDays); + + // 勞退提撥 + blra.Add(rpirRecord.RPAM3, startDay1, endDay1, rpirRecord.RPSLA, rpirRecord.RPPTP, thisMonthDays, rpirRecord.RPNAT); + } + } + + blifFee.Add(blif.GetFee()); + blraFee.Add(blra.GetFee()); + #endregion + } + + /// + /// 計算薪資調整加減項 + /// + /// 人員編號 + /// 要加入的交易 + /// 其他加項 + /// 其他減項 + /// 加減項備註 + protected void CalcOthers(string rspyn, string bpeno, DbTransaction tran, ref int SSP99, + ref int SSS99, ref string SSC06) + { + DataTable rsaj = new RsajDAC(_getData.Query).GetRSAJ(aYYMM, bpeno, rspyn, tran); + StringBuilder sb1 = new StringBuilder(); + foreach (DataRow rsajRow in rsaj.Rows) + { + int rsamt = Convert.ToInt32(rsajRow["RSAMT"]); + string rsdoc = rsajRow["RSDOC"].ToString().Trim(); + if (rsamt > 0) + SSP99 += rsamt; + else + SSS99 -= rsamt; + if (rsdoc.Length > 0) + sb1.Append(rsdoc + "/"); + } + SSC06 += sb1.Length > 0 ? sb1.ToString(0, sb1.Length - 1) : ""; + } + + // 重新計算 + protected void btnOk_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + // 檢查年月是否正確 + bool result = true; + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + + aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + if (!result) + return; + + BPAARecord bpaaRecord = new BPAARecord(); + RASNRecord rasnRecord = new RASNRecord(); + ExtraWork extraWork = new ExtraWork(); + Absent absent = new Absent(); + OtherFee otherFee = new OtherFee(); + bhif = new Bhif(aYYMM); + blif = new Blif(aYYMM); + blra = new Blra(aYYMM); + HealthInsuranceFee bhifFee = new HealthInsuranceFee(); + LaborInsuranceFee blifFee = new LaborInsuranceFee(); + LaborRetireAnnuity blraFee = new LaborRetireAnnuity(); + StringBuilder sb = new StringBuilder(); + rcrdDao = new RcrdDAC(); + rparDao = new RparDAC(); + + // 取得專案年度接單資料 + DataTable bpaa = _getData.GetBPAA_BPPYN(ddlRSPYN.SelectedValue); + if (bpaa.Rows.Count == 0) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "無此專案"; + return; + } + bpaaRecord.FillRecord(bpaa.Rows[0]); + + // 檢查月關帳日 + if (bpaaRecord.BPMSD > aYYMM) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "此專案此月份已關帳"; + return; + } + + // 取出福利金比率 + double fortuneRate = _getData.GetFeeRate("福利金", aYYMM, null); + + // 取出勞保各項保費比率 + blif.NormalFeeRate = _getData.GetFeeRate("勞保普通傷病", aYYMM, null); + blif.LostJobFeeRate = _getData.GetFeeRate("勞保就業保險", aYYMM, null); + if (bpaaRecord.BPCPY == "TY") + blif.InjuryFeeRate = _getData.GetFeeRate("勞保職業災害(新譽)", aYYMM, null); + else if (bpaaRecord.BPCPY == "JY") + blif.InjuryFeeRate = _getData.GetFeeRate("勞保職業災害(展譽)", aYYMM, null); + else + blif.InjuryFeeRate = _getData.GetFeeRate("勞保職業災害", aYYMM, null); + blif.SalaryReverseFundRate = _getData.GetFeeRate("勞保工資墊償", aYYMM, null); + + // 取出健保費比率 + bhif.HealthInsuranceFeeRate = _getData.GetFeeRate("健保", aYYMM, null); + bhif.HealthInsuranceAverageFamily = _getData.GetFeeRate("健保平均眷口數", aYYMM, null); + + // 準備資料存取物件 + conn.Open(); + DbTransaction tran = conn.BeginTransaction(); + cmdInsertSACD.Transaction = tran; + cmdDeleteSACD.Transaction = tran; + cmdDeleteAllSACD.Transaction = tran; + cmdSelectSACD.Transaction = tran; + cmdUpdateSACD.Transaction = tran; + + try + { + // 刪除月薪資匯總資料 + ssmsDao.Delete(tran, aYYMM, ddlRSPYN.SelectedValue); + + int monthEndDay = aYYMM.AddMonths(1).AddDays(-1).Day; // 月底日 + int bpfed = bpaaRecord.BPFED; // 差勤結算日 + + #region 專案計算 + if (ddlRSPYN.SelectedValue != "000000001") + { + // 取出此年月此專案派遣的人員 + DataTable rasn = _getData.GetRASN_YYMM_BPPYN(aYYMM, bpaaRecord.BPPYN, tran); + + #region 以派遣紀錄計算員工薪資及勞健保 + + string bpeno = ""; + int thisMonthDays = 0; + int thisMonthLaborDays = 0; + int monthSalary = 0; + int foodBonus = 0; + string SSC01 = ""; + string SSC02 = ""; + string SSC03 = ""; + string SSC04 = ""; + string SSC05 = ""; + string SSC06 = ""; + string SSC07 = ""; + int SSP99 = 0; + int SSS99 = 0; + DateTime calcStartDay = new DateTime(); // 本人本月計算起始日 (本人本月在職第一天) + DateTime calcEndDay = new DateTime(); // 本人本月計算結束日 (本人本月在職最後一天) + + for (int i = 0; i < rasn.Rows.Count; i++) + { + DataRow rasnRow = rasn.Rows[i]; + rasnRecord.FillRecord(rasnRow); + + blif.Clear(); + blra.Clear(); + + // 清除累加用變數 + // 下一筆資料與上一筆資料不同人,金額要清除 + // (一個人一個月之內多次派遣同一專案,金額要累加) + if (bpeno.CompareTo(rasnRecord.RANUM) != 0) + { + thisMonthDays = 0; + thisMonthLaborDays = 0; + monthSalary = 0; + foodBonus = 0; + SSC01 = ""; + SSC02 = ""; + SSC03 = ""; + SSC04 = ""; + SSC05 = ""; + SSC07 = ""; + //SSC06 = ""; + //SSP99 = 0; + //SSS99 = 0; + extraWork.Clear(); + absent.Clear(); + otherFee.Clear(); + bhifFee.Init(); + blifFee.Init(); + blraFee.Init(); + + bpeno = rasnRecord.RANUM; + } + // "其他加減項" 一律清除 (但同一個人同一個月派遣同一專案多次時,只能計算一次) + SSC06 = ""; + SSP99 = 0; + SSS99 = 0; + + calcStartDay = new DateTime(); + calcEndDay = new DateTime(); + + // 1. 計算薪資,伙食津貼 + CalcSalary(rasnRecord.RASDT, rasnRecord.RAEDT, rasnRecord.BPSRM, rasnRecord.BPP02, + monthEndDay, ref calcStartDay, ref calcEndDay, ref thisMonthDays, + ref monthSalary, ref foodBonus, bpaaRecord.BPSAL); + + // 2. 計算出勤紀錄與加班費 + CalcWork(calcStartDay, calcEndDay, rasnRecord.RAPYN, + rasnRecord.RANUM, bpfed, rasnRecord.BPSRM, rasnRecord.BPP02, + rasnRecord.BPBFT, rasnRecord.BPAFT, rasnRecord.BPHOL, rasnRecord.BPOVR, + bpaaRecord.BPOTT, rasnRecord.RASDT, rasnRecord.RAEDT, + tran, ref extraWork, ref SSC02); + + // 3. 計算缺勤扣款 + CalcAbsent(calcStartDay, calcEndDay, rasnRecord.RAPYN, + rasnRecord.RANUM, bpfed, rasnRecord.BPSRM, rasnRecord.BPP02, + rasnRecord.BPLVE, rasnRecord.RASDT, rasnRecord.RAEDT, + ref absent, tran, ref SSC01); + + // 4. 計算差旅費 + CalcOutFee(calcStartDay, calcEndDay, rasnRecord.RAPYN, rasnRecord.RANUM, bpfed, rasnRecord.RASDT, rasnRecord.RAEDT, ref otherFee, tran, + ref SSC05, ref SSC07); + + // 5. 計算電話費、油料費 + CalcPhoneAndFuelFee(calcStartDay, calcEndDay, rasnRecord.RAPYN, rasnRecord.RANUM, bpfed, rasnRecord.RASDT, rasnRecord.RAEDT, ref otherFee, + tran, ref SSC03, ref SSC04); + + // 6. 計算勞保、健保、勞退金、勞退自提、工資墊償 + CalcLaborAndHealth(calcStartDay, calcEndDay, rasnRecord.RANUM, + monthEndDay, tran, ref bhifFee, ref blifFee, ref blraFee, thisMonthDays, bpaaRecord.BPCPY, + ref thisMonthLaborDays, rasnRecord.RAEDT); + + // 7. 計算其他加減項 + CalcOthers(rasnRecord.RAPYN, rasnRecord.RANUM, tran, ref SSP99, ref SSS99, + ref SSC06); + + // 下一筆是同一個人, + if (i < rasn.Rows.Count - 1 && rasnRecord.RANUM.CompareTo(rasn.Rows[i + 1]["RANUM"]) == 0) + { + continue; + } + + // 寫入月薪資匯總 + #region 寫入月薪資匯總 + + SsmsRecord ssmsRec = new SsmsRecord(); + ssmsRec.SSYMM = aYYMM; // 薪資月份 + ssmsRec.SSENO = rasnRecord.RANUM; // 人員編號 + ssmsRec.SSNUM = rasnRecord.RACNM; // 客戶編號 + ssmsRec.SSPYN = rasnRecord.RAPYN; // 專案年度編號 + ssmsRec.SSJNO = rasnRecord.RAJNO; // 職稱 + ssmsRec.SSCNO = rasnRecord.RACNO; // 等級 + ssmsRec.SSBRH = rasnRecord.RABRH; // 站別 + ssmsRec.SSD01 = thisMonthDays; // 到職天數 + ssmsRec.SSD02 = blifFee.InWorkDays; // 勞保到職天數 + ssmsRec.SSSRD = rasnRecord.BPSRD; // 時薪 + ssmsRec.SSP00 = monthSalary; // 本薪 + ssmsRec.SSP01 = + (absent.AllPresent ? rasnRecord.BPP01 : 0); // 全勤獎金 + ssmsRec.SSP02 = foodBonus; // 伙食津貼 + ssmsRec.SSP03 = rasnRecord.BPP03; // 職務加給 + ssmsRec.SSP04 = rasnRecord.BPP04; // 派駐津貼 + ssmsRec.SSP05 = rasnRecord.BPP05; // 其他津貼 + ssmsRec.SSP06 = extraWork.RPTA1; // 前二加班 + ssmsRec.SSP07 = extraWork.RPTA2; // 後二加班 + ssmsRec.SSP08 = extraWork.RPTA3; // 假日加班 + ssmsRec.SSP09 = otherFee.ShortTrip; // 短差 + ssmsRec.SSP10 = otherFee.LongTrip; // 長差 + ssmsRec.SSP11 = otherFee.TelephoneFee; // 電話費 + ssmsRec.SSP12 = otherFee.FuelFee; // 油料費 + ssmsRec.SSP13 = extraWork.RPTA4; // 加班費2.67 + ssmsRec.SSP14 = extraWork.RPTA5; // 加班費2.00 + ssmsRec.SSP15 = 0; // 加項15 + ssmsRec.SSP99 = SSP99; // 其他加項 + ssmsRec.SSS01 = absent.SSS01; // 病假扣款 + ssmsRec.SSS02 = absent.SSS02; // 事假扣款 + ssmsRec.SSS03 = 0; // 所得稅 + ssmsRec.SSS04 = blifFee.TotalPersonalFee; // 勞保費 + ssmsRec.SSS05 = bhifFee.PersonalFee; // 健保費 + ssmsRec.SSS06 = blraFee.PersonalFee; // 勞退自提 + ssmsRec.SSS07 = + Convert.ToInt32(Math.Round(Convert.ToDouble(monthSalary + foodBonus) * fortuneRate, + MidpointRounding.AwayFromZero)); // 福利金 + ssmsRec.SSS08 = 0; // 健保補充保費 + ssmsRec.SSS09 = absent.SSS09; // 無薪假扣款 + ssmsRec.SSS10 = 0; // 減項10 + ssmsRec.SSS11 = 0; // 減項11 + ssmsRec.SSS12 = 0; // 減項12 + ssmsRec.SSS13 = 0; // 減項13 + ssmsRec.SSS14 = 0; // 減項14 + ssmsRec.SSS15 = 0; // 減項15 + ssmsRec.SSS99 = SSS99; // 其他減項 + ssmsRec.SSH01 = Convert.ToInt32(Math.Round(blifFee.NormalCompanyFee, MidpointRounding.AwayFromZero)); // 雇主勞保費 + ssmsRec.SSH02 = Convert.ToInt32(Math.Round(blifFee.InjuryCompanyFee, MidpointRounding.AwayFromZero)); // 職災保險 + ssmsRec.SSH03 = Convert.ToInt32(Math.Round(blifFee.LostJobCompanyFee, MidpointRounding.AwayFromZero)); // 就業保險 + ssmsRec.SSH04 = Convert.ToInt32(Math.Round(blifFee.SalaryReverseFund, MidpointRounding.AwayFromZero)); // 工資墊償 + ssmsRec.SSH05 = bhifFee.CompanyFee; // 雇主健保費 + ssmsRec.SSH06 = blraFee.CompanyFee; // 勞退提撥 + ssmsRec.SSH07 = 0; // 雇主07 + ssmsRec.SSH08 = 0; // 雇主08 + ssmsRec.SSH09 = 0; // 雇主09 + ssmsRec.SSH10 = 0; // 雇主10 + ssmsRec.SST01 = extraWork.RPTC1; // 加班1.34時數 + ssmsRec.SST02 = extraWork.RPTC2; // 加班1.67時數 + ssmsRec.SST03 = extraWork.RPTC3; // 加班1.00時數 + ssmsRec.SST04 = extraWork.RelaxationAllowance; // 累積補休時數 + ssmsRec.SST06 = absent.SST06; // 特休時數 + ssmsRec.SST05 = absent.SST05; // 補休時數 + ssmsRec.SST07 = absent.SST07; // 事假時數 + ssmsRec.SST08 = absent.SST08; // 病假時數 + ssmsRec.SST09 = absent.SST09; // 喪假時數 + ssmsRec.SST10 = absent.SST10; // 產假時數 + ssmsRec.SST11 = absent.SST11; // 婚假時數 + ssmsRec.SST12 = absent.SST12; // 陪產假時數 + ssmsRec.SST13 = absent.SST13; // 公假時數 + ssmsRec.SST14 = absent.SST14; // 工傷假時數 + ssmsRec.SST15 = absent.SST15; // 生理假時數 + ssmsRec.SST16 = absent.SST16; // 家庭照顧假時數 + ssmsRec.SST17 = absent.SST17; // 育嬰假時數 + ssmsRec.SST18 = otherFee.FuelKm; // 油料補助公里數 + ssmsRec.SST19 = absent.SST19; // 原民祭儀假時數 + ssmsRec.SST20 = absent.SST20; // 產檢假時數時數 + ssmsRec.SST21 = extraWork.RPTC4; // 加班2.67時數 + ssmsRec.SST22 = extraWork.RPTC5; // 加班2.00時數 + ssmsRec.SST23 = absent.SST23; // 無薪假時數 + ssmsRec.SST24 = 0; // 時數 24 + ssmsRec.SST25 = 0; // 時數 25 + ssmsRec.SSL01 = blifFee.InsuranceSalary; // 勞保投保等級 + ssmsRec.SSL02 = bhifFee.InsuranceSalary; // 健保投保等級 + ssmsRec.SSL03 = blraFee.AnnuitySalary; // 勞退提撥等級 + ssmsRec.SSL04 = blifFee.InjurySalary; // 職災投保等級 + ssmsRec.SSL05 = 0; // 等級05 + ssmsRec.SSC01 = SSC01; // 請假備註 + ssmsRec.SSC02 = SSC02; // 加班備註 + ssmsRec.SSC03 = SSC03; // 電話費備註 + ssmsRec.SSC04 = SSC04; // 油料費備註 + ssmsRec.SSC05 = SSC05; // 差勤備註 + ssmsRec.SSC06 = SSC06; // 薪資加減備註 + ssmsRec.SSC07 = SSC07; // 差旅事由 + ssmsRec.SSC08 = ""; // 休息日加班超過8小時時數備註 + ssmsRec.SSC09 = ""; // 備註09 + ssmsRec.SSC10 = ""; // 備註10 + + ssmsDao.InsertOne(tran, ssmsRec); + + #endregion + } + // 刪除從專案派遣中不存在的資料 + + #endregion + + #region 以專案計算科目匯總 + + // 準備參數 + cmdInsertSACD.Parameters["SAPYN"].Value = bpaaRecord.BPPYN; + cmdInsertSACD.Parameters["SAYMM"].Value = aYYMM; + cmdSelectSACD.Parameters["SAPYN"].Value = bpaaRecord.BPPYN; + cmdSelectSACD.Parameters["SAYMM"].Value = aYYMM; + cmdUpdateSACD.Parameters["SAPYN"].Value = bpaaRecord.BPPYN; + cmdUpdateSACD.Parameters["SAYMM"].Value = aYYMM; + cmdDeleteSACD.Parameters["SAPYN"].Value = bpaaRecord.BPPYN; + cmdDeleteSACD.Parameters["SAYMM"].Value = aYYMM; + + // 1. 計算各科目匯總 + DataTable ssms01 = _getData.GetSSMSSum01(aYYMM, bpaaRecord.BPPYN, tran); + + List bpsxx = new List(); + SortedDictionary bpsxxAmt = new SortedDictionary(); + + // 薪資科目 + if (bpaaRecord.BPS01 != "") + { + if (!bpsxx.Contains(bpaaRecord.BPS01)) + { + bpsxx.Add(bpaaRecord.BPS01); + bpsxxAmt[bpaaRecord.BPS01] = Convert.ToInt32(ssms01.Rows[0]["BPS01"]); + } + else + bpsxxAmt[bpaaRecord.BPS01] += Convert.ToInt32(ssms01.Rows[0]["BPS01"]); + } + + // 勞保雇主部份負擔科目 + if (bpaaRecord.BPS02 != "") + { + if (!bpsxx.Contains(bpaaRecord.BPS02)) + { + bpsxx.Add(bpaaRecord.BPS02); + bpsxxAmt[bpaaRecord.BPS02] = Convert.ToInt32(ssms01.Rows[0]["BPS02"]); + } + else + bpsxxAmt[bpaaRecord.BPS02] += Convert.ToInt32(ssms01.Rows[0]["BPS02"]); + } + + // 健保雇主部份負擔科目 + if (bpaaRecord.BPS03 != "") + { + if (!bpsxx.Contains(bpaaRecord.BPS03)) + { + bpsxx.Add(bpaaRecord.BPS03); + bpsxxAmt[bpaaRecord.BPS03] = Convert.ToInt32(ssms01.Rows[0]["BPS03"]); + } + else + bpsxxAmt[bpaaRecord.BPS03] += Convert.ToInt32(ssms01.Rows[0]["BPS03"]); + } + + // 工資墊償基金科目 + if (bpaaRecord.BPS04 != "") + { + if (!bpsxx.Contains(bpaaRecord.BPS04)) + { + bpsxx.Add(bpaaRecord.BPS04); + bpsxxAmt[bpaaRecord.BPS04] = Convert.ToInt32(ssms01.Rows[0]["BPS04"]); + } + else + bpsxxAmt[bpaaRecord.BPS04] += Convert.ToInt32(ssms01.Rows[0]["BPS04"]); + } + + // 勞退金提撥科目 + if (bpaaRecord.BPS05 != "") + { + if (!bpsxx.Contains(bpaaRecord.BPS05)) + { + bpsxx.Add(bpaaRecord.BPS05); + bpsxxAmt[bpaaRecord.BPS05] = Convert.ToInt32(ssms01.Rows[0]["BPS05"]); + } + else + bpsxxAmt[bpaaRecord.BPS05] += Convert.ToInt32(ssms01.Rows[0]["BPS05"]); + } + + // 外勤作業費科目 + if (bpaaRecord.BPS06 != "") + { + if (!bpsxx.Contains(bpaaRecord.BPS06)) + { + bpsxx.Add(bpaaRecord.BPS06); + bpsxxAmt[bpaaRecord.BPS06] = Convert.ToInt32(ssms01.Rows[0]["BPS06"]); + } + else + bpsxxAmt[bpaaRecord.BPS06] += Convert.ToInt32(ssms01.Rows[0]["BPS06"]); + } + + // 油料費科目 + if (bpaaRecord.BPS07 != "") + { + if (!bpsxx.Contains(bpaaRecord.BPS07)) + { + bpsxx.Add(bpaaRecord.BPS07); + bpsxxAmt[bpaaRecord.BPS07] = Convert.ToInt32(ssms01.Rows[0]["BPS07"]); + } + else + bpsxxAmt[bpaaRecord.BPS07] += Convert.ToInt32(ssms01.Rows[0]["BPS07"]); + } + + // 加班費科目 + if (bpaaRecord.BPS08 != "") + { + if (!bpsxx.Contains(bpaaRecord.BPS08)) + { + bpsxx.Add(bpaaRecord.BPS08); + bpsxxAmt[bpaaRecord.BPS08] = Convert.ToInt32(ssms01.Rows[0]["BPS08"]); + } + else + bpsxxAmt[bpaaRecord.BPS08] += Convert.ToInt32(ssms01.Rows[0]["BPS08"]); + } + + // 電話費科目 + if (bpaaRecord.BPS09 != "") + { + if (!bpsxx.Contains(bpaaRecord.BPS09)) + { + bpsxx.Add(bpaaRecord.BPS09); + bpsxxAmt[bpaaRecord.BPS09] = Convert.ToInt32(ssms01.Rows[0]["BPS09"]); + } + else + bpsxxAmt[bpaaRecord.BPS09] += Convert.ToInt32(ssms01.Rows[0]["BPS09"]); + } + + // 清除科目匯總,除了有科目對應的之外,其他科目都清除 + cmdDeleteAllSACD.CommandText = + @"DELETE FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM "; + cmdDeleteAllSACD.Parameters.Clear(); + cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("SAPYN", bpaaRecord.BPPYN)); + cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("SAYMM", aYYMM)); + + // 管理費用項下之科目都不清除 + if (bpaaRecord.BPS15 != "") + { + cmdDeleteAllSACD.CommandText += " AND (SUBSTRING(SAACC,1,4) <> @BPS15) "; + cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("BPS15", (bpaaRecord.BPS15.Length < 4 ? bpaaRecord.BPS15 : bpaaRecord.BPS15.Substring(0, 4)))); + } + + // 公費科目不清除 + if (bpaaRecord.BPS13 != "") + { + cmdDeleteAllSACD.CommandText += " AND (SAACC <> @BPS13) "; + cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("BPS13", bpaaRecord.BPS13)); + } + + // 上面計算出來的科目不清除 + for (int i = 0; i < bpsxx.Count; i++) + { + cmdDeleteAllSACD.CommandText += " AND (SAACC <> @SAACC_" + bpsxx[i] + ") "; + cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("SAACC_" + bpsxx[i], bpsxx[i])); + } + + cmdDeleteAllSACD.ExecuteNonQuery(); + + // 寫入科目匯總 + for (int i = 0; i < bpsxx.Count; i++) + { + // 先看該科目匯總是否存在 + cmdSelectSACD.Parameters["SAACC"].Value = bpsxx[i]; + object o = cmdSelectSACD.ExecuteScalar(); + + // 不存在就新增,抓預設備註填入備註 + if (o == null || Convert.ToInt32(o) == 0) + { + cmdInsertSACD.Parameters["SAACC"].Value = bpsxx[i]; + cmdInsertSACD.Parameters["SAAMT"].Value = bpsxxAmt[bpsxx[i]]; + cmdInsertSACD.Parameters["SADOC"].Value = _getData.GetBPAB_BPDOC(bpaaRecord.BPPYN, bpsxx[i], tran); + cmdInsertSACD.ExecuteNonQuery(); + } + // 存在就直接更新金額,這樣可以保留備註 + else + { + cmdUpdateSACD.Parameters["SAACC"].Value = bpsxx[i]; + cmdUpdateSACD.Parameters["SAAMT"].Value = bpsxxAmt[bpsxx[i]]; + cmdUpdateSACD.ExecuteNonQuery(); + } + } + + // 2. 計算各項憑證 + /* + DataTable rpfe = clac.GetRPFESum(aYYMM, bpaaRecord.BPPYN, tran); + foreach (DataRow rpfeRow in rpfe.Rows) + { + cmdSelectSACD.Parameters["SAACC"].Value = rpfeRow["RPACC"]; + object o = cmdSelectSACD.ExecuteScalar(); + if (o == null || Convert.ToInt32(o) == 0) + { + cmdInsertSACD.Parameters["SAACC"].Value = rpfeRow["RPACC"]; + cmdInsertSACD.Parameters["SAAMT"].Value = rpfeRow["RPAMT"]; + cmdInsertSACD.ExecuteNonQuery(); + } + else + { + cmdUpdateSACD.Parameters["SAACC"].Value = rpfeRow["RPACC"]; + cmdUpdateSACD.Parameters["SAAMT"].Value = rpfeRow["RPAMT"]; + cmdUpdateSACD.ExecuteNonQuery(); + } + } + */ + + // 寫入營業稅 + WriteTax(aYYMM, bpaaRecord.BPPYN, tran); + + #endregion + } + #endregion + + #region 非專案計算 + else + { + double bpbft; + double bpaft; + double bphol; + string bpovr; + string bplve; + DateTime rasdt = new DateTime(1900, 1, 1); + DateTime raedt = new DateTime(2999, 12, 31); + + // 取得加班費比例與計算方式 + BpslDAC bpslDAO = new BpslDAC(Query); + _getData.GetRASN_Overwork_Rate(ddlRSPYN.SelectedValue, out bpbft, out bpaft, out bphol, out bpovr, out bplve); + + // 取得年月曾經在職的人員 + DataTable bpsnInMonth = _getData.GetBPSNInMonth(aYYMM, tran); + + foreach (DataRow bpsnRow in bpsnInMonth.Rows) + { + string bpeno = bpsnRow["BPENO"].ToString(); + DateTime bpedy = bpsnRow["BPEDY"] != DBNull.Value ? Convert.ToDateTime(bpsnRow["BPEDY"]) : new DateTime(0); + + // 取得年月人員未派遣出去的資料,以及薪資異動資料 + DataTable bpsnNoCase = _getData.GetBPSNNoCase(aYYMM, bpeno, tran); + BPSNNoCaseRecord bpsnNoCaseRec = new BPSNNoCaseRecord(); + + // 變數初值 + int thisMonthDays = 0; + int thisMonthLaborDays = 0; + int monthSalary = 0; + int foodBonus = 0; + string SSC01 = ""; + string SSC02 = ""; + string SSC03 = ""; + string SSC04 = ""; + string SSC05 = ""; + string SSC06 = ""; + string SSC07 = ""; + int SSP99 = 0; + int SSS99 = 0; + int bpsrd = 0; + int bpsrd1 = 0; + int bpsrm1 = 0; + int bpp021 = 0; + DateTime calcStartDay = new DateTime(); // 本人本月計算起始日 (本人本月在職第一天) + DateTime calcEndDay = new DateTime(); // 本人本月計算結束日 (本人本月在職最後一天) + extraWork.Clear(); + absent.Clear(); + absent.Formula = GetData.defaultBPLVE; + otherFee.Clear(); + blif.Clear(); + blra.Clear(); + bhifFee.Init(); + blifFee.Init(); + blraFee.Init(); + + // 1. 計算薪資,伙食津貼 + if (bpsnNoCase.Rows.Count > 0) + { + foreach (DataRow noCaseRow in bpsnNoCase.Rows) + { + bpsnNoCaseRec.FillRecord(noCaseRow); + + CalcSalary(bpsnNoCaseRec.STA_DATE, bpsnNoCaseRec.END_DATE, bpsnNoCaseRec.BPSRM, bpsnNoCaseRec.BPP02, + monthEndDay, ref calcStartDay, ref calcEndDay, ref thisMonthDays, ref monthSalary, ref foodBonus, + bpaaRecord.BPSAL); + } + + // 取得最後一筆時薪資料 + bpsrd = bpsnNoCaseRec.BPSRD; + } + else + { + calcStartDay = bpsnRow["BPSDY"] != DBNull.Value ? Convert.ToDateTime(bpsnRow["BPSDY"]) : aYYMM; + calcEndDay = bpsnRow["BPEDY"] != DBNull.Value ? Convert.ToDateTime(bpsnRow["BPEDY"]) : aYYMM.AddMonths(1).AddDays(-1); + } + + // 2. 計算加班費 + // 2.1. 單筆輸入的加班費 + DataTable rpar1 = _getData.GetRPAR1X(aYYMM, ddlRSPYN.SelectedValue, calcStartDay, calcEndDay, rasdt, raedt, bpeno, bpfed, tran); + sb.Length = 0; + RPARRecord rparRecord = new RPARRecord(); + + foreach (DataRow rparRow in rpar1.Rows) + { + rparRecord.FillRecord(rparRow); + + // 以員工編號及日期取得月薪資料、伙食津貼資料 + DataTable bpslData = bpslDAO.SelectBPSLDateRange(bpeno, rparRecord.RPRDT, rparRecord.RPRDT, tran); + if (bpslData.Rows.Count > 0) + { + bpsrm1 = Convert.ToInt32(bpslData.Rows[0]["BPSRM"]); + bpp021 = Convert.ToInt32(bpslData.Rows[0]["BPP02"]); + } + + ExtraWorkData extraData = extraWork.Add(rparRecord.RPTYP, rparRecord.RPRDT, rparRecord.RPTCT, bpsrm1, bpp021, + bpbft, bpaft, bphol, bpovr, bpaaRecord.BPOTT, rparRecord.RPTC1, rparRecord.RPTC2, + rparRecord.RPTC3, rparRecord.RPTC4, rparRecord.RPTC5); + if (rparRecord.RPDOC.Length > 0) + sb.Append(rparRecord.RPDOC + "/"); + + rparDao.回填加班費(rparRecord.RPREN, + WDAC.GetInt32Value(extraData.RPTA1), + WDAC.GetInt32Value(extraData.RPTA2), + WDAC.GetInt32Value(extraData.RPTA3), + WDAC.GetInt32Value(extraData.RPTA4), + WDAC.GetInt32Value(extraData.RPTA5), + tran); + } + SSC02 += sb.Length > 0 ? sb.ToString(0, sb.Length - 1) : ""; + + // 2.2. 加班匯總輸入的加班費 + DataTable rowk = _getData.GetROWK(aYYMM, ddlRSPYN.SelectedValue, bpeno, tran); + ROWKRecord rowkRecord = new ROWKRecord(); + + foreach (DataRow rowkRow in rowk.Rows) + { + rowkRecord.FillRecord(rowkRow); + extraWork.Add(rowkRecord); + } + + // 3. 計算缺勤扣款 + DataTable rpar = _getData.GetRPAR0X(aYYMM, ddlRSPYN.SelectedValue, calcStartDay, calcEndDay, rasdt, raedt, bpeno, bpfed, tran); + sb.Length = 0; + + foreach (DataRow rparRow in rpar.Rows) + { + rparRecord.FillRecord(rparRow); + + // 以員工編號及日期取得月薪資料、伙食津貼資料 + DataTable bpslData = bpslDAO.SelectBPSLDateRange(bpeno, rparRecord.RPRDT, rparRecord.RPRDT, tran); + if (bpslData.Rows.Count > 0) + { + bpsrm1 = Convert.ToInt32(bpslData.Rows[0]["BPSRM"]); + bpp021 = Convert.ToInt32(bpslData.Rows[0]["BPP02"]); + } + + absent.bpsrm = bpsrm1; + absent.bpp02 = bpp021; + absent.Formula = bplve; + int rpftr = absent.Add(rparRecord, calcStartDay, calcEndDay, true); + if (rparRecord.RPDOC.Length > 0) + sb.Append(rparRecord.RPDOC + "/"); + + rparDao.回填缺勤扣款(rparRecord.RPREN, rpftr, tran); + } + SSC01 += sb.Length > 0 ? sb.ToString(0, sb.Length - 1) : ""; + + // 4. 計算差旅費 + CalcOutFee(calcStartDay, calcEndDay, ddlRSPYN.SelectedValue, bpeno, bpfed, rasdt, raedt, ref otherFee, tran, ref SSC05, ref SSC07); + + // 5. 計算電話費、油料費 + CalcPhoneAndFuelFee(calcStartDay, calcEndDay, ddlRSPYN.SelectedValue, bpeno, bpfed, rasdt, raedt, ref otherFee, tran, + ref SSC03, ref SSC04); + + // 6. 計算勞保、健保、勞退金、勞退自提、工資墊償 + if (bpsnNoCase.Rows.Count > 0) + CalcLaborAndHealth(calcStartDay, calcEndDay, bpeno, monthEndDay, + tran, ref bhifFee, ref blifFee, ref blraFee, thisMonthDays, "", + ref thisMonthLaborDays, bpedy); + + // 7. 計算其他加減項 + CalcOthers(ddlRSPYN.SelectedValue, bpeno, tran, ref SSP99, ref SSS99, ref SSC06); + + // 若各項金額皆無資料,不寫檔 + if (bpsnNoCase.Rows.Count == 0 && + rpar1.Rows.Count == 0 && + rpar.Rows.Count == 0 && + otherFee.FuelKm == 0 && + otherFee.LongTrip == 0 && + otherFee.ShortTrip == 0 && + otherFee.TelephoneFee == 0 && + SSP99 == 0 && + SSS99 == 0) + continue; + + // 寫入薪資匯總檔 + #region 寫入月薪資匯總 + + SsmsRecord ssmsRec = new SsmsRecord(); + + ssmsRec.SSYMM = aYYMM; // 薪資月份 + ssmsRec.SSENO = bpeno; // 人員編號 + ssmsRec.SSNUM = ""; // 客戶編號 + ssmsRec.SSPYN = "000000001"; // 專案年度編號 + ssmsRec.SSJNO = ""; // 職稱 + ssmsRec.SSCNO = ""; // 等級 + ssmsRec.SSBRH = ""; // 站別 + ssmsRec.SSD01 = thisMonthDays; // 到職天數 + ssmsRec.SSD02 = blifFee.InWorkDays; // 勞保到職天數 + ssmsRec.SSSRD = bpsrd != 0 ? bpsrd : bpsrd1; // 時薪 + ssmsRec.SSP00 = monthSalary; // 本薪 + ssmsRec.SSP01 = + (absent.AllPresent ? rasnRecord.BPP01 : 0); // 全勤獎金 + ssmsRec.SSP02 = foodBonus; // 伙食津貼 + ssmsRec.SSP03 = bpsnNoCaseRec.BPP03; // 職務加給 + ssmsRec.SSP04 = bpsnNoCaseRec.BPP04; // 派駐津貼 + ssmsRec.SSP05 = bpsnNoCaseRec.BPP05; // 其他津貼 + ssmsRec.SSP06 = extraWork.RPTA1; // 1.34加班費 + ssmsRec.SSP07 = extraWork.RPTA2; // 1.67加班費 + ssmsRec.SSP08 = extraWork.RPTA3; // 1.00加班費 + ssmsRec.SSP09 = otherFee.ShortTrip; // 短差 + ssmsRec.SSP10 = otherFee.LongTrip; // 長差 + ssmsRec.SSP11 = otherFee.TelephoneFee; // 電話費 + ssmsRec.SSP12 = otherFee.FuelFee; // 油料費 + ssmsRec.SSP13 = extraWork.RPTA4; // 2.67加班費 + ssmsRec.SSP14 = extraWork.RPTA5; // 2.00加班費 + ssmsRec.SSP15 = 0; // 加項15 + ssmsRec.SSP99 = SSP99; // 其他加項 + ssmsRec.SSS01 = absent.SSS01; // 病假扣款 + ssmsRec.SSS02 = absent.SSS02; // 事假扣款 + ssmsRec.SSS03 = 0; // 所得稅 + ssmsRec.SSS04 = blifFee.TotalPersonalFee; // 勞保費 + ssmsRec.SSS05 = bhifFee.PersonalFee; // 健保費 + ssmsRec.SSS06 = blraFee.PersonalFee; // 勞退自提 + if (bpsnNoCase.Rows.Count > 0) + { + ssmsRec.SSS07 = + Convert.ToInt32(Math.Round(Convert.ToDouble(monthSalary + foodBonus) * fortuneRate, + MidpointRounding.AwayFromZero)); // 福利金 + } + else + { + ssmsRec.SSS07 = 0; + } + ssmsRec.SSS08 = 0; // 健保補充保費 + ssmsRec.SSS09 = absent.SSS09; // 無薪假扣款 + ssmsRec.SSS10 = 0; // 減項10 + ssmsRec.SSS11 = 0; // 減項11 + ssmsRec.SSS12 = 0; // 減項12 + ssmsRec.SSS13 = 0; // 減項13 + ssmsRec.SSS14 = 0; // 減項14 + ssmsRec.SSS15 = 0; // 減項15 + ssmsRec.SSS99 = SSS99; // 其他減項 + ssmsRec.SSH01 = Convert.ToInt32(Math.Round(blifFee.NormalCompanyFee, MidpointRounding.AwayFromZero)); // 雇主勞保費 + ssmsRec.SSH02 = Convert.ToInt32(Math.Round(blifFee.InjuryCompanyFee, MidpointRounding.AwayFromZero)); // 職災保險 + ssmsRec.SSH03 = Convert.ToInt32(Math.Round(blifFee.LostJobCompanyFee, MidpointRounding.AwayFromZero)); // 就業保險 + ssmsRec.SSH04 = Convert.ToInt32(Math.Round(blifFee.SalaryReverseFund, MidpointRounding.AwayFromZero)); // 工資墊償 + ssmsRec.SSH05 = bhifFee.CompanyFee; // 雇主健保費 + ssmsRec.SSH06 = blraFee.CompanyFee; // 勞退提撥 + ssmsRec.SSH07 = 0; // 雇主07 + ssmsRec.SSH08 = 0; // 雇主08 + ssmsRec.SSH09 = 0; // 雇主09 + ssmsRec.SSH10 = 0; // 雇主10 + ssmsRec.SST01 = extraWork.RPTC1; // 1.34加班時數 + ssmsRec.SST02 = extraWork.RPTC2; // 1.67加班時數 + ssmsRec.SST03 = extraWork.RPTC3; // 1.00加班時數 + ssmsRec.SST04 = extraWork.RelaxationAllowance; // 累積補休時數 + ssmsRec.SST05 = absent.SST05; // 補休時數 + ssmsRec.SST06 = absent.SST06; // 特休時數 + ssmsRec.SST07 = absent.SST07; // 事假時數 + ssmsRec.SST08 = absent.SST08; // 病假時數 + ssmsRec.SST09 = absent.SST09; // 喪假時數 + ssmsRec.SST10 = absent.SST10; // 產假時數 + ssmsRec.SST11 = absent.SST11; // 婚假時數 + ssmsRec.SST12 = absent.SST12; // 陪產假時數 + ssmsRec.SST13 = absent.SST13; // 公假時數 + ssmsRec.SST14 = absent.SST14; // 公傷假時數 + ssmsRec.SST15 = absent.SST15; // 生理假時數 + ssmsRec.SST16 = absent.SST16; // 家庭照顧假時數 + ssmsRec.SST17 = absent.SST17; // 育嬰假時數 + ssmsRec.SST18 = otherFee.FuelKm; // 油料費補助公里數 + ssmsRec.SST19 = absent.SST19; // 原民祭儀假時數 + ssmsRec.SST20 = absent.SST20; // 產檢假時數 + ssmsRec.SST21 = extraWork.RPTC4; // 2.67加班時數 + ssmsRec.SST22 = extraWork.RPTC5; // 2.00加班時數 + ssmsRec.SST23 = absent.SST23; // 無薪假時數 + ssmsRec.SST24 = 0; // 時數 24 + ssmsRec.SST25 = 0; // 時數 25 + ssmsRec.SSL01 = blifFee.InsuranceSalary; // 勞保投保等級 + ssmsRec.SSL02 = bhifFee.InsuranceSalary; // 健保投保等級 + ssmsRec.SSL03 = blraFee.AnnuitySalary; // 勞退提撥等級 + ssmsRec.SSL04 = blifFee.InjurySalary; // 職災投保等級 + ssmsRec.SSL05 = 0; // 等級05 + ssmsRec.SSC01 = SSC01; // 請假備註 + ssmsRec.SSC02 = SSC02; // 加班備註 + ssmsRec.SSC03 = SSC03; // 電話費備註 + ssmsRec.SSC04 = SSC04; // 油料費備註 + ssmsRec.SSC05 = SSC05; // 差勤備註 + ssmsRec.SSC06 = SSC06; // 薪資加減備註 + ssmsRec.SSC07 = SSC07; // 差旅事由 + ssmsRec.SSC08 = ""; // 備註08 + ssmsRec.SSC09 = ""; // 備註09 + ssmsRec.SSC10 = ""; // 備註10 + + ssmsDao.InsertOne(tran, ssmsRec); + + #endregion + } + } + #endregion + + tran.Commit(); + ClientShowMessage("計算完成!"); + } + catch + { + tran.Rollback(); + throw; + } + finally + { + conn.Close(); + } + } + + /// + /// 取得月科目匯總金額 by 科目編號 + /// + protected int GetSACD(string saacc) + { + DateTime aYYMM; + if (CheckDate(_BPYMM + "01", out aYYMM)) + return GetSACD(aYYMM, _BPPYN, saacc); + else + return 0; + } + + /// + /// 取得月科目匯總金額 by 年月、專案、科目編號 + /// + protected int GetSACD(DateTime yymm, string sapyn, string saacc) + { + DbCommand cmd = Query.NewCommand( + @"SELECT SAAMT FROM SACD WHERE SAYMM = @SAYMM AND SAPYN = @SAPYN AND SAACC=@SAACC"); + cmd.Parameters.Add(Query.NewParameter("SAYMM", yymm)); + cmd.Parameters.Add(Query.NewParameter("SAPYN", sapyn)); + cmd.Parameters.Add(Query.NewParameter("SAACC", saacc)); + object o = Query.ExecuteScalar(cmd); + if (o == null || o == DBNull.Value) + return 0; + else + return Convert.ToInt32(o); + } + + /// + /// 設定月科目匯總金額,總表科目輸入使用 + /// + protected void SetSACD(string saacc, int saamt, DbTransaction tran) + { + DateTime aYYMM; + if (CheckDate(_BPYMM + "01", out aYYMM)) + SetSACD(aYYMM, _BPPYN, saacc, saamt, tran); + } + + /// + /// 設定月科目匯總金額,總表科目輸入使用 + /// + protected void SetSACD(DateTime yymm, string sapyn, string saacc, int saamt, DbTransaction tran) + { + DbCommand cmdSel = Query.NewCommand( + @"SELECT COUNT(1) FROM SACD WHERE SAYMM = @SAYMM AND SAPYN = @SAPYN AND SAACC=@SAACC"); + cmdSel.Parameters.Add(Query.NewParameter("SAYMM", yymm)); + cmdSel.Parameters.Add(Query.NewParameter("SAPYN", sapyn)); + cmdSel.Parameters.Add(Query.NewParameter("SAACC", saacc)); + cmdSel.Connection = tran.Connection; + cmdSel.Transaction = tran; + object o = cmdSel.ExecuteScalar(); + if (o == null || o == DBNull.Value || Convert.ToInt32(o) == 0) + { + DbCommand cmdIns = Query.NewCommand( + @"INSERT INTO SACD + (SAPYN, SAYMM, SAACC, SAAMT, TRDAT, TRMOD, TRUSR) + VALUES + (@SAPYN, @SAYMM, @SAACC, @SAAMT, GETDATE(), 'INSERT', @TRUSR)"); + cmdIns.Parameters.Add(Query.NewParameter("SAPYN", sapyn)); + cmdIns.Parameters.Add(Query.NewParameter("SAYMM", yymm)); + cmdIns.Parameters.Add(Query.NewParameter("SAACC", saacc)); + cmdIns.Parameters.Add(Query.NewParameter("SAAMT", saamt)); + cmdIns.Parameters.Add(Query.NewParameter("TRUSR", UserId)); + cmdIns.Connection = tran.Connection; + cmdIns.Transaction = tran; + cmdIns.ExecuteNonQuery(); + } + else + { + DbCommand cmdUpd = Query.NewCommand( + @"UPDATE SACD + SET SAAMT=@SAAMT, + TRDAT=GETDATE(), + TRMOD='UPDATE', + TRUSR=@TRUSR + WHERE SAYMM = @SAYMM + AND SAPYN = @SAPYN + AND SAACC = @SAACC"); + cmdUpd.Parameters.Add(Query.NewParameter("SAAMT", saamt)); + cmdUpd.Parameters.Add(Query.NewParameter("TRUSR", UserId)); + cmdUpd.Parameters.Add(Query.NewParameter("SAYMM", yymm)); + cmdUpd.Parameters.Add(Query.NewParameter("SAPYN", sapyn)); + cmdUpd.Parameters.Add(Query.NewParameter("SAACC", saacc)); + cmdUpd.Connection = tran.Connection; + cmdUpd.Transaction = tran; + cmdUpd.ExecuteNonQuery(); + } + } + + protected void btnSSMS_Click(object sender, EventArgs e) + { + bool result = true; + aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + if (!result) + return; + + MultiView1.ActiveViewIndex = 1; + lbYYMM.Text = txtYYMM.Text; + //ddlRSPYN.SQL = "SELECT BPPYN, '【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,4,1)) + '】' + BPPYM BPPYM FROM BPAA WHERE BPYER=" + (aYYMM.Year - WGuard1.CY11).ToString() + " ORDER BY BPPYN"; + ddlRSPYN.DataSource = new BpaaDAC().GetBpaaWithTY(aYYMM.Year); + ddlRSPYN.DataBind(); + } + + protected void cvBPS10_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i >= 0; + } + + protected void btnCancel1_Click(object sender, EventArgs e) + { + pnBPSXX.Visible = false; + } + + protected void Next_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + + _BPPYN = ddlRSPYN.SelectedValue; + bool result = true; + aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + + if (!result) + return; + + DataTable bpaa = _getData.GetBPAA_BPPYN(_BPPYN); + if (bpaa.Rows.Count == 0) + return; + BPAARecord bpaaRecord = new BPAARecord(); + bpaaRecord.FillRecord(bpaa.Rows[0]); + + if (bpaaRecord.BPS15 == "") + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage += "請先設定「管理費用」之科目對應
"; + } + + if (bpaaRecord.BPS13 == "") + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage += "請先設定「公費」之科目對應
"; + } + + if (!cvMessage.IsValid) + return; + + StringBuilder sb = new StringBuilder(); + sb.Append( + @"SELECT BPACC, BPCLS, BPAME, + ISNULL(SAAMT, 0) AMT + FROM BPAB A LEFT OUTER JOIN SACD B ON SAPYN=BPPYN AND SAACC=BPACC AND SAYMM=@SAYMM + WHERE BPPYN=@BPPYN AND SUBSTRING(BPACC,1,4)=@BPS15 AND SUBSTRING(BPACC, 5, 2)<>'00' "); + dsSubject.SelectParameters.Clear(); + dsSubject.SelectParameters.Add("SAYMM", aYYMM.ToString(System.Globalization.CultureInfo.InvariantCulture)); + dsSubject.SelectParameters.Add("BPPYN", _BPPYN); + dsSubject.SelectParameters.Add("BPS15", (bpaaRecord.BPS15.Length < 4 ? bpaaRecord.BPS15 : bpaaRecord.BPS15.Substring(0, 4))); + if (bpaaRecord.BPS13 != "") + { + sb.Append( + @" UNION SELECT BPACC, BPCLS, BPAME, + ISNULL(SAAMT, 0) AMT + FROM BPAB A LEFT OUTER JOIN SACD B ON SAPYN=BPPYN AND SAACC=BPACC AND SAYMM=@SAYMM + WHERE BPPYN=@BPPYN AND BPACC=@BPS13"); + dsSubject.SelectParameters.Add("BPS13", bpaaRecord.BPS13); + } + + sb.Append(" ORDER BY BPCLS "); + dsSubject.ConnectionString = ConnectionString; + dsSubject.SelectCommand = sb.ToString(); + + DataList1.DataSourceID = "dsSubject"; + DataList1.DataBind(); + + if (DataList1.Items.Count > 0) + SetClientFocus(DataList1.Items[0].Controls[3]); + + pnBPSXX.Visible = true; + pnSACD.Visible = false; + pnAccDoc.Visible = false; + } + + protected void btnAccDoc_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + + bool result = true; + aYYMM = CheckDate(lbYYMM.Text + "01", "", ref result, cvMessage); + + dsSACDDoc.ConnectionString = ConnectionString; + dsSACDDoc.SelectParameters["SAPYN"].DefaultValue = ddlRSPYN.SelectedValue; + dsSACDDoc.SelectParameters["SAYMM"].DefaultValue = aYYMM.ToString(System.Globalization.CultureInfo.InvariantCulture); + dlSACDDoc.DataBind(); + + pnBPSXX.Visible = false; + pnSACD.Visible = false; + pnAccDoc.Visible = true; + } + + protected void btnSACD_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + + bool result = true; + aYYMM = CheckDate(lbYYMM.Text + "01", "", ref result, cvMessage); + + dsSACD.ConnectionString = ConnectionString; + dsSACD.SelectParameters["BPPYN"].DefaultValue = ddlRSPYN.SelectedValue; + dsSACD.SelectParameters["SAYMM"].DefaultValue = aYYMM.ToString(System.Globalization.CultureInfo.InvariantCulture); + GridView1.DataBind(); + + DbCommand sumSacd = Query.NewCommand("SELECT SUM(SAAMT) FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM"); + sumSacd.Parameters.Add(Query.NewParameter("SAPYN", ddlRSPYN.SelectedValue)); + sumSacd.Parameters.Add(Query.NewParameter("SAYMM", aYYMM)); + object o = Query.ExecuteScalar(sumSacd); + int i; + if (o != null && o != DBNull.Value) + i = Convert.ToInt32(o); + else + i = 0; + + lbSumSacd.Text = i.ToString("###,###,###,##0"); + + pnBPSXX.Visible = false; + pnSACD.Visible = true; + pnAccDoc.Visible = false; + } + + protected void WriteTax(DateTime yymm, string bppyn, DbTransaction tran) + { + DataTable bpaa = _getData.GetBPAA_BPPYN(bppyn); + if (bpaa.Rows.Count == 0) + return; + // 營業稅科目 + string bps14 = bpaa.Rows[0]["BPS14"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS14"].ToString(); + // 勞保雇主部份負擔科目 + string bps02 = bpaa.Rows[0]["BPS02"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS02"].ToString(); + // 健保雇主部份負擔科目 + string bps03 = bpaa.Rows[0]["BPS03"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS03"].ToString(); + // 工資墊償基金科目 + string bps04 = bpaa.Rows[0]["BPS04"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS04"].ToString(); + // 勞退金提撥科目 + string bps05 = bpaa.Rows[0]["BPS05"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS05"].ToString(); + // 行政督導保險及退休提撥科目 + string bps11 = bpaa.Rows[0]["BPS11"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS11"].ToString(); + + if (bps14 == "") + return; + + // 取得營業稅、勞健保之外的科目總和 + DbCommand sumSacd = Query.NewCommand( + @"SELECT SUM(SAAMT) FROM SACD + WHERE SAPYN=@SAPYN + AND SAYMM=@SAYMM + AND SAACC<>@SAACC02 + AND SAACC<>@SAACC03 + AND SAACC<>@SAACC04 + AND SAACC<>@SAACC05 + AND SAACC<>@SAACC11 + AND SAACC<>@SAACC14"); + sumSacd.Parameters.Add(Query.NewParameter("SAPYN", bppyn)); + sumSacd.Parameters.Add(Query.NewParameter("SAYMM", aYYMM)); + sumSacd.Parameters.Add(Query.NewParameter("SAACC02", bps02)); + sumSacd.Parameters.Add(Query.NewParameter("SAACC03", bps03)); + sumSacd.Parameters.Add(Query.NewParameter("SAACC04", bps04)); + sumSacd.Parameters.Add(Query.NewParameter("SAACC05", bps05)); + sumSacd.Parameters.Add(Query.NewParameter("SAACC11", bps11)); + sumSacd.Parameters.Add(Query.NewParameter("SAACC14", bps14)); + + // 取得上個月勞健保的科目總和 + DbCommand sumSacd1 = Query.NewCommand( + @"SELECT SUM(SAAMT) FROM SACD + WHERE SAPYN=@SAPYN + AND SAYMM=@SAYMM + AND ( SAACC=@SAACC02 + OR SAACC=@SAACC03 + OR SAACC=@SAACC04 + OR SAACC=@SAACC05 + OR SAACC=@SAACC11 )"); + sumSacd1.Parameters.Add(Query.NewParameter("SAPYN", bppyn)); + sumSacd1.Parameters.Add(Query.NewParameter("SAYMM", aYYMM.AddMonths(-1))); + sumSacd1.Parameters.Add(Query.NewParameter("SAACC02", bps02)); + sumSacd1.Parameters.Add(Query.NewParameter("SAACC03", bps03)); + sumSacd1.Parameters.Add(Query.NewParameter("SAACC04", bps04)); + sumSacd1.Parameters.Add(Query.NewParameter("SAACC05", bps05)); + sumSacd1.Parameters.Add(Query.NewParameter("SAACC11", bps11)); + + DbCommand deleteTax = Query.NewCommand("DELETE SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM AND SAACC=@SAACC14"); + deleteTax.Parameters.Add(Query.NewParameter("SAPYN", bppyn)); + deleteTax.Parameters.Add(Query.NewParameter("SAYMM", yymm)); + deleteTax.Parameters.Add(Query.NewParameter("SAACC14", bps14)); + + DbCommand writeTax = Query.NewCommand( + @"INSERT SACD (SAPYN, SAYMM, SAACC, SAAMT, TRDAT, TRMOD, TRUSR) + VALUES (@SAPYN, @SAYMM, @SAACC14, @SAAMT, GETDATE(), 'INSERT', @TRUSR)"); + writeTax.Parameters.Add(Query.NewParameter("SAPYN", bppyn)); + writeTax.Parameters.Add(Query.NewParameter("SAYMM", yymm)); + writeTax.Parameters.Add(Query.NewParameter("SAACC14", bps14)); + writeTax.Parameters.Add(Query.NewParameter("SAAMT", DbType.Int32)); + writeTax.Parameters.Add(Query.NewParameter("@TRUSR", UserId)); + + // 取得本月營業稅、勞健保除外的科目總和 + sumSacd.Transaction = tran; + sumSacd.Connection = tran.Connection; + object o = sumSacd.ExecuteScalar(); + int iSumSacd; + if (o != null && o != DBNull.Value) + iSumSacd = Convert.ToInt32(o); + else + iSumSacd = 0; + + // 取得上月勞健保的科目總和 + sumSacd1.Transaction = tran; + sumSacd1.Connection = tran.Connection; + o = sumSacd1.ExecuteScalar(); + if (o != null && o != DBNull.Value) + iSumSacd += Convert.ToInt32(o); + else + iSumSacd += 0; + + // 寫入營業稅 + deleteTax.Transaction = tran; + deleteTax.Connection = tran.Connection; + deleteTax.ExecuteNonQuery(); + + writeTax.Transaction = tran; + writeTax.Connection = tran.Connection; + writeTax.Parameters["SAAMT"].Value = Convert.ToInt32(Math.Round(Convert.ToDouble(iSumSacd) * 0.05d, MidpointRounding.AwayFromZero)); + writeTax.ExecuteNonQuery(); + } + + // 儲存總表輸入項目,以及計算營業稅 + protected void DataList1_UpdateCommand(object source, DataListCommandEventArgs e) + { + bool result = true; + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + if (!result) + return; + + for (int i = 0; i < DataList1.Items.Count; i++) + { + int amt; + if (!Int32.TryParse((DataList1.Items[i].Controls[3] as TextBox).Text, out amt)) + { + cvMessage.ErrorMessage += (DataList1.Items[i].Controls[1] as ITextControl).Text + " 請輸入數值"; + cvMessage.IsValid = false; + } + if (amt < 0) + { + cvMessage.ErrorMessage += (DataList1.Items[i].Controls[1] as ITextControl).Text + " 請輸入大於零的數值"; + cvMessage.IsValid = false; + } + } + if (!cvMessage.IsValid) + return; + + _BPPYN = ddlRSPYN.SelectedValue; + + DbConnection conn = Query.NewConnection(); + conn.Open(); + DbTransaction tran = conn.BeginTransaction(); + try + { + // 寫入輸入的項目 + for (int i = 0; i < DataList1.Items.Count; i++) + { + string saacc = (DataList1.Items[i].Controls[5] as HiddenField).Value; + string saamt = (DataList1.Items[i].Controls[3] as TextBox).Text; + int amt; + Int32.TryParse(saamt, out amt); + SetSACD(aYYMM, _BPPYN, saacc, amt, tran); + } + // 寫入營業稅 + WriteTax(aYYMM, _BPPYN, tran); + + tran.Commit(); + RegisterStartupScript("OK", "alert('存檔完成!');"); + } + catch + { + tran.Rollback(); + throw; + } + finally + { + conn.Close(); + } + } + + protected void DataList1_CancelCommand(object source, DataListCommandEventArgs e) + { + pnBPSXX.Visible = false; + pnSACD.Visible = false; + pnAccDoc.Visible = false; + } + + // 輸入備註 + protected void dlSACDDoc_UpdateCommand(object source, DataListCommandEventArgs e) + { + bool result = true; + aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + if (!result) + return; + _BPPYN = ddlRSPYN.SelectedValue; + + DbCommand cmdUpdateSACDDoc = Query.NewCommand( + @"UPDATE SACD SET + SADOC = @SADOC + WHERE + SAPYN=@SAPYN AND SAYMM=@SAYMM AND SAACC=@SAACC"); + cmdUpdateSACDDoc.Parameters.Add(Query.NewParameter("SADOC", DbType.String)); + cmdUpdateSACDDoc.Parameters.Add(Query.NewParameter("SAPYN", _BPPYN)); + cmdUpdateSACDDoc.Parameters.Add(Query.NewParameter("SAYMM", aYYMM)); + cmdUpdateSACDDoc.Parameters.Add(Query.NewParameter("SAACC", DbType.String)); + + cmdSelectSACD.Parameters["SAPYN"].Value = _BPPYN; + cmdSelectSACD.Parameters["SAYMM"].Value = aYYMM; + + cmdInsertSACD.Parameters["SAPYN"].Value = _BPPYN; + cmdInsertSACD.Parameters["SAYMM"].Value = aYYMM; + cmdInsertSACD.Parameters["SAAMT"].Value = 0; + + DbConnection conn = Query.NewConnection(); + cmdUpdateSACDDoc.Connection = conn; + cmdSelectSACD.Connection = conn; + cmdInsertSACD.Connection = conn; + + conn.Open(); + DbTransaction tran = conn.BeginTransaction(); + cmdUpdateSACDDoc.Transaction = tran; + cmdSelectSACD.Transaction = tran; + cmdInsertSACD.Transaction = tran; + + try + { + // 寫入輸入的項目 + for (int i = 0; i < dlSACDDoc.Items.Count; i++) + { + string saacc = (dlSACDDoc.Items[i].Controls[1] as ITextControl).Text; + string sadoc = (dlSACDDoc.Items[i].Controls[7] as TextBox).Text; + + cmdSelectSACD.Parameters["SAACC"].Value = saacc; + object o = cmdSelectSACD.ExecuteScalar(); + if (o != null && o != DBNull.Value && Convert.ToInt32(o) > 0) + { + cmdUpdateSACDDoc.Parameters["SAACC"].Value = saacc; + cmdUpdateSACDDoc.Parameters["SADOC"].Value = sadoc; + cmdUpdateSACDDoc.ExecuteNonQuery(); + } + else + { + cmdInsertSACD.Parameters["SAACC"].Value = saacc; + cmdInsertSACD.Parameters["SADOC"].Value = sadoc; + cmdInsertSACD.ExecuteNonQuery(); + } + } + + tran.Commit(); + RegisterStartupScript("OK", "alert('存檔完成!');"); + } + catch + { + tran.Rollback(); + throw; + } + finally + { + conn.Close(); + } + } + + protected void btnInputYYMM_Click(object sender, EventArgs e) + { + ParamList["BPPYN"] = ""; + ParamList["BPPYM"] = ""; + pnBPSXX.Visible = false; + pnSACD.Visible = false; + DoAfterCommand("SALERYCALC"); + } + + // 本月關帳,關帳日寫入本月月底 + protected void btnCloseBPAA_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + + bool result = true; + aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + if (!result) + return; + + try + { + cmdCloseBPAA.Parameters["BPMSD"].Value = aYYMM.AddMonths(1).AddDays(-1); + cmdCloseBPAA.Parameters["BPPYN"].Value = ddlRSPYN.SelectedValue; + Query.ExecuteNonQuery(cmdCloseBPAA); + RegisterStartupScript("OK", "alert('本月關帳完成!');"); + } + catch (Exception ex) + { + cvMessage.ErrorMessage = ex.Message; + cvMessage.IsValid = false; + } + } + + // 本月開帳,開帳日寫入上月月底 + protected void btnOpenBPAA_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + + bool result = true; + aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + if (!result) + return; + + try + { + cmdCloseBPAA.Parameters["BPMSD"].Value = aYYMM.AddDays(-1); + cmdCloseBPAA.Parameters["BPPYN"].Value = ddlRSPYN.SelectedValue; + Query.ExecuteNonQuery(cmdCloseBPAA); + RegisterStartupScript("OK", "alert('本月開帳完成!');"); + } + catch (Exception ex) + { + cvMessage.ErrorMessage = ex.Message; + cvMessage.IsValid = false; + } + } +} \ No newline at end of file diff --git a/Web/forms/test/Test.ascx b/Web/forms/test/Test.ascx new file mode 100644 index 0000000..945e7df --- /dev/null +++ b/Web/forms/test/Test.ascx @@ -0,0 +1,9 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="Test.ascx.cs" Inherits="forms_test_Test" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> +<%--
+
+
+--%> + diff --git a/Web/forms/test/Test.ascx.cs b/Web/forms/test/Test.ascx.cs new file mode 100644 index 0000000..6f4349e --- /dev/null +++ b/Web/forms/test/Test.ascx.cs @@ -0,0 +1,195 @@ +using System; +using System.Data; +using System.Web.UI.WebControls; +using System.Data.Common; +using System.Text; +using System.Net.Mail; +using Wellan.Data; +using System.Linq; +using Newtonsoft.Json; +using System.Collections.Generic; +using NPOI.HSSF.Record.Chart; + +public partial class forms_test_Test : Wellan.Web.UI.WUserControlBase +{ + protected void Page_Load(object sender, EventArgs e) + { + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + } + + protected void btnTestHoliday_Click(object sender, EventArgs e) + { + //TestHolidayResult.Text = ""; + + //BhrdDAC bhrd = new BhrdDAC(); + //var r1 = bhrd.IsHoliday("00002", new DateTime(2023, 3, 1)); + //var r2 = bhrd.IsHoliday("00002", new DateTime(2023, 3, 2)); + //var r3 = bhrd.IsHoliday("00002", new DateTime(2023, 3, 3)); + //var r4 = bhrd.IsHoliday("00002", new DateTime(2023, 3, 4)); + + //TestHolidayResult.Text = string.Format("2023-03-01 ==> {0}
2023-03-02 ==> {1}
2023-03-03 ==> {2}
2023-03-04 ==> {3}", r1, r2, r3, r4); + } + + protected void btnGenRPIRImport_Click(object sender, EventArgs e) + { + //GenRPIRImportResult.Text = ""; + //var f = System.IO.File.ReadAllText("D:/TEMP2/員工眷屬加保資料.json"); + //var familyList = JsonConvert.DeserializeObject(f); + //GenRPIRImportResult.Text += string.Format("{0}
", familyList.Count()); + //foreach (var bpeno in familyList.Keys) + //{ + // var familys = familyList[bpeno]; + // foreach (var family in familys) + // { + // DateTime dt; + // if (!string.IsNullOrEmpty(family.BIRTHDAY)) + // { + // if (DateTime.TryParseExact(family.BIRTHDAY, "yyyy-MM-dd" + // , Wellan.Common.WGuard1.InvariantCulture + // , System.Globalization.DateTimeStyles.None + // , out dt)) + // { + // family.BIRTHDAY = dt.ToString("yyyyMMdd"); + // } + // else + // { + // family.BIRTHDAY = ""; + // } + // } + // else + // { + // family.BIRTHDAY = ""; + // } + + // if (!string.IsNullOrEmpty(family.START_DATE)) + // { + + // if (DateTime.TryParseExact(family.START_DATE, "yyyy-MM-dd" + // , Wellan.Common.WGuard1.InvariantCulture + // , System.Globalization.DateTimeStyles.None + // , out dt)) + // { + // family.START_DATE = dt.ToString("yyyyMMdd"); + // } + // else + // { + // family.START_DATE = ""; + // } + // } + // else + // { + // family.START_DATE = ""; + // } + + // if (!string.IsNullOrEmpty(family.END_DATE)) + // { + // if (DateTime.TryParseExact(family.END_DATE, "yyyy-MM-dd" + // , Wellan.Common.WGuard1.InvariantCulture + // , System.Globalization.DateTimeStyles.None + // , out dt)) + // { + // family.END_DATE = dt.ToString("yyyyMMdd"); + // } + // else + // { + // family.END_DATE = ""; + // } + // } + // else + // { + // family.END_DATE = ""; + // } + // } + + // var d0 = familys.Where(x => x.DEDUCT == "0").Count(); + // var d1 = familys.Where(x => x.DEDUCT == "25").Count(); + // var d2 = familys.Where(x => x.DEDUCT == "50").Count(); + // var d3 = familys.Where(x => x.DEDUCT == "100").Count(); + + // var maxRpren = Convert.ToString(Query.ExecuteScalar(string.Format("SELECT MAX(RPREN) FROM RPIR WHERE RPENO='{0}'", bpeno))); + // var maxRpitm = Convert.ToInt32(Query.ExecuteScalar(string.Format("SELECT ISNULL(MAX(RPITM), 0) FROM RPIB WHERE RPREN='{0}'", maxRpren))); + // // GenRPIRImportResult.Text += string.Format("{0} {1} {2}
", bpeno, maxRpren, maxRpitm); + + // if (maxRpitm == 0) + // { + // GenRPIRImportResult.Text += string.Format("UPDATE RPIR SET RPFMY={1}, RPFM1={2}, RPFM2={3}, RPFM3={4}, RPFMD='{5}' WHERE RPREN='{0}';
" + // , maxRpren, d0, d1, d2, d3, JsonConvert.SerializeObject(familys)); + // } + // else + // { + // GenRPIRImportResult.Text += string.Format("UPDATE RPIB SET RPFMY={2}, RPFM1={3}, RPFM2={4}, RPFM3={5}, RPFMD='{6}' WHERE RPREN='{0}' AND RPITM={1};
" + // , maxRpren, maxRpitm, d0, d1, d2, d3, JsonConvert.SerializeObject(familys)); + // } + //} + } + + protected void testGetRPIR_Click(object sender, EventArgs e) + { + GetData getData = new GetData(); + DateTime calcStartDay = new DateTime(2023, 9, 1); + DateTime calcEndDay = new DateTime(2023, 9, 15); + DateTime aYYMM = new DateTime(2023, 9, 1); + int thisMonthDays = 30; + int thisMonthLaborDays = 0; + Blif blif = new Blif(aYYMM); + Blra blra = new Blra(aYYMM); + + DbConnection conn = Query.NewConnection(); + RPIRRecord rpirRecord = new RPIRRecord(); + + conn.Open(); + DbTransaction tran = conn.BeginTransaction(); + getData.Query = Query; + DataTable rpir勞保 = getData.GetRPIR(calcStartDay, calcEndDay, "02184", tran, true); + + DateTime prevStartDay = new DateTime(); + DateTime prevEndDay = new DateTime(); + + foreach (DataRow rpirRow in rpir勞保.Rows) + { + rpirRecord.FillRecord(rpirRow); + DateTime startDay1 = rpirRecord.RPBDT < calcStartDay ? calcStartDay : rpirRecord.RPBDT; + DateTime endDay1 = (rpirRecord.RPXDT.Ticks == 0) || + (aYYMM.Year != rpirRecord.RPXDT.Year || aYYMM.Month != rpirRecord.RPXDT.Month) + ? calcEndDay : rpirRecord.RPXDT; + + // 勞保費 + blif.Add(rpirRecord.RPAMT, startDay1, endDay1, rpirRecord.GoOut, rpirRecord.RPDIS, + rpirRecord.RPLIS, rpirRecord.RPOLD, rpirRecord.RPOVR, rpirRecord.RPPTP, + rpirRecord.RPNAT, ref thisMonthLaborDays); + + // 勞退提撥 + blra.Add(rpirRecord.RPAMT, startDay1, endDay1, rpirRecord.RPSLA, rpirRecord.RPPTP, thisMonthDays, rpirRecord.RPNAT); + + prevStartDay = startDay1; + prevEndDay = endDay1; + } + + blif.GetFee(); + blra.GetFee(); + + tran.Rollback(); + conn.Close(); + } +} +public class FamilyList: Dictionary> +{ +} + +public class Family +{ + public string NAME { get; set; } + public string BIRTHDAY { get; set; } + public string IDNO { get; set; } + public string RELATIONSHIP { get; set; } + public string DEDUCT { get; set; } + public string START_DATE { get; set; } + public string END_DATE { get; set; } +} + + + diff --git a/Web/forms/worker/GetDataService.asmx b/Web/forms/worker/GetDataService.asmx new file mode 100644 index 0000000..dbe6642 --- /dev/null +++ b/Web/forms/worker/GetDataService.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="~/App_Code/GetDataService.cs" Class="GetDataService" %> diff --git a/Web/forms/worker/UNBPSNP.ascx b/Web/forms/worker/UNBPSNP.ascx new file mode 100644 index 0000000..cf32cb5 --- /dev/null +++ b/Web/forms/worker/UNBPSNP.ascx @@ -0,0 +1,50 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UNBPSNP.ascx.cs" Inherits="forms_BPSN_UNBPSNP" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> + + + + + + 使用者變更密碼
+ + + + + + + + + + + + + +
+ 舊密碼: + +
+ 新密碼: + +
+ 確認新密碼: + +
+
+ +
+
+ +
+ + + +
\ No newline at end of file diff --git a/Web/forms/worker/UNBPSNP.ascx.cs b/Web/forms/worker/UNBPSNP.ascx.cs new file mode 100644 index 0000000..d5da132 --- /dev/null +++ b/Web/forms/worker/UNBPSNP.ascx.cs @@ -0,0 +1,133 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using Wellan.Data; +using Wellan.Common; +using System.Data.Common; + +/// +/// 使用者變更密碼 +/// +public partial class forms_BPSN_UNBPSNP : Wellan.Web.UI.WUserControlBase +{ + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + SetClientFocus(txtOldPassword); + } + + protected void btnOK_Click(object sender, EventArgs e) + { + lbErrMsg.Text = ""; + + if (txtNewPassword.Text == "") + { + lbErrMsg.Text = GetString("BPSN.NEWEMPTY"); + } + else if (txtConfirmNewPassword.Text == "") + { + lbErrMsg.Text = GetString("BPSN.CONFEMPTY"); + } + else if (txtNewPassword.Text != txtConfirmNewPassword.Text) + { + lbErrMsg.Text = GetString("BPSN.NEWDIFFER"); + } + lbErrMsg.Visible = lbErrMsg.Text != ""; + if (lbErrMsg.Visible) + return; + + // 驗證舊密碼是否正確 + WQuery query = new WQuery(ConnectionType, ConnectionString); + + DataTable ds; + if (!UserId.ToUpper().StartsWith("Z")) + ds = query.Select("SELECT BPAWD FROM BPSNView WHERE BPENO='" + UserId + "'"); + else + ds = query.Select("SELECT BPPWD AS BPAWD FROM BPAP WHERE BPENO='" + UserId + "'"); + + string bpawd = ds.Rows[0]["BPAWD"].ToString(); + + if (bpawd == "\u007f\u007f\u007f\u007f") + bpawd = ""; + else + bpawd = WGuard1.KeyDec(bpawd); + + if (txtOldPassword.Text != bpawd) + { + lbErrMsg.Text = GetString("BPSN.OLDERR"); + lbErrMsg.Visible = true; + return; + } + + // 驗證新密碼是否合乎格式 + string newPass = WGuard1.KeyEnc(txtNewPassword.Text); + if (WGuard1.KeyDec(newPass) != txtNewPassword.Text) + { + lbErrMsg.Text = GetString("BPSN.NEWERR"); + lbErrMsg.Visible = true; + return; + } + + // 寫入新密碼 + DbCommand cmd = query.NewCommand(); + DbConnection conn = query.NewConnection(); + cmd.Connection = conn; + if (!UserId.ToUpper().StartsWith("Z")) + { + cmd.CommandText = "UPDATE BPSN SET BPAWD=@BPAWD,TRDAT=GETDATE(), TRMOD='UPDATE', TRUSR=@TRUSR WHERE BPENO=@BPENO"; + } + else + { + cmd.CommandText = "UPDATE BPAP SET BPPWD=@BPAWD,TRDAT=GETDATE(), TRMOD='UPDATE', TRUSR=@TRUSR WHERE BPENO=@BPENO"; + } + cmd.Parameters.Add(query.NewParameter("@BPAWD", newPass)); + cmd.Parameters.Add(query.NewParameter("@TRUSR", UserId)); + cmd.Parameters.Add(query.NewParameter("@BPENO", UserId)); + + conn.Open(); + DbTransaction tran = conn.BeginTransaction(); + cmd.Transaction = tran; + try + { + int i = cmd.ExecuteNonQuery(); + + if (i == 1) + { + tran.Commit(); + MultiView1.ActiveViewIndex = 1; + Session["NOPASSWORD"] = "FALSE"; + return; + } + else + { + tran.Rollback(); + lbErrMsg.Text = GetString("BPSN.NEWERR"); + lbErrMsg.Visible = true; + return; + } + } + catch + { + tran.Rollback(); + lbErrMsg.Text = GetString("BPSN.NEWERR"); + lbErrMsg.Visible = true; + } + finally + { + conn.Close(); + cmd.Dispose(); + } + } +} diff --git a/Web/forms/worker/fmBonus.ascx b/Web/forms/worker/fmBonus.ascx new file mode 100644 index 0000000..71986e0 --- /dev/null +++ b/Web/forms/worker/fmBonus.ascx @@ -0,0 +1,133 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBonus.ascx.cs" Inherits="forms_worker_fmBonus" %> +<%@ Register Src="ucBonusInput.ascx" TagName="ucBonusInput" + TagPrefix="uc1" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 年月: + + +
+ 專案: + + +
+ 發放次數: + + 1 + 2 + 3 + 4 + 5 + + (本月份第幾次發獎金)
+ 稅率: + + (例:0.06) + +
+ 獎金稅額起點: + + +
+ +
+
+ + + + + + + + + + + + + diff --git a/Web/forms/worker/fmBonus.ascx.cs b/Web/forms/worker/fmBonus.ascx.cs new file mode 100644 index 0000000..8cc31ca --- /dev/null +++ b/Web/forms/worker/fmBonus.ascx.cs @@ -0,0 +1,266 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Generic; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; + +/// +/// 獎金發放作業 +/// +public partial class forms_worker_fmBonus : Wellan.Web.UI.WUserControlBase +{ + protected DateTime _YYMM; + protected string _SSENO = ""; + protected string _SSPYN = ""; + protected int _BonusTimes = 0; + + private List inputCtrls = new List(); + + protected void Page_Load(object sender, EventArgs e) + { + _SSENO = GetStringViewState("RSENO"); + _SSPYN = GetStringViewState("RSPYN"); + _YYMM = GetDateTimeViewState("YYMM"); + _BonusTimes = GetIntViewState("BonusTimes"); + + if (!IsPostBack) + { + // 讀取稅額起點 + txtTaxBegin.Text = WGuard1.WSetR(Query, "UNBONUSTAXFREE", 1); + } + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsSSMS_SSENO.ConnectionString = ConnectionString; + dsSSMS_SSENO.SelectCommand = + @"IF @RSPYN<> '000000001' + BEGIN + SELECT DISTINCT A.BPENO, A.BPNME + FROM BPSNView A INNER JOIN RASN B ON A.BPENO = B.RANUM + WHERE B.RAPYN = @RSPYN + ORDER BY A.BPENO + END + ELSE + BEGIN + SELECT DISTINCT BPENO, BPNME, BPSDY, BPEDY FROM BPSNView + WHERE((BPSDY <= @YYMM1 AND BPEDY >= @YYMM2) + OR(BPSDY <= @YYMM1 AND BPEDY IS NULL) + OR(BPSDY <= @YYMM1 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2) + OR(BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM2) + OR(BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY IS NULL) + OR(BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2)) + AND BPENO NOT IN + (SELECT RANUM FROM RASN + WHERE ((RASDT <= @YYMM1 AND RAEDT >= @YYMM2) + OR(RASDT <= @YYMM1 AND RAEDT IS NULL) + OR(RASDT <= @YYMM1 AND RAEDT >= @YYMM1 AND RAEDT <= @YYMM2) + OR(RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT >= @YYMM2) + OR(RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT IS NULL) + OR(RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT >= @YYMM1 AND RAEDT <= @YYMM2))) + ORDER BY BPENO + END"; + + ListItem item = ddlSSPYN.Items.FindByValue(_SSPYN); + if (item != null) + item.Selected = true; + + GetRsenoDropDownData(); + } + + private void GetRsenoDropDownData() + { + if (_YYMM.Ticks != 0) + { + dsSSMS_SSENO.SelectParameters["RSPYN"].DefaultValue = _SSPYN; + dsSSMS_SSENO.SelectParameters["YYMM1"].DefaultValue = WGuard1.GetMonthBegin(_YYMM, -1).ToString("yyyy/MM/dd", WGuard1.InvariantCulture); // 上個月月初日 + dsSSMS_SSENO.SelectParameters["YYMM2"].DefaultValue = WGuard1.GetMonthEnd(_YYMM, 1).ToString("yyyy/MM/dd", WGuard1.InvariantCulture); // 本月月底日 + } + } + + protected new bool CheckInput(System.Collections.Specialized.IOrderedDictionary values) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + bool result = true; + values["RSYMM"] = CheckDate(values["RSYMM"] + "01", "請輸入正確的年月", ref result, cvMessage); + + ProcessCustomValidatorMessage(cvMessage); + return result; + } + + protected void Next_Click(object sender, EventArgs e) + { + if (!cvTaxRate.IsValid) + return; + + string sspyn = ddlSSPYN.SelectedValue; + ViewState["SSPYN"] = sspyn; + ViewState["BonusTimes"] = Convert.ToInt32(ddlBonusTimes.SelectedValue); + _SSPYN = sspyn; + + // 檢查此使用者是否有權限處理這個專案 + BprmDAC bprm = new BprmDAC(Query); + if (!bprm.GetRight(sspyn, UserId)) + { + DataList1.Visible = false; + cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + cvMessage.IsValid = false; + return; + } + + DataList1.Visible = true; + GetRsenoDropDownData(); + DataList1.DataBind(); + + foreach (DataListItem listItem in DataList1.Items) + { + foreach (Control ctrl in listItem.Controls) + { + if (ctrl is forms_worker_ucBonusInput) + { + (ctrl as forms_worker_ucBonusInput).Read(Query); + } + } + } + } + + protected void btnSave_Click(object sender, EventArgs e) + { + // 存檔 + // 1. 檢查各組輸入 + bool valid = true; + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + foreach (DataListItem listItem in DataList1.Items) + { + foreach (Control ctrl in listItem.Controls) + { + if (ctrl is forms_worker_ucBonusInput) + { + valid &= (ctrl as forms_worker_ucBonusInput).CheckInput(); + } + } + } + + if (!valid) + { + cvMessage.IsValid = false; + return; + } + + // 存入稅額起點 + WGuard1.WSetW(Query, "UNBONUSTAXFREE", 1, txtTaxBegin.Text, UserId); + + DbConnection conn = Query.NewConnection(ConnectionString); + conn.Open(); + DbTransaction tran = conn.BeginTransaction(); + try + { + foreach (DataListItem listItem in DataList1.Items) + { + foreach (Control ctrl in listItem.Controls) + { + if (ctrl is forms_worker_ucBonusInput) + { + (ctrl as forms_worker_ucBonusInput).Save(tran, Query); + } + } + } + + tran.Commit(); + + cvMessage.ErrorMessage = "存檔完成"; + cvMessage.IsValid = false; + } + catch (Exception ex) + { + tran.Rollback(); + cvMessage.ErrorMessage = ex.Message; + cvMessage.IsValid = false; + } + finally + { + conn.Close(); + } + + // 重新讀取資料 + foreach (DataListItem listItem in DataList1.Items) + { + foreach (Control ctrl in listItem.Controls) + { + if (ctrl is forms_worker_ucBonusInput) + { + (ctrl as forms_worker_ucBonusInput).Read(Query); + } + } + } + } + + protected void btnSSMS_Click(object sender, EventArgs e) + { + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + bool result = true; + DateTime aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + + if (result) + { + ViewState["YYMM"] = aYYMM; + _YYMM = aYYMM; + ddlSSPYN.DataSource = new BpaaDAC().GetBpaaWithTY(aYYMM.Year); + ddlSSPYN.DataBind(); + } + } + + protected void cvTaxRate_ServerValidate(object source, ServerValidateEventArgs args) + { + if (args.Value.Trim().Length == 0) + { + (source as CustomValidator).ErrorMessage = "請輸入稅率"; + args.IsValid = false; + return; + } + + double result; + if (!double.TryParse(args.Value, out result) || result < 0 || result > 1) + { + (source as CustomValidator).ErrorMessage = "請輸入正確的稅率 (0 至 1 之間,輸入 0.06 代表 6%)"; + args.IsValid = false; + return; + } + } + + protected void cvTxtTaxBegin_ServerValidate(object source, ServerValidateEventArgs args) + { + if (args.Value.Trim().Length == 0) + { + (source as CustomValidator).ErrorMessage = "請輸入稅額起徵點"; + args.IsValid = false; + return; + } + + double result; + if (!double.TryParse(args.Value, out result) || result < 0) + { + (source as CustomValidator).ErrorMessage = "稅額起徵點需大於或等於 0"; + args.IsValid = false; + return; + } + } +} diff --git a/Web/forms/worker/fmBpsl.ascx b/Web/forms/worker/fmBpsl.ascx new file mode 100644 index 0000000..a6d2ae3 --- /dev/null +++ b/Web/forms/worker/fmBpsl.ascx @@ -0,0 +1,717 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBpsl.ascx.cs" Inherits="forms_worker_fmBpsl" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> +<%@ Import Namespace="System.Drawing" %> + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ 人員編號: + + + + + +
+ + + +
+
+
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ + + + 生效日期: + + + + + +
+ + + +
+
+ 月薪: + + + + 時薪: + + + + 全勤獎金: + + + + 伙食津貼: + + +
+ 職務加給: + + + + 派駐津貼: + + + + 其他津貼: + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ + + + 生效日期: + + + + + +
+ + + +
+
+ 月薪: + + 時薪: + + 全勤獎金: + + 伙食津貼: +
+ 職務加給: + + 派駐津貼: + + 其他津貼: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 人員編號: + + + + + 生效日期: +
+ 月薪: + + 時薪: + + 全勤獎金: + + 伙食津貼: +
+ 職務加給: + + 派駐津貼: + + 其他津貼: +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/Web/forms/worker/fmBpsl.ascx.cs b/Web/forms/worker/fmBpsl.ascx.cs new file mode 100644 index 0000000..6d2d906 --- /dev/null +++ b/Web/forms/worker/fmBpsl.ascx.cs @@ -0,0 +1,418 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.Data.Common; + +/// +/// 非專案人員薪資資料處理 +/// +public partial class forms_worker_fmBpsl : Wellan.Web.UI.WUserControlBase +{ + protected string _BPENO = ""; + protected string _BPNME = ""; + protected int _BPITM = 0; + protected string _Current_BPENO = ""; + protected int _Current_BPITM = 0; + private DbCommand cmdCheckDuplicate; + protected string tableName = ""; + + protected void Page_Load(object sender, EventArgs e) + { + _BPENO = ViewState["BPENO"] != null ? ViewState["BPENO"].ToString() : ""; + _BPNME = ViewState["BPNME"] != null ? ViewState["BPNME"].ToString() : ""; + _BPITM = ViewState["BPITM"] != null ? Convert.ToInt32(ViewState["BPITM"]) : 0; + _Current_BPENO = ViewState["Current_BPENO"] != null ? ViewState["Current_BPENO"].ToString() : ""; + _Current_BPITM = ViewState["Current_BPITM"] != null ? Convert.ToInt32(ViewState["Current_BPITM"]) : 0; + tableName = ViewState["tableName"] != null ? ViewState["tableName"].ToString() : ""; + + //if (IsPostBack) + // gvBPSL.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + + cmdCheckDuplicate = Query.NewCommand(@"SELECT COUNT(1) FROM BPSL WHERE BPENO=@BPENO"); + cmdCheckDuplicate.Parameters.Add(Query.NewParameter("BPENO", DbType.String)); + + GetGridViewRowColor(gvBPSL); + ShowData(); + } + + private void ShowData() + { + switch (tableName) + { + case "": + case "BPSL": + MultiView1.ActiveViewIndex = 1; + RegisterLookupEvent(this, "btnBPSL_BPENO_WQRY", "txtBPSL_BPENO", "txtBPSL_BPENO,lbBPSL_BPENOX", "BPSN"); + SetClientFocus(txtBPSL_BPENO); + Search(); + gvBPSL.DataSourceID = "dsBPSLGrid"; + fvBPSL.DataSourceID = "dsBPSLForm"; + break; + case "RPSL": + SearchB(); + gvBPSL.DataSourceID = "dsRPSLGrid"; + fvBPSL.DataSourceID = "dsRPSLForm"; + break; + } + } + + // 查詢按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + _BPENO = txtBPSL_BPENO.Text; + _BPNME = txtBPSL_BPNME.Text; + + if (_BPENO.Length == 0 && + _BPNME.Length == 0) + { + cvMessage.ErrorMessage = GetString("NOSRHCOND"); + cvMessage.IsValid = false; + } + else + { + MultiView1.ActiveViewIndex = 1; + + Search(); + + gvBPSL.PageIndex = 0; + gvBPSL.SelectedIndex = 0; + gvBPSL.DataBind(); + + // 查詢有資料時,才將查詢條件紀錄在 ViewState 中 + if (gvBPSL.Rows.Count > 0) + { + ViewState["BPENO"] = _BPENO; + ViewState["BPNME"] = _BPNME; + ViewState["tableName"] = ""; + } + } + } + + // 取消查詢按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + Search(); + gvBPSL.DataBind(); + MultiView1.ActiveViewIndex = 1; + } + + // 查詢動作 + private new void Search() + { + dsBPSLGrid.SelectParameters["BPENO"].DefaultValue = _BPENO; + dsBPSLGrid.SelectParameters["BPNME"].DefaultValue = _BPNME; + } + + // 異動查詢動作 + private void SearchB() + { + dsRPSLGrid.SelectParameters["BPENO"].DefaultValue = _Current_BPENO; + } + + // 檢查員工編號是否存在 + protected void cvBPENO_ServerValidate(object source, ServerValidateEventArgs args) + { + BPSN_DAC bpsn = new BPSN_DAC(WConfig.GetConnectionConfig(), WConfig.GetConnectionConfigName()); + args.IsValid = args.Value != "" && bpsn.IsExist(args.Value, true); + } + + // 驗證月薪與時薪 + protected void cvNumber1_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i > 0; + } + + // 驗證各項津貼 + protected void cvNumber2_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i >= 0; + } + + protected void fvBPSL_DataBound(object sender, EventArgs e) + { + switch (fvBPSL.CurrentMode) + { + case FormViewMode.Insert: + RegisterLookupEvent(fvBPSL, "btnBPSL_BPENO_WQRY", "txtBPSL_BPENO", "txtBPSL_BPENO,lbBPSL_BPENOX", "BPSN"); + switch (tableName) + { + case "BPSL": + (fvBPSL.FindControl("txtBPSL_BPSRM") as ITextControl).Text = "0"; + (fvBPSL.FindControl("txtBPSL_BPSRD") as ITextControl).Text = "0"; + (fvBPSL.FindControl("txtBPSL_BPP01") as ITextControl).Text = "0"; + (fvBPSL.FindControl("txtBPSL_BPP02") as ITextControl).Text = "1800"; + (fvBPSL.FindControl("txtBPSL_BPP03") as ITextControl).Text = "0"; + (fvBPSL.FindControl("txtBPSL_BPP04") as ITextControl).Text = "0"; + (fvBPSL.FindControl("txtBPSL_BPP05") as ITextControl).Text = "0"; + SetClientFocus(fvBPSL, "txtBPSL_BPENO"); + fvBPSL.FindControl("lbBPSL_BPBDTLabel").Visible = false; + fvBPSL.FindControl("btnBPSL_BPBDT_DATE").Visible = false; + fvBPSL.FindControl("txtBPSL_BPBDT").Visible = false; + (fvBPSL.FindControl("rfvBPBDT") as RequiredFieldValidator).Enabled = false; + break; + case "RPSL": + // 取得目前資料,複製進畫面的控制項 + RegisterCalendarEvent(fvBPSL, "btnBPSL_BPBDT_DATE", "txtBPSL_BPBDT"); + + BpslDAC bpsl = new BpslDAC(); + DataTable bpslData = bpsl.SelectOne(_Current_BPENO, _Current_BPITM); + + if (bpslData.Rows.Count > 0) + { + (fvBPSL.FindControl("txtBPSL_BPENO") as ITextControl).Text = bpslData.Rows[0]["BPENO"].ToString(); + (fvBPSL.FindControl("lbBPSL_BPENOX") as ITextControl).Text = GetLookup("BPSN", bpslData.Rows[0]["BPENO"].ToString(), "BPNME"); + (fvBPSL.FindControl("txtBPSL_BPENO") as TextBox).Attributes.Add("readonly", "readonly"); + (fvBPSL.FindControl("txtBPSL_BPSRM") as ITextControl).Text = bpslData.Rows[0]["BPSRM"].ToString(); + (fvBPSL.FindControl("txtBPSL_BPSRD") as ITextControl).Text = bpslData.Rows[0]["BPSRD"].ToString(); + (fvBPSL.FindControl("txtBPSL_BPP01") as ITextControl).Text = bpslData.Rows[0]["BPP01"].ToString(); + (fvBPSL.FindControl("txtBPSL_BPP02") as ITextControl).Text = bpslData.Rows[0]["BPP02"].ToString(); + (fvBPSL.FindControl("txtBPSL_BPP03") as ITextControl).Text = bpslData.Rows[0]["BPP03"].ToString(); + (fvBPSL.FindControl("txtBPSL_BPP04") as ITextControl).Text = bpslData.Rows[0]["BPP04"].ToString(); + (fvBPSL.FindControl("txtBPSL_BPP05") as ITextControl).Text = bpslData.Rows[0]["BPP05"].ToString(); + } + break; + } + + break; + case FormViewMode.Edit: + if (_Current_BPITM == 0) + { + fvBPSL.FindControl("lbBPSL_BPBDTLabel").Visible = false; + fvBPSL.FindControl("btnBPSL_BPBDT_DATE").Visible = false; + fvBPSL.FindControl("txtBPSL_BPBDT").Visible = false; + (fvBPSL.FindControl("rfvBPBDT") as RequiredFieldValidator).Enabled = false; + } + else + RegisterCalendarEvent(fvBPSL, "btnBPSL_BPBDT_DATE", "txtBPSL_BPBDT"); + + RegisterLookupEvent(fvBPSL, "btnBPSL_BPENO_WQRY", "txtBPSL_BPENO", "txtBPSL_BPENO,lbBPSL_BPENOX", "BPSN"); + SetClientFocus(fvBPSL, "txtBPSL_BPENO"); + break; + case FormViewMode.ReadOnly: + break; + } + } + + protected void fvBPSL_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "New": + tableName = e.CommandArgument.ToString(); + ViewState["tableName"] = tableName; + break; + case "Search": + MultiView1.ActiveViewIndex = 0; + SetClientFocus(txtBPSL_BPENO); + break; + case "Cancel": + tableName = "BPSL"; + ViewState["tableName"] = tableName; + Search(); + fvBPSL.ChangeMode(FormViewMode.ReadOnly); + fvBPSL_ModeChanged(sender, e); + break; + case "BPSL": + tableName = "BPSL"; + ViewState["tableName"] = tableName; + ShowData(); + break; + case "RPSLSearch": + tableName = "RPSL"; + ViewState["tableName"] = tableName; + ShowData(); + break; + } + } + + protected void fvBPSL_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + gvBPSL.DataBind(); + if (gvBPSL.SelectedIndex > gvBPSL.Rows.Count - 1) + { + gvBPSL.SelectedIndex = gvBPSL.Rows.Count - 1; + gvBPSL.DataBind(); + } + fvBPSL.DataBind(); + } + + protected void fvBPSL_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + tableName = "BPSL"; + ViewState["tableName"] = tableName; + Search(); + } + + protected void fvBPSL_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void fvBPSL_ModeChanged(object sender, EventArgs e) + { + if (fvBPSL.CurrentMode == FormViewMode.ReadOnly) + { + gvBPSL.Visible = true; + gvBPSL.DataBind(); + if (gvBPSL.Rows.Count > 0 && gvBPSL.SelectedIndex == -1) + { + gvBPSL.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert && gvBPSL.Rows.Count > 0) + { + gvBPSL.PageIndex = gvBPSL.PageCount - 1; + gvBPSL.DataBind(); + gvBPSL.SelectedIndex = gvBPSL.Rows.Count - 1; + } + + fvBPSL.DataBind(); + } + else + { + gvBPSL.Visible = false; + } + } + + protected void fvBPSL_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void gvBPSL_PageIndexChanged(object sender, EventArgs e) + { + Search(); + gvBPSL.SelectedIndex = 0; + gvBPSL.DataBind(); + } + + private void UpdateCurrentKey() + { + _Current_BPENO = gvBPSL.SelectedDataKey != null ? gvBPSL.SelectedDataKey["BPENO"].ToString() : ""; + _Current_BPITM = gvBPSL.SelectedDataKey != null ? Convert.ToInt32(gvBPSL.SelectedDataKey["BPITM"]) : 0; + ViewState["Current_BPENO"] = _Current_BPENO; + ViewState["Current_BPITM"] = _Current_BPITM; + } + + protected void gvBPSL_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in gvBPSL.Rows) + SetGridViewMouseBehavier(gvBPSL, row); + UpdateCurrentKey(); + } + + protected void gvBPSL_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (gvBPSL.SelectedIndex == -1) + gvBPSL.SelectedIndex = 0; + if (gvBPSL.SelectedIndex >= gvBPSL.Rows.Count) + gvBPSL.SelectedIndex = gvBPSL.Rows.Count - 1; + + UpdateCurrentKey(); + fvBPSL.DataBind(); + } + + protected void gvBPSL_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(gvBPSL, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void dsBPSLGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e) + { + if ((e.ReturnValue as DataTable).Rows.Count == 0) + { + MultiView1.ActiveViewIndex = 0; + cvMessage.ErrorMessage = GetString("NODATA"); + cvMessage.IsValid = false; + btnInsert.Enabled = true; + } + } + + private bool CheckBPENODuplicate(string bpeno) + { + cmdCheckDuplicate.Parameters["BPENO"].Value = bpeno; + object o = Query.ExecuteScalar(cmdCheckDuplicate); + return (o != null && o != DBNull.Value && Convert.ToInt32(o) > 0); + } + + protected new bool CheckInput(System.Collections.Specialized.IOrderedDictionary values) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + bool result = true; + if (values["BPBDT"].ToString() != "") + values["BPBDT"] = CheckDate(values["BPBDT"], "請輸入正確的生效日期", ref result, cvMessage); + + ProcessCustomValidatorMessage(cvMessage); + return result; + } + + protected void fvBPSL_ItemInserting(object sender, FormViewInsertEventArgs e) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + // 檢查員工編號是否重複 + if (tableName == "BPSL" && CheckBPENODuplicate(e.Values["BPENO"].ToString())) + { + e.Cancel = true; + cvMessage.ErrorMessage = "員工編號重複,請重新輸入"; + cvMessage.IsValid = false; + } + if (tableName == "RPSL") + { + e.Values["BPITM"] = 1; + } + + e.Cancel = !CheckInput(e.Values); + } + + protected void fvBPSL_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + // 當員工編號修改時,檢查員工編號是否重複 + if (tableName == "BPSL" && e.Keys["BPENO"].ToString() != e.NewValues["BPENO"].ToString()) + { + if (CheckBPENODuplicate(e.NewValues["BPENO"].ToString())) + { + e.Cancel = true; + cvMessage.ErrorMessage = "員工編號重複,請重新輸入"; + cvMessage.IsValid = false; + } + } + + e.Cancel = !CheckInput(e.NewValues); + } + + protected void btnInsert_Click(object sender, EventArgs e) + { + MultiView1.ActiveViewIndex = 1; + tableName = "BPSL"; + fvBPSL.ChangeMode(FormViewMode.Insert); + //fvBPSL_ModeChanged(sender, e); + fvBPSL_DataBound(sender, e); + } +} diff --git a/Web/forms/worker/fmBpsn.ascx b/Web/forms/worker/fmBpsn.ascx new file mode 100644 index 0000000..9663456 --- /dev/null +++ b/Web/forms/worker/fmBpsn.ascx @@ -0,0 +1,2450 @@ + +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmBpsn.ascx.cs" Inherits="forms_worker_fmBpsn" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ +
+ + +
+ 在職狀況: + + 全部 + 在職 + 離職 +
+ 部門/專案: + + + 全部 + 部門 + 專案 +
+ 到職日: + + + + + +
+ +
+
+ + + + + +
+ +
+
+ 離職日: + + + + + +
+ +
+
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + 中文姓名: + + 部門: + + + + + +
+ + + + + + + + + + + <%-- + --%> + + + + + + + + <%-- + --%> + + + + + + + + + +
到離職異動紀錄
異動項次異動類別異動日期備註原部門新部門
{{ record.RPITM }} + {{ record.RPCLS }} + + {{ record.RPDAT }} + + [{{ record.RPODT }}] {{ record.RPODT_NAME }} + + [{{ record.RPDPT }}] {{ record.RPDPT_NAME }} + + {{ record.RPDOC }} +
...載入中...
無異動紀錄
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
派遣紀錄
開始日期結束日期派駐專案站別職稱
{{ record.RASDT | dateFilter }}{{ record.RAEDT | dateFilter }}{{ record.BPPYM }}{{ record.BSSCR }}{{ record.BPJME }}
...載入中...
無派遣紀錄
+
+ + +
+ 英文姓名: + + 性別: + + 人員類別: +
+ 身份證字號: + + 出生年月日: + + 公司別: + + +
+ 戶籍地: + + +
+ 現住地: + + +
+ 住家電話: + + 公司電話: + + 分機: +
+ 手機一: + + 手機二: +
+ 電子郵件: +
+ 電子郵件(薪資單): +
+ 最高學歷: + + 最高學歷學校: + + 科系: +
+ 畢肄業: +
+ 次高學歷: + + 次高學歷學校: + + 次高學歷科系: +
+ 次高學歷畢肄業: +
+ 婚姻狀況: + + 子女數: + + 兵役狀況: +
+ 退伍時間: + + 身份類別: + + <%-- 身障類別:--%> + + <%-- --%> +
+ 到職日期: + + 離職日期: +
+ 目前派駐專案: + + + 站別: +
+ 職稱: + + 等級: + 身高: + 體重:
+ 備註: +
+ + + + + + + + + + + + + + + + + + + + + + +
+ 薪資領取方式: + + + + 銀行: + + +
+ 帳號: +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --%> + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + 中文姓名: + + + 部門: + <%-- --%> + + +
+ 英文姓名: + + 性別: + + + 人員類別: + +
+ 身份證字號: + + 出生年月日: + + + + + +
+ +
+
+ 戶籍地: + +
+ 現住地: + +
+ 住家電話: + + 公司電話: + + 分機: +
+ 手機一: + + 手機二: +
+ 電子郵件: +
+ 電子郵件(薪資單): +
+ 最高學歷: + + + 最高學歷學校: + + 科系: +
+ 畢肄業: + +
+ 次高學歷: + + + 次高學歷學校: + + 次高學歷科系: +
+ 次高學歷畢肄業: + +
+ 婚姻狀況: + + + 子女數: + + 兵役狀況: + +
+ 退伍時間: + + + + + +
+ +
+
+ 身份類別: + + + <%-- 身障類別: + <%-- + --%> +
+ 到職日期: + + + <%-- + + + + +
+ +
--%> +
+ 離職日期: + + <%-- + + + + +
+ +
--%> +
+ 到離職日期請至"到離職異動"輸入 + + 身高: + + 體重: +
+ 備註: +
+ 照片: + + (僅接受檔案大小在 200KB 以內的 GIF 或 JPG 圖檔)
+ + + + + + + + + + + + + + + + + + + + +
+ 薪資領取方式: + + + + 銀行: + + + + + +
+ + + +
+
+
+ 帳號: +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --%> + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + (自動編號) + 中文姓名: + + 部門: + + + +
+ 英文姓名: + + 性別: + + + + + 人員類別: + +
+ 身份證字號: + + 出生年月日: + + + + + +
+ +
+
+ 戶籍地: + +
+ 現住地: + +
+ 住家電話: + + 公司電話: + + 分機: +
+ 手機一: + + 手機二: +
+ 電子郵件: +
+ 電子郵件(薪資單): +
+ 最高學歷: + + + 最高學歷學校: + + 科系: +
+ 畢肄業: + +
+ 次高學歷: + + + 次高學歷學校: + + 次高學歷科系: +
+ 次高學歷畢肄業: + +
+ 婚姻狀況: + + 1 未婚 + 2 已婚 + 3 單親 + 4 喪偶 + + 子女數: + + 兵役狀況: + + 1 未役 + 2 役畢 + 3 免役 + 4 待役 + 5 屆退 +
+ 退伍時間: + + + + + +
+ +
+
+ 身份類別: + + 1 一般 + 2 應屆畢業生 + 3 學生 + 4 外籍人士 + 5 原住民 + 6 婦女二度就業 + 7 中高齡就業 + + <%-- + 1 未役 + 2 役畢 + 3 免役 + 4 待役 + 5 屆退 +
+ 到職日期: + <%-- --%> + + + + + +
+ +
+
+ 離職日期: + + <%-- + + + + +
+ +
--%> +
+ 到離職日期請至"到離職異動"輸入 + + 身高: + + 體重:
+ 備註: +
+ 照片: + + (僅接受檔案大小在 200KB 以內的 GIF 或 JPG 圖檔)
+ + + + + + + + + + + + + + + + + + + + +
+ 薪資領取方式: + + + + 銀行: + + + + + +
+ + + +
+
+
+ 帳號: +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

人員資料匯出

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
在職狀況: + + + 在職 + 離職 + 不限 + +
日期期間: + + + + + + +
+ + +
+
+ + + + + +
+ + +
+
+ +
專案: + + +
員工編號: + + + + +
匯出類型: + + + 不限 + 到職期間 + 離職期間 + 生日期間 + +
匯出欄位: + + + 人員編號 + 人員姓名 + 性別 + 身份證字號 + 出生年月日 + 戶籍地 + 現住地 + 住家電話 + 手機 + 電子郵件 + 電子郵件(薪資單) + 最高學歷 + 最高學歷學校 + 最高學歷科系 + 身份類別 + 到職日期 + 離職日期 + 銀行 + 分行代碼 + 帳號 + 派駐專案 + 站別 + 職稱 + + + + +
+ + + +
+ +

到離職異動 +
+

+ +

+ 人員:[<%= ViewState["RPENO"] %>] <%= ViewState["RPNME"] %> +

+ +
+ + + + + + + + <%-- + --%> + + + + + + + + + + + <%-- + --%> + + + + + + + + + <%-- + --%> + + + + +
+ + 異動項次異動類別異動日期
+ 民國年YYYMMDD
原部門新部門備註訊息
+ + + + + {{ record.RPITM }} + {{ record.RPCLS }} + + + {{ record.RPDAT }} + + + + + + +
+ + + " v-on:click="showDateDialog(editingRecord.RPDAT)" /> +
+
+ [{{ record.RPODT }}] {{ record.RPODT_NAME }} + + [{{ record.RPDPT }}] {{ record.RPDPT_NAME }} + + + + {{ record.RPDOC }} + + {{ message }} +
+ + + (新) + + + + + + + + + +
+ + + " v-on:click="showDateDialog(newRecord.RPDAT)" /> +
+
+ + + + + {{ message }} +
+
+ + + +
+
\ No newline at end of file diff --git a/Web/forms/worker/fmBpsn.ascx.cs b/Web/forms/worker/fmBpsn.ascx.cs new file mode 100644 index 0000000..cc02abe --- /dev/null +++ b/Web/forms/worker/fmBpsn.ascx.cs @@ -0,0 +1,1044 @@ +using System; +using System.Data; +using System.Web.UI.WebControls; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using NPOI.HSSF.UserModel; +using System.Collections.Generic; + +/// +/// 人員資料處理 +/// +public partial class forms_worker_fmBpsn : Wellan.Web.UI.WUserControlBase +{ + private string _BPENO = ""; + private string _BPNME = ""; + private string _BPENM = ""; + private string _BPIDN = ""; + private string _BPEDY_TYPE = ""; + private string _BPDPT_TYPE = ""; + private string _BPSDY1 = ""; + private string _BPSDY2 = ""; + private string _BPEDY1 = ""; + private string _BPEDY2 = ""; + + private string select = + @" SELECT + A.* + , B.RAPYN, C.BPPYM RAPYNX, B.RABRH, D.BSSCR RABRHX, B.RAJNO, E.BPJME RAJNOX, B.RACNO + , F.BPCME RACNOX, ISNULL(H.RPCPY, G.RPCPY) AS RPCPY + , ROW_NUMBER() OVER (ORDER BY A.BPENO) ROWID "; + private string from = + @" FROM BPSNView A + LEFT OUTER JOIN RASN B ON A.BPENO=B.RANUM AND (B.RAEDT IS NULL OR (B.RASDT <= @TODAY AND B.RAEDT >= @TODAY)) + LEFT OUTER JOIN BPAA C ON B.RAPYN=C.BPPYN + LEFT OUTER JOIN BCLS D ON D.BSCLS=B.RABRH AND D.BSPAR='BPSNBRH' + LEFT OUTER JOIN BPJA E ON E.BPPYN=B.RAPYN AND E.BPJNO=B.RAJNO + LEFT OUTER JOIN BPJB F ON F.BPPYN=B.RAPYN AND F.BPJNO=B.RAJNO AND F.BPCNO=B.RACNO + LEFT OUTER JOIN RPIR G ON A.BPENO=G.RPENO AND G.RPREN=(SELECT MAX(RPREN) FROM RPIR WHERE RPENO=A.BPENO) + LEFT OUTER JOIN RPIB H ON G.RPREN=H.RPREN AND H.RPITM=(SELECT MAX(RPITM) FROM RPIB WHERE RPREN=H.RPREN) "; + private string where = " WHERE 1=1 "; + // private string order = " ORDER BY BPENO "; + private bool fileOK = false; + + internal BprmDAC bprmDAC; + + protected void Page_Load(object sender, EventArgs e) + { + _BPENO = ViewState["BPSN_BPENO"] != null ? ViewState["BPSN_BPENO"].ToString() : ""; + _BPNME = ViewState["BPSN_BPNME"] != null ? ViewState["BPSN_BPNME"].ToString() : ""; + _BPENM = ViewState["BPSN_BPENM"] != null ? ViewState["BPSN_BPENM"].ToString() : ""; + _BPIDN = ViewState["BPSN_BPIDN"] != null ? ViewState["BPSN_BPIDN"].ToString() : ""; + _BPEDY_TYPE = ViewState["BPSN_BPEDY_TYPE"] != null ? ViewState["BPSN_BPEDY_TYPE"].ToString() : "0"; + _BPDPT_TYPE = ViewState["BPSN_BPDPT_TYPE"] != null ? ViewState["BPSN_BPDPT_TYPE"].ToString() : "0"; + _BPSDY1 = ViewState["BPSN_BPSDY1"] != null ? ViewState["BPSN_BPSDY1"].ToString() : ""; + _BPSDY2 = ViewState["BPSN_BPSDY2"] != null ? ViewState["BPSN_BPSDY2"].ToString() : ""; + _BPEDY1 = ViewState["BPSN_BPEDY1"] != null ? ViewState["BPSN_BPEDY1"].ToString() : ""; + _BPEDY2 = ViewState["BPSN_BPEDY2"] != null ? ViewState["BPSN_BPEDY2"].ToString() : ""; + + //if (GetStringParam("BPENO") != null) + //{ + // txtBPNUM.Text = GetStringParam("BPENO"); + // ParamList.Clear(); + // Search(); + //} + + if (!IsPostBack) + { + ddlBPEDY.SelectedValue = "1"; + GridView1.DataBind(); + } + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + + dsBPSNForm.SelectCommand = @" + SELECT A.*, + B.RAPYN, C.BPPYM RAPYNX, + B.RABRH, D.BSSCR RABRHX, + B.RAJNO, E.BPJME RAJNOX, + B.RACNO, F.BPCME RACNOX, + ISNULL(H.RPCPY, G.RPCPY) AS RPCPY + FROM BPSNView A + LEFT OUTER JOIN RASN B ON A.BPENO=B.RANUM AND B.RASDT <= @TODAY AND (B.RAEDT IS NULL OR B.RAEDT >= @TODAY) + LEFT OUTER JOIN BPAA C ON B.RAPYN=C.BPPYN + LEFT OUTER JOIN BCLS D ON D.BSCLS=B.RABRH AND D.BSPAR='BPSNBRH' + LEFT OUTER JOIN BPJA E ON E.BPPYN=B.RAPYN AND E.BPJNO=B.RAJNO + LEFT OUTER JOIN BPJB F ON F.BPPYN=B.RAPYN AND F.BPJNO=B.RAJNO AND F.BPCNO=B.RACNO + LEFT OUTER JOIN RPIR G ON A.BPENO=G.RPENO AND G.RPREN=(SELECT MAX(RPREN) FROM RPIR WHERE RPENO=A.BPENO) + LEFT OUTER JOIN RPIB H ON G.RPREN=H.RPREN AND H.RPITM=(SELECT MAX(RPITM) FROM RPIB WHERE RPREN=H.RPREN) + WHERE A.BPENO=@BPENO + "; + dsBPSNForm.InsertCommand = @" + INSERT INTO BPSN + (BPENO, BPNME, BPENM, BPGNR, BPBDY, BPIDN, BPAMY, BPAED, BPMRY, BPCHN, BPHGT, BPWGT, BPDIS, + BPAZC, BPACT, BPACY, BPASA, BPLZC, BPLCT, BPLCY, BPLSA, BPEML, BPHTL, BPOTL, BPOTX, BPWTC, + BPMB1, BPMB2, BPCTT, BPIDT, BPSTP, BPSCH, BPSUB, BPSGR, BPST2, BPSC2, BPSU2, BPSG2, BPPIC, + BPTYP, BPSDY, BPEDY, BPAWD, BPDPT, BPSWY, BPBNK, BPACC, BPDOC, BPEM2, + TRDAT, TRMOD, TRUSR, APPNO) + VALUES + (@BPENO, @BPNME, @BPENM, @BPGNR, @BPBDY, @BPIDN, @BPAMY, @BPAED, @BPMRY, @BPCHN, @BPHGT, @BPWGT, @BPDIS, + @BPAZC, @BPACT, @BPACY, @BPASA, @BPLZC, @BPLCT, @BPLCY, @BPLSA, @BPEML, @BPHTL, @BPOTL, @BPOTX, @BPWTC, + @BPMB1, @BPMB2, @BPCTT, @BPIDT, @BPSTP, @BPSCH, @BPSUB, @BPSGR, @BPST2, @BPSC2, @BPSU2, @BPSG2, @BPPIC, + @BPTYP, @BPSDY, @BPEDY, @BPAWD, @BPDPT, @BPSWY, @BPBNK, @BPACC, @BPDOC, @BPEM2, + GETDATE(), 'INSERT', @TRUSR, 1)"; + dsBPSNForm.UpdateCommand = @" + UPDATE dbo.BPSN SET + BPENO = @BPENO, + BPNME = @BPNME, + BPENM = @BPENM, + BPGNR = @BPGNR, + BPBDY = @BPBDY, + BPIDN = @BPIDN, + BPAMY = @BPAMY, + BPAED = @BPAED, + BPMRY = @BPMRY, + BPCHN = @BPCHN, + BPHGT = @BPHGT, + BPWGT = @BPWGT, + BPDIS = @BPDIS, + BPAZC = @BPAZC, + BPACT = @BPACT, + BPACY = @BPACY, + BPASA = @BPASA, + BPLZC = @BPLZC, + BPLCT = @BPLCT, + BPLCY = @BPLCY, + BPLSA = @BPLSA, + BPEML = @BPEML, + BPHTL = @BPHTL, + BPOTL = @BPOTL, + BPOTX = @BPOTX, + BPWTC = @BPWTC, + BPMB1 = @BPMB1, + BPMB2 = @BPMB2, + BPCTT = @BPCTT, + BPIDT = @BPIDT, + BPSTP = @BPSTP, + BPSCH = @BPSCH, + BPSUB = @BPSUB, + BPSGR = @BPSGR, + BPST2 = @BPST2, + BPSC2 = @BPSC2, + BPSU2 = @BPSU2, + BPSG2 = @BPSG2, + BPPIC = @BPPIC, + BPTYP = @BPTYP, + BPDPT = @BPDPT, + BPSWY = @BPSWY, + BPBNK = @BPBNK, + BPACC = @BPACC, + BPDOC = @BPDOC, + BPEM2 = @BPEM2, + TRDAT = GETDATE(), + TRMOD = 'UPDATE', + TRUSR = @TRUSR, + APPNO = APPNO + 1 + WHERE BPENO = @OLD_BPENO + AND APPNO = @OLD_APPNO"; + dsBPSNForm.DeleteCommand = @"DELETE BPSN WHERE BPENO = @OLD_BPENO AND APPNO = @OLD_APPNO"; + + dsBPSNForm.ConnectionString = ConnectionString; + dsBPSNGrid.ConnectionString = ConnectionString; + dsBPSN_BPTYP.ConnectionString = ConnectionString; + dsBPSN_BPGNR.ConnectionString = ConnectionString; + dsBPSN_BPSGR.ConnectionString = ConnectionString; + dsBPSN_BPMRY.ConnectionString = ConnectionString; + dsBPSN_BPAMY.ConnectionString = ConnectionString; + dsBPSN_BPIDT.ConnectionString = ConnectionString; + dsBPSN_BPDIS.ConnectionString = ConnectionString; + dsBPSN_BPDPT.ConnectionString = ConnectionString; + dsBPSN_BPSWY.ConnectionString = ConnectionString; + + dsBPSN_BPTYP.SelectCommand = GetListSql("BCLS", "BSPAR = 'BPSNTYP'"); + dsBPSN_BPGNR.SelectCommand = GetListSql("BCLS", "BSPAR = 'BPSNGNR'"); + dsBPSN_BPSGR.SelectCommand = "SELECT '' BSCLS, '' BSSCR UNION " + GetListSql("BCLS", "BSPAR = 'BPSNSGR'"); + dsBPSN_BPMRY.SelectCommand = GetListSql("BCLS", "BSPAR = 'BPSNMRY'"); + dsBPSN_BPAMY.SelectCommand = GetListSql("BCLS", "BSPAR = 'BPSNAMY'"); + dsBPSN_BPIDT.SelectCommand = GetListSql("BCLS", "BSPAR = 'BPSNIDT'"); + dsBPSN_BPDIS.SelectCommand = GetListSql("BCLS", "BSPAR = 'BPSNDIS'"); + dsBPSN_BPDPT.SelectCommand = "SELECT BDNUM, BDNAM FROM BDPT ORDER BY BDNUM"; + dsBPSN_BPSWY.SelectCommand = GetListSql("BCLS", "BSPAR = 'BPSNSWY'"); + + GetGridViewRowColor(GridView1); + + RegisterCalendarEvent(this, "btnBPSN_BPSDY1_DATE", "txtBPSN_BPSDY1"); + RegisterCalendarEvent(this, "btnBPSN_BPSDY2_DATE", "txtBPSN_BPSDY2"); + RegisterCalendarEvent(this, "btnBPSN_BPEDY1_DATE", "txtBPSN_BPEDY1"); + RegisterCalendarEvent(this, "btnBPSN_BPEDY2_DATE", "txtBPSN_BPEDY2"); + RegisterCalendarEvent(this, "btnExportDate1Date", "txtExportDate1"); + RegisterCalendarEvent(this, "btnExportDate2Date", "txtExportDate2"); + + SetClientFocus(txtBPNUM); + + bprmDAC = new BprmDAC(Query); + + switch (MultiView1.ActiveViewIndex) + { + case 0: + { + break; + } + case 1: + { + Search(); + break; + } + } + } + + // 查詢按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + bool result = true; + + // 檢查輸入的日期 + DateTime aDateTime; + if (txtBPSN_BPSDY1.Text != "") + { + aDateTime = CheckDate(txtBPSN_BPSDY1.Text, "到職日開始日期不合理", ref result, cvMessage); + if (aDateTime.Ticks > 0) + _BPSDY1 = aDateTime.ToString(WGuard1.InvariantCulture); + else + _BPSDY1 = ""; + } + if (txtBPSN_BPSDY2.Text != "") + { + aDateTime = CheckDate(txtBPSN_BPSDY2.Text, "到職日結束日期不合理", ref result, cvMessage); + if (aDateTime.Ticks > 0) + _BPSDY2 = aDateTime.ToString(WGuard1.InvariantCulture); + else + _BPSDY2 = ""; + } + if (txtBPSN_BPEDY1.Text != "") + { + aDateTime = CheckDate(txtBPSN_BPEDY1.Text, "離職日開始日期不合理", ref result, cvMessage); + if (aDateTime.Ticks > 0) + _BPEDY1 = aDateTime.ToString(WGuard1.InvariantCulture); + else + _BPEDY1 = ""; + } + if (txtBPSN_BPEDY2.Text != "") + { + aDateTime = CheckDate(txtBPSN_BPEDY2.Text, "離職日結束日期不合理", ref result, cvMessage); + if (aDateTime.Ticks > 0) + _BPEDY2 = aDateTime.ToString(WGuard1.InvariantCulture); + else + _BPEDY2 = ""; + } + + if (result) + { + MultiView1.ActiveViewIndex = 1; + + Search(); + + GridView1.PageIndex = 0; + GridView1.SelectedIndex = 0; + GridView1.DataBind(); + + // 查詢有資料時,才將查詢條件紀錄在 ViewState 中 + if (GridView1.Rows.Count > 0) + { + ViewState["BPSN_BPENO"] = _BPENO; + ViewState["BPSN_BPNME"] = _BPNME; + ViewState["BPSN_BPENM"] = _BPENM; + ViewState["BPSN_BPIDN"] = _BPIDN; + ViewState["BPSN_BPEDY_TYPE"] = _BPEDY_TYPE; + ViewState["BPSN_BPDPT_TYPE"] = _BPDPT_TYPE; + ViewState["BPSN_BPSDY1"] = _BPSDY1; + ViewState["BPSN_BPSDY2"] = _BPSDY2; + ViewState["BPSN_BPEDY1"] = _BPEDY1; + ViewState["BPSN_BPEDY2"] = _BPEDY2; + } + } + } + + // 取消查詢按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + Search(); + GridView1.DataBind(); + MultiView1.ActiveViewIndex = 1; + } + + // 查詢動作 + private new void Search() + { + _BPENO = txtBPNUM.Text; + _BPNME = txtBPNAM.Text; + _BPENM = txtBPENM.Text; + _BPIDN = txtBPIDN.Text; + _BPEDY_TYPE = ddlBPEDY.SelectedValue; + _BPDPT_TYPE = ddlBPDPT.SelectedValue; + + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsBPSNGrid.SelectParameters.Clear(); + dsBPSNGrid.SelectParameters.Add("TODAY", String.Format(WGuard1.InvariantCulture, "{0:yyyy-MM-dd}", DateTime.UtcNow.AddHours(8).Date)); + if (canSearch) + { + AddSearch(sql, dsBPSNGrid, "BPENO", _BPENO, "", true); + AddSearch(sql, dsBPSNGrid, "BPNME", _BPNME, "", true); + AddSearch(sql, dsBPSNGrid, "BPENM", _BPENM, "", true); + AddSearch(sql, dsBPSNGrid, "BPIDN", _BPIDN, "", true); + switch (_BPEDY_TYPE) + { + case "1": + sql.Append(" AND (BPEDY IS NULL OR BPEDY >= @TODAY) "); + break; + case "2": + sql.Append(" AND (BPEDY < @TODAY)"); + break; + } + switch (_BPDPT_TYPE) + { + case "1": + sql.Append(String.Format(" AND BPDPT IN {0} ", PublicVariable.InnerDepartment)); + break; + case "2": + sql.Append(String.Format(" AND BPDPT NOT IN {0} ", PublicVariable.InnerDepartment)); + break; + } + AddSearch(sql, dsBPSNGrid, "BPSDY", _BPSDY1, _BPSDY2, true); + AddSearch(sql, dsBPSNGrid, "BPEDY", _BPEDY1, _BPEDY2, true); + + if (!BpsnDAC.IsManager(UserId)) + { + sql.Append(" AND BPENO NOT IN ('00001','00002','00003') "); + } + } + else + { + AddSearch(sql, dsBPSNGrid, "BPENO", UserId, "", true); + } + // sql.Append(order); + dsBPSNGrid.SelectCommand = sql.ToString(); + + if (!string.IsNullOrEmpty(GetStringParam("BPENO")) || !string.IsNullOrEmpty(WDAC.GetStringValue(ViewState["RPENO"]))) + { + string bpeno = ""; + if (!string.IsNullOrEmpty(GetStringParam("BPENO"))) bpeno = GetStringParam("BPENO"); + if (!string.IsNullOrEmpty(WDAC.GetStringValue(ViewState["RPENO"]))) bpeno = WDAC.GetStringValue(ViewState["RPENO"]); + var cmdIndex = Query.NewCommand(); + cmdIndex.CommandText = string.Format("SELECT ROWID - 1 FROM ( {0} ) T WHERE BPENO = @TARGET", dsBPSNGrid.SelectCommand); + Query.AddParam(cmdIndex, "TODAY", DateTime.UtcNow.AddHours(8).Date); + Query.AddParam(cmdIndex, "BPENO1", _BPENO); + Query.AddParam(cmdIndex, "BPNME1", _BPNME); + Query.AddParam(cmdIndex, "BPENM1", _BPENM); + Query.AddParam(cmdIndex, "BPIDN1", _BPIDN); + Query.AddParam(cmdIndex, "BPSDY1", _BPSDY1); + Query.AddParam(cmdIndex, "BPSDY2", _BPSDY2); + Query.AddParam(cmdIndex, "BPEDY1", _BPEDY1); + Query.AddParam(cmdIndex, "BPEDY2", _BPEDY2); + Query.AddParam(cmdIndex, "TARGET", bpeno); + var o = Query.ExecuteScalar(cmdIndex); + int idx = (o is Int32 || o is Int64) ? WDAC.GetInt32Value(o) : -1; + + if (idx >= 0) + { + GridView1.PageIndex = idx / GridView1.PageSize; + GridView1.SelectedIndex = idx % GridView1.PageSize; + } + + ParamList.Clear(); + ViewState.Remove("RPENO"); + } + } + + // 存檔前的計算動作 + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + // e.Command.Parameters["@BPWTC"].Value = (fvBpsn.FindControl("cbBPSN_BPWTC") as CheckBox).Checked ? "Y" : "N"; + + if (fileOK) + { + try + { + FileUpload fu = fvBpsn.FindControl("fuBPSN_BPPIC") as FileUpload; + string ext = Path.GetExtension(fu.FileName).ToLower(); + string bpeno = e.Command.Parameters["@BPENO"].Value.ToString(); + string fileName = bpeno + ext; + + // 儲存原圖 + //fu.PostedFile.SaveAs(RootPath + "/UploadedPicture/" + fileName); + e.Command.Parameters["@BPPIC"].Value = fileName; + + string tFullName = RootPath + "/UploadedPicture/" + "T_" + bpeno + ".jpg"; // 縮圖的存檔路徑 + MemoryStream 縮圖 = WGuard1.縮圖(fu.PostedFile.InputStream, 300, 350); + File.WriteAllBytes(tFullName, 縮圖.ToArray()); + } + catch + { + throw; + } + } + } + + protected void dsBPSNForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + e.Command.Parameters["@BPAWD"].Value = "\u007f\u007f\u007f\u007f"; + + // 工讀生用其他規則編號 + string newBPENO = WGuard1.WNextRen( + DateTime.UtcNow.AddHours(8) + , "BPSN" + , "BPENO" + , string.Format("{0}", e.Command.Parameters["@BPTYP"].Value) == "5" ? "\"T\"<9999>" : "<99999>" + , ""); + + e.Command.Parameters["@BPENO"].Value = newBPENO; + ViewState["RPENO"] = newBPENO; + CalcFields(e); + } + + protected void dsBPSNForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + } + + protected void GridView1_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (GridView1.Rows.Count > 0) + { + if (GridView1.SelectedIndex < 0) + { + GridView1.SelectedIndex = 0; + } + else if (GridView1.SelectedIndex > GridView1.Rows.Count - 1) + { + GridView1.SelectedIndex = GridView1.Rows.Count - 1; + } + } + else if (GridView1.Rows.Count == 0 && GridView1.PageIndex > 0) + { + GridView1.PageIndex--; + GridView1.SelectedIndex = 9999; + GridView1.DataBind(); + } + fvBpsn.DataBind(); + } + + protected void GridView1_PageIndexChanged(object sender, EventArgs e) + { + Search(); + GridView1.SelectedIndex = 0; + GridView1.DataBind(); + } + + protected void dsBPSNGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + if (MultiView1.ActiveViewIndex == 0) + { + lbMessage.Text = GetString("NODATA"); + lbMessage.Visible = true; + } + + MultiView1.ActiveViewIndex = 0; + lbMessage.Text = GetString("NODATA"); + lbMessage.Visible = true; + } + } + + protected void fvBpsn_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Search": + MultiView1.ActiveViewIndex = 0; + txtBPNUM.Text = ""; + txtBPNAM.Text = ""; + txtBPENM.Text = ""; + txtBPIDN.Text = ""; + break; + case "Cancel": + Search(); + fvBpsn.ChangeMode(FormViewMode.ReadOnly); + fvBpsn_ModeChanged(sender, e); + break; + case "Export": + MultiView1.ActiveViewIndex = 2; + txtExportDate1.Text = ""; + txtExportDate2.Text = ""; + txtExportBPENO1.Text = ""; + txtExportBPENO2.Text = ""; + for (int i = 0; i < rblEmploymentStatus.Items.Count; i++) + { + rblEmploymentStatus.Items[i].Selected = false; + } + for (int i = 0; i < rblWhereType.Items.Count; i++) + { + rblWhereType.Items[i].Selected = false; + } + for (int i = 0; i < cblExportColumns.Items.Count; i++) + { + cblExportColumns.Items[i].Selected = true; + } + rblEmploymentStatus.Items[0].Selected = true; + rblWhereType.Items[0].Selected = true; + cblExportProjects.Items.Clear(); + break; + case "RPIR": + ParamList["mode"] = "BPSN"; + ParamList["BPENO"] = fvBpsn.DataKey.Values["BPENO"]; + DoAfterCommand("RPIR"); + break; + case "RPSN": + ViewState["RPENO"] = fvBpsn.DataKey.Values["BPENO"]; + ViewState["RPNME"] = GetLookup("BPSN", fvBpsn.DataKey.Values["BPENO"].ToString(), "BPNME"); + MultiView1.ActiveViewIndex = 3; + break; + } + } + + protected void fvBpsn_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + GridView1.DataBind(); + fvBpsn.DataBind(); + } + + protected void fvBpsn_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void fvBpsn_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void fvBpsn_ModeChanged(object sender, EventArgs e) + { + if (fvBpsn.CurrentMode == FormViewMode.ReadOnly) + { + GridView1.Visible = true; + GridView1.DataBind(); + if (GridView1.Rows.Count > 0 && GridView1.SelectedIndex == -1) + { + GridView1.SelectedIndex = 0; + } + + fvBpsn.DataBind(); + } + else + { + GridView1.Visible = false; + } + } + + protected void fvBpsn_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void fvBpsn_DataBound(object sender, EventArgs e) + { + if (fvBpsn.CurrentMode == FormViewMode.Insert || fvBpsn.CurrentMode == FormViewMode.Edit) + { + RegisterCalendarEvent(fvBpsn, "btnBPSN_BPBDY_DATE", "txtBPSN_BPBDY"); + RegisterCalendarEvent(fvBpsn, "btnBPSN_BPAED_DATE", "txtBPSN_BPAED"); + RegisterCalendarEvent(fvBpsn, "btnBPSN_BPSDY_DATE", "txtBPSN_BPSDY"); + RegisterCalendarEvent(fvBpsn, "btnBPSN_BPEDY_DATE", "txtBPSN_BPEDY"); + RegisterLookupEvent(fvBpsn, "btnBPSN_BPBNK_WQRY", "txtBPSN_BPBNK", "txtBPSN_BPBNK,lbBPSN_BPBNKX", "BRML"); + + if (fvBpsn.CurrentMode == FormViewMode.Insert) + { + //(fvBpsn.FindControl("ddlBPSN_BPTYP") as RadioButtonList).SelectedIndex = 0; + (fvBpsn.FindControl("rbBPSN_BPGNR") as RadioButtonList).SelectedIndex = 0; + //(fvBpsn.FindControl("rbBPSN_BPDIS") as RadioButtonList).SelectedIndex = 0; + } + } + + switch (fvBpsn.CurrentMode) + { + case FormViewMode.Insert: + SetControlFocus(fvBpsn, "txtBPSN_BPNME"); + break; + + case FormViewMode.Edit: + SetControlFocus(fvBpsn, "txtBPSN_BPNME"); + break; + + case FormViewMode.ReadOnly: + if (fvBpsn.DataItem != null) + ViewState["OLD_BPENO"] = (fvBpsn.DataItem as DataRowView)["BPENO"]; + SetControlVisible(fvBpsn, "pnlBank", canUpdate); + SetControlEnabled(fvBpsn, "btnInsert", canInsert); + SetControlEnabled(fvBpsn, "btnEdit", canUpdate); + SetControlEnabled(fvBpsn, "btnDelete", canDelete); + SetControlEnabled(fvBpsn, "btnSearch", canSearch); + break; + } + } + + protected void BPPICValidator_ServerValidate(object source, ServerValidateEventArgs args) + { + args.IsValid = true; + + // 處理上傳照片 + string ext = ""; + FileUpload fu = fvBpsn.FindControl("fuBPSN_BPPIC") as FileUpload; + if (fu.HasFile && fu.PostedFile.ContentType.ToLower().IndexOf("image") >= 0) + { + // 檢查副檔名 + ext = Path.GetExtension(fu.FileName).ToLower(); + String[] allowedExt = { ".gif", ".jpeg", ".jpg" }; + for (int i = 0; i < allowedExt.Length; i++) + { + if (ext == allowedExt[i]) + { + fileOK = true; + } + } + + // 檢查檔案大小 + if (fileOK && fu.PostedFile.ContentLength < 204800) + fileOK = true; + else + fileOK = false; + + if (!fileOK) + { + args.IsValid = false; + return; + } + } + else + { + args.IsValid = false; + } + } + + protected void dsBPSNForm_Deleted(object sender, SqlDataSourceStatusEventArgs e) + { + // 資料刪除之後,要刪除圖檔 + string bpeno = e.Command.Parameters["@OLD_BPENO"].Value.ToString(); + string[] pictures = Directory.GetFiles(RootPath + "/UploadedPicture", bpeno + ".*"); + foreach (string picture in pictures) + File.Delete(picture); + if (File.Exists(RootPath + "/UploadedPicture/T_" + bpeno + ".jpg")) + File.Delete(RootPath + "/UploadedPicture/T_" + bpeno + ".jpg"); + } + + protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(GridView1, e.Row); + // GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in GridView1.Rows) + SetGridViewMouseBehavier(GridView1, row); + } + + protected void fvBpsn_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 刪除前檢查 + // 1. 檢查是否有派遣紀錄 + // 2. 檢查是否有任職紀錄 + } + + protected new bool CheckInput(System.Collections.Specialized.IOrderedDictionary values) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + bool result = true; + if (values["BPBDY"].ToString() != "") + values["BPBDY"] = CheckDate(values["BPBDY"], "請輸入正確的出生年月日", ref result, cvMessage); + if (values["BPAED"].ToString() != "") + values["BPAED"] = CheckDate(values["BPAED"], "請輸入正確的退伍日期", ref result, cvMessage); + if (values["BPSDY"] != null && values["BPSDY"].ToString() != "") + values["BPSDY"] = CheckDate(values["BPSDY"], "請輸入正確的到職日期", ref result, cvMessage); + if (values["BPEDY"] != null && values["BPEDY"].ToString() != "") + values["BPEDY"] = CheckDate(values["BPEDY"], "請輸入正確的離職日期", ref result, cvMessage); + if (values["BPEML"].ToString() != "") + CheckEmail(values["BPEML"], "電子郵件格式不正確", ref result, cvMessage); + if (values["BPEM2"].ToString() != "") + CheckEmail(values["BPEM2"], "電子郵件(薪資單)格式不正確", ref result, cvMessage); + + ProcessCustomValidatorMessage(cvMessage); + return result; + } + + protected void fvBpsn_ItemInserting(object sender, FormViewInsertEventArgs e) + { + e.Cancel = !CheckInput(e.Values); + var bptyp = WQuery.GetStringValue(e.Values["BPTYP"]); + + int bpidnCount = WQuery.GetInt32Value( + Query.ExecuteScalar( + String.Format("SELECT COUNT(1) FROM BPSNView WHERE BPIDN='{0}' AND BPTYP IN ({1})" + , e.Values["BPIDN"] + , bptyp == "5" ? "5" : "1,2,3,4") + ) + ); + if (bpidnCount > 0) + { + e.Cancel = true; + cvMessage.IsValid = false; + cvMessage.ErrorMessage += "身份證字號已存在
"; + ProcessCustomValidatorMessage(cvMessage); + } + } + + protected void fvBpsn_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + e.Cancel = !CheckInput(e.NewValues); + } + + protected void dsBPSNForm_Selecting(object sender, SqlDataSourceSelectingEventArgs e) + { + e.Command.Parameters["@TODAY"].Value = String.Format(WGuard1.InvariantCulture, "{0:yyyy-MM-dd}", DateTime.UtcNow.AddHours(8).Date); + } + + protected void btnDoExport_Click(object sender, EventArgs e) + { + DateTime date1, date2; + if (!WGuard1.CheckDate(txtExportDate1.Text, out date1)) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "起始日期不正確"; + return; + } + if (!WGuard1.CheckDate(txtExportDate2.Text, out date2)) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "結束日期不正確"; + return; + } + + StringBuilder sql = new StringBuilder(); + + sql.Append(@" + SELECT A.* + , B.RAPYN -- 專案 + , C.BPPYM RAPYNX -- 專案名稱 + , B.RABRH -- 站別 + , D.BSSCR RABRHX -- 站別名稱 + , B.RAJNO -- 職稱 + , E.BPJME RAJNOX -- 職稱名稱 + -- , B.RACNO -- 等級 + -- , F.BPCME RACNOX -- 等級名稱 + , ISNULL(H.RPCPY, G.RPCPY) AS RPCPY -- 公司別 + , I.BDNAM BPDPTX -- 部門名稱 + , GNR.BSSCR BPGNRX -- 性別名稱 + , TYP.BSSCR BPTYPX -- 人員類別名稱 + , STP.BSSCR BPSTPX -- 最高學歷名稱 + , SGR.BSSCR BPSGRX -- 畢肄業名稱 + , IDT.BSSCR BPIDTX -- 身份類別名稱 + -- , BNK.BCNAM BPBNKX -- 銀行名稱 + , CONCAT((SELECT BNKB.BCNAM FROM BRML BNKB WHERE BNKB.BCNUM=SUBSTRING(A.BPBNK, 1, 3)), BNK.BCNAM) BPBNKX -- 銀行名稱 + FROM BPSNView A + LEFT OUTER JOIN RASN B ON A.BPENO = B.RANUM + AND (B.RASDT <= @DATE2 AND (B.RAEDT IS NULL OR B.RAEDT >= @DATE2) OR B.RAEDT BETWEEN @DATE1 AND @DATE2) + LEFT OUTER JOIN BPAA C ON B.RAPYN = C.BPPYN + LEFT OUTER JOIN BCLS D ON D.BSCLS = B.RABRH AND D.BSPAR = 'BPSNBRH' + LEFT OUTER JOIN BPJA E ON E.BPPYN = B.RAPYN AND E.BPJNO = B.RAJNO + -- LEFT OUTER JOIN BPJB F ON F.BPPYN = B.RAPYN AND F.BPJNO = B.RAJNO AND F.BPCNO=B.RACNO + LEFT OUTER JOIN RPIR G ON A.BPENO = G.RPENO AND G.RPREN = (SELECT MAX(RPREN) FROM RPIR WHERE RPENO = A.BPENO) + LEFT OUTER JOIN RPIB H ON G.RPREN = H.RPREN AND H.RPITM = (SELECT MAX(RPITM) FROM RPIB WHERE RPREN = H.RPREN) + LEFT OUTER JOIN BDPT I ON A.BPDPT = I.BDNUM + LEFT OUTER JOIN BCLS GNR ON A.BPGNR = GNR.BSCLS AND GNR.BSPAR = 'BPSNGNR' + LEFT OUTER JOIN BCLS TYP ON A.BPTYP = TYP.BSCLS AND TYP.BSPAR = 'BPSNTYP' + LEFT OUTER JOIN BCLS STP ON A.BPSTP = STP.BSCLS AND STP.BSPAR = 'BPSNSTP' + LEFT OUTER JOIN BCLS SGR ON A.BPSGR = SGR.BSCLS AND SGR.BSPAR = 'BPSNSGR' + LEFT OUTER JOIN BCLS IDT ON A.BPIDT = IDT.BSCLS AND IDT.BSPAR = 'BPSNIDT' + -- LEFT OUTER JOIN BRMLView BNK ON A.BPBNK = BNK.BCNUM + LEFT OUTER JOIN BRML BNK ON A.BPBNK = BNK.BCNUM + WHERE 1=1 "); + + var cmd = Query.NewCommand(); + Query.AddParam(cmd, "DATE1", date1); + Query.AddParam(cmd, "DATE2", date2); + Query.AddParam(cmd, "MMDD1", string.Format("{0:MMdd}", date1)); + Query.AddParam(cmd, "MMDD2", string.Format("{0:MMdd}", date2)); + + if (!string.IsNullOrEmpty(txtExportBPENO1.Text) && !string.IsNullOrEmpty(txtExportBPENO2.Text)) + { + sql.Append(" AND BPENO BETWEEN @BPENO1 AND @BPENO2 "); + } + else if (!string.IsNullOrEmpty(txtExportBPENO1.Text) && string.IsNullOrEmpty(txtExportBPENO2.Text)) + { + sql.Append(" AND BPENO >= @BPENO1"); + } + else if (string.IsNullOrEmpty(txtExportBPENO1.Text) && !string.IsNullOrEmpty(txtExportBPENO2.Text)) + { + sql.Append(" AND BPENO <= @BPENO2"); + } + Query.AddParam(cmd, "BPENO1", txtExportBPENO1.Text); + Query.AddParam(cmd, "BPENO2", txtExportBPENO2.Text); + + List rapyns = new List(); + List rapynNames = new List(); + for (int i = 0; i < cblExportProjects.Items.Count; i++) + { + if (cblExportProjects.Items[i].Selected && cblExportProjects.Items[i].Value != "") + { + rapyns.Add(string.Format("@RAPYN{0}", i)); + rapynNames.Add(cblExportProjects.Items[i].Text); + Query.AddParam(cmd, string.Format("RAPYN{0}", i), cblExportProjects.Items[i].Value); + } + } + if (rapyns.Count > 0) + { + sql.Append(string.Format(" AND B.RAPYN IN ({0}) ", string.Join(", ", rapyns.ToArray()))); + } + else + { + rapynNames.Add("【全部】"); + } + + switch (rblEmploymentStatus.SelectedValue) + { + case "STAFF": + sql.Append(" AND (BPSDY <= @DATE2 AND (BPEDY IS NULL OR BPEDY >= @DATE2) OR BPEDY BETWEEN @DATE1 AND @DATE2) "); + // sql.Append(" AND BPEDY IS NULL "); + break; + case "QUIT": + // sql.Append(" AND NOT (BPSDY <= @DATE2 AND (BPEDY IS NULL OR BPEDY >= @DATE2) OR BPEDY BETWEEN @DATE1 AND @DATE2) "); + sql.Append(" AND BPEDY IS NOT NULL "); + break; + } + switch (rblWhereType.SelectedValue) + { + case "BPSDY": + sql.Append(" AND BPSDY BETWEEN @DATE1 AND @DATE2 "); + break; + case "BPEDY": + sql.Append(" AND BPEDY BETWEEN @DATE1 AND @DATE2 "); + break; + case "BPBDY": + sql.Append(" AND SUBSTRING(CONVERT(varchar, BPBDY, 112), 5, 4) BETWEEN @MMDD1 AND @MMDD2 "); + break; + } + + sql.Append(" ORDER BY BPENO "); + cmd.CommandText = sql.ToString(); + DataTable t = Query.Select(cmd); + + if (t.Rows.Count == 0) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "沒有符合條件的資料"; + return; + } + + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.CreateSheet("報表") as HSSFSheet; + sheet.ForceFormulaRecalculation = true; + Excel excel = new Excel(); + excel.WorkBook = workbook; + excel.Sheet = sheet; + int row = 0; + int col = 0; + + // 抬頭 + excel.MergeCell(row, 0, row, 6); + excel.SetCellValue(row, 0, "人員資料匯出"); + row++; + excel.MergeCell(row, 1, row, 5); + excel.SetCellValue(row, 0, "日期期間:"); + excel.SetCellValue(row, 1, string.Format("{0} ~ {1}", txtExportDate1.Text, txtExportDate2.Text)); + row++; + excel.SetCellValue(row, 0, "專案:"); + excel.MergeCell(row, 1, row, 10); + excel.SetCellValue(row, 1, string.Join("/", rapynNames.ToArray())); + row++; + excel.SetCellValue(row, 0, "員工編號:"); + excel.MergeCell(row, 1, row, 5); + if (string.IsNullOrEmpty(txtExportBPENO1.Text) && string.IsNullOrEmpty(txtExportBPENO2.Text)) + excel.SetCellValue(row, 1, "全部"); + if (string.IsNullOrEmpty(txtExportBPENO1.Text) && !string.IsNullOrEmpty(txtExportBPENO2.Text)) + excel.SetCellValue(row, 1, string.Format("{0} ~", txtExportBPENO1.Text)); + if (!string.IsNullOrEmpty(txtExportBPENO1.Text) && string.IsNullOrEmpty(txtExportBPENO2.Text)) + excel.SetCellValue(row, 1, string.Format("~ {0}", txtExportBPENO2.Text)); + row++; + excel.SetCellValue(row, 0, "在職狀況:"); + excel.SetCellValue(row, 1, string.Format("{0}", rblEmploymentStatus.SelectedItem.Text)); + row++; + excel.SetCellValue(row, 0, "匯出類型:"); + excel.SetCellValue(row, 1, string.Format("{0}", rblWhereType.SelectedItem.Text)); + row += 2; + + // 標題 + for (int x = 0; x < cblExportColumns.Items.Count; x++) + { + if (cblExportColumns.Items[x].Selected) + { + if (cblExportColumns.Items[x].Value == "BPMBL") + { + excel.SetCellValue(row, col++, "手機一"); + excel.SetCellValue(row, col++, "手機二"); + continue; + } + excel.SetCellValue(row, col++, cblExportColumns.Items[x].Text); + } + } + row++; + + // 內容 + foreach (DataRow r in t.Rows) + { + // BPENO 人員編號 + // BPNME 人員姓名 + // BOGNRX 性別 + // BPIDN 身份證字號 + // BPBDY 出生年月日 + // BPAAA 戶籍地 BPAZC BPACT BPACY BPASA + // BPLLL 現住地 BPLZC BPLCT BPLCY BPLSA + // BPHTL 住家電話 + // BPMBL 手機 + // BPEML 電子郵件 + // BPEM2 電子郵件(薪資單) + // BPSTPX 最高學歷 + // BPSCH 最高學歷學校 + // BPSUB 最高學歷科系 + // BPIDTX 身份類別 + // BPSDY 到職日期 + // BPEDY 離職日期 + // BPBNKX 銀行 + // BPBNK 分行代碼 + // BPACC 帳號 + // RAPYNX 派駐專案 + // RABRHX 站別 + // RAJNOX 職稱 + col = 0; + for (int x = 0; x < cblExportColumns.Items.Count; x++) + { + if (cblExportColumns.Items[x].Selected) + { + if (cblExportColumns.Items[x].Value == "BPAAA") + { + excel.SetCellValue(row, col++, string.Format("{0} {1}{2}{3}", r["BPAZC"], r["BPACT"], r["BPACY"], r["BPASA"])); + continue; + } + if (cblExportColumns.Items[x].Value == "BPLLL") + { + excel.SetCellValue(row, col++, string.Format("{0} {1}{2}{3}", r["BPLZC"], r["BPLCT"], r["BPLCY"], r["BPLSA"])); + continue; + } + if (cblExportColumns.Items[x].Value == "BPMBL") + { + excel.SetCellValue(row, col++, string.Format("{0}", r["BPMB1"])); + excel.SetCellValue(row, col++, string.Format("{0}", r["BPMB2"])); + continue; + } + if (r[cblExportColumns.Items[x].Value] is System.DateTime) + { + excel.SetCellValue(row, col++, string.Format(WGuard1.InvariantCulture, "{0:yyyy/MM/dd}", r[cblExportColumns.Items[x].Value])); + continue; + } + excel.SetCellValue(row, col++, string.Format("{0}", r[cblExportColumns.Items[x].Value])); + } + } + row++; + } + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + ResponseWriteFile(ms, String.Format("人員資料匯出_{0:yyyyMMddHHmmss}.xls", DateTime.UtcNow.AddHours(8))); + } + + protected void btnCancelExport_Click(object sender, EventArgs e) + { + Search(); + GridView1.DataBind(); + MultiView1.ActiveViewIndex = 1; + } + + protected void btnExportSearchProject_Click(object sender, EventArgs e) + { + DateTime date1, date2; + if (!WGuard1.CheckDate(txtExportDate1.Text, out date1)) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "起始日期不正確"; + return; + } + if (!WGuard1.CheckDate(txtExportDate2.Text, out date2)) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "結束日期不正確"; + return; + } + + cblExportProjects.DataSource = new BpaaDAC().GetBpaaWithTYPlusNoneNotCheckYear(date1.Year, date2.Year); + cblExportProjects.DataTextField = "BPPYM"; + cblExportProjects.DataValueField = "BPPYN"; + cblExportProjects.DataBind(); + } + + protected string GetBDPTList() + { + var r = new List(); + foreach (DataRow row in GetListData("BDPT", "").Rows) + { + r.Add(new { BDNUM = row["BDNUM"], BDNAM = row["BDNAM"] }); + } + return Newtonsoft.Json.JsonConvert.SerializeObject(r); + } + + protected void btnBack_Click(object sender, EventArgs e) + { + // txtBPNUM.Text = WDAC.GetStringValue(ViewState["RPENO"]); + ddlBPEDY.SelectedValue = "0"; + Search(); + GridView1.DataBind(); + MultiView1.ActiveViewIndex = 1; + } + + protected void dsBPSNForm_Inserted(object sender, SqlDataSourceStatusEventArgs e) + { + // + } + + protected void btnExportColumnsSelectAll_Click(object sender, EventArgs e) + { + foreach (ListItem item in cblExportColumns.Items) + { + item.Selected = true; + } + } + + protected void btnExportColumnsSelectNone_Click(object sender, EventArgs e) + { + foreach (ListItem item in cblExportColumns.Items) + { + item.Selected = false; + } + } +} diff --git a/Web/forms/worker/fmRTME.ascx b/Web/forms/worker/fmRTME.ascx new file mode 100644 index 0000000..c405e32 --- /dev/null +++ b/Web/forms/worker/fmRTME.ascx @@ -0,0 +1,110 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmRTME.ascx.cs" Inherits="forms_basedata_fmRTME" %> + +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + +人員班表設定 + +
+ + + +
+ + + + + + + + + + +
+ + + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + + + 本月班別: + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ diff --git a/Web/forms/worker/fmRTME.ascx.cs b/Web/forms/worker/fmRTME.ascx.cs new file mode 100644 index 0000000..1f55e73 --- /dev/null +++ b/Web/forms/worker/fmRTME.ascx.cs @@ -0,0 +1,204 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using Wellan.Common; +using Wellan.Data; + +public partial class forms_basedata_fmRTME : Wellan.Web.UI.WUserControlBase +{ + private BtmeDAC Btme; + private RtmeDAC Rtme; + private BhrdDAC Bhrd; + private List BtmeList; + private List RtmeList; + private string monthBhrd; + private string[] holidayData = null; + + protected void Page_Load(object sender, EventArgs e) + { + Btme = new BtmeDAC(Query); + Rtme = new RtmeDAC(Query); + Bhrd = new BhrdDAC(Query); + + if (txtYear.Text == "") + { + txtYear.Text = DateTime.UtcNow.AddHours(8).ToString("yyyy"); + ddlMonth.SelectedValue = DateTime.UtcNow.AddHours(8).ToString("MM"); + Calendar1.VisibleDate = DateTime.UtcNow.AddHours(8).Date; + StoreYYMM(); + } + } + + private void StoreYYMM() + { + hfYear.Value = Calendar1.VisibleDate.ToString("yyyy", WGuard1.InvariantCulture); + hfMonth.Value = Calendar1.VisibleDate.ToString("MM"); + } + + protected void btnGoto_Click(object sender, EventArgs e) + { + Calendar1.VisibleDate = Convert.ToDateTime(txtYear.Text + "/" + ddlMonth.SelectedValue + "/01"); + StoreYYMM(); + } + + protected void btnSave_Click(object sender, EventArgs e) + { + for (int i = 1; i <= 31; i++) + { + if (Request[String.Format("BTME{0:00}", i)] != null) + { + var rttid = WDAC.GetStringValue(Request[String.Format("BTME{0:00}", i)]); + + Rtme.SetDay(UserId, new DateTime(Convert.ToInt32(hfYear.Value), Convert.ToInt32(hfMonth.Value), i), + rttid, UserId); + } + } + + Calendar1.VisibleDate = Convert.ToDateTime(hfYear.Value + "/" + hfMonth.Value + "/01", WGuard1.InvariantCulture); + } + + protected void Calendar1_PreRender(object sender, EventArgs e) + { + // 取得班表資料 + BtmeList = Btme.SelectAll(); + BtmeList.Insert(0, new BtmeItem() + { + BTTID = "", + BTNME = "預設班表", + BTSTM = WGuard1.WSetR("UNRPARTIME", 1), + BTETM = WGuard1.WSetR("UNRPARTIME", 2), + BTRST = WGuard1.WSetR("UNRPARTIME", 3), + BTRED = WGuard1.WSetR("UNRPARTIME", 4) + }); + gvBTME.DataSource = BtmeList; + gvBTME.DataBind(); + + ddBhrd.DataSource = BtmeList; + ddBhrd.DataTextField = "BTTID"; + ddBhrd.DataValueField = "BTTID"; + ddBhrd.DataBind(); + + // 取得員工班表資料 + RtmeList = Rtme.SelectMonth(UserId, Calendar1.VisibleDate); + monthBhrd = Bhrd.GetMonth(Calendar1.VisibleDate.Year, Calendar1.VisibleDate.Month); + + // 取得節假日資料 + holidayData = new BhrdDAC().GetYear(Calendar1.VisibleDate.Year); + } + + protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) + { + e.Cell.Style["padding"] = "3px"; + e.Cell.Style["border"] = "2px solid white"; + + // 非本月,結束處理 + if (e.Day.IsOtherMonth) + return; + + // 本月,清除重畫 + e.Cell.Controls.Clear(); + Label aLabel = new Label(); + aLabel.Text = e.Day.Date.Day.ToString(); + aLabel.Font.Name = "Tahoma"; + aLabel.Font.Size = new FontUnit("16pt"); + aLabel.Font.Bold = true; + aLabel.ForeColor = System.Drawing.Color.Black; + e.Cell.Controls.Add(aLabel); + + // 加入換行的 Literal + Literal aBR = new Literal(); + aBR.Text = "
"; + e.Cell.Controls.Add(aBR); + + //加入 DropDownList 用以挑選班別 + DropDownList aDDL = new DropDownList(); + aDDL.ID = String.Format("BTME{0:00}", e.Day.Date.Day); + aDDL.Style.Add("width", "95%"); + aDDL.Style.Add("top", "2px"); + aDDL.Style.Add("font-size", "9pt"); + + if (monthBhrd == null) + { + if (!e.Day.IsWeekend) + aDDL.CssClass = "NORMAL"; + } + else + { + var d = monthBhrd.Substring(e.Day.Date.Day - 1, 1); + if (d == "-" || d == "B") + aDDL.CssClass = "NORMAL"; + } + + BtmeList.ForEach(btmeItem => + { + aDDL.Items.Add(new ListItem(btmeItem.BTTID, btmeItem.BTTID)); + }); + + var rtmeItem = RtmeList.FirstOrDefault(p => p.RTDAT == e.Day.Date); + if (rtmeItem != null) + { + aDDL.SelectedValue = rtmeItem.RTTID; + } + else + { + aDDL.SelectedValue = ""; + } + + e.Cell.Controls.Add(aDDL); + + var dayType = "-"; + if (holidayData == null) + { + if (e.Day.IsWeekend) + dayType = "H"; + else + dayType = "-"; + } + else + { + dayType = holidayData[e.Day.Date.Month - 1].Substring(e.Day.Date.Day - 1, 1); + } + + switch (dayType) + { + case "-": + e.Cell.BackColor = System.Drawing.Color.White; + break; + case "H": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xFF99CC); + break; + case "B": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xFFFF99); + break; + case "N": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x0099FF); + break; + case "V": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xFF9900); + break; + case "O": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x99CC00); + break; + case "T": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x999999); + break; + case "E": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0xCC7FFF); + break; + case "A": + e.Cell.BackColor = System.Drawing.Color.FromArgb(0x7FCCFF); + break; + } + } + + protected void Calendar1_VisibleMonthChanged(object sender, MonthChangedEventArgs e) + { + txtYear.Text = Calendar1.VisibleDate.ToString("yyyy"); + ddlMonth.SelectedValue = Calendar1.VisibleDate.ToString("MM"); + StoreYYMM(); + } +} \ No newline at end of file diff --git a/Web/forms/worker/fmRbsa.ascx b/Web/forms/worker/fmRbsa.ascx new file mode 100644 index 0000000..bbb3665 --- /dev/null +++ b/Web/forms/worker/fmRbsa.ascx @@ -0,0 +1,211 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmRbsa.ascx.cs" + Inherits="forms_worker_fmRbsa" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> + + + + +
+請注意! +
    +
  • 補休補登作業輸入的補休時數,在請假使用補休時數時,一律優先使用。
  • +
  • 補休補登時數用完之後,才使用加班單累積的補休時數。
  • +
  • 正常狀況請從管理系統的加班處理輸入應累積的補休時數。
  • +
+
+ + + + + + + + + + + + + +
+ + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + + + +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + +   + + + + + + + + +
+ + + + + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
diff --git a/Web/forms/worker/fmRbsa.ascx.cs b/Web/forms/worker/fmRbsa.ascx.cs new file mode 100644 index 0000000..5f4d2d3 --- /dev/null +++ b/Web/forms/worker/fmRbsa.ascx.cs @@ -0,0 +1,203 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; + +/// +/// 年度特休輸入 +/// +public partial class forms_worker_fmRbsa : Wellan.Web.UI.WUserControlBase +{ + private int yy; + + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + txtYear.Focus(); + //if (IsPostBack) + // gvRbsa.DataBind(); + } + + private void 註冊按鈕事件(Control owner) + { + RegisterLookupEvent(owner, "btnRBENO_WQRY", "txtRBENO", + "txtRBENO,lbRBENOX", "BPSN", + "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + ddl專案.SelectedValue + "' AND RANUM=BPENO)", + false); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + } + + protected override void LoadControlState(object savedState) + { + base.LoadControlState(savedState); + 註冊按鈕事件(this); + } + + protected void btnYY_Click(object sender, EventArgs e) + { + yy = WDAC.GetInt32Value(txtYear.Text); + ddl專案.DataSource = new BpaaDAC().GetBpaaWithTY(yy + WGuard1.CY11); + ddl專案.DataTextField = "BPPYM"; + ddl專案.DataValueField = "BPPYN"; + ddl專案.DataBind(); + } + + protected void btnSearch_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + Panel1.Visible = true; + 註冊按鈕事件(this); + gvRbsa.DataBind(); + } + + protected void dsRbsa_Updating(object sender, ObjectDataSourceMethodEventArgs e) + { + e.InputParameters["RBPYN"] = ddl專案.SelectedValue; + e.InputParameters["TRUSR"] = UserId; + } + + protected void gvRbsa_RowCommand(object sender, GridViewCommandEventArgs e) + { + /* + if (e.CommandName == "Save") + { + yy = WDAC.GetInt32Value(txtYear.Text); + int rytot = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("TextBox1") as TextBox).Text); + new RyerDAC(Query).UpdateOne(e.CommandArgument.ToString(), yy + WGuard1.CY11, rytot, UserId); + + gvRbsa.DataBind(); + } + */ + } + + protected void dsRbsa_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + e.InputParameters["RBPYN"] = ddl專案.SelectedValue; + if (e.InputParameters["RBPYN"] == null) + e.InputParameters["RBPYN"] = ""; + } + + protected void btnInsert_Click(object sender, EventArgs e) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + if (txtRBENO.Text.Trim().Length == 0) + { + cvMessage.ErrorMessage = "請輸入人員編號"; + cvMessage.IsValid = false; + return; + } + + DateTime rbdat = txtRBDAT.Value; + if (rbdat.Ticks == 0) + { + cvMessage.ErrorMessage = "請輸入正確的日期"; + cvMessage.IsValid = false; + return; + } + + yy = WDAC.GetInt32Value(txtYear.Text); + if (rbdat.Year != yy + WGuard1.CY11) + { + cvMessage.ErrorMessage = "請輸入與作業年度同年度的日期"; + cvMessage.IsValid = false; + return; + } + + int rbtct; + if (!Int32.TryParse(txtRBTCT.Text, out rbtct)) + { + cvMessage.ErrorMessage = "請輸入正確的時數"; + cvMessage.IsValid = false; + return; + } + + RbsaDAC rbsaDao = new RbsaDAC(Query); + rbsaDao.InsertOne(txtRBENO.Text, ddl專案.SelectedValue, rbdat, rbtct, UserId); + + gvRbsa.DataBind(); + } + + protected void gvRbsa_RowUpdating(object sender, GridViewUpdateEventArgs e) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + if (e.NewValues["RBENO"] == null || e.NewValues["RBENO"].ToString().Trim().Length == 0) + { + cvMessage.ErrorMessage = "請輸入人員編號"; + cvMessage.IsValid = false; + e.Cancel = true; + return; + } + + DateTime rbdat = Convert.ToDateTime(e.NewValues["RBDAT"]); + if (rbdat.Ticks == 0) + { + cvMessage.ErrorMessage = "請輸入正確的日期"; + cvMessage.IsValid = false; + e.Cancel = true; + return; + } + + yy = WDAC.GetInt32Value(txtYear.Text); + if (rbdat.Year != yy + WGuard1.CY11) + { + cvMessage.ErrorMessage = "請輸入與作業年度同年度的日期"; + cvMessage.IsValid = false; + e.Cancel = true; + return; + } + + int rbtct; + if (e.NewValues["RBTCT"] == null || !Int32.TryParse(e.NewValues["RBTCT"].ToString(), out rbtct)) + { + cvMessage.ErrorMessage = "請輸入正確的時數"; + cvMessage.IsValid = false; + e.Cancel = true; + return; + } + + e.NewValues["RBDAT"] = rbdat; + e.NewValues["RBTCT"] = rbtct; + } + + protected void gvRbsa_RowDataBound(object sender, GridViewRowEventArgs e) + { + if (e.Row.RowType == DataControlRowType.DataRow) + 註冊按鈕事件(e.Row.Cells[1]); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected bool CheckProjectRight() + { + // 檢查此使用者是否有權限處理這個專案 + BprmDAC bprm = new BprmDAC(Query); + if (!bprm.GetRight(ddl專案.SelectedValue, UserId)) + { + //MultiView1.Visible = false; + cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + cvMessage.IsValid = false; + return false; + } + return true; + } +} diff --git a/Web/forms/worker/fmRowk.ascx b/Web/forms/worker/fmRowk.ascx new file mode 100644 index 0000000..a0831bc --- /dev/null +++ b/Web/forms/worker/fmRowk.ascx @@ -0,0 +1,754 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmRowk.ascx.cs" Inherits="forms_worker_fmRowk" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + +
+ 年度: +
+ 專案: + + +
+ + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 員工編號: + + + + + + 專案年度編號: + + + + +
+ 月份: +
+ 前二加班時數: + + 後二加班時數: + + 超過8小時加班時數: + + 假日加班時數: +
+ 前二加班費: + + 後二加班費: + + 超過8小時加班費: + + 假日加班費: +
+ 申請補休時數: +
+ 合計加班時數: + + + 合計加班費: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 員工編號: + + + + + + +
+ + + +
+
+ + + 專案年度編號: + + + +
+ 月份: +
+ 前二加班時數: + + 後二加班時數: + + 超過8小時加班時數: + + 假日加班時數: +
+ 申請補休時數: +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 員工編號: + + + + + + +
+ + + +
+
+ + + 專案年度編號: + + + +
+ 月份: +
+ 前二加班時數: + + 後二加班時數: + + 超過8小時加班時數: + + 假日加班時數: +
+ 申請補休時數: +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/Web/forms/worker/fmRowk.ascx.cs b/Web/forms/worker/fmRowk.ascx.cs new file mode 100644 index 0000000..6349c60 --- /dev/null +++ b/Web/forms/worker/fmRowk.ascx.cs @@ -0,0 +1,283 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; + +/// +/// 加班匯總輸入 +/// +public partial class forms_worker_fmRowk : Wellan.Web.UI.WUserControlBase +{ + protected string _ROPYN = ""; + private string _ROENO = ""; + private string _ROYMM = ""; + private int _YY = 0; + + protected void Page_Load(object sender, EventArgs e) + { + _ROENO = ViewState["ROENO"] != null ? ViewState["ROENO"].ToString() : ""; + _ROYMM = ViewState["ROYMM"] != null ? ViewState["ROYMM"].ToString() : ""; + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsROWKForm.ConnectionString = ConnectionString; + dsROWKGrid.ConnectionString = ConnectionString; + + SELECT_SQL = @"SELECT TRDAT, TRMOD, TRUSR, ROENO, ROYMM, ROPYN, + ROT01 / 60 AS ROT01, ROT02 / 60 AS ROT02, ROT03 / 60 AS ROT03, ROT04 / 60 AS ROT04, ROT05 / 60 AS ROT05, + ROA01, ROA02, ROA03, ROA05, APPNO "; + FROM_SQL = " FROM ROWK "; + WHERE_SQL = " WHERE 1=1 "; + ORDER_SQL = " ORDER BY ROYMM, ROENO"; + + this.Form_View = fvROWK; + this.Grid_View = gvROWK; + this.FormView_DataSource = dsROWKForm; + this.GridView_DataSource = dsROWKGrid; + this.Multi_View = MultiView1; + + if (ForwardSource != "") + _ROPYN = GetStringParam("ROPYN"); + _YY = GetIntParam("YY"); + + if (_YY > 0) + { + txtYY.Text = _YY.ToString(); + ddlROPYN.DataSource = new BpaaDAC().GetBpaaWithTY(_YY + WGuard1.CY11); + ddlROPYN.DataBind(); + ListItem item = ddlROPYN.Items.FindByValue(_ROPYN); + if (item != null) + item.Selected = true; + } + else + { + txtYY.Focus(); + } + + MultiView1.Visible = _ROPYN != ""; + + GetGridViewRowColor(gvROWK); + + switch (MultiView1.ActiveViewIndex) + { + case 0: + { + break; + } + case 1: + { + Search(); + break; + } + } + } + + // 查詢按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + ViewState["ROENO"] = txtROENO.Text; + ViewState["ROYMM"] = txtROYMM.Text; + + _ROENO = txtROENO.Text; + _ROYMM = txtROYMM.Text; + + if (_ROENO.Length == 0 && + _ROYMM.Length == 0) + { + cvMessage.ErrorMessage = GetString("NOSRHCOND"); + cvMessage.IsValid = false; + } + else + { + MultiView1.ActiveViewIndex = 1; + + Search(); + + gvROWK.PageIndex = 0; + gvROWK.SelectedIndex = 0; + gvROWK.DataBind(); + } + } + + // 取消查詢按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + MultiView1.ActiveViewIndex = 1; + } + + protected void btnInsert_Click(object sender, EventArgs e) + { + + } + + // 查詢動作 + protected override void Search() + { + base.Search(); + + StringBuilder sql = new StringBuilder(); + sql.Append(SELECT_SQL); + sql.Append(FROM_SQL); + sql.Append(WHERE_SQL); + dsROWKGrid.SelectParameters.Clear(); + AddSearch(sql, dsROWKGrid, "ROPYN", _ROPYN, "", true); + AddSearch(sql, dsROWKGrid, "ROENO", _ROENO, "", true); + DateTime aYYMM; + if (CheckDate(_ROYMM + "01", out aYYMM)) + AddSearch(sql, dsROWKGrid, "ROYMM", aYYMM.ToString(WGuard1.InvariantCulture), "", false); + sql.Append(ORDER_SQL); + dsROWKGrid.SelectCommand = sql.ToString(); + dsROWKForm.SelectCommand = SELECT_SQL + FROM_SQL + " WHERE ROENO=@ROENO AND ROYMM=@ROYMM "; + } + + protected void cvROENO_ServerValidate(object source, ServerValidateEventArgs args) + { + BPSN_DAC bpsn = new BPSN_DAC(WConfig.GetConnectionConfig(), WConfig.GetConnectionConfigName()); + args.IsValid = args.Value != "" && bpsn.IsExist(args.Value, true); + } + + protected void cvROYMM_ServerValidate(object source, ServerValidateEventArgs args) + { + DateTime aYYMM; + args.IsValid = args.Value != "" && CheckDate(args.Value + "01", out aYYMM) && aYYMM.Year == _YY + WGuard1.CY11; + } + + protected void cvROT01_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i >= 0; + } + + protected override void FormView_InsertDataBound(object sender, EventArgs e) + { + base.FormView_InsertDataBound(sender, e); + + if (_ROPYN == "000000001") + RegisterLookupEvent(fvROWK, "btnROWK_ROENO_WQRY", "txtROWK_ROENO", "txtROWK_ROENO,lbROWK_ROENOX", "BPSN1", "NOT EXISTS (SELECT RANUM FROM RASN WHERE RANUM=BPENO AND RAEDT IS NULL)"); + else + RegisterLookupEvent(fvROWK, "btnROWK_ROENO_WQRY", "txtROWK_ROENO", "txtROWK_ROENO,lbROWK_ROENOX", "BPSN1", "BPENO IN (SELECT RANUM FROM RASN WHERE RAPYN='" + _ROPYN + "')"); + (fvROWK.FindControl("txtROWK_ROYMM") as ITextControl).Text = DateTime.UtcNow.AddHours(8).ToString("yyyyMM"); + (fvROWK.FindControl("txtROWK_ROT01") as ITextControl).Text = "0"; + (fvROWK.FindControl("txtROWK_ROT02") as ITextControl).Text = "0"; + (fvROWK.FindControl("txtROWK_ROT03") as ITextControl).Text = "0"; + (fvROWK.FindControl("txtROWK_ROT04") as ITextControl).Text = "0"; + (fvROWK.FindControl("txtROWK_ROT05") as ITextControl).Text = "0"; + SetClientFocus(fvROWK, "txtROWK_ROENO"); + } + + protected override void FormView_EditDataBound(object sender, EventArgs e) + { + base.FormView_EditDataBound(sender, e); + + if (_ROPYN == "000000001") + RegisterLookupEvent(fvROWK, "btnROWK_ROENO_WQRY", "txtROWK_ROENO", "txtROWK_ROENO,lbROWK_ROENOX", "BPSN1", "NOT EXISTS (SELECT RANUM FROM RASN WHERE RANUM=BPENO AND RAEDT IS NULL)"); + else + RegisterLookupEvent(fvROWK, "btnROWK_ROENO_WQRY", "txtROWK_ROENO", "txtROWK_ROENO,lbROWK_ROENOX", "BPSN1", "BPENO IN (SELECT RANUM FROM RASN WHERE RAPYN='" + _ROPYN + "')"); + SetClientFocus(fvROWK, "txtROWK_ROENO"); + } + + protected override void FormView_ItemCommand(object sender, FormViewCommandEventArgs e) + { + base.FormView_ItemCommand(sender, e); + + switch (e.CommandName) + { + case "Search": + SetClientFocus(txtROENO); + break; + } + } + + protected override void CalcFields(SqlDataSourceCommandEventArgs e) + { + base.CalcFields(e); + + // 由日期 + 人員,取得時薪、前二加班、後二加班、假日加班比例 + DateTime aYYMM; + CheckDate(e.Command.Parameters["@ROYMM"].Value.ToString() + "01", out aYYMM); + e.Command.Parameters["@ROYMM"].Value = aYYMM; + + string roeno = e.Command.Parameters["@ROENO"].Value.ToString(); + + int bpsrm; + int bpp02; + double bpbft; + double bpaft; + double bphol; + string bpovr; + string bplve; + string bpott; + + GetData gd = new GetData(); + gd.Query = Query; + gd.GetRASN_DateRange_Bppyn_Bpeno_Overwork_Rate(aYYMM, aYYMM.AddMonths(1).AddDays(-1), _ROPYN, roeno, + out bpsrm, out bpp02, out bpbft, out bpaft, out bphol, out bpovr, out bplve, out bpott); + + // 計算加班費 + e.Command.Parameters["@ROA01"].Value = ExtraWork.CalculateOverTimeInt(bpsrm, bpp02, Convert.ToInt32(e.Command.Parameters["@ROT01"].Value) * 60, bpbft, bpovr, bpott); + e.Command.Parameters["@ROA02"].Value = ExtraWork.CalculateOverTimeInt(bpsrm, bpp02, Convert.ToInt32(e.Command.Parameters["@ROT02"].Value) * 60, bpaft, bpovr, bpott); + e.Command.Parameters["@ROA03"].Value = ExtraWork.CalculateOverTimeInt(bpsrm, bpp02, Convert.ToInt32(e.Command.Parameters["@ROT03"].Value) * 60, bphol, bpovr, bpott); + e.Command.Parameters["@ROA05"].Value = ExtraWork.CalculateOverTimeInt(bpsrm, bpp02, Convert.ToInt32(e.Command.Parameters["@ROT05"].Value) * 60, bpaft + 1, bpovr, bpott); + } + + protected override void FormView_ItemInserting(object sender, FormViewInsertEventArgs e) + { + base.FormView_ItemInserting(sender, e); + } + + protected override void FormView_DataSource_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + e.Command.Parameters["@ROPYN"].Value = _ROPYN; + base.FormView_DataSource_Inserting(sender, e); + } + + protected void Next_Click(object sender, EventArgs e) + { + ParamList["ROPYN"] = ddlROPYN.SelectedValue; + DoAfterCommand("ROWK"); + } + + protected override void GridView_DataSource_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + base.GridView_DataSource_Selected(sender, e); + + if (e.AffectedRows == 0) + { + if (MultiView1.ActiveViewIndex != 0) + { + gvROWK.Visible = false; + fvROWK.ChangeMode(FormViewMode.Insert); + FormView_ModeChanged(sender, e); + } + } + } + + protected void btnYY_Click(object sender, EventArgs e) + { + int year; + if (!Int32.TryParse(txtYY.Text.Trim(), out year)) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "請輸入正確的年度"; + return; + } + + MultiView1.Visible = false; + ParamList["YY"] = year; + ParamList["ROPYN"] = ""; + DoAfterCommand("ROWK"); + } +} diff --git a/Web/forms/worker/fmRpar.ascx b/Web/forms/worker/fmRpar.ascx new file mode 100644 index 0000000..31bf2f9 --- /dev/null +++ b/Web/forms/worker/fmRpar.ascx @@ -0,0 +1,2069 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmRpar.ascx.cs" Inherits="forms_worker_fmRpar" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 年度: +
+ 專案: + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+
+ + + + + + +
+ + + +
+
+
+ 日期: + + + + + +
+ + + +
+
+ + + + + +
+ + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ + + 請假類別: + +
+ 開始日期: + + + + + +
+ + + +
+
+ 結束日期: + + + + + +
+ + + +
+
+ 時數: + +
+ 備註: +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ + + 請假類別: + +
+ 開始日期: + + + + + +
+ + + +
+
+ 結束日期: + + + + + +
+ + + +
+
+ 時數: +
+ 備註: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 請假類別: + +
+ 開始日期: + + 結束日期: + + 時數: + + 金額: +
+ 備註: +
+ + +
+
+ +
+ + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ + + 請假類別: + +
+ 開始日期: + + + + + +
+ + + + +
+
+ 加班時數: + + + +
+ 備註: + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ + + 加班類別: + +
+ 日期: + + + + + +
+ + + +
+
+ 加班時數: + + + +
+ 備註: +
+
+ + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 加班類別: + +
+ 日期: + + 加班時數: + + + + + 金額: +
+ 備註: +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ +
+ 年月: + + 電話費: +
+ 備註: +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ +
+ 年月: + + 電話費: +
+ 備註: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + +
+ 年月: + + 電話費: +
+ 備註: +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ +
+ 年月: + + 公里數: +
+ 備註: +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ +
+ 年月: + + 公里數: +
+ 備註: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + +
+ 年月: + + 公里數: + + + 費用: +
+ 備註: +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ + + 差勤類別: + +
+ 開始日期: + + + + + +
+ + + +
+
+ 結束日期: + + + + + +
+ + + +
+
+ 差旅費: +
+ 備註: +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+ + + 差勤類別: + +
+ 開始日期: + + + + + +
+ + + +
+
+ 結束日期: + + + + + +
+ + + +
+
+ 差旅費: +
+ 備註: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 差勤類別: + +
+ 開始日期: + + 結束日期: + + 差旅費: +
+ 備註: +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<%-- + + --%> + + + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/Web/forms/worker/fmRpar.ascx.cs b/Web/forms/worker/fmRpar.ascx.cs new file mode 100644 index 0000000..f136e99 --- /dev/null +++ b/Web/forms/worker/fmRpar.ascx.cs @@ -0,0 +1,1006 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; + +/// +/// 人員出缺勤紀錄 +/// 請假處理 +/// 加班處理 +/// 電話費處理 +/// 油料費處理 +/// 差勤處理 +/// +public partial class forms_worker_fmRpar : Wellan.Web.UI.WUserControlBase +{ + private string _RPPYN = ""; + private string _RPNUM1 = ""; + private string _RPNUM2 = ""; + private string _RPRDT1 = ""; + private string _RPRDT2 = ""; + private int _YY = 0; + private string select = + @"SELECT TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, RPTYP, FLOOR(RPTCT / 60) AS RPTCT, RPFTR, RPDOC, + APPNO, RPAPP, RPAPD, RPAPU, RPADT, RPAPN, RPANO, RPAGT, RPRTM, RPETM, RPUST, RPTC1, RPTC2, RPTC3, + RPRSN, RPAGM, ISNULL(RPTCT - FLOOR(RPTCT / 60) * 60, 0) AS RPTMT"; + private string from = " FROM RPAR "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY RPREN"; + private FormView RPARForm; + private Panel RPARPanel; + protected string rparType; + private BPSN_DAC bpsn; + private int 可用補休; + private int 可用特休; + private RparDAC rparDao; + private RyerDAC ryerDao; + private DbConnection conn; + private string _RPREN; + private string oldRPTYP; + private GetData _getData; + private DateTime 關帳日期; + + protected bool OverTimeToMinute; + + protected void Page_Load(object sender, EventArgs e) + { + _RPNUM1 = ViewState["RPNUM1"] != null ? ViewState["RPNUM1"].ToString() : ""; + _RPNUM2 = ViewState["RPNUM2"] != null ? ViewState["RPNUM2"].ToString() : ""; + _RPRDT1 = ViewState["RPRDT1"] != null ? ViewState["RPRDT1"].ToString() : ""; + _RPRDT2 = ViewState["RPRDT2"] != null ? ViewState["RPRDT2"].ToString() : ""; + + //if (IsPostBack) + //{ + // RPARGrid.DataBind(); + //} + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsRPARForm.ConnectionString = ConnectionString; + dsRPARGrid.ConnectionString = ConnectionString; + dsRPAR_RPTYP.ConnectionString = ConnectionString; + + rparDao = new RparDAC(Query); + ryerDao = new RyerDAC(Query); + + _RPPYN = GetStringParam("RPPYN"); + rparType = GetStringParam("type"); + dsRPAR_RPTYP.SelectParameters["BSCLS"].DefaultValue = rparType + "%"; + _YY = GetIntParam("YY"); + + switch (rparType) + { + case RPAR_TYPE.T0_請假: + RPARForm = RPARForm0; + RPARPanel = Panel0; + break; + case RPAR_TYPE.T1_加班: + RPARForm = RPARForm1; + RPARPanel = Panel1; + break; + case RPAR_TYPE.T21_電話費: + RPARForm = RPARForm21; + RPARPanel = Panel21; + break; + case RPAR_TYPE.T22_油料費: + RPARForm = RPARForm22; + RPARPanel = Panel22; + break; + case RPAR_TYPE.T3_出差: + RPARForm = RPARForm3; + RPARPanel = Panel3; + break; + } + + if (_YY > 0) + { + txtYY.Text = _YY.ToString(); + ddlRPPYN.DataSource = new BpaaDAC().GetBpaaWithTY(_YY + WGuard1.CY11); + ddlRPPYN.DataBind(); + ListItem item = ddlRPPYN.Items.FindByValue(_RPPYN); + if (item != null) + item.Selected = true; + } + else + { + txtYY.Focus(); + } + + GetGridViewRowColor(RPARGrid); + + if (_RPPYN.CompareTo("000000001") == 0) + { + RegisterLookupEvent(this, "btnRPAR_RPNUM1_WQRY", "txtRPAR_RPNUM1", "txtRPAR_RPNUM1,lbRPAR_RPNUM1X", "BPSN1", "NOT EXISTS (SELECT RANUM FROM RASN WHERE RANUM=BPENO AND RAEDT IS NULL)"); + RegisterLookupEvent(this, "btnRPAR_RPNUM2_WQRY", "txtRPAR_RPNUM2", "txtRPAR_RPNUM2,lbRPAR_RPNUM2X", "BPSN1", "NOT EXISTS (SELECT RANUM FROM RASN WHERE RANUM=BPENO AND RAEDT IS NULL)"); + } + else + { + RegisterLookupEvent(this, "btnRPAR_RPNUM1_WQRY", "txtRPAR_RPNUM1", "txtRPAR_RPNUM1,lbRPAR_RPNUM1X", "BPSN1", "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)"); + RegisterLookupEvent(this, "btnRPAR_RPNUM2_WQRY", "txtRPAR_RPNUM2", "txtRPAR_RPNUM2,lbRPAR_RPNUM2X", "BPSN1", "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)"); + } + RegisterCalendarEvent(this, "btnRPAR_RPRDT1_DATE", "txtRPAR_RPRDT1"); + RegisterCalendarEvent(this, "btnRPAR_RPRDT2_DATE", "txtRPAR_RPRDT2"); + + MultiView1.Visible = _RPPYN != ""; + + // 取得關帳日期 + if (_RPPYN != "") + { + if (_RPPYN.CompareTo("000000001") != 0) + { + _getData = new GetData(); + _getData.Query = Query; + BPAARecord bpaaRecord = new BPAARecord(); + DataTable bpaa = _getData.GetBPAA_BPPYN(_RPPYN); + if (bpaa.Rows.Count == 0) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "無此專案"; + return; + } + bpaaRecord.FillRecord(bpaa.Rows[0]); + // 關帳日期 = bpaaRecord.BPMSD.AddMonths(1).AddDays(-1); + 關帳日期 = bpaaRecord.BPMSD; + OverTimeToMinute = bpaaRecord.BPOTT == "2"; + } + } + + Search(); + } + + // 查詢按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + ViewState["RPNUM1"] = txtRPAR_RPNUM1.Text; + ViewState["RPNUM2"] = txtRPAR_RPNUM2.Text; + ViewState["RPRDT1"] = txtRPAR_RPRDT1.Text; + ViewState["RPRDT2"] = txtRPAR_RPRDT2.Text; + + _RPNUM1 = txtRPAR_RPNUM1.Text; + _RPNUM2 = txtRPAR_RPNUM2.Text; + _RPRDT1 = txtRPAR_RPRDT1.Text; + _RPRDT2 = txtRPAR_RPRDT2.Text; + + if (_RPNUM1.Length == 0 && + _RPNUM2.Length == 0 && + _RPRDT1.Length == 0 && + _RPRDT2.Length == 0) + { + lbMessage.Text = GetString("NOSRHCOND"); + lbMessage.Visible = true; + } + else + { + MultiView1.ActiveViewIndex = 1; + + Search(); + + RPARGrid.PageIndex = 0; + RPARGrid.SelectedIndex = 0; + RPARGrid.DataBind(); + } + } + + // 查詢取消按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + MultiView1.ActiveViewIndex = 1; + } + + // 查詢動作 + private new void Search() + { + if (MultiView1.ActiveViewIndex == 1) + { + where = " WHERE ((RPAPN IS NULL) OR ((RPAPN<>'D') AND (RPAPN=RPANO))) "; + // where = " WHERE 1=1 "; + switch (rparType) + { + case RPAR_TYPE.T0_請假: + WLabel1.Text = GetString("FMRPAR00.NAME"); + where += " AND RPTYP LIKE '0%' "; + RPARForm = RPARForm0; + RPARPanel = Panel0; + RPARGrid.Columns[3].HeaderText = "開始日期"; + (RPARGrid.Columns[3] as BoundField).DataFormatString = "{0:yyyyMMdd}"; + RPARGrid.Columns[4].HeaderText = "結束日期"; + RPARGrid.Columns[4].Visible = true; + RPARGrid.Columns[6].HeaderText = "時數"; + RPARGrid.Columns[6].Visible = true; + RPARGrid.Columns[7].Visible = false; + break; + case RPAR_TYPE.T1_加班: + WLabel1.Text = GetString("FMRPAR01.NAME"); + where += " AND RPTYP LIKE '1%' "; + RPARForm = RPARForm1; + RPARPanel = Panel1; + RPARGrid.Columns[3].HeaderText = "日期"; + (RPARGrid.Columns[3] as BoundField).DataFormatString = "{0:yyyyMMdd}"; + RPARGrid.Columns[4].HeaderText = "日期"; + RPARGrid.Columns[4].Visible = false; + RPARGrid.Columns[6].HeaderText = "時數"; + RPARGrid.Columns[6].Visible = true; + RPARGrid.Columns[7].HeaderText = "加班費"; + RPARGrid.Columns[7].Visible = true; + break; + case RPAR_TYPE.T21_電話費: + WLabel1.Text = GetString("FMRPAR021.NAME"); + where += " AND RPTYP = '21' "; + RPARForm = RPARForm21; + RPARPanel = Panel21; + RPARGrid.Columns[3].HeaderText = "年月"; + (RPARGrid.Columns[3] as BoundField).DataFormatString = "{0:yyyyMM}"; + RPARGrid.Columns[4].HeaderText = "年月"; + RPARGrid.Columns[4].Visible = false; + RPARGrid.Columns[6].Visible = false; + RPARGrid.Columns[7].HeaderText = "電話費"; + RPARGrid.Columns[7].Visible = true; + break; + case RPAR_TYPE.T22_油料費: + WLabel1.Text = GetString("FMRPAR022.NAME"); + where += " AND RPTYP = '22' "; + RPARForm = RPARForm22; + RPARPanel = Panel22; + RPARGrid.Columns[3].HeaderText = "年月"; + (RPARGrid.Columns[3] as BoundField).DataFormatString = "{0:yyyyMM}"; + RPARGrid.Columns[4].HeaderText = "年月"; + RPARGrid.Columns[4].Visible = false; + RPARGrid.Columns[6].HeaderText = "公里數"; + RPARGrid.Columns[6].Visible = true; + RPARGrid.Columns[7].HeaderText = "費用"; + RPARGrid.Columns[7].Visible = true; + break; + case RPAR_TYPE.T3_出差: + WLabel1.Text = GetString("FMRPAR03.NAME"); + where += " AND RPTYP LIKE '3%' "; + RPARForm = RPARForm3; + RPARPanel = Panel3; + RPARGrid.Columns[3].HeaderText = "開始日期"; + (RPARGrid.Columns[3] as BoundField).DataFormatString = "{0:yyyyMMdd}"; + RPARGrid.Columns[4].HeaderText = "結束日期"; + RPARGrid.Columns[4].Visible = true; + RPARGrid.Columns[6].Visible = false; + RPARGrid.Columns[7].HeaderText = "差旅費"; + RPARGrid.Columns[7].Visible = true; + break; + } + RPARPanel.Visible = true; + // RPARForm.Visible = true; + } + + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsRPARGrid.SelectParameters.Clear(); + + DateTime RPRDT1, RPRDT2; + CheckDate(_RPRDT1, out RPRDT1); + CheckDate(_RPRDT2, out RPRDT2); + + AddSearch(sql, dsRPARGrid, "RPPYN", _RPPYN, "", false); + AddSearch(sql, dsRPARGrid, "RPNUM", _RPNUM1, _RPNUM2, true); + AddSearch(sql, dsRPARGrid, "RPRDT", RPRDT1, RPRDT2, true); + sql.Append(order); + dsRPARGrid.SelectCommand = sql.ToString(); + + dsRPARForm.SelectCommand = select + from + " WHERE RPREN=@RPREN "; + } + + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + /* + // 藉由人員編號以及日期,找出相應的派遣紀錄,填入相關欄位 + DbCommand cmd = Query.NewCommand("SELECT TOP 1 RAITM, RACNM, RAPYN FROM RASN WHERE RANUM=@RPNUM AND ((RASDT <= @RPRDT AND RAEDT >= @RPRDT) OR (RASDT <= @RPRDT AND RAEDT IS NULL)) ORDER BY RAITM"); + cmd.Parameters.Add(Query.NewParameter("RPNUM", e.Command.Parameters["@RPNUM"].Value)); + cmd.Parameters.Add(Query.NewParameter("RPRDT", e.Command.Parameters["@RPRDT"].Value)); + DataTable rasn = Query.Select(cmd); + if (rasn.Rows.Count > 0) + { + e.Command.Parameters["@RAITM"].Value = rasn.Rows[0]["RAITM"]; + e.Command.Parameters["@RPCNM"].Value = rasn.Rows[0]["RACNM"]; + e.Command.Parameters["@RPPYN"].Value = rasn.Rows[0]["RAPYN"]; + } + */ + + // 畫面上選哪一個專案,就填哪一個專案 + e.Command.Parameters["@RPPYN"].Value = _RPPYN; + + // 電話費、油料費,填入類別 + if (rparType.StartsWith("2")) + e.Command.Parameters["@RPTYP"].Value = rparType; + + // 取出計算需要的資料 + string rpnum = e.Command.Parameters["@RPNUM"].Value.ToString(); + string rptyp = e.Command.Parameters["@RPTYP"].Value.ToString(); + + // 時數存成分鐘,油料費除外 + int rptct = 0; + if (rparType == RPAR_TYPE.T22_油料費) + { + rptct = Convert.ToInt32(e.Command.Parameters["@RPTCT"].Value); + } + else if (rparType == RPAR_TYPE.T1_加班) + { + rptct = Convert.ToInt32(e.Command.Parameters["@RPTCT"].Value) * 60 + Convert.ToInt32(e.Command.Parameters["@RPTMT"].Value); + } + else + { + rptct = Convert.ToInt32(e.Command.Parameters["@RPTCT"].Value) * 60; + } + e.Command.Parameters["@RPTCT"].Value = rptct; + + int rpftr = Convert.ToInt32(e.Command.Parameters["@RPFTR"].Value); + DateTime rprdt = Convert.ToDateTime(e.Command.Parameters["@RPRDT"].Value); + GetData calc = new GetData(); + calc.Query = Query; + int bpsrm; + int bpp02; + double bpbft; + double bpaft; + double bphol; + string bpovr; + string bplve; + string bpott; + + calc.GetRASN_Date_Bppyn_Bpeno_Overwork_Rate(rprdt, _RPPYN, rpnum, out bpsrm, out bpp02, out bpbft, out bpaft, out bphol, out bpovr, out bplve, out bpott); + + switch (rparType) + { + case RPAR_TYPE.T0_請假: // 請假,要計算缺勤扣款 + Absent absent = new Absent(); + absent.bpsrm = bpsrm; + absent.bpp02 = bpp02; + absent.Formula = bplve; + e.Command.Parameters["@RPFTR"].Value = absent.Add(rptyp, rptct); + + break; + case RPAR_TYPE.T1_加班: // 加班,要計算加班費 + ExtraWork extraWork = new ExtraWork(); + + // 區分前二加班、後二加班、假日加班 + int rptc1; + int rptc2; + int rptc3; + int rptc4; + int rptc5; + extraWork.SplitOverTime(rptyp, rptct, 0, out rptc1, out rptc2, out rptc3, out rptc4, out rptc5); + extraWork.Add(rptyp, rprdt, rptct, bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott, rptc1, rptc2, rptc3, rptc4, rptc5); + + e.Command.Parameters["@RPTC1"].Value = rptc1; + e.Command.Parameters["@RPTC2"].Value = rptc2; + e.Command.Parameters["@RPTC3"].Value = rptc3; + e.Command.Parameters["@RPTC4"].Value = rptc4; + e.Command.Parameters["@RPTC5"].Value = rptc5; + + e.Command.Parameters["@RPFTR"].Value = + extraWork.RPTA1 + extraWork.RPTA2 + extraWork.RPTA3 + extraWork.RPTA4 + extraWork.RPTA5; + break; + case RPAR_TYPE.T22_油料費: // 油料費,要計算補助金額 + OtherFee otherFee = new OtherFee(); + otherFee.Add(rptyp, rptct, rpftr); + e.Command.Parameters["@RPFTR"].Value = otherFee.FuelFee; + break; + case RPAR_TYPE.T3_出差: + break; + } + } + + protected void dsRPARForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + + if (e.Cancel) + { + return; + } + + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(); + try + { + e.Command.Connection = conn; + e.Command.Transaction = tran; + + // 產生新的單號 + // 產生新的單號 + _RPREN = WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "RPAR", "RPREN", "YYYYMM<9999>", ""); + string RPNUM = WDAC.GetStringValue(e.Command.Parameters["@RPNUM"].Value); + + e.Command.Parameters["@RPREN"].Value = _RPREN; + + // 如果是請假 + /* + if (rparType == "0") + { + switch (WDAC.GetStringValue(e.Command.Parameters["@RPTYP"].Value)) + { + // 補休 + case "00": + e.Command.Parameters["@RPDOC"].Value = + rparDao.沖補休(tran, + _RPREN, + RPNUM, + WDAC.GetDateTimeValue(e.Command.Parameters["@RPRDT"].Value), + WDAC.GetInt32Value(e.Command.Parameters["@RPTCT"].Value)); + break; + // 特休 + case "01": + ryerDao.沖特休(RPNUM, WDAC.GetDateTimeValue(e.Command.Parameters["@RPRDT"].Value).Year, + WDAC.GetInt32Value(e.Command.Parameters["@RPTCT"].Value), tran); + break; + } + } + */ + } + catch + { + tran.Rollback(); + tran = null; + e.Cancel = true; + throw; + } + } + + protected void dsRPARForm_Inserted(object sender, SqlDataSourceStatusEventArgs e) + { + if (tran != null) + { + tran.Commit(); + tran = null; + } + + if (conn != null && conn.State == ConnectionState.Open) + { + conn.Close(); + conn.Dispose(); + conn = null; + } + } + + protected void dsRPARForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + if (e.Cancel) + return; + + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(); + try + { + e.Command.Connection = conn; + e.Command.Transaction = tran; + + _RPREN = WDAC.GetStringValue(e.Command.Parameters["@RPREN"].Value); + string 新類別 = WDAC.GetStringValue(e.Command.Parameters["@RPTYP"].Value); + DateTime 新日期 = WDAC.GetDateTimeValue(e.Command.Parameters["@RPRDT"].Value); + string 新User = WDAC.GetStringValue(e.Command.Parameters["@RPNUM"].Value); + int 新時數 = WDAC.GetInt32Value(e.Command.Parameters["@RPTCT"].Value); + + // 如果是請假 + /* + if (rparType == "0") + { + // 舊資料如果是補休,要取消沖補休 + if (oldRPTYP == "00") + { + rparDao.取消沖補休(tran, _RPREN); + } + + // 舊資料如果是特休,要取消沖特休 + if (oldRPTYP == "01") + { + ryerDao.取消沖特休(tran, _RPREN); + } + + // 新資料如果是補休,要沖補休 + if (新類別 == "00") + { + e.Command.Parameters["@RPDOC"].Value = + rparDao.沖補休(tran, _RPREN, 新User, 新日期, 新時數); + } + + // 新資料如果是特休,要沖特休 + if (新類別 == "01") + { + ryerDao.沖特休(新User, 新日期.Year, 新時數, tran); + } + } + */ + } + catch + { + tran.Rollback(); + tran = null; + e.Cancel = true; + throw; + } + } + + protected void dsRPARForm_Updated(object sender, SqlDataSourceStatusEventArgs e) + { + if (tran != null) + { + tran.Commit(); + tran = null; + } + + if (conn != null && conn.State == ConnectionState.Open) + { + conn.Close(); + conn.Dispose(); + conn = null; + } + } + + protected void dsRPARForm_Deleting(object sender, SqlDataSourceCommandEventArgs e) + { + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(); + try + { + e.Command.Connection = conn; + e.Command.Transaction = tran; + + string oldrpren = WDAC.GetStringValue(e.Command.Parameters["@OLD_RPREN"].Value); + oldRPTYP = WDAC.GetStringValue(Query.ExecuteScalar("SELECT RPTYP FROM RPAR WHERE RPREN='" + oldrpren + "'", tran)); + + // 如果是請假 + /* + if (rparType == "0") + { + // 舊資料如果是補休,要取消沖補休 + if (oldRPTYP == "00") + { + rparDao.取消沖補休(tran, oldrpren); + } + + // 舊資料如果是特休,要取消沖特休 + if (oldRPTYP == "01") + { + ryerDao.取消沖特休(tran, oldrpren); + } + } + */ + } + catch + { + tran.Rollback(); + tran = null; + e.Cancel = true; + throw; + } + } + + protected void dsRPARForm_Deleted(object sender, SqlDataSourceStatusEventArgs e) + { + if (tran != null) + { + tran.Commit(); + tran = null; + } + + if (conn != null && conn.State == ConnectionState.Open) + { + conn.Close(); + conn.Dispose(); + conn = null; + } + } + + protected void RPARGrid_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (RPARGrid.Rows.Count > 0) + { + if (RPARGrid.SelectedIndex == -1) + RPARGrid.SelectedIndex = 0; + if (RPARGrid.SelectedIndex > RPARGrid.Rows.Count - 1) + RPARGrid.SelectedIndex = RPARGrid.Rows.Count - 1; + RPARForm.DataBind(); + } + } + + protected void RPARGrid_PageIndexChanged(object sender, EventArgs e) + { + Search(); + RPARGrid.SelectedIndex = 0; + RPARGrid.DataBind(); + } + + protected void dsRPARGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + switch (MultiView1.ActiveViewIndex) + { + case 0: + lbMessage.Text = GetString("NODATA"); + lbMessage.Visible = true; + break; + case 1: + RPARForm.ChangeMode(FormViewMode.Insert); + RPARForm_ModeChanged(sender, e); + break; + } + } + } + + protected void RPARForm_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Insert": + break; + case "Edit": + break; + case "Search": + MultiView1.ActiveViewIndex = 0; + break; + case "Cancel": + Search(); + RPARForm.ChangeMode(FormViewMode.ReadOnly); + RPARForm_ModeChanged(sender, e); + break; + } + } + + protected void RPARForm_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + RPARGrid.DataBind(); + if (RPARGrid.SelectedIndex > RPARGrid.Rows.Count - 1) + { + RPARGrid.SelectedIndex = RPARGrid.Rows.Count - 1; + RPARGrid.DataBind(); + } + RPARForm.DataBind(); + } + + protected void RPARForm_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void RPARForm_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void RPARForm_ModeChanged(object sender, EventArgs e) + { + switch (RPARForm.CurrentMode) + { + case FormViewMode.ReadOnly: + RPARGrid.Visible = true; + RPARGrid.DataBind(); + if (RPARGrid.Rows.Count > 0) + { + if (RPARGrid.SelectedIndex == -1) + { + RPARGrid.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert) + { + RPARGrid.PageIndex = RPARGrid.PageCount - 1; + RPARGrid.DataBind(); + RPARGrid.SelectedIndex = RPARGrid.Rows.Count - 1; + } + RPARGrid.DataBind(); + RPARForm.DataBind(); + } + break; + + case FormViewMode.Edit: + RPARGrid.Visible = false; + break; + + case FormViewMode.Insert: + RPARGrid.Visible = false; + break; + } + } + + protected void RPARForm_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + private void GetHours(string user, DateTime rprdt) + { + 可用補休 = rparDao.Get可用補休(user, rprdt); + 可用特休 = ryerDao.Get可用特休(user, rprdt.Year, rprdt.Month, rprdt.Day); + } + + protected void RPARForm_DataBound(object sender, EventArgs e) + { + switch (RPARForm.CurrentMode) + { + case FormViewMode.Edit: + if (_RPPYN.CompareTo("000000001") == 0) + { + RegisterLookupEvent(RPARForm, "btnRPAR_RPNUM_WQRY", "txtRPAR_RPNUM", "txtRPAR_RPNUM,lbRPAR_RPNUMX", "BPSN1", "NOT EXISTS (SELECT RANUM FROM RASN WHERE RANUM=BPENO AND RAEDT IS NULL)"); + } + else + { + RegisterLookupEvent(RPARForm, "btnRPAR_RPNUM_WQRY", "txtRPAR_RPNUM", "txtRPAR_RPNUM,lbRPAR_RPNUMX", "BPSN1", "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)"); + } + RegisterCalendarEvent(RPARForm, "btnRPAR_RPRDT_DATE", "txtRPAR_RPRDT"); + RegisterCalendarEvent(RPARForm, "btnRPAR_RPEDT_DATE", "txtRPAR_RPEDT"); + SetClientFocus(RPARForm, "txtRPAR_RPRDT"); + break; + case FormViewMode.Insert: + if (_RPPYN.CompareTo("000000001") == 0) + { + RegisterLookupEvent(RPARForm, "btnRPAR_RPNUM_WQRY", "txtRPAR_RPNUM", "txtRPAR_RPNUM,lbRPAR_RPNUMX", "BPSN1", "NOT EXISTS (SELECT RANUM FROM RASN WHERE RANUM=BPENO AND RAEDT IS NULL)"); + } + else + { + RegisterLookupEvent(RPARForm, "btnRPAR_RPNUM_WQRY", "txtRPAR_RPNUM", "txtRPAR_RPNUM,lbRPAR_RPNUMX", "BPSN1", "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)"); + } + RegisterCalendarEvent(RPARForm, "btnRPAR_RPRDT_DATE", "txtRPAR_RPRDT"); + RegisterCalendarEvent(RPARForm, "btnRPAR_RPEDT_DATE", "txtRPAR_RPEDT"); + switch (rparType) + { + case RPAR_TYPE.T0_請假: + (RPARForm.FindControl("txtRPAR_RPTCT") as ITextControl).Text = "0"; + break; + case RPAR_TYPE.T1_加班: + (RPARForm.FindControl("txtRPAR_RPTCT") as ITextControl).Text = "0"; + (RPARForm.FindControl("txtRPAR_RPTMT") as ITextControl).Text = "0"; + break; + case RPAR_TYPE.T21_電話費: + (RPARForm.FindControl("txtRPAR_RPFTR") as ITextControl).Text = "0"; + break; + case RPAR_TYPE.T22_油料費: + (RPARForm.FindControl("txtRPAR_RPTCT") as ITextControl).Text = "0"; + break; + case RPAR_TYPE.T3_出差: + (RPARForm.FindControl("txtRPAR_RPFTR") as ITextControl).Text = "0"; + break; + } + SetClientFocus(RPARForm, "txtRPAR_RPNUM"); + break; + } + } + + protected void RPARGrid_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(RPARGrid, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void RPARGrid_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in RPARGrid.Rows) + SetGridViewMouseBehavier(RPARGrid, row); + } + + protected void RPARForm_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + DateTime rprdt; + DateTime rpedt; + CheckDate(WDAC.GetStringValue(e.Values["RPRDT"]), out rprdt); + CheckDate(WDAC.GetStringValue(e.Values["RPEDT"]), out rpedt); + + // 刪除前檢查 + // 已關帳不可刪除 + if (!CheckCloseAccount(rprdt, rpedt)) + { + e.Cancel = true; + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "已關帳,不可刪除"; + } + } + + protected override bool CheckInput(System.Collections.Specialized.IOrderedDictionary values) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + BhrdDAC bhrd = new BhrdDAC(); + + bool result = true; + string rptyp = WDAC.GetStringValue(values["RPTYP"]); + + switch (rparType) + { + case RPAR_TYPE.T0_請假: // 請假 + int rptct = WDAC.GetInt32Value(values["RPTCT"]); + + values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的開始日期", ref result, cvMessage); + values["RPEDT"] = CheckDate(values["RPEDT"], "請輸入正確的結束日期", ref result, cvMessage); + if (result && Convert.ToDateTime(values["RPRDT"]).CompareTo(values["RPEDT"]) > 0) + { + result = false; + cvMessage.ErrorMessage += "開始日期 不可大於 結束日期"; + cvMessage.IsValid = false; + } + if (rptyp != RPAR_TYPE.T05_產假 && bhrd.IsHoliday(UserId, Convert.ToDateTime(values["RPRDT"]))) + { + result = false; + cvMessage.ErrorMessage += "開始日期是假日,不需請假"; + cvMessage.IsValid = false; + } + if (rptyp != RPAR_TYPE.T05_產假 && bhrd.IsHoliday(UserId, Convert.ToDateTime(values["RPEDT"]))) + { + result = false; + cvMessage.ErrorMessage += "結束日期是假日,不需請假"; + cvMessage.IsValid = false; + } + + GetHours(WDAC.GetStringValue(values["RPNUM"]), WDAC.GetDateTimeValue(values["RPRDT"])); + + // 補休時數不足 + /* + if (rptyp == "00" && 可用補休 < rptct) + { + result = false; + cvMessage.ErrorMessage += "補休時數不足!"; + cvMessage.IsValid = false; + } + + // 特休時數不足 + if (rptyp == "01" && 可用特休 < rptct) + { + result = false; + cvMessage.ErrorMessage += "特休時數不足!"; + cvMessage.IsValid = false; + } + */ + break; + case RPAR_TYPE.T1_加班: // 加班 + values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的日期", ref result, cvMessage); + + // 檢查一週之內只能請一天休息日加班 + if (string.Format("{0},{1}", RPAR_TYPE.T13_休息日累積補休時數, RPAR_TYPE.T14_休息日請領加班費).Contains(rptyp)) + { + DateTime rprdt = Convert.ToDateTime(values["RPRDT"]); + string rpren = WDAC.GetStringValue(values["RPREN"]); + + // 檢查休息日加班 + string message; + if (!rparDao.檢查休息日加班(UserId, rprdt, rpren, out message)) + { + result = false; + cvMessage.ErrorMessage = message; + cvMessage.IsValid = false; + } + } + + /* + if (!bhrd.IsHoliday(Convert.ToDateTime(values["RPRDT"]))) + { + if (Convert.ToInt32(values["RPTCT"]) > 4) + { + result = false; + cvMessage.ErrorMessage += "平日加班不可超過 4 小時"; + cvMessage.IsValid = false; + } + } + else + { + if (Convert.ToInt32(values["RPTCT"]) > 8) + { + result = false; + cvMessage.ErrorMessage += "假日加班不可超過 8 小時"; + cvMessage.IsValid = false; + } + } + */ + break; + case RPAR_TYPE.T21_電話費: // 電話費 + case RPAR_TYPE.T22_油料費: // 油料費 + values["RPRDT"] = CheckDate(values["RPRDT"].ToString() + "01", "請輸入正確的年月", ref result, cvMessage); + break; + case RPAR_TYPE.T3_出差: // 差旅 + values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的開始日期", ref result, cvMessage); + values["RPEDT"] = CheckDate(values["RPEDT"], "請輸入正確的結束日期", ref result, cvMessage); + if (result && Convert.ToDateTime(values["RPRDT"]).CompareTo(values["RPEDT"]) > 0) + { + result = false; + cvMessage.ErrorMessage += "開始日期 不可大於 結束日期"; + cvMessage.IsValid = false; + } + break; + } + ProcessCustomValidatorMessage(cvMessage); + return result; + } + + protected void RPARForm_ItemInserting(object sender, FormViewInsertEventArgs e) + { + if (RPARForm.FindControl("ddlRPAR_RPTYP") != null) + e.Values["RPTYP"] = (RPARForm.FindControl("ddlRPAR_RPTYP") as DropDownList).SelectedValue; + e.Cancel = !CheckInput(e.Values); + } + + protected void RPARForm_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + if (RPARForm.FindControl("ddlRPAR_RPTYP") != null) + e.NewValues["RPTYP"] = (RPARForm.FindControl("ddlRPAR_RPTYP") as DropDownList).SelectedValue; + e.Cancel = !CheckInput(e.NewValues); + + // 記住舊類別,以便做請補休假的判斷 + oldRPTYP = WDAC.GetStringValue(e.OldValues["RPTYP"]); + } + + protected void cvRPTCT_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i > 0; + } + + protected void cvRPNUM_ServerValidate(object source, ServerValidateEventArgs args) + { + if (bpsn == null) + bpsn = new BPSN_DAC(WConfig.GetConnectionConfig(), WConfig.GetConnectionConfigName()); + args.IsValid = args.Value != "" && bpsn.IsExist(args.Value, true); + } + + protected void Next_Click(object sender, EventArgs e) + { + // 檢查此使用者是否有權限處理這個專案 + BprmDAC bprm = new BprmDAC(Query); + if (!bprm.GetRight(ddlRPPYN.SelectedValue, UserId)) + { + MultiView1.Visible = false; + cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + cvMessage.IsValid = false; + return; + } + + ParamList["RPPYN"] = ddlRPPYN.SelectedValue; + DoAfterCommand("RPAR"); + } + + protected void btnYY_Click(object sender, EventArgs e) + { + int year; + if (!Int32.TryParse(txtYY.Text.Trim(), out year)) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "請輸入正確的年度"; + return; + } + + MultiView1.Visible = false; + ParamList["YY"] = year; + ParamList["RPPYN"] = ""; + DoAfterCommand("RPAR"); + } + + /// + /// 關帳檢查 + /// + /// 起始日 + /// 結束日 + /// True=通過檢查, False=不通過檢查 + protected bool CheckCloseAccount(object rprdt, object rpedt) + { + DateTime rdt = WDAC.GetDateTimeValue(rprdt); + DateTime edt = WDAC.GetDateTimeValue(rpedt); + + if (edt.Ticks != 0) + return (關帳日期 < rdt && 關帳日期 < edt); + else + return (關帳日期 < rdt); + } +} diff --git a/Web/forms/worker/fmRparWorker.ascx b/Web/forms/worker/fmRparWorker.ascx new file mode 100644 index 0000000..aedf98e --- /dev/null +++ b/Web/forms/worker/fmRparWorker.ascx @@ -0,0 +1,2980 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmRparWorker.ascx.cs" + Inherits="forms_customer_fmRpar" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> +<%@ Register Src="../../utility/TimeInput.ascx" TagName="TimeInput" + TagPrefix="uc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 日期: + + + + + + +
+ + + +
+
~ + + + + + + +
+ + + +
+
+ +
+ + + + + + +
+ + + + + + + + + + + + + + + + +
+ 可用補休: + + 0 + + 小時 + + 可用特休: + + 0 + + 小時 + + 剩餘事假: + + 0 + + 小時 + + 剩餘病假: + + 0 + + 小時 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 請假類別: + + + +
+ 開始日期: + + + + + + +
+ + + +
+
+ 開始時間: + + +   +   +   +
+ 結束日期: + + + + + + +
+ + + +
+
+ 結束時間: + + +   +   +   +
+ 代理人: + + + + + + +
+ + + +
+
+ 代理人電郵: + + +   +
+ 請假事由: + + +
+ 附件: + + + +
+ + +
+ +
+ 簽核人員: + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 請假類別: + + + +
+ 開始日期: + + + + + + +
+ + + +
+
+ 開始時間: + + +   +   +   +
+ 結束日期: + + + + + + +
+ + + +
+
+ 結束時間: + + +   +   +   +
+ 代理人姓名: + + + + + + +
+ + + +
+
+ 代理人電郵: + + +   +
+ 請假事由: + + +
+ 附件: + + + + +
+ 簽核人員: + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + + + 請假類別: + + +
+ 開始日期: + + + + 開始時間: + + +   +   +
+ 結束日期: + + + + 結束時間: + + + + 請假時數: + + +
+ 代理人姓名: + + + + 代理人電郵: + + +
+ 請假事由: + + +
+ 備註: + + +
+ 附件: + + + +
+ 抽單簽核人員: + + + + + + +
+ + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + + 加班類別: + + + +
+ 開始日期: + + + + + + +
+ + + + +
+
+ 開始時間: + + + + 結束時間: + + +
+ 1又1/3時數: + + + + + + 1又2/3時數: + + + + + + 1倍時數: + + + + +
+ 休息日再延長時數: + + + + + + 例假日再延長時數: + + + + +
+ 加班事由: + + +
+ 備註: + + +
  + + + + + + + +
+ 附件: + + + +
+ + +
+ +
+ 簽核人員: + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 加班類別: + + + +
+ 日期: + + + + + + +
+ + + +
+
+ 開始時間: + + + + 結束時間: + + +
+ 1又1/3時數: + + + + + + 1又2/3時數: + + + + + + 一倍時數: + + + + +
+ 休息日再延長時數: + + + + + + 例假日再延長時數: + + + + +
+ 加班事由: + + +
+ 備註: + + +
  + + + + + + + +
+ 附件: + + + + +
+ 簽核人員: + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 加班類別: + + +
+ 日期: + + + + 開始時間: + + + + 結束時間: + + +
+ 加班時數: + + + + 加班費: + + +   +   +
+ 1又1/3時數: + + + + + + 1又2/3時數: + + + + + + 1倍時數: + + + + +
+ 休息日再延長時數: + + + + + + 例假日再延長時數: + + + + +
+ 加班事由: + + +
+ 備註: + + +
+ 附件: + + + +
+ 抽單簽核人員: + + + + + + +
+ + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 簽核人員: + + + +
+ 人員編號: + + + + + + 差旅類別: + + + +
+ 開始日期: + + + + + + +
+ + + +
+
+ 開始時間: + + +
+ 結束日期: + + + + + + +
+ + + +
+
+ 結束時間: + + +   +   +
+ 差旅地點: + + +
+ 代理人姓名: + + + + + + +
+ + + +
+
+ 代理人電郵: + + +
+ 差旅事由: + + +
+ 差旅地點(最遠): + + + + 差旅起-迄點公里數: + + +
+ 差旅地點(最遠)-地址: + + +
+ 備註: + + +
  + + + + + + + +
+ 附件: + + + +
+ + +
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 簽核人員: + + + +
+ 人員編號: + + + + + + 差旅類別: + + + +
+ 開始日期: + + + + + + +
+ + + +
+
+ 開始時間: + + +
+ 結束日期: + + + + + + +
+ + + +
+
+ 結束時間: + + +
+ 差旅地點: + + +
+ 代理人姓名: + + + + + + +
+ + + +
+
+ 代理人電郵: + + +
+ 差旅事由: + + +
+ 差旅地點(最遠): + + + + 差旅起-迄點公里數: + + +
+ 差旅地點(最遠)-地址: + + +
+ 備註: + + +
  + + + + + + + +
+ 附件: + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + + 差旅類別: + + +
+ 開始日期: + + + + 開始時間: + + + + 差旅費: + + +
+ 結束日期: + + + + 結束時間: + + +
+ 差旅地點: + + +
+ 代理人姓名: + + + + 代理人電郵: + + +
+ 差旅事由: + + +
+ 差旅地點(最遠): + + + + 差旅起-迄點公里數: + + +
+ 差旅地點(最遠)-地址: + + +
+ 備註: + + +
+ 附件: + + +
+ 抽單簽核人員: + + + + + + +
+ + + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + <%# String.Format("{0:00}:{1:00}", Eval("可補時數"), Eval("可補分數")) %> + + + + + + <%# String.Format("{0:00}:{1:00}", Eval("已補時數"), Eval("已補分數")) %> + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- + + --%> + + + + + + + + + + + + + + +
+
+ + + diff --git a/Web/forms/worker/fmRparWorker.ascx.cs b/Web/forms/worker/fmRparWorker.ascx.cs new file mode 100644 index 0000000..488d75c --- /dev/null +++ b/Web/forms/worker/fmRparWorker.ascx.cs @@ -0,0 +1,2468 @@ +using Mono.Security.Cryptography; +using System; +using System.Collections; +using System.Configuration; +using System.Data; +using System.Data.Common; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net.Mail; +using System.Security.Cryptography; +using System.Text; +using System.Transactions; +using System.Web; +using System.Web.Script.Services; +using System.Web.Security; +using System.Web.Services; +using System.Web.UI; +using System.Web.UI.HtmlControls; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using Wellan.Common; +using Wellan.Data; + +/// +/// 人員出缺勤紀錄 (員工自行輸入) +/// 請假處理 +/// 加班處理 +/// 電話費處理 +/// 油料費處理 +/// 差勤處理 +/// +public partial class forms_customer_fmRpar : Wellan.Web.UI.WUserControlBase +{ + private string _RPPYN = ""; + private string _RPRDT1 = ""; + private string _RPRDT2 = ""; + private int _YY = 0; + private string select = + @"SELECT TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, RPTYP, + RPFTR, RPDOC, RPRSN, RPAGM, RPPLC, APPNO, RPAPP, RPAPD, RPAPU, RPADT, RPAPN, + RPANO, RPAGT, RPRTM, RPETM, RPUST, RPFPC, RPFAD, RPKMS, + FLOOR(RPTCT / 60) AS RPTCT, RPTCT - FLOOR(RPTCT / 60) * 60 AS RPTMT, + FLOOR(RPTC1 / 60) AS RPTC1, RPTC1 - FLOOR(RPTC1 / 60) * 60 AS RPTM1, + FLOOR(RPTC2 / 60) AS RPTC2, RPTC2 - FLOOR(RPTC2 / 60) * 60 AS RPTM2, + FLOOR(RPTC3 / 60) AS RPTC3, RPTC3 - FLOOR(RPTC3 / 60) * 60 AS RPTM3, + FLOOR(RPTC4 / 60) AS RPTC4, RPTC4 - FLOOR(RPTC4 / 60) * 60 AS RPTM4, + FLOOR(RPTC5 / 60) AS RPTC5, RPTC5 - FLOOR(RPTC5 / 60) * 60 AS RPTM5"; + private string from = " FROM RPAR "; + private string where = " WHERE 1=1 "; + private string order = " ORDER BY RPRDT DESC"; + private FormView RPARForm; + private Panel RPARPanel; + protected string rparType; + private BpsnDAC bpsnDao; + private BpapDAC bpapDao; + private RparDAC rparDao; + private DbConnection conn; + private string oldRPTYP; + private BhrdDAC bhrdDao; + private RpabDAC rpabDao; + private RpadDAC rpadDao; + private RyerDAC ryerDao; + private string _RPREN; + private string _RPSTP; + private string _RPEDP; + private string _RPDAT; + private GetData _getData; + private DateTime 關帳日期; + private int 可用補休; + private int 可用特休; + private int 可用病假; + private int 可用事假; + private int 年度病假; + private int 年度事假; + private string 上班時間; + private string 下班時間; + private string 午休開始; + private string 午休結束; + private int 上班分鐘數; + private int 午休分鐘數; + private string 簽核人員; + private string attachPath; + private string attachFileExt1, attachFileExt2, attachFileExt3; + private byte[] attachFile1, attachFile2, attachFile3; + private bool attachDelete1, attachDelete2, attachDelete3; + private TimeCalc timeCalc = new TimeCalc(); + + protected bool OverTimeToMinute; + + protected void Page_Load(object sender, EventArgs e) + { + _RPRDT1 = WDAC.GetStringValue(ViewState["RPRDT1"]); + _RPRDT2 = WDAC.GetStringValue(ViewState["RPRDT2"]); + _RPREN = WDAC.GetStringValue(ViewState["RPREN"]); + _RPSTP = WDAC.GetStringValue(ViewState["RPSTP"]); + _RPEDP = WDAC.GetStringValue(ViewState["RPEDP"]); + _RPDAT = WDAC.GetStringValue(ViewState["RPDAT"]); + + attachPath = Server.MapPath("~/UploadedPicture/RPAR_ATTACHMENT"); + Directory.CreateDirectory(attachPath); + + attachFile1 = null; + attachFileExt1 = ""; + attachFile2 = null; + attachFileExt2 = ""; + attachFile3 = null; + attachFileExt3 = ""; + + switch (RPARForm.CurrentMode) + { + case FormViewMode.ReadOnly: + RPABGrid.Visible = true; + break; + + case FormViewMode.Edit: + RPABGrid.Visible = false; + break; + + case FormViewMode.Insert: + RPABGrid.Visible = false; + break; + } + + //if (IsPostBack) + //{ + // RPABGrid.DataBind(); + // gv補休明細.DataBind(); + // gvRPAD.DataBind(); + // RPARGrid.DataBind(); + //} + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsRPARForm.ConnectionString = ConnectionString; + dsRPARGrid.ConnectionString = ConnectionString; + dsRPAR_RPTYP.ConnectionString = ConnectionString; + dsRPAB.ConnectionString = ConnectionString; + + bpsnDao = new BpsnDAC(Query); + rparDao = new RparDAC(Query); + bhrdDao = new BhrdDAC(Query); + rpadDao = new RpadDAC(Query); + rpabDao = new RpabDAC(Query); + ryerDao = new RyerDAC(Query); + bpapDao = new BpapDAC(Query); + + _RPPYN = WDAC.GetStringValue(ViewState["RPPYN"]); + if (_RPPYN == null || _RPPYN.Length == 0) + { + _RPPYN = bpsnDao.GetCurrentProject(UserId); + if (_RPPYN == null || _RPPYN.Length == 0) + _RPPYN = "000000001"; + ViewState["RPPYN"] = _RPPYN; + } + + rparType = GetStringParam("type"); + + switch (rparType) + { + case RPAR_TYPE.T0_請假: + RPARForm = RPARForm0; + RPARPanel = Panel1; + gv補休明細.Visible = true; + break; + case RPAR_TYPE.T1_加班: + RPARForm = RPARForm1; + RPARPanel = Panel2; + gv補休明細.Visible = false; + break; + case RPAR_TYPE.T3_出差: + RPARForm = RPARForm3; + RPARPanel = Panel3; + gv補休明細.Visible = false; + break; + } + + dsRPAR_RPTYP.SelectParameters["BSCLS"].DefaultValue = rparType + "%"; + _YY = GetIntParam("YY"); + + GetGridViewRowColor(RPARGrid); + + /* + if (_RPPYN.CompareTo("000000001") == 0) + { + RegisterLookupEvent(this, "btnRPAR_RPNUM1_WQRY", "txtRPAR_RPNUM1", "txtRPAR_RPNUM1,lbRPAR_RPNUM1X", "BPSN1", "NOT EXISTS (SELECT RANUM FROM RASN WHERE RANUM=BPENO AND RAEDT IS NULL)"); + RegisterLookupEvent(this, "btnRPAR_RPNUM2_WQRY", "txtRPAR_RPNUM2", "txtRPAR_RPNUM2,lbRPAR_RPNUM2X", "BPSN1", "NOT EXISTS (SELECT RANUM FROM RASN WHERE RANUM=BPENO AND RAEDT IS NULL)"); + } + else + { + RegisterLookupEvent(this, "btnRPAR_RPNUM1_WQRY", "txtRPAR_RPNUM1", "txtRPAR_RPNUM1,lbRPAR_RPNUM1X", "BPSN1", "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)"); + RegisterLookupEvent(this, "btnRPAR_RPNUM2_WQRY", "txtRPAR_RPNUM2", "txtRPAR_RPNUM2,lbRPAR_RPNUM2X", "BPSN1", "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)"); + } + */ + + RegisterCalendarEvent(this, "btnRPAR_RPRDT1_DATE", "txtRPAR_RPRDT1"); + RegisterCalendarEvent(this, "btnRPAR_RPRDT2_DATE", "txtRPAR_RPRDT2"); + + MultiView1.Visible = _RPPYN != ""; + + if (_RPRDT1.Length == 0) + { + /* + _RPRDT1 = DateTime.UtcNow.AddHours(8).Date.AddDays(-DateTime.UtcNow.AddHours(8).Date.Day + 1).ToString("yyyy-MM-dd", WGuard1.InvariantCulture); + ViewState["RPRDT1"] = _RPRDT1; + */ + } + + if (_RPRDT2.Length == 0) + { + /* + _RPRDT2 = DateTime.UtcNow.AddHours(8).Date.AddDays(-DateTime.UtcNow.AddHours(8).Date.Day).AddMonths(1).ToString("yyyy-MM-dd", WGuard1.InvariantCulture); + ViewState["RPRDT2"] = _RPRDT2; + */ + } + + // 取得關帳日期 + _getData = new GetData(); + _getData.Query = Query; + BPAARecord bpaaRecord = new BPAARecord(); + DataTable bpaa = _getData.GetBPAA_BPPYN(_RPPYN); + + if (bpaa.Rows.Count == 0) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "您目前不在任何專案中,無法使用差勤系統!"; + return; + } + + bpaaRecord.FillRecord(bpaa.Rows[0]); + // 關帳日期 = bpaaRecord.BPMSD.AddMonths(1).AddDays(-1); + 關帳日期 = bpaaRecord.BPMSD; + OverTimeToMinute = bpaaRecord.BPOTT == "2"; + + // 取得上下班時間、午休時間設定資料 + 上班時間 = WGuard1.WSetR("UNRPARTIME", 1); + 下班時間 = WGuard1.WSetR("UNRPARTIME", 2); + 午休開始 = WGuard1.WSetR("UNRPARTIME", 3); + 午休結束 = WGuard1.WSetR("UNRPARTIME", 4); + 上班分鐘數 = TimeCalc.計算分鐘數(上班時間, 下班時間) - TimeCalc.計算分鐘數(午休開始, 午休結束); + 午休分鐘數 = TimeCalc.計算分鐘數(午休開始, 午休結束); + + // 可用時數 + if (int.TryParse(WGuard1.WSetR("UNRPARTIME", 5), out 年度事假)) + 年度事假 = 年度事假 * 60; + else + 年度事假 = 112 * 60; + if (int.TryParse(WGuard1.WSetR("UNRPARTIME", 6), out 年度病假)) + 年度病假 = 年度病假 * 60; + else + 年度病假 = 240 * 60; + GetHours(DateTime.UtcNow.AddHours(8).Date); + + Search(); + } + + // 查詢按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + ViewState["RPRDT1"] = txtRPAR_RPRDT1.Text; + ViewState["RPRDT2"] = txtRPAR_RPRDT2.Text; + + DateTime dt; + CheckDate(txtRPAR_RPRDT1.Text, out dt); + if (dt.Ticks == 0) + _RPRDT1 = ""; + else + _RPRDT1 = dt.ToString("yyyy-MM-dd", WGuard1.InvariantCulture); + + CheckDate(txtRPAR_RPRDT2.Text, out dt); + if (dt.Ticks == 0) + _RPRDT2 = ""; + else + _RPRDT2 = dt.ToString("yyyy-MM-dd", WGuard1.InvariantCulture); + + + if (_RPRDT1.Length == 0 && + _RPRDT2.Length == 0) + { + lbMessage.Text = GetString("NOSRHCOND"); + lbMessage.Visible = true; + } + else + { + MultiView1.ActiveViewIndex = 1; + + Search(); + + RPARGrid.PageIndex = 0; + RPARGrid.SelectedIndex = 0; + RPARGrid.DataBind(); + } + } + + // 查詢取消按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + MultiView1.ActiveViewIndex = 1; + } + + // 查詢動作 + private new void Search() + { + if (MultiView1.ActiveViewIndex == 1) + { + where = " WHERE RPNUM = '" + UserId + "' "; + switch (rparType) + { + case RPAR_TYPE.T0_請假: + WLabel1.Text = GetString("FMRPAR00.NAME"); + where += " AND RPTYP LIKE '0%' AND RPADT IS NOT NULL "; + RPARForm = RPARForm0; + RPARPanel = Panel1; + RPARGrid.Columns[3].HeaderText = "開始日期"; + (RPARGrid.Columns[3] as BoundField).DataFormatString = "{0:yyyyMMdd}"; + RPARGrid.Columns[4].HeaderText = "結束日期"; + RPARGrid.Columns[4].Visible = true; + RPARGrid.Columns[6].HeaderText = "時數"; + RPARGrid.Columns[6].Visible = true; + RPARGrid.Columns[7].Visible = false; + break; + case RPAR_TYPE.T1_加班: + WLabel1.Text = GetString("FMRPAR01.NAME"); + where += " AND RPTYP LIKE '1%' AND RPADT IS NOT NULL "; + RPARForm = RPARForm1; + RPARPanel = Panel2; + RPARGrid.Columns[3].HeaderText = "日期"; + (RPARGrid.Columns[3] as BoundField).DataFormatString = "{0:yyyyMMdd}"; + RPARGrid.Columns[4].HeaderText = "日期"; + RPARGrid.Columns[4].Visible = false; + RPARGrid.Columns[6].HeaderText = "時數"; + RPARGrid.Columns[6].Visible = true; + RPARGrid.Columns[7].HeaderText = "加班費"; + RPARGrid.Columns[7].Visible = true; + break; + case RPAR_TYPE.T3_出差: + WLabel1.Text = GetString("FMRPAR03.NAME"); + where += " AND RPTYP LIKE '3%' AND RPADT IS NOT NULL "; + RPARForm = RPARForm3; + RPARPanel = Panel3; + RPARGrid.Columns[3].HeaderText = "開始日期"; + (RPARGrid.Columns[3] as BoundField).DataFormatString = "{0:yyyyMMdd}"; + RPARGrid.Columns[4].HeaderText = "結束日期"; + RPARGrid.Columns[4].Visible = true; + RPARGrid.Columns[6].Visible = false; + RPARGrid.Columns[7].HeaderText = "差旅費"; + RPARGrid.Columns[7].Visible = true; + break; + } + RPARForm.Visible = true; + RPARPanel.Visible = true; + } + + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsRPARGrid.SelectParameters.Clear(); + + DateTime RPRDT1, RPRDT2; + CheckDate(_RPRDT1, out RPRDT1); + CheckDate(_RPRDT2, out RPRDT2); + + AddSearch(sql, dsRPARGrid, "RPRDT", RPRDT1, RPRDT2, true); + sql.Append(order); + dsRPARGrid.SelectCommand = sql.ToString(); + + dsRPARForm.SelectCommand = select + from + " WHERE RPREN=@RPREN "; + + gv補休明細.DataBind(); + } + + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + string rppyn = _RPPYN; + + // 藉由人員編號以及日期,找出相應的派遣紀錄,填入相關欄位 + // DbCommand cmd = Query.NewCommand("SELECT TOP 1 RAITM, RACNM, RAPYN FROM RASN WHERE RANUM=@RPNUM AND ((RASDT <= @RPRDT AND RAEDT >= @RPRDT) OR (RASDT <= @RPRDT AND RAEDT IS NULL)) ORDER BY RAITM"); + DbCommand cmd = Query.NewCommand( + @"SELECT TOP 1 RAITM, RACNM, RAPYN FROM RASN + WHERE RANUM=@RPNUM + AND ((RASDT <= @RPRDT AND RAEDT >= @RPRDT) OR (RASDT <= @RPRDT AND RAEDT IS NULL)) ORDER BY RAITM"); + cmd.Parameters.Add(Query.NewParameter("RPNUM", UserId)); + cmd.Parameters.Add(Query.NewParameter("RPRDT", e.Command.Parameters["@RPRDT"].Value)); + DataTable rasn = Query.Select(cmd); + if (rasn.Rows.Count > 0) + { + e.Command.Parameters["@RAITM"].Value = rasn.Rows[0]["RAITM"]; + e.Command.Parameters["@RPCNM"].Value = rasn.Rows[0]["RACNM"]; + e.Command.Parameters["@RPPYN"].Value = rasn.Rows[0]["RAPYN"]; + rppyn = WQuery.GetStringValue(rasn.Rows[0]["RAPYN"]); + } + + // 電話費、油料費,填入類別 + if (rparType.StartsWith("2")) + e.Command.Parameters["@RPTYP"].Value = rparType; + + // 取出計算需要的資料 + string rpnum = e.Command.Parameters["@RPNUM"].Value.ToString(); + string rptyp = e.Command.Parameters["@RPTYP"].Value.ToString(); + int rptct = Convert.ToInt32(e.Command.Parameters["@RPTCT"].Value); + int rpftr = Convert.ToInt32(e.Command.Parameters["@RPFTR"].Value); + DateTime rprdt = Convert.ToDateTime(e.Command.Parameters["@RPRDT"].Value); + DateTime rpedt; + GetData calc = new GetData(); + calc.Query = Query; + int bpsrm; + int bpp02; + double bpbft; + double bpaft; + double bphol; + string bpovr; + string bplve; + string bpott; + + // 取得月薪、伙食津貼、前二加班比率、後二加班比率、假日加班比率、加班費公式、請假扣款公式 + calc.GetRASN_Date_Bppyn_Bpeno_Overwork_Rate( + rprdt, rppyn, rpnum, out bpsrm, out bpp02, out bpbft, out bpaft, out bphol, out bpovr, out bplve, out bpott); + + e.Command.Parameters["@RPADT"].Value = DateTime.UtcNow.AddHours(8).Date; + e.Command.Parameters["@RPAPN"].Value = "2"; + //e.Command.Parameters["@RPANO"].Value = 0; + //e.Command.Parameters["@RPAPP"].Value = ""; + //e.Command.Parameters["@RPAPD"].Value = DBNull.Value; + //e.Command.Parameters["@RPAPU"].Value = ""; + + string 起時; + string 迄時; + switch (rparType) + { + #region 請假 + case RPAR_TYPE.T0_請假: // 請假,要計算缺勤扣款與請假時數 + // 計算請假時數 + rpedt = WDAC.GetDateTimeValue(e.Command.Parameters["@RPEDT"].Value); + 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); + 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); + + rptct = timeCalc.計算請假總時數(rpnum, rprdt, rpedt, 起時, 迄時, rptyp, bpott == "1"); + e.Command.Parameters["@RPTCT"].Value = rptct; + + // 計算請假扣款 + Absent absent = new Absent(); + absent.bpsrm = bpsrm; + absent.bpp02 = bpp02; + absent.Formula = bplve; + // e.Command.Parameters["@RPFTR"].Value = absent.Add(rptyp, rptct); + e.Command.Parameters["@RPFTR"].Value = absent.Add(rpnum, rptyp, rprdt, rpedt, 起時, 迄時, rprdt, rpedt, bpott == "1"); + + // 若請假 >= 3 天,要批三關 + if (timeCalc.計算請假跨日數(UserId, rprdt, rpedt, rptyp) >= 3) + e.Command.Parameters["@RPAPN"].Value = "3"; + + //e.Command.Parameters["@RPANO"].Value = 1; // 目前第一關 + //e.Command.Parameters["@RPAPU"].Value = 簽核人員; + + break; + #endregion + + #region 加班 + case RPAR_TYPE.T1_加班: // 加班,要計算加班費與每個加班時段的時數 + // 計算加班時數 + 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); + 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); + + // 將這一天的加班單都取出,重新計算每個加班時段的時數 + ExtraWork extraWork = new ExtraWork(); + int RPTC1 = 0; + int RPTC2 = 0; + int RPTC3 = 0; + int RPTC4 = 0; + int RPTC5 = 0; + + var rpren = WDAC.GetStringValue(e.Command.Parameters["@RPREN"].Value).Trim(); + var oneDayOverTime = rparDao.SelectOverTimeOneDay(rpnum, rprdt); + + if (string.IsNullOrEmpty(rpren)) + { + oneDayOverTime.Add(new RPAR + { + RPREN = "", + RPNUM = rpnum, + RPTYP = rptyp, + RPRDT = rprdt, + RPRTM = 起時, + RPETM = 迄時 + }); + } + else + { + var item = oneDayOverTime.FirstOrDefault(p => p.RPREN == rpren); + if (item != null) + { + item.RPRDT = rprdt; + item.RPTYP = rptyp; + item.RPRTM = 起時; + item.RPETM = 迄時; + } + } + + var tot = 0; + var prev = 0; + oneDayOverTime.OrderBy(p => p.RPRTM) + .ToList() + .ForEach(p => + { + prev = CalcOverTimeHours(p, ref tot); + + // 新增或本筆資料 + if (p.RPREN == rpren || string.IsNullOrEmpty(p.RPREN)) + { + rptct = p.RPTCT; + RPTC1 = p.RPTC1; + RPTC2 = p.RPTC2; + RPTC3 = p.RPTC3; + RPTC4 = p.RPTC4; + RPTC5 = p.RPTC5; + } + // 更新同日其他加班單資料 + else if (p.RPREN != "") + { + extraWork.Clear(); + extraWork.Add(p.RPTYP, p.RPRDT, p.RPTCT, bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott, p.RPTC1, p.RPTC2, p.RPTC3, p.RPTC4, p.RPTC5); + rparDao.UpdateOverTimeHours(p.RPREN, p.RPTCT, p.RPTC1, p.RPTC2, p.RPTC3, p.RPTC4, p.RPTC5, + extraWork.RPTA1, extraWork.RPTA2, extraWork.RPTA3, extraWork.RPTA4, extraWork.RPTA5); + } + }); + + e.Command.Parameters["@RPTCT"].Value = rptct; + e.Command.Parameters["@RPTC1"].Value = RPTC1; + e.Command.Parameters["@RPTC2"].Value = RPTC2; + e.Command.Parameters["@RPTC3"].Value = RPTC3; + e.Command.Parameters["@RPTC4"].Value = RPTC4; + e.Command.Parameters["@RPTC5"].Value = RPTC5; + + extraWork.Clear(); + extraWork.Add(rptyp, rprdt, rptct, bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5); + e.Command.Parameters["@RPTA1"].Value = extraWork.RPTA1; + e.Command.Parameters["@RPTA2"].Value = extraWork.RPTA2; + e.Command.Parameters["@RPTA3"].Value = extraWork.RPTA3; + e.Command.Parameters["@RPTA4"].Value = extraWork.RPTA4; + e.Command.Parameters["@RPTA5"].Value = extraWork.RPTA5; + e.Command.Parameters["@RPFTR"].Value = extraWork.RPTA1 + extraWork.RPTA2 + extraWork.RPTA3 + extraWork.RPTA4 + extraWork.RPTA5; + e.Command.Parameters["@RPUST"].Value = 0; + + break; + #endregion + + #region 出差 + case RPAR_TYPE.T3_出差: + rpedt = WDAC.GetDateTimeValue(e.Command.Parameters["@RPEDT"].Value); + 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); + 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); + // 20180305 出差時間一律計算至分鐘 + rptct = timeCalc.計算差旅時數(rpnum, rprdt, rpedt, 起時, 迄時); + e.Command.Parameters["@RPTCT"].Value = rptct; + break; + #endregion + } + } + + /// + /// 計算加班時數並分配至各時段 + /// + /// 加班記錄 + /// 累計總時數(分鐘) + /// 處理此筆記錄前的累計時數 + private int CalcOverTimeHours(RPAR p, ref int tot) + { + int 處理前累計時數 = tot; + var 是休息日 = RPAR_TYPE.休息日加班(p.RPTYP); + + // 計算本次加班時數 + p.RPTCT = timeCalc.計算加班時數(p.RPNUM, p.RPRDT, p.RPRTM, p.RPETM, 是休息日); + tot += p.RPTCT; + + // 使用 ExtraWork.SplitOverTime 分配時段 + ExtraWork extraWork = new ExtraWork(); + + int tc1 = 0; + int tc2 = 0; + int tc3 = 0; + int tc4 = 0; + int tc5 = 0; + + extraWork.SplitOverTime(p.RPTYP, p.RPTCT, tot, out tc1, out tc2, out tc3, out tc4, out tc5); + + p.RPTC1 = tc1; + p.RPTC2 = tc2; + p.RPTC3 = tc3; + p.RPTC4 = tc4; + p.RPTC5 = tc5; + + return 處理前累計時數; + } + + protected void dsRPARForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + if (e.Cancel) + { + return; + } + + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); + try + { + e.Command.Connection = conn; + e.Command.Transaction = tran; + + // 產生新的單號 + _RPREN = WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "RPAR", "RPREN", "YYYYMM<9999>", ""); + + e.Command.Parameters["@RPREN"].Value = _RPREN; + + // 請假 + if (rparType == "0") + { + DateTime _RPRDT = WDAC.GetDateTimeValue(e.Command.Parameters["@RPRDT"].Value); + int _RPTCT = WDAC.GetInt32Value(e.Command.Parameters["@RPTCT"].Value); + string _RPTYP = WDAC.GetStringValue(e.Command.Parameters["@RPTYP"].Value); + switch (_RPTYP) + { + // 補休 + case RPAR_TYPE.T00_補休: + e.Command.Parameters["@RPDOC"].Value = + rparDao.沖補休(tran, _RPREN, UserId, _RPRDT, _RPTCT); + break; + // 特休 + case RPAR_TYPE.T01_特休: + ryerDao.沖特休(UserId, _RPRDT.Year, _RPTCT, tran); + break; + // 事假、家庭照顧假 + case RPAR_TYPE.T02_事假: + case RPAR_TYPE.T0B_家庭照顧假: + if (年度事假 - rparDao.Get已請事假(UserId, _RPRDT, _RPREN) - _RPTCT < 0) + e.Command.Parameters["@RPALT"].Value = "可用事假時數不足"; + break; + // 病假 + case RPAR_TYPE.T03_病假: + if (年度病假 - rparDao.Get已請病假(UserId, _RPRDT, _RPREN) - _RPTCT < 0) + e.Command.Parameters["@RPALT"].Value = "可用病假時數不足"; + break; + } + } + + // 有上傳附件 + if (attachFile1 != null) + { + File.WriteAllBytes(string.Format("{0}\\{1}{2}", attachPath, _RPREN, attachFileExt1), attachFile1); + } + if (attachFile2 != null) + { + File.WriteAllBytes(string.Format("{0}\\{1}_2{2}", attachPath, _RPREN, attachFileExt2), attachFile2); + } + if (attachFile3 != null) + { + File.WriteAllBytes(string.Format("{0}\\{1}_3{2}", attachPath, _RPREN, attachFileExt3), attachFile3); + } + + // 送簽 + 簽核人員 = WDAC.GetStringValue(e.Command.Parameters["@RPAPU"].Value); + if (簽核人員.Length > 0) + { + e.Command.Parameters["@RPANO"].Value = "1"; + rpabDao.送簽(tran, _RPREN, e.Command.Parameters["@RPAPN"].Value.ToString(), "1", 簽核人員, UserId); + } + } + catch + { + tran.Rollback(); + tran = null; + e.Cancel = true; + throw; + } + } + + protected void dsRPARForm_Inserted(object sender, SqlDataSourceStatusEventArgs e) + { + if (tran != null) + { + tran.Commit(); + tran = null; + } + + if (conn != null && conn.State == ConnectionState.Open) + { + conn.Close(); + conn.Dispose(); + conn = null; + } + + // 發郵件 + 發代理人郵件(_RPREN); + } + + protected void dsRPARForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + if (e.Cancel) + return; + + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); + try + { + e.Command.Connection = conn; + e.Command.Transaction = tran; + + _RPREN = WDAC.GetStringValue(e.Command.Parameters["@RPREN"].Value); + string 新類別 = WDAC.GetStringValue(e.Command.Parameters["@RPTYP"].Value); + DateTime 新日期 = WDAC.GetDateTimeValue(e.Command.Parameters["@RPRDT"].Value); + int 新時數 = WDAC.GetInt32Value(e.Command.Parameters["@RPTCT"].Value); + + // 如果是請假 + if (rparType == "0") + { + // 舊資料如果是補休,要取消沖補休 + if (oldRPTYP == RPAR_TYPE.T00_補休) + { + rparDao.取消沖補休(tran, _RPREN); + } + + // 舊資料如果是特休,要取消沖特休 + if (oldRPTYP == RPAR_TYPE.T01_特休) + { + ryerDao.取消沖特休(tran, _RPREN); + } + + // 新資料如果是補休,要沖補休 + if (新類別 == RPAR_TYPE.T00_補休) + { + e.Command.Parameters["@RPDOC"].Value = + rparDao.沖補休(tran, _RPREN, UserId, 新日期, 新時數); + } + + // 新資料如果是特休,要沖特休 + if (新類別 == RPAR_TYPE.T01_特休) + { + ryerDao.沖特休(UserId, 新日期.Year, 新時數, tran); + } + + // 新資料如果是事假或家庭照顧假,要檢查可用事假時數 + if (新類別 == RPAR_TYPE.T02_事假 || 新類別 == RPAR_TYPE.T0B_家庭照顧假) + { + if (年度事假 - rparDao.Get已請事假(UserId, 新日期, _RPREN) - 新時數 < 0) + e.Command.Parameters["@RPALT"].Value = "可用事假時數不足"; + else + e.Command.Parameters["@RPALT"].Value = ""; + } + + // 新資料如果是病假,要檢查可用病假時數 + if (新類別 == RPAR_TYPE.T03_病假) + { + if (年度病假 - rparDao.Get已請病假(UserId, 新日期, _RPREN) - 新時數 < 0) + e.Command.Parameters["@RPALT"].Value = "可用病假時數不足"; + else + e.Command.Parameters["@RPALT"].Value = ""; + } + } + + // 要刪除附件 + if (attachDelete1) + { + RparDAC.DeleteAttach1(_RPREN); + } + if (attachDelete2) + { + RparDAC.DeleteAttach2(_RPREN); + } + if (attachDelete3) + { + RparDAC.DeleteAttach3(_RPREN); + } + + // 有上傳附件 + if (attachFile1 != null) + { + File.WriteAllBytes(string.Format("{0}\\{1}{2}", attachPath, _RPREN, attachFileExt1), attachFile1); + } + if (attachFile2 != null) + { + File.WriteAllBytes(string.Format("{0}\\{1}_2{2}", attachPath, _RPREN, attachFileExt2), attachFile2); + } + if (attachFile3 != null) + { + File.WriteAllBytes(string.Format("{0}\\{1}_3{2}", attachPath, _RPREN, attachFileExt3), attachFile3); + } + + // 送簽 + 簽核人員 = WDAC.GetStringValue(e.Command.Parameters["@RPAPU"].Value); + if (簽核人員.Length > 0) + { + e.Command.Parameters["@RPANO"].Value = 1; + rpabDao.送簽(tran, _RPREN, e.Command.Parameters["@RPAPN"].Value.ToString(), "1", 簽核人員, UserId); + } + } + catch + { + tran.Rollback(); + tran = null; + e.Cancel = true; + throw; + } + } + + protected void dsRPARForm_Updated(object sender, SqlDataSourceStatusEventArgs e) + { + if (tran != null) + { + tran.Commit(); + tran = null; + } + + if (conn != null && conn.State == ConnectionState.Open) + { + conn.Close(); + conn.Dispose(); + conn = null; + } + + // 發郵件 + 發代理人郵件(_RPREN); + } + + protected void dsRPARForm_Deleting(object sender, SqlDataSourceCommandEventArgs e) + { + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); + try + { + e.Command.Connection = conn; + e.Command.Transaction = tran; + + string oldrpren = WDAC.GetStringValue(e.Command.Parameters["@OLD_RPREN"].Value); + oldRPTYP = WDAC.GetStringValue(Query.ExecuteScalar("SELECT RPTYP FROM RPAR WHERE RPREN='" + oldrpren + "'", tran)); + + // 如果是請假 + if (rparType == RPAR_TYPE.T0_請假) + { + // 舊資料如果是補休,要取消沖補休 + if (oldRPTYP == RPAR_TYPE.T00_補休) + { + rparDao.取消沖補休(tran, oldrpren); + } + + // 舊資料如果是特休,要取消沖特休 + if (oldRPTYP == RPAR_TYPE.T01_特休) + { + ryerDao.取消沖特休(tran, oldrpren); + } + } + else if (rparType == RPAR_TYPE.T1_加班) + { + // 重新計算當日的加班單 + var oldform = rparDao.SelectOne(oldrpren).FirstOrDefault(); + if (oldform != null) + { + ExtraWork extraWork = new ExtraWork(); + int bpsrm; + int bpp02; + double bpbft; + double bpaft; + double bphol; + string bpovr; + string bplve; + string bpott; + GetData calc = new GetData(); + calc.Query = Query; + + // 取得月薪、伙食津貼、前二加班比率、後二加班比率、假日加班比率、加班費公式、請假扣款公式 + calc.GetRASN_Date_Bppyn_Bpeno_Overwork_Rate( + oldform.RPRDT, oldform.RPPYN, oldform.RPNUM, out bpsrm, out bpp02, out bpbft, out bpaft, out bphol, out bpovr, out bplve, out bpott); + + var oneDayOverTime = rparDao.SelectOverTimeOneDay(oldform.RPNUM, oldform.RPRDT) + .Where(p => p.RPREN != oldrpren) + .OrderBy(p => p.RPRTM) + .ToList(); + + var tot = 0; + var prev = 0; + oneDayOverTime + .ForEach(p => + { + prev = CalcOverTimeHours(p, ref tot); + extraWork.Clear(); + extraWork.Add(p.RPTYP, p.RPRDT, p.RPTCT, bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott, p.RPTC1, p.RPTC2, p.RPTC3, p.RPTC4, p.RPTC5); + rparDao.UpdateOverTimeHours(p.RPREN, p.RPTCT, p.RPTC1, p.RPTC2, p.RPTC3, p.RPTC4, p.RPTC5, + extraWork.RPTA1, extraWork.RPTA2, extraWork.RPTA3, extraWork.RPTA4, extraWork.RPTA5); + }); + } + + } + + // 刪除簽核資料 + rpabDao.Delete(tran, oldrpren); + + // 刪除附件 + RparDAC.DeleteAttach1(oldrpren); + RparDAC.DeleteAttach2(oldrpren); + RparDAC.DeleteAttach3(oldrpren); + } + catch + { + tran.Rollback(); + tran = null; + e.Cancel = true; + throw; + } + } + + protected void dsRPARForm_Deleted(object sender, SqlDataSourceStatusEventArgs e) + { + if (tran != null) + { + tran.Commit(); + tran = null; + } + + if (conn != null && conn.State == ConnectionState.Open) + { + conn.Close(); + conn.Dispose(); + conn = null; + } + } + + protected void RPARGrid_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (RPARGrid.Rows.Count > 0) + { + if (RPARGrid.SelectedIndex == -1) + RPARGrid.SelectedIndex = 0; + if (RPARGrid.SelectedIndex > RPARGrid.Rows.Count - 1) + RPARGrid.SelectedIndex = RPARGrid.Rows.Count - 1; + RPARForm.DataBind(); + if (RPARForm.CurrentMode == FormViewMode.ReadOnly) + RPABGrid.DataBind(); + if (pnlRPAD.Visible) + gvRPAD.DataBind(); + } + } + + protected void RPARGrid_PageIndexChanged(object sender, EventArgs e) + { + Search(); + RPARGrid.SelectedIndex = 0; + RPARGrid.DataBind(); + if (RPARForm.CurrentMode == FormViewMode.ReadOnly) + RPABGrid.DataBind(); + if (pnlRPAD.Visible) + gvRPAD.DataBind(); + } + + protected void dsRPARGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + switch (MultiView1.ActiveViewIndex) + { + case 0: + lbMessage.Text = GetString("NODATA"); + lbMessage.Visible = true; + break; + case 1: + RPARForm.ChangeMode(FormViewMode.Insert); + RPARForm_ModeChanged(sender, e); + break; + } + } + } + + protected void RPARForm_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "Insert": + case "Edit": + break; + case "Search": + MultiView1.ActiveViewIndex = 0; + break; + case "Cancel": + Search(); + RPARForm.ChangeMode(FormViewMode.ReadOnly); + RPARForm_ModeChanged(sender, e); + break; + case "Detail": // 差旅費 + pnlRPAD.Visible = !pnlRPAD.Visible; + + if (pnlRPAD.Visible) + { + _RPREN = WDAC.GetStringValue(e.CommandArgument); + ViewState["RPREN"] = _RPREN; + _RPSTP = bpsnDao.GetCurrentSite(UserId); + if (_RPSTP.EndsWith("站") || _RPSTP.EndsWith("台")) + _RPSTP = _RPSTP.Substring(0, _RPSTP.Length - 1); + ViewState["RPSTP"] = _RPSTP; + _RPEDP = (RPARForm.FindControl("lbRPAR_RPPLC") as ITextControl).Text; + ViewState["RPEDP"] = _RPEDP; + txtRPSTP.Text = _RPSTP; + txtRPEDP.Text = _RPEDP; + _RPDAT = (RPARForm.FindControl("lbRPAR_RPRDT") as ITextControl).Text; + ViewState["RPDAT"] = _RPDAT; + txtRPDAT.Text = _RPDAT; + txtRPF01.Text = "0"; + txtRPF02.Text = "0"; + txtRPF03.Text = "0"; + txtRPF04.Text = "0"; + txtRPF05.Text = "0"; + txtRPF06.Text = "0"; + txtRPF07.Text = "0"; + txtRPF08.Text = "0"; + txtRPVCH.Text = "0"; + txtRPDOC.Text = ""; + + gvRPAD.DataBind(); + } + break; + case "抽單": + RequiredFieldValidator rfvBSENO = RPARForm.FindControl("rfvBSENO") as RequiredFieldValidator; + rfvBSENO.Validate(); + if (!rfvBSENO.IsValid) + return; + + _RPREN = WDAC.GetStringValue(e.CommandArgument); + + // 抽單送簽 + 簽核人員 = ((e.CommandSource as Control).FindControl("ddlBSENO") as DropDownList).SelectedValue; + if (簽核人員.Length > 0) + { + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(); + try + { + rparDao.抽單(tran, _RPREN, 簽核人員); + rpabDao.抽單(tran, _RPREN, 簽核人員, UserId); + tran.Commit(); + } + catch + { + tran.Rollback(); + throw; + } + finally + { + conn.Close(); + conn.Dispose(); + conn = null; + tran = null; + } + + 發抽單通知郵件(_RPREN); + + RPARForm.DataBind(); + RPABGrid.DataBind(); + } + break; + case "取消抽單": + _RPREN = WDAC.GetStringValue(e.CommandArgument); + + conn = Query.NewConnection(Query.ConnectionString); + conn.Open(); + tran = conn.BeginTransaction(); + try + { + string 前關人員; + string 前關關卡; + DateTime 前關日期; + string 前關結果; + string 前關應簽; + 前關人員 = rpabDao.取消抽單(tran, _RPREN, out 前關關卡, out 前關日期, out 前關結果, out 前關應簽); + rparDao.取消抽單(tran, _RPREN, 前關應簽, 前關關卡, 前關結果, 前關日期, 前關人員); + tran.Commit(); + } + catch + { + tran.Rollback(); + throw; + } + finally + { + conn.Close(); + conn.Dispose(); + conn = null; + tran = null; + } + RPARForm.DataBind(); + RPABGrid.DataBind(); + break; + } + } + + protected void RPARForm_ModeChanged(object sender, EventArgs e) + { + switch (RPARForm.CurrentMode) + { + case FormViewMode.ReadOnly: + RPARGrid.Visible = true; + RPARGrid.DataBind(); + if (RPARGrid.Rows.Count > 0) + { + if (RPARGrid.SelectedIndex == -1) + { + RPARGrid.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert) + { + RPARGrid.PageIndex = 0; + // RPARGrid.PageIndex = RPARGrid.PageCount - 1; + RPARGrid.DataBind(); + RPARGrid.SelectedIndex = 0; + // RPARGrid.SelectedIndex = RPARGrid.Rows.Count - 1; + } + + RPARGrid.DataBind(); + RPARForm.DataBind(); + if (pnlRPAD.Visible) + gvRPAD.DataBind(); + } + RPABGrid.Visible = true; + break; + + case FormViewMode.Edit: + RPARGrid.Visible = false; + pnlRPAD.Visible = false; + RPABGrid.Visible = false; + break; + + case FormViewMode.Insert: + RPARGrid.Visible = false; + pnlRPAD.Visible = false; + RPABGrid.Visible = false; + break; + } + } + + protected void RPARForm_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + private void GetHours(DateTime rprdt) + { + 可用補休 = rparDao.Get可用補休(UserId, rprdt); + 可用特休 = ryerDao.Get可用特休(UserId, rprdt.Year, rprdt.Month, rprdt.Day); + if (OverTimeToMinute) + lb可用補休.Text = (可用補休 / 60).ToString() + ":" + (可用補休 - 可用補休 / 60 * 60).ToString(); + else + lb可用補休.Text = (可用補休 / 60).ToString(); + lb可用特休.Text = (可用特休 / 60).ToString(); + + 可用事假 = 年度事假 - rparDao.Get已請事假(UserId, rprdt, ""); + 可用病假 = 年度病假 - rparDao.Get已請病假(UserId, rprdt, ""); + if (可用事假 < 0) + 可用事假 = 0; + if (可用病假 < 0) + 可用病假 = 0; + + lb剩餘事假.Text = (可用事假 / 60).ToString(); + lb剩餘病假.Text = (可用病假 / 60).ToString(); + } + + protected void RPARForm_DataBound(object sender, EventArgs e) + { + switch (RPARForm.CurrentMode) + { + case FormViewMode.Edit: + (RPARForm.FindControl("lbRPAR_RPNUM") as ITextControl).Text = UserId; + (RPARForm.FindControl("lbRPAR_RPNUMX") as ITextControl).Text = UserName; + + RegisterCalendarEvent(RPARForm, "btnRPAR_RPRDT_DATE", "txtRPAR_RPRDT"); + RegisterCalendarEvent(RPARForm, "btnRPAR_RPEDT_DATE", "txtRPAR_RPEDT"); + RegisterLookupEvent(RPARForm, "btnRPAR_RPAGT_WQRY", "txtRPAR_RPAGT", + "txtRPAR_RPAGT,txtRPAR_RPAGM", "BPSNEML", + "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)", + false); + + SetClientFocus(RPARForm, "txtRPAR_RPRDT"); + break; + case FormViewMode.Insert: + (RPARForm.FindControl("lbRPAR_RPNUM") as ITextControl).Text = UserId; + (RPARForm.FindControl("lbRPAR_RPNUMX") as ITextControl).Text = UserName; + + RegisterCalendarEvent(RPARForm, "btnRPAR_RPRDT_DATE", "txtRPAR_RPRDT"); + RegisterCalendarEvent(RPARForm, "btnRPAR_RPEDT_DATE", "txtRPAR_RPEDT"); + RegisterLookupEvent(RPARForm, "btnRPAR_RPAGT_WQRY", "txtRPAR_RPAGT", + "txtRPAR_RPAGT,txtRPAR_RPAGM", "BPSNEML", + "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)", + false); + + switch (rparType) + { + case RPAR_TYPE.T0_請假: + var RPRTM = RPARForm.FindControl("RPRTM") as utility_TimeInput; + var RPETM = RPARForm.FindControl("RPETM") as utility_TimeInput; + if (RPRTM != null) + RPRTM.Time = 上班時間; + if (RPETM != null) + RPETM.Time = 下班時間; + break; + case RPAR_TYPE.T1_加班: + var RPDOC = RPARForm.FindControl("txtRPAR_RPDOC") as ITextControl; + if (RPDOC != null) + RPDOC.Text = "平日辦公室內"; + break; + case RPAR_TYPE.T3_出差: + //(RPARForm.FindControl("txtRPAR_RPFTR") as ITextControl).Text = "0"; + break; + } + + SetClientFocus(RPARForm, "txtRPAR_RPNUM"); + break; + case FormViewMode.ReadOnly: + _RPREN = WDAC.GetStringValue(RPARForm.DataKey["RPREN"]); + ViewState["RPREN"] = _RPREN; + + if (rparType == RPAR_TYPE.T3_出差 && pnlRPAD.Visible) + { + // 帶入差旅地點 + _RPEDP = (RPARForm.FindControl("lbRPAR_RPPLC") as ITextControl).Text; + ViewState["RPEDP"] = _RPEDP; + txtRPEDP.Text = _RPEDP; + + // 帶入差旅日期 + _RPDAT = (RPARForm.FindControl("lbRPAR_RPRDT") as ITextControl).Text; + ViewState["RPDAT"] = _RPDAT; + txtRPDAT.Text = _RPDAT; + + txtRPVCH.Text = "0"; + } + break; + } + GetHours(DateTime.UtcNow.AddHours(8).Date); + } + + protected void RPARGrid_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(RPARGrid, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void RPARGrid_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in RPARGrid.Rows) + SetGridViewMouseBehavier(RPARGrid, row); + if (pnlRPAD.Visible) + gvRPAD.DataBind(); + + // pnlRPAD.Visible = false; + } + + protected new bool CheckInput(System.Collections.Specialized.IOrderedDictionary values) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + //BhrdDAC bhrd = new BhrdDAC(); + + bool result = true; + string rptyp = WDAC.GetStringValue(values["RPTYP"]); + string rpren = WDAC.GetStringValue(values["RPREN"]); + int rptct = 0; + + switch (rparType) + { + case RPAR_TYPE.T0_請假: // 請假 + values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的開始日期", ref result, cvMessage); + values["RPEDT"] = CheckDate(values["RPEDT"], "請輸入正確的結束日期", ref result, cvMessage); + + DateTime sdt = WDAC.GetDateTimeValue(values["RPRDT"]); + DateTime edt = WDAC.GetDateTimeValue(values["RPEDT"]); + string stm = WDAC.GetStringValue(values["RPRTM"]); + string etm = WDAC.GetStringValue(values["RPETM"]); + + // 關帳 + if (!CheckCloseAccount(sdt, edt)) + { + result = false; + cvMessage.ErrorMessage += "此月份已關帳,不可輸入單據"; + cvMessage.IsValid = false; + } + + // 日期 + if (sdt > edt) + { + result = false; + cvMessage.ErrorMessage += "開始日期 不可大於 結束日期"; + cvMessage.IsValid = false; + } + + // 時間必須輸入 + if (stm == "") + { + result = false; + cvMessage.ErrorMessage += "開始時間必須輸入"; + cvMessage.IsValid = false; + } + if (etm == "") + { + result = false; + cvMessage.ErrorMessage += "結束時間必須輸入"; + cvMessage.IsValid = false; + } + if (sdt == edt && stm.CompareTo(etm) > 0) + { + result = false; + cvMessage.ErrorMessage += "開始時間必須早於結束時間"; + cvMessage.IsValid = false; + } + + // 假日,檢查頭尾是否為假日,但是產假不用檢查 + if (rptyp != RPAR_TYPE.T05_產假 && bhrdDao.IsHoliday(UserId, sdt)) + { + result = false; + cvMessage.ErrorMessage += String.Format("{0:yyyy-MM-dd} 是假日,不需請假。", sdt); + cvMessage.IsValid = false; + } + + if (rptyp != RPAR_TYPE.T05_產假 && bhrdDao.IsHoliday(UserId, edt)) + { + result = false; + cvMessage.ErrorMessage += String.Format("{0:yyyy-MM-dd} 是假日,不需請假。", edt); + cvMessage.IsValid = false; + } + + /* + while (sdt <= edt) + { + if (bhrdDao.IsHoliday(sdt)) + { + result = false; + cvMessage.ErrorMessage += String.Format("{0:yyyy-MM-dd} 是假日,不需請假。", sdt); + cvMessage.IsValid = false; + } + sdt = sdt.AddDays(1); + } + */ + + // 計算時數 + rptct = timeCalc.計算請假總時數(UserId, sdt, edt, stm, etm, rptyp, !OverTimeToMinute); + + // 補休時數不足 + if (rptyp == RPAR_TYPE.T00_補休 && rparDao.Get可用補休(UserId, sdt) < rptct) + { + result = false; + cvMessage.ErrorMessage += "補休時數不足!"; + cvMessage.IsValid = false; + } + + // 特休時數不足 + if (rptyp == RPAR_TYPE.T01_特休 && ryerDao.Get可用特休(UserId, sdt.Year, sdt.Month, sdt.Day) < rptct) + { + result = false; + cvMessage.ErrorMessage += "特休時數不足!"; + cvMessage.IsValid = false; + } + + // 必須輸入代理人 + if (WDAC.GetStringValue(values["RPAGT"]).Trim().Length == 0 || WDAC.GetStringValue(values["RPAGM"]).Trim().Length == 0) + { + result = false; + cvMessage.ErrorMessage += "請輸入代理人!"; + cvMessage.IsValid = false; + } + + // 代理人是否請假或差勤的檢查 + if (rparDao.代理人不在(WDAC.GetStringValue(values["RPAGT"]), WDAC.GetStringValue(values["RPAGM"]), sdt, edt, stm, etm)) + { + result = false; + cvMessage.ErrorMessage += "代理人請假或差勤,請選擇其他代理人!"; + cvMessage.IsValid = false; + } + + // 自己是否是代理人的檢查 + var email = bpsnDao.GetEmail(UserId); + var 代理人 = rparDao.我是代理人的單據(UserName, email, sdt, edt, stm, etm); + if (代理人.Rows.Count > 0) + { + // 發郵件通知該同仁 + var r = 代理人.Rows[0]; + 發代理人差假衝突郵件(rpren, rptyp, WDAC.GetStringValue(r["BPEML"]), UserName); + + // 發郵件通知計畫督導、計畫專員 + var 督導 = rparDao.取得督導(rpren); + foreach (DataRow r督導 in 督導.Rows) + { + 發代理人差假衝突郵件給督導( + rpren, + rptyp, + WDAC.GetStringValue(r督導["BPEML"]), + UserName, + WDAC.GetStringValue(r["BPNME"]), + WDAC.GetStringValue(r["BPMB1"]), + WDAC.GetStringValue(r["BPMB2"])); + } + + result = false; + cvMessage.ErrorMessage += "您這段時間已被指定為職務代理人,無法申請請假,系統已通知相關人員修改代理人!"; + cvMessage.IsValid = false; + } + + + break; + case RPAR_TYPE.T1_加班: // 加班 + values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的日期", ref result, cvMessage); + DateTime rprdt = Convert.ToDateTime(values["RPRDT"]); + stm = WDAC.GetStringValue(values["RPRTM"]); + etm = WDAC.GetStringValue(values["RPETM"]); + sdt = WDAC.GetDateTimeValue(values["RPRDT"]); + + // 計算時數 + rptct = timeCalc.計算加班時數(UserId, sdt, stm, etm, RPAR_TYPE.休息日加班(rparType)); + + // 關帳檢查 + if (!CheckCloseAccount(rprdt, new DateTime())) + { + result = false; + cvMessage.ErrorMessage += "此月份已關帳,不可輸入單據"; + cvMessage.IsValid = false; + } + + // 檢查不可輸入同樣的加班單 + if (rparDao.加班單是否重複(WDAC.GetStringValue(values["RPREN"]), + WDAC.GetStringValue(values["RPNUM"]), + rprdt, + null, + stm, + etm)) + { + result = false; + cvMessage.ErrorMessage += "已輸入相同的加班單"; + cvMessage.IsValid = false; + } + + // 時間必須輸入 + if (stm == "") + { + result = false; + cvMessage.ErrorMessage += "開始時間必須輸入"; + cvMessage.IsValid = false; + } + if (etm == "") + { + result = false; + cvMessage.ErrorMessage += "結束時間必須輸入"; + cvMessage.IsValid = false; + } + if (stm.CompareTo(etm) > 0) + { + result = false; + cvMessage.ErrorMessage += "開始時間必須早於結束時間"; + cvMessage.IsValid = false; + } + + // 計算加班時數 + //string boptt = new BpaaDAC(Query).GetOverTimeType(_RPPYN); + //rptct = timeCalc.計算加班時數(UserId, rprdt, stm, etm, rptyp == "13" || rptyp == "14"); + + if (RPAR_TYPE.休息日加班(rptyp)) + { + // 檢查休息日加班 + string message; + if (!rparDao.檢查休息日加班(UserId, rprdt, rpren, out message)) + { + result = false; + cvMessage.ErrorMessage = message; + cvMessage.IsValid = false; + } + } + + // 全月加班時數限制 46 小時 + var ot_time = rparDao.Select當月加班時數(rprdt, UserId, rpren) + rptct; + if (ot_time > 46 * 60) + { + result = false; + cvMessage.ErrorMessage = "加班日的同月加班時數已超過 46 小時"; + cvMessage.IsValid = false; + } + + //if (rptct < 0) + //{ + // result = false; + // cvMessage.ErrorMessage = "結束時間不可早於開始時間"; + // cvMessage.IsValid = false; + //} + + /* + if (!bhrd.IsHoliday(Convert.ToDateTime(values["RPRDT"]))) + { + if (Convert.ToInt32(values["RPTCT"]) > 4) + { + result = false; + cvMessage.ErrorMessage += "平日加班不可超過 4 小時"; + cvMessage.IsValid = false; + } + } + else + { + if (Convert.ToInt32(values["RPTCT"]) > 8) + { + result = false; + cvMessage.ErrorMessage += "假日加班不可超過 8 小時"; + cvMessage.IsValid = false; + } + } + */ + break; + case RPAR_TYPE.T21_電話費: // 電話費 + case RPAR_TYPE.T22_油料費: // 油料費 + values["RPRDT"] = CheckDate(values["RPRDT"].ToString() + "01", "請輸入正確的年月", ref result, cvMessage); + break; + case RPAR_TYPE.T3_出差: // 差旅 + values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的開始日期", ref result, cvMessage); + values["RPEDT"] = CheckDate(values["RPEDT"], "請輸入正確的結束日期", ref result, cvMessage); + + sdt = WDAC.GetDateTimeValue(values["RPRDT"]); + edt = WDAC.GetDateTimeValue(values["RPEDT"]); + stm = WDAC.GetStringValue(values["RPRTM"]); + etm = WDAC.GetStringValue(values["RPETM"]); + + // 關帳檢查 + if (!CheckCloseAccount(values["RPRDT"], values["RPEDT"])) + { + result = false; + cvMessage.ErrorMessage += "此月份已關帳,不可輸入單據"; + cvMessage.IsValid = false; + } + + if (Convert.ToDateTime(values["RPRDT"]).CompareTo(values["RPEDT"]) > 0) + { + result = false; + cvMessage.ErrorMessage += "開始日期 不可大於 結束日期"; + cvMessage.IsValid = false; + } + + // 時間必須輸入 + if (stm == "") + { + result = false; + cvMessage.ErrorMessage += "開始時間必須輸入"; + cvMessage.IsValid = false; + } + if (etm == "") + { + result = false; + cvMessage.ErrorMessage += "結束時間必須輸入"; + cvMessage.IsValid = false; + } + if (sdt == edt && stm.CompareTo(etm) > 0) + { + result = false; + cvMessage.ErrorMessage += "開始時間必須早於結束時間"; + cvMessage.IsValid = false; + } + + if (WDAC.GetStringValue(values["RPPLC"]).Trim().Length == 0) + { + result = false; + cvMessage.ErrorMessage += "差旅地點必須輸入"; + cvMessage.IsValid = false; + } + if (WDAC.GetStringValue(values["RPRSN"]).Trim().Length == 0) + { + result = false; + cvMessage.ErrorMessage += "差旅事由必須輸入"; + cvMessage.IsValid = false; + } + + // 必須輸入代理人 + if (WDAC.GetStringValue(values["RPAGT"]).Trim().Length == 0 || WDAC.GetStringValue(values["RPAGM"]).Trim().Length == 0) + { + result = false; + cvMessage.ErrorMessage += "請輸入代理人!"; + cvMessage.IsValid = false; + } + + // 代理人檢查 + if (rparDao.代理人不在(WDAC.GetStringValue(values["RPAGT"]), WDAC.GetStringValue(values["RPAGM"]), sdt, edt, 上班時間, 下班時間)) + { + result = false; + cvMessage.ErrorMessage += "代理人請假或差勤,請選擇其他代理人!"; + cvMessage.IsValid = false; + } + + // 2017/05/03 修改為代理人當天可以申請差勤 + // + // 自己是否是代理人的檢查 + //email = bpsnDao.GetEmail(UserId); + //代理人 = rparDao.我是代理人的單據(UserName, email, sdt, edt, 上班時間, 下班時間); + //if (代理人.Rows.Count > 0) + //{ + // // 發郵件通知該同仁 + // var r = 代理人.Rows[0]; + // var rpren = WDAC.GetStringValue(r["RPREN"]); + // 發代理人差假衝突郵件(rpren, rptyp, WDAC.GetStringValue(r["BPEML"]), UserName); + + // // 發郵件通知計畫督導、計畫專員 + // var 督導 = rparDao.取得督導(rpren); + // foreach (DataRow r督導 in 督導.Rows) + // { + // 發代理人差假衝突郵件給督導( + // rpren, + // rptyp, + // WDAC.GetStringValue(r督導["BPEML"]), + // UserName, + // WDAC.GetStringValue(r["BPNME"]), + // WDAC.GetStringValue(r["BPMB1"]), + // WDAC.GetStringValue(r["BPMB2"])); + // } + + // result = false; + // cvMessage.ErrorMessage += "您這段時間已被指定為職務代理人,無法申請差勤,系統已通知相關人員修改代理人!"; + // cvMessage.IsValid = false; + //} + + + break; + } + + string attachErrorMessage; + + if (!CheckAttachment(out attachErrorMessage)) + { + result = false; + cvMessage.ErrorMessage += attachErrorMessage; + cvMessage.IsValid = false; + } + + ProcessCustomValidatorMessage(cvMessage); + return result; + } + + protected void RPARForm_ItemInserting(object sender, FormViewInsertEventArgs e) + { + if (RPARForm.FindControl("ddlRPAR_RPTYP") != null) + e.Values["RPTYP"] = (RPARForm.FindControl("ddlRPAR_RPTYP") as DropDownList).SelectedValue; + + // 抓起始時間與結束時間 + /* + if (RPARForm.FindControl("ddlSTH") != null) + { + e.Values["RPRTM"] = (RPARForm.FindControl("ddlSTH") as DropDownList).SelectedValue + ":00"; + e.Values["RPETM"] = (RPARForm.FindControl("ddlEDH") as DropDownList).SelectedValue + ":00"; + } + */ + + // 簽核人員 + if (RPARForm.FindControl("ddlBSENO") != null) + e.Values["RPAPU"] = (RPARForm.FindControl("ddlBSENO") as DropDownList).SelectedValue; + + e.Values["RPNUM"] = UserId; + e.Values["RPPYN"] = _RPPYN; + + + // 暫存附件 + TempSaveAttachment(); + + e.Cancel = !CheckInput(e.Values); + } + + protected void RPARForm_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + if (RPARForm.FindControl("ddlRPAR_RPTYP") != null) + e.NewValues["RPTYP"] = (RPARForm.FindControl("ddlRPAR_RPTYP") as DropDownList).SelectedValue; + + // 抓起始時間與結束時間 + /* + if (RPARForm.FindControl("ddlSTH") != null) + { + e.NewValues["RPRTM"] = (RPARForm.FindControl("ddlSTH") as DropDownList).SelectedValue + ":00"; + e.NewValues["RPETM"] = (RPARForm.FindControl("ddlEDH") as DropDownList).SelectedValue + ":00"; + } + */ + + e.Cancel = !CheckInput(e.NewValues); + + // 記住舊類別,以便做請補休假的判斷 + oldRPTYP = WDAC.GetStringValue(e.OldValues["RPTYP"]); + + // 簽核人員 + if (RPARForm.FindControl("ddlBSENO") != null) + e.NewValues["RPAPU"] = (RPARForm.FindControl("ddlBSENO") as DropDownList).SelectedValue; + + // 已簽核不可更正 + // int rpano = WDAC.GetInt32Value(e.OldValues["RPANO"]); + // 20181128 修正,從資料庫抓取最新簽核狀況 + var rparItem = rparDao.SelectOne(WDAC.GetStringValue(e.Keys["RPREN"])).FirstOrDefault(); + if (rparItem != null) + { + if (rparItem.RPANO == "D") + { + e.Cancel = true; + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "抽單不可更正"; + } + else + { + int rpano = WDAC.GetInt32Value(rparItem.RPANO); + if (rpano > 1) + { + e.Cancel = true; + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "已簽核,不可更正"; + } + } + } + // 暫存附件 + TempSaveAttachment(); + } + + private void TempSaveAttachment() + { + var fuRPATH = RPARForm.FindControl("fuRPATH") as FileUpload; + var fuRPAT2 = RPARForm.FindControl("fuRPAT2") as FileUpload; + var fuRPAT3 = RPARForm.FindControl("fuRPAT3") as FileUpload; + + if (fuRPATH != null && fuRPATH.HasFile) + { + attachFileExt1 = Path.GetExtension(fuRPATH.FileName); + if (".jpg|.jpeg|.png|.gif|.bmp".Contains(attachFileExt1.ToLower()) && !string.IsNullOrEmpty(attachFileExt1)) + { + MemoryStream ms = WGuard1.縮圖(fuRPATH.FileContent, 1366, 1366); + attachFile1 = new byte[ms.Length]; + ms.Position = 0; + ms.Read(attachFile1, 0, (int)ms.Length); + } + else + { + attachFile1 = new byte[fuRPATH.FileContent.Length]; + fuRPATH.FileContent.Read(attachFile1, 0, (int)fuRPATH.FileContent.Length); + } + } + + if (fuRPAT2 != null && fuRPAT2.HasFile) + { + attachFileExt2 = Path.GetExtension(fuRPAT2.FileName); + if (".jpg|.jpeg|.png|.gif|.bmp".Contains(attachFileExt2.ToLower()) && !string.IsNullOrEmpty(attachFileExt2)) + { + MemoryStream ms = WGuard1.縮圖(fuRPAT2.FileContent, 1366, 1366); + + attachFile2 = new byte[ms.Length]; + ms.Position = 0; + ms.Read(attachFile2, 0, (int)ms.Length); + } + else + { + attachFile2 = new byte[fuRPAT2.FileContent.Length]; + fuRPAT2.FileContent.Read(attachFile2, 0, (int)fuRPAT2.FileContent.Length); + } + } + + if (fuRPAT3 != null && fuRPAT3.HasFile) + { + attachFileExt3 = Path.GetExtension(fuRPAT3.FileName); + if (".jpg|.jpeg|.png|.gif|.bmp".Contains(attachFileExt3.ToLower()) && !string.IsNullOrEmpty(attachFileExt3)) + { + MemoryStream ms = WGuard1.縮圖(fuRPAT3.FileContent, 1366, 1366); + + attachFile3 = new byte[ms.Length]; + ms.Position = 0; + ms.Read(attachFile3, 0, (int)ms.Length); + } + else + { + attachFile3 = new byte[fuRPAT3.FileContent.Length]; + fuRPAT3.FileContent.Read(attachFile3, 0, (int)fuRPAT3.FileContent.Length); + } + } + + var cbDelAttach1 = RPARForm.FindControl("cbDelAttach1") as CheckBox; + var cbDelAttach2 = RPARForm.FindControl("cbDelAttach2") as CheckBox; + var cbDelAttach3 = RPARForm.FindControl("cbDelAttach3") as CheckBox; + + attachDelete1 = cbDelAttach1 != null && cbDelAttach1.Checked; + attachDelete2 = cbDelAttach2 != null && cbDelAttach2.Checked; + attachDelete3 = cbDelAttach3 != null && cbDelAttach3.Checked; + } + + private bool CheckAttachment(out string errorMessage) + { + errorMessage = ""; + bool result = true; + string allowExt = ".jpg|.jpeg|.png|.gif|.bmp|.pdf"; + + FileUpload fuRPATH = RPARForm.FindControl("fuRPATH") as FileUpload; + FileUpload fuRPAT2 = RPARForm.FindControl("fuRPAT2") as FileUpload; + FileUpload fuRPAT3 = RPARForm.FindControl("fuRPAT3") as FileUpload; + + if (fuRPATH != null && fuRPATH.HasFile) + { + attachFileExt1 = Path.GetExtension(fuRPATH.FileName).ToLower(); + if (!allowExt.Contains(attachFileExt1)) + { + errorMessage = "附件僅接受 JPG, PNG, GIF, BMP, PDF 檔"; + result = false; + } + } + + if (fuRPAT2 != null && fuRPAT2.HasFile) + { + attachFileExt2 = Path.GetExtension(fuRPAT2.FileName).ToLower(); + if (!allowExt.Contains(attachFileExt2)) + { + errorMessage = "附件僅接受 JPG, PNG, GIF, BMP, PDF 檔"; + result = false; + } + } + + if (fuRPAT3 != null && fuRPAT3.HasFile) + { + attachFileExt3 = Path.GetExtension(fuRPAT3.FileName).ToLower(); + if (!allowExt.Contains(attachFileExt3)) + { + errorMessage = "附件僅接受 JPG, PNG, GIF, BMP, PDF 檔"; + result = false; + } + } + + return result; + } + + protected void RPARForm_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 記住舊類別,以便做請補休假的判斷 + oldRPTYP = WDAC.GetStringValue(e.Values["RPTYP"]); + DateTime rprdt; + DateTime rpedt; + CheckDate(WDAC.GetStringValue(e.Values["RPRDT"]), out rprdt); + CheckDate(WDAC.GetStringValue(e.Values["RPEDT"]), out rpedt); + + // 刪除前檢查 + // 已關帳不可刪除 + if (!CheckCloseAccount(rprdt, rpedt)) + { + e.Cancel = true; + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "已關帳,不可刪除"; + } + // 已簽核不可刪除 + if (!CanEdit(rprdt, rpedt, e.Values["RPANO"], e.Values["RPAPD"])) + { + e.Cancel = true; + cvMessage.IsValid = false; + cvMessage.ErrorMessage = "已簽核,不可刪除"; + } + } + + protected void RPARForm_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void RPARForm_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void RPARForm_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + var keys = e.Keys; + + // 刪除相關差旅費紀錄 + foreach (DictionaryEntry key in keys) + { + if (WDAC.GetStringValue(key.Key) == "RPREN") + { + rpadDao.DeleteByRpren(WDAC.GetStringValue(key.Value)); + break; + } + } + + Search(); + RPARGrid.DataBind(); + if (RPARGrid.SelectedIndex > RPARGrid.Rows.Count - 1) + { + RPARGrid.SelectedIndex = RPARGrid.Rows.Count - 1; + RPARGrid.DataBind(); + } + RPARForm.DataBind(); + if (pnlRPAD.Visible) + gvRPAD.DataBind(); + } + + protected void cvRPTCT_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i > 0; + } + + protected void cvRPNUM_ServerValidate(object source, ServerValidateEventArgs args) + { + args.IsValid = args.Value != "" && bpsnDao.IsExist(args.Value, true); + } + + protected void btnInsertRPAD_Click(object sender, EventArgs e) + { + //_RPREN = WDAC.GetStringValue(RPARGrid.SelectedValue); + //_RPSTP = WDAC.GetStringValue(ViewState["RPSTP"]); + //_RPEDP = WDAC.GetStringValue(ViewState["RPEDP"]); + + cvRPAD.Validate(); + if (!cvRPAD.IsValid) + return; + + DateTime rprdt, rpedt, rpdat; + CheckDate(txtRPDAT.Text, out rpdat); + + var c_rprdt = (RPARForm.FindControl("lbRPAR_RPRDT") as ITextControl); + var c_rpedt = (RPARForm.FindControl("lbRPAR_RPEDT") as ITextControl); + + if (c_rprdt != null) + CheckDate(c_rprdt.Text, out rprdt); + if (c_rpedt != null) + CheckDate(c_rpedt.Text, out rpedt); + + rpadDao.InsertOne(UserId, _RPREN, txtRPSTP.Text, txtRPEDP.Text, + WDAC.GetInt32Value(txtRPF01.Text), + WDAC.GetInt32Value(txtRPF02.Text), + WDAC.GetInt32Value(txtRPF03.Text), + WDAC.GetInt32Value(txtRPF04.Text), + WDAC.GetInt32Value(txtRPF05.Text), + WDAC.GetInt32Value(txtRPF06.Text), + WDAC.GetInt32Value(txtRPF07.Text), + WDAC.GetInt32Value(txtRPF08.Text), + 0, + 0, + rpdat, + txtRPVCH.Text, + txtRPDOC.Text); + + gvRPAD.DataBind(); + RPARForm.DataBind(); + RPARGrid.DataBind(); + + txtRPDAT.Text = _RPDAT; + //txtRPSTP.Text = ""; + //txtRPEDP.Text = ""; + txtRPSTP.Text = _RPSTP; + txtRPEDP.Text = _RPEDP; + txtRPF01.Text = "0"; + txtRPF02.Text = "0"; + txtRPF03.Text = "0"; + txtRPF04.Text = "0"; + txtRPF05.Text = "0"; + txtRPF06.Text = "0"; + txtRPF07.Text = "0"; + txtRPF08.Text = "0"; + txtRPVCH.Text = "0"; + txtRPDOC.Text = ""; + } + + protected void dsRpad_ObjectCreating(object sender, ObjectDataSourceEventArgs e) + { + e.ObjectInstance = rpadDao; + } + + protected void dsRpad_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + //_RPREN = WDAC.GetStringValue(ViewState["RPREN"]); + //e.InputParameters["rpren"] = _RPREN; + } + + protected void dsRpad_Updated(object sender, ObjectDataSourceStatusEventArgs e) + { + RPARForm.DataBind(); + RPARGrid.DataBind(); + } + + protected void dsRpad_Deleted(object sender, ObjectDataSourceStatusEventArgs e) + { + RPARForm.DataBind(); + RPARGrid.DataBind(); + } + + protected void btnHideRPAD_Click(object sender, EventArgs e) + { + pnlRPAD.Visible = false; + } + + /// + /// 關帳檢查 + /// + /// 起始日 + /// 結束日 + /// True=通過檢查, False=不通過檢查 + protected bool CheckCloseAccount(object rprdt, object rpedt) + { + DateTime rdt = WDAC.GetDateTimeValue(rprdt); + DateTime edt = WDAC.GetDateTimeValue(rpedt); + + if (edt.Ticks != 0) + return (關帳日期 < rdt && 關帳日期 < edt); + else + return (關帳日期 < rdt); + } + + /// + /// 是否可編輯 + /// + /// 起始日 + /// 結束日 + /// 已簽核次數 + /// + protected bool CanEdit(object rprdt, object rpedt, object rpano, object rpapd) + { + string ano = WDAC.GetStringValue(rpano); + DateTime apd = WDAC.GetDateTimeValue(rpapd); + return CheckCloseAccount(rprdt, rpedt) && (ano == "1") && (apd.Ticks == 0); + } + + /// + /// 是否可編輯 + /// + /// 單號 + protected bool CanEdit(object rpren) + { + if (rpren == null) + return false; + + RPARList d = rparDao.SelectOne(WDAC.GetStringValue(rpren)); + if (d.Count > 0) + return CanEdit(d[0].RPRDT, d[0].RPEDT, d[0].RPANO, d[0].RPAPD); + else + return false; + } + + /// + /// 是否可抽單 + /// + /// 起始日 + /// 結束日 + /// 本關關卡數 + /// + protected bool CanWithdraw(object rprdt, object rpedt, object rpano) + { + string ano = WDAC.GetStringValue(rpano); + return CheckCloseAccount(rprdt, rpedt) && (ano != "D"); + } + + /// + /// 是否可抽單 + /// + /// 單號 + protected bool CanWithdraw(object rpren) + { + if (rpren == null) + return false; + + RPARList d = rparDao.SelectOne(WDAC.GetStringValue(rpren)); + if (d.Count > 0) + return CanWithdraw(d[0].RPRDT, d[0].RPEDT, d[0].RPANO); + else + return false; + } + + protected void dsBSGP_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + e.InputParameters["BSPYN"] = _RPPYN; + } + + protected new string GetBPNME(object RPENO) + { + string rpeno = WDAC.GetStringValue(RPENO); + + if (rpeno.Length > 0 && rpeno.Substring(0, 1) == "Z") + { + return GetLookup("BPAP", rpeno, "BPNME", ""); + } + else + { + return GetLookup("BPSN", rpeno, "BPNME", ""); + } + } + + private void 發代理人郵件(string _RPREN) + { + RPARList t = rparDao.SelectOne(_RPREN); + if (t.Count > 0) + { + string 差勤人 = GetLookup("BPSN", t[0].RPNUM, "BPNME"); + string 代理人 = t[0].RPAGT; + string 代理人電郵 = t[0].RPAGM; + string 類別 = t[0].RPTYP; + string 起日 = ""; + string 迄日 = ""; + string 起時 = t[0].RPRTM; + string 迄時 = t[0].RPETM; + string 備註 = t[0].RPDOC; + string 事由 = t[0].RPRSN; + int 時數 = t[0].RPTCT; + + if (t[0].RPRDT.Ticks > 0) + 起日 = String.Format("{0:yyyy-MM-dd}", t[0].RPRDT); + if (t[0].RPEDT.Ticks > 0) + 迄日 = String.Format("{0:yyyy-MM-dd}", t[0].RPEDT); + + switch (類別.Substring(0, 1)) + { + // 請假 + case RPAR_TYPE.T0_請假: + 類別 = "請假"; + break; + // 差旅 + case RPAR_TYPE.T3_出差: + 類別 = "差旅"; + break; + default: + return; + } + + // 發送郵件 + try + { + MailMessage mm = new MailMessage(); + mm.Subject = String.Format("{1}代理人通知 [單號:{0}]", _RPREN, 類別); + mm.To.Add(new MailAddress(代理人電郵)); + mm.BodyEncoding = Encoding.UTF8; + mm.IsBodyHtml = true; + mm.Body = File.ReadAllText(Server.MapPath("~/Template/代理人通知.html")) + .Replace("{類別}", 類別) + .Replace("{單號}", _RPREN) + .Replace("{差勤人}", 差勤人) + .Replace("{事由}", 類別 == "請假" ? 事由 : 備註) + .Replace("{起日}", 起日) + .Replace("{起時}", 起時) + .Replace("{迄日}", 迄日) + .Replace("{迄時}", 迄時) + ; + + Wellan.Service.WMailSender.GetInstance().Send(mm, string.Format("差勤代理人通知 單號:{0}", _RPREN)); + } + catch + { } + } + } + + private void 發抽單通知郵件(string _RPREN) + { + // 取得這張單子目前的簽核資料 + RPARList 單 = rparDao.SelectOne(_RPREN); + DataTable 簽核 = rpabDao.SelectRpren(_RPREN); + + if (單.Count == 0 || 簽核.Rows.Count == 0) + return; + + string 差勤人 = GetLookup("BPSN", 單[0].RPNUM, "BPNME"); + string 代理人 = 單[0].RPAGT; + string 代理人電郵 = 單[0].RPAGM; + string 類別 = 單[0].RPTYP; + string 起日 = ""; + string 迄日 = ""; + string 起時 = 單[0].RPRTM; + string 迄時 = 單[0].RPETM; + string 備註 = 單[0].RPDOC; + string 事由 = 單[0].RPRSN; + int 時數 = 單[0].RPTCT; + + if (單[0].RPRDT.Ticks > 0) + 起日 = String.Format("{0:yyyy-MM-dd}", 單[0].RPRDT); + if (單[0].RPEDT.Ticks > 0) + 迄日 = String.Format("{0:yyyy-MM-dd}", 單[0].RPEDT); + + bool 要發代理人 = false; + switch (類別.Substring(0, 1)) + { + // 請假 + case RPAR_TYPE.T0_請假: + 類別 = "請假"; + 要發代理人 = true; + break; + // 加班 + case RPAR_TYPE.T1_加班: + 類別 = "加班"; + break; + // 差旅 + case RPAR_TYPE.T3_出差: + 類別 = "差旅"; + 要發代理人 = true; + break; + default: + return; + } + + MailMessage mm = new MailMessage(); + mm.Subject = String.Format("{1}單抽單通知 [單號:{0}]", _RPREN, 類別); + + // 請假、差旅要發給代理人 + if (要發代理人) + mm.To.Add(new MailAddress(代理人電郵)); + + // 除了抽單關與第一關之外,其他如果有簽准的都要發抽單通知 + foreach (DataRow row in 簽核.Rows) + { + string rpapp = WDAC.GetStringValue(row["RPAPP"]); + string rpano = WDAC.GetStringValue(row["RPANO"]); + string rpeno = WDAC.GetStringValue(row["RPENO"]); + if (rpapp != "Y" || rpano == "1" || rpano == "D") + continue; + + if (rpeno.ToUpper().StartsWith("Z")) + mm.To.Add(new MailAddress(bpapDao.GetEmail(rpeno))); + else + mm.To.Add(new MailAddress(bpsnDao.GetEmail(rpeno))); + } + + mm.BodyEncoding = Encoding.UTF8; + mm.IsBodyHtml = true; + mm.Body = File.ReadAllText(Server.MapPath("~/Template/抽單通知.html")) + .Replace("{類別}", 類別) + .Replace("{單號}", _RPREN) + .Replace("{差勤人}", 差勤人) + .Replace("{事由}", 事由) + .Replace("{起日}", 起日) + .Replace("{起時}", 起時) + .Replace("{迄日}", 迄日) + .Replace("{迄時}", 迄時) + ; + // mm.Body = String.Format( + // @" + // + // + // + // + // + //

{0}單抽單通知

+ // 您好!通知您以下人員{0}單已由申請人抽單。

+ // + // + // + // + // + // + //
單號{1}
人員{2}
事由{3}
起始時間{4} {5}
結束時間{6} {7}

+ // (本郵件由系統自動發送,請勿直接回覆) + // + //", 類別, _RPREN, 差勤人, 事由, 起日, 起時, 迄日, 迄時); + + // SmtpClient sc = new SmtpClient(); + + // 發送郵件 + try + { + Wellan.Service.WMailSender.GetInstance().Send(mm, string.Format("差勤抽單 單號:{0}", _RPREN)); + // sc.Send(mm); + } + catch + { } + //catch (Exception ex) + //{ + // WGuard1.WLogFile(Server.MapPath("~/LOG/MailFail_"), WGuard1.WLogType.Day, + // string.Format("差勤單號:{0} 錯誤訊息:{1}", _RPREN, ex.Message)); + //} + //finally + //{ + // mm.Dispose(); + //} + } + + private void 發代理人差假衝突郵件(string _RPREN, string 類別, string 差勤人郵箱, string 代理人) + { + if (string.IsNullOrEmpty(差勤人郵箱)) + return; + + switch (類別.Substring(0, 1)) + { + // 請假 + case RPAR_TYPE.T0_請假: + 類別 = "請假"; + break; + // 差旅 + case RPAR_TYPE.T3_出差: + 類別 = "差旅"; + break; + default: + return; + } + + MailMessage mm = new MailMessage(); + mm.Subject = String.Format("{1}代理人請假/差旅通知 [單號:{0}]", _RPREN, 類別); + mm.To.Add(new MailAddress(差勤人郵箱)); + mm.BodyEncoding = Encoding.UTF8; + mm.IsBodyHtml = true; + mm.Body = File.ReadAllText(Server.MapPath("~/Template/代理人差假通知原差勤人.html")) + .Replace("{類別}", 類別) + .Replace("{單號}", _RPREN) + .Replace("{代理人}", 代理人) + ; + // 發送郵件 + try + { + Wellan.Service.WMailSender.GetInstance().Send(mm, string.Format("代理人請假/差旅通知 單號:{0}", _RPREN)); + } + catch + { } + } + + private void 發代理人差假衝突郵件給督導(string _RPREN, string 類別, string 督導郵箱, string 代理人, string 差勤人, string 代理人電話1, string 代理人電話2) + { + if (string.IsNullOrEmpty(督導郵箱)) + return; + + switch (類別.Substring(0, 1)) + { + // 請假 + case RPAR_TYPE.T0_請假: + 類別 = "請假"; + break; + // 差旅 + case RPAR_TYPE.T3_出差: + 類別 = "差旅"; + break; + default: + return; + } + + MailMessage mm = new MailMessage(); + mm.Subject = String.Format("{1}代理人請假/差旅通知 [單號:{0}]", _RPREN, 類別); + mm.To.Add(new MailAddress(督導郵箱)); + mm.BodyEncoding = Encoding.UTF8; + mm.IsBodyHtml = true; + mm.Body = File.ReadAllText(Server.MapPath("~/Template/代理人差假通知督導.html")) + .Replace("{類別}", 類別) + .Replace("{單號}", _RPREN) + .Replace("{代理人}", 代理人) + .Replace("{差勤人}", 差勤人) + .Replace("{代理人電話}", String.Format("{0} {1}", 代理人電話1, 代理人電話2)); + ; + // 發送郵件 + try + { + Wellan.Service.WMailSender.GetInstance().Send(mm, string.Format("代理人請假/差旅通知督導 單號:{0}", _RPREN)); + } + catch + { } + } + + protected void dsRpad_Updating(object sender, ObjectDataSourceMethodEventArgs e) + { + DateTime rpdat; + CheckDate(WDAC.GetStringValue(e.InputParameters["rpdat"]), out rpdat); + e.InputParameters["rpdat"] = rpdat; + e.InputParameters["rpf09"] = 0; + e.InputParameters["rpf10"] = 0; + } + + protected void dsBPSE_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + switch (rparType) + { + case RPAR_TYPE.T1_加班: + e.InputParameters["BPTYP"] = "加班"; + break; + case RPAR_TYPE.T3_出差: + e.InputParameters["BPTYP"] = "差旅"; + break; + } + } + + protected string GetPhraseClientClick(object BPCNT) + { + string CID = ""; + switch (rparType) + { + case RPAR_TYPE.T1_加班: + CID = (RPARForm1.FindControl("txtRPAR_RPDOC") as Control).ClientID; + break; + case RPAR_TYPE.T3_出差: + CID = (RPARForm3.FindControl("txtRPAR_RPDOC") as Control).ClientID; + break; + } + if (CID.Length > 0) + return String.Format("javascript:FillMessage(\"{0}\", \"{1}\");return false;", CID, BPCNT); + else + return "javascript:return false;"; + } + + protected string Get關卡名稱(object RPANO, object RPAPN) + { + string rpano = WDAC.GetStringValue(RPANO); + string rpapn = WDAC.GetStringValue(RPAPN); + + if (rpano == "1") + return "第 1 關"; + else if ((rpano == "2" && rpapn == "2") || (rpano == "3" && rpapn == "3")) + return "第 2 關"; + else if (rpano == "3" && rpapn == "2") + return "長官關"; + else if (rpano == "D") + return "抽單"; + else + return rpano; + } + + protected void ds補休明細_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + e.InputParameters["rpnum"] = UserId; + e.InputParameters["rprdt"] = DateTime.UtcNow.AddHours(8).Date; + } + + protected string GetAttachLink(string RPREN) + { + return RparDAC.GetAttachLink(RPREN, Page); + } + + protected void gvRPAD_RowDataBound(object sender, GridViewRowEventArgs e) + { + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void gvRPAD_RowUpdating(object sender, GridViewUpdateEventArgs e) + { + DateTime rpdat; + CheckDate(WDAC.GetStringValue(e.NewValues["RPDAT"]), out rpdat); + e.Cancel = !RpadRpdat_Validate(rpdat); + } + + protected void cvRPAD_ServerValidate(object source, ServerValidateEventArgs args) + { + args.IsValid = true; + cvRPAD.ErrorMessage = ""; + + DateTime rpdat; + CheckDate(txtRPDAT.Text, out rpdat); + + args.IsValid = RpadRpdat_Validate(rpdat); + } + + protected bool RpadRpdat_Validate(DateTime rpdat) + { + DateTime rprdt, rpedt; + var c_rprdt = (RPARForm.FindControl("lbRPAR_RPRDT") as ITextControl); + var c_rpedt = (RPARForm.FindControl("lbRPAR_RPEDT") as ITextControl); + + if (c_rprdt != null) + CheckDate(c_rprdt.Text, out rprdt); + else + rprdt = DateTime.MinValue; + + if (c_rpedt != null) + CheckDate(c_rpedt.Text, out rpedt); + else + rpedt = DateTime.MinValue; + + // 檢查 rpdat 在 rprdt 與 rpedt 之間 + if (rprdt > DateTime.MinValue && rpdat < rprdt || rpedt > DateTime.MinValue && rpdat > rpedt) + { + cvRPAD.IsValid = false; + cvRPAD.ErrorMessage = "差旅費日期應在開始日期與結束日期之間"; + return false; + } + cvRPAD.IsValid = true; + cvRPAD.ErrorMessage = ""; + return true; + } +} diff --git a/Web/forms/worker/fmRpir.ascx b/Web/forms/worker/fmRpir.ascx new file mode 100644 index 0000000..a185254 --- /dev/null +++ b/Web/forms/worker/fmRpir.ascx @@ -0,0 +1,1764 @@ + +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmRpir.ascx.cs" Inherits="forms_customer_fmRpir" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> +<%@ Import Namespace="System.Drawing" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 人員編號: + + + + + +
+ + + +
+
+
+ +
+ 申請日期: + + + + + + +
+ + + +
+  ~  + + + + + +
+ + + +
+
+ 生效日期: + + + + + + +
+ + + +
+  ~  + + + + + +
+ + + +
+
+ 作業類別: + + + 加保 + 退保 + 眷屬加保 + 眷屬退保 + 薪資調整 + 留職停薪 + 其他 + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 作業類別: + + 加保 + 退保 + 眷屬加保 + 眷屬退保 + 薪資調整 + 留職停薪 + 其他 + + +
+ + + + + + + + <%-- + + + --%> + + + + +<%-- --%> +<%-- --%> + + + + + + + <%-- --%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- + + + --%> + + + + +
+ 申請日期: + + +<%-- + + + + +
+ + + +
--%> +
+ 生效日期: + + + + + +
+ + + +
+
+ 單號: + + + 人員編號: + + + + + + +
+ + + +
+
+
+ 加保日期: + + + + +<%-- + + + + +
+ + + +
--%> +
+ 退保日期: + + + + + +
+ + + +
+
+ 加保狀況: + +   + +   + +   + +
+ 薪資: + + 勞退自提: + +  
+ 勞保級距: + + 健保級距: + + 勞退級距: +
+ 身份別: + + + 國籍別: + + + 勞保減免比例: + + + 健保減免比例: + +
+ 一般眷口數: + + 減免25%眷口數: + + 減免50%眷口數: + + 減免100%眷口數: +
+ 公司別: + + + +
+ 備註: + + +
+ + + +
+ + + + +
+ 作業類別: + + 加保 + 退保 + 眷屬加保 + 眷屬退保 + 薪資調整 + 留職停薪 + 其他 + + +
+ + + + + + + <%-- + + + --%> + + + + +<%-- --%> +<%-- --%> + + + + + + + <%-- --%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- + + + --%> + + + + +
+ + +
+ 申請日期: + + + +<%-- + + + + +
+ + + +
--%> +
+ 生效日期: + + + + + +
+ + + +
+
+ 單號: + + + + 人員編號: + + + + + + +
+ + + +
+
+
+ 加保日期: + + + + + +
+ + + +
+
+ 退保日期: + + + + + +
+ + + +
+
+ 加保狀況: + +   + +   + +   + +
+ 薪資: + + 勞退自提: +   
+ 勞保級距: + + 健保級距: + + 勞退級距: +
+ 身份別: + + + 國籍別: + + + 勞保減免比例: + + + 健保減免比例: + +
+ 一般眷口數: + + 減免25%眷口數: + + 減免50%眷口數: + + 減免100%眷口數: +
+ 公司別: + + + +
+ 備註: + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- + + + --%> + + + + +
+ 申請日期: + + 生效日期: + + 作業類別: +
+ 單號: + + + + 人員編號: + + + +
+ 加保日期: + + 退保日期: + + 加保狀況: +    +    +    + +
+ 薪資: + + + 勞退自提: +   
+ 勞保級距: + + + 健保級距: + + + 勞退級距: + +
+ 身份別: + + 國籍別: + + 勞保減免比例: + + 健保減免比例: +
+ 一般眷口數: + + 減免25%眷口數: + + 減免50%眷口數: + + 減免100%眷口數: +
+ 公司別: + + +
+ 備註: + + +
+ + + +
+ +
+
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
眷屬資料: + + + 眷屬姓名出生年月日身份證字號關係減免比例加保日期退保日期錯誤訊息
+ + {{ index + 1 }} + + {{item.NAME}} + + + + + + +
+ + + " v-on:click="showDateDialog(item.BIRTHDAY, index, 'BIRTHDAY')" /> +
+ {{item.BIRTHDAY}} +
+ + {{item.IDNO}} + + + {{item.RELATIONSHIP}} + + + {{ deductOptions.find(x => x.VALUE == item.DEDUCT)?.TEXT }} + + + + + + +
+ + + " v-on:click="showDateDialog(item.START_DATE, index, 'START_DATE')" /> +
+ {{item.START_DATE}} +
+ + + + + +
+ + + " v-on:click="showDateDialog(item.END_DATE, index, 'END_DATE')" /> +
+ + {{item.END_DATE}} +
+ {{item.Message}} +
+ 無資料 +
+

注意事項:

+
    +
  • 眷屬資料除退保日期的每一個欄位均需填寫才會儲存
  • +
  • 新增眷屬資料之減免比例請選"無"
  • +
  • 一般眷口數、減免25%眷口、減免50%眷口、減免100%眷口由系統統計
  • +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/Web/forms/worker/fmRpir.ascx.cs b/Web/forms/worker/fmRpir.ascx.cs new file mode 100644 index 0000000..b69353e --- /dev/null +++ b/Web/forms/worker/fmRpir.ascx.cs @@ -0,0 +1,1474 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; +using Wellan.Web.UI; +using System.Collections.Generic; +using NPOI.HSSF.UserModel; +using System.Collections.Specialized; + +/// +/// 勞健保加退保紀錄 +/// +public partial class forms_customer_fmRpir : Wellan.Web.UI.WUserControlBase +{ + private string _RPENO = ""; + private string _BPNME = ""; + private string _RPREN = ""; + private string _RPRENB = ""; + private DateTime _RPXDT1 = new DateTime(); + private DateTime _RPXDT2 = new DateTime(); + private DateTime _RPBDT1 = new DateTime(); + private DateTime _RPBDT2 = new DateTime(); + private string _RPOPT = ""; + private int _RPITM = 0; + private BPSN_DAC bpsn; + protected string tableName = ""; + protected string mode = ""; + protected string BPENO = ""; + + protected void Page_Load(object sender, EventArgs e) + { + _RPENO = ViewState["RPENO"] != null ? ViewState["RPENO"].ToString() : ""; + _BPNME = ViewState["BPNME"] != null ? ViewState["BPNME"].ToString() : ""; + _RPREN = ViewState["RPREN"] != null ? ViewState["RPREN"].ToString() : ""; + _RPITM = ViewState["RPITM"] != null ? Convert.ToInt32(ViewState["RPITM"]) : 0; + _RPXDT1 = ViewState["RPXDT1"] != null ? Convert.ToDateTime(ViewState["RPXDT1"]) : new DateTime(); + _RPXDT2 = ViewState["RPXDT2"] != null ? Convert.ToDateTime(ViewState["RPXDT2"]) : new DateTime(); + _RPOPT = ViewState["RPOPT"] != null ? ViewState["RPOPT"].ToString() : ""; + _RPBDT1 = ViewState["RPBDT1"] != null ? Convert.ToDateTime(ViewState["RPBDT1"]) : new DateTime(); + _RPBDT2 = ViewState["RPBDT2"] != null ? Convert.ToDateTime(ViewState["RPBDT2"]) : new DateTime(); + + tableName = ViewState["tableName"] != null ? ViewState["tableName"].ToString() : "RPIR"; + // if (IsPostBack) + // RPIRGrid.DataBind(); + RegisterCalendarEvent(this, "txtRPXDT_1_DATE", "txtRPXDT_1"); + RegisterCalendarEvent(this, "txtRPXDT_2_DATE", "txtRPXDT_2"); + RegisterCalendarEvent(this, "txtRPBDT_1_DATE", "txtRPBDT_1"); + RegisterCalendarEvent(this, "txtRPBDT_2_DATE", "txtRPBDT_2"); + + btnReturnBPSN.Enabled = GetStringParam("mode") == "BPSN"; + } + + protected override void OnInit(EventArgs e) + { + if (GetStringParam("mode") == "BPSN") + { + FunctionName = "FMRPIR_BPSN"; + } + + base.OnInit(e); + _RPRENB = GetStringParam("RPRENB"); + + GetGridViewRowColor(RPIRGrid); + ShowData(); + } + + private void ShowData() + { + switch (tableName) + { + case "": + case "RPIR": + WLabel1.Text = "勞健保加退保紀錄"; + RegisterLookupEvent(this, "btnRPIR_RPENO_WQRY", "txtRPIR_RPENO", "txtRPIR_RPENO,lbRPIR_RPENOX", "BPSN"); + SetClientFocus(txtRPIR_RPENO); + Search(); + RPIRGrid.DataSourceID = "dsRPIRGrid"; + RPIRForm.DataSourceID = "dsRPIRForm"; + break; + case "RPIB": + WLabel1.Text = "勞健保加退保異動紀錄"; + SearchB(); + RPIRGrid.DataSourceID = "dsRPIBGrid"; + RPIRForm.DataSourceID = "dsRPIBForm"; + RPIRGrid.SelectedIndex = 0; + RPIRGrid.PageIndex = 0; + break; + } + } + + // 查詢按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + ParseSearchInput(); + + if (string.IsNullOrEmpty(_RPENO) && + string.IsNullOrEmpty(_BPNME) && + _RPXDT1.Ticks == 0 && + _RPXDT2.Ticks == 0 && + _RPBDT1.Ticks == 0 && + _RPBDT2.Ticks == 0 && + string.IsNullOrEmpty(_RPOPT)) + { + lbMessage.Text = GetString("NOSRHCOND"); + lbMessage.Visible = true; + } + else + { + MultiView1.ActiveViewIndex = 1; + + Search(); + RPIRGrid.DataSourceID = "dsRPIRGrid"; + RPIRForm.DataSourceID = "dsRPIRForm"; + RPIRGrid.PageIndex = 0; + RPIRGrid.SelectedIndex = 0; + RPIRGrid.DataBind(); + + // 查詢有資料時,才將查詢條件紀錄在 ViewState 中 + if (RPIRGrid.Rows.Count > 0) + { + ViewState["RPENO"] = _RPENO; + ViewState["BPNME"] = _BPNME; + ViewState["RPXDT1"] = _RPXDT1; + ViewState["RPXDT2"] = _RPXDT2; + ViewState["RPBDT1"] = _RPBDT1; + ViewState["RPBDT2"] = _RPBDT2; + ViewState["RPOPT"] = _RPOPT; + ViewState["tableName"] = ""; + } + } + } + + private void ParseSearchInput() + { + _RPENO = txtRPIR_RPENO.Text; + _BPNME = txtBPSN_BPNME.Text; + + WGuard1.CheckDate(txtRPXDT_1.Text, out _RPXDT1); + WGuard1.CheckDate(txtRPXDT_2.Text, out _RPXDT2); + WGuard1.CheckDate(txtRPBDT_1.Text, out _RPBDT1); + WGuard1.CheckDate(txtRPBDT_2.Text, out _RPBDT2); + + var rpopts = new List(); + for (int i = 0; i < rblRPOPT.Items.Count; i++) + { + if (rblRPOPT.Items[i].Selected) + { + rpopts.Add(rblRPOPT.Items[i].Value); + } + } + _RPOPT = string.Join(",", rpopts.ToArray()); + } + + // 查詢取消按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + //ViewState["RPENO"] = ""; + //ViewState["BPNME"] = ""; + //ViewState["tableName"] = ""; + //_RPENO = ""; + //_BPNME = ""; + Search(); + RPIRGrid.DataBind(); + MultiView1.ActiveViewIndex = 1; + } + + // 查詢動作 + protected override void Search() + { + if (MultiView1.ActiveViewIndex == 1) + { + RPIRForm.Visible = true; + } + + mode = GetStringParam("mode"); + BPENO = GetStringParam("BPENO"); + + if (mode == "BPSN") + { + dsRPIRGrid.SelectParameters["orderBy"].DefaultValue = "A.RPREN DESC"; + dsRPIRGrid.SelectParameters["RPENO"].DefaultValue = BPENO; + } + else + { + dsRPIRGrid.SelectParameters["orderBy"].DefaultValue = "A.RPREN DESC"; + dsRPIRGrid.SelectParameters["RPENO"].DefaultValue = _RPENO; + dsRPIRGrid.SelectParameters["BPNME"].DefaultValue = _BPNME; + dsRPIRGrid.SelectParameters["RPXDT1"].DefaultValue = _RPXDT1.Ticks > 0 ? string.Format("{0:yyyy-MM-dd}", _RPXDT1) : ""; + dsRPIRGrid.SelectParameters["RPXDT2"].DefaultValue = _RPXDT2.Ticks > 0 ? string.Format("{0:yyyy-MM-dd}", _RPXDT2) : ""; + dsRPIRGrid.SelectParameters["RPOPT"].DefaultValue = _RPOPT; + dsRPIRGrid.SelectParameters["RPBDT1"].DefaultValue = _RPBDT1.Ticks > 0 ? string.Format("{0:yyyy-MM-dd}", _RPBDT1) : ""; + dsRPIRGrid.SelectParameters["RPBDT2"].DefaultValue = _RPBDT2.Ticks > 0 ? string.Format("{0:yyyy-MM-dd}", _RPBDT2) : ""; + + if (ViewState["RPIRGrid.RPREN"] != null) + { + RpirDAC rpir = new RpirDAC(); + var rprenIndex = rpir.SelectRPRENIndex( + ViewState["RPIRGrid.RPREN"].ToString() + , _RPENO + , _BPNME + , _RPXDT1 + , _RPXDT2 + , _RPOPT + , _RPBDT1 + , _RPBDT2); + + if (rprenIndex >= 0) + { + RPIRGrid.PageIndex = rprenIndex / RPIRGrid.PageSize; + RPIRGrid.SelectedIndex = rprenIndex % RPIRGrid.PageSize; + } + + ViewState["RPIRGrid.RPREN"] = null; + } + } + } + + private void SearchB() + { + if (MultiView1.ActiveViewIndex == 1) + { + RPIRForm.Visible = true; + } + + dsRPIBGrid.SelectParameters["RPREN"].DefaultValue = _RPRENB; + } + + private void CalcFields(ObjectDataSourceMethodEventArgs e) + { + e.InputParameters["RPOLD"] = (RPIRForm.FindControl("chbRPIR_RPOLD") as CheckBox).Checked ? "Y" : "N"; + e.InputParameters["RPLIS"] = (RPIRForm.FindControl("chbRPIR_RPLIS") as CheckBox).Checked ? "Y" : "N"; + e.InputParameters["RPHIS"] = (RPIRForm.FindControl("chbRPIR_RPHIS") as CheckBox).Checked ? "Y" : "N"; + } + + protected void dsRPIRForm_Inserting(object sender, ObjectDataSourceMethodEventArgs e) + { + CalcFields(e); + // 產生新的單號 + switch (tableName) + { + case "RPIR": + e.InputParameters["RPREN"] = WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "RPIR", "RPREN", "YYYYMM<9999>", ""); + break; + case "RPIB": + e.InputParameters["RPREN"] = _RPREN; + e.InputParameters["RPITM"] = 1; + break; + } + } + + protected void dsRPIRForm_Updating(object sender, ObjectDataSourceMethodEventArgs e) + { + CalcFields(e); + } + + protected void RPIRGrid_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + mode = GetStringParam("mode"); + BPENO = GetStringParam("BPENO"); + + if (RPIRGrid.Rows.Count > 0) + { + if (RPIRGrid.SelectedIndex == -1) + RPIRGrid.SelectedIndex = 0; + if (RPIRGrid.SelectedIndex > RPIRGrid.Rows.Count - 1) + RPIRGrid.SelectedIndex = RPIRGrid.Rows.Count - 1; + RPIRForm.DataBind(); + + _RPREN = RPIRGrid.SelectedDataKey["RPREN"].ToString(); + _RPITM = Convert.ToInt32(RPIRGrid.SelectedDataKey["RPITM"]); + ViewState["RPREN"] = _RPREN; + ParamList["RPRENB"] = _RPREN; + ViewState["RPITM"] = _RPITM; + } + } + + protected void RPIRGrid_PageIndexChanged(object sender, EventArgs e) + { + Search(); + RPIRGrid.SelectedIndex = 0; + RPIRGrid.DataBind(); + } + + protected void dsRPIRGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e) + { + // if (e.ReturnValue == null || (e.ReturnValue as DataTable).Rows.Count == 0) + if (e.ReturnValue is Int32 && WDAC.GetInt32Value(e.ReturnValue) == 0) + { + mode = GetStringParam("mode"); + BPENO = GetStringParam("BPENO"); + + if (mode == "BPSN") + { + RPIRForm.ChangeMode(FormViewMode.Insert); + RPIRForm_ModeChanged(sender, e); + RPIRForm.DataBind(); + } + else + { + MultiView1.ActiveViewIndex = 0; + lbMessage.Text = GetString("NODATA"); + lbMessage.Visible = true; + } + + /* + switch (MultiView1.ActiveViewIndex) + { + case 0: + lbMessage.Text = GetString("NODATA"); + lbMessage.Visible = true; + break; + case 1: + RPIRForm.ChangeMode(FormViewMode.Insert); + RPIRForm_ModeChanged(sender, e); + break; + } + */ + } + } + + protected void RPIRForm_ItemCommand(object sender, FormViewCommandEventArgs e) + { + mode = GetStringParam("mode"); + BPENO = GetStringParam("BPENO"); + + switch (e.CommandName) + { + case "New": + switch (e.CommandArgument.ToString()) + { + case "1": + tableName = "RPIR"; + break; + case "2": + tableName = "RPIB"; + break; + } + ViewState["tableName"] = tableName; + break; + case "Search": + MultiView1.ActiveViewIndex = 0; + break; + case "Cancel": + tableName = "RPIR"; + ViewState["tableName"] = tableName; + Search(); + RPIRForm.ChangeMode(FormViewMode.ReadOnly); + RPIRForm_ModeChanged(sender, e); + break; + case "RPIR": + tableName = "RPIR"; + ViewState["tableName"] = tableName; + ShowData(); + break; + case "RPIBSearch": + tableName = "RPIB"; + ViewState["tableName"] = tableName; + // 紀錄目前的PK + ViewState["RPIRGrid.RPREN"] = RPIRGrid.SelectedDataKey.Values["RPREN"]; + ShowData(); + break; + case "BPSN": + ParamList["BPENO"] = GetStringParam("BPENO"); + DoAfterCommand("BPSN"); + break; + } + } + + protected void RPIRForm_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + RPIRGrid.DataBind(); + if (RPIRGrid.SelectedIndex < 0 || RPIRGrid.SelectedIndex > RPIRGrid.Rows.Count - 1) + { + RPIRGrid.SelectedIndex = RPIRGrid.Rows.Count - 1; + // RPIRGrid.DataBind(); + } + if (RPIRGrid.Rows.Count > 0) + { + RPIRForm.DataBind(); + } + } + + protected void RPIRForm_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + tableName = "RPIR"; + ViewState["tableName"] = tableName; + Search(); + } + + protected void RPIRForm_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void RPIRForm_ModeChanged(object sender, EventArgs e) + { + switch (RPIRForm.CurrentMode) + { + case FormViewMode.ReadOnly: + RPIRGrid.Visible = true; + RPIRGrid.DataBind(); + if (RPIRGrid.Rows.Count > 0) + { + if (RPIRGrid.SelectedIndex == -1) + { + RPIRGrid.SelectedIndex = 0; + } + + /* + if (OldMode == FormViewMode.Insert) + { + RPIRGrid.PageIndex = RPIRGrid.PageCount - 1; + RPIRGrid.DataBind(); + RPIRGrid.SelectedIndex = RPIRGrid.Rows.Count - 1; + } + RPIRGrid.DataBind(); + RPIRForm.DataBind(); + */ + } + break; + + case FormViewMode.Edit: + RPIRGrid.Visible = false; + break; + + case FormViewMode.Insert: + RPIRGrid.Visible = false; + break; + } + } + + protected void RPIRForm_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void RPIRForm_DataBound(object sender, EventArgs e) + { + var rasnDao = new RasnDAC(Query); + DataTable rasn; + + switch (RPIRForm.CurrentMode) + { + case FormViewMode.ReadOnly: + if ((RPIRForm.FindControl("lbRPIR_RPENO") as ITextControl) != null) + { + BPENO = (RPIRForm.FindControl("lbRPIR_RPENO") as ITextControl).Text; + DateTime RPBDT; + WGuard1.CheckDate((RPIRForm.FindControl("lbRPIR_RPBDT") as ITextControl).Text, out RPBDT); + rasn = rasnDao.SelectRecentByDate(BPENO, RPBDT); + if (rasn.Rows.Count > 0) + { + var bpsrm = WDAC.GetInt32Value(rasn.Rows[0]["BPSRM"]); + var lbRPSLY = (RPIRForm.FindControl("lbRPIR_RPSLY") as ITextControl); + if (lbRPSLY != null && bpsrm > 0) + { + lbRPSLY.Text = string.Format("{0:###,###,###,###,##0.####}", bpsrm); + } + } + } + + break; + case FormViewMode.Edit: + RegisterLookupEvent(RPIRForm, "btnRPIR_RPENO_WQRY", "txtRPIR_RPENO", "txtRPIR_RPENO,lbRPIR_RPENOX", "BPSN1"); + RegisterCalendarEvent(RPIRForm, "btnRPIR_RPSDT_DATE", "txtRPIR_RPSDT"); + RegisterCalendarEvent(RPIRForm, "btnRPIR_RPEDT_DATE", "txtRPIR_RPEDT"); + RegisterCalendarEvent(RPIRForm, "btnRPIR_RPXDT_DATE", "txtRPIR_RBPDT"); + SetClientFocus(RPIRForm, "txtRPIR_RPENO"); + if (_RPITM == 0) + { + RPIRForm.FindControl("lbRPIR_RPBDTLabel").Visible = false; + RPIRForm.FindControl("btnRPIR_RPBDT_DATE").Visible = false; + RPIRForm.FindControl("txtRPIR_RPBDT").Visible = false; + } + else + { + RegisterCalendarEvent(RPIRForm, "btnRPIR_RPBDT_DATE", "txtRPIR_RPBDT"); + } + + FormControl(); + + break; + case FormViewMode.Insert: + RegisterLookupEvent(RPIRForm, "btnRPIR_RPENO_WQRY", "txtRPIR_RPENO", "txtRPIR_RPENO,lbRPIR_RPENOX", "BPSN1"); + RegisterCalendarEvent(RPIRForm, "btnRPIR_RPSDT_DATE", "txtRPIR_RPSDT"); + RegisterCalendarEvent(RPIRForm, "btnRPIR_RPEDT_DATE", "txtRPIR_RPEDT"); + // RegisterCalendarEvent(RPIRForm, "btnRPIR_RPXDT_DATE", "txtRPIR_RPXDT"); + switch (tableName) + { + case "RPIR": + SetClientFocus(RPIRForm, "txtRPIR_RPENO"); + (RPIRForm.FindControl("txtRPIR_RPSLY") as ITextControl).Text = "0"; + (RPIRForm.FindControl("txtRPIR_RPAMT") as ITextControl).Text = "0"; + (RPIRForm.FindControl("txtRPIR_RPAM2") as ITextControl).Text = "0"; + (RPIRForm.FindControl("txtRPIR_RPAM3") as ITextControl).Text = "0"; + (RPIRForm.FindControl("txtRPIR_RPSLA") as ITextControl).Text = "0"; + (RPIRForm.FindControl("txtRPIR_RPFMY") as ITextControl).Text = "0"; + (RPIRForm.FindControl("txtRPIR_RPFM1") as ITextControl).Text = "0"; + (RPIRForm.FindControl("txtRPIR_RPFM2") as ITextControl).Text = "0"; + (RPIRForm.FindControl("txtRPIR_RPFM3") as ITextControl).Text = "0"; + (RPIRForm.FindControl("chbRPIR_RPLIS") as WCheckBox).Value = "Y"; + (RPIRForm.FindControl("chbRPIR_RPHIS") as WCheckBox).Value = "Y"; + (RPIRForm.FindControl("chbRPIR_RPOLD") as WCheckBox).Value = "N"; + RPIRForm.FindControl("lbRPIR_RPBDTLabel").Visible = false; + RPIRForm.FindControl("btnRPIR_RPBDT_DATE").Visible = false; + RPIRForm.FindControl("txtRPIR_RPBDT").Visible = false; + (RPIRForm.FindControl("rfvRPBDT") as RequiredFieldValidator).Enabled = false; + // (RPIRForm.FindControl("txtRPIR_RPXDT") as ITextControl).Text = string.Format("{0:yyyyMMdd}", DateTime.UtcNow.AddHours(8)); + (RPIRForm.FindControl("lbRPIR_RPXDT") as Label).Text = string.Format("{0:yyyyMMdd}", DateTime.UtcNow.AddHours(8)); + (RPIRForm.FindControl("hfRPIR_RPXDT") as HiddenField).Value = string.Format("{0:yyyyMMdd}", DateTime.UtcNow.AddHours(8)); + (RPIRForm.FindControl("txtRPIR_RPSDT") as ITextControl).Text = string.Format("{0:yyyyMMdd}", DateTime.UtcNow.AddHours(8)); + (RPIRForm.FindControl("ddlRPIR_RPPTP") as WDropDownList).SelectedValue = "2"; // 一般勞工 + + mode = GetStringParam("mode"); + BPENO = GetStringParam("BPENO"); + + if (mode == "BPSN") + { + (RPIRForm.FindControl("txtRPIR_RPENO") as ITextControl).Text = BPENO; + (RPIRForm.FindControl("lbRPIR_RPENOX") as ITextControl).Text = GetLookup("BPSN", BPENO, "BPNME", ""); + rasn = rasnDao.SelectRecent(BPENO); + if (rasn.Rows.Count > 0) + { + (RPIRForm.FindControl("txtRPIR_RPSLY") as ITextControl).Text = string.Format("{0:#####0}", WDAC.GetInt32Value(rasn.Rows[0]["BPSRM"])); + (RPIRForm.FindControl("txtRPIR_RPAMT") as ITextControl).Text = string.Format("{0:#####0}", WDAC.GetInt32Value(rasn.Rows[0]["BPSRM"])); + (RPIRForm.FindControl("txtRPIR_RPAM2") as ITextControl).Text = string.Format("{0:#####0}", WDAC.GetInt32Value(rasn.Rows[0]["BPSRM"])); + (RPIRForm.FindControl("txtRPIR_RPAM3") as ITextControl).Text = string.Format("{0:#####0}", WDAC.GetInt32Value(rasn.Rows[0]["BPSRM"])); + } + } + + break; + case "RPIB": + // 取得目前資料,複製進畫面的控制項 + //ClientShowMessage(_RPREN); + RegisterCalendarEvent(RPIRForm, "btnRPIR_RPBDT_DATE", "txtRPIR_RPBDT"); + + RpirDAC rpir = new RpirDAC(); + DataTable rpirData = rpir.SelectOne(_RPREN, _RPITM); + + (RPIRForm.FindControl("txtRPIR_RPBDT") as ITextControl).Text = string.Format("{0:yyyyMMdd}", DateTime.UtcNow.AddHours(8)); + if (rpirData.Rows.Count > 0) + { + (RPIRForm.FindControl("lbRPIR_RPREN") as ITextControl).Text = rpirData.Rows[0]["RPREN"].ToString(); + (RPIRForm.FindControl("txtRPIR_RPENO") as ITextControl).Text = rpirData.Rows[0]["RPENO"].ToString(); + (RPIRForm.FindControl("txtRPIR_RPSDT") as ITextControl).Text = rpirData.Rows[0]["RPSDT"] != DBNull.Value ? Convert.ToDateTime(rpirData.Rows[0]["RPSDT"]).ToString("yyyyMMdd") : ""; + (RPIRForm.FindControl("txtRPIR_RPEDT") as ITextControl).Text = rpirData.Rows[0]["RPEDT"] != DBNull.Value ? Convert.ToDateTime(rpirData.Rows[0]["RPEDT"]).ToString("yyyyMMdd") : ""; + (RPIRForm.FindControl("chbRPIR_RPLIS") as WCheckBox).Value = rpirData.Rows[0]["RPLIS"].ToString(); + (RPIRForm.FindControl("chbRPIR_RPHIS") as WCheckBox).Value = rpirData.Rows[0]["RPHIS"].ToString(); + (RPIRForm.FindControl("chbRPIR_RPOLD") as WCheckBox).Value = rpirData.Rows[0]["RPOLD"].ToString(); + (RPIRForm.FindControl("chbRPIR_RPOVR") as WCheckBox).Value = rpirData.Rows[0]["RPOVR"].ToString(); + (RPIRForm.FindControl("txtRPIR_RPSLY") as ITextControl).Text = rpirData.Rows[0]["RPSLY"].ToString(); + (RPIRForm.FindControl("txtRPIR_RPAMT") as ITextControl).Text = rpirData.Rows[0]["RPAMT"].ToString(); + (RPIRForm.FindControl("txtRPIR_RPAM2") as ITextControl).Text = rpirData.Rows[0]["RPAM2"].ToString(); + (RPIRForm.FindControl("txtRPIR_RPAM3") as ITextControl).Text = rpirData.Rows[0]["RPAM3"].ToString(); + (RPIRForm.FindControl("txtRPIR_RPSLA") as ITextControl).Text = rpirData.Rows[0]["RPSLA"].ToString(); + (RPIRForm.FindControl("ddlRPIR_RPPTP") as WDropDownList).SelectedValue = rpirData.Rows[0]["RPPTP"].ToString(); + (RPIRForm.FindControl("ddlRPIR_RPNAT") as WDropDownList).SelectedValue = rpirData.Rows[0]["RPNAT"].ToString(); + (RPIRForm.FindControl("ddlRPIR_RPDIS") as WDropDownList).SelectedValue = rpirData.Rows[0]["RPDIS"].ToString(); + (RPIRForm.FindControl("ddlRPIR_RPDIH") as WDropDownList).SelectedValue = rpirData.Rows[0]["RPDIH"].ToString(); + (RPIRForm.FindControl("txtRPIR_RPFMY") as ITextControl).Text = rpirData.Rows[0]["RPFMY"].ToString(); + (RPIRForm.FindControl("txtRPIR_RPFM1") as ITextControl).Text = rpirData.Rows[0]["RPFM1"].ToString(); + (RPIRForm.FindControl("txtRPIR_RPFM2") as ITextControl).Text = rpirData.Rows[0]["RPFM2"].ToString(); + (RPIRForm.FindControl("txtRPIR_RPFM3") as ITextControl).Text = rpirData.Rows[0]["RPFM3"].ToString(); + // (RPIRForm.FindControl("ddlRPIR_RPCPY") as WDropDownList).SelectedValue = rpirData.Rows[0]["RPCPY"].ToString(); + (RPIRForm.FindControl("hfRPIR_RPFMD") as HiddenField).Value = rpirData.Rows[0]["RPFMD"].ToString(); + // (RPIRForm.FindControl("txtRPIR_RPXDT") as ITextControl).Text = string.Format("{0:yyyyMMdd}", DateTime.UtcNow.AddHours(8)); + (RPIRForm.FindControl("lbRPIR_RPXDT") as Label).Text = string.Format("{0:yyyyMMdd}", DateTime.UtcNow.AddHours(8)); + (RPIRForm.FindControl("hfRPIR_RPXDT") as HiddenField).Value = string.Format("{0:yyyyMMdd}", DateTime.UtcNow.AddHours(8)); + } + break; + } + + FormControl(); + + break; + } + } + + private void FormControl() + { + var rpoptCtrl = (RPIRForm.FindControl("rblRPIR_RPOPT") as RadioButtonList); + var rpopt = rpoptCtrl != null && !string.IsNullOrEmpty(rpoptCtrl.SelectedValue) ? rpoptCtrl.SelectedValue : "-"; + + // 新增 + if (RPIRForm.CurrentMode == FormViewMode.Insert && tableName == "RPIR") + { + //if (rpoptCtrl.SelectedValue == "") + // rpoptCtrl.SelectedValue = "加保"; + rpoptCtrl.Items[0].Enabled = true; + rpoptCtrl.Items[1].Enabled = false; + rpoptCtrl.Items[2].Enabled = false; + rpoptCtrl.Items[3].Enabled = false; + rpoptCtrl.Items[4].Enabled = false; + rpoptCtrl.Items[5].Enabled = false; + rpoptCtrl.Items[6].Enabled = false; + } + // 更正加保那筆 + else if (RPIRForm.CurrentMode == FormViewMode.Edit + && Convert.ToInt32((RPIRForm.FindControl("hfRPIR_RPITM") as HiddenField).Value) == 0) + { + //if (rpoptCtrl.SelectedValue == "") + // rpoptCtrl.SelectedValue = "加保"; + rpoptCtrl.Items[0].Enabled = true; + rpoptCtrl.Items[1].Enabled = false; + rpoptCtrl.Items[2].Enabled = false; + rpoptCtrl.Items[3].Enabled = false; + rpoptCtrl.Items[4].Enabled = false; + rpoptCtrl.Items[5].Enabled = false; + rpoptCtrl.Items[6].Enabled = false; + } + else // 新增異動與更正異動 + { + //if (rpoptCtrl.SelectedValue == "") + // rpoptCtrl.SelectedValue = "其他"; + rpoptCtrl.Items[0].Enabled = false; + rpoptCtrl.Items[1].Enabled = true; + rpoptCtrl.Items[2].Enabled = true; + rpoptCtrl.Items[3].Enabled = true; + rpoptCtrl.Items[4].Enabled = true; + rpoptCtrl.Items[5].Enabled = true; + rpoptCtrl.Items[6].Enabled = true; + } + + SetControlEnabled(RPIRForm, "txtRPIR_RPENO", true); + SetControlEnabled(RPIRForm, "btnRPIR_RPENO_WQRY", true); + + /* + +---------------------+----------------------------------------------------------------------------------------------+ + | 申請表欄位 | 說明 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 作業類別 | 加保 | 退保 | 眷屬加保 | 眷屬退保 | 薪資調整 | 留職停薪 | 其他 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 人員編號 | 系統帶入 | + +---------------------+----------------------------------------------------------------------------------------------+ + | 人員姓名 | 系統帶入 | + +---------------------+----------------------------------------------------------------------------------------------+ + | 表單申請日期 | 開放填寫 | + +---------------------+----------------------------------------------------------------------------------------------+ + | 生效日期 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 加保日期 | 開放填寫 | 鎖 | 鎖 | 鎖 | 開放填寫 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 退保日期 | 鎖 | 開放填寫 | 鎖 | 鎖 | 鎖 | 開放填寫 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 薪資 | 人員派遣紀錄帶入 | 鎖 | 鎖 | 鎖 | 開放填寫 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 投保金額 | 系統自動帶出(但可手動修改) | 鎖 | 鎖 | 鎖 | 開放填寫 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 勞退自提 | 開放填寫 | 鎖 | 鎖 | 鎖 | 鎖 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 身份別 | 下拉式選單 | 鎖 | 鎖 | 鎖 | 鎖 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 國籍別 | 下拉式選單 | 鎖 | 鎖 | 鎖 | 鎖 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 勞保/健保減免比例 | 人資填寫,建議鎖起來 | 鎖 | 鎖 | 鎖 | 鎖 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 眷口數~減免100%眷口 | 系統帶入,建議鎖起來 | 鎖 | 鎖 | 鎖 | 鎖 | 鎖 | 鎖 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 備註 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 眷屬姓名 | 開放填寫 | 鎖 | 開放填寫 | 鎖 | 鎖 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 身分證字號 | 開放填寫 | 鎖 | 開放填寫 | 鎖 | 鎖 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 出生年月日 | 開放填寫 | 鎖 | 開放填寫 | 鎖 | 鎖 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 關係 | 開放 | 鎖 | 開放 | 鎖 | 鎖 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 減免比例 | 開放 | 鎖 | 開放 | 鎖 | 鎖 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 眷屬加保日 | 開放填寫 | 鎖 | 開放填寫 | 鎖 | 鎖 | 鎖 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + | 眷屬退保日 | 鎖 | 開放填寫 | 鎖 | 開放填寫 | 鎖 | 開放填寫 | 開放填寫 | + +---------------------+----------------------------+----------+----------+----------+----------+----------+----------+ + */ + + SetControlEnabled(RPIRForm, "txtRPIR_RPSDT", "|加保|薪資調整|其他|".Contains(rpopt)); // 加保日期 + SetControlEnabled(RPIRForm, "btnRPIR_RPSDT_DATE", "|加保|薪資調整|其他|".Contains(rpopt)); + SetControlEnabled(RPIRForm, "txtRPIR_RPEDT", "|退保|留職停薪|其他|".Contains(rpopt)); // 退保日期 + SetControlEnabled(RPIRForm, "btnRPIR_RPEDT_DATE", "|退保|留職停薪|其他|".Contains(rpopt)); + // (RPIRForm.FindControl("txtRPIR_RPSDT") as WebControl).Enabled = "|加保|薪資調整|其他|".Contains(rpopt); // 加保日期 + // (RPIRForm.FindControl("btnRPIR_RPSDT_DATE") as WebControl).Enabled = "|加保|薪資調整|其他|".Contains(rpopt); + // (RPIRForm.FindControl("txtRPIR_RPEDT") as WebControl).Enabled = "|退保|留職停薪|其他|".Contains(rpopt); // 退保日期 + // (RPIRForm.FindControl("btnRPIR_RPEDT_DATE") as WebControl).Enabled = "|退保|留職停薪|其他|".Contains(rpopt); + + SetControlEnabled(RPIRForm, "chbRPIR_RPLIS", true); + SetControlEnabled(RPIRForm, "chbRPIR_RPHIS", true); + SetControlEnabled(RPIRForm, "chbRPIR_RPOLD", true); + SetControlEnabled(RPIRForm, "chbRPIR_RPOVR", true); + // (RPIRForm.FindControl("chbRPIR_RPLIS") as WebControl).Enabled = true; + // (RPIRForm.FindControl("chbRPIR_RPHIS") as WebControl).Enabled = true; + // (RPIRForm.FindControl("chbRPIR_RPOLD") as WebControl).Enabled = true; + // (RPIRForm.FindControl("chbRPIR_RPOVR") as WebControl).Enabled = true; + + SetControlEnabled(RPIRForm, "txtRPIR_RPSLY", false); // 薪資 + SetControlEnabled(RPIRForm, "txtRPIR_RPAMT", "|加保|薪資調整|其他|".Contains(rpopt)); // 投保金額 + SetControlEnabled(RPIRForm, "txtRPIR_RPAM2", "|加保|薪資調整|其他|".Contains(rpopt)); // 投保金額 + SetControlEnabled(RPIRForm, "txtRPIR_RPAM3", "|加保|薪資調整|其他|".Contains(rpopt)); // 投保金額 + SetControlEnabled(RPIRForm, "txtRPIR_RPSLA", "|加保|其他|".Contains(rpopt)); // 勞退自提 + SetControlEnabled(RPIRForm, "ddlRPIR_RPPTP", "|加保|其他|".Contains(rpopt)); // 身份別 + SetControlEnabled(RPIRForm, "ddlRPIR_RPNAT", "|加保|其他|".Contains(rpopt)); // 國籍別 + SetControlEnabled(RPIRForm, "ddlRPIR_RPDIS", "|加保|其他|".Contains(rpopt)); // 勞保減免比例 + SetControlEnabled(RPIRForm, "ddlRPIR_RPDIH", "|加保|其他|".Contains(rpopt)); // 健保減免比例 + //(RPIRForm.FindControl("txtRPIR_RPSLY") as WebControl).Enabled = false; // 薪資 + //(RPIRForm.FindControl("txtRPIR_RPAMT") as WebControl).Enabled = "|加保|薪資調整|其他|".Contains(rpopt); // 投保金額 + //(RPIRForm.FindControl("txtRPIR_RPSLA") as WebControl).Enabled = "|加保|其他|".Contains(rpopt); // 勞退自提 + //(RPIRForm.FindControl("ddlRPIR_RPPTP") as WebControl).Enabled = "|加保|其他|".Contains(rpopt); // 身份別 + //(RPIRForm.FindControl("ddlRPIR_RPNAT") as WebControl).Enabled = "|加保|其他|".Contains(rpopt); // 國籍別 + //(RPIRForm.FindControl("ddlRPIR_RPDIS") as WebControl).Enabled = "|加保|其他|".Contains(rpopt); // 勞保減免比例 + //(RPIRForm.FindControl("ddlRPIR_RPDIH") as WebControl).Enabled = "|加保|其他|".Contains(rpopt); // 健保減免比例 + + SetControlEnabled(RPIRForm, "txtRPIR_RPFMY", false); // 眷口數 + SetControlEnabled(RPIRForm, "txtRPIR_RPFM1", false); // 眷口數 + SetControlEnabled(RPIRForm, "txtRPIR_RPFM2", false); // 眷口數 + SetControlEnabled(RPIRForm, "txtRPIR_RPFM3", false); // 眷口數 + // (RPIRForm.FindControl("txtRPIR_RPFMY") as WebControl).Enabled = "".Contains(rpopt); // 眷口數 + // (RPIRForm.FindControl("txtRPIR_RPFM1") as WebControl).Enabled = "".Contains(rpopt); // 眷口數 + // (RPIRForm.FindControl("txtRPIR_RPFM2") as WebControl).Enabled = "".Contains(rpopt); // 眷口數 + // (RPIRForm.FindControl("txtRPIR_RPFM3") as WebControl).Enabled = "".Contains(rpopt); // 眷口數 + } + + protected void RPIRGrid_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(RPIRGrid, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected void RPIRGrid_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in RPIRGrid.Rows) + SetGridViewMouseBehavier(RPIRGrid, row); + + _RPREN = RPIRGrid.SelectedDataKey["RPREN"].ToString(); + _RPITM = Convert.ToInt32(RPIRGrid.SelectedDataKey["RPITM"]); + ViewState["RPREN"] = _RPREN; + ParamList["RPRENB"] = _RPREN; + ViewState["RPITM"] = _RPITM; + } + + protected void RPIRForm_ItemDeleting(object sender, FormViewDeleteEventArgs e) + { + // 刪除前檢查 + // TODO: 檢查關帳日 + } + + protected override bool CheckInput(System.Collections.Specialized.IOrderedDictionary values) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + bool result = true; + if (string.IsNullOrEmpty(values["RPOPT"].ToString())) + { + result = false; + cvMessage.ErrorMessage += "請選擇作業類別
"; + cvMessage.IsValid = false; + } + values["RPSDT"] = CheckDate(values["RPSDT"], "請輸入正確的加保日期", ref result, cvMessage); + values["RPXDT"] = CheckDate(values["RPXDT"], "請輸入正確的申請日期", ref result, cvMessage); + if (values["RPEDT"].ToString() != "") + { + values["RPEDT"] = CheckDate(values["RPEDT"], "請輸入正確的退保日期", ref result, cvMessage); + if (WDAC.GetDateTimeValue(values["RPSDT"]) > WDAC.GetDateTimeValue(values["RPEDT"])) + { + result = false; + cvMessage.IsValid = false; + cvMessage.ErrorMessage += "退保日期不可早於加保日期
"; + } + } + if (values["RPBDT"].ToString() != "") + values["RPBDT"] = CheckDate(values["RPBDT"], "請輸入正確的生效日期", ref result, cvMessage); + + // 公司別固定 TY + values["RPCPY"] = "TY"; + + // 檢查加保眷屬資料 + var rpfmd = Newtonsoft.Json.JsonConvert.DeserializeObject(values["RPFMD"].ToString()); + if (rpfmd != null) + { + var rpfmdValid = rpfmd.FindAll(x => x.Valid); + if (rpfmd.Count != rpfmdValid.Count) + { + result = false; + (RPIRForm.FindControl("hfRPIR_RPFMD") as HiddenField).Value = Newtonsoft.Json.JsonConvert.SerializeObject(rpfmd); + cvMessage.ErrorMessage += "眷屬資料有錯誤
"; + cvMessage.IsValid = false; + } + + values["RPFMD"] = Newtonsoft.Json.JsonConvert.SerializeObject(rpfmdValid); + values["RPFMY"] = rpfmdValid.FindAll(x => x.DEDUCT == "0" && x.OnBoard).Count; + values["RPFM1"] = rpfmdValid.FindAll(x => x.DEDUCT == "25" && x.OnBoard).Count; + values["RPFM2"] = rpfmdValid.FindAll(x => x.DEDUCT == "50" && x.OnBoard).Count; + values["RPFM3"] = rpfmdValid.FindAll(x => x.DEDUCT == "100" && x.OnBoard).Count; + } + + // 異動時,退保日期與其他異動不可同時輸入 + var RPEDTChanged = false; + var OtherChanged = false; + + if (tableName == "RPIB" && RPIRForm.CurrentMode == FormViewMode.Insert || + tableName == "RPIR" && RPIRForm.CurrentMode == FormViewMode.Edit) + { + // 比對上一筆(異動)資料與輸入資料 + RpirDAC rpir = new RpirDAC(); + DataTable rpibData = rpir.SelectRPIB(_RPREN, null, "RPITM ASC", true); + DataRow rpibRow = null; + + if (RPIRForm.CurrentMode == FormViewMode.Insert && rpibData.Rows.Count > 0) + { + rpibRow = rpibData.Rows[rpibData.Rows.Count - 1]; + } + if (RPIRForm.CurrentMode == FormViewMode.Edit && rpibData.Rows.Count > 1) + { + rpibRow = rpibData.Rows[rpibData.Rows.Count - 2]; + } + if (rpibRow != null) + { + RPEDTChanged = rpibRow["RPEDT"].ToString() != values["RPEDT"].ToString(); + OtherChanged = rpibRow["RPSDT"].ToString() != values["RPSDT"].ToString() + || rpibRow["RPLIS"].ToString() != values["RPLIS"].ToString() + || rpibRow["RPHIS"].ToString() != values["RPHIS"].ToString() + || rpibRow["RPOLD"].ToString() != values["RPOLD"].ToString() + || rpibRow["RPOVR"].ToString() != values["RPOVR"].ToString() + || rpibRow["RPSLY"].ToString() != values["RPSLY"].ToString() + || rpibRow["RPAMT"].ToString() != values["RPAMT"].ToString() + || rpibRow["RPAM2"].ToString() != values["RPAM2"].ToString() + || rpibRow["RPAM3"].ToString() != values["RPAM3"].ToString() + || rpibRow["RPSLA"].ToString() != values["RPSLA"].ToString() + || rpibRow["RPPTP"].ToString() != values["RPPTP"].ToString() + || rpibRow["RPNAT"].ToString() != values["RPNAT"].ToString() + || rpibRow["RPDIS"].ToString() != values["RPDIS"].ToString() + || rpibRow["RPDIH"].ToString() != values["RPDIH"].ToString() + || rpibRow["RPFMY"].ToString() != values["RPFMY"].ToString() + || rpibRow["RPFM1"].ToString() != values["RPFM1"].ToString() + || rpibRow["RPFM2"].ToString() != values["RPFM2"].ToString() + || rpibRow["RPFM3"].ToString() != values["RPFM3"].ToString() + // || rpibRow["RPCPY"].ToString() != values["RPCPY"].ToString() + || rpibRow["RPFMD"].ToString() != values["RPFMD"].ToString(); + } + } + + if (RPEDTChanged && OtherChanged) + { + result = false; + cvMessage.ErrorMessage += "退保日期異動與其他資料異動請分開輸入,不可在同一筆異動
"; + cvMessage.IsValid = false; + } + + ProcessCustomValidatorMessage(cvMessage); + return result; + } + + protected void RPIRForm_ItemInserting(object sender, FormViewInsertEventArgs e) + { + e.Values["RPDIS"] = (RPIRForm.FindControl("ddlRPIR_RPDIS") as DropDownList).SelectedValue; + e.Values["RPNAT"] = (RPIRForm.FindControl("ddlRPIR_RPNAT") as DropDownList).SelectedValue; + e.Values["RPPTP"] = (RPIRForm.FindControl("ddlRPIR_RPPTP") as DropDownList).SelectedValue; + e.Cancel = !CheckInput(e.Values); + } + + protected void RPIRForm_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + e.Cancel = !CheckInput(e.NewValues); + } + + protected void cvNumber_ServerValidate(object source, ServerValidateEventArgs args) + { + int i = 0; + args.IsValid = !string.IsNullOrEmpty(args.Value) && Int32.TryParse(args.Value, out i); + if (!args.IsValid) + return; + + var validator = (CustomValidator)source; + var chbRPIR_RPLIS = (WCheckBox)validator.NamingContainer.FindControl("chbRPIR_RPLIS"); // 有勞保 + var chbRPIR_RPHIS = (WCheckBox)validator.NamingContainer.FindControl("chbRPIR_RPHIS"); // 有健保 + var chbRPIR_RPOLD = (WCheckBox)validator.NamingContainer.FindControl("chbRPIR_RPOLD"); // 已領老年給付 + var chbRPIR_RPOVR = (WCheckBox)validator.NamingContainer.FindControl("chbRPIR_RPOVR"); // 超過65歲 + bool isRPLIS = chbRPIR_RPLIS != null && chbRPIR_RPLIS.Value == "Y"; + bool isRPHIS = chbRPIR_RPHIS != null && chbRPIR_RPHIS.Value == "Y"; + bool isRPOLD = chbRPIR_RPOLD != null && chbRPIR_RPOLD.Value == "Y"; + bool isRPOVR = chbRPIR_RPOVR != null && chbRPIR_RPOVR.Value == "Y"; + + switch (validator.ID) + { + case "cvRPSLY": // 薪資必須大於 0 + args.IsValid = (i > 0); + break; + case "cvRPAMT": // 勞保投保級距必須大於 0 (有勞保) + args.IsValid = (i > 0) || !isRPLIS; + break; + case "cvRPAM2": // 健保投保級距必須大於 0 (有健保) + args.IsValid = (i > 0) || !isRPHIS; + break; + case "cvRPAM3": // 勞退投保級距必須大於 0 (未領老年給付 未超過65歲) + args.IsValid = (i > 0) || (isRPOLD || isRPOVR); + break; + //case "cvRPFMY": // 眷口數必須大於等於 0 + // args.IsValid = i >= 0; + // break; + case "cvRPSLA": // 勞退自提必須 0-6 (未領老年給付 未超過65歲) + args.IsValid = (i >= 0 && i <= 6) || (isRPOLD || isRPOVR); + break; + } + } + + protected void cvRPENO_ServerValidate(object source, ServerValidateEventArgs args) + { + if (bpsn == null) + bpsn = new BPSN_DAC(WConfig.GetConnectionConfig(), WConfig.GetConnectionConfigName()); + args.IsValid = args.Value != "" && bpsn.IsExist(args.Value, true); + } + + protected void rblRPIR_RPOPT_SelectedIndexChanged(object sender, EventArgs e) + { + FormControl(); + } + + protected void btnRPOPTSelectAll_Click(object sender, EventArgs e) + { + for (var i = 0; i < rblRPOPT.Items.Count; i++) { rblRPOPT.Items[i].Selected = true; } + } + + protected void btnExport_Click(object sender, EventArgs e) + { + lbMessage.Visible = false; + List messages = new List(); + ParseSearchInput(); + var rpopts = _RPOPT.Split(','); + + if (_RPXDT1.Ticks == 0 && _RPXDT2.Ticks == 0 && _RPBDT1.Ticks == 0 && _RPBDT2.Ticks == 0) + { + messages.Add("請輸入申請日期範圍或生效日期範圍"); + } + + if (string.IsNullOrEmpty(_RPOPT)) + { + messages.Add("請選擇匯出作業類別"); + } + + if (messages.Count > 0) + { + lbMessage.Text = string.Join("
", messages.ToArray()); + lbMessage.Visible = true; + return; + } + + RpirDAC rpirDao = new RpirDAC(Query); + + DataTable rpirData = rpirDao.SelectPage(0, Int32.MaxValue, _RPENO, _BPNME, _RPXDT1, _RPXDT2, _RPOPT, _RPBDT1, _RPBDT2, null); + + if (rpirData.Rows.Count == 0) + { + lbMessage.Text = GetString("NOSRHCOND"); + lbMessage.Visible = true; + return; + } + + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.CreateSheet("報表") as HSSFSheet; + sheet.ForceFormulaRecalculation = true; + Excel excel = new Excel(); + excel.WorkBook = workbook; + excel.Sheet = sheet; + int row = 0; + int col = 0; + string[] familyRpopts = { "加保", "眷屬加保", "退保", "眷屬退保" }; + + // 抬頭 + excel.SetCellValue(row, col++, "作業類型"); + excel.SetCellValue(row, col++, "單號"); + excel.SetCellValue(row, col++, "申請人"); + excel.SetCellValue(row, col++, "申請日期"); + excel.SetCellValue(row, col++, "生效日期"); + excel.SetCellValue(row, col++, "人員編號"); + excel.SetCellValue(row, col++, "姓名"); + excel.SetCellValue(row, col++, "眷屬姓名"); + excel.SetCellValue(row, col++, "身分證字號"); + excel.SetCellValue(row, col++, "出生年月日"); + excel.SetCellValue(row, col++, "加保日期"); + excel.SetCellValue(row, col++, "退保日期"); + excel.SetCellValue(row, col++, "薪資"); + excel.SetCellValue(row, col++, "勞保級距"); + excel.SetCellValue(row, col++, "健保級距"); + excel.SetCellValue(row, col++, "勞退級距"); + excel.SetCellValue(row, col++, "勞退自提"); + excel.SetCellValue(row, col++, "加保狀況"); + excel.SetCellValue(row, col++, "備註"); + row++; + + // 內容 + foreach (DataRow r in rpirData.Rows) + { + // 取出異動資料 + DataTable rpibData = rpirDao.SelectRPIB(WDAC.GetStringValue(r["RPREN"])); + + foreach (DataRow br in rpibData.Rows) + { + var rpeno = WDAC.GetStringValue(br["RPENO"]); + var bpnme = WDAC.GetStringValue(br["BPNME"]); + var rpopt = WDAC.GetStringValue(br["RPOPT"]); + var rpxdt = WDAC.GetDateTimeValue(br["RPXDT"]); + var rpbdt = WDAC.GetDateTimeValue(br["RPBDT"]); + var rpedt = WDAC.GetDateTimeValue(br["RPEDT"]); + + // 排除異動資料不在查詢範圍中 + if (!string.IsNullOrEmpty(_RPENO) && !rpeno.StartsWith(_RPENO) + || !string.IsNullOrEmpty(_BPNME) && !bpnme.StartsWith(_BPNME) + || _RPXDT1.Ticks > 0 && _RPXDT2.Ticks > 0 && (rpxdt < _RPXDT1 || rpxdt > _RPXDT2) + || _RPXDT1.Ticks > 0 && _RPXDT2.Ticks == 0 && rpxdt < _RPXDT1 + || _RPXDT1.Ticks == 0 && _RPXDT2.Ticks > 0 && rpxdt > _RPXDT2 + || rpopts.Length > 0 && Array.IndexOf(rpopts, rpopt) < 0 + || _RPBDT1.Ticks > 0 && _RPBDT2.Ticks > 0 && (rpbdt < _RPBDT1 || rpxdt > _RPBDT2) + || _RPBDT1.Ticks > 0 && _RPBDT2.Ticks == 0 && rpbdt < _RPBDT1 + || _RPBDT1.Ticks == 0 && _RPBDT2.Ticks > 0 && rpbdt > _RPBDT2 + ) + { + continue; + } + + var trusr = !string.IsNullOrEmpty(br["TRUSR"].ToString()) ? GetLookup("BPSN", WDAC.GetStringValue(br["TRUSR"]), "BPNME") : ""; + + if (true /* || rpopt != "眷屬加保" && rpopt != "眷屬退保" */) + { + col = 0; + excel.SetCellValue(row, col++, rpopt); + excel.SetCellValue(row, col++, WDAC.GetStringValue(br["RPREN"])); + excel.SetCellValue(row, col++, trusr); + excel.SetCellValue(row, col++, rpxdt.Ticks > 0 ? string.Format("{0:yyyy/MM/dd}", rpxdt) : ""); + excel.SetCellValue(row, col++, rpbdt.Ticks > 0 ? string.Format("{0:yyyy/MM/dd}", rpbdt) : ""); + excel.SetCellValue(row, col++, rpeno); + excel.SetCellValue(row, col++, bpnme); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, WDAC.GetStringValue(br["BPIDN"])); + excel.SetCellValue(row, col++, br["BPBDY"] != DBNull.Value ? string.Format("{0:yyyy/MM/dd}", WDAC.GetDateTimeValue(br["BPBDY"])) : ""); + excel.SetCellValue(row, col++, br["RPSDT"] != DBNull.Value ? string.Format("{0:yyyy/MM/dd}", WDAC.GetDateTimeValue(br["RPSDT"])) : ""); + excel.SetCellValue(row, col++, br["RPEDT"] != DBNull.Value ? string.Format("{0:yyyy/MM/dd}", WDAC.GetDateTimeValue(br["RPEDT"])) : ""); + excel.SetCellValue(row, col++, WDAC.GetInt32Value(br["RPSLY"])); + excel.SetCellValue(row, col++, WDAC.GetInt32Value(br["RPAMT"])); + excel.SetCellValue(row, col++, WDAC.GetInt32Value(br["RPAM2"])); + excel.SetCellValue(row, col++, WDAC.GetInt32Value(br["RPAM3"])); + excel.SetCellValue(row, col++, WDAC.GetInt32Value(br["RPSLA"])); + // excel.SetCellValue(row, col++, rpedt.Ticks == 0 ? "加保" : "退保"); + excel.SetCellValue(row, col++, string.Format("有勞保:{0} / 有健保:{1} / 已領老年給付:{2} / 超過65歲:{3}" + , WDAC.GetStringValue(br["RPLIS"]) == "Y" ? "是" : "否" + , WDAC.GetStringValue(br["RPHIS"]) == "Y" ? "是" : "否" + , WDAC.GetStringValue(br["RPOLD"]) == "Y" ? "是" : "否" + , WDAC.GetStringValue(br["RPOVR"]) == "Y" ? "是" : "否")); + excel.SetCellValue(row, col++, WDAC.GetStringValue(br["RPDOC"])); + row++; + } + + // 眷屬 + if (Array.IndexOf(familyRpopts, rpopt) < 0) + { + continue; + } + + var rpfmd = Newtonsoft.Json.JsonConvert.DeserializeObject(br["RPFMD"].ToString()); + var rpfmd_prev = Newtonsoft.Json.JsonConvert.DeserializeObject(br["RPFMD_PREV"].ToString()); + if (rpfmd_prev == null) + { + rpfmd_prev = new RPFMDList(); + } + + if (rpfmd != null) + { + foreach (var rpfmdItem in rpfmd) + { + var rpfmdRpopt = ""; + DateTime rpfmdBirthday, rpfmdStartDate, rpfmdEndDate; + WGuard1.CheckDate(rpfmdItem.BIRTHDAY, out rpfmdBirthday); + WGuard1.CheckDate(rpfmdItem.START_DATE, out rpfmdStartDate); + WGuard1.CheckDate(rpfmdItem.END_DATE, out rpfmdEndDate); + + if (rpfmd_prev.Find(x => rpfmdItem.Equals(x)) != null) + { + continue; + } + + //switch (rpopt) + //{ + // case "加保": + // case "眷屬加保": + // rpfmdRpopt = "眷屬加保"; + // if (rpfmd_prev != null && rpfmd_prev.Find(x => + // string.Compare(x.NAME, rpfmdItem.NAME) == 0 + // && string.Compare(x.BIRTHDAY, rpfmdItem.BIRTHDAY) == 0 + // && string.Compare(x.IDNO, rpfmdItem.IDNO) == 0 + // && string.Compare(x.START_DATE, rpfmdItem.START_DATE) == 0 + // ) != null + // && !string.IsNullOrEmpty(rpfmdItem.END_DATE)) + // { + // continue; + // } + // break; + + // case "退保": + // case "眷屬退保": + // rpfmdRpopt = "眷屬退保"; + // if (rpfmd_prev != null && rpfmd_prev.Find(x => + // string.Compare(x.NAME, rpfmdItem.NAME) == 0 + // && string.Compare(x.BIRTHDAY, rpfmdItem.BIRTHDAY) == 0 + // && string.Compare(x.IDNO, rpfmdItem.IDNO) == 0 + // && string.Compare(x.START_DATE, rpfmdItem.START_DATE) == 0 + // ) != null + // && string.IsNullOrEmpty(rpfmdItem.END_DATE)) + // { + // continue; + // } + // break; + //} + + col = 0; + excel.SetCellValue(row, col++, rpfmdRpopt); + excel.SetCellValue(row, col++, WDAC.GetStringValue(br["RPREN"])); + excel.SetCellValue(row, col++, trusr); + excel.SetCellValue(row, col++, rpxdt.Ticks > 0 ? string.Format("{0:yyyy/MM/dd}", rpxdt) : ""); + excel.SetCellValue(row, col++, rpbdt.Ticks > 0 ? string.Format("{0:yyyy/MM/dd}", rpbdt) : ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, rpfmdItem.NAME); + excel.SetCellValue(row, col++, rpfmdItem.IDNO); + excel.SetCellValue(row, col++, rpfmdBirthday.Ticks > 0 ? string.Format("{0:yyyy/MM/dd}", rpfmdBirthday) : ""); + excel.SetCellValue(row, col++, rpfmdStartDate.Ticks > 0 ? string.Format("{0:yyyy/MM/dd}", rpfmdStartDate) : ""); + excel.SetCellValue(row, col++, rpfmdEndDate.Ticks > 0 ? string.Format("{0:yyyy/MM/dd}", rpfmdEndDate) : ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, ""); + excel.SetCellValue(row, col++, rpfmdEndDate.Ticks == 0 ? "健保加保" : "健保退保"); + excel.SetCellValue(row, col++, ""); + row++; + } + } + } + } + + // 設定欄寬 + col = 0; + excel.SetColumnWidth(col++, 10); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 54); + excel.SetColumnWidth(col++, 50); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + ResponseWriteFile(ms, String.Format("作業類別清單_{0:yyyyMMddHHmmss}.xls", DateTime.UtcNow.AddHours(8))); + } + + /// + /// 匯出勞健保投退保異常清單 + /// + /// + /// + protected void btnExportAbnormal_Click(object sender, EventArgs e) + { + lbMessage.Visible = false; + List messages = new List(); + ParseSearchInput(); + + if (_RPXDT1.Ticks == 0 || _RPXDT2.Ticks == 0) + { + messages.Add("請輸入匯出日期範圍"); + } + + if (messages.Count > 0) + { + lbMessage.Text = string.Join("
", messages.ToArray()); + lbMessage.Visible = true; + return; + } + + var result = new DataTable(); + result.Columns.Add("ABNORMAL_TYPE", typeof(string)); + result.Columns.Add("BPENO", typeof(string)); + result.Columns.Add("BPNME", typeof(string)); + result.Columns.Add("BPSDY", typeof(DateTime)); + result.Columns.Add("BPEDY", typeof(DateTime)); + result.Columns.Add("RPSDT", typeof(DateTime)); + result.Columns.Add("RPEDT", typeof(DateTime)); + + var cmdSource = Query.NewCommand(); + var cmdCheck = Query.NewCommand(); + + #region 取資料 + + // 1. 檢查到職未加保 + cmdSource.CommandText = @"SELECT BPENO, BPNME, BPSDY + FROM BPSNView + WHERE BPSDY BETWEEN @DATE1 AND @DATE2 + ORDER BY BPENO"; + Query.AddParam(cmdSource, "DATE1", _RPXDT1); + Query.AddParam(cmdSource, "DATE2", _RPXDT2); + foreach (DataRow r in Query.Select(cmdSource).Rows) + { + cmdCheck.CommandText = + @"SELECT RPREN, RPSDT + FROM RPIR + WHERE RPENO = @RPENO + AND RPSDT = @RPSDT + UNION + SELECT RPREN, RPSDT + FROM RPIB + WHERE RPENO = @RPENO + AND RPSDT = @RPSDT"; + Query.AddParam(cmdCheck, "RPENO", r["BPENO"]); + Query.AddParam(cmdCheck, "RPSDT", r["BPSDY"]); + if (Query.Select(cmdCheck).Rows.Count == 0) + { + result.Rows.Add("到職未加保", r["BPENO"], r["BPNME"], r["BPSDY"], DBNull.Value, DBNull.Value, DBNull.Value); + } + } + + // 2. 檢查離職未退保 + cmdSource.CommandText = @"SELECT BPENO, BPNME, BPEDY + FROM BPSNView + WHERE BPEDY BETWEEN @DATE1 AND @DATE2 + ORDER BY BPENO"; + cmdSource.Parameters.Clear(); + Query.AddParam(cmdSource, "DATE1", _RPXDT1); + Query.AddParam(cmdSource, "DATE2", _RPXDT2); + foreach (DataRow r in Query.Select(cmdSource).Rows) + { + cmdCheck.CommandText = + @"SELECT RPREN, RPEDT + FROM RPIR + WHERE RPENO = @RPENO + AND RPEDT = @RPEDT + UNION + SELECT RPREN, RPEDT + FROM RPIB + WHERE RPENO = @RPENO + AND RPEDT = @RPEDT"; + Query.AddParam(cmdCheck, "RPENO", r["BPENO"]); + Query.AddParam(cmdCheck, "RPEDT", r["BPEDY"]); + if (Query.Select(cmdCheck).Rows.Count == 0) + { + result.Rows.Add("離職未退保", r["BPENO"], r["BPNME"], DBNull.Value, r["BPEDY"], DBNull.Value, DBNull.Value); + } + } + + // 3. 檢查加保未到職 + cmdSource.CommandText = + @"SELECT DISTINCT * + FROM + ( + SELECT RPENO, BPNME, RPSDT + FROM RPIR + JOIN BPSNView ON RPENO=BPENO + WHERE RPSDT BETWEEN @DATE1 AND @DATE2 + UNION + SELECT RPENO, BPNME, RPSDT + FROM RPIB + JOIN BPSNView ON RPENO=BPENO + WHERE RPSDT BETWEEN @DATE1 AND @DATE2 + ) T + ORDER BY RPENO"; + cmdSource.Parameters.Clear(); + Query.AddParam(cmdSource, "DATE1", _RPXDT1); + Query.AddParam(cmdSource, "DATE2", _RPXDT2); + foreach (DataRow r in Query.Select(cmdSource).Rows) + { + cmdCheck.CommandText = + @"SELECT BPENO, BPEDY + FROM BPSNView + WHERE BPENO = @BPENO + AND BPSDY = @BPSDY"; + Query.AddParam(cmdCheck, "BPENO", r["RPENO"]); + Query.AddParam(cmdCheck, "BPSDY", r["RPSDT"]); + if (Query.Select(cmdCheck).Rows.Count == 0) + { + result.Rows.Add("加保未到職", r["RPENO"], r["BPNME"], DBNull.Value, DBNull.Value, r["RPSDT"], DBNull.Value); + } + } + + // 4. 檢查退保未離職 + cmdSource.CommandText = + @"SELECT DISTINCT * + FROM + ( + SELECT RPENO, BPNME, RPEDT + FROM RPIR + JOIN BPSNView ON RPENO=BPENO + WHERE RPEDT BETWEEN @DATE1 AND @DATE2 + UNION + SELECT RPENO, BPNME, RPEDT + FROM RPIB + JOIN BPSNView ON RPENO=BPENO + WHERE RPEDT BETWEEN @DATE1 AND @DATE2 + ) T + ORDER BY RPENO"; + cmdSource.Parameters.Clear(); + Query.AddParam(cmdSource, "DATE1", _RPXDT1); + Query.AddParam(cmdSource, "DATE2", _RPXDT2); + foreach (DataRow r in Query.Select(cmdSource).Rows) + { + cmdCheck.CommandText = + @"SELECT BPENO, BPEDY + FROM BPSNView + WHERE BPENO = @BPENO + AND BPEDY = @BPEDY"; + Query.AddParam(cmdCheck, "BPENO", r["RPENO"]); + Query.AddParam(cmdCheck, "BPEDY", r["RPEDT"]); + if (Query.Select(cmdCheck).Rows.Count == 0) + { + result.Rows.Add("退保未離職", r["RPENO"], r["BPNME"], DBNull.Value, DBNull.Value, DBNull.Value, r["RPEDT"]); + } + } + + if (result.Rows.Count == 0) + { + lbMessage.Text = "查詢日期區間內無投退保異常資料"; + lbMessage.Visible = true; + return; + } + + #endregion 取資料 + + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.CreateSheet("報表") as HSSFSheet; + sheet.ForceFormulaRecalculation = true; + Excel excel = new Excel(); + excel.WorkBook = workbook; + excel.Sheet = sheet; + int row = 0; + int col = 0; + + // 抬頭 + excel.SetCellValue(row, col++, "異常類型"); + excel.SetCellValue(row, col++, "人員編號"); + excel.SetCellValue(row, col++, "人員姓名"); + excel.SetCellValue(row, col++, "到職日期"); + excel.SetCellValue(row, col++, "離職日期"); + excel.SetCellValue(row, col++, "加保日期"); + excel.SetCellValue(row, col++, "退保日期"); + row++; + + // 內容 + foreach (DataRow r in result.Rows) + { + col = 0; + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["ABNORMAL_TYPE"])); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["BPENO"])); + excel.SetCellValue(row, col++, WDAC.GetStringValue(r["BPNME"])); + excel.SetCellValue(row, col++, r["BPSDY"] != DBNull.Value ? string.Format("{0:yyyy/MM/dd}", WDAC.GetDateTimeValue(r["BPSDY"])) : ""); + excel.SetCellValue(row, col++, r["BPEDY"] != DBNull.Value ? string.Format("{0:yyyy/MM/dd}", WDAC.GetDateTimeValue(r["BPEDY"])) : ""); + excel.SetCellValue(row, col++, r["RPSDT"] != DBNull.Value ? string.Format("{0:yyyy/MM/dd}", WDAC.GetDateTimeValue(r["RPSDT"])) : ""); + excel.SetCellValue(row, col++, r["RPEDT"] != DBNull.Value ? string.Format("{0:yyyy/MM/dd}", WDAC.GetDateTimeValue(r["RPEDT"])) : ""); + row++; + } + + // 設定欄寬 + col = 0; + excel.SetColumnWidth(col++, 20); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + excel.SetColumnWidth(col++, 12); + + MemoryStream ms = new MemoryStream(); + workbook.Write(ms); + ResponseWriteFile(ms, String.Format("投退保異常清單_{0:yyyyMMddHHmmss}.xls", DateTime.UtcNow.AddHours(8))); + } + + protected void btnReturnBPSN_Click(object sender, EventArgs e) + { + DoAfterCommand("BPSN"); + } +} + +public class RPFMDItem +{ + public string NAME; + public string BIRTHDAY; + public string IDNO; + public string RELATIONSHIP; + public string DEDUCT; + public string START_DATE; + public string END_DATE; + public string Message; + + private DateTime rpfmdBirthday, rpfmdStartDate, rpfmdEndDate; + + public bool Valid + { + get + { + if (!string.IsNullOrEmpty(NAME)) { NAME = NAME.Trim(); } + if (!string.IsNullOrEmpty(BIRTHDAY)) { BIRTHDAY = BIRTHDAY.Trim(); } + if (!string.IsNullOrEmpty(IDNO)) { IDNO = IDNO.ToUpper().Trim(); } + if (!string.IsNullOrEmpty(START_DATE)) { START_DATE = START_DATE.Trim(); } + if (!string.IsNullOrEmpty(END_DATE)) { END_DATE = END_DATE.Trim(); } + + var messages = new List(); + var valid = true; + + WGuard1.CheckDate(BIRTHDAY, out rpfmdBirthday); + WGuard1.CheckDate(START_DATE, out rpfmdStartDate); + WGuard1.CheckDate(END_DATE, out rpfmdEndDate); + + if (string.IsNullOrEmpty(NAME)) { valid = false; messages.Add("姓名未輸入"); } + if (string.IsNullOrEmpty(BIRTHDAY)) { valid = false; messages.Add("出生年月日未輸入"); } + if (!string.IsNullOrEmpty(BIRTHDAY) && rpfmdBirthday.Ticks == 0) { valid = false; messages.Add("出生年月日不正確"); } + if (string.IsNullOrEmpty(IDNO)) { valid = false; messages.Add("身份證字號未輸入"); } + if (!string.IsNullOrEmpty(IDNO) && WGuard1.WCheckIdCardNumber(IDNO) != 0) { valid = false; messages.Add("身份證字號不正確"); } + if (string.IsNullOrEmpty(RELATIONSHIP)) { valid = false; messages.Add("關係未選擇"); } + if (string.IsNullOrEmpty(DEDUCT)) { valid = false; messages.Add("減免比例未選擇"); } + if (string.IsNullOrEmpty(START_DATE)) { valid = false; messages.Add("加保日期未輸入"); } + if (!string.IsNullOrEmpty(START_DATE) && rpfmdStartDate.Ticks == 0) { valid = false; messages.Add("加保日期不正確"); } + if (!string.IsNullOrEmpty(END_DATE) && rpfmdEndDate.Ticks == 0) { valid = false; messages.Add("退保日期不正確"); } + if (rpfmdStartDate.Ticks > 0 && rpfmdEndDate.Ticks > 0 && rpfmdStartDate.Ticks > rpfmdEndDate.Ticks) { valid = false; messages.Add("退保日期不可先於加保日期"); } + + Message = string.Join(" / ", messages.ToArray()); + + return valid; + } + } + + public bool OnBoard + { + get + { + return string.IsNullOrEmpty(END_DATE); + } + } + + public bool Equals(RPFMDItem obj) + { + return obj != null + && NAME == obj.NAME + && BIRTHDAY == obj.BIRTHDAY + && IDNO == obj.IDNO + && RELATIONSHIP == obj.RELATIONSHIP + && DEDUCT == obj.DEDUCT + && START_DATE == obj.START_DATE + && END_DATE == obj.END_DATE; + } +} + +public class RPFMDList : List { } \ No newline at end of file diff --git a/Web/forms/worker/fmRsaj.ascx b/Web/forms/worker/fmRsaj.ascx new file mode 100644 index 0000000..5d428a9 --- /dev/null +++ b/Web/forms/worker/fmRsaj.ascx @@ -0,0 +1,657 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmRsaj.ascx.cs" Inherits="forms_worker_fmRsaj" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 年月: + + +
+ 專案: + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 年月 + 人員編號 + 金額 + 備註
1 + + + + + +
2 + + + + + +
3 + + + + + +
4 + + + + + +
5 + + + + + +
6 + + + + + +
7 + + + + + +
8 + + + + + +
9 + + + + + +
10 + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 單號: + +
+ 專案年度編號: + +
+ 年月: +
+ 人員編號: + +
+ 金額: +
+ 備註: +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 單號: + + +
+ 專案年度編號: + +
+ 年月: +
+ 人員編號: + +
+ 金額: + + +
+ 備註: +
+ +
+ +
+ 無資料 +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + diff --git a/Web/forms/worker/fmRsaj.ascx.cs b/Web/forms/worker/fmRsaj.ascx.cs new file mode 100644 index 0000000..923ddf1 --- /dev/null +++ b/Web/forms/worker/fmRsaj.ascx.cs @@ -0,0 +1,683 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Drawing; + +/// +/// 人員薪資調整項目處理 +/// +public partial class forms_worker_fmRsaj : Wellan.Web.UI.WUserControlBase +{ + protected DateTime _YYMM; + protected string _RSENO = ""; + protected string _RSPYN = ""; + private string select = "SELECT * "; + private string from = " FROM RSAJ "; + private string where = " WHERE 1=1 "; + // private string order = " ORDER BY RSPYN, RSREN"; + private string order = " ORDER BY RSYMM DESC, RSREN DESC"; + private TextBox[] RSYMMs = new TextBox[10]; + private DropDownList[] RSENOs = new DropDownList[10]; + private TextBox[] RSAMTs = new TextBox[10]; + private TextBox[] RSDOCs = new TextBox[10]; + private DateTime[] RSYMMValues = new DateTime[10]; + private int[] RSAMTValues = new int[10]; + + protected void Page_Load(object sender, EventArgs e) + { + _RSENO = GetStringViewState("RSENO"); + _RSPYN = GetStringViewState("RSPYN"); + _YYMM = GetDateTimeViewState("YYMM"); + //if (IsPostBack) + // RSAJGrid.DataBind(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsRSAJForm.ConnectionString = ConnectionString; + dsRSAJGrid.ConnectionString = ConnectionString; + dsRSAJ_RSENO.ConnectionString = ConnectionString; + dsRSAJ_RSENO.SelectCommand = + @"IF @RSPYN = '-ALL-' + BEGIN + SELECT DISTINCT A.BPENO, A.BPENO + ' ' + A.BPNME BPNME + FROM BPSNView A INNER JOIN RASN B ON A.BPENO=B.RANUM + ORDER BY A.BPENO + END + ELSE IF @RSPYN<>'000000001' + BEGIN + SELECT DISTINCT A.BPENO, A.BPENO + ' ' + A.BPNME BPNME + FROM BPSNView A INNER JOIN RASN B ON A.BPENO=B.RANUM + WHERE B.RAPYN=@RSPYN + ORDER BY A.BPENO + END + ELSE + BEGIN + SELECT DISTINCT BPENO, BPENO + ' ' + BPNME BPNME, BPSDY, BPEDY + FROM BPSNView + WHERE ( (BPSDY <= @YYMM1 AND BPEDY >= @YYMM2) + OR (BPSDY <= @YYMM1 AND BPEDY IS NULL) + OR (BPSDY <= @YYMM1 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2) + OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM2) + OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY IS NULL) + OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2)) + AND BPENO NOT IN + (SELECT RANUM FROM RASN + WHERE ( (RASDT <= @YYMM3 AND RAEDT >= @YYMM4) + OR (RASDT <= @YYMM3 AND RAEDT IS NULL) + OR (RASDT <= @YYMM3 AND RAEDT >= @YYMM3 AND RAEDT <= @YYMM4) + OR (RASDT >= @YYMM3 AND RASDT <= @YYMM4 AND RAEDT >= @YYMM4) + OR (RASDT >= @YYMM3 AND RASDT <= @YYMM4 AND RAEDT IS NULL) + OR (RASDT >= @YYMM3 AND RASDT <= @YYMM4 AND RAEDT >= @YYMM3 AND RAEDT <= @YYMM4))) + ORDER BY BPENO + END"; + + ListItem item = ddlRSPYN.Items.FindByValue(_RSPYN); + if (item != null) + item.Selected = true; + + SetClientFocus(txtYYMM); + + MultiView1.Visible = _RSPYN != ""; + + GetRsenoDropDownData(); + + RSYMMs[0] = txtRSAJ_RSYMM_01; + RSYMMs[1] = txtRSAJ_RSYMM_02; + RSYMMs[2] = txtRSAJ_RSYMM_03; + RSYMMs[3] = txtRSAJ_RSYMM_04; + RSYMMs[4] = txtRSAJ_RSYMM_05; + RSYMMs[5] = txtRSAJ_RSYMM_06; + RSYMMs[6] = txtRSAJ_RSYMM_07; + RSYMMs[7] = txtRSAJ_RSYMM_08; + RSYMMs[8] = txtRSAJ_RSYMM_09; + RSYMMs[9] = txtRSAJ_RSYMM_10; + + RSENOs[0] = ddlRSAJ_RSENO_01; + RSENOs[1] = ddlRSAJ_RSENO_02; + RSENOs[2] = ddlRSAJ_RSENO_03; + RSENOs[3] = ddlRSAJ_RSENO_04; + RSENOs[4] = ddlRSAJ_RSENO_05; + RSENOs[5] = ddlRSAJ_RSENO_06; + RSENOs[6] = ddlRSAJ_RSENO_07; + RSENOs[7] = ddlRSAJ_RSENO_08; + RSENOs[8] = ddlRSAJ_RSENO_09; + RSENOs[9] = ddlRSAJ_RSENO_10; + + RSAMTs[0] = txtRSAJ_RSAMT_01; + RSAMTs[1] = txtRSAJ_RSAMT_02; + RSAMTs[2] = txtRSAJ_RSAMT_03; + RSAMTs[3] = txtRSAJ_RSAMT_04; + RSAMTs[4] = txtRSAJ_RSAMT_05; + RSAMTs[5] = txtRSAJ_RSAMT_06; + RSAMTs[6] = txtRSAJ_RSAMT_07; + RSAMTs[7] = txtRSAJ_RSAMT_08; + RSAMTs[8] = txtRSAJ_RSAMT_09; + RSAMTs[9] = txtRSAJ_RSAMT_10; + + RSDOCs[0] = txtRSAJ_RSDOC_01; + RSDOCs[1] = txtRSAJ_RSDOC_02; + RSDOCs[2] = txtRSAJ_RSDOC_03; + RSDOCs[3] = txtRSAJ_RSDOC_04; + RSDOCs[4] = txtRSAJ_RSDOC_05; + RSDOCs[5] = txtRSAJ_RSDOC_06; + RSDOCs[6] = txtRSAJ_RSDOC_07; + RSDOCs[7] = txtRSAJ_RSDOC_08; + RSDOCs[8] = txtRSAJ_RSDOC_09; + RSDOCs[9] = txtRSAJ_RSDOC_10; + + StringBuilder sb1 = new StringBuilder(); + StringBuilder sb2 = new StringBuilder(); + StringBuilder sb3 = new StringBuilder(); + for (int i = 0; i < 10; i++) + { + sb1.Append(String.Format("\"{0}\"", RSYMMs[i].ClientID) + (i < 9 ? "," : "")); + sb2.Append(String.Format("\"{0}\"", RSAMTs[i].ClientID) + (i < 9 ? "," : "")); + sb3.Append(String.Format("\"{0}\"", RSDOCs[i].ClientID) + (i < 9 ? "," : "")); + } + Page.ClientScript.RegisterArrayDeclaration("RSYMMIds", sb1.ToString()); + Page.ClientScript.RegisterArrayDeclaration("RSAMTIds", sb2.ToString()); + Page.ClientScript.RegisterArrayDeclaration("RSDOCIds", sb3.ToString()); + + GetGridViewRowColor(RSAJGrid); + + switch (MultiView1.ActiveViewIndex) + { + case 1: + SetClientFocus(txtRSAJ_RSYMM_01); + Search(); + break; + case 2: + Search(); + break; + } + } + + // 查詢按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + ViewState["RSENO"] = txtRSENO.Text; + + _RSENO = txtRSENO.Text; + + if (_RSENO.Length == 0) + { + lbMessage.Text = GetString("NOSRHCOND"); + lbMessage.Visible = true; + } + else + { + MultiView1.ActiveViewIndex = 1; + + Search(); + + RSAJGrid.PageIndex = 0; + RSAJGrid.SelectedIndex = 0; + RSAJGrid.DataBind(); + } + } + + // 取消查詢按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + ViewState.Remove("RSENO"); + Search(); + MultiView1.ActiveViewIndex = 1; + } + + // 查詢動作 + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsRSAJGrid.SelectParameters.Clear(); + AddSearch(sql, dsRSAJGrid, "RSENO", _RSENO, "", true); + AddSearch(sql, dsRSAJGrid, "RSPYN", _RSPYN, "", true); + sql.Append(order); + dsRSAJGrid.SelectCommand = sql.ToString(); + } + + // 存檔前的計算動作 + private new void CalcFields(SqlDataSourceCommandEventArgs e) + { + } + + protected void dsRSAJForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + } + + protected void dsRSAJForm_Updating(object sender, SqlDataSourceCommandEventArgs e) + { + CalcFields(e); + } + + protected void RSAJGrid_DataBound(object sender, EventArgs e) + { + GridView_DataBound(sender, e); + if (RSAJGrid.Rows.Count > 0) + { + RSAJGrid.Visible = true; + if (RSAJGrid.SelectedIndex == -1) + RSAJGrid.SelectedIndex = 0; + if (RSAJGrid.SelectedIndex > RSAJGrid.Rows.Count - 1) + RSAJGrid.SelectedIndex = RSAJGrid.Rows.Count - 1; + + //if (RSAJGrid.SelectedIndex != -1) + //{ + // dsRSAJ_RSENO.SelectParameters["RSPYN"].DefaultValue = RSAJGrid.SelectedDataKey["RSPYN"].ToString(); + //} + + RSAJForm.DataBind(); + } + } + + protected void RSAJGrid_PageIndexChanged(object sender, EventArgs e) + { + Search(); + RSAJGrid.SelectedIndex = 0; + RSAJGrid.DataBind(); + } + + protected void dsRSAJGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + { + if (e.AffectedRows == 0) + { + /* + if (ForwardSource != "") + RSAJForm.ChangeMode(FormViewMode.Insert); + else + { + MultiView1.ActiveViewIndex = 0; + + lbMessage.Text = GetString("NODATA"); + lbMessage.Visible = true; + } + */ + } + } + + protected void RSAJForm_ItemCommand(object sender, FormViewCommandEventArgs e) + { + switch (e.CommandName) + { + case "APPEND": + MultiView1.ActiveViewIndex = 1; + GetRsenoDropDownData(); + break; + case "Search": + MultiView1.ActiveViewIndex = 0; + break; + case "Cancel": + Search(); + break; + } + } + + private void GetRsenoDropDownData() + { + if (_YYMM.Ticks != 0) + { + if (string.IsNullOrEmpty(_RSPYN)) + { + dsRSAJ_RSENO.SelectParameters["RSPYN"].DefaultValue = "-ALL-"; + } + else + { + dsRSAJ_RSENO.SelectParameters["RSPYN"].DefaultValue = _RSPYN; + } + dsRSAJ_RSENO.SelectParameters["YYMM1"].DefaultValue = WGuard1.GetMonthBegin(_YYMM, -1).ToString("yyyy/MM/dd", WGuard1.InvariantCulture); // 上個月月初日 + dsRSAJ_RSENO.SelectParameters["YYMM2"].DefaultValue = WGuard1.GetMonthEnd(_YYMM, 1).ToString("yyyy/MM/dd", WGuard1.InvariantCulture); // 下個月月底日 + dsRSAJ_RSENO.SelectParameters["YYMM3"].DefaultValue = WGuard1.GetMonthBegin(_YYMM, 0).ToString("yyyy/MM/dd", WGuard1.InvariantCulture); // 本月月初日 + dsRSAJ_RSENO.SelectParameters["YYMM4"].DefaultValue = WGuard1.GetMonthEnd(_YYMM, 0).ToString("yyyy/MM/dd", WGuard1.InvariantCulture); // 本月月底日 + } + } + + // 取得該職稱及等級之薪資資料 + protected DataTable GetBPJB(string bpjno, string bpcno) + { + DbCommand cmd = Query.NewCommand( + @"SELECT BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05 FROM BPJB + WHERE BPPYN=@BPPYN AND BPJNO=@BPJNO AND BPCNO=@BPCNO "); + cmd.Parameters.Add(Query.NewParameter("BPPYN", _RSPYN)); + cmd.Parameters.Add(Query.NewParameter("BPJNO", bpjno)); + cmd.Parameters.Add(Query.NewParameter("BPCNO", bpcno)); + return Query.Select(cmd); + } + + protected void RSAJForm_ItemDeleted(object sender, FormViewDeletedEventArgs e) + { + Search(); + RSAJGrid.DataBind(); + RSAJForm.DataBind(); + } + + protected void RSAJForm_ItemInserted(object sender, FormViewInsertedEventArgs e) + { + Search(); + } + + protected void RSAJForm_ItemUpdated(object sender, FormViewUpdatedEventArgs e) + { + Search(); + } + + protected void RSAJForm_ModeChanged(object sender, EventArgs e) + { + if (RSAJForm.CurrentMode == FormViewMode.ReadOnly) + { + RSAJGrid.Visible = true; + RSAJGrid.DataBind(); + if (RSAJGrid.Rows.Count > 0 && RSAJGrid.SelectedIndex == -1) + { + RSAJGrid.SelectedIndex = 0; + } + + if (OldMode == FormViewMode.Insert && RSAJGrid.Rows.Count > 0) + { + RSAJGrid.PageIndex = RSAJGrid.PageCount - 1; + RSAJGrid.DataBind(); + RSAJGrid.SelectedIndex = RSAJGrid.Rows.Count - 1; + } + } + else + { + switch (RSAJForm.CurrentMode) + { + case FormViewMode.Edit: + break; + case FormViewMode.Insert: + break; + } + + RSAJGrid.Visible = false; + } + } + + protected void RSAJForm_ModeChanging(object sender, FormViewModeEventArgs e) + { + OldMode = (sender as FormView).CurrentMode; + } + + protected void RSAJForm_DataBinding(object sender, EventArgs e) + { + //if (RSAJForm.FindControl("lbRSAJ_RSPYN") as ITextControl != null) + //{ + // dsRSAJ_RSENO.SelectParameters["RSPYN"].DefaultValue = (RSAJForm.FindControl("lbRSAJ_RSPYN") as ITextControl).Text; + //} + + //if (RSAJGrid.Rows.Count > 0) + //{ + // RSAJGrid.Visible = true; + // if (RSAJGrid.SelectedIndex == -1) + // RSAJGrid.SelectedIndex = 0; + // if (RSAJGrid.SelectedIndex > RSAJGrid.Rows.Count - 1) + // RSAJGrid.SelectedIndex = RSAJGrid.Rows.Count - 1; + + // if (RSAJGrid.SelectedIndex != -1 && RSAJGrid.SelectedDataKey != null) + // { + // dsRSAJ_RSENO.SelectParameters["RSPYN"].DefaultValue = RSAJGrid.SelectedDataKey["RSPYN"].ToString(); + // } + // else + // { + // dsRSAJ_RSENO.SelectParameters["RSPYN"].DefaultValue = ""; + // } + //} + } + + protected void RSAJForm_DataBound(object sender, EventArgs e) + { + var c = RSAJForm.FindControl("lbRSAJ_RSPYN") as ITextControl; + if (c != null) + { + var t = (c as ITextControl).Text; + if (!string.IsNullOrEmpty(t)) + dsRSAJ_RSENO.SelectParameters["RSPYN"].DefaultValue = t; + else + dsRSAJ_RSENO.SelectParameters["RSPYN"].DefaultValue = "-ALL-"; + } + + if (RSAJForm.CurrentMode == FormViewMode.Edit) + { + SetClientFocus(RSAJForm, "txtRSAJ_RSYMM"); + // (RSAJForm.FindControl("ddlRSAJ_RSENO_10") as DropDownList).DataBind(); + } + } + + protected void dsRSAJForm_Deleted(object sender, SqlDataSourceStatusEventArgs e) + { + } + + protected void cvRAS01_ServerValidate(object source, ServerValidateEventArgs args) + { + int i; + args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i >= 0 && i <= 6; + } + + protected void RSAJGrid_SelectedIndexChanged(object sender, EventArgs e) + { + foreach (GridViewRow row in RSAJGrid.Rows) + SetGridViewMouseBehavier(RSAJGrid, row); + } + + protected void RSAJGrid_RowDataBound(object sender, GridViewRowEventArgs e) + { + SetGridViewMouseBehavier(RSAJGrid, e.Row); + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } + + protected string GetRAJNOName(string rapyn, string rajno) + { + DbCommand cmd = Query.NewCommand("SELECT BPJME FROM BPJA WHERE (BPPYN = @BPPYN) AND (BPJNO=@BPJNO)"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", rapyn)); + cmd.Parameters.Add(Query.NewParameter("BPJNO", rajno)); + + object o = Query.ExecuteScalar(cmd); + if (o == null) + return ""; + else + return o.ToString(); + } + + protected string GetRACNOName(string rapyn, string rajno, string racno) + { + DbCommand cmd = Query.NewCommand("SELECT BPCME FROM BPJB WHERE (BPPYN = @BPPYN) AND (BPJNO=@BPJNO) AND (BPCNO=@BPCNO)"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", rapyn)); + cmd.Parameters.Add(Query.NewParameter("BPJNO", rajno)); + cmd.Parameters.Add(Query.NewParameter("BPCNO", racno)); + + object o = Query.ExecuteScalar(cmd); + if (o == null) + return ""; + else + return o.ToString(); + } + + protected void RSAJForm_ItemCreated(object sender, EventArgs e) + { + if (RSAJForm.CurrentMode == FormViewMode.Insert) + { + (RSAJForm.FindControl("txtRSAJ_RASDT") as TextBox).Text = _RSPYN.Substring(0, _RSPYN.Length - 4) + "0101"; + (RSAJForm.FindControl("txtRSAJ_RAS01") as TextBox).Text = "0"; + } + } + + protected new bool CheckInput(System.Collections.Specialized.IOrderedDictionary values) + { + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + bool result = true; + values["RSYMM"] = CheckDate(values["RSYMM"] + "01", "請輸入正確的年月", ref result, cvMessage); + + ProcessCustomValidatorMessage(cvMessage); + return result; + } + + protected void RSAJForm_ItemInserting(object sender, FormViewInsertEventArgs e) + { + e.Cancel = !CheckInput(e.Values); + } + + protected void RSAJForm_ItemUpdating(object sender, FormViewUpdateEventArgs e) + { + e.Cancel = !CheckInput(e.NewValues); + } + + protected void Next_Click(object sender, EventArgs e) + { + string rspyn = ddlRSPYN.SelectedValue; + ViewState["RSPYN"] = rspyn; + _RSPYN = rspyn; + + // 檢查此使用者是否有權限處理這個專案 + BprmDAC bprm = new BprmDAC(Query); + if (!bprm.GetRight(rspyn, UserId)) + { + MultiView1.Visible = false; + cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + cvMessage.IsValid = false; + return; + } + + //DoAfterCommand("RSAJ"); + MultiView1.Visible = true; + MultiView1.ActiveViewIndex = 1; + GetRsenoDropDownData(); + } + + private int CheckInsertInput(int index) + { + RSYMMs[index].Text = RSYMMs[index].Text.Trim(); + RSAMTs[index].Text = RSAMTs[index].Text.Trim(); + RSDOCs[index].Text = RSDOCs[index].Text.Trim(); + + // 有輸入的條件為:日期有輸入且合理,金額不等於0,備註無所謂 + bool rsymmValid = false; + bool rsamtValid = false; + rsymmValid = CheckDate(RSYMMs[index].Text + "01", out RSYMMValues[index]); + rsamtValid = Int32.TryParse(RSAMTs[index].Text, out RSAMTValues[index]); + if (RSYMMs[index].Text != "" && rsymmValid && + RSAMTs[index].Text != "" && rsamtValid && RSAMTValues[index] != 0) + { + return 0; + } + if (RSYMMs[index].Text == "" && RSAMTs[index].Text == "") + { + return 1; + } + + int returnValue = 0; + if (RSYMMs[index].Text != "" && !rsymmValid) + { + returnValue -= 1; + } + if (RSAMTs[index].Text != "" && !rsamtValid) + { + returnValue -= 2; + } + return returnValue; + } + + protected void btnSave1_Click(object sender, EventArgs e) + { + // 存檔 + // 1. 檢查各組輸入 + int[] hasInput = new int[10]; + bool valid = true; + bool needSave = false; + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + for (int i = 0; i < RSYMMs.Length; i++) + { + hasInput[i] = CheckInsertInput(i); + switch (hasInput[i]) + { + case 0: + needSave = true; + break; + case -1: + valid = false; + cvMessage.ErrorMessage += String.Format("第{0}組輸入月份不合理
", i + 1); + break; + case -2: + valid = false; + cvMessage.ErrorMessage += String.Format("第{0}組輸入金額不合理
", i + 1); + break; + case -3: + valid = false; + cvMessage.ErrorMessage += String.Format("第{0}組輸入月份與金額不合理
", i + 1); + break; + } + } + + if (!valid) + { + cvMessage.IsValid = false; + ProcessCustomValidatorMessage(cvMessage); + return; + } + + if (!needSave) + return; + + // 2. 各組輸入存檔 + DbCommand cmd1 = Query.NewCommand( + @"INSERT INTO dbo.RSAJ + (RSREN, RSENO, RSPYN, RSYMM, RSAMT, RSDOC, APPNO, TRDAT, TRMOD, TRUSR) + VALUES + (@RSREN, @RSENO, @RSPYN, @RSYMM, @RSAMT, @RSDOC, 1, GETDATE(), 'INSERT', @TRUSR)"); + cmd1.Parameters.Add(Query.NewParameter("RSREN", DbType.String)); + cmd1.Parameters.Add(Query.NewParameter("RSENO", DbType.String)); + cmd1.Parameters.Add(Query.NewParameter("RSPYN", _RSPYN)); + cmd1.Parameters.Add(Query.NewParameter("RSYMM", DbType.DateTime)); + cmd1.Parameters.Add(Query.NewParameter("RSAMT", DbType.Int32)); + cmd1.Parameters.Add(Query.NewParameter("RSDOC", DbType.String)); + cmd1.Parameters.Add(Query.NewParameter("TRUSR", UserId)); + + DbConnection conn = Query.NewConnection(ConnectionString); + cmd1.Connection = conn; + conn.Open(); + DbTransaction tran = conn.BeginTransaction(); + cmd1.Transaction = tran; + try + { + for (int i = 0; i < RSYMMs.Length; i++) + { + if (hasInput[i] == 0) + { + string rpren = WGuard1.WNextRen(RSYMMValues[i], "RSAJ", "RSREN", "YYYYMM<9999>", "", tran); + + cmd1.Parameters["RSREN"].Value = rpren; + cmd1.Parameters["RSENO"].Value = RSENOs[i].SelectedValue; + cmd1.Parameters["RSYMM"].Value = RSYMMValues[i]; + cmd1.Parameters["RSAMT"].Value = RSAMTValues[i]; + cmd1.Parameters["RSDOC"].Value = RSDOCs[i].Text; + cmd1.ExecuteNonQuery(); + } + } + tran.Commit(); + + // 清除畫面資料 + for (int i = 0; i < RSYMMs.Length; i++) + { + RSYMMs[i].Text = ""; + RSAMTs[i].Text = ""; + RSDOCs[i].Text = ""; + } + + cvMessage.ErrorMessage = "存檔完成"; + cvMessage.IsValid = false; + } + catch (Exception ex) + { + tran.Rollback(); + cvMessage.ErrorMessage = ex.Message; + cvMessage.IsValid = false; + } + finally + { + conn.Close(); + } + } + + protected void btnCancel1_Click(object sender, EventArgs e) + { + // 回到處理畫面 + Search(); + MultiView1.Visible = true; + MultiView1.ActiveViewIndex = 2; + } + + protected void btnSSMS_Click(object sender, EventArgs e) + { + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + bool result = true; + DateTime aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + + if (result) + { + MultiView1.Visible = false; + ViewState["YYMM"] = aYYMM; + _YYMM = aYYMM; + ddlRSPYN.DataSource = new BpaaDAC().GetBpaaWithTY(aYYMM.Year); + ddlRSPYN.DataBind(); + } + } +} diff --git a/Web/forms/worker/fmRyer.ascx b/Web/forms/worker/fmRyer.ascx new file mode 100644 index 0000000..b21203d --- /dev/null +++ b/Web/forms/worker/fmRyer.ascx @@ -0,0 +1,699 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="fmRyer.ascx.cs" + Inherits="forms_worker_fmRyer" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" TagPrefix="cc1" %> + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +
+ + + +
+ +
+
+
    +
  1. 跨年度時,專案條件會隱藏 【桃竹苗】展譽總公司【桃竹苗】新譽總公司,且無法查詢到這兩個專案裡的人員
  2. +
  3. 生效日空白為 1 日,31 為月底日
  4. +
  5. 結算指的是計算離職或年底折算薪資時數以及將遞延時數帶入下年度
  6. +
  7. 本年至今的年初時數計算方式依照計畫設定有以下二種:
    + 1. 無年初特休時數,預設為0 + 2. 預給去年特休時數:去年年初時數 + 去年1月至12月生效時數(正數) +
  8. +
  9. 特休結算資料輸入方式: +
      +
    1. 在職同仁特休未休結算請於結算的月份以負數方式輸入結算的時數,如剩 14 小時,請輸入「-14」,並請至薪資加減項新增結算金額。
    2. +
    3. 離職人員特休未休結算及年底特休結算請於「折算薪資時數」及「遞延下年時數」欄位輸入時數,結算金額會自動匯入薪資加減項,請自行核對。另於隔年度特休表之遞延時數欄位確認時數是否正確。
    4. +
    +
  10. +
+
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
操作年度人員編號到職日本年至今上年1月2月3月4月5月6月7月8月9月10月11月12月折算
+ 薪資
+ 時數
遞延
+ 下年
+ 時數
人員姓名離職日年初+
+ 遞延
+
+ 生效
-
+ 已休
=
+ 未休
未休



































+
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + : + + + + : + + + + + + + + + + 備註 + + + + + +
+ +
+ +
+ + diff --git a/Web/forms/worker/fmRyer.ascx.cs b/Web/forms/worker/fmRyer.ascx.cs new file mode 100644 index 0000000..c5f41dc --- /dev/null +++ b/Web/forms/worker/fmRyer.ascx.cs @@ -0,0 +1,342 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using Wellan.Common; +using System.Text; +using System.IO; +using System.Collections.Generic; + +/// +/// 年度特休輸入 +/// +public partial class forms_worker_fmRyer : Wellan.Web.UI.WUserControlBase +{ + private int yyFrom; + private int yyTo; + + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + txtYear.Focus(); + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + } + + protected void dsRyer_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) + { + yyFrom = WDAC.GetInt32Value(txtYear.Text); + yyTo = WDAC.GetInt32Value(txtYearTo.Text); + + if (yyTo == 0) + { + yyTo = yyFrom; + } + + e.InputParameters["RYYERFrom"] = yyFrom + WGuard1.CY11; + e.InputParameters["RYYERTo"] = yyTo + WGuard1.CY11; + e.InputParameters["RANUM"] = txtRAENO.Text; + e.InputParameters["RAPYN"] = ddl專案.SelectedValue; + if (e.InputParameters["RAPYN"] == null) + e.InputParameters["RAPYN"] = ""; + } + + protected void btnYY_Click(object sender, EventArgs e) + { + yyFrom = WDAC.GetInt32Value(txtYear.Text); + yyTo = WDAC.GetInt32Value(txtYearTo.Text); + if (yyTo == 0) + { + yyTo = yyFrom; + } + ddl專案.DataSource = new BpaaDAC().GetBpaaWithTYPlusNone(yyFrom + WGuard1.CY11, yyTo + WGuard1.CY11); + ddl專案.DataTextField = "BPPYM"; + ddl專案.DataValueField = "BPPYN"; + ddl專案.DataBind(); + + ListView1.Visible = false; + } + + protected void btnSearch_Click(object sender, EventArgs e) + { + if (!CheckProjectRight()) + return; + + cvMessage.ErrorMessage = ""; + cvMessage.IsValid = true; + + yyFrom = WDAC.GetInt32Value(txtYear.Text); + yyTo = WDAC.GetInt32Value(txtYearTo.Text); + + if (string.IsNullOrEmpty(txtYear.Text)) + { + cvMessage.ErrorMessage = "必須輸入年度條件"; + cvMessage.IsValid = false; + return; + } + + if (ddl專案.SelectedIndex < 0) + { + cvMessage.ErrorMessage = "必須先查詢年度專案"; + cvMessage.IsValid = false; + return; + } + + // gvRyer.DataBind(); + ListView1.DataBind(); + ListView1.Visible = true; + } + + protected void dsRyer_Updating(object sender, ObjectDataSourceMethodEventArgs e) + { + e.InputParameters["TRUSR"] = UserId; + } + + //protected void gvRyer_RowCommand(object sender, GridViewCommandEventArgs e) + //{ + // if (!CheckProjectRight()) + // return; + + // if (e.CommandName == "Save") + // { + // yyFrom = WDAC.GetInt32Value(txtYear.Text); + // // int rytot = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYTOT") as TextBox).Text); + // int ryh01 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH01") as TextBox).Text); + // int ryh02 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH02") as TextBox).Text); + // int ryh03 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH03") as TextBox).Text); + // int ryh04 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH04") as TextBox).Text); + // int ryh05 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH05") as TextBox).Text); + // int ryh06 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH06") as TextBox).Text); + // int ryh07 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH07") as TextBox).Text); + // int ryh08 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH08") as TextBox).Text); + // int ryh09 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH09") as TextBox).Text); + // int ryh10 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH10") as TextBox).Text); + // int ryh11 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH11") as TextBox).Text); + // int ryh12 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYH12") as TextBox).Text); + // int ryd01 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD01") as TextBox).Text); + // int ryd02 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD02") as TextBox).Text); + // int ryd03 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD03") as TextBox).Text); + // int ryd04 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD04") as TextBox).Text); + // int ryd05 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD05") as TextBox).Text); + // int ryd06 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD06") as TextBox).Text); + // int ryd07 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD07") as TextBox).Text); + // int ryd08 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD08") as TextBox).Text); + // int ryd09 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD09") as TextBox).Text); + // int ryd10 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD10") as TextBox).Text); + // int ryd11 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD11") as TextBox).Text); + // int ryd12 = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYD12") as TextBox).Text); + // int rysly = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYSLY") as TextBox).Text); + // int rynxt = WDAC.GetInt32Value(((e.CommandSource as Control).Parent.FindControl("RYNXT") as TextBox).Text); + // string ryrmk = ((e.CommandSource as Control).Parent.FindControl("RYRML") as TextBox).Text; + + // new RyerDAC(Query).UpdateOne( + // e.CommandArgument.ToString() + // , yyFrom + WGuard1.CY11 + // // , rytot + // , ryh01 + ryh02 + ryh03 + ryh04 + ryh05 + ryh06 + ryh07 + ryh08 + ryh09 + ryh10 + ryh11 + ryh12 + // , UserId + // , ryh01, ryh02, ryh03, ryh04, ryh05, ryh06, ryh07, ryh08, ryh09, ryh10, ryh11, ryh12 + // , ryd01, ryd02, ryd03, ryd04, ryd05, ryd06, ryd07, ryd08, ryd09, ryd10, ryd11, ryd12 + // , rysly, rynxt, ryrmk); + + // gvRyer.DataBind(); + // } + //} + + protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e) + { + //if (!CheckProjectRight()) + // return; + + //if (e.CommandName == "Save") + //{ + // string ryeno = e.CommandArgument.ToString(); + // int ryyer = WDAC.GetInt32Value(ListView1.DataKeys[0].Values[1]); + + // int ryh01 = WDAC.GetInt32Value((e.Item.FindControl("RYH01") as TextBox).Text); + // int ryh02 = WDAC.GetInt32Value((e.Item.FindControl("RYH02") as TextBox).Text); + // int ryh03 = WDAC.GetInt32Value((e.Item.FindControl("RYH03") as TextBox).Text); + // int ryh04 = WDAC.GetInt32Value((e.Item.FindControl("RYH04") as TextBox).Text); + // int ryh05 = WDAC.GetInt32Value((e.Item.FindControl("RYH05") as TextBox).Text); + // int ryh06 = WDAC.GetInt32Value((e.Item.FindControl("RYH06") as TextBox).Text); + // int ryh07 = WDAC.GetInt32Value((e.Item.FindControl("RYH07") as TextBox).Text); + // int ryh08 = WDAC.GetInt32Value((e.Item.FindControl("RYH08") as TextBox).Text); + // int ryh09 = WDAC.GetInt32Value((e.Item.FindControl("RYH09") as TextBox).Text); + // int ryh10 = WDAC.GetInt32Value((e.Item.FindControl("RYH10") as TextBox).Text); + // int ryh11 = WDAC.GetInt32Value((e.Item.FindControl("RYH11") as TextBox).Text); + // int ryh12 = WDAC.GetInt32Value((e.Item.FindControl("RYH12") as TextBox).Text); + // int ryd01 = WDAC.GetInt32Value((e.Item.FindControl("RYD01") as TextBox).Text); + // int ryd02 = WDAC.GetInt32Value((e.Item.FindControl("RYD02") as TextBox).Text); + // int ryd03 = WDAC.GetInt32Value((e.Item.FindControl("RYD03") as TextBox).Text); + // int ryd04 = WDAC.GetInt32Value((e.Item.FindControl("RYD04") as TextBox).Text); + // int ryd05 = WDAC.GetInt32Value((e.Item.FindControl("RYD05") as TextBox).Text); + // int ryd06 = WDAC.GetInt32Value((e.Item.FindControl("RYD06") as TextBox).Text); + // int ryd07 = WDAC.GetInt32Value((e.Item.FindControl("RYD07") as TextBox).Text); + // int ryd08 = WDAC.GetInt32Value((e.Item.FindControl("RYD08") as TextBox).Text); + // int ryd09 = WDAC.GetInt32Value((e.Item.FindControl("RYD09") as TextBox).Text); + // int ryd10 = WDAC.GetInt32Value((e.Item.FindControl("RYD10") as TextBox).Text); + // int ryd11 = WDAC.GetInt32Value((e.Item.FindControl("RYD11") as TextBox).Text); + // int ryd12 = WDAC.GetInt32Value((e.Item.FindControl("RYD12") as TextBox).Text); + // int rysly = WDAC.GetInt32Value((e.Item.FindControl("RYSLY") as TextBox).Text); + // int rynxt = WDAC.GetInt32Value((e.Item.FindControl("RYNXT") as TextBox).Text); + // string ryrmk = (e.Item.FindControl("RYRMK") as TextBox).Text; + + // if (ryd01 <= 0) ryd01 = 1; + // if (ryd02 <= 0) ryd02 = 1; + // if (ryd03 <= 0) ryd03 = 1; + // if (ryd04 <= 0) ryd04 = 1; + // if (ryd05 <= 0) ryd05 = 1; + // if (ryd06 <= 0) ryd06 = 1; + // if (ryd07 <= 0) ryd07 = 1; + // if (ryd08 <= 0) ryd08 = 1; + // if (ryd09 <= 0) ryd09 = 1; + // if (ryd10 <= 0) ryd10 = 1; + // if (ryd11 <= 0) ryd11 = 1; + // if (ryd12 <= 0) ryd12 = 1; + + // if (ryd01 > 31) ryd01 = 31; + // if (ryd02 > 31) ryd02 = 31; + // if (ryd03 > 31) ryd03 = 31; + // if (ryd04 > 31) ryd04 = 31; + // if (ryd05 > 31) ryd05 = 31; + // if (ryd06 > 31) ryd06 = 31; + // if (ryd07 > 31) ryd07 = 31; + // if (ryd08 > 31) ryd08 = 31; + // if (ryd09 > 31) ryd09 = 31; + // if (ryd10 > 31) ryd10 = 31; + // if (ryd11 > 31) ryd11 = 31; + // if (ryd12 > 31) ryd12 = 31; + + // new RyerDAC(Query).UpdateOne( + // ryeno + // , ryyer + // , ryh01 + ryh02 + ryh03 + ryh04 + ryh05 + ryh06 + ryh07 + ryh08 + ryh09 + ryh10 + ryh11 + ryh12 + // , UserId + // , ryh01, ryh02, ryh03, ryh04, ryh05, ryh06, ryh07, ryh08, ryh09, ryh10, ryh11, ryh12 + // , ryd01, ryd02, ryd03, ryd04, ryd05, ryd06, ryd07, ryd08, ryd09, ryd10, ryd11, ryd12 + // , rysly, rynxt, ryrmk); + + // ListView1.DataBind(); + //} + } + + protected bool CheckProjectRight() + { + // 檢查此使用者是否有權限處理這個專案 + BprmDAC bprm = new BprmDAC(Query); + if (!bprm.GetRight(ddl專案.SelectedValue, UserId)) + { + //MultiView1.Visible = false; + cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + cvMessage.IsValid = false; + return false; + } + return true; + } + + public static string GetSaveCommand(string bpeno, object p) + { + return string.Format("Save('{0}'); return false;" + , bpeno); + } + + protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e) + { + Button btnSave = e.Item.FindControl("btnSave") as Button; + Button btnFinal = e.Item.FindControl("btnFinal") as Button; + + HiddenField RYYER = e.Item.FindControl("RYYER") as HiddenField; + Label RYENO = e.Item.FindControl("RYENO") as Label; + Label RYVLD = e.Item.FindControl("RYVLD") as Label; + Label RYUST = e.Item.FindControl("RYUST") as Label; + Label RYLFT = e.Item.FindControl("RYLFT") as Label; + Label RYPLF = e.Item.FindControl("RYPLF") as Label; + TextBox RYYST_H = e.Item.FindControl("RYYST_H") as TextBox; + TextBox RYYST_M = e.Item.FindControl("RYYST_M") as TextBox; + TextBox RYH01 = e.Item.FindControl("RYH01") as TextBox; + TextBox RYD01 = e.Item.FindControl("RYD01") as TextBox; + TextBox RYH02 = e.Item.FindControl("RYH02") as TextBox; + TextBox RYD02 = e.Item.FindControl("RYD02") as TextBox; + TextBox RYH03 = e.Item.FindControl("RYH03") as TextBox; + TextBox RYD03 = e.Item.FindControl("RYD03") as TextBox; + TextBox RYH04 = e.Item.FindControl("RYH04") as TextBox; + TextBox RYD04 = e.Item.FindControl("RYD04") as TextBox; + TextBox RYH05 = e.Item.FindControl("RYH05") as TextBox; + TextBox RYD05 = e.Item.FindControl("RYD05") as TextBox; + TextBox RYH06 = e.Item.FindControl("RYH06") as TextBox; + TextBox RYD06 = e.Item.FindControl("RYD06") as TextBox; + TextBox RYH07 = e.Item.FindControl("RYH07") as TextBox; + TextBox RYD07 = e.Item.FindControl("RYD07") as TextBox; + TextBox RYH08 = e.Item.FindControl("RYH08") as TextBox; + TextBox RYD08 = e.Item.FindControl("RYD08") as TextBox; + TextBox RYH09 = e.Item.FindControl("RYH09") as TextBox; + TextBox RYD09 = e.Item.FindControl("RYD09") as TextBox; + TextBox RYH10 = e.Item.FindControl("RYH10") as TextBox; + TextBox RYD10 = e.Item.FindControl("RYD10") as TextBox; + TextBox RYH11 = e.Item.FindControl("RYH11") as TextBox; + TextBox RYD11 = e.Item.FindControl("RYD11") as TextBox; + TextBox RYH12 = e.Item.FindControl("RYH12") as TextBox; + TextBox RYD12 = e.Item.FindControl("RYD12") as TextBox; + TextBox RYSLY_H = e.Item.FindControl("RYSLY_H") as TextBox; + TextBox RYSLY_M = e.Item.FindControl("RYSLY_M") as TextBox; + TextBox RYNXT_H = e.Item.FindControl("RYNXT_H") as TextBox; + TextBox RYNXT_M = e.Item.FindControl("RYNXT_M") as TextBox; + TextBox RYRMK = e.Item.FindControl("RYRMK") as TextBox; + + List paramList = new List(); + paramList.Add(string.Format("'{0}'", RYYER.Value)); + paramList.Add(string.Format("'{0}'", RYENO.Text)); + paramList.Add(string.Format("'#{0}'", RYVLD.ClientID)); + paramList.Add(string.Format("'#{0}'", RYUST.ClientID)); + paramList.Add(string.Format("'#{0}'", RYLFT.ClientID)); + paramList.Add(string.Format("'#{0}'", RYPLF.ClientID)); + paramList.Add(string.Format("'#{0}'", RYYST_H.ClientID)); + paramList.Add(string.Format("'#{0}'", RYYST_M.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH01.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD01.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH02.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD02.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH03.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD03.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH04.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD04.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH05.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD05.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH06.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD06.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH07.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD07.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH08.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD08.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH09.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD09.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH10.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD10.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH11.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD11.ClientID)); + paramList.Add(string.Format("'#{0}'", RYH12.ClientID)); + paramList.Add(string.Format("'#{0}'", RYD12.ClientID)); + paramList.Add(string.Format("'#{0}'", RYSLY_H.ClientID)); + paramList.Add(string.Format("'#{0}'", RYSLY_M.ClientID)); + paramList.Add(string.Format("'#{0}'", RYNXT_H.ClientID)); + paramList.Add(string.Format("'#{0}'", RYNXT_M.ClientID)); + paramList.Add(string.Format("'#{0}'", RYRMK.ClientID)); + + btnSave.OnClientClick = string.Format("Save({0}); return false;" + , string.Join(",", paramList.ToArray())); + btnFinal.OnClientClick = string.Format("Final({0}); return false;" + , string.Join(",", paramList.ToArray())); + } + +} \ No newline at end of file diff --git a/Web/forms/worker/fmSendSalaryStrip.ascx b/Web/forms/worker/fmSendSalaryStrip.ascx new file mode 100644 index 0000000..299f01a --- /dev/null +++ b/Web/forms/worker/fmSendSalaryStrip.ascx @@ -0,0 +1,605 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmSendSalaryStrip.ascx.cs" Inherits="forms_worker_fmSendSalaryStrip" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + +
+ 年月: + + + +
+
+ + + + + + + + + + + + + + +
+ 年月: +   +
+ 專案: + + + +
+ 次數別: + + 薪資 + 第一次獎金 + 第二次獎金 + 第三次獎金 + 第四次獎金 + 第五次獎金 + +
+ + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + +<%-- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --%> + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + +
+
+ + + diff --git a/Web/forms/worker/fmSendSalaryStrip.ascx.cs b/Web/forms/worker/fmSendSalaryStrip.ascx.cs new file mode 100644 index 0000000..5ab792c --- /dev/null +++ b/Web/forms/worker/fmSendSalaryStrip.ascx.cs @@ -0,0 +1,629 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections.Generic; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using Wellan.Common; +using Wellan.Data; +using System.Data.Common; +using System.IO; +using System.Net.Mail; +using Wellan.Service; + +/// +/// 薪資條發放 +/// +public partial class forms_worker_fmSendSalaryStrip : Wellan.Web.UI.WUserControlBase +{ + private DateTime _SSYMM; + private string _SSPYN; + private string _BonusTimes; + private string _tableName = ""; + private string select = + @"SELECT A.*, + SSP06 + SSP07 + SSP08 + SSP13 + SSP14 OVERWORK, + SSP09 + SSP10 + SSP12 OUTGOING, + SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + SSP13 + SSP14 + SSP15 + SSP99 SSPLUS, + SSS01 + SSS02 + SSS09 LEAVING, + SST01 + SST02 + SST03 + SST21 + SST22 OVERWORKTIME, + (SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + SSP13 + SSP14 + SSP15 + SSP99) + - (SSS01 + SSS02 + SSS03 + SSS04 + SSS05 + SSS06 + SSS07 + SSS08 + SSS09 + SSS10 + SSS11 + SSS12 + SSS13 + SSS14 + SSS15 + SSS99) SSTOTAL, + SSS01 + SSS02 + SSS04 + SSS05 + SSS06 + SSS07 + SSS08 + SSS09 + SSS10 + SSS11 + SSS12 + SSS13 + SSS14 + SSS15 + SSS99 SSMINUS, + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + SSP13 + SSP14 + SSP15 + SSP99 TOTALPLUS, + SSH01 + SSH02 + SSH03 EMPLOYER, + ISNULL(B.BPNME, '') BPNME, + ISNULL(C.BPPYM, '') BPPYM, + ISNULL(B.BPSWY, '') BPSWY, + ISNULL(D.BCNAM, '') BCNAM, + ISNULL(B.BPACC, '') BPACC, + ISNULL(B.BPEML, '') BPEML, + ISNULL(B.BPEM2, '') BPEM2, + (SELECT SUM(SSS06) FROM {0} E WHERE A.SSENO=E.SSENO AND E.SSYMM <= @SSYMM) SSS06SUM, + (SELECT SUM(SSH06) FROM {0} F WHERE A.SSENO=F.SSENO AND F.SSYMM <= @SSYMM) SSH06SUM, + SSC01, SSC03, SSC03, SSC04, SSC05, SSC06, SSC07, SSC08, SSC09, SSC10 + FROM {0} A + LEFT OUTER JOIN BPSNView B ON A.SSENO=B.BPENO + LEFT OUTER JOIN BPAA C ON A.SSPYN=C.BPPYN + LEFT OUTER JOIN BRML D ON B.BPBNK=D.BCNUM"; + private string selectSum = + @"SELECT ISNULL(SUM(SSD01), 0) SSD01, ISNULL(SUM(SSD02), 0) SSD02, ISNULL(SUM(SSSRD), 0) SSSRD, ISNULL(SUM(SSP00), 0) SSP00, + ISNULL(SUM(SSP01), 0) SSP01, ISNULL(SUM(SSP02), 0) SSP02, ISNULL(SUM(SSP03), 0) SSP03, ISNULL(SUM(SSP04), 0) SSP04, + ISNULL(SUM(SSP05), 0) SSP05, ISNULL(SUM(SSP06), 0) SSP06, ISNULL(SUM(SSP07), 0) SSP07, ISNULL(SUM(SSP08), 0) SSP08, + ISNULL(SUM(SSP09), 0) SSP09, ISNULL(SUM(SSP10), 0) SSP10, ISNULL(SUM(SSP11), 0) SSP11, ISNULL(SUM(SSP12), 0) SSP12, + ISNULL(SUM(SSP13), 0) SSP13, ISNULL(SUM(SSP14), 0) SSP14, ISNULL(SUM(SSP15), 0) SSP15, ISNULL(SUM(SSP99), 0) SSP99, + ISNULL(SUM(SSS01), 0) SSS01, ISNULL(SUM(SSS02), 0) SSS02, ISNULL(SUM(SSS03), 0) SSS03, ISNULL(SUM(SSS04), 0) SSS04, + ISNULL(SUM(SSS05), 0) SSS05, ISNULL(SUM(SSS06), 0) SSS06, ISNULL(SUM(SSS07), 0) SSS07, ISNULL(SUM(SSS08), 0) SSS08, + ISNULL(SUM(SSS09), 0) SSS09, ISNULL(SUM(SSS10), 0) SSS10, ISNULL(SUM(SSS11), 0) SSS11, ISNULL(SUM(SSS12), 0) SSS12, + ISNULL(SUM(SSS13), 0) SSS13, ISNULL(SUM(SSS14), 0) SSS14, ISNULL(SUM(SSS15), 0) SSS15, ISNULL(SUM(SSS99), 0) SSS99, + ISNULL(SUM(SSH01), 0) SSH01, ISNULL(SUM(SSH02), 0) SSH02, ISNULL(SUM(SSH03), 0) SSH03, ISNULL(SUM(SSH04), 0) SSH04, + ISNULL(SUM(SSH05), 0) SSH05, ISNULL(SUM(SSH06), 0) SSH06, ISNULL(SUM(SSH07), 0) SSH07, ISNULL(SUM(SSH08), 0) SSH08, + ISNULL(SUM(SSH09), 0) SSH09, ISNULL(SUM(SSH10), 0) SSH10, ISNULL(SUM(SST01), 0) SST01, ISNULL(SUM(SST02), 0) SST02, + ISNULL(SUM(SST03), 0) SST03, ISNULL(SUM(SST04), 0) SST04, ISNULL(SUM(SST05), 0) SST05, ISNULL(SUM(SST06), 0) SST06, + ISNULL(SUM(SST07), 0) SST07, ISNULL(SUM(SST08), 0) SST08, ISNULL(SUM(SST09), 0) SST09, ISNULL(SUM(SST10), 0) SST10, + ISNULL(SUM(SST11), 0) SST11, ISNULL(SUM(SST12), 0) SST12, ISNULL(SUM(SST13), 0) SST13, ISNULL(SUM(SST14), 0) SST14, + ISNULL(SUM(SST15), 0) SST15, ISNULL(SUM(SST16), 0) SST16, ISNULL(SUM(SST17), 0) SST17, ISNULL(SUM(SST18), 0) SST18, + ISNULL(SUM(SST19), 0) SST19, ISNULL(SUM(SST20), 0) SST20, ISNULL(SUM(SST21), 0) SST21, ISNULL(SUM(SST22), 0) SST22, + ISNULL(SUM(SST23), 0) SST23, ISNULL(SUM(SST24), 0) SST24, ISNULL(SUM(SST25), 0) SST25, ISNULL(SUM(SSL01), 0) SSL01, + ISNULL(SUM(SSL02), 0) SSL02, ISNULL(SUM(SSL03), 0) SSL03, ISNULL(SUM(SSL04), 0) SSL04, ISNULL(SUM(SSL05), 0) SSL05, + ISNULL(SUM(SSP06 + SSP07 + SSP08 + SSP13 + SSP14), 0) OVERWORK, + ISNULL(SUM(SSP09 + SSP10 + SSP12), 0) OUTGOING, + ISNULL(SUM(SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + + SSP13 + SSP14 + SSP15 + SSP99), 0) SSPLUS, + ISNULL(SUM(SSS01 + SSS02 + SSS09), 0) LEAVING, + ISNULL(SUM(SST01 + SST02 + SST03 + SST21 + SST22), 0) OVERWORKTIME, + ISNULL(SUM((SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + + SSP13 + SSP14 + SSP15 + SSP99) + - (SSS01 + SSS02 + SSS03 + SSS04 + SSS05 + SSS06 + SSS07 + SSS08 + SSS09 + SSS10 + SSS11 + SSS12 + SSS13 + + SSS14 + SSS15 + SSS99)), 0) SSTOTAL, + ISNULL(SUM(SSS01 + SSS02 + SSS04 + SSS05 + SSS06 + SSS07 + SSS08 + SSS09 + SSS10 + SSS11 + SSS12 + SSS13 + SSS14 + + SSS15 + SSS99), 0) SSMINUS, + ISNULL(SUM(SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + SSP13 + + SSP14 + SSP15 + SSP99), 0) TOTALPLUS, + ISNULL(SUM(SSH01 + SSH02 + SSH03), 0) EMPLOYER + FROM {0} A WHERE SSYMM=@SSYMM AND SSPYN=@SSPYN"; + + protected void Page_Load(object sender, EventArgs e) + { + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + _SSYMM = GetDateTimeParam("YYMM"); + _SSPYN = GetStringParam("SSPYN"); + _BonusTimes = GetStringParam("BonusTimes"); + _tableName = GetStringParam("TABLE"); + + if (_BonusTimes == "") + _BonusTimes = "0"; + + dsSSMS.ConnectionString = ConnectionString; + dsSSMSSum.ConnectionString = ConnectionString; + dsSSMS.SelectCommand = String.Format(select, _tableName) + " WHERE SSYMM=@SSYMM AND SSPYN=@SSPYN ORDER BY SSENO "; + dsSSMSSum.SelectCommand = String.Format(selectSum, _tableName); + + if (ForwardSource != "") + { + MultiView1.ActiveViewIndex = 1; + } + + ddlSSPYN.DataSource = new BpaaDAC().GetBpaaWithTY(_SSYMM.Year); + ddlSSPYN.DataBind(); + + gvSSMS.Visible = false; + gvSSMSBonus.Visible = false; + + if (_SSPYN != "" && ddlSSPYN.Items.FindByValue(_SSPYN) != null) + { + ddlSSPYN.SelectedValue = _SSPYN; + } + + if (_BonusTimes != "" && ddlBonusTimes.Items.FindByValue(_BonusTimes) != null) + { + ddlBonusTimes.SelectedValue = _BonusTimes; + } + + if (_SSYMM.Ticks != 0) + { + lbYYMM.Text = _SSYMM.ToString("yyyyMM"); + + if (ddlSSPYN.SelectedValue.ToString() != "") + { + int i; + string s; + if (int.TryParse(_BonusTimes, out i)) + _SSYMM = _SSYMM.AddDays(i); + s = _SSYMM.ToString(WGuard1.InvariantCulture); + + dsSSMS.SelectParameters.Add("SSYMM", s); + dsSSMS.SelectParameters.Add("SSPYN", ddlSSPYN.SelectedValue); + dsSSMSSum.SelectParameters.Add("SSYMM", s); + dsSSMSSum.SelectParameters.Add("SSPYN", ddlSSPYN.SelectedValue); + + if (_BonusTimes == "0") + { + gvSSMS.Visible = true; + // gvSSMSSum.Visible = false; + gvSSMSBonus.Visible = false; + + gvSSMS.DataBind(); + // gvSSMSSum.DataBind(); + } + else + { + gvSSMS.Visible = false; + // gvSSMSSum.Visible = false; + gvSSMSBonus.Visible = true; + + gvSSMSBonus.DataBind(); + } + } + } + + SetClientFocus(txtYYMM); + + RegisterStartupScript("START", "if (typeof CheckChecked != \"undefined\") CheckChecked();"); + + switch (_tableName) + { + case "SSMS_VIEW": + gvSSMS.Columns[26].Visible = false; + gvSSMS.Columns[27].Visible = false; + //gvSSMSSum.Columns[26].Visible = false; + //gvSSMSSum.Columns[27].Visible = false; + gvSSMSBonus.Columns[7].Visible = false; + gvSSMSBonus.Columns[8].Visible = false; + break; + + case "SSMB": + lbCaption.TextMessageId = "FMSSHISTORY.NAME"; + btnSend.Visible = false; + btnCheckAll.Visible = false; + btnCheckNone.Visible = false; + lbNotice.Visible = false; + gvSSMS.Columns[0].Visible = false; + //gvSSMSSum.Columns[0].Visible = false; + gvSSMSBonus.Columns[0].Visible = false; + break; + } + } + + protected void btnSend_Click(object sender, EventArgs e) + { + // 取得要發送的員工編號 + List SSENOs = new List(); + GridView gv; + if (_BonusTimes == "0") + { + gv = gvSSMS; + } + else + { + gv = gvSSMSBonus; + } + + foreach (GridViewRow gvrow in gv.Rows) + { + if ((gvrow.Cells[0].FindControl("cbSelect") as CheckBox).Checked) + { + SSENOs.Add((gvrow.Cells[1].Controls[1] as ITextControl).Text); + } + } + + if (SSENOs.Count == 0) + { + ClientShowMessage("沒有選擇需發送的資料"); + return; + } + + // 取得此專案是否設定電話費科目對應 + bool wantTeleFee = false; + GetData gd = new GetData(); + gd.Query = Query; + DataTable bpaa = gd.GetBPAA_BPPYN(ddlSSPYN.SelectedValue); + if (bpaa.Rows.Count > 0) + { + BPAARecord bpaaRec = new BPAARecord(); + bpaaRec.FillRecord(bpaa.Rows[0]); + wantTeleFee = bpaaRec.BPS09 != ""; + } + + DbConnection conn = Query.NewConnection(); + conn.ConnectionString = ConnectionString; + + // int i = 0; + // int.TryParse(_BonusTimes, out i); + // DateTime aYymm = _SSYMM.AddDays(i); + DateTime aYymm = _SSYMM; + + // 準備取資料的 SQL + DbCommand cmdGetSSMS = Query.NewCommand(String.Format(select, "SSMS_VIEW") + " WHERE SSYMM=@SSYMM AND SSPYN=@SSPYN AND SSENO=@SSENO"); + cmdGetSSMS.Parameters.Add(Query.NewParameter("SSYMM", aYymm)); + cmdGetSSMS.Parameters.Add(Query.NewParameter("SSPYN", ddlSSPYN.SelectedValue)); + cmdGetSSMS.Parameters.Add(Query.NewParameter("SSENO", DbType.String)); + cmdGetSSMS.Connection = conn; + + // 準備刪除薪資條備份資料的 SQL + DbCommand cmdDeleteSSMB = Query.NewCommand("DELETE FROM SSMB WHERE SSYMM=@SSYMM AND SSPYN=@SSPYN AND SSENO=@SSENO"); + cmdDeleteSSMB.Parameters.Add(Query.NewParameter("SSYMM", aYymm)); + cmdDeleteSSMB.Parameters.Add(Query.NewParameter("SSPYN", ddlSSPYN.SelectedValue)); + cmdDeleteSSMB.Parameters.Add(Query.NewParameter("SSENO", DbType.String)); + cmdDeleteSSMB.Connection = conn; + + // 準備新增薪資條備份資料的 SQL + DbCommand cmdInsertSSMB = Query.NewCommand( + @"INSERT INTO SSMB + (SSYMM, SSENO, SSNUM, SSPYN, SSJNO, SSCNO, SSBRH, SSD01, SSD02, SSSRD, SSP00, + SSP01, SSP02, SSP03, SSP04, SSP05, SSP06, SSP07, SSP08, SSP09, SSP10, SSP11, + SSP12, SSP13, SSP14, SSP15, SSP99, SSS01, SSS02, SSS03, SSS04, SSS05, SSS06, + SSS07, SSS08, SSS09, SSS10, SSS11, SSS12, SSS13, SSS14, SSS15, SSS99, SSH01, + SSH02, SSH03, SSH04, SSH05, SSH06, SSH07, SSH08, SSH09, SSH10, SST01, SST02, + SST03, SST04, SST05, SST06, SST07, SST08, SST09, SST10, SST11, SST12, SST13, + SST14, SST15, SST16, SST17, SST18, SST19, SST20, SST21, SST22, SST23, SST24, + SST25, SSL01, SSL02, SSL03, SSL04, SSL05, SSC01, SSC02, SSC03, SSC04, SSC05, + SSC06, SSC07, SSC08, SSC09, SSC10, + TRDAT, TRMOD, TRUSR) + SELECT + SSYMM, SSENO, SSNUM, SSPYN, SSJNO, SSCNO, SSBRH, SSD01, SSD02, SSSRD, SSP00, + SSP01, SSP02, SSP03, SSP04, SSP05, SSP06, SSP07, SSP08, SSP09, SSP10, SSP11, + SSP12, SSP13, SSP14, SSP15, SSP99, SSS01, SSS02, SSS03, SSS04, SSS05, SSS06, + SSS07, SSS08, SSS09, SSS10, SSS11, SSS12, SSS13, SSS14, SSS15, SSS99, SSH01, + SSH02, SSH03, SSH04, SSH05, SSH06, SSH07, SSH08, SSH09, SSH10, SST01, SST02, + SST03, SST04, SST05, SST06, SST07, SST08, SST09, SST10, SST11, SST12, SST13, + SST14, SST15, SST16, SST17, SST18, SST19, SST20, SST21, SST22, SST23, SST24, + SST25, SSL01, SSL02, SSL03, SSL04, SSL05, SSC01, SSC02, SSC03, SSC04, SSC05, + SSC06, SSC07, SSC08, SSC09, SSC10, + GETDATE() AS TRDAT, TRMOD, @TRUSR AS TRUSR + FROM SSMS_VIEW WHERE SSYMM=@SSYMM AND SSPYN=@SSPYN AND SSENO=@SSENO"); + cmdInsertSSMB.Parameters.Add(Query.NewParameter("TRUSR", UserId)); + cmdInsertSSMB.Parameters.Add(Query.NewParameter("SSYMM", aYymm)); + cmdInsertSSMB.Parameters.Add(Query.NewParameter("SSPYN", ddlSSPYN.SelectedValue)); + cmdInsertSSMB.Parameters.Add(Query.NewParameter("SSENO", DbType.String)); + cmdInsertSSMB.Connection = conn; + + // 準備所需的物件 + SalaryStrip ss = new SalaryStrip(); // 薪資單產生物件 + // SmtpClient sc = new SmtpClient(); // 郵件用戶端物件 + BpsnDAC bpsnDao = new BpsnDAC(); + + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + + foreach (string sseno in SSENOs) + { + // 取得資料、產生薪資條、發送 + cmdGetSSMS.Parameters["SSENO"].Value = sseno; + DataTable ssmsData = Query.Select(conn, cmdGetSSMS); + if (ssmsData.Rows.Count > 0) + { + DataRow ssmsRecord = ssmsData.Rows[0]; + string bpeml = ssmsRecord["BPEML"].ToString(); + string bpem2 = ssmsRecord["BPEM2"].ToString(); + + if (bpem2 != "") + bpeml = bpem2; + + if (bpeml == "") + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage += string.Format("員工編號:{0} 發送失敗,錯誤訊息:沒有輸入電子郵件\n", sseno); + continue; + } + + if (!WGuard1.CheckEmail(bpeml)) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage += string.Format("員工編號:{0} 發送失敗,錯誤訊息:電子郵件 \"{1}\" 格式錯誤\n", sseno, bpeml); + continue; + } + + string mailSubject; + ss.Clear(); + + if (ddlSSPYN.SelectedValue == "103JYB00001") + { + ss.公司名稱 = CompanyDAC.GetCompanyName("JY"); + } + else if (ddlSSPYN.SelectedValue == "103TYB00001") + { + ss.公司名稱 = CompanyDAC.GetCompanyName("TY"); + } + else + { + List companyNames = bpsnDao.GetCompanyByDate(sseno, aYymm); + ss.公司名稱 = companyNames[1]; + } + + #region 一般薪資條 + if (_BonusTimes == "0") + { + ss.薪資條樣板 = 0; + ss.列印公司提繳 = true; + ss.列印津貼合計 = true; + ss.列印課稅金額 = true; + ss.列印應發金額 = true; + ss.列印員工累計 = true; + ss.列印扣款合計 = true; + ss.列印所得稅 = true; + ss.列印實發金額 = true; + ss.列印公司累計 = true; + ss.列印帳號 = true; + + ss.AddPlus("底(本)薪", Convert.ToInt32(ssmsRecord["SSP00"])); + ss.AddPlus("全勤獎金", Convert.ToInt32(ssmsRecord["SSP01"])); + ss.AddPlus("加班費", Convert.ToInt32(ssmsRecord["OVERWORK"])); + ss.AddPlus("外勤工作費", Convert.ToInt32(ssmsRecord["OUTGOING"])); + if (wantTeleFee) + ss.AddPlus("電話費", Convert.ToInt32(ssmsRecord["SSP11"])); + ss.AddPlus("伙食費", Convert.ToInt32(ssmsRecord["SSP02"])); + ss.AddPlus("其他加項", Convert.ToInt32(ssmsRecord["SSP99"])); + ss.AddPlus("職務加給", Convert.ToInt32(ssmsRecord["SSP03"])); + ss.AddPlus("其他津貼", Convert.ToInt32(ssmsRecord["SSP05"])); + + ss.AddMinus("請假扣款", Convert.ToInt32(ssmsRecord["LEAVING"])); + ss.AddMinus("健保費", Convert.ToInt32(ssmsRecord["SSS05"])); + ss.AddMinus("勞保費", Convert.ToInt32(ssmsRecord["SSS04"])); + ss.AddMinus("福利金", Convert.ToInt32(ssmsRecord["SSS07"])); + ss.AddMinus("員工提繳", Convert.ToInt32(ssmsRecord["SSS06"])); + ss.AddMinus("其他減項", Convert.ToInt32(ssmsRecord["SSS99"])); + + ss.AddPresent("出勤天數", ssmsRecord["SSD01"].ToString()); + ss.AddPresent("勞保天數", ssmsRecord["SSD02"].ToString()); + ss.AddPresent("加班時數", ssmsRecord["OVERWORKTIME"].ToString()); + + ss.員工代號 = sseno; + ss.姓名 = ssmsRecord["BPNME"].ToString(); + ss.部門 = ssmsRecord["SSPYN"].ToString() + "\n" + ssmsRecord["BPPYM"].ToString(); + ss.職務 = ""; + ss.發薪年月 = _SSYMM.ToString("yyyy年MM月"); + + ss.公司累計 = Convert.ToInt32(ssmsRecord["SSH06SUM"]); + ss.公司提繳 = Convert.ToInt32(ssmsRecord["SSH06"]); + ss.扣款合計 = Convert.ToInt32(ssmsRecord["SSMINUS"]); + ss.所得稅 = Convert.ToInt32(ssmsRecord["SSS03"]); + ss.津貼合計 = Convert.ToInt32(ssmsRecord["TOTALPLUS"]); + ss.員工累計 = Convert.ToInt32(ssmsRecord["SSS06SUM"]); + ss.帳號 = String.Format("{0:c} {1:c}", ssmsRecord["BCNAM"], ssmsRecord["BPACC"]); + ss.實發金額 = Convert.ToInt32(ssmsRecord["SSTOTAL"]); + ss.課稅金額 = Convert.ToInt32(ssmsRecord["SSP00"]) - Convert.ToInt32(ssmsRecord["SSS06"]); + ss.應發金額 = Convert.ToInt32(ssmsRecord["SSPLUS"]); + ss.薪資別 = "月薪"; + + mailSubject = String.Format("{0:c} {1:yyyy} 年 {1:MM} 月薪資單", ssmsRecord["BPNME"], _SSYMM); + } + #endregion + + #region 獎金薪資條 + else + { + ss.薪資條樣板 = 1; + ss.列印公司提繳 = false; + ss.列印津貼合計 = true; + ss.列印課稅金額 = true; + ss.列印應發金額 = true; + ss.列印員工累計 = false; + ss.列印扣款合計 = true; + ss.列印所得稅 = true; + ss.列印實發金額 = true; + ss.列印公司累計 = false; + ss.列印帳號 = true; + + ss.AddPlus("獎金", Convert.ToInt32(ssmsRecord["SSP13"])); + + ss.AddMinus("所得稅", Convert.ToInt32(ssmsRecord["SSS03"])); + + ss.AddPresent("稅率" + GetSSC07(ssmsRecord["SSC07"], 0), ""); + ss.AddPresent(GetSSC07(ssmsRecord["SSC07"], 1), ""); + + ss.員工代號 = sseno; + ss.姓名 = ssmsRecord["BPNME"].ToString(); + ss.部門 = ssmsRecord["SSPYN"].ToString() + "\n" + ssmsRecord["BPPYM"].ToString(); + ss.職務 = ""; + ss.發薪年月 = _SSYMM.ToString("yyyy年MM月"); + + ss.公司累計 = Convert.ToInt32(ssmsRecord["SSH06SUM"]); + ss.公司提繳 = Convert.ToInt32(ssmsRecord["SSH06"]); + ss.扣款合計 = Convert.ToInt32(ssmsRecord["SSMINUS"]); + ss.所得稅 = Convert.ToInt32(ssmsRecord["SSS03"]); + ss.津貼合計 = Convert.ToInt32(ssmsRecord["TOTALPLUS"]); + ss.員工累計 = Convert.ToInt32(ssmsRecord["SSS06SUM"]); + ss.帳號 = String.Format("{0:c} {1:c}", ssmsRecord["BCNAM"], ssmsRecord["BPACC"]); + ss.實發金額 = Convert.ToInt32(ssmsRecord["SSTOTAL"]); + ss.課稅金額 = Convert.ToInt32(ssmsRecord["SSP00"]); + ss.應發金額 = Convert.ToInt32(ssmsRecord["SSPLUS"]); + ss.薪資別 = "月薪"; + + mailSubject = String.Format("{0:c} 薪資單", GetSSC07(ssmsRecord["SSC07"], 1)); + } + #endregion + + // 發送郵件 + try + { + MemoryStream ms = new MemoryStream(ss.Draw(RootPath).ToArray(), false); + MailMessage mm = new MailMessage(); + + mm.Subject = mailSubject; + mm.To.Add(new MailAddress(bpeml)); + + // 使用 LinkResource 方式附加薪資單圖檔 + /* + AlternateView htmlView = AlternateView.CreateAlternateViewFromString("", null, "text/html"); + LinkedResource salaryslip = new LinkedResource(ms); + salaryslip.ContentId = "salaryslip"; + htmlView.LinkedResources.Add(salaryslip); + mm.AlternateViews.Add(htmlView); + */ + + // 使用附件方式附加薪資單圖檔 + mm.Attachments.Add(new Attachment(ms, String.Format("{0:yyyyMM}.gif", _SSYMM), "image/gif")); + + WMailSender.GetInstance().Send(mm, string.Format("員工編號:{0:c} 專案:{1:c} 年月:{2:yyyyMM}", sseno, ssmsRecord["BPPYM"].ToString(), _SSYMM)); + } + catch (Exception ex) + { + cvMessage.IsValid = false; + cvMessage.ErrorMessage += string.Format("員工編號:{0:c} 發送失敗,錯誤訊息:{1:c}\n", sseno, ex.Message); + //WGuard1.WLogFile(Server.MapPath("~/LOG/MailFail_"), WGuard1.WLogType.Day, + // string.Format("員工編號:{0:c} 專案:{1:c} 年月:{2:yyyyMM} 錯誤訊息:{3:c}", sseno, ssmsRecord["BPPYM"].ToString(), _SSYMM, ex.Message)); + } + } + + // 刪除薪資條備份資料 + cmdDeleteSSMB.Parameters["SSENO"].Value = sseno; + Query.ExecuteNonQuery(conn, cmdDeleteSSMB); + + // 新增薪資條備份資料 + cmdInsertSSMB.Parameters["SSENO"].Value = sseno; + Query.ExecuteNonQuery(conn, cmdInsertSSMB); + } + + if (conn.State == ConnectionState.Open) + conn.Close(); + + if (cvMessage.IsValid) + ClientShowMessage("薪資單發送完畢"); + else + ClientShowMessage("薪資單發送時部份發生錯誤,無錯誤的已發送,有錯誤的請修正錯誤後重發"); + } + + protected int GetPlus(params object[] items) + { + int sum = 0; + for (int i = 0; i < items.Length; i++) + { + sum += items[i] != null && items[i] != DBNull.Value ? Convert.ToInt32(items[i]) : 0; + } + + return sum; + } + + protected void btnSSMS_Click(object sender, EventArgs e) + { + cvMessage.IsValid = true; + cvMessage.ErrorMessage = ""; + bool result = true; + DateTime aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); + + if (result) + { + ParamList["YYMM"] = aYYMM; + DoAfterCommand("SENDSS"); + } + } + + protected void btnSSPYN_Click(object sender, EventArgs e) + { + // 檢查此使用者是否有權限處理這個專案 + // 因為此功能只有財務人員可以使用,所以不需檢查專案權限 + //BprmDAC bprm = new BprmDAC(Query); + //if (!bprm.GetRight(ddlSSPYN.SelectedValue, UserId)) + //{ + // cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; + // cvMessage.IsValid = false; + // return; + //} + + ParamList["SSPYN"] = ddlSSPYN.SelectedValue; + ParamList["BonusTimes"] = ddlBonusTimes.SelectedValue == "" ? "0" : ddlBonusTimes.SelectedValue; + + DoAfterCommand("SENDSS"); + } + + protected void cbSelect_DataBinding(object sender, EventArgs e) + { + Page.ClientScript.RegisterArrayDeclaration("CHECKBOXIDS", "\"" + (sender as Control).ClientID + "\""); + (sender as WebControl).Attributes.Add("onclick", "CheckChecked()"); + } + + protected void btnInputSSYMM_Click(object sender, EventArgs e) + { + ParamList["SSPYN"] = ""; + ParamList["YYMM"] = new DateTime(); + MultiView1.ActiveViewIndex = 0; + } + + protected void gvSSMS_DataBound(object sender, EventArgs e) + { + // gvSSMSSum.Visible = gvSSMS.Rows.Count > 0; + } + + protected string GetSSC07(object ssc07, int index) + { + if (ssc07 == DBNull.Value) + return ""; + + string[] s = ssc07.ToString().Split('|'); + + if (index == 0) + { + double d; + if (double.TryParse(s[0], out d)) + return String.Format("{0:P}", d); + else + return ""; + } + else if (index < s.Length) + { + return s[index]; + } + else + return ""; + } + + protected void gvSSMS_RowDataBound(object sender, GridViewRowEventArgs e) + { + //GridView_RowDataBound_Shrink_ViewState(sender, e); + + if (e.Row.RowType == DataControlRowType.Footer) + { + var param = new DataSourceSelectArguments(); + var a = dsSSMSSum.Select(param) as DataView; + + e.Row.Cells[1].Text = "合計"; + e.Row.Cells[1].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[2].Text = string.Format("{0:###,###,##0}", a[0]["SSP00"]); // 本薪 + e.Row.Cells[2].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[3].Text = string.Format("{0:###,###,##0}", a[0]["SSP01"]); // 全勤獎金 + e.Row.Cells[3].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[4].Text = string.Format("{0:###,###,##0}", a[0]["OVERWORK"]); + e.Row.Cells[4].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[5].Text = string.Format("{0:###,###,##0}", a[0]["OUTGOING"]); + e.Row.Cells[5].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[6].Text = string.Format("{0:###,###,##0}", a[0]["SSP11"]); + e.Row.Cells[6].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[7].Text = string.Format("{0:###,###,##0}", a[0]["SSP02"]); + e.Row.Cells[7].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[8].Text = string.Format("{0:###,###,##0}", a[0]["SSP99"]); + e.Row.Cells[8].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[9].Text = string.Format("{0:###,###,##0}", a[0]["SSP03"]); + e.Row.Cells[9].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[10].Text = string.Format("{0:###,###,##0}", a[0]["SSP05"]); + e.Row.Cells[10].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[12].Text = string.Format("{0:###,###,##0}", a[0]["SSPLUS"]); + e.Row.Cells[12].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[13].Text = string.Format("{0:###,###,##0}", a[0]["LEAVING"]); + e.Row.Cells[13].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[14].Text = string.Format("{0:###,###,##0}", a[0]["SSS05"]); + e.Row.Cells[14].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[15].Text = string.Format("{0:###,###,##0}", a[0]["SSS04"]); + e.Row.Cells[15].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[16].Text = string.Format("{0:###,###,##0}", a[0]["SSS07"]); + e.Row.Cells[16].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[17].Text = string.Format("{0:###,###,##0}", a[0]["SSS06"]); + e.Row.Cells[17].HorizontalAlign = HorizontalAlign.Center; + e.Row.Cells[18].Text = string.Format("{0:###,###,##0}", a[0]["SSS99"]); + e.Row.Cells[18].HorizontalAlign = HorizontalAlign.Center; + } + } + + protected void gvSSMSBonus_RowDataBound(object sender, GridViewRowEventArgs e) + { + //GridView_RowDataBound_Shrink_ViewState(sender, e); + } +} diff --git a/Web/forms/worker/fmSsms.ascx b/Web/forms/worker/fmSsms.ascx new file mode 100644 index 0000000..cd7ecc0 --- /dev/null +++ b/Web/forms/worker/fmSsms.ascx @@ -0,0 +1,681 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="fmSsms.ascx.cs" Inherits="forms_worker_fmSsms" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + +
+ 薪資月份: + + +
+ 人員編號: + + + + + +
+ + + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 薪資月份: + + 人員編號: + + + + 時薪: +
+ 專案年度編號: + + + 職稱: + + 等級: +
+ 站別: + + 到職天數: + + 勞保到職天數: +
+ 本薪: + + 全勤獎金: + + 伙食津貼: + + 職務加給: +
+ 派駐津貼: + + 其他津貼: + + 前二加班費: + + 後二加班費: +
+ 假日加班費: + + 長差: + + 短差: + + 電話費: +
+ 油料費公里數: + + 油料費: + + 其他加項: +
+ 病假扣款: + + 事假扣款: + + 所得稅: + + 勞保費: +
+ 健保費: + + 勞退自提: + + 其他減項: +
+
+ + + + + +
+ + 無資料 + +
+
+
+ + + diff --git a/Web/forms/worker/fmSsms.ascx.cs b/Web/forms/worker/fmSsms.ascx.cs new file mode 100644 index 0000000..5307454 --- /dev/null +++ b/Web/forms/worker/fmSsms.ascx.cs @@ -0,0 +1,100 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Text; +using Wellan.Common; + +/// +/// 薪資查詢及調整(未開放) +/// +public partial class forms_worker_fmSsms : Wellan.Web.UI.WUserControlBase +{ + private string _SSENO; + private string _SSYMM; + private string select = "SELECT * "; + private string from = " FROM SSMS "; + private string where = " WHERE 1=1 "; + private string order = ""; + + protected void Page_Load(object sender, EventArgs e) + { + _SSENO = ViewState["SSENO"] != null ? ViewState["SSENO"].ToString() : ""; + _SSYMM = ViewState["SSYMM"] != null ? ViewState["SSYMM"].ToString() : ""; + } + + protected override void OnInit(EventArgs e) + { + base.OnInit(e); + dsSSMS.ConnectionString = ConnectionString; + + MWEB unmweb = new MWEB(); + if (!unmweb.CheckRight("FMSSMS", Wellan.Data.WRightName.Search)) + { + txtSSMS_SSENO.Enabled = false; + btnSSMS_SSENO_WQRY.Enabled = false; + txtSSMS_SSENO.Text = UserId; + lbSSMS_SSENOX.Text = GetLookup("BPSN", UserId, "BPNME"); + } + else + { + RegisterLookupEvent(this, "btnSSMS_SSENO_WQRY", "txtSSMS_SSENO", "txtSSMS_SSENO,lbSSMS_SSENOX", "BPSN"); + } + + //dsSMSS.SelectParameters["SSYMM"].DefaultValue = "97/01/01"; + //dsSMSS.SelectParameters["SSENO"].DefaultValue = "00001"; + //SMSSForm.DataBind(); + + Search(); + } + + // 查詢確定按鈕 + protected void btnSearch_Click(object sender, EventArgs e) + { + ViewState["SSENO"] = txtSSMS_SSENO.Text; + ViewState["SSYMM"] = txtSSMS_SSYMM.Text; + + _SSENO = txtSSMS_SSENO.Text; + _SSYMM = txtSSMS_SSYMM.Text; + + if (_SSENO.Length == 0 && + _SSYMM.Length == 0) + { + cvMessage.ErrorMessage = GetString("NOSRHCOND"); + cvMessage.IsValid = false; + } + else + { + MultiView1.ActiveViewIndex = 1; + Search(); + SSMSForm.DataBind(); + } + } + + // 查詢取消按鈕 + protected void btnCancel_Click(object sender, EventArgs e) + { + // + } + + private new void Search() + { + StringBuilder sql = new StringBuilder(); + sql.Append(select); + sql.Append(from); + sql.Append(where); + dsSSMS.SelectParameters.Clear(); + DateTime ssymm; + CheckDate(_SSYMM + "01", out ssymm); + AddSearch(sql, dsSSMS, "SSENO", _SSENO, "", false); + AddSearch(sql, dsSSMS, "SSYMM", ssymm.ToString(System.Globalization.CultureInfo.InvariantCulture), "", false); + sql.Append(order); + dsSSMS.SelectCommand = sql.ToString(); + } +} diff --git a/Web/forms/worker/ucBonusInput.ascx b/Web/forms/worker/ucBonusInput.ascx new file mode 100644 index 0000000..e9e8552 --- /dev/null +++ b/Web/forms/worker/ucBonusInput.ascx @@ -0,0 +1,75 @@ +<%@ Control Language="C#" AutoEventWireup="true" + CodeFile="ucBonusInput.ascx.cs" Inherits="forms_worker_ucBonusInput" %> +<%@ Register Assembly="WNET" Namespace="Wellan.Web.UI" + TagPrefix="cc1" %> + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + +
人員編號人員姓名金額稅額實發備註
+
+
diff --git a/Web/forms/worker/ucBonusInput.ascx.cs b/Web/forms/worker/ucBonusInput.ascx.cs new file mode 100644 index 0000000..f3c7840 --- /dev/null +++ b/Web/forms/worker/ucBonusInput.ascx.cs @@ -0,0 +1,328 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using Wellan.Data; +using System.ComponentModel; +using Wellan.Common; + +/// +/// 獎金輸入用控制項 +/// +public partial class forms_worker_ucBonusInput : Wellan.Web.UI.WUserControlBase +{ + private bool _isHeader = true; + private DbCommand cmdReadRasn; + + protected void Page_Load(object sender, EventArgs e) + { + } + + public bool IsHeader + { + get + { + return _isHeader; + } + set + { + _isHeader = value; + if (_isHeader) + MultiView1.ActiveViewIndex = 1; + else + MultiView1.ActiveViewIndex = 0; + } + } + + /// + /// 員工編號 + /// + [Bindable(BindableSupport.Yes, BindingDirection.TwoWay)] + public string Sseno + { + get + { + return lbSSENO.Text; + } + set + { + lbSSENO.Text = value; + } + } + + /// + /// 員工姓名 + /// + [Bindable(BindableSupport.Yes, BindingDirection.TwoWay)] + public string SsenoName + { + get + { + return lbSSENOX.Text; + } + set + { + lbSSENOX.Text = value; + } + } + + /// + /// 獎金年月 + /// + [Bindable(BindableSupport.Yes, BindingDirection.TwoWay)] + public string Yymm + { + get + { + return hfYymm.Value; + } + set + { + hfYymm.Value = value; + } + } + + /// + /// 年度專案編號 + /// + [Bindable(BindableSupport.Yes, BindingDirection.TwoWay)] + public string Sspyn + { + get + { + return hfSspyn.Value; + } + set + { + hfSspyn.Value = value; + } + } + + /// + /// 稅率 + /// + [Bindable(BindableSupport.Yes, BindingDirection.TwoWay)] + public string TaxRate + { + get + { + return hfTaxRate.Value; + } + set + { + hfTaxRate.Value = value; + } + } + + /// + /// 獎金次數 + /// + [Bindable(BindableSupport.Yes, BindingDirection.TwoWay)] + public string BonusTimes + { + get + { + return hfBonusTimes.Value; + } + set + { + hfBonusTimes.Value = value; + } + } + + /// + /// 備註 + /// + [Bindable(BindableSupport.Yes, BindingDirection.TwoWay)] + public string Memo + { + get + { + return txtSSC07.Text; + } + set + { + txtSSC07.Text = value; + } + } + + private DateTime YyMm + { + get + { + return Convert.ToDateTime(hfYymm.Value).AddDays(Convert.ToInt32(hfBonusTimes.Value)); + } + } + + public void Read(WQuery query) + { + this.Query = query; + SsmsDAC ssmsDao = new SsmsDAC(Query); + SsmsRecord ssmsRec = ssmsDao.SelectOne(null, YyMm, lbSSENO.Text, hfSspyn.Value, "001"); + + if (ssmsRec != null) + { + txtSSP13.Text = ssmsRec.SSP13.ToString("#########0"); + lbSSS03.Text = ssmsRec.SSS03.ToString("#########0"); + lbSSTOT.Text = (ssmsRec.SSP13 - ssmsRec.SSS03).ToString("#########0"); + string[] values = ssmsRec.SSC07.Split('|'); + if (values.Length > 1) + txtSSC07.Text = values[1]; + else + txtSSC07.Text = ""; + hfOldSSP13.Value = ssmsRec.SSP13.ToString("#########0"); + } + else + { + txtSSP13.Text = ""; + lbSSS03.Text = ""; + lbSSTOT.Text = ""; + txtSSC07.Text = ""; + hfOldSSP13.Value = ""; + } + } + + protected void GetRasnData(DbTransaction tran, string sseno, out string ssjno, out string sscno, out string ssbrh) + { + if (cmdReadRasn == null) + { + cmdReadRasn = Query.NewCommand( + @"SELECT A.RANUM, A.RAJNO, A.RACNO, A.RABRH + FROM RASN A + INNER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO + WHERE A.RAPYN = @BPPYN AND A.RANUM=@RANUM + AND ((A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM2) + OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL) + OR (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM2) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT IS NULL) + OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2)) + ORDER BY A.RANUM"); + cmdReadRasn.Parameters.Add(Query.NewParameter("BPPYN", hfSspyn.Value)); + cmdReadRasn.Parameters.Add(Query.NewParameter("RANUM", DbType.String)); + cmdReadRasn.Parameters.Add(Query.NewParameter("YYMM1", WGuard1.GetMonthBegin(Convert.ToDateTime(hfYymm.Value), 0))); + cmdReadRasn.Parameters.Add(Query.NewParameter("YYMM2", WGuard1.GetMonthEnd(Convert.ToDateTime(hfYymm.Value), 0))); + } + + cmdReadRasn.Parameters["RANUM"].Value = sseno; + DataTable rasn; + + if (tran != null) + { + cmdReadRasn.Connection = tran.Connection; + cmdReadRasn.Transaction = tran; + rasn = Query.Select(tran.Connection, cmdReadRasn); + } + else + { + rasn = Query.Select(cmdReadRasn); + } + + if (rasn.Rows.Count > 0) + { + ssjno = rasn.Rows[0]["RAJNO"].ToString(); + sscno = rasn.Rows[0]["RACNO"].ToString(); + ssbrh = rasn.Rows[0]["RABRH"].ToString(); + } + else + { + ssjno = ""; + sscno = ""; + ssbrh = ""; + } + } + + // 計算所得稅,若小於 WSetR(Query, "UNBONUSTAXFREE", 1) 的設定,則免稅 + private int CalculateTax(int amt) + { + double taxRate = Convert.ToDouble(hfTaxRate.Value); + string s = WGuard1.WSetR(Query, "UNBONUSTAXFREE", 1).Trim(); + int taxFreeBoundry; + + if (s.Length == 0) + taxFreeBoundry = 2000; + else + taxFreeBoundry = Convert.ToInt32(s); + + /* 原先使用稅額小於 taxFreeBoundry 才免稅,改成金額小於 taxFreeBoundry 免稅 + int tax = Convert.ToInt32(Math.Round(amt * taxRate, 0, MidpointRounding.AwayFromZero)); + if (tax < taxFreeBoundry) + return 0; + else + return tax; + */ + + if (amt <= taxFreeBoundry) + return 0; + else + return Convert.ToInt32(Math.Round(amt * taxRate, 0, MidpointRounding.AwayFromZero)); + } + + public void Save(DbTransaction tran, WQuery query) + { + this.Query = query; + DateTime aYymm = YyMm; + SsmsDAC ssmsDao = new SsmsDAC(Query); + SsmsRecord ssmsRec; + + // 新增 + if (hfOldSSP13.Value.Length == 0 && txtSSP13.Text.Trim().Length > 0) + { + ssmsRec = new SsmsRecord(); + ssmsRec.SSPYN = hfSspyn.Value; + ssmsRec.SSENO = lbSSENO.Text; + ssmsRec.SSYMM = aYymm; + ssmsRec.SSP13 = Convert.ToInt32(txtSSP13.Text.Trim()); + ssmsRec.SSS03 = CalculateTax(ssmsRec.SSP13); + ssmsRec.SSC07 = hfTaxRate.Value + "|" + txtSSC07.Text; + ssmsDao.InsertOne(tran, ssmsRec); + } + // 更正 + else if (hfOldSSP13.Value.Length > 0 && txtSSP13.Text.Trim().Length > 0) + { + ssmsRec = new SsmsRecord(); + ssmsRec.SSPYN = hfSspyn.Value; + ssmsRec.SSENO = lbSSENO.Text; + ssmsRec.SSYMM = aYymm; + ssmsRec.SSITM = "001"; + ssmsRec.SSP13 = Convert.ToInt32(txtSSP13.Text.Trim()); + ssmsRec.SSS03 = CalculateTax(ssmsRec.SSP13); + ssmsRec.SSC07 = hfTaxRate.Value + "|" + txtSSC07.Text; + ssmsDao.UpdateOne(tran, ssmsRec); + } + // 刪除 + else if (hfOldSSP13.Value.Length > 0 && txtSSP13.Text.Trim().Length == 0) + { + ssmsDao.DeleteOne(tran, aYymm, lbSSENO.Text, hfSspyn.Value, "001"); + } + } + + public bool CheckInput() + { + lbMessage.Visible = false; + lbMessage.Text = ""; + + if (txtSSP13.Text.Trim().Length > 0) + { + int i; + if (!int.TryParse(txtSSP13.Text.Trim(), out i)) + { + lbMessage.Visible = true; + lbMessage.Text = "請輸入正確的金額"; + return false; + } + return true; + } + else + { + return true; + } + } +} \ No newline at end of file diff --git a/Web/forms/worker/wmBpsn.asmx b/Web/forms/worker/wmBpsn.asmx new file mode 100644 index 0000000..57b18e5 --- /dev/null +++ b/Web/forms/worker/wmBpsn.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="~/App_Code/wmBpsn.cs" Class="wmBpsn" %> diff --git a/Web/forms/worker/wmRyer.asmx b/Web/forms/worker/wmRyer.asmx new file mode 100644 index 0000000..72f04e5 --- /dev/null +++ b/Web/forms/worker/wmRyer.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="~/App_Code/wmRyer.cs" Class="wmRyer" %> diff --git a/Web/picture/Progressbar01.gif b/Web/picture/Progressbar01.gif new file mode 100644 index 0000000..006effc Binary files /dev/null and b/Web/picture/Progressbar01.gif differ diff --git a/Web/picture/Progressbar02.gif b/Web/picture/Progressbar02.gif new file mode 100644 index 0000000..d04f463 Binary files /dev/null and b/Web/picture/Progressbar02.gif differ diff --git a/Web/picture/Progressbar03.gif b/Web/picture/Progressbar03.gif new file mode 100644 index 0000000..ae7f794 Binary files /dev/null and b/Web/picture/Progressbar03.gif differ diff --git a/Web/picture/Progressbar04.gif b/Web/picture/Progressbar04.gif new file mode 100644 index 0000000..7dab308 Binary files /dev/null and b/Web/picture/Progressbar04.gif differ diff --git a/Web/picture/SalaryStrip.dib b/Web/picture/SalaryStrip.dib new file mode 100644 index 0000000..9fb153a Binary files /dev/null and b/Web/picture/SalaryStrip.dib differ diff --git a/Web/picture/SalaryStrip_Bonus.dib b/Web/picture/SalaryStrip_Bonus.dib new file mode 100644 index 0000000..f135f75 Binary files /dev/null and b/Web/picture/SalaryStrip_Bonus.dib differ diff --git a/Web/picture/Throbber.gif b/Web/picture/Throbber.gif new file mode 100644 index 0000000..deac700 Binary files /dev/null and b/Web/picture/Throbber.gif differ diff --git a/Web/picture/arrow_left.png b/Web/picture/arrow_left.png new file mode 100644 index 0000000..715f160 Binary files /dev/null and b/Web/picture/arrow_left.png differ diff --git a/Web/picture/arrow_right.png b/Web/picture/arrow_right.png new file mode 100644 index 0000000..814f916 Binary files /dev/null and b/Web/picture/arrow_right.png differ diff --git a/Web/picture/blocker_bg.gif b/Web/picture/blocker_bg.gif new file mode 100644 index 0000000..24485c4 Binary files /dev/null and b/Web/picture/blocker_bg.gif differ diff --git a/Web/picture/cal.gif b/Web/picture/cal.gif new file mode 100644 index 0000000..8526cf5 Binary files /dev/null and b/Web/picture/cal.gif differ diff --git a/Web/picture/chrome_flags.png b/Web/picture/chrome_flags.png new file mode 100644 index 0000000..2866176 Binary files /dev/null and b/Web/picture/chrome_flags.png differ diff --git a/Web/picture/chrome_flags_search.png b/Web/picture/chrome_flags_search.png new file mode 100644 index 0000000..c6f7798 Binary files /dev/null and b/Web/picture/chrome_flags_search.png differ diff --git a/Web/picture/chrome_flags_setok.png b/Web/picture/chrome_flags_setok.png new file mode 100644 index 0000000..95d881d Binary files /dev/null and b/Web/picture/chrome_flags_setok.png differ diff --git a/Web/picture/crserver_files.png b/Web/picture/crserver_files.png new file mode 100644 index 0000000..d74b843 Binary files /dev/null and b/Web/picture/crserver_files.png differ diff --git a/Web/picture/crserver_icon_win10.png b/Web/picture/crserver_icon_win10.png new file mode 100644 index 0000000..1190071 Binary files /dev/null and b/Web/picture/crserver_icon_win10.png differ diff --git a/Web/picture/crserver_icon_win11.png b/Web/picture/crserver_icon_win11.png new file mode 100644 index 0000000..c2b8a16 Binary files /dev/null and b/Web/picture/crserver_icon_win11.png differ diff --git a/Web/picture/crserver_icon_win7.png b/Web/picture/crserver_icon_win7.png new file mode 100644 index 0000000..51a07a4 Binary files /dev/null and b/Web/picture/crserver_icon_win7.png differ diff --git a/Web/picture/folder_close.gif b/Web/picture/folder_close.gif new file mode 100644 index 0000000..4e762d2 Binary files /dev/null and b/Web/picture/folder_close.gif differ diff --git a/Web/picture/folder_open.gif b/Web/picture/folder_open.gif new file mode 100644 index 0000000..b507b5b Binary files /dev/null and b/Web/picture/folder_open.gif differ diff --git a/Web/picture/icon_demo.gif b/Web/picture/icon_demo.gif new file mode 100644 index 0000000..b6479eb Binary files /dev/null and b/Web/picture/icon_demo.gif differ diff --git a/Web/picture/icon_docs.gif b/Web/picture/icon_docs.gif new file mode 100644 index 0000000..f8c401c Binary files /dev/null and b/Web/picture/icon_docs.gif differ diff --git a/Web/picture/icon_download.gif b/Web/picture/icon_download.gif new file mode 100644 index 0000000..47d15f7 Binary files /dev/null and b/Web/picture/icon_download.gif differ diff --git a/Web/picture/icon_forum.gif b/Web/picture/icon_forum.gif new file mode 100644 index 0000000..c99a254 Binary files /dev/null and b/Web/picture/icon_forum.gif differ diff --git a/Web/picture/icon_home.gif b/Web/picture/icon_home.gif new file mode 100644 index 0000000..92a4f2e Binary files /dev/null and b/Web/picture/icon_home.gif differ diff --git a/Web/picture/logo.gif b/Web/picture/logo.gif new file mode 100644 index 0000000..757cdde Binary files /dev/null and b/Web/picture/logo.gif differ diff --git a/Web/picture/next.gif b/Web/picture/next.gif new file mode 100644 index 0000000..bf02152 Binary files /dev/null and b/Web/picture/next.gif differ diff --git a/Web/picture/next_year.gif b/Web/picture/next_year.gif new file mode 100644 index 0000000..ac12ea1 Binary files /dev/null and b/Web/picture/next_year.gif differ diff --git a/Web/picture/pickup.gif b/Web/picture/pickup.gif new file mode 100644 index 0000000..669492d Binary files /dev/null and b/Web/picture/pickup.gif differ diff --git a/Web/picture/prev.gif b/Web/picture/prev.gif new file mode 100644 index 0000000..211e1fa Binary files /dev/null and b/Web/picture/prev.gif differ diff --git a/Web/picture/prev_year.gif b/Web/picture/prev_year.gif new file mode 100644 index 0000000..d8145d5 Binary files /dev/null and b/Web/picture/prev_year.gif differ diff --git a/Web/picture/stop24.gif b/Web/picture/stop24.gif new file mode 100644 index 0000000..0337b2a Binary files /dev/null and b/Web/picture/stop24.gif differ diff --git a/Web/picture/text_file.gif b/Web/picture/text_file.gif new file mode 100644 index 0000000..fec4087 Binary files /dev/null and b/Web/picture/text_file.gif differ diff --git a/Web/picture/uninstall_old_crviewer_win10.png b/Web/picture/uninstall_old_crviewer_win10.png new file mode 100644 index 0000000..d2bdf8b Binary files /dev/null and b/Web/picture/uninstall_old_crviewer_win10.png differ diff --git a/Web/picture/uninstall_old_crviewer_win7.png b/Web/picture/uninstall_old_crviewer_win7.png new file mode 100644 index 0000000..425aa2e Binary files /dev/null and b/Web/picture/uninstall_old_crviewer_win7.png differ diff --git a/Web/picture/web_form.gif b/Web/picture/web_form.gif new file mode 100644 index 0000000..cf68b3d Binary files /dev/null and b/Web/picture/web_form.gif differ diff --git a/Web/picture/window_caption.gif b/Web/picture/window_caption.gif new file mode 100644 index 0000000..1d238e5 Binary files /dev/null and b/Web/picture/window_caption.gif differ diff --git a/Web/picture/window_caption_left.gif b/Web/picture/window_caption_left.gif new file mode 100644 index 0000000..703645c Binary files /dev/null and b/Web/picture/window_caption_left.gif differ diff --git a/Web/picture/window_caption_left_corner.gif b/Web/picture/window_caption_left_corner.gif new file mode 100644 index 0000000..6753a68 Binary files /dev/null and b/Web/picture/window_caption_left_corner.gif differ diff --git a/Web/picture/window_caption_right.gif b/Web/picture/window_caption_right.gif new file mode 100644 index 0000000..243a844 Binary files /dev/null and b/Web/picture/window_caption_right.gif differ diff --git a/Web/picture/window_caption_right_corner.gif b/Web/picture/window_caption_right_corner.gif new file mode 100644 index 0000000..80e8148 Binary files /dev/null and b/Web/picture/window_caption_right_corner.gif differ diff --git a/Web/picture/window_left_border.gif b/Web/picture/window_left_border.gif new file mode 100644 index 0000000..7ea1731 Binary files /dev/null and b/Web/picture/window_left_border.gif differ diff --git a/Web/picture/window_lower_border.gif b/Web/picture/window_lower_border.gif new file mode 100644 index 0000000..a6cc812 Binary files /dev/null and b/Web/picture/window_lower_border.gif differ diff --git a/Web/picture/window_lower_left_corner.gif b/Web/picture/window_lower_left_corner.gif new file mode 100644 index 0000000..c029fa7 Binary files /dev/null and b/Web/picture/window_lower_left_corner.gif differ diff --git a/Web/picture/window_lower_right_corner.gif b/Web/picture/window_lower_right_corner.gif new file mode 100644 index 0000000..6f4b82f Binary files /dev/null and b/Web/picture/window_lower_right_corner.gif differ diff --git a/Web/picture/window_right_border.gif b/Web/picture/window_right_border.gif new file mode 100644 index 0000000..298a3cc Binary files /dev/null and b/Web/picture/window_right_border.gif differ diff --git a/Web/report/BPSN_01.rpt b/Web/report/BPSN_01.rpt new file mode 100644 index 0000000..42ce83f Binary files /dev/null and b/Web/report/BPSN_01.rpt differ diff --git a/Web/report/BPSN_02.rpt b/Web/report/BPSN_02.rpt new file mode 100644 index 0000000..1de92b5 Binary files /dev/null and b/Web/report/BPSN_02.rpt differ diff --git a/Web/report/BPSN_02_20120306.rpt b/Web/report/BPSN_02_20120306.rpt new file mode 100644 index 0000000..1f9faaa Binary files /dev/null and b/Web/report/BPSN_02_20120306.rpt differ diff --git a/Web/report/BPSN_03.rpt b/Web/report/BPSN_03.rpt new file mode 100644 index 0000000..9c4392e Binary files /dev/null and b/Web/report/BPSN_03.rpt differ diff --git a/Web/report/BPSN_04.rpt b/Web/report/BPSN_04.rpt new file mode 100644 index 0000000..6b69e72 Binary files /dev/null and b/Web/report/BPSN_04.rpt differ diff --git a/Web/report/CRViewerServer.zip b/Web/report/CRViewerServer.zip new file mode 100644 index 0000000..cca1fb5 Binary files /dev/null and b/Web/report/CRViewerServer.zip differ diff --git a/Web/report/RPAR_0X.rpt b/Web/report/RPAR_0X.rpt new file mode 100644 index 0000000..0836b1d Binary files /dev/null and b/Web/report/RPAR_0X.rpt differ diff --git a/Web/report/RPAR_0X_1 - 複製.rpt b/Web/report/RPAR_0X_1 - 複製.rpt new file mode 100644 index 0000000..caa3c14 Binary files /dev/null and b/Web/report/RPAR_0X_1 - 複製.rpt differ diff --git a/Web/report/RPAR_0X_1.rpt b/Web/report/RPAR_0X_1.rpt new file mode 100644 index 0000000..0e18119 Binary files /dev/null and b/Web/report/RPAR_0X_1.rpt differ diff --git a/Web/report/RPAR_0X_1M.rpt b/Web/report/RPAR_0X_1M.rpt new file mode 100644 index 0000000..46d5930 Binary files /dev/null and b/Web/report/RPAR_0X_1M.rpt differ diff --git a/Web/report/RPAR_1X - 複製.rpt b/Web/report/RPAR_1X - 複製.rpt new file mode 100644 index 0000000..f572df4 Binary files /dev/null and b/Web/report/RPAR_1X - 複製.rpt differ diff --git a/Web/report/RPAR_1X.rpt b/Web/report/RPAR_1X.rpt new file mode 100644 index 0000000..2d24530 Binary files /dev/null and b/Web/report/RPAR_1X.rpt differ diff --git a/Web/report/RPAR_1X_1.rpt b/Web/report/RPAR_1X_1.rpt new file mode 100644 index 0000000..f0ef167 Binary files /dev/null and b/Web/report/RPAR_1X_1.rpt differ diff --git a/Web/report/RPAR_21.rpt b/Web/report/RPAR_21.rpt new file mode 100644 index 0000000..ac3675e Binary files /dev/null and b/Web/report/RPAR_21.rpt differ diff --git a/Web/report/RPAR_22.rpt b/Web/report/RPAR_22.rpt new file mode 100644 index 0000000..e012e8b Binary files /dev/null and b/Web/report/RPAR_22.rpt differ diff --git a/Web/report/RPAR_3X - 複製.rpt b/Web/report/RPAR_3X - 複製.rpt new file mode 100644 index 0000000..bd04a1c Binary files /dev/null and b/Web/report/RPAR_3X - 複製.rpt differ diff --git a/Web/report/RPAR_3X.rpt b/Web/report/RPAR_3X.rpt new file mode 100644 index 0000000..d2cfa92 Binary files /dev/null and b/Web/report/RPAR_3X.rpt differ diff --git a/Web/report/RPAR_3X22.rpt b/Web/report/RPAR_3X22.rpt new file mode 100644 index 0000000..39e888e Binary files /dev/null and b/Web/report/RPAR_3X22.rpt differ diff --git a/Web/report/RPAR_ALL_1.rpt b/Web/report/RPAR_ALL_1.rpt new file mode 100644 index 0000000..1bcbb67 Binary files /dev/null and b/Web/report/RPAR_ALL_1.rpt differ diff --git a/Web/report/RPAR_ALL_2 - 複製.rpt b/Web/report/RPAR_ALL_2 - 複製.rpt new file mode 100644 index 0000000..1654229 Binary files /dev/null and b/Web/report/RPAR_ALL_2 - 複製.rpt differ diff --git a/Web/report/RPAR_ALL_2.rpt b/Web/report/RPAR_ALL_2.rpt new file mode 100644 index 0000000..1c7371e Binary files /dev/null and b/Web/report/RPAR_ALL_2.rpt differ diff --git a/Web/report/RPAR_ALL_2M.rpt b/Web/report/RPAR_ALL_2M.rpt new file mode 100644 index 0000000..a4db10e Binary files /dev/null and b/Web/report/RPAR_ALL_2M.rpt differ diff --git a/Web/report/RPAR_CARD_01.rpt b/Web/report/RPAR_CARD_01.rpt new file mode 100644 index 0000000..ed5f8b0 Binary files /dev/null and b/Web/report/RPAR_CARD_01.rpt differ diff --git a/Web/report/RPFE_01.rpt b/Web/report/RPFE_01.rpt new file mode 100644 index 0000000..ac83954 Binary files /dev/null and b/Web/report/RPFE_01.rpt differ diff --git a/Web/report/RPIR_01_01.rpt b/Web/report/RPIR_01_01.rpt new file mode 100644 index 0000000..6f9e1ea Binary files /dev/null and b/Web/report/RPIR_01_01.rpt differ diff --git a/Web/report/RPIR_01_02.rpt b/Web/report/RPIR_01_02.rpt new file mode 100644 index 0000000..adfbe54 Binary files /dev/null and b/Web/report/RPIR_01_02.rpt differ diff --git a/Web/report/RPIR_02_01.rpt b/Web/report/RPIR_02_01.rpt new file mode 100644 index 0000000..d4ce091 Binary files /dev/null and b/Web/report/RPIR_02_01.rpt differ diff --git a/Web/report/RPIR_02_02.rpt b/Web/report/RPIR_02_02.rpt new file mode 100644 index 0000000..fa6fb9f Binary files /dev/null and b/Web/report/RPIR_02_02.rpt differ diff --git a/Web/report/SACD_01.rpt b/Web/report/SACD_01.rpt new file mode 100644 index 0000000..0e91c34 Binary files /dev/null and b/Web/report/SACD_01.rpt differ diff --git a/Web/report/SACD_01B.rpt b/Web/report/SACD_01B.rpt new file mode 100644 index 0000000..0941156 Binary files /dev/null and b/Web/report/SACD_01B.rpt differ diff --git a/Web/report/SACD_02.rpt b/Web/report/SACD_02.rpt new file mode 100644 index 0000000..f765e4d Binary files /dev/null and b/Web/report/SACD_02.rpt differ diff --git a/Web/report/SACD_03.rpt b/Web/report/SACD_03.rpt new file mode 100644 index 0000000..b6d2e1d Binary files /dev/null and b/Web/report/SACD_03.rpt differ diff --git a/Web/report/SSMS_01_1 - 複製.rpt b/Web/report/SSMS_01_1 - 複製.rpt new file mode 100644 index 0000000..f5826a6 Binary files /dev/null and b/Web/report/SSMS_01_1 - 複製.rpt differ diff --git a/Web/report/SSMS_01_1.rpt b/Web/report/SSMS_01_1.rpt new file mode 100644 index 0000000..49e44d5 Binary files /dev/null and b/Web/report/SSMS_01_1.rpt differ diff --git a/Web/report/SSMS_02A.rpt b/Web/report/SSMS_02A.rpt new file mode 100644 index 0000000..5ced92f Binary files /dev/null and b/Web/report/SSMS_02A.rpt differ diff --git a/Web/report/SSMS_02A_1 - 複製 (2).rpt b/Web/report/SSMS_02A_1 - 複製 (2).rpt new file mode 100644 index 0000000..2000a61 Binary files /dev/null and b/Web/report/SSMS_02A_1 - 複製 (2).rpt differ diff --git a/Web/report/SSMS_02A_1 - 複製.rpt b/Web/report/SSMS_02A_1 - 複製.rpt new file mode 100644 index 0000000..b680c81 Binary files /dev/null and b/Web/report/SSMS_02A_1 - 複製.rpt differ diff --git a/Web/report/SSMS_02A_1.rpt b/Web/report/SSMS_02A_1.rpt new file mode 100644 index 0000000..d283ada Binary files /dev/null and b/Web/report/SSMS_02A_1.rpt differ diff --git a/Web/report/SSMS_02B.rpt b/Web/report/SSMS_02B.rpt new file mode 100644 index 0000000..51654a8 Binary files /dev/null and b/Web/report/SSMS_02B.rpt differ diff --git a/Web/report/SSMS_02B_1 - 複製.rpt b/Web/report/SSMS_02B_1 - 複製.rpt new file mode 100644 index 0000000..08a7429 Binary files /dev/null and b/Web/report/SSMS_02B_1 - 複製.rpt differ diff --git a/Web/report/SSMS_02B_1.rpt b/Web/report/SSMS_02B_1.rpt new file mode 100644 index 0000000..f44dfbe Binary files /dev/null and b/Web/report/SSMS_02B_1.rpt differ diff --git a/Web/report/SSMS_02C - 複製.rpt b/Web/report/SSMS_02C - 複製.rpt new file mode 100644 index 0000000..66dcd03 Binary files /dev/null and b/Web/report/SSMS_02C - 複製.rpt differ diff --git a/Web/report/SSMS_02C.rpt b/Web/report/SSMS_02C.rpt new file mode 100644 index 0000000..465f0fe Binary files /dev/null and b/Web/report/SSMS_02C.rpt differ diff --git a/Web/report/SSMS_02C_1 - 複製 (2).rpt b/Web/report/SSMS_02C_1 - 複製 (2).rpt new file mode 100644 index 0000000..0fbe2c6 Binary files /dev/null and b/Web/report/SSMS_02C_1 - 複製 (2).rpt differ diff --git a/Web/report/SSMS_02C_1 - 複製.rpt b/Web/report/SSMS_02C_1 - 複製.rpt new file mode 100644 index 0000000..ba1d777 Binary files /dev/null and b/Web/report/SSMS_02C_1 - 複製.rpt differ diff --git a/Web/report/SSMS_02C_1.rpt b/Web/report/SSMS_02C_1.rpt new file mode 100644 index 0000000..6c99ad6 Binary files /dev/null and b/Web/report/SSMS_02C_1.rpt differ diff --git a/Web/report/SSMS_03 - 複製.rpt b/Web/report/SSMS_03 - 複製.rpt new file mode 100644 index 0000000..050360a Binary files /dev/null and b/Web/report/SSMS_03 - 複製.rpt differ diff --git a/Web/report/SSMS_03.rpt b/Web/report/SSMS_03.rpt new file mode 100644 index 0000000..a0307b9 Binary files /dev/null and b/Web/report/SSMS_03.rpt differ diff --git a/Web/report/報表清單.txt b/Web/report/報表清單.txt new file mode 100644 index 0000000..a8d358e --- /dev/null +++ b/Web/report/報表清單.txt @@ -0,0 +1,35 @@ +檔案名稱 報表名稱 紙張方向 +=========== ========================== ======== +SACD_01 經費核銷年度總表(已停用) +SACD_01B 經費核銷年度總表 +SACD_02 經費核銷季報表 +SACD_03 經費核銷月報表 +SSMS_01_1 各項法定提撥費用明細表 橫式 +SSMS_02A 薪資清冊 +SSMS_02A_1 薪資清冊 橫式 +SSMS_02B 薪資清冊(多媽媽) +SSMS_02B_1 薪資清冊(多媽媽) 橫式 +SSMS_02C 薪資明細表(內部發薪) +SSMS_02C_1 薪資明細表(內部發薪) 橫式 +SSMS_03 薪資發放總表 橫式 +RPAR_0X 請假明細 +RPAR_0X_1 請假明細(橫式) 橫式 +RPAR_0X_1M 請假明細(橫式/分鐘) 橫式 +RPAR_1X 加班費明細 +RPAR_1X_1 加班費明細(分鐘) +RPAR_3X 外勤工作明細表 +RPAR_3X 差旅費明細(多媽媽) +RPAR_21 電話費明細(多媽媽) +RPAR_22 油料費明細(多媽媽) +RPAR_3X22 外勤工作費明細(多媽媽) +RPAR_ALL_1 出缺勤情形統計表 +RPAR_ALL_2 出缺勤情形統計表(橫式) 橫式 +RPAR_ALL_2M 出缺勤情形統計表(橫式/分鐘 橫式 +BPSN_01 員工資料明細表 橫式 +BPSN_02 員工薪資明細表 橫式 +BPSN_03 員工學歷明細表 橫式 +BPSN_04 員工年齡明細表 橫式 +RPIR_01_01 投保資料明細表 員工編號順序 橫式 +RPIR_01_02 投保資料明細表 專案順序 橫式 +RPIR_02_01 勞健保異動明細表 員工編號順序 橫式 +RPIR_02_02 勞健保異動明細表 專案順序 橫式 \ No newline at end of file diff --git a/Web/reportData/請勿刪除.txt b/Web/reportData/請勿刪除.txt new file mode 100644 index 0000000..e9207c0 --- /dev/null +++ b/Web/reportData/請勿刪除.txt @@ -0,0 +1 @@ +ФŧR \ No newline at end of file diff --git a/Web/service/BatchService.asmx b/Web/service/BatchService.asmx new file mode 100644 index 0000000..7dfee4e --- /dev/null +++ b/Web/service/BatchService.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="~/App_Code/BatchService.cs" Class="BatchService" %> diff --git a/Web/service/Web.config b/Web/service/Web.config new file mode 100644 index 0000000..1c5098f --- /dev/null +++ b/Web/service/Web.config @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/Web/utility/CSJSRequestObject.js b/Web/utility/CSJSRequestObject.js new file mode 100644 index 0000000..940fa40 --- /dev/null +++ b/Web/utility/CSJSRequestObject.js @@ -0,0 +1,3 @@ +/* Andrew Urquhart : Client-Side Request Object for javascript : http://andrewu.co.uk/tools/request/ +COPYRIGHT:You are free to use this script for any use you wish if this comment is left intact. Feel free to enhance the script and send me the updated version. Please don't redistribute. This script is provided as is,with no warranty of any kind. Use it at your own risk. Copyright Andrew R Urquhart; VERSION:#1.3 2005-05-11 17:52 UTC*/ +function RObj(ea){var LS="";var QS=new Object();var un="undefined";var x=null;var f="function";var n="number";var r="string";var e1="ERROR:Index out of range in\r\nRequest.QueryString";var e2="ERROR:Wrong number of arguments or invalid property assignment\r\nRequest.QueryString";var e3="ERROR:Object doesn't support this property or method\r\nRequest.QueryString.Key";function Err(arg){if(ea){alert("Request Object:\r\n"+arg)}};function URID(t){var d="";if(t){for(var i=0;i1){return(s.substring(0,l-2))}return(s==""?x:s)};function KM(k,o){var k=k.toLowerCase();for(var u in o){if(typeof o[u]!=f&&u.toString().toLowerCase()==k){return u}}}if(window.location&&window.location.search){LS=window.location.search;var l=LS.length;if(l>0){LS=LS.substring(1,l);var preAmpAt=0;var ampAt=-1;var eqAt=-1;var k=0;var skip=false;for(var i=0;ieqAt){AVTK(URID(LS.substring(preAmpAt,eqAt)),URID(LS.substring(eqAt+1,ampAt)));preAmpAt=ampAt+1;eqAt=ampAt=-1;++k}}if(LS.charAt(preAmpAt)!="="&&(preAmpAt!=0||i!=0||c!="=")){if(preAmpAt!=l){if(eqAt!=-1){AVTK(URID(LS.substring(preAmpAt,eqAt)),URID(LS.substring(eqAt+1,l)))}else if(preAmpAt!=l-1){AVTK(URID(LS.substring(preAmpAt,l)),"")}}if(l==1){AVTK(LS.substring(0,1),"")}}}};var TC=OL(QS);if(!TC){TC=0};QS.toString=function(){return LS.toString()};QS.Count=function(){return(TC?TC:0)};QS.Count.toString=function(){return(TC?TC.toString():"0")};QS.Item=function(e){if(typeof e==un){return LS}else {if(typeof e==n){var e=Math.ceil(e);var c=0;for(var i in QS){if(typeof QS[i]!=f&&++c==e){return QS[i]}};Err(e1+"().Item("+e+")")}else {return QS[KM(e,QS)]}};return x};QS.Item.toString=function(){return LS.toString()};QS.Key=function(e){var t=typeof e;if(t==n){var e=Math.ceil(e);var c=0;for(var i in QS){if(typeof QS[i]!=f&&++c==e){return i}}}else if(t==r){var e=KM(e,QS);var a=QS[e];return(typeof a!=un&&a&&a.toString()?e:"")}else {Err(e2+"().Key("+(e?e:"")+")")};Err(e1+"().Item("+e+")")};QS.Key.toString=function(){Err(e2+"().Key")};this.QueryString=function(k){if(typeof k==un){return QS}else {var k=KM(k,QS);if(typeof QS[k]==un){t=new Object();t.Count=function(){return 0};t.Count.toString=function(){return "0"};t.toString=function(){return x};t.Item=function(e){return x};t.Item.toString=function(){return x};t.Key=function(e){Err(e3+"("+(e?e:"")+")")};t.Key.toString=function(){return x};return t}if(typeof k==n){return QS.Item(k)}else {return QS[k]}}};this.QueryString.toString=function(){return LS.toString()};this.QueryString.Count=function(){return(TC?TC:0)};this.QueryString.Count.toString=function(){return(TC?TC.toString():"0")};this.QueryString.Item=function(e){if(typeof e==un){return LS.toString()}else {if(typeof e==n){var e=Math.ceil(e);var c=0;for(var i in QS){if(typeof QS[i]!=f&&++c==e){return QS[i]}};Err(e1+".Item("+e+")")}else {return QS[KM(e,QS)]}}if(typeof e==n){Err(e1+".Item("+e+")")};return x};this.QueryString.Item.toString=function(){return LS.toString()};this.QueryString.Key=function(e){var t=typeof e;if(t==n){var e=Math.ceil(e);var c=0;for(var i in QS){if(typeof QS[i]=="object"&&(++c==e)){return i}}}else if(t==r){var e=KM(e,QS);var a=QS[e];return(typeof a!=un&&a&&a.toString()?e:"")}else {Err(e2+".Key("+(e?e:"")+")")};Err(e1+".Item("+e+")")};this.QueryString.Key.toString=function(){Err(e2+".Key")};this.Version=1.3;this.Author="Andrew Urquhart (www.andrewu.co.uk)"};var Request=new RObj(false); diff --git a/Web/utility/ClickMenu.js b/Web/utility/ClickMenu.js new file mode 100644 index 0000000..d274e82 --- /dev/null +++ b/Web/utility/ClickMenu.js @@ -0,0 +1,51 @@ +function FixMenu(menuTable) +{ + if (!menuTable) { return }; + var tbody = menuTable.getElementsByTagName("TBODY")[0]; + var tr = tbody.getElementsByTagName("TR")[0]; + for (var i = 0; i < tr.childNodes.length; i++) + { + var td = tr.childNodes[i]; + if (td.tagName && td.tagName.toLowerCase() == 'td') + { + var anchor = td.getElementsByTagName("A")[0]; + if (anchor) + { + var onClick = td.onmouseover; + td.onclick = (function (e, method) { return function (evt) { method.call(e); if (window.event) { evt = window.event } evt.cancelBubble = true; RemoveRootHover(e); __disappearAfter = 3000; Menu_Collapse(e) } })(td, onClick); + td.onmouseover = (function (e) { return function () { HoverRootMenu(e) } })(td); + anchor.style.cursor = "pointer"; + var submnu = WebForm_GetElementById(td.id + "Items"); + if (submnu) { anchor.onclick = function () { return false } } + td.onmouseout = (function (e) { return function () { RemoveRootHover(e) } })(td); + } + } + } +} + +function HoverRootMenu(item) +{ + var node = (item.tagName.toLowerCase() == "td") ? item : item.cells[0]; + var data = Menu_GetData(item); + if (!data) { return null; } + var nodeTable = WebForm_GetElementByTagName(node, "table"); + if (data.staticHoverClass) + { + nodeTable.hoverClass = data.staticHoverClass; + WebForm_AppendToClassName(nodeTable, data.staticHoverClass); + } + node = nodeTable.rows[0].cells[0].childNodes[0]; + if (data.staticHoverHyperLinkClass) { node.hoverHyperLinkClass = data.staticHoverHyperLinkClass; WebForm_AppendToClassName(node, data.staticHoverHyperLinkClass) } + return node; +} + +function RemoveRootHover(item) +{ + var node = (item.tagName.toLowerCase() == "td") ? item : item.cells[0]; + var data = Menu_GetData(item); + if (!data) { return null; } + var nodeTable = WebForm_GetElementByTagName(node, "table"); + if (nodeTable.hoverClass) { WebForm_RemoveClassName(nodeTable, nodeTable.hoverClass) } + node = nodeTable.rows[0].cells[0].childNodes[0]; + if (node.hoverHyperLinkClass) { WebForm_RemoveClassName(node, node.hoverHyperLinkClass) } +} \ No newline at end of file diff --git a/Web/utility/DatePicker.aspx b/Web/utility/DatePicker.aspx new file mode 100644 index 0000000..4c84b55 --- /dev/null +++ b/Web/utility/DatePicker.aspx @@ -0,0 +1,496 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DatePicker.aspx.cs" + Inherits="utility_DatePicker" %> + + + + + 日期挑選 + + + + + + + + + + +
+
+ + + + +
+ + + + + + + + + + +
+ + + + + + + + +
+
+ + + + +
+
+
+ +
+
+ + + +
+
+ + diff --git a/Web/utility/DatePicker.aspx.cs b/Web/utility/DatePicker.aspx.cs new file mode 100644 index 0000000..0af61e8 --- /dev/null +++ b/Web/utility/DatePicker.aspx.cs @@ -0,0 +1,29 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Data.Common; +using System.Text; +using Wellan.Common; + +public partial class utility_DatePicker : System.Web.UI.Page +{ + protected void Page_Load(object sender, EventArgs e) + { + BhrdDAC bhrddac = new BhrdDAC(); + DataTable bhrd = bhrddac.GetAll(); + StringBuilder sb = new StringBuilder(); + foreach (DataRow row in bhrd.Rows) + { + sb.Append(String.Format("{0}:\"{1}\",", row["BHYER"], row["BHHRD"])); + } + sb.Append("\"\":\"\""); + Page.ClientScript.RegisterClientScriptBlock(typeof(String), "bhrd", WConstants.JavaScriptStart + "var BHRD={" + sb.ToString() + "}" + WConstants.JavaScriptEnd); + } +} diff --git a/Web/utility/DatePicker.htm b/Web/utility/DatePicker.htm new file mode 100644 index 0000000..76f008e --- /dev/null +++ b/Web/utility/DatePicker.htm @@ -0,0 +1,342 @@ + + + + 日期挑選 + + + + + + + + diff --git a/Web/utility/GetLookUp.aspx b/Web/utility/GetLookUp.aspx new file mode 100644 index 0000000..2bcf323 --- /dev/null +++ b/Web/utility/GetLookUp.aspx @@ -0,0 +1,16 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GetLookUp.aspx.cs" Inherits="utility_GetPickUp" %> + + + + + + Untitled Page + + +
+
+ +
+
+ + diff --git a/Web/utility/GetLookUp.aspx.cs b/Web/utility/GetLookUp.aspx.cs new file mode 100644 index 0000000..e43707a --- /dev/null +++ b/Web/utility/GetLookUp.aspx.cs @@ -0,0 +1,76 @@ +using System; +using System.Data; +using System.Data.Common; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using Wellan.Common; +using Wellan.Data; +using System.Text; + +public partial class utility_GetPickUp : System.Web.UI.Page +{ + protected void Page_Load(object sender, EventArgs e) + { + // 從設定檔中取得連線字串 + WConnectionString.ConnectionConfigFile = WConfig.GetConnectionConfig(); + string connName = WConfig.GetConnectionConfigName(); + string connType = WConnectionString.GetConnectionType(connName); + string connStr = WConnectionString.GetConnectionString(connName); + + WQuery Query = new WQuery(connType, connStr); + DbConnection Conn = Query.NewConnection(); + DbCommand Cmd = Query.NewCommand(); + + // 從 Request 中取出參數 + string lookupConfigName = Request["NAME"]; + string whereKey = Request["WHERE_KEY"]; + string langId = Request["LANGID"]; + string addWhere = Request["ADD_WHERE"]; + + // 從設定檔中取得SQL + WLookupList pickup = WLookupList.GetInstance(); + pickup.LookupConfigName = lookupConfigName; + string sql = pickup.GetLookupSQL(); + string[] keyFields = pickup.GetKeyFields(); + + // 將傳入的KEY代入SQL + try + { + foreach (string keyField in keyFields) + { + if (addWhere.Length == 0) + Cmd.CommandText = String.Format(sql, keyField, ""); + else + Cmd.CommandText = String.Format(sql, keyField, " AND " + addWhere); + Cmd.Parameters.Clear(); + Cmd.Parameters.Add(Query.NewParameter("@VALUE", whereKey + "%")); + + // 取回資料 + DataTable table = Query.Select(Conn, Cmd); + // 若無資料,則找尋下一個 KEY + if (table.Rows.Count == 0) + { + continue; + } + else + { + // 輸出儲存下拉資料物件的 JSON 表示法字串 + Response.Write(pickup.GetLookupJSON(table, langId)); + Response.End(); + return; + } + } + } + catch + { + + } + Response.End(); + } +} diff --git a/Web/utility/LookupList.js b/Web/utility/LookupList.js new file mode 100644 index 0000000..722d347 --- /dev/null +++ b/Web/utility/LookupList.js @@ -0,0 +1,483 @@ +//-------------------------------------------- +// 要掛在回傳物件上的 method 程式碼 +//-------------------------------------------- +function JSON_Dataset_FieldValue_Method(index, fieldName) +{ + var i = this.Cols[fieldName]; + if (typeof i != "undefined") + { + if (typeof this.Rows[index] != "undefined") + return this.Rows[index][i]; + else + return null; + } +} + +//-------------------------------------------- +// 取得 XMLHTTP 物件參考 +//-------------------------------------------- +function initRequest() +{ + var A = null; + try + { + A = new ActiveXObject("Msxml2.XMLHTTP") + } + catch (e) + { + try + { + A = new ActiveXObject("Microsoft.XMLHTTP") + } + catch (oc) + { + A = null + } + } + + if (!A && typeof XMLHttpRequest != "undefined") + { + A = new XMLHttpRequest() + } + + if (!A && window.createRequest) + { + try + { + A = window.createRequest(); + } catch (e) + { + A = null; + } + } + + return A +} + +//-------------------------------------------- +// 取得網頁上元件的 X 座標 +//-------------------------------------------- +function offsetLeft(obj) +{ + x = obj.offsetLeft; + for (objParent = obj.offsetParent; objParent; objParent = objParent.offsetParent) + x += objParent.offsetLeft; + return x; +} + +//-------------------------------------------- +// 取得網頁上元件的 Y 座標 +//-------------------------------------------- +function offsetTop(obj) +{ + y = obj.offsetTop; + for (objParent = obj.offsetParent; objParent; objParent = objParent.offsetParent) + y += objParent.offsetTop; + return y; +} + +//-------------------------------------------- +// 改顏色 +//-------------------------------------------- +function changeColor(obj, bgColor, txtColor) +{ + obj.style.backgroundColor = bgColor; + obj.style.color = txtColor; +} + + +//-------------------------------------------- +// 顯示下拉清單 +//-------------------------------------------- +function ShowPickup1() +{ + XX_SELECT_DIV.style.display = "block"; + var totalHeight = document.getElementById("contentDiv").offsetHeight + document.getElementById("contentDiv").offsetTop; + if (XX_SELECT_DIV.offsetTop + XX_SELECT_DIV.offsetHeight > totalHeight) + { + XX_SELECT_DIV.style.top = (totalHeight - XX_SELECT_DIV.offsetHeight) + "px"; + // XX_SELECT_DIV.offsetTop = totalHeight - XX_SELECT_DIV.offsetHeight; + } + //if (XX_SELECT.offsetHeight > 200) + // XX_SELECT_PANEL.style.height = "200px"; + //XX_SELECT_MASK.style.left = XX_SELECT_DIV.style.left; + //XX_SELECT_MASK.style.top = XX_SELECT_DIV.style.top; + //XX_SELECT_MASK.style.width = XX_SELECT_DIV.offsetWidth; + //XX_SELECT_MASK.style.height = XX_SELECT_DIV.offsetHeight; +} + +//-------------------------------------------- +// XMLHTTP 的 onreadystatechange 事件處理程式 +//-------------------------------------------- +function ShowPickup() +{ + if (XmlHttp.readyState == 4 || XmlHttp.readyState == 'complete') + { + XX_SELECT_DIV = document.getElementById('XX_SELECT_DIV'); + XX_SELECT_DIV.innerHTML = xx_select_html; + + XX_SELECT_PANEL = document.getElementById('XX_SELECT_PANEL'); + XX_SELECT_TITLE = document.getElementById('XX_SELECT_TITLE'); + //XX_SELECT_MASK = document.getElementById('XX_SELECT_MASK'); + XX_SELECT = document.getElementById('XX_SELECT'); + XX_PAGE_BUTTON = document.getElementById('XX_PAGE_BUTTON'); + XX_SELECT_DIV.style.left = offsetLeft(objValue) + "px"; + XX_SELECT_DIV.style.top = offsetTop(objValue) + objValue.offsetHeight + "px"; + // XX_SELECT_DIV.offsetTop = offsetTop(objValue) + objValue.offsetHeight; + + RespText = XmlHttp.responseText; + + // if no result, display "not found" message + if (RespText == "") + { + XX_SELECT_DIV.innerHTML = not_found_html1 + msgNotFound + not_found_html2; + ShowPickup1(); + XX_SELECT_DIV.focus(); + return; + } + + // evaluate return data to object + XX_TEXT = eval("(" + RespText + ")"); + + // + if (notShowOnlyOneRecord && (XX_TEXT.ListData.Data.Rows.length == 1)) + { + Update(0); + return; + } + + // generate table for display result + // draw title + newRow = XX_SELECT_TITLE.insertRow(-1); + newRow.bgColor = XX_TEXT.ListData.TitleBackgroundColor; + for (i in XX_TEXT.ListData.ListTitles) + { + newCell = newRow.insertCell(-1); + if ((typeof XX_TEXT.ListData.ListWidths[i] != "undefined") && (XX_TEXT.ListData.ListWidths[i] != "")) + newCell.width = XX_TEXT.ListData.ListWidths[i] + "px"; + else + newCell.width = "100px"; + // newCell.style = "padding:3px"; + newCell.innerHTML = "
" + + XX_TEXT.ListData.ListTitles[i] + + "
"; + } + + // draw content + var n = 0; + for (i = XX_Init_RecNo; i < XX_TEXT.ListData.Data.Rows.length; i++) + { + n++; + newRow = XX_SELECT.insertRow(-1); + if ((i * 1) % 2 == 1) + newRow.bgColor = XX_TEXT.ListData.DataAltBackgroundColor; + else + newRow.bgColor = XX_TEXT.ListData.DataBackgroundColor; + newRow.onclick = "Update(" + i + ")"; + newRow.onmouseover = "changeColor(this, "#ff9e28", "#FFFFFF")"; + newRow.onmouseout = "changeColor(this, "" + newRow.bgColor + "", "" + XX_TEXT.ListData.DataTextColor + "")"; + + for (j in XX_TEXT.ListData.ListFields) + { + newCell = newRow.insertCell(-1); + + if ((typeof XX_TEXT.ListData.ListWidths[j] != "undefined") && (XX_TEXT.ListData.ListWidths[j] != "")) + newCell.width = XX_TEXT.ListData.ListWidths[j] + "px"; + else + newCell.width = "100px"; + + // newCell.style = "padding:3px"; + newCell.innerHTML = "
" + + XX_TEXT.ListData.Data.FieldValue(i, XX_TEXT.ListData.ListFields[j]) + + "
"; + } + + // when record count is great then max_record setting, draw page-changing button + if ((XX_Max_Records > 0 && n >= XX_Max_Records) || i == XX_TEXT.ListData.Data.Rows.length - 1) + { + XX_Next_RecNo = i + 1; + XX_Prev_RecNo = XX_Init_RecNo - XX_Max_Records; + + // newRow = XX_SELECT.insertRow(-1); + // newCell = newRow.insertCell(-1); + // newCell.colSpan = 99; + + var s = "= 0 ? "" : " disabled ") + + " onclick=\"SendPickupRequestCont(" + + """ + XX_Url + ""," + + """ + XX_Name + ""," + + """ + XX_Value_Id + ""," + + XX_Text_Id + "," + + """ + XX_Add_Where + ""," + + (notShowOnlyOneRecord ? "true," : "false,") + + XX_Max_Records + "," + + XX_Prev_RecNo + ");\"/>" + + ""; + // newCell.innerHTML = s; + XX_PAGE_BUTTON.innerHTML = s; + break; + } + } + + ShowPickup1(); + XX_SELECT_DIV.focus(); + } +} + +//-------------------------------------------- +// 使用 XMLHTTP 送出請求 +//-------------------------------------------- +function SendPickupRequestCont(url, name, AvalueId, AtextId, additionalWhere, notShowOnlyOne, maxRecords, initRecNo) +{ + valueId = AvalueId; + textId = AtextId; + XX_Url = url; + XX_Name = name; + XX_Value_Id = AvalueId; + XX_Add_Where = additionalWhere; + XX_Max_Records = maxRecords; + XX_Init_RecNo = initRecNo; + notShowOnlyOneRecord = notShowOnlyOne; + + // get value-input object + objValue = document.getElementById(valueId); + + // get output object(s) + XX_Text_Id = ""; + if (typeof textId[0] != "undefined") + { + objOutput = new Array(textId.length); + XX_Text_Id += "["; + for (i = 0; i < textId.length; i++) + { + objOutput[i] = document.getElementById(textId[i]); + XX_Text_Id += """ + textId[i] + """; + + if (i < textId.length - 1) + XX_Text_Id += "," + } + XX_Text_Id += "]"; + } + else + { + objOutput = document.getElementById(textId); + XX_Text_Id = textId; + } + + // get a HttpRequest object and sumbit request + XmlHttp = initRequest(); + XmlHttp.open("GET", url + "?NAME=" + name + "&LANGID=" + UserLangId + + "&WHERE_KEY=" + escape(objValue.value) + + "&ADD_WHERE=" + escape(additionalWhere), true); + XmlHttp.onreadystatechange = ShowPickup; + XmlHttp.send(""); +} + +function SendPickupRequest(url, name, AvalueId, AtextId, additionalWhere, notShowOnlyOne, maxRecords) +{ + SendPickupRequestCont(url, name, AvalueId, AtextId, additionalWhere, notShowOnlyOne, maxRecords, 0); +} + +//-------------------------------------------- +// 下拉清單的鍵盤事件處理程式 +//-------------------------------------------- +function SelectKeydown(e) +{ + if (XX_SELECT.selectedIndex < 0) + return; + + var keynum = 0; + + if (window.event) + { + keynum = event.keyCode; + } + else if (e.which) + { + keynum = e.which; + } + + switch (keynum) + { + // ESC key = close + case 27: + { + HidePickupList(); + return false; + } + } + return true; +} + +//-------------------------------------------- +// 下拉清單的滑鼠雙擊處理程式 +//-------------------------------------------- +function SelectDblClicked() +{ + if (XX_SELECT.selectedIndex < 0) + return; + Update(); +} + +//-------------------------------------------- +// 更新頁面上的 HTML 元件中的值 +//-------------------------------------------- +function Update(value) +{ + if (typeof objOutput[0] != "undefined") + { + for (i = 0; i < objOutput.length; i++) + { + if (typeof objOutput[i] != "undefined" + && typeof XX_TEXT.ListData.OutputFields[i] != "undefined" + && typeof XX_TEXT.ListData.Data.FieldValue(value, XX_TEXT.ListData.OutputFields[i]) != "undefined") + { + if (objOutput[i] != null) + { + if (objOutput[i].tagName == "INPUT") + objOutput[i].value = XX_TEXT.ListData.Data.FieldValue(value, XX_TEXT.ListData.OutputFields[i]); + else + objOutput[i].innerHTML = XX_TEXT.ListData.Data.FieldValue(value, XX_TEXT.ListData.OutputFields[i]); + } + } + } + } + else + { + if (typeof objOutput != "undefined" + && typeof XX_TEXT.ListData.OutputFields[0] != "undefined" + && typeof XX_TEXT.ListData.Data.FieldValue(value, XX_TEXT.ListData.OutputFields[0]) != "undefined") + { + if (objOutput != null) + { + if (objOutput.tagName == "INPUT") + objOutput.value = XX_TEXT.ListData.Data.FieldValue(value, XX_TEXT.ListData.OutputFields[i]); + else + objOutput.innerHTML = XX_TEXT.ListData.Data.FieldValue(value, XX_TEXT.ListData.OutputFields[i]); + } + } + } + + HidePickupList(); +} + +// for debug +function Update1(obj) +{ + alert(obj); + HidePickupList(); +} + +//-------------------------------------------- +// 隱藏下拉清單, 並清除其中的資料 +//-------------------------------------------- +function HidePickupList() +{ + XX_SELECT_DIV.style.display = "none"; + XX_SELECT_DIV.innerHTML = xx_select_html; + //XX_SELECT_MASK.style.left = "0"; + //XX_SELECT_MASK.style.top = "0"; + //XX_SELECT_MASK.style.width = "0"; + //XX_SELECT_MASK.style.height = "0"; + objValue.focus(); +} + +//-------------------------------------------- +// 變數與常數宣告 +//-------------------------------------------- +var XX_SELECT = null; +var XX_SELECT_DIV = null; +var XX_SELECT_PANEL = null; +var XX_SELECT_TITLE = null; +//var XX_SELECT_MASK = null; +var XX_TEXT = null; +var objValue = null; +var objOutput = null; +var valueId = null; +var textId = null; +var notShowOnlyOneRecord = false; +var XX_SELECT_SelectedIndex = -1; +var XX_Url = ""; +var XX_Name = ""; +var XX_Value_Id = ""; +var XX_Text_Id = ""; +var XX_Add_Where = ""; +var XX_Max_Records = 100; +var XX_Next_RecNo = 0; +var XX_Prev_RecNo = 0; +var XX_Init_RecNo = 0; +var not_found_html1 = "
" + + "" + + "
"; +var not_found_html2 = "
" + + "
"; +var xx_select_html = "" + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + "
" + + " " + + " " + + "
" + + " " + + "
" + + "
" + + "
" + + " " + + "
" + + "
" + + "
"; +var outer_div_html = "
"; +//var outer_iframe_html = ""; +//var outer_iframe_html = "'); + else + lyr1 = $(''); + + if (opts.theme) + lyr2 = $(''); + else + lyr2 = $(''); + + if (opts.theme && full) { + s = ''; + } + else if (opts.theme) { + s = ''; + } + else if (full) { + s = ''; + } + else { + s = ''; + } + lyr3 = $(s); + + // if we have a message, style it + if (msg) { + if (opts.theme) { + lyr3.css(themedCSS); + lyr3.addClass('ui-widget-content'); + } + else + lyr3.css(css); + } + + // style the overlay + if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/) + lyr2.css(opts.overlayCSS); + lyr2.css('position', full ? 'fixed' : 'absolute'); + + // make iframe layer transparent in IE + if (msie || opts.forceIframe) + lyr1.css('opacity',0.0); + + //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); + var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el); + $.each(layers, function() { + this.appendTo($par); + }); + + if (opts.theme && opts.draggable && $.fn.draggable) { + lyr3.draggable({ + handle: '.ui-dialog-titlebar', + cancel: 'li' + }); + } + + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) + var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0); + if (ie6 || expr) { + // give body 100% height + if (full && opts.allowBodyStretch && $.support.boxModel) + $('html,body').css('height','100%'); + + // fix ie6 issue when blocked element has a border width + if ((ie6 || !$.support.boxModel) && !full) { + var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); + var fixT = t ? '(0 - '+t+')' : 0; + var fixL = l ? '(0 - '+l+')' : 0; + } + + // simulate fixed position + $.each(layers, function(i,o) { + var s = o[0].style; + s.position = 'absolute'; + if (i < 2) { + if (full) + s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"'); + else + s.setExpression('height','this.parentNode.offsetHeight + "px"'); + if (full) + s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'); + else + s.setExpression('width','this.parentNode.offsetWidth + "px"'); + if (fixL) s.setExpression('left', fixL); + if (fixT) s.setExpression('top', fixT); + } + else if (opts.centerY) { + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); + s.marginTop = 0; + } + else if (!opts.centerY && full) { + var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0; + var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; + s.setExpression('top',expression); + } + }); + } + + // show the message + if (msg) { + if (opts.theme) + lyr3.find('.ui-widget-content').append(msg); + else + lyr3.append(msg); + if (msg.jquery || msg.nodeType) + $(msg).show(); + } + + if ((msie || opts.forceIframe) && opts.showOverlay) + lyr1.show(); // opacity is zero + if (opts.fadeIn) { + var cb = opts.onBlock ? opts.onBlock : noOp; + var cb1 = (opts.showOverlay && !msg) ? cb : noOp; + var cb2 = msg ? cb : noOp; + if (opts.showOverlay) + lyr2._fadeIn(opts.fadeIn, cb1); + if (msg) + lyr3._fadeIn(opts.fadeIn, cb2); + } + else { + if (opts.showOverlay) + lyr2.show(); + if (msg) + lyr3.show(); + if (opts.onBlock) + opts.onBlock.bind(lyr3)(); + } + + // bind key and mouse events + bind(1, el, opts); + + if (full) { + pageBlock = lyr3[0]; + pageBlockEls = $(opts.focusableElements,pageBlock); + if (opts.focusInput) + setTimeout(focus, 20); + } + else + center(lyr3[0], opts.centerX, opts.centerY); + + if (opts.timeout) { + // auto-unblock + var to = setTimeout(function() { + if (full) + $.unblockUI(opts); + else + $(el).unblock(opts); + }, opts.timeout); + $(el).data('blockUI.timeout', to); + } + } + + // remove the block + function remove(el, opts) { + var count; + var full = (el == window); + var $el = $(el); + var data = $el.data('blockUI.history'); + var to = $el.data('blockUI.timeout'); + if (to) { + clearTimeout(to); + $el.removeData('blockUI.timeout'); + } + opts = $.extend({}, $.blockUI.defaults, opts || {}); + bind(0, el, opts); // unbind events + + if (opts.onUnblock === null) { + opts.onUnblock = $el.data('blockUI.onUnblock'); + $el.removeData('blockUI.onUnblock'); + } + + var els; + if (full) // crazy selector to handle odd field errors in ie6/7 + els = $('body').children().filter('.blockUI').add('body > .blockUI'); + else + els = $el.find('>.blockUI'); + + // fix cursor issue + if ( opts.cursorReset ) { + if ( els.length > 1 ) + els[1].style.cursor = opts.cursorReset; + if ( els.length > 2 ) + els[2].style.cursor = opts.cursorReset; + } + + if (full) + pageBlock = pageBlockEls = null; + + if (opts.fadeOut) { + count = els.length; + els.stop().fadeOut(opts.fadeOut, function() { + if ( --count === 0) + reset(els,data,opts,el); + }); + } + else + reset(els, data, opts, el); + } + + // move blocking element back into the DOM where it started + function reset(els,data,opts,el) { + var $el = $(el); + if ( $el.data('blockUI.isBlocked') ) + return; + + els.each(function(i,o) { + // remove via DOM calls so we don't lose event handlers + if (this.parentNode) + this.parentNode.removeChild(this); + }); + + if (data && data.el) { + data.el.style.display = data.display; + data.el.style.position = data.position; + data.el.style.cursor = 'default'; // #59 + if (data.parent) + data.parent.appendChild(data.el); + $el.removeData('blockUI.history'); + } + + if ($el.data('blockUI.static')) { + $el.css('position', 'static'); // #22 + } + + if (typeof opts.onUnblock == 'function') + opts.onUnblock(el,opts); + + // fix issue in Safari 6 where block artifacts remain until reflow + var body = $(document.body), w = body.width(), cssW = body[0].style.width; + body.width(w-1).width(w); + body[0].style.width = cssW; + } + + // bind/unbind the handler + function bind(b, el, opts) { + var full = el == window, $el = $(el); + + // don't bother unbinding if there is nothing to unbind + if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) + return; + + $el.data('blockUI.isBlocked', b); + + // don't bind events when overlay is not in use or if bindEvents is false + if (!full || !opts.bindEvents || (b && !opts.showOverlay)) + return; + + // bind anchors and inputs for mouse and key events + var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove'; + if (b) + $(document).bind(events, opts, handler); + else + $(document).unbind(events, handler); + + // former impl... + // var $e = $('a,:input'); + // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); + } + + // event handler to suppress keyboard/mouse events when blocking + function handler(e) { + // allow tab navigation (conditionally) + if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) { + if (pageBlock && e.data.constrainTabKey) { + var els = pageBlockEls; + var fwd = !e.shiftKey && e.target === els[els.length-1]; + var back = e.shiftKey && e.target === els[0]; + if (fwd || back) { + setTimeout(function(){focus(back);},10); + return false; + } + } + } + var opts = e.data; + var target = $(e.target); + if (target.hasClass('blockOverlay') && opts.onOverlayClick) + opts.onOverlayClick(e); + + // allow events within the message content + if (target.parents('div.' + opts.blockMsgClass).length > 0) + return true; + + // allow events for content that is not being blocked + return target.parents().children().filter('div.blockUI').length === 0; + } + + function focus(back) { + if (!pageBlockEls) + return; + var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; + if (e) + e.focus(); + } + + function center(el, x, y) { + var p = el.parentNode, s = el.style; + var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); + var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); + if (x) s.left = l > 0 ? (l+'px') : '0'; + if (y) s.top = t > 0 ? (t+'px') : '0'; + } + + function sz(el, p) { + return parseInt($.css(el,p),10)||0; + } + + } + + + /*global define:true */ + if (typeof define === 'function' && define.amd && define.amd.jQuery) { + define(['jquery'], setup); + } else { + setup(jQuery); + } + +})(); diff --git a/Web/utility/promise-polyfill-min.js b/Web/utility/promise-polyfill-min.js new file mode 100644 index 0000000..18bfa66 --- /dev/null +++ b/Web/utility/promise-polyfill-min.js @@ -0,0 +1 @@ +!function (e, n) { "object" == typeof exports && "undefined" != typeof module ? n() : "function" == typeof define && define.amd ? define(n) : n() }(0, function () { "use strict"; function e(e) { var n = this.constructor; return this.then(function (t) { return n.resolve(e()).then(function () { return t }) }, function (t) { return n.resolve(e()).then(function () { return n.reject(t) }) }) } function n(e) { return !(!e || "undefined" == typeof e.length) } function t() { } function o(e) { if (!(this instanceof o)) throw new TypeError("Promises must be constructed via new"); if ("function" != typeof e) throw new TypeError("not a function"); this._state = 0, this._handled = !1, this._value = undefined, this._deferreds = [], c(e, this) } function r(e, n) { for (; 3 === e._state;)e = e._value; 0 !== e._state ? (e._handled = !0, o._immediateFn(function () { var t = 1 === e._state ? n.onFulfilled : n.onRejected; if (null !== t) { var o; try { o = t(e._value) } catch (r) { return void f(n.promise, r) } i(n.promise, o) } else (1 === e._state ? i : f)(n.promise, e._value) })) : e._deferreds.push(n) } function i(e, n) { try { if (n === e) throw new TypeError("A promise cannot be resolved with itself."); if (n && ("object" == typeof n || "function" == typeof n)) { var t = n.then; if (n instanceof o) return e._state = 3, e._value = n, void u(e); if ("function" == typeof t) return void c(function (e, n) { return function () { e.apply(n, arguments) } }(t, n), e) } e._state = 1, e._value = n, u(e) } catch (r) { f(e, r) } } function f(e, n) { e._state = 2, e._value = n, u(e) } function u(e) { 2 === e._state && 0 === e._deferreds.length && o._immediateFn(function () { e._handled || o._unhandledRejectionFn(e._value) }); for (var n = 0, t = e._deferreds.length; t > n; n++)r(e, e._deferreds[n]); e._deferreds = null } function c(e, n) { var t = !1; try { e(function (e) { t || (t = !0, i(n, e)) }, function (e) { t || (t = !0, f(n, e)) }) } catch (o) { if (t) return; t = !0, f(n, o) } } var a = setTimeout; o.prototype["catch"] = function (e) { return this.then(null, e) }, o.prototype.then = function (e, n) { var o = new this.constructor(t); return r(this, new function (e, n, t) { this.onFulfilled = "function" == typeof e ? e : null, this.onRejected = "function" == typeof n ? n : null, this.promise = t }(e, n, o)), o }, o.prototype["finally"] = e, o.all = function (e) { return new o(function (t, o) { function r(e, n) { try { if (n && ("object" == typeof n || "function" == typeof n)) { var u = n.then; if ("function" == typeof u) return void u.call(n, function (n) { r(e, n) }, o) } i[e] = n, 0 == --f && t(i) } catch (c) { o(c) } } if (!n(e)) return o(new TypeError("Promise.all accepts an array")); var i = Array.prototype.slice.call(e); if (0 === i.length) return t([]); for (var f = i.length, u = 0; i.length > u; u++)r(u, i[u]) }) }, o.resolve = function (e) { return e && "object" == typeof e && e.constructor === o ? e : new o(function (n) { n(e) }) }, o.reject = function (e) { return new o(function (n, t) { t(e) }) }, o.race = function (e) { return new o(function (t, r) { if (!n(e)) return r(new TypeError("Promise.race accepts an array")); for (var i = 0, f = e.length; f > i; i++)o.resolve(e[i]).then(t, r) }) }, o._immediateFn = "function" == typeof setImmediate && function (e) { setImmediate(e) } || function (e) { a(e, 0) }, o._unhandledRejectionFn = function (e) { void 0 !== console && console && console.warn("Possible Unhandled Promise Rejection:", e) }; var l = function () { if ("undefined" != typeof self) return self; if ("undefined" != typeof window) return window; if ("undefined" != typeof global) return global; throw Error("unable to locate global object") }(); "Promise" in l ? l.Promise.prototype["finally"] || (l.Promise.prototype["finally"] = e) : l.Promise = o }); \ No newline at end of file diff --git a/Web/utility/vue.js b/Web/utility/vue.js new file mode 100644 index 0000000..efebcc6 --- /dev/null +++ b/Web/utility/vue.js @@ -0,0 +1,11 @@ +/*! + * Vue.js v2.7.14 + * (c) 2014-2022 Evan You + * Released under the MIT License. + */ +/*! + * Vue.js v2.7.14 + * (c) 2014-2022 Evan You + * Released under the MIT License. + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Vue=e()}(this,(function(){"use strict";var t=Object.freeze({}),e=Array.isArray;function n(t){return null==t}function r(t){return null!=t}function o(t){return!0===t}function i(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function a(t){return"function"==typeof t}function s(t){return null!==t&&"object"==typeof t}var c=Object.prototype.toString;function u(t){return"[object Object]"===c.call(t)}function l(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function f(t){return r(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function d(t){return null==t?"":Array.isArray(t)||u(t)&&t.toString===c?JSON.stringify(t,null,2):String(t)}function p(t){var e=parseFloat(t);return isNaN(e)?t:e}function v(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(r,1)}}var y=Object.prototype.hasOwnProperty;function _(t,e){return y.call(t,e)}function b(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var $=/-(\w)/g,w=b((function(t){return t.replace($,(function(t,e){return e?e.toUpperCase():""}))})),x=b((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),C=/\B([A-Z])/g,k=b((function(t){return t.replace(C,"-$1").toLowerCase()}));var S=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function O(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function T(t,e){for(var n in e)t[n]=e[n];return t}function A(t){for(var e={},n=0;n0,G=q&&q.indexOf("edge/")>0;q&&q.indexOf("android");var X=q&&/iphone|ipad|ipod|ios/.test(q);q&&/chrome\/\d+/.test(q),q&&/phantomjs/.test(q);var Y,Q=q&&q.match(/firefox\/(\d+)/),tt={}.watch,et=!1;if(J)try{var nt={};Object.defineProperty(nt,"passive",{get:function(){et=!0}}),window.addEventListener("test-passive",null,nt)}catch(t){}var rt=function(){return void 0===Y&&(Y=!J&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),Y},ot=J&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function it(t){return"function"==typeof t&&/native code/.test(t.toString())}var at,st="undefined"!=typeof Symbol&&it(Symbol)&&"undefined"!=typeof Reflect&&it(Reflect.ownKeys);at="undefined"!=typeof Set&&it(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var ct=null;function ut(t){void 0===t&&(t=null),t||ct&&ct._scope.off(),ct=t,t&&t._scope.on()}var lt=function(){function t(t,e,n,r,o,i,a,s){this.tag=t,this.data=e,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),ft=function(t){void 0===t&&(t="");var e=new lt;return e.text=t,e.isComment=!0,e};function dt(t){return new lt(void 0,void 0,void 0,String(t))}function pt(t){var e=new lt(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}var vt=0,ht=[],mt=function(){function t(){this._pending=!1,this.id=vt++,this.subs=[]}return t.prototype.addSub=function(t){this.subs.push(t)},t.prototype.removeSub=function(t){this.subs[this.subs.indexOf(t)]=null,this._pending||(this._pending=!0,ht.push(this))},t.prototype.depend=function(e){t.target&&t.target.addDep(this)},t.prototype.notify=function(t){for(var e=this.subs.filter((function(t){return t})),n=0,r=e.length;n0&&(Yt((c=Qt(c,"".concat(a||"","_").concat(s)))[0])&&Yt(l)&&(f[u]=dt(l.text+c[0].text),c.shift()),f.push.apply(f,c)):i(c)?Yt(l)?f[u]=dt(l.text+c):""!==c&&f.push(dt(c)):Yt(c)&&Yt(l)?f[u]=dt(l.text+c.text):(o(t._isVList)&&r(c.tag)&&n(c.key)&&r(a)&&(c.key="__vlist".concat(a,"_").concat(s,"__")),f.push(c)));return f}function te(t,n,c,u,l,f){return(e(c)||i(c))&&(l=u,u=c,c=void 0),o(f)&&(l=2),function(t,n,o,i,c){if(r(o)&&r(o.__ob__))return ft();r(o)&&r(o.is)&&(n=o.is);if(!n)return ft();e(i)&&a(i[0])&&((o=o||{}).scopedSlots={default:i[0]},i.length=0);2===c?i=Xt(i):1===c&&(i=function(t){for(var n=0;n0,s=n?!!n.$stable:!a,c=n&&n.$key;if(n){if(n._normalized)return n._normalized;if(s&&o&&o!==t&&c===o.$key&&!a&&!o.$hasNormal)return o;for(var u in i={},n)n[u]&&"$"!==u[0]&&(i[u]=$e(e,r,u,n[u]))}else i={};for(var l in r)l in i||(i[l]=we(r,l));return n&&Object.isExtensible(n)&&(n._normalized=i),z(i,"$stable",s),z(i,"$key",c),z(i,"$hasNormal",a),i}function $e(t,n,r,o){var i=function(){var n=ct;ut(t);var r=arguments.length?o.apply(null,arguments):o({}),i=(r=r&&"object"==typeof r&&!e(r)?[r]:Xt(r))&&r[0];return ut(n),r&&(!i||1===r.length&&i.isComment&&!_e(i))?void 0:r};return o.proxy&&Object.defineProperty(n,r,{get:i,enumerable:!0,configurable:!0}),i}function we(t,e){return function(){return t[e]}}function xe(e){return{get attrs(){if(!e._attrsProxy){var n=e._attrsProxy={};z(n,"_v_attr_proxy",!0),Ce(n,e.$attrs,t,e,"$attrs")}return e._attrsProxy},get listeners(){e._listenersProxy||Ce(e._listenersProxy={},e.$listeners,t,e,"$listeners");return e._listenersProxy},get slots(){return function(t){t._slotsProxy||Se(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(e)},emit:S(e.$emit,e),expose:function(t){t&&Object.keys(t).forEach((function(n){return Bt(e,t,n)}))}}}function Ce(t,e,n,r,o){var i=!1;for(var a in e)a in t?e[a]!==n[a]&&(i=!0):(i=!0,ke(t,a,r,o));for(var a in t)a in e||(i=!0,delete t[a]);return i}function ke(t,e,n,r){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[r][e]}})}function Se(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}function Oe(){var t=ct;return t._setupContext||(t._setupContext=xe(t))}var Te,Ae=null;function je(t,e){return(t.__esModule||st&&"Module"===t[Symbol.toStringTag])&&(t=t.default),s(t)?e.extend(t):t}function Ee(t){if(e(t))for(var n=0;ndocument.createEvent("Event").timeStamp&&(Ze=function(){return Ge.now()})}var Xe=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function Ye(){var t,e;for(We=Ze(),Je=!0,Ue.sort(Xe),qe=0;qeqe&&Ue[n].id>t.id;)n--;Ue.splice(n+1,0,t)}else Ue.push(t);Ke||(Ke=!0,Cn(Ye))}}var tn="watcher",en="".concat(tn," callback"),nn="".concat(tn," getter"),rn="".concat(tn," cleanup");function on(t,e){return cn(t,null,{flush:"post"})}var an,sn={};function cn(n,r,o){var i=void 0===o?t:o,s=i.immediate,c=i.deep,u=i.flush,l=void 0===u?"pre":u;i.onTrack,i.onTrigger;var f,d,p=ct,v=function(t,e,n){return void 0===n&&(n=null),dn(t,null,n,p,e)},h=!1,m=!1;if(Ft(n)?(f=function(){return n.value},h=It(n)):Mt(n)?(f=function(){return n.__ob__.dep.depend(),n},c=!0):e(n)?(m=!0,h=n.some((function(t){return Mt(t)||It(t)})),f=function(){return n.map((function(t){return Ft(t)?t.value:Mt(t)?Bn(t):a(t)?v(t,nn):void 0}))}):f=a(n)?r?function(){return v(n,nn)}:function(){if(!p||!p._isDestroyed)return d&&d(),v(n,tn,[y])}:j,r&&c){var g=f;f=function(){return Bn(g())}}var y=function(t){d=_.onStop=function(){v(t,rn)}};if(rt())return y=j,r?s&&v(r,en,[f(),m?[]:void 0,y]):f(),j;var _=new Vn(ct,f,j,{lazy:!0});_.noRecurse=!r;var b=m?[]:sn;return _.run=function(){if(_.active)if(r){var t=_.get();(c||h||(m?t.some((function(t,e){return I(t,b[e])})):I(t,b)))&&(d&&d(),v(r,en,[t,b===sn?void 0:b,y]),b=t)}else _.get()},"sync"===l?_.update=_.run:"post"===l?(_.post=!0,_.update=function(){return Qe(_)}):_.update=function(){if(p&&p===ct&&!p._isMounted){var t=p._preWatchers||(p._preWatchers=[]);t.indexOf(_)<0&&t.push(_)}else Qe(_)},r?s?_.run():b=_.get():"post"===l&&p?p.$once("hook:mounted",(function(){return _.get()})):_.get(),function(){_.teardown()}}var un=function(){function t(t){void 0===t&&(t=!1),this.detached=t,this.active=!0,this.effects=[],this.cleanups=[],this.parent=an,!t&&an&&(this.index=(an.scopes||(an.scopes=[])).push(this)-1)}return t.prototype.run=function(t){if(this.active){var e=an;try{return an=this,t()}finally{an=e}}},t.prototype.on=function(){an=this},t.prototype.off=function(){an=this.parent},t.prototype.stop=function(t){if(this.active){var e=void 0,n=void 0;for(e=0,n=this.effects.length;e1)return n&&a(e)?e.call(r):e}},h:function(t,e,n){return te(ct,t,e,n,2,!0)},getCurrentInstance:function(){return ct&&{proxy:ct}},useSlots:function(){return Oe().slots},useAttrs:function(){return Oe().attrs},useListeners:function(){return Oe().listeners},mergeDefaults:function(t,n){var r=e(t)?t.reduce((function(t,e){return t[e]={},t}),{}):t;for(var o in n){var i=r[o];i?e(i)||a(i)?r[o]={type:i,default:n[o]}:i.default=n[o]:null===i&&(r[o]={default:n[o]})}return r},nextTick:Cn,set:jt,del:Et,useCssModule:function(e){return t},useCssVars:function(t){if(J){var e=ct;e&&on((function(){var n=e.$el,r=t(e,e._setupProxy);if(n&&1===n.nodeType){var o=n.style;for(var i in r)o.setProperty("--".concat(i),r[i])}}))}},defineAsyncComponent:function(t){a(t)&&(t={loader:t});var e=t.loader,n=t.loadingComponent,r=t.errorComponent,o=t.delay,i=void 0===o?200:o,s=t.timeout;t.suspensible;var c=t.onError,u=null,l=0,f=function(){var t;return u||(t=u=e().catch((function(t){if(t=t instanceof Error?t:new Error(String(t)),c)return new Promise((function(e,n){c(t,(function(){return e((l++,u=null,f()))}),(function(){return n(t)}),l+1)}));throw t})).then((function(e){return t!==u&&u?u:(e&&(e.__esModule||"Module"===e[Symbol.toStringTag])&&(e=e.default),e)})))};return function(){return{component:f(),delay:i,timeout:s,error:r,loading:n}}},onBeforeMount:Sn,onMounted:On,onBeforeUpdate:Tn,onUpdated:An,onBeforeUnmount:jn,onUnmounted:En,onActivated:Nn,onDeactivated:Pn,onServerPrefetch:Dn,onRenderTracked:Mn,onRenderTriggered:In,onErrorCaptured:function(t,e){void 0===e&&(e=ct),Ln(t,e)}}),Hn=new at;function Bn(t){return Un(t,Hn),Hn.clear(),t}function Un(t,n){var r,o,i=e(t);if(!(!i&&!s(t)||t.__v_skip||Object.isFrozen(t)||t instanceof lt)){if(t.__ob__){var a=t.__ob__.dep.id;if(n.has(a))return;n.add(a)}if(i)for(r=t.length;r--;)Un(t[r],n);else if(Ft(t))Un(t.value,n);else for(r=(o=Object.keys(t)).length;r--;)Un(t[o[r]],n)}}var zn=0,Vn=function(){function t(t,e,n,r,o){!function(t,e){void 0===e&&(e=an),e&&e.active&&e.effects.push(t)}(this,an&&!an._vm?an:t?t._scope:void 0),(this.vm=t)&&o&&(t._watcher=this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync,this.before=r.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++zn,this.active=!0,this.post=!1,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new at,this.newDepIds=new at,this.expression="",a(e)?this.getter=e:(this.getter=function(t){if(!V.test(t)){var e=t.split(".");return function(t){for(var n=0;n-1)if(i&&!_(o,"default"))s=!1;else if(""===s||s===k(t)){var u=xr(String,o.type);(u<0||c-1:"string"==typeof t?t.split(",").indexOf(n)>-1:(r=t,"[object RegExp]"===c.call(r)&&t.test(n));var r}function Tr(t,e){var n=t.cache,r=t.keys,o=t._vnode;for(var i in n){var a=n[i];if(a){var s=a.name;s&&!e(s)&&Ar(n,i,r,o)}}}function Ar(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,g(n,e)}!function(e){e.prototype._init=function(e){var n=this;n._uid=tr++,n._isVue=!0,n.__v_skip=!0,n._scope=new un(!0),n._scope._vm=!0,e&&e._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(n,e):n.$options=gr(er(n.constructor),e||{},n),n._renderProxy=n,n._self=n,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(n),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Me(t,e)}(n),function(e){e._vnode=null,e._staticTrees=null;var n=e.$options,r=e.$vnode=n._parentVnode,o=r&&r.context;e.$slots=ge(n._renderChildren,o),e.$scopedSlots=r?be(e.$parent,r.data.scopedSlots,e.$slots):t,e._c=function(t,n,r,o){return te(e,t,n,r,o,!1)},e.$createElement=function(t,n,r,o){return te(e,t,n,r,o,!0)};var i=r&&r.data;At(e,"$attrs",i&&i.attrs||t,null,!0),At(e,"$listeners",n._parentListeners||t,null,!0)}(n),Be(n,"beforeCreate",void 0,!1),function(t){var e=Qn(t.$options.inject,t);e&&(kt(!1),Object.keys(e).forEach((function(n){At(t,n,e[n])})),kt(!0))}(n),qn(n),function(t){var e=t.$options.provide;if(e){var n=a(e)?e.call(t):e;if(!s(n))return;for(var r=ln(t),o=st?Reflect.ownKeys(n):Object.keys(n),i=0;i1?O(n):n;for(var r=O(arguments,1),o='event handler for "'.concat(t,'"'),i=0,a=n.length;iparseInt(this.max)&&Ar(e,n[0],n,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Ar(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Tr(t,(function(t){return Or(e,t)}))})),this.$watch("exclude",(function(e){Tr(t,(function(t){return!Or(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=Ee(t),n=e&&e.componentOptions;if(n){var r=Sr(n),o=this.include,i=this.exclude;if(o&&(!r||!Or(o,r))||i&&r&&Or(i,r))return e;var a=this.cache,s=this.keys,c=null==e.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):e.key;a[c]?(e.componentInstance=a[c].componentInstance,g(s,c),s.push(c)):(this.vnodeToCache=e,this.keyToCache=c),e.data.keepAlive=!0}return e||t&&t[0]}},Nr={KeepAlive:Er};!function(t){var e={get:function(){return H}};Object.defineProperty(t,"config",e),t.util={warn:lr,extend:T,mergeOptions:gr,defineReactive:At},t.set=jt,t.delete=Et,t.nextTick=Cn,t.observable=function(t){return Tt(t),t},t.options=Object.create(null),R.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,T(t.options.components,Nr),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=O(arguments,1);return n.unshift(this),a(t.install)?t.install.apply(t,n):a(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=gr(this.options,t),this}}(t),kr(t),function(t){R.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&u(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&a(n)&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(Cr),Object.defineProperty(Cr.prototype,"$isServer",{get:rt}),Object.defineProperty(Cr.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Cr,"FunctionalRenderContext",{value:nr}),Cr.version=Rn;var Pr=v("style,class"),Dr=v("input,textarea,option,select,progress"),Mr=function(t,e,n){return"value"===n&&Dr(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},Ir=v("contenteditable,draggable,spellcheck"),Lr=v("events,caret,typing,plaintext-only"),Rr=v("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Fr="http://www.w3.org/1999/xlink",Hr=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Br=function(t){return Hr(t)?t.slice(6,t.length):""},Ur=function(t){return null==t||!1===t};function zr(t){for(var e=t.data,n=t,o=t;r(o.componentInstance);)(o=o.componentInstance._vnode)&&o.data&&(e=Vr(o.data,e));for(;r(n=n.parent);)n&&n.data&&(e=Vr(e,n.data));return function(t,e){if(r(t)||r(e))return Kr(t,Jr(e));return""}(e.staticClass,e.class)}function Vr(t,e){return{staticClass:Kr(t.staticClass,e.staticClass),class:r(t.class)?[t.class,e.class]:e.class}}function Kr(t,e){return t?e?t+" "+e:t:e||""}function Jr(t){return Array.isArray(t)?function(t){for(var e,n="",o=0,i=t.length;o-1?_o(t,e,n):Rr(e)?Ur(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Ir(e)?t.setAttribute(e,function(t,e){return Ur(e)||"false"===e?"false":"contenteditable"===t&&Lr(e)?e:"true"}(e,n)):Hr(e)?Ur(n)?t.removeAttributeNS(Fr,Br(e)):t.setAttributeNS(Fr,e,n):_o(t,e,n)}function _o(t,e,n){if(Ur(n))t.removeAttribute(e);else{if(W&&!Z&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var bo={create:go,update:go};function $o(t,e){var o=e.elm,i=e.data,a=t.data;if(!(n(i.staticClass)&&n(i.class)&&(n(a)||n(a.staticClass)&&n(a.class)))){var s=zr(e),c=o._transitionClasses;r(c)&&(s=Kr(s,Jr(c))),s!==o._prevClass&&(o.setAttribute("class",s),o._prevClass=s)}}var wo,xo,Co,ko,So,Oo,To={create:$o,update:$o},Ao=/[\w).+\-_$\]]/;function jo(t){var e,n,r,o,i,a=!1,s=!1,c=!1,u=!1,l=0,f=0,d=0,p=0;for(r=0;r=0&&" "===(h=t.charAt(v));v--);h&&Ao.test(h)||(u=!0)}}else void 0===o?(p=r+1,o=t.slice(0,r).trim()):m();function m(){(i||(i=[])).push(t.slice(p,r).trim()),p=r+1}if(void 0===o?o=t.slice(0,r).trim():0!==p&&m(),i)for(r=0;r-1?{exp:t.slice(0,ko),key:'"'+t.slice(ko+1)+'"'}:{exp:t,key:null};xo=t,ko=So=Oo=0;for(;!qo();)Wo(Co=Jo())?Go(Co):91===Co&&Zo(Co);return{exp:t.slice(0,So),key:t.slice(So+1,Oo)}}(t);return null===n.key?"".concat(t,"=").concat(e):"$set(".concat(n.exp,", ").concat(n.key,", ").concat(e,")")}function Jo(){return xo.charCodeAt(++ko)}function qo(){return ko>=wo}function Wo(t){return 34===t||39===t}function Zo(t){var e=1;for(So=ko;!qo();)if(Wo(t=Jo()))Go(t);else if(91===t&&e++,93===t&&e--,0===e){Oo=ko;break}}function Go(t){for(var e=t;!qo()&&(t=Jo())!==e;);}var Xo,Yo="__r";function Qo(t,e,n){var r=Xo;return function o(){var i=e.apply(null,arguments);null!==i&&ni(t,o,n,r)}}var ti=mn&&!(Q&&Number(Q[1])<=53);function ei(t,e,n,r){if(ti){var o=We,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}Xo.addEventListener(t,e,et?{capture:n,passive:r}:n)}function ni(t,e,n,r){(r||Xo).removeEventListener(t,e._wrapper||e,n)}function ri(t,e){if(!n(t.data.on)||!n(e.data.on)){var o=e.data.on||{},i=t.data.on||{};Xo=e.elm||t.elm,function(t){if(r(t.__r)){var e=W?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}r(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(o),Wt(o,i,ei,ni,Qo,e.context),Xo=void 0}}var oi,ii={create:ri,update:ri,destroy:function(t){return ri(t,io)}};function ai(t,e){if(!n(t.data.domProps)||!n(e.data.domProps)){var i,a,s=e.elm,c=t.data.domProps||{},u=e.data.domProps||{};for(i in(r(u.__ob__)||o(u._v_attr_proxy))&&(u=e.data.domProps=T({},u)),c)i in u||(s[i]="");for(i in u){if(a=u[i],"textContent"===i||"innerHTML"===i){if(e.children&&(e.children.length=0),a===c[i])continue;1===s.childNodes.length&&s.removeChild(s.childNodes[0])}if("value"===i&&"PROGRESS"!==s.tagName){s._value=a;var l=n(a)?"":String(a);si(s,l)&&(s.value=l)}else if("innerHTML"===i&&Zr(s.tagName)&&n(s.innerHTML)){(oi=oi||document.createElement("div")).innerHTML="".concat(a,"");for(var f=oi.firstChild;s.firstChild;)s.removeChild(s.firstChild);for(;f.firstChild;)s.appendChild(f.firstChild)}else if(a!==c[i])try{s[i]=a}catch(t){}}}}function si(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,o=t._vModifiers;if(r(o)){if(o.number)return p(n)!==p(e);if(o.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var ci={create:ai,update:ai},ui=b((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function li(t){var e=fi(t.style);return t.staticStyle?T(t.staticStyle,e):e}function fi(t){return Array.isArray(t)?A(t):"string"==typeof t?ui(t):t}var di,pi=/^--/,vi=/\s*!important$/,hi=function(t,e,n){if(pi.test(e))t.style.setProperty(e,n);else if(vi.test(n))t.style.setProperty(k(e),n.replace(vi,""),"important");else{var r=gi(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(bi).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" ".concat(t.getAttribute("class")||""," ");n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function wi(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(bi).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" ".concat(t.getAttribute("class")||""," "),r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function xi(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&T(e,Ci(t.name||"v")),T(e,t),e}return"string"==typeof t?Ci(t):void 0}}var Ci=b((function(t){return{enterClass:"".concat(t,"-enter"),enterToClass:"".concat(t,"-enter-to"),enterActiveClass:"".concat(t,"-enter-active"),leaveClass:"".concat(t,"-leave"),leaveToClass:"".concat(t,"-leave-to"),leaveActiveClass:"".concat(t,"-leave-active")}})),ki=J&&!Z,Si="transition",Oi="animation",Ti="transition",Ai="transitionend",ji="animation",Ei="animationend";ki&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Ti="WebkitTransition",Ai="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(ji="WebkitAnimation",Ei="webkitAnimationEnd"));var Ni=J?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Pi(t){Ni((function(){Ni(t)}))}function Di(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),$i(t,e))}function Mi(t,e){t._transitionClasses&&g(t._transitionClasses,e),wi(t,e)}function Ii(t,e,n){var r=Ri(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s=o===Si?Ai:Ei,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout((function(){c0&&(n=Si,l=a,f=i.length):e===Oi?u>0&&(n=Oi,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Si:Oi:null)?n===Si?i.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Si&&Li.test(r[Ti+"Property"])}}function Fi(t,e){for(;t.length1}function Ki(t,e){!0!==e.data.show&&Bi(e)}var Ji=function(t){var a,s,c={},u=t.modules,l=t.nodeOps;for(a=0;av?b(t,n(o[g+1])?null:o[g+1].elm,o,p,g,i):p>g&&w(e,f,v)}(f,h,m,i,u):r(m)?(r(t.text)&&l.setTextContent(f,""),b(f,null,m,0,m.length-1,i)):r(h)?w(h,0,h.length-1):r(t.text)&&l.setTextContent(f,""):t.text!==e.text&&l.setTextContent(f,e.text),r(v)&&r(p=v.hook)&&r(p=p.postpatch)&&p(t,e)}}}function S(t,e,n){if(o(n)&&r(t.parent))t.parent.data.pendingInsert=e;else for(var i=0;i-1,a.selected!==i&&(a.selected=i);else if(P(Xi(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function Gi(t,e){return e.every((function(e){return!P(e,t)}))}function Xi(t){return"_value"in t?t._value:t.value}function Yi(t){t.target.composing=!0}function Qi(t){t.target.composing&&(t.target.composing=!1,ta(t.target,"input"))}function ta(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function ea(t){return!t.componentInstance||t.data&&t.data.transition?t:ea(t.componentInstance._vnode)}var na={bind:function(t,e,n){var r=e.value,o=(n=ea(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,Bi(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=ea(n)).data&&n.data.transition?(n.data.show=!0,r?Bi(n,(function(){t.style.display=t.__vOriginalDisplay})):Ui(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}},ra={model:qi,show:na},oa={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ia(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?ia(Ee(e.children)):t}function aa(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var r in o)e[w(r)]=o[r];return e}function sa(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var ca=function(t){return t.tag||_e(t)},ua=function(t){return"show"===t.name},la={name:"transition",props:oa,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(ca)).length){var r=this.mode,o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var a=ia(o);if(!a)return o;if(this._leaving)return sa(t,o);var s="__transition-".concat(this._uid,"-");a.key=null==a.key?a.isComment?s+"comment":s+a.tag:i(a.key)?0===String(a.key).indexOf(s)?a.key:s+a.key:a.key;var c=(a.data||(a.data={})).transition=aa(this),u=this._vnode,l=ia(u);if(a.data.directives&&a.data.directives.some(ua)&&(a.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(a,l)&&!_e(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=T({},c);if("out-in"===r)return this._leaving=!0,Zt(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),sa(t,o);if("in-out"===r){if(_e(a))return u;var d,p=function(){d()};Zt(c,"afterEnter",p),Zt(c,"enterCancelled",p),Zt(f,"delayLeave",(function(t){d=t}))}}return o}}},fa=T({tag:String,moveClass:String},oa);delete fa.mode;var da={props:fa,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=Le(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=aa(this),s=0;s-1?Yr[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Yr[t]=/HTMLUnknownElement/.test(e.toString())},T(Cr.options.directives,ra),T(Cr.options.components,ma),Cr.prototype.__patch__=J?Ji:j,Cr.prototype.$mount=function(t,e){return function(t,e,n){var r;t.$el=e,t.$options.render||(t.$options.render=ft),Be(t,"beforeMount"),r=function(){t._update(t._render(),n)},new Vn(t,r,j,{before:function(){t._isMounted&&!t._isDestroyed&&Be(t,"beforeUpdate")}},!0),n=!1;var o=t._preWatchers;if(o)for(var i=0;i\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ta=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Aa="[a-zA-Z_][\\-\\.0-9_a-zA-Z".concat(B.source,"]*"),ja="((?:".concat(Aa,"\\:)?").concat(Aa,")"),Ea=new RegExp("^<".concat(ja)),Na=/^\s*(\/?)>/,Pa=new RegExp("^<\\/".concat(ja,"[^>]*>")),Da=/^]+>/i,Ma=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Ha=/&(?:lt|gt|quot|amp|#39);/g,Ba=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Ua=v("pre,textarea",!0),za=function(t,e){return t&&Ua(t)&&"\n"===e[0]};function Va(t,e){var n=e?Ba:Ha;return t.replace(n,(function(t){return Fa[t]}))}function Ka(t,e){for(var n,r,o=[],i=e.expectHTML,a=e.isUnaryTag||E,s=e.canBeLeftOpenTag||E,c=0,u=function(){if(n=t,r&&La(r)){var u=0,d=r.toLowerCase(),p=Ra[d]||(Ra[d]=new RegExp("([\\s\\S]*?)(]*>)","i"));w=t.replace(p,(function(t,n,r){return u=r.length,La(d)||"noscript"===d||(n=n.replace(//g,"$1").replace(//g,"$1")),za(d,n)&&(n=n.slice(1)),e.chars&&e.chars(n),""}));c+=t.length-w.length,t=w,f(d,c-u,c)}else{var v=t.indexOf("<");if(0===v){if(Ma.test(t)){var h=t.indexOf("--\x3e");if(h>=0)return e.shouldKeepComment&&e.comment&&e.comment(t.substring(4,h),c,c+h+3),l(h+3),"continue"}if(Ia.test(t)){var m=t.indexOf("]>");if(m>=0)return l(m+2),"continue"}var g=t.match(Da);if(g)return l(g[0].length),"continue";var y=t.match(Pa);if(y){var _=c;return l(y[0].length),f(y[1],_,c),"continue"}var b=function(){var e=t.match(Ea);if(e){var n={tagName:e[1],attrs:[],start:c};l(e[0].length);for(var r=void 0,o=void 0;!(r=t.match(Na))&&(o=t.match(Ta)||t.match(Oa));)o.start=c,l(o[0].length),o.end=c,n.attrs.push(o);if(r)return n.unarySlash=r[1],l(r[0].length),n.end=c,n}}();if(b)return function(t){var n=t.tagName,c=t.unarySlash;i&&("p"===r&&Sa(n)&&f(r),s(n)&&r===n&&f(n));for(var u=a(n)||!!c,l=t.attrs.length,d=new Array(l),p=0;p=0){for(w=t.slice(v);!(Pa.test(w)||Ea.test(w)||Ma.test(w)||Ia.test(w)||(x=w.indexOf("<",1))<0);)v+=x,w=t.slice(v);$=t.substring(0,v)}v<0&&($=t),$&&l($.length),e.chars&&$&&e.chars($,c-$.length,c)}if(t===n)return e.chars&&e.chars(t),"break"};t;){if("break"===u())break}function l(e){c+=e,t=t.substring(e)}function f(t,n,i){var a,s;if(null==n&&(n=c),null==i&&(i=c),t)for(s=t.toLowerCase(),a=o.length-1;a>=0&&o[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=o.length-1;u>=a;u--)e.end&&e.end(o[u].tag,n,i);o.length=a,r=a&&o[a-1].tag}else"br"===s?e.start&&e.start(t,[],!0,n,i):"p"===s&&(e.start&&e.start(t,[],!1,n,i),e.end&&e.end(t,n,i))}f()}var Ja,qa,Wa,Za,Ga,Xa,Ya,Qa,ts=/^@|^v-on:/,es=/^v-|^@|^:|^#/,ns=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,rs=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,os=/^\(|\)$/g,is=/^\[.*\]$/,as=/:(.*)$/,ss=/^:|^\.|^v-bind:/,cs=/\.[^.\]]+(?=[^\]]*$)/g,us=/^v-slot(:|$)|^#/,ls=/[\r\n]/,fs=/[ \f\t\r\n]+/g,ds=b(xa),ps="_empty_";function vs(t,e,n){return{type:1,tag:t,attrsList:e,attrsMap:$s(e),rawAttrsMap:{},parent:n,children:[]}}function hs(t,e){Ja=e.warn||No,Xa=e.isPreTag||E,Ya=e.mustUseProp||E,Qa=e.getTagNamespace||E,e.isReservedTag,Wa=Po(e.modules,"transformNode"),Za=Po(e.modules,"preTransformNode"),Ga=Po(e.modules,"postTransformNode"),qa=e.delimiters;var n,r,o=[],i=!1!==e.preserveWhitespace,a=e.whitespace,s=!1,c=!1;function u(t){if(l(t),s||t.processed||(t=ms(t,e)),o.length||t===n||n.if&&(t.elseif||t.else)&&ys(n,{exp:t.elseif,block:t}),r&&!t.forbidden)if(t.elseif||t.else)a=t,u=function(t){for(var e=t.length;e--;){if(1===t[e].type)return t[e];t.pop()}}(r.children),u&&u.if&&ys(u,{exp:a.elseif,block:a});else{if(t.slotScope){var i=t.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[i]=t}r.children.push(t),t.parent=r}var a,u;t.children=t.children.filter((function(t){return!t.slotScope})),l(t),t.pre&&(s=!1),Xa(t.tag)&&(c=!1);for(var f=0;fc&&(s.push(i=t.slice(c,o)),a.push(JSON.stringify(i)));var u=jo(r[1].trim());a.push("_s(".concat(u,")")),s.push({"@binding":u}),c=o+r[0].length}return c-1")+("true"===i?":(".concat(e,")"):":_q(".concat(e,",").concat(i,")"))),Fo(t,"change","var $$a=".concat(e,",")+"$$el=$event.target,"+"$$c=$$el.checked?(".concat(i,"):(").concat(a,");")+"if(Array.isArray($$a)){"+"var $$v=".concat(r?"_n("+o+")":o,",")+"$$i=_i($$a,$$v);"+"if($$el.checked){$$i<0&&(".concat(Ko(e,"$$a.concat([$$v])"),")}")+"else{$$i>-1&&(".concat(Ko(e,"$$a.slice(0,$$i).concat($$a.slice($$i+1))"),")}")+"}else{".concat(Ko(e,"$$c"),"}"),null,!0)}(t,r,o);else if("input"===i&&"radio"===a)!function(t,e,n){var r=n&&n.number,o=Ho(t,"value")||"null";o=r?"_n(".concat(o,")"):o,Do(t,"checked","_q(".concat(e,",").concat(o,")")),Fo(t,"change",Ko(e,o),null,!0)}(t,r,o);else if("input"===i||"textarea"===i)!function(t,e,n){var r=t.attrsMap.type,o=n||{},i=o.lazy,a=o.number,s=o.trim,c=!i&&"range"!==r,u=i?"change":"range"===r?Yo:"input",l="$event.target.value";s&&(l="$event.target.value.trim()");a&&(l="_n(".concat(l,")"));var f=Ko(e,l);c&&(f="if($event.target.composing)return;".concat(f));Do(t,"value","(".concat(e,")")),Fo(t,u,f,null,!0),(s||a)&&Fo(t,"blur","$forceUpdate()")}(t,r,o);else if(!H.isReservedTag(i))return Vo(t,r,o),!1;return!0},text:function(t,e){e.value&&Do(t,"textContent","_s(".concat(e.value,")"),e)},html:function(t,e){e.value&&Do(t,"innerHTML","_s(".concat(e.value,")"),e)}},As={expectHTML:!0,modules:ks,directives:Ts,isPreTag:function(t){return"pre"===t},isUnaryTag:Ca,mustUseProp:Mr,canBeLeftOpenTag:ka,isReservedTag:Gr,getTagNamespace:Xr,staticKeys:function(t){return t.reduce((function(t,e){return t.concat(e.staticKeys||[])}),[]).join(",")}(ks)},js=b((function(t){return v("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(t?","+t:""))}));function Es(t,e){t&&(Ss=js(e.staticKeys||""),Os=e.isReservedTag||E,Ns(t),Ps(t,!1))}function Ns(t){if(t.static=function(t){if(2===t.type)return!1;if(3===t.type)return!0;return!(!t.pre&&(t.hasBindings||t.if||t.for||h(t.tag)||!Os(t.tag)||function(t){for(;t.parent;){if("template"!==(t=t.parent).tag)return!1;if(t.for)return!0}return!1}(t)||!Object.keys(t).every(Ss)))}(t),1===t.type){if(!Os(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var e=0,n=t.children.length;e|^function(?:\s+[\w$]+)?\s*\(/,Ms=/\([^)]*?\);*$/,Is=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Ls={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Rs={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Fs=function(t){return"if(".concat(t,")return null;")},Hs={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Fs("$event.target !== $event.currentTarget"),ctrl:Fs("!$event.ctrlKey"),shift:Fs("!$event.shiftKey"),alt:Fs("!$event.altKey"),meta:Fs("!$event.metaKey"),left:Fs("'button' in $event && $event.button !== 0"),middle:Fs("'button' in $event && $event.button !== 1"),right:Fs("'button' in $event && $event.button !== 2")};function Bs(t,e){var n=e?"nativeOn:":"on:",r="",o="";for(var i in t){var a=Us(t[i]);t[i]&&t[i].dynamic?o+="".concat(i,",").concat(a,","):r+='"'.concat(i,'":').concat(a,",")}return r="{".concat(r.slice(0,-1),"}"),o?n+"_d(".concat(r,",[").concat(o.slice(0,-1),"])"):n+r}function Us(t){if(!t)return"function(){}";if(Array.isArray(t))return"[".concat(t.map((function(t){return Us(t)})).join(","),"]");var e=Is.test(t.value),n=Ds.test(t.value),r=Is.test(t.value.replace(Ms,""));if(t.modifiers){var o="",i="",a=[],s=function(e){if(Hs[e])i+=Hs[e],Ls[e]&&a.push(e);else if("exact"===e){var n=t.modifiers;i+=Fs(["ctrl","shift","alt","meta"].filter((function(t){return!n[t]})).map((function(t){return"$event.".concat(t,"Key")})).join("||"))}else a.push(e)};for(var c in t.modifiers)s(c);a.length&&(o+=function(t){return"if(!$event.type.indexOf('key')&&"+"".concat(t.map(zs).join("&&"),")return null;")}(a)),i&&(o+=i);var u=e?"return ".concat(t.value,".apply(null, arguments)"):n?"return (".concat(t.value,").apply(null, arguments)"):r?"return ".concat(t.value):t.value;return"function($event){".concat(o).concat(u,"}")}return e||n?t.value:"function($event){".concat(r?"return ".concat(t.value):t.value,"}")}function zs(t){var e=parseInt(t,10);if(e)return"$event.keyCode!==".concat(e);var n=Ls[t],r=Rs[t];return"_k($event.keyCode,"+"".concat(JSON.stringify(t),",")+"".concat(JSON.stringify(n),",")+"$event.key,"+"".concat(JSON.stringify(r))+")"}var Vs={on:function(t,e){t.wrapListeners=function(t){return"_g(".concat(t,",").concat(e.value,")")}},bind:function(t,e){t.wrapData=function(n){return"_b(".concat(n,",'").concat(t.tag,"',").concat(e.value,",").concat(e.modifiers&&e.modifiers.prop?"true":"false").concat(e.modifiers&&e.modifiers.sync?",true":"",")")}},cloak:j},Ks=function(t){this.options=t,this.warn=t.warn||No,this.transforms=Po(t.modules,"transformCode"),this.dataGenFns=Po(t.modules,"genData"),this.directives=T(T({},Vs),t.directives);var e=t.isReservedTag||E;this.maybeComponent=function(t){return!!t.component||!e(t.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Js(t,e){var n=new Ks(e),r=t?"script"===t.tag?"null":qs(t,n):'_c("div")';return{render:"with(this){return ".concat(r,"}"),staticRenderFns:n.staticRenderFns}}function qs(t,e){if(t.parent&&(t.pre=t.pre||t.parent.pre),t.staticRoot&&!t.staticProcessed)return Ws(t,e);if(t.once&&!t.onceProcessed)return Zs(t,e);if(t.for&&!t.forProcessed)return Ys(t,e);if(t.if&&!t.ifProcessed)return Gs(t,e);if("template"!==t.tag||t.slotTarget||e.pre){if("slot"===t.tag)return function(t,e){var n=t.slotName||'"default"',r=nc(t,e),o="_t(".concat(n).concat(r?",function(){return ".concat(r,"}"):""),i=t.attrs||t.dynamicAttrs?ic((t.attrs||[]).concat(t.dynamicAttrs||[]).map((function(t){return{name:w(t.name),value:t.value,dynamic:t.dynamic}}))):null,a=t.attrsMap["v-bind"];!i&&!a||r||(o+=",null");i&&(o+=",".concat(i));a&&(o+="".concat(i?"":",null",",").concat(a));return o+")"}(t,e);var n=void 0;if(t.component)n=function(t,e,n){var r=e.inlineTemplate?null:nc(e,n,!0);return"_c(".concat(t,",").concat(Qs(e,n)).concat(r?",".concat(r):"",")")}(t.component,t,e);else{var r=void 0,o=e.maybeComponent(t);(!t.plain||t.pre&&o)&&(r=Qs(t,e));var i=void 0,a=e.options.bindings;o&&a&&!1!==a.__isScriptSetup&&(i=function(t,e){var n=w(e),r=x(n),o=function(o){return t[e]===o?e:t[n]===o?n:t[r]===o?r:void 0},i=o("setup-const")||o("setup-reactive-const");if(i)return i;var a=o("setup-let")||o("setup-ref")||o("setup-maybe-ref");if(a)return a}(a,t.tag)),i||(i="'".concat(t.tag,"'"));var s=t.inlineTemplate?null:nc(t,e,!0);n="_c(".concat(i).concat(r?",".concat(r):"").concat(s?",".concat(s):"",")")}for(var c=0;c>>0}(a)):"",")")}(t,t.scopedSlots,e),",")),t.model&&(n+="model:{value:".concat(t.model.value,",callback:").concat(t.model.callback,",expression:").concat(t.model.expression,"},")),t.inlineTemplate){var i=function(t,e){var n=t.children[0];if(n&&1===n.type){var r=Js(n,e.options);return"inlineTemplate:{render:function(){".concat(r.render,"},staticRenderFns:[").concat(r.staticRenderFns.map((function(t){return"function(){".concat(t,"}")})).join(","),"]}")}}(t,e);i&&(n+="".concat(i,","))}return n=n.replace(/,$/,"")+"}",t.dynamicAttrs&&(n="_b(".concat(n,',"').concat(t.tag,'",').concat(ic(t.dynamicAttrs),")")),t.wrapData&&(n=t.wrapData(n)),t.wrapListeners&&(n=t.wrapListeners(n)),n}function tc(t){return 1===t.type&&("slot"===t.tag||t.children.some(tc))}function ec(t,e){var n=t.attrsMap["slot-scope"];if(t.if&&!t.ifProcessed&&!n)return Gs(t,e,ec,"null");if(t.for&&!t.forProcessed)return Ys(t,e,ec);var r=t.slotScope===ps?"":String(t.slotScope),o="function(".concat(r,"){")+"return ".concat("template"===t.tag?t.if&&n?"(".concat(t.if,")?").concat(nc(t,e)||"undefined",":undefined"):nc(t,e)||"undefined":qs(t,e),"}"),i=r?"":",proxy:true";return"{key:".concat(t.slotTarget||'"default"',",fn:").concat(o).concat(i,"}")}function nc(t,e,n,r,o){var i=t.children;if(i.length){var a=i[0];if(1===i.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?e.maybeComponent(a)?",1":",0":"";return"".concat((r||qs)(a,e)).concat(s)}var c=n?function(t,e){for(var n=0,r=0;r':'
',lc.innerHTML.indexOf(" ")>0}var vc=!!J&&pc(!1),hc=!!J&&pc(!0),mc=b((function(t){var e=to(t);return e&&e.innerHTML})),gc=Cr.prototype.$mount;return Cr.prototype.$mount=function(t,e){if((t=t&&to(t))===document.body||t===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=mc(r));else{if(!r.nodeType)return this;r=r.innerHTML}else t&&(r=function(t){if(t.outerHTML)return t.outerHTML;var e=document.createElement("div");return e.appendChild(t.cloneNode(!0)),e.innerHTML}(t));if(r){var o=dc(r,{outputSourceRange:!1,shouldDecodeNewlines:vc,shouldDecodeNewlinesForHref:hc,delimiters:n.delimiters,comments:n.comments},this),i=o.render,a=o.staticRenderFns;n.render=i,n.staticRenderFns=a}}return gc.call(this,t,e)},Cr.compile=dc,T(Cr,Fn),Cr.effect=function(t,e){var n=new Vn(ct,t,j,{sync:!0});e&&(n.update=function(){e((function(){return n.run()}))})},Cr})); \ No newline at end of file diff --git a/Web/utility/vue_dev.js b/Web/utility/vue_dev.js new file mode 100644 index 0000000..49ad25b --- /dev/null +++ b/Web/utility/vue_dev.js @@ -0,0 +1,11909 @@ +/*! + * Vue.js v2.7.14 + * (c) 2014-2022 Evan You + * Released under the MIT License. + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Vue = factory()); +})(this, (function () { 'use strict'; + + var emptyObject = Object.freeze({}); + var isArray = Array.isArray; + // These helpers produce better VM code in JS engines due to their + // explicitness and function inlining. + function isUndef(v) { + return v === undefined || v === null; + } + function isDef(v) { + return v !== undefined && v !== null; + } + function isTrue(v) { + return v === true; + } + function isFalse(v) { + return v === false; + } + /** + * Check if value is primitive. + */ + function isPrimitive(value) { + return (typeof value === 'string' || + typeof value === 'number' || + // $flow-disable-line + typeof value === 'symbol' || + typeof value === 'boolean'); + } + function isFunction(value) { + return typeof value === 'function'; + } + /** + * Quick object check - this is primarily used to tell + * objects from primitive values when we know the value + * is a JSON-compliant type. + */ + function isObject(obj) { + return obj !== null && typeof obj === 'object'; + } + /** + * Get the raw type string of a value, e.g., [object Object]. + */ + var _toString = Object.prototype.toString; + function toRawType(value) { + return _toString.call(value).slice(8, -1); + } + /** + * Strict object type check. Only returns true + * for plain JavaScript objects. + */ + function isPlainObject(obj) { + return _toString.call(obj) === '[object Object]'; + } + function isRegExp(v) { + return _toString.call(v) === '[object RegExp]'; + } + /** + * Check if val is a valid array index. + */ + function isValidArrayIndex(val) { + var n = parseFloat(String(val)); + return n >= 0 && Math.floor(n) === n && isFinite(val); + } + function isPromise(val) { + return (isDef(val) && + typeof val.then === 'function' && + typeof val.catch === 'function'); + } + /** + * Convert a value to a string that is actually rendered. + */ + function toString(val) { + return val == null + ? '' + : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString) + ? JSON.stringify(val, null, 2) + : String(val); + } + /** + * Convert an input value to a number for persistence. + * If the conversion fails, return original string. + */ + function toNumber(val) { + var n = parseFloat(val); + return isNaN(n) ? val : n; + } + /** + * Make a map and return a function for checking if a key + * is in that map. + */ + function makeMap(str, expectsLowerCase) { + var map = Object.create(null); + var list = str.split(','); + for (var i = 0; i < list.length; i++) { + map[list[i]] = true; + } + return expectsLowerCase ? function (val) { return map[val.toLowerCase()]; } : function (val) { return map[val]; }; + } + /** + * Check if a tag is a built-in tag. + */ + var isBuiltInTag = makeMap('slot,component', true); + /** + * Check if an attribute is a reserved attribute. + */ + var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is'); + /** + * Remove an item from an array. + */ + function remove$2(arr, item) { + var len = arr.length; + if (len) { + // fast path for the only / last item + if (item === arr[len - 1]) { + arr.length = len - 1; + return; + } + var index = arr.indexOf(item); + if (index > -1) { + return arr.splice(index, 1); + } + } + } + /** + * Check whether an object has the property. + */ + var hasOwnProperty = Object.prototype.hasOwnProperty; + function hasOwn(obj, key) { + return hasOwnProperty.call(obj, key); + } + /** + * Create a cached version of a pure function. + */ + function cached(fn) { + var cache = Object.create(null); + return function cachedFn(str) { + var hit = cache[str]; + return hit || (cache[str] = fn(str)); + }; + } + /** + * Camelize a hyphen-delimited string. + */ + var camelizeRE = /-(\w)/g; + var camelize = cached(function (str) { + return str.replace(camelizeRE, function (_, c) { return (c ? c.toUpperCase() : ''); }); + }); + /** + * Capitalize a string. + */ + var capitalize = cached(function (str) { + return str.charAt(0).toUpperCase() + str.slice(1); + }); + /** + * Hyphenate a camelCase string. + */ + var hyphenateRE = /\B([A-Z])/g; + var hyphenate = cached(function (str) { + return str.replace(hyphenateRE, '-$1').toLowerCase(); + }); + /** + * Simple bind polyfill for environments that do not support it, + * e.g., PhantomJS 1.x. Technically, we don't need this anymore + * since native bind is now performant enough in most browsers. + * But removing it would mean breaking code that was able to run in + * PhantomJS 1.x, so this must be kept for backward compatibility. + */ + /* istanbul ignore next */ + function polyfillBind(fn, ctx) { + function boundFn(a) { + var l = arguments.length; + return l + ? l > 1 + ? fn.apply(ctx, arguments) + : fn.call(ctx, a) + : fn.call(ctx); + } + boundFn._length = fn.length; + return boundFn; + } + function nativeBind(fn, ctx) { + return fn.bind(ctx); + } + // @ts-expect-error bind cannot be `undefined` + var bind$1 = Function.prototype.bind ? nativeBind : polyfillBind; + /** + * Convert an Array-like object to a real Array. + */ + function toArray(list, start) { + start = start || 0; + var i = list.length - start; + var ret = new Array(i); + while (i--) { + ret[i] = list[i + start]; + } + return ret; + } + /** + * Mix properties into target object. + */ + function extend(to, _from) { + for (var key in _from) { + to[key] = _from[key]; + } + return to; + } + /** + * Merge an Array of Objects into a single Object. + */ + function toObject(arr) { + var res = {}; + for (var i = 0; i < arr.length; i++) { + if (arr[i]) { + extend(res, arr[i]); + } + } + return res; + } + /* eslint-disable no-unused-vars */ + /** + * Perform no operation. + * Stubbing args to make Flow happy without leaving useless transpiled code + * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/). + */ + function noop(a, b, c) { } + /** + * Always return false. + */ + var no = function (a, b, c) { return false; }; + /* eslint-enable no-unused-vars */ + /** + * Return the same value. + */ + var identity = function (_) { return _; }; + /** + * Generate a string containing static keys from compiler modules. + */ + function genStaticKeys$1(modules) { + return modules + .reduce(function (keys, m) { + return keys.concat(m.staticKeys || []); + }, []) + .join(','); + } + /** + * Check if two values are loosely equal - that is, + * if they are plain objects, do they have the same shape? + */ + function looseEqual(a, b) { + if (a === b) + return true; + var isObjectA = isObject(a); + var isObjectB = isObject(b); + if (isObjectA && isObjectB) { + try { + var isArrayA = Array.isArray(a); + var isArrayB = Array.isArray(b); + if (isArrayA && isArrayB) { + return (a.length === b.length && + a.every(function (e, i) { + return looseEqual(e, b[i]); + })); + } + else if (a instanceof Date && b instanceof Date) { + return a.getTime() === b.getTime(); + } + else if (!isArrayA && !isArrayB) { + var keysA = Object.keys(a); + var keysB = Object.keys(b); + return (keysA.length === keysB.length && + keysA.every(function (key) { + return looseEqual(a[key], b[key]); + })); + } + else { + /* istanbul ignore next */ + return false; + } + } + catch (e) { + /* istanbul ignore next */ + return false; + } + } + else if (!isObjectA && !isObjectB) { + return String(a) === String(b); + } + else { + return false; + } + } + /** + * Return the first index at which a loosely equal value can be + * found in the array (if value is a plain object, the array must + * contain an object of the same shape), or -1 if it is not present. + */ + function looseIndexOf(arr, val) { + for (var i = 0; i < arr.length; i++) { + if (looseEqual(arr[i], val)) + return i; + } + return -1; + } + /** + * Ensure a function is called only once. + */ + function once(fn) { + var called = false; + return function () { + if (!called) { + called = true; + fn.apply(this, arguments); + } + }; + } + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is#polyfill + function hasChanged(x, y) { + if (x === y) { + return x === 0 && 1 / x !== 1 / y; + } + else { + return x === x || y === y; + } + } + + var SSR_ATTR = 'data-server-rendered'; + var ASSET_TYPES = ['component', 'directive', 'filter']; + var LIFECYCLE_HOOKS = [ + 'beforeCreate', + 'created', + 'beforeMount', + 'mounted', + 'beforeUpdate', + 'updated', + 'beforeDestroy', + 'destroyed', + 'activated', + 'deactivated', + 'errorCaptured', + 'serverPrefetch', + 'renderTracked', + 'renderTriggered' + ]; + + var config = { + /** + * Option merge strategies (used in core/util/options) + */ + // $flow-disable-line + optionMergeStrategies: Object.create(null), + /** + * Whether to suppress warnings. + */ + silent: false, + /** + * Show production mode tip message on boot? + */ + productionTip: true, + /** + * Whether to enable devtools + */ + devtools: true, + /** + * Whether to record perf + */ + performance: false, + /** + * Error handler for watcher errors + */ + errorHandler: null, + /** + * Warn handler for watcher warns + */ + warnHandler: null, + /** + * Ignore certain custom elements + */ + ignoredElements: [], + /** + * Custom user key aliases for v-on + */ + // $flow-disable-line + keyCodes: Object.create(null), + /** + * Check if a tag is reserved so that it cannot be registered as a + * component. This is platform-dependent and may be overwritten. + */ + isReservedTag: no, + /** + * Check if an attribute is reserved so that it cannot be used as a component + * prop. This is platform-dependent and may be overwritten. + */ + isReservedAttr: no, + /** + * Check if a tag is an unknown element. + * Platform-dependent. + */ + isUnknownElement: no, + /** + * Get the namespace of an element + */ + getTagNamespace: noop, + /** + * Parse the real tag name for the specific platform. + */ + parsePlatformTagName: identity, + /** + * Check if an attribute must be bound using property, e.g. value + * Platform-dependent. + */ + mustUseProp: no, + /** + * Perform updates asynchronously. Intended to be used by Vue Test Utils + * This will significantly reduce performance if set to false. + */ + async: true, + /** + * Exposed for legacy reasons + */ + _lifecycleHooks: LIFECYCLE_HOOKS + }; + + /** + * unicode letters used for parsing html tags, component names and property paths. + * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname + * skipping \u10000-\uEFFFF due to it freezing up PhantomJS + */ + var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/; + /** + * Check if a string starts with $ or _ + */ + function isReserved(str) { + var c = (str + '').charCodeAt(0); + return c === 0x24 || c === 0x5f; + } + /** + * Define a property. + */ + function def(obj, key, val, enumerable) { + Object.defineProperty(obj, key, { + value: val, + enumerable: !!enumerable, + writable: true, + configurable: true + }); + } + /** + * Parse simple path. + */ + var bailRE = new RegExp("[^".concat(unicodeRegExp.source, ".$_\\d]")); + function parsePath(path) { + if (bailRE.test(path)) { + return; + } + var segments = path.split('.'); + return function (obj) { + for (var i = 0; i < segments.length; i++) { + if (!obj) + return; + obj = obj[segments[i]]; + } + return obj; + }; + } + + // can we use __proto__? + var hasProto = '__proto__' in {}; + // Browser environment sniffing + var inBrowser = typeof window !== 'undefined'; + var UA = inBrowser && window.navigator.userAgent.toLowerCase(); + var isIE = UA && /msie|trident/.test(UA); + var isIE9 = UA && UA.indexOf('msie 9.0') > 0; + var isEdge = UA && UA.indexOf('edge/') > 0; + UA && UA.indexOf('android') > 0; + var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA); + UA && /chrome\/\d+/.test(UA) && !isEdge; + UA && /phantomjs/.test(UA); + var isFF = UA && UA.match(/firefox\/(\d+)/); + // Firefox has a "watch" function on Object.prototype... + // @ts-expect-error firebox support + var nativeWatch = {}.watch; + var supportsPassive = false; + if (inBrowser) { + try { + var opts = {}; + Object.defineProperty(opts, 'passive', { + get: function () { + /* istanbul ignore next */ + supportsPassive = true; + } + }); // https://github.com/facebook/flow/issues/285 + window.addEventListener('test-passive', null, opts); + } + catch (e) { } + } + // this needs to be lazy-evaled because vue may be required before + // vue-server-renderer can set VUE_ENV + var _isServer; + var isServerRendering = function () { + if (_isServer === undefined) { + /* istanbul ignore if */ + if (!inBrowser && typeof global !== 'undefined') { + // detect presence of vue-server-renderer and avoid + // Webpack shimming the process + _isServer = + global['process'] && global['process'].env.VUE_ENV === 'server'; + } + else { + _isServer = false; + } + } + return _isServer; + }; + // detect devtools + var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; + /* istanbul ignore next */ + function isNative(Ctor) { + return typeof Ctor === 'function' && /native code/.test(Ctor.toString()); + } + var hasSymbol = typeof Symbol !== 'undefined' && + isNative(Symbol) && + typeof Reflect !== 'undefined' && + isNative(Reflect.ownKeys); + var _Set; // $flow-disable-line + /* istanbul ignore if */ if (typeof Set !== 'undefined' && isNative(Set)) { + // use native Set when available. + _Set = Set; + } + else { + // a non-standard Set polyfill that only works with primitive keys. + _Set = /** @class */ (function () { + function Set() { + this.set = Object.create(null); + } + Set.prototype.has = function (key) { + return this.set[key] === true; + }; + Set.prototype.add = function (key) { + this.set[key] = true; + }; + Set.prototype.clear = function () { + this.set = Object.create(null); + }; + return Set; + }()); + } + + var currentInstance = null; + /** + * This is exposed for compatibility with v3 (e.g. some functions in VueUse + * relies on it). Do not use this internally, just use `currentInstance`. + * + * @internal this function needs manual type declaration because it relies + * on previously manually authored types from Vue 2 + */ + function getCurrentInstance() { + return currentInstance && { proxy: currentInstance }; + } + /** + * @internal + */ + function setCurrentInstance(vm) { + if (vm === void 0) { vm = null; } + if (!vm) + currentInstance && currentInstance._scope.off(); + currentInstance = vm; + vm && vm._scope.on(); + } + + /** + * @internal + */ + var VNode = /** @class */ (function () { + function VNode(tag, data, children, text, elm, context, componentOptions, asyncFactory) { + this.tag = tag; + this.data = data; + this.children = children; + this.text = text; + this.elm = elm; + this.ns = undefined; + this.context = context; + this.fnContext = undefined; + this.fnOptions = undefined; + this.fnScopeId = undefined; + this.key = data && data.key; + this.componentOptions = componentOptions; + this.componentInstance = undefined; + this.parent = undefined; + this.raw = false; + this.isStatic = false; + this.isRootInsert = true; + this.isComment = false; + this.isCloned = false; + this.isOnce = false; + this.asyncFactory = asyncFactory; + this.asyncMeta = undefined; + this.isAsyncPlaceholder = false; + } + Object.defineProperty(VNode.prototype, "child", { + // DEPRECATED: alias for componentInstance for backwards compat. + /* istanbul ignore next */ + get: function () { + return this.componentInstance; + }, + enumerable: false, + configurable: true + }); + return VNode; + }()); + var createEmptyVNode = function (text) { + if (text === void 0) { text = ''; } + var node = new VNode(); + node.text = text; + node.isComment = true; + return node; + }; + function createTextVNode(val) { + return new VNode(undefined, undefined, undefined, String(val)); + } + // optimized shallow clone + // used for static nodes and slot nodes because they may be reused across + // multiple renders, cloning them avoids errors when DOM manipulations rely + // on their elm reference. + function cloneVNode(vnode) { + var cloned = new VNode(vnode.tag, vnode.data, + // #7975 + // clone children array to avoid mutating original in case of cloning + // a child. + vnode.children && vnode.children.slice(), vnode.text, vnode.elm, vnode.context, vnode.componentOptions, vnode.asyncFactory); + cloned.ns = vnode.ns; + cloned.isStatic = vnode.isStatic; + cloned.key = vnode.key; + cloned.isComment = vnode.isComment; + cloned.fnContext = vnode.fnContext; + cloned.fnOptions = vnode.fnOptions; + cloned.fnScopeId = vnode.fnScopeId; + cloned.asyncMeta = vnode.asyncMeta; + cloned.isCloned = true; + return cloned; + } + + /* not type checking this file because flow doesn't play well with Proxy */ + var initProxy; + { + var allowedGlobals_1 = makeMap('Infinity,undefined,NaN,isFinite,isNaN,' + + 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + + 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,' + + 'require' // for Webpack/Browserify + ); + var warnNonPresent_1 = function (target, key) { + warn$2("Property or method \"".concat(key, "\" is not defined on the instance but ") + + 'referenced during render. Make sure that this property is reactive, ' + + 'either in the data option, or for class-based components, by ' + + 'initializing the property. ' + + 'See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.', target); + }; + var warnReservedPrefix_1 = function (target, key) { + warn$2("Property \"".concat(key, "\" must be accessed with \"$data.").concat(key, "\" because ") + + 'properties starting with "$" or "_" are not proxied in the Vue instance to ' + + 'prevent conflicts with Vue internals. ' + + 'See: https://v2.vuejs.org/v2/api/#data', target); + }; + var hasProxy_1 = typeof Proxy !== 'undefined' && isNative(Proxy); + if (hasProxy_1) { + var isBuiltInModifier_1 = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact'); + config.keyCodes = new Proxy(config.keyCodes, { + set: function (target, key, value) { + if (isBuiltInModifier_1(key)) { + warn$2("Avoid overwriting built-in modifier in config.keyCodes: .".concat(key)); + return false; + } + else { + target[key] = value; + return true; + } + } + }); + } + var hasHandler_1 = { + has: function (target, key) { + var has = key in target; + var isAllowed = allowedGlobals_1(key) || + (typeof key === 'string' && + key.charAt(0) === '_' && + !(key in target.$data)); + if (!has && !isAllowed) { + if (key in target.$data) + warnReservedPrefix_1(target, key); + else + warnNonPresent_1(target, key); + } + return has || !isAllowed; + } + }; + var getHandler_1 = { + get: function (target, key) { + if (typeof key === 'string' && !(key in target)) { + if (key in target.$data) + warnReservedPrefix_1(target, key); + else + warnNonPresent_1(target, key); + } + return target[key]; + } + }; + initProxy = function initProxy(vm) { + if (hasProxy_1) { + // determine which proxy handler to use + var options = vm.$options; + var handlers = options.render && options.render._withStripped ? getHandler_1 : hasHandler_1; + vm._renderProxy = new Proxy(vm, handlers); + } + else { + vm._renderProxy = vm; + } + }; + } + + /****************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var uid$2 = 0; + var pendingCleanupDeps = []; + var cleanupDeps = function () { + for (var i = 0; i < pendingCleanupDeps.length; i++) { + var dep = pendingCleanupDeps[i]; + dep.subs = dep.subs.filter(function (s) { return s; }); + dep._pending = false; + } + pendingCleanupDeps.length = 0; + }; + /** + * A dep is an observable that can have multiple + * directives subscribing to it. + * @internal + */ + var Dep = /** @class */ (function () { + function Dep() { + // pending subs cleanup + this._pending = false; + this.id = uid$2++; + this.subs = []; + } + Dep.prototype.addSub = function (sub) { + this.subs.push(sub); + }; + Dep.prototype.removeSub = function (sub) { + // #12696 deps with massive amount of subscribers are extremely slow to + // clean up in Chromium + // to workaround this, we unset the sub for now, and clear them on + // next scheduler flush. + this.subs[this.subs.indexOf(sub)] = null; + if (!this._pending) { + this._pending = true; + pendingCleanupDeps.push(this); + } + }; + Dep.prototype.depend = function (info) { + if (Dep.target) { + Dep.target.addDep(this); + if (info && Dep.target.onTrack) { + Dep.target.onTrack(__assign({ effect: Dep.target }, info)); + } + } + }; + Dep.prototype.notify = function (info) { + // stabilize the subscriber list first + var subs = this.subs.filter(function (s) { return s; }); + if (!config.async) { + // subs aren't sorted in scheduler if not running async + // we need to sort them now to make sure they fire in correct + // order + subs.sort(function (a, b) { return a.id - b.id; }); + } + for (var i = 0, l = subs.length; i < l; i++) { + var sub = subs[i]; + if (info) { + sub.onTrigger && + sub.onTrigger(__assign({ effect: subs[i] }, info)); + } + sub.update(); + } + }; + return Dep; + }()); + // The current target watcher being evaluated. + // This is globally unique because only one watcher + // can be evaluated at a time. + Dep.target = null; + var targetStack = []; + function pushTarget(target) { + targetStack.push(target); + Dep.target = target; + } + function popTarget() { + targetStack.pop(); + Dep.target = targetStack[targetStack.length - 1]; + } + + /* + * not type checking this file because flow doesn't play well with + * dynamically accessing methods on Array prototype + */ + var arrayProto = Array.prototype; + var arrayMethods = Object.create(arrayProto); + var methodsToPatch = [ + 'push', + 'pop', + 'shift', + 'unshift', + 'splice', + 'sort', + 'reverse' + ]; + /** + * Intercept mutating methods and emit events + */ + methodsToPatch.forEach(function (method) { + // cache original method + var original = arrayProto[method]; + def(arrayMethods, method, function mutator() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var result = original.apply(this, args); + var ob = this.__ob__; + var inserted; + switch (method) { + case 'push': + case 'unshift': + inserted = args; + break; + case 'splice': + inserted = args.slice(2); + break; + } + if (inserted) + ob.observeArray(inserted); + // notify change + { + ob.dep.notify({ + type: "array mutation" /* TriggerOpTypes.ARRAY_MUTATION */, + target: this, + key: method + }); + } + return result; + }); + }); + + var arrayKeys = Object.getOwnPropertyNames(arrayMethods); + var NO_INIITIAL_VALUE = {}; + /** + * In some cases we may want to disable observation inside a component's + * update computation. + */ + var shouldObserve = true; + function toggleObserving(value) { + shouldObserve = value; + } + // ssr mock dep + var mockDep = { + notify: noop, + depend: noop, + addSub: noop, + removeSub: noop + }; + /** + * Observer class that is attached to each observed + * object. Once attached, the observer converts the target + * object's property keys into getter/setters that + * collect dependencies and dispatch updates. + */ + var Observer = /** @class */ (function () { + function Observer(value, shallow, mock) { + if (shallow === void 0) { shallow = false; } + if (mock === void 0) { mock = false; } + this.value = value; + this.shallow = shallow; + this.mock = mock; + // this.value = value + this.dep = mock ? mockDep : new Dep(); + this.vmCount = 0; + def(value, '__ob__', this); + if (isArray(value)) { + if (!mock) { + if (hasProto) { + value.__proto__ = arrayMethods; + /* eslint-enable no-proto */ + } + else { + for (var i = 0, l = arrayKeys.length; i < l; i++) { + var key = arrayKeys[i]; + def(value, key, arrayMethods[key]); + } + } + } + if (!shallow) { + this.observeArray(value); + } + } + else { + /** + * Walk through all properties and convert them into + * getter/setters. This method should only be called when + * value type is Object. + */ + var keys = Object.keys(value); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + defineReactive(value, key, NO_INIITIAL_VALUE, undefined, shallow, mock); + } + } + } + /** + * Observe a list of Array items. + */ + Observer.prototype.observeArray = function (value) { + for (var i = 0, l = value.length; i < l; i++) { + observe(value[i], false, this.mock); + } + }; + return Observer; + }()); + // helpers + /** + * Attempt to create an observer instance for a value, + * returns the new observer if successfully observed, + * or the existing observer if the value already has one. + */ + function observe(value, shallow, ssrMockReactivity) { + if (value && hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { + return value.__ob__; + } + if (shouldObserve && + (ssrMockReactivity || !isServerRendering()) && + (isArray(value) || isPlainObject(value)) && + Object.isExtensible(value) && + !value.__v_skip /* ReactiveFlags.SKIP */ && + !isRef(value) && + !(value instanceof VNode)) { + return new Observer(value, shallow, ssrMockReactivity); + } + } + /** + * Define a reactive property on an Object. + */ + function defineReactive(obj, key, val, customSetter, shallow, mock) { + var dep = new Dep(); + var property = Object.getOwnPropertyDescriptor(obj, key); + if (property && property.configurable === false) { + return; + } + // cater for pre-defined getter/setters + var getter = property && property.get; + var setter = property && property.set; + if ((!getter || setter) && + (val === NO_INIITIAL_VALUE || arguments.length === 2)) { + val = obj[key]; + } + var childOb = !shallow && observe(val, false, mock); + Object.defineProperty(obj, key, { + enumerable: true, + configurable: true, + get: function reactiveGetter() { + var value = getter ? getter.call(obj) : val; + if (Dep.target) { + { + dep.depend({ + target: obj, + type: "get" /* TrackOpTypes.GET */, + key: key + }); + } + if (childOb) { + childOb.dep.depend(); + if (isArray(value)) { + dependArray(value); + } + } + } + return isRef(value) && !shallow ? value.value : value; + }, + set: function reactiveSetter(newVal) { + var value = getter ? getter.call(obj) : val; + if (!hasChanged(value, newVal)) { + return; + } + if (customSetter) { + customSetter(); + } + if (setter) { + setter.call(obj, newVal); + } + else if (getter) { + // #7981: for accessor properties without setter + return; + } + else if (!shallow && isRef(value) && !isRef(newVal)) { + value.value = newVal; + return; + } + else { + val = newVal; + } + childOb = !shallow && observe(newVal, false, mock); + { + dep.notify({ + type: "set" /* TriggerOpTypes.SET */, + target: obj, + key: key, + newValue: newVal, + oldValue: value + }); + } + } + }); + return dep; + } + function set(target, key, val) { + if ((isUndef(target) || isPrimitive(target))) { + warn$2("Cannot set reactive property on undefined, null, or primitive value: ".concat(target)); + } + if (isReadonly(target)) { + warn$2("Set operation on key \"".concat(key, "\" failed: target is readonly.")); + return; + } + var ob = target.__ob__; + if (isArray(target) && isValidArrayIndex(key)) { + target.length = Math.max(target.length, key); + target.splice(key, 1, val); + // when mocking for SSR, array methods are not hijacked + if (ob && !ob.shallow && ob.mock) { + observe(val, false, true); + } + return val; + } + if (key in target && !(key in Object.prototype)) { + target[key] = val; + return val; + } + if (target._isVue || (ob && ob.vmCount)) { + warn$2('Avoid adding reactive properties to a Vue instance or its root $data ' + + 'at runtime - declare it upfront in the data option.'); + return val; + } + if (!ob) { + target[key] = val; + return val; + } + defineReactive(ob.value, key, val, undefined, ob.shallow, ob.mock); + { + ob.dep.notify({ + type: "add" /* TriggerOpTypes.ADD */, + target: target, + key: key, + newValue: val, + oldValue: undefined + }); + } + return val; + } + function del(target, key) { + if ((isUndef(target) || isPrimitive(target))) { + warn$2("Cannot delete reactive property on undefined, null, or primitive value: ".concat(target)); + } + if (isArray(target) && isValidArrayIndex(key)) { + target.splice(key, 1); + return; + } + var ob = target.__ob__; + if (target._isVue || (ob && ob.vmCount)) { + warn$2('Avoid deleting properties on a Vue instance or its root $data ' + + '- just set it to null.'); + return; + } + if (isReadonly(target)) { + warn$2("Delete operation on key \"".concat(key, "\" failed: target is readonly.")); + return; + } + if (!hasOwn(target, key)) { + return; + } + delete target[key]; + if (!ob) { + return; + } + { + ob.dep.notify({ + type: "delete" /* TriggerOpTypes.DELETE */, + target: target, + key: key + }); + } + } + /** + * Collect dependencies on array elements when the array is touched, since + * we cannot intercept array element access like property getters. + */ + function dependArray(value) { + for (var e = void 0, i = 0, l = value.length; i < l; i++) { + e = value[i]; + if (e && e.__ob__) { + e.__ob__.dep.depend(); + } + if (isArray(e)) { + dependArray(e); + } + } + } + + function reactive(target) { + makeReactive(target, false); + return target; + } + /** + * Return a shallowly-reactive copy of the original object, where only the root + * level properties are reactive. It also does not auto-unwrap refs (even at the + * root level). + */ + function shallowReactive(target) { + makeReactive(target, true); + def(target, "__v_isShallow" /* ReactiveFlags.IS_SHALLOW */, true); + return target; + } + function makeReactive(target, shallow) { + // if trying to observe a readonly proxy, return the readonly version. + if (!isReadonly(target)) { + { + if (isArray(target)) { + warn$2("Avoid using Array as root value for ".concat(shallow ? "shallowReactive()" : "reactive()", " as it cannot be tracked in watch() or watchEffect(). Use ").concat(shallow ? "shallowRef()" : "ref()", " instead. This is a Vue-2-only limitation.")); + } + var existingOb = target && target.__ob__; + if (existingOb && existingOb.shallow !== shallow) { + warn$2("Target is already a ".concat(existingOb.shallow ? "" : "non-", "shallow reactive object, and cannot be converted to ").concat(shallow ? "" : "non-", "shallow.")); + } + } + var ob = observe(target, shallow, isServerRendering() /* ssr mock reactivity */); + if (!ob) { + if (target == null || isPrimitive(target)) { + warn$2("value cannot be made reactive: ".concat(String(target))); + } + if (isCollectionType(target)) { + warn$2("Vue 2 does not support reactive collection types such as Map or Set."); + } + } + } + } + function isReactive(value) { + if (isReadonly(value)) { + return isReactive(value["__v_raw" /* ReactiveFlags.RAW */]); + } + return !!(value && value.__ob__); + } + function isShallow(value) { + return !!(value && value.__v_isShallow); + } + function isReadonly(value) { + return !!(value && value.__v_isReadonly); + } + function isProxy(value) { + return isReactive(value) || isReadonly(value); + } + function toRaw(observed) { + var raw = observed && observed["__v_raw" /* ReactiveFlags.RAW */]; + return raw ? toRaw(raw) : observed; + } + function markRaw(value) { + // non-extensible objects won't be observed anyway + if (Object.isExtensible(value)) { + def(value, "__v_skip" /* ReactiveFlags.SKIP */, true); + } + return value; + } + /** + * @internal + */ + function isCollectionType(value) { + var type = toRawType(value); + return (type === 'Map' || type === 'WeakMap' || type === 'Set' || type === 'WeakSet'); + } + + /** + * @internal + */ + var RefFlag = "__v_isRef"; + function isRef(r) { + return !!(r && r.__v_isRef === true); + } + function ref$1(value) { + return createRef(value, false); + } + function shallowRef(value) { + return createRef(value, true); + } + function createRef(rawValue, shallow) { + if (isRef(rawValue)) { + return rawValue; + } + var ref = {}; + def(ref, RefFlag, true); + def(ref, "__v_isShallow" /* ReactiveFlags.IS_SHALLOW */, shallow); + def(ref, 'dep', defineReactive(ref, 'value', rawValue, null, shallow, isServerRendering())); + return ref; + } + function triggerRef(ref) { + if (!ref.dep) { + warn$2("received object is not a triggerable ref."); + } + { + ref.dep && + ref.dep.notify({ + type: "set" /* TriggerOpTypes.SET */, + target: ref, + key: 'value' + }); + } + } + function unref(ref) { + return isRef(ref) ? ref.value : ref; + } + function proxyRefs(objectWithRefs) { + if (isReactive(objectWithRefs)) { + return objectWithRefs; + } + var proxy = {}; + var keys = Object.keys(objectWithRefs); + for (var i = 0; i < keys.length; i++) { + proxyWithRefUnwrap(proxy, objectWithRefs, keys[i]); + } + return proxy; + } + function proxyWithRefUnwrap(target, source, key) { + Object.defineProperty(target, key, { + enumerable: true, + configurable: true, + get: function () { + var val = source[key]; + if (isRef(val)) { + return val.value; + } + else { + var ob = val && val.__ob__; + if (ob) + ob.dep.depend(); + return val; + } + }, + set: function (value) { + var oldValue = source[key]; + if (isRef(oldValue) && !isRef(value)) { + oldValue.value = value; + } + else { + source[key] = value; + } + } + }); + } + function customRef(factory) { + var dep = new Dep(); + var _a = factory(function () { + { + dep.depend({ + target: ref, + type: "get" /* TrackOpTypes.GET */, + key: 'value' + }); + } + }, function () { + { + dep.notify({ + target: ref, + type: "set" /* TriggerOpTypes.SET */, + key: 'value' + }); + } + }), get = _a.get, set = _a.set; + var ref = { + get value() { + return get(); + }, + set value(newVal) { + set(newVal); + } + }; + def(ref, RefFlag, true); + return ref; + } + function toRefs(object) { + if (!isReactive(object)) { + warn$2("toRefs() expects a reactive object but received a plain one."); + } + var ret = isArray(object) ? new Array(object.length) : {}; + for (var key in object) { + ret[key] = toRef(object, key); + } + return ret; + } + function toRef(object, key, defaultValue) { + var val = object[key]; + if (isRef(val)) { + return val; + } + var ref = { + get value() { + var val = object[key]; + return val === undefined ? defaultValue : val; + }, + set value(newVal) { + object[key] = newVal; + } + }; + def(ref, RefFlag, true); + return ref; + } + + var rawToReadonlyFlag = "__v_rawToReadonly"; + var rawToShallowReadonlyFlag = "__v_rawToShallowReadonly"; + function readonly(target) { + return createReadonly(target, false); + } + function createReadonly(target, shallow) { + if (!isPlainObject(target)) { + { + if (isArray(target)) { + warn$2("Vue 2 does not support readonly arrays."); + } + else if (isCollectionType(target)) { + warn$2("Vue 2 does not support readonly collection types such as Map or Set."); + } + else { + warn$2("value cannot be made readonly: ".concat(typeof target)); + } + } + return target; + } + if (!Object.isExtensible(target)) { + warn$2("Vue 2 does not support creating readonly proxy for non-extensible object."); + } + // already a readonly object + if (isReadonly(target)) { + return target; + } + // already has a readonly proxy + var existingFlag = shallow ? rawToShallowReadonlyFlag : rawToReadonlyFlag; + var existingProxy = target[existingFlag]; + if (existingProxy) { + return existingProxy; + } + var proxy = Object.create(Object.getPrototypeOf(target)); + def(target, existingFlag, proxy); + def(proxy, "__v_isReadonly" /* ReactiveFlags.IS_READONLY */, true); + def(proxy, "__v_raw" /* ReactiveFlags.RAW */, target); + if (isRef(target)) { + def(proxy, RefFlag, true); + } + if (shallow || isShallow(target)) { + def(proxy, "__v_isShallow" /* ReactiveFlags.IS_SHALLOW */, true); + } + var keys = Object.keys(target); + for (var i = 0; i < keys.length; i++) { + defineReadonlyProperty(proxy, target, keys[i], shallow); + } + return proxy; + } + function defineReadonlyProperty(proxy, target, key, shallow) { + Object.defineProperty(proxy, key, { + enumerable: true, + configurable: true, + get: function () { + var val = target[key]; + return shallow || !isPlainObject(val) ? val : readonly(val); + }, + set: function () { + warn$2("Set operation on key \"".concat(key, "\" failed: target is readonly.")); + } + }); + } + /** + * Returns a reactive-copy of the original object, where only the root level + * properties are readonly, and does NOT unwrap refs nor recursively convert + * returned properties. + * This is used for creating the props proxy object for stateful components. + */ + function shallowReadonly(target) { + return createReadonly(target, true); + } + + function computed(getterOrOptions, debugOptions) { + var getter; + var setter; + var onlyGetter = isFunction(getterOrOptions); + if (onlyGetter) { + getter = getterOrOptions; + setter = function () { + warn$2('Write operation failed: computed value is readonly'); + } + ; + } + else { + getter = getterOrOptions.get; + setter = getterOrOptions.set; + } + var watcher = isServerRendering() + ? null + : new Watcher(currentInstance, getter, noop, { lazy: true }); + if (watcher && debugOptions) { + watcher.onTrack = debugOptions.onTrack; + watcher.onTrigger = debugOptions.onTrigger; + } + var ref = { + // some libs rely on the presence effect for checking computed refs + // from normal refs, but the implementation doesn't matter + effect: watcher, + get value() { + if (watcher) { + if (watcher.dirty) { + watcher.evaluate(); + } + if (Dep.target) { + if (Dep.target.onTrack) { + Dep.target.onTrack({ + effect: Dep.target, + target: ref, + type: "get" /* TrackOpTypes.GET */, + key: 'value' + }); + } + watcher.depend(); + } + return watcher.value; + } + else { + return getter(); + } + }, + set value(newVal) { + setter(newVal); + } + }; + def(ref, RefFlag, true); + def(ref, "__v_isReadonly" /* ReactiveFlags.IS_READONLY */, onlyGetter); + return ref; + } + + var mark; + var measure; + { + var perf_1 = inBrowser && window.performance; + /* istanbul ignore if */ + if (perf_1 && + // @ts-ignore + perf_1.mark && + // @ts-ignore + perf_1.measure && + // @ts-ignore + perf_1.clearMarks && + // @ts-ignore + perf_1.clearMeasures) { + mark = function (tag) { return perf_1.mark(tag); }; + measure = function (name, startTag, endTag) { + perf_1.measure(name, startTag, endTag); + perf_1.clearMarks(startTag); + perf_1.clearMarks(endTag); + // perf.clearMeasures(name) + }; + } + } + + var normalizeEvent = cached(function (name) { + var passive = name.charAt(0) === '&'; + name = passive ? name.slice(1) : name; + var once = name.charAt(0) === '~'; // Prefixed last, checked first + name = once ? name.slice(1) : name; + var capture = name.charAt(0) === '!'; + name = capture ? name.slice(1) : name; + return { + name: name, + once: once, + capture: capture, + passive: passive + }; + }); + function createFnInvoker(fns, vm) { + function invoker() { + var fns = invoker.fns; + if (isArray(fns)) { + var cloned = fns.slice(); + for (var i = 0; i < cloned.length; i++) { + invokeWithErrorHandling(cloned[i], null, arguments, vm, "v-on handler"); + } + } + else { + // return handler return value for single handlers + return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler"); + } + } + invoker.fns = fns; + return invoker; + } + function updateListeners(on, oldOn, add, remove, createOnceHandler, vm) { + var name, cur, old, event; + for (name in on) { + cur = on[name]; + old = oldOn[name]; + event = normalizeEvent(name); + if (isUndef(cur)) { + warn$2("Invalid handler for event \"".concat(event.name, "\": got ") + String(cur), vm); + } + else if (isUndef(old)) { + if (isUndef(cur.fns)) { + cur = on[name] = createFnInvoker(cur, vm); + } + if (isTrue(event.once)) { + cur = on[name] = createOnceHandler(event.name, cur, event.capture); + } + add(event.name, cur, event.capture, event.passive, event.params); + } + else if (cur !== old) { + old.fns = cur; + on[name] = old; + } + } + for (name in oldOn) { + if (isUndef(on[name])) { + event = normalizeEvent(name); + remove(event.name, oldOn[name], event.capture); + } + } + } + + function mergeVNodeHook(def, hookKey, hook) { + if (def instanceof VNode) { + def = def.data.hook || (def.data.hook = {}); + } + var invoker; + var oldHook = def[hookKey]; + function wrappedHook() { + hook.apply(this, arguments); + // important: remove merged hook to ensure it's called only once + // and prevent memory leak + remove$2(invoker.fns, wrappedHook); + } + if (isUndef(oldHook)) { + // no existing hook + invoker = createFnInvoker([wrappedHook]); + } + else { + /* istanbul ignore if */ + if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { + // already a merged invoker + invoker = oldHook; + invoker.fns.push(wrappedHook); + } + else { + // existing plain hook + invoker = createFnInvoker([oldHook, wrappedHook]); + } + } + invoker.merged = true; + def[hookKey] = invoker; + } + + function extractPropsFromVNodeData(data, Ctor, tag) { + // we are only extracting raw values here. + // validation and default values are handled in the child + // component itself. + var propOptions = Ctor.options.props; + if (isUndef(propOptions)) { + return; + } + var res = {}; + var attrs = data.attrs, props = data.props; + if (isDef(attrs) || isDef(props)) { + for (var key in propOptions) { + var altKey = hyphenate(key); + { + var keyInLowerCase = key.toLowerCase(); + if (key !== keyInLowerCase && attrs && hasOwn(attrs, keyInLowerCase)) { + tip("Prop \"".concat(keyInLowerCase, "\" is passed to component ") + + "".concat(formatComponentName( + // @ts-expect-error tag is string + tag || Ctor), ", but the declared prop name is") + + " \"".concat(key, "\". ") + + "Note that HTML attributes are case-insensitive and camelCased " + + "props need to use their kebab-case equivalents when using in-DOM " + + "templates. You should probably use \"".concat(altKey, "\" instead of \"").concat(key, "\".")); + } + } + checkProp(res, props, key, altKey, true) || + checkProp(res, attrs, key, altKey, false); + } + } + return res; + } + function checkProp(res, hash, key, altKey, preserve) { + if (isDef(hash)) { + if (hasOwn(hash, key)) { + res[key] = hash[key]; + if (!preserve) { + delete hash[key]; + } + return true; + } + else if (hasOwn(hash, altKey)) { + res[key] = hash[altKey]; + if (!preserve) { + delete hash[altKey]; + } + return true; + } + } + return false; + } + + // The template compiler attempts to minimize the need for normalization by + // statically analyzing the template at compile time. + // + // For plain HTML markup, normalization can be completely skipped because the + // generated render function is guaranteed to return Array. There are + // two cases where extra normalization is needed: + // 1. When the children contains components - because a functional component + // may return an Array instead of a single root. In this case, just a simple + // normalization is needed - if any child is an Array, we flatten the whole + // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep + // because functional components already normalize their own children. + function simpleNormalizeChildren(children) { + for (var i = 0; i < children.length; i++) { + if (isArray(children[i])) { + return Array.prototype.concat.apply([], children); + } + } + return children; + } + // 2. When the children contains constructs that always generated nested Arrays, + // e.g.