From 0bb55951222501b37d0fff73ec18d597f297041d Mon Sep 17 00:00:00 2001 From: nugroho Date: Wed, 25 Jun 2025 02:14:57 +0700 Subject: [PATCH] submit proker and approve/decline submission. untested --- APIHandler.cs | 76 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 27 deletions(-) diff --git a/APIHandler.cs b/APIHandler.cs index 44611de..6f223ea 100644 --- a/APIHandler.cs +++ b/APIHandler.cs @@ -344,14 +344,13 @@ public static partial class APIHandler }); }) //=========ACTIVITIES============= - .Map("/getprokers", prokers=> + .Map("/getprokers", prokers => { prokers.Run(async runner => { - if (!await runner.RequestValidated(3)) return; + if (!await runner.RequestValidated(3) || !Auth.TryGetUser(runner, out SafeUser CurrUser)) return; List Journals = []; - if (!Auth.TryGetUser(runner, out SafeUser CurrUser)) return; - using SqlDataReader Prokers = await RunReaderAsync(CS, "SELECT * FROM [AllJournal] WHERE [ownerid] = @oi OR @oi IS NULL", Query => + using SqlDataReader Prokers = await RunReaderAsync(CS, "SELECT * FROM [AllJournal] WHERE [ownerid] = @oi OR @oi IS NULL ORDER BY [ownerid] ASC, [kegiatan] ASC, [prokerid] ASC, [prokerjid] DESC", Query => { Query.Parameters.AddWithValue("@oi", CurrUser.Level < 3 ? DBNull.Value : CurrUser.AgentID); }, CTS.Token); @@ -374,7 +373,7 @@ public static partial class APIHandler J["document"] == DBNull.Value ? null : (string)J["document"], (DateTime)J["timestamp"] )); - await runner.WriteJsonResponse(StatusCodes.Status200OK, "Proker Journal Fetched.",Journals); + await runner.WriteJsonResponse(StatusCodes.Status200OK, "Proker Journal Fetched.", Journals); }); }) .Map("/mkproker", proker => @@ -423,15 +422,16 @@ public static partial class APIHandler _ = await CreateProker.ExecuteNonQueryAsync(CTS.Token); } using SqlCommand CreateJournal = Conn.CreateCommand(); + DateTime Now = DateTime.Now; CreateJournal.Transaction = Trans; CreateJournal.CommandText = "INSERT INTO [proker_journal] VALUES(@pjid, @pkid, @agid, @stts, @nots, @docs, @tstp)"; - CreateJournal.Parameters.AddWithValue("@pjid", GenerateUuidV7()); + CreateJournal.Parameters.AddWithValue("@pjid", GenerateUuidV7(Now)); CreateJournal.Parameters.AddWithValue("@pkid", ProkerID); CreateJournal.Parameters.AddWithValue("@agid", AgentID); CreateJournal.Parameters.AddWithValue("@stts", 0); CreateJournal.Parameters.AddWithValue("@nots", string.Empty); CreateJournal.Parameters.AddWithValue("@docs", DBNull.Value); - CreateJournal.Parameters.AddWithValue("@tstp", DateTime.Now); + CreateJournal.Parameters.AddWithValue("@tstp", Now); _ = await CreateJournal.ExecuteNonQueryAsync(CTS.Token); }, CTS.Token); await runner.WriteJsonResponse(StatusCodes.Status201Created, "Proker Created and Journaled."); @@ -474,40 +474,62 @@ public static partial class APIHandler UpdateProker.Parameters.AddWithValue("@entg", EntTarget); UpdateProker.Parameters.AddWithValue("@indc", Indicator); UpdateProker.Parameters.AddWithValue("@actn", Action); - },CTS.Token); + }, CTS.Token); await runner.WriteJsonResponse(StatusCodes.Status202Accepted, "Proker Updated."); }); }) - .Map("/approveproker", proker => + .Map("/processpk", proker => { proker.Run(async runner => { - if (!await runner.RequestValidated(2, "POST", true) || - await runner.TryGetBodyJsonAsync(["agentid", "year"], CTS.Token) is not Dictionary InElement) return; + if (!await runner.RequestValidated(2, "POST", true) || !Auth.TryGetUser(runner, out SafeUser CurrUser) || + await runner.TryGetBodyJsonAsync(["agentid", "year", "newstatus", "notes"], CTS.Token) is not Dictionary InElement) return; if ( InElement["agentid"].GetString() is not string AgentID || AgentID.Equals(string.Empty) || + InElement["year"].GetInt16() is short Year && Year < 2020 || + InElement["newstatus"].GetByte() is byte Status && Status != 1 && Status != 3 || + InElement["notes"].GetString() is not string Notes || Notes.Equals(string.Empty) + ) + { + await runner.WriteJsonResponse(StatusCodes.Status400BadRequest, "Required property is of invalid format."); + return; + } + await RunNonQueryAsync(CS, "INSERT INTO [proker_journal] SELECT @pjid, [prokerid], @agid, @st, @nots, null, @tstp FROM [LatestJournal] WHERE [ownerid] = @oi AND [year] = @yr AND [status] = 2 ORDER BY [kegiatan]", Query => + { + DateTime Now = DateTime.Now; + Query.Parameters.AddWithValue("@pjid", GenerateUuidV7(Now)); + Query.Parameters.AddWithValue("@agid", CurrUser.AgentID); + Query.Parameters.AddWithValue("@st", Status); + Query.Parameters.AddWithValue("@nots", Notes); + Query.Parameters.AddWithValue("@tstp", Now); + Query.Parameters.AddWithValue("@oi", AgentID); + Query.Parameters.AddWithValue("@yr", Year); + }, CTS.Token); + await runner.WriteJsonResponse(StatusCodes.Status202Accepted, "Proker submission processed."); + }); + }) + .Map("/submitpk", proker => + { + proker.Run(async runner => + { + if (!await runner.RequestValidated(3, "POST", true) || !Auth.TryGetUser(runner, out SafeUser CurrUser) || + await runner.TryGetBodyJsonAsync(["year"], CTS.Token) is not Dictionary InElement) return; + if ( InElement["year"].GetInt16() is short Year && Year < 2020 ) { await runner.WriteJsonResponse(StatusCodes.Status400BadRequest, "Required property is of invalid format."); return; } - // do inside transaction - // select proker ids first, where prokerid and year - // store in list - // insert with loops; - // _ = await RunNonQueryAsync(CS, "INSERT INTO [proker_journal] SELECT @pjid, VALUES(@pjid, @pkid, @agid, @stts, @nots, @docs, @tstp)", CreateJournal => - // { - // CreateJournal.Parameters.AddWithValue("@pjid", GenerateUuidV7()); - // CreateJournal.Parameters.AddWithValue("@pkid", ProkerID); - // CreateJournal.Parameters.AddWithValue("@agid", AgentID); - // CreateJournal.Parameters.AddWithValue("@stts", 0); - // CreateJournal.Parameters.AddWithValue("@nots", string.Empty); - // CreateJournal.Parameters.AddWithValue("@docs", DBNull.Value); - // CreateJournal.Parameters.AddWithValue("@tstp", DateTime.Now); - // },CTS.Token); - // await runner.WriteJsonResponse(StatusCodes.Status202Accepted, "Proker Updated."); - await runner.WriteJsonResponse(StatusCodes.Status501NotImplemented, "Not yet finished."); + await RunNonQueryAsync(CS, "INSERT INTO [proker_journal] SELECT @pjid, [prokerid], @oi, @st, @nots, null, @tstp FROM [LatestJournal] WHERE [ownerid] = @oi AND [year] = @yr AND [status] = 0 OR [status] = 1 ORDER BY [kegiatan]", Query => + { + DateTime Now = DateTime.Now; + Query.Parameters.AddWithValue("@pjid", GenerateUuidV7(Now)); + Query.Parameters.AddWithValue("@tstp", Now); + Query.Parameters.AddWithValue("@oi", CurrUser.AgentID); + Query.Parameters.AddWithValue("@yr", Year); + }, CTS.Token); + await runner.WriteJsonResponse(StatusCodes.Status202Accepted, "Proker draft submitted."); }); }) .Map("/pushproker", proker =>