From 3a2feb6186db4c069fd5caae5525fa1ae8fb086c Mon Sep 17 00:00:00 2001 From: Lim Shi Song Date: Wed, 12 Jun 2024 23:43:48 +0800 Subject: [PATCH] chore: Refactor User.svelte and helper.js, add status field to FeedBack constructor, and update getBillByPaymentId and getPaymentByBookingId functions ``` --- src/lib/components/forms/FeedBackForm.svelte | 26 ++++++++++-- src/lib/components/pages/Admin.svelte | 40 ++++++++++++++++++- src/lib/components/pages/User.svelte | 4 +- src/lib/helper.js | 2 +- src/lib/models/bill.js | 12 ++++++ src/lib/models/feedback.js | 3 +- src/lib/models/payment.js | 11 +++++ src/lib/repos/feedbackRepo.js | 20 +++++++--- .../(admin)/manage/feedback/form/+page.svelte | 4 +- src/routes/(authed)/history/+page.svelte | 34 ++++++++++++++++ 10 files changed, 142 insertions(+), 14 deletions(-) diff --git a/src/lib/components/forms/FeedBackForm.svelte b/src/lib/components/forms/FeedBackForm.svelte index c15d51a..1f19c5e 100644 --- a/src/lib/components/forms/FeedBackForm.svelte +++ b/src/lib/components/forms/FeedBackForm.svelte @@ -1,7 +1,7 @@ @@ -43,7 +59,7 @@
{#if failure} - Failed to Submit Feedback + {msg} {:else if success} @@ -80,5 +96,9 @@ {/if} - + {#if close} + + {:else} + + {/if} diff --git a/src/lib/components/pages/Admin.svelte b/src/lib/components/pages/Admin.svelte index 38aee51..2a940de 100644 --- a/src/lib/components/pages/Admin.svelte +++ b/src/lib/components/pages/Admin.svelte @@ -17,6 +17,8 @@ formatDate, formatTime, } from "$lib/helper"; + import { getBillByPaymentId } from "$lib/models/bill"; + import { getPaymentByBookingId } from "$lib/models/payment"; let list = []; let show = false; @@ -24,6 +26,8 @@ let rejectSuccess = false; let booking; + let payment; + let bill; let roomName; onMount(async () => { @@ -34,6 +38,10 @@ booking = await getBookingById(event.detail.no); roomName = event.detail.room; booking = booking; + if (booking.status === "completed") { + payment = await getPaymentByBookingId(booking.booking_id); + bill = await getBillByPaymentId(payment.id); + } show = true; }; @@ -102,9 +110,39 @@ Status: - {booking.status} + {SnakeCaseToCapitalized(booking.status)} + + User Id: + {booking.user_id} + + {#if booking.status === "completed"} + + Payment ID: + {payment.id} + + + Bill ID: + {bill.id} + + + Amount: + {payment.amount} + + + Payment Method: + {payment.method} + + + Payment Date: + {formatDate(new Date(payment.date))} + + + Payment Time: + {formatTime(new Date(payment.date))} + + {/if} diff --git a/src/lib/components/pages/User.svelte b/src/lib/components/pages/User.svelte index 307aed8..b703ca1 100644 --- a/src/lib/components/pages/User.svelte +++ b/src/lib/components/pages/User.svelte @@ -23,9 +23,9 @@
- +
- +
{#if searched && searchRooms.length == 0} diff --git a/src/lib/helper.js b/src/lib/helper.js index e33e1d3..f1e5326 100644 --- a/src/lib/helper.js +++ b/src/lib/helper.js @@ -74,7 +74,7 @@ export function toDateTime(date, time) { */ export function isDateTimeValid(dateString) { if (typeof dateString !== "string") return false; - if (dateString.match(/\d{4}-\d{2}-\d{2} \d:\d/g) === null) return false; + if (dateString.match(/\d{4}-\d{2}-\d{2} \d{1,2}:\d{1,2}/g) === null) return false; return !isNaN(Date.parse(dateString)); } diff --git a/src/lib/models/bill.js b/src/lib/models/bill.js index cb2ad0e..4724dd5 100644 --- a/src/lib/models/bill.js +++ b/src/lib/models/bill.js @@ -32,4 +32,16 @@ export class Bill { let success = await bill.save(); return success ? bill : null; } +} + +/** + * Get bill by payment_id + * @param {number} payment_id - Payment ID + * @returns {Promise} - Bill object or null if not found + */ +export async function getBillByPaymentId(payment_id) { + let db = await getDB(); + let query = "SELECT * FROM bill WHERE payment_id = ?"; + let result = await db.select(query, [payment_id]); + return result.length === 1 ? new Bill(result[0]) : null; } \ No newline at end of file diff --git a/src/lib/models/feedback.js b/src/lib/models/feedback.js index 7838715..c314fc0 100644 --- a/src/lib/models/feedback.js +++ b/src/lib/models/feedback.js @@ -1,13 +1,14 @@ import { getDB } from "$lib/db"; export class FeedBack { - constructor({ user_id, date, content, feedback_id = null, admin_id = null, comment = null }) { + constructor({ user_id, date, content, status = "open", feedback_id = null, admin_id = null, comment = null}) { this.id = feedback_id; this.user_id = user_id; this.admin_id = admin_id; this.date = date; this.content = content; this.comment = comment; + this.status = status; } async save() { diff --git a/src/lib/models/payment.js b/src/lib/models/payment.js index 8029cc9..ad24956 100644 --- a/src/lib/models/payment.js +++ b/src/lib/models/payment.js @@ -34,4 +34,15 @@ export async function getPaymentMethods() { let db = await getDB(); let result = await db.select(`SHOW COLUMNS FROM payment WHERE Field = 'method'`); return result[0].Type.match(/'([^']+)'/g).map((v) => v.slice(1, -1)); +} + +/** + * Get payment by booking_id + * @param {number} booking_id - Payment ID + * @returns {Promise} - Payment object or null if not found + */ +export async function getPaymentByBookingId(booking_id) { + let db = await getDB(); + let result = await db.select(`SELECT * FROM payment WHERE booking_id = ?`, [booking_id]); + return result.length === 1 ? new Payment(result[0]) : null; } \ No newline at end of file diff --git a/src/lib/repos/feedbackRepo.js b/src/lib/repos/feedbackRepo.js index 90eee2a..fb1189d 100644 --- a/src/lib/repos/feedbackRepo.js +++ b/src/lib/repos/feedbackRepo.js @@ -13,22 +13,32 @@ export class FeedBackRepo { */ constructor(feedbacks = [], usertype) { this.datas = feedbacks.map((feedback) => { + let data = {}; let action = {}; if (usertype == "user") { action = { view: "/feedback/form?id=" + feedback.id, } + data = { + content: feedback.content, + date: feedback.date, + status: feedback.status, + action + } } else { action = { view: "/manage/feedback/form?id=" + feedback.id + "&view=true", reply: "/manage/feedback/form?id=" + feedback.id + "&edit=true", } + data = { + content: feedback.content, + date: feedback.date, + status: feedback.status, + user_id: feedback.user_id, + action + } } - return { - content: feedback.content, - date: feedback.date, - action - } + return data; }); } static async getUserFeedback(userId) { diff --git a/src/routes/(admin)/manage/feedback/form/+page.svelte b/src/routes/(admin)/manage/feedback/form/+page.svelte index 44496fc..0f5c88b 100644 --- a/src/routes/(admin)/manage/feedback/form/+page.svelte +++ b/src/routes/(admin)/manage/feedback/form/+page.svelte @@ -13,10 +13,11 @@ let failure = false; let view = false; let reply; + let close; onMount(() => { if (data.feedback) content = data.feedback.content; - if (data.disabled) view = true; + if (data.disabled) view = close = true; if (data.reply) reply = data.reply; else reply = { @@ -49,6 +50,7 @@ bind:data={reply} button="Reply" disabled={data.disabled} + {close} {submit} {view} /> diff --git a/src/routes/(authed)/history/+page.svelte b/src/routes/(authed)/history/+page.svelte index 10ef4a5..d32d174 100644 --- a/src/routes/(authed)/history/+page.svelte +++ b/src/routes/(authed)/history/+page.svelte @@ -5,7 +5,9 @@ formatDate, formatTime, } from "$lib/helper"; + import { getBillByPaymentId } from "$lib/models/bill"; import { getBookingById } from "$lib/models/booking"; + import { getPaymentByBookingId } from "$lib/models/payment"; import { HistoryRepo } from "$lib/repos/historyRepo"; import { user } from "$lib/store"; import { @@ -21,6 +23,8 @@ let history = []; let booking = {}; + let payment; + let bill; let roomName; let show = false; @@ -28,6 +32,10 @@ booking = await getBookingById(event.detail.booking_id); roomName = event.detail.room; booking = booking; + if (booking.status === "completed") { + payment = await getPaymentByBookingId(booking.booking_id); + bill = await getBillByPaymentId(payment.id); + } show = true; }; @@ -95,6 +103,32 @@ {SnakeCaseToCapitalized(booking.status)} + {#if booking.status === "completed"} + + Payment ID: + {payment.id} + + + Bill ID: + {bill.id} + + + Amount: + {payment.amount} + + + Payment Method: + {payment.method} + + + Payment Date: + {formatDate(new Date(payment.date))} + + + Payment Time: + {formatTime(new Date(payment.date))} + + {/if}