diff --git a/src/routes/backoffice/purchaseorder/+page.svelte b/src/routes/backoffice/purchaseorder/+page.svelte index c35f68b..2a6dd6a 100644 --- a/src/routes/backoffice/purchaseorder/+page.svelte +++ b/src/routes/backoffice/purchaseorder/+page.svelte @@ -133,9 +133,50 @@ if (page >= 1 && page <= totalPages) currentPage = page; } + let showApprovalModal = false; + let approvalForm = { + po_number: "", + approval: "", + approved_by: "", + approved_date: "", + reject_comment: "" + }; + let currentUserId = ""; + let currentUserFullName = ""; + async function fetchCurrentUser() { + const { + data: { user } + } = await supabase.auth.getUser(); + if (user) { + currentUserId = user.id; + + const { data, error } = await supabase + .from("vb_users") + .select("full_name") + .eq("id", user.id) + .single(); + + if (!error && data) { + currentUserFullName = data.full_name; + } + } + } + function openApprovalModal(row) { + selectedPO = row; + + approvalForm = { + po_number: row.purchase_order_number || "", + approval: row.approval ? "approve" : "reject", + approved_by: currentUserId, + approved_date: new Date().toISOString().split("T")[0], + reject_comment: row.reject_comment || "" + }; + + showApprovalModal = true; + } let showPaymentModal = false; let paymentForm = { payment_method: "", @@ -155,6 +196,27 @@ due_remaining: 0 }; + let showAcknowledgedModal = false; + + let acknowledgedForm = { + po_number: "", + acknowledged: "", + acknowledged_by: "", + acknowledged_date: "" + }; + + function openAcknowledgedModal(row) { + selectedPO = row; + + acknowledgedForm = { + po_number: row.purchase_order_number || "", + acknowledged: row.acknowledged ? "acknowledged" : "reject", + acknowledged_by: currentUserId, + acknowledged_date: new Date().toISOString().split("T")[0] + }; + + showAcknowledgedModal = true; + } let showPreparedModal = false; let selectedPO = null; @@ -180,8 +242,82 @@ approved_price: 0, total_approved_order_amount: 0 }; + + let showReceivedModal = false; + let receivedForm = { + po_number: "", + received: "", + received_by: "", + received_date: "" + }; + function openReceivedModal(row) { + selectedPO = row; + receivedForm = { + po_number: row.purchase_order_number || "", + received: row.received ? "received" : "reject", + received_by: currentUserId, + received_date: new Date().toISOString().split("T")[0] + }; + showReceivedModal = true; + } + + let showCompletedModal = false; + + let completedForm = { + po_number: "", + completed: "", + completed_by: "", + completed_date: "" + }; + + function openCompletedModal(row) { + selectedPO = row; + + completedForm = { + po_number: row.purchase_order_number || "", + completed: row.completed ? "completed" : "reject", + completed_by: currentUserId, + completed_date: new Date().toISOString().split("T")[0] + }; + + showCompletedModal = true; + } + async function saveCompleted() { + const { error } = await supabase + .from("vb_purchase_orders") + .update({ + completed: completedForm.completed === "completed", + completed_by: completedForm.completed === "completed" ? currentUserId : null, + completed_date: completedForm.completed_date + }) + .eq("id", selectedPO.id); + + if (error) { + console.error("Error saving completed:", error); + alert("Failed to save."); + return; + } + // ✅ Fire the webhook after saving: + try { + await fetch("https://flow.catalis.app/webhook-test/vb_need_complete_new", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + po_id: selectedPO.id, + completed: completedForm.completed === "completed", + completed_by: completedForm.completed === "completed" ? currentUserId : null, + completed_date: completedForm.completed_date + }) + }); + } catch (webhookError) { + console.error("Webhook failed:", webhookError); + alert("Saved, but webhook failed."); + } + showCompletedModal = false; + await fetchPurchaseOrder(); + } async function openPreparedModal(row) { selectedPO = row; @@ -329,6 +465,7 @@ onMount(() => { fetchPurchaseOrder(); fetchVendors(); + fetchCurrentUser(); }); $: currentPage = 1; // Reset to first page when allRows changes @@ -567,6 +704,40 @@ } return true; } + async function saveReceived() { + const { error } = await supabase + .from("vb_purchase_orders") + .update({ + received: receivedForm.received === "received", + received_by: receivedForm.received === "received" ? currentUserId : null, + received_date: receivedForm.received_date + }) + .eq("id", selectedPO.id); + + if (error) { + console.error("Error saving received:", error); + alert("Failed to save."); + return; + } + // ✅ Fire the webhook after the DB update succeeds: + try { + await fetch("https://flow.catalis.app/webhook-test/vb_need_received_new", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + po_id: selectedPO.id, + received: receivedForm.received === "received", + received_by: receivedForm.received === "received" ? currentUserId : null, + received_date: receivedForm.received_date + }) + }); + } catch (webhookError) { + console.error("Webhook failed:", webhookError); + alert("Saved, but webhook failed."); + } + showReceivedModal = false; + await fetchPurchaseOrder(); + } function validateInputProsesToAprroval() { const requiredFields = ["po_type", "po_quantity", "po_price"]; @@ -673,6 +844,43 @@ await fetchPurchaseOrder(); } + async function saveAcknowledged() { + const { error } = await supabase + .from("vb_purchase_orders") + .update({ + acknowledged: acknowledgedForm.acknowledged === "acknowledged", + acknowledge_by: acknowledgedForm.acknowledged === "acknowledged" ? currentUserId : null, + acknowledged_date: acknowledgedForm.acknowledged_date + }) + .eq("id", selectedPO.id); + + if (error) { + console.error("Error saving acknowledged:", error); + alert("Failed to save."); + return; + } + + // ✅ Fire the webhook after successful update: + try { + await fetch("https://flow.catalis.app/webhook/vb_acknowledged_new", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + po_id: selectedPO.id, + acknowledged: acknowledgedForm.acknowledged === "acknowledged", + acknowledged_by: acknowledgedForm.acknowledged === "acknowledged" ? currentUserId : null, + acknowledged_date: acknowledgedForm.acknowledged_date + }) + }); + } catch (webhookError) { + console.error("Failed to fire webhook:", webhookError); + alert("Saved, but webhook failed."); + } + + showAcknowledgedModal = false; + await fetchPurchaseOrder(); + } + async function receivedOk(id: string, status: boolean) { const sessionId = await getSessionAuthId(); if (!sessionId) { @@ -838,7 +1046,27 @@ showPaymentModal = false; await fetchPurchaseOrder(); } + async function saveApproval() { + const { error } = await supabase + .from("vb_purchase_orders") + .update({ + approved: approvalForm.approval === "approve", + approved_by: approvalForm.approval === "approve" ? currentUserId : null, + approved_date: approvalForm.approved_date, + reject_comment: approvalForm.reject_comment || null, + po_status: "approved" + }) + .eq("id", selectedPO.id); + if (error) { + console.error("Error saving approval:", error); + alert("Failed to save."); + return; + } + + showApprovalModal = false; + await fetchPurchaseOrder(); + }