From 7b0f8c1c20d334d02fbf838109f4a03acebb5b02 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Tue, 9 Jan 2024 12:12:20 +0000 Subject: [PATCH] - It is no longer possible to upload/edit/delete a transfer after it is considered paid - When deleting a row, the transfers are also deleted from the storage --- src/components/PaymentAssetManager.tsx | 19 ++++++---- src/pages/api/payments/[id].ts | 9 +++-- src/pages/payment-record.tsx | 50 ++++++++++++++++---------- 3 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/components/PaymentAssetManager.tsx b/src/components/PaymentAssetManager.tsx index db6862cf..cdf81460 100644 --- a/src/components/PaymentAssetManager.tsx +++ b/src/components/PaymentAssetManager.tsx @@ -1,5 +1,5 @@ import React, {ChangeEvent} from "react"; -import {BsUpload, BsDownload, BsTrash, BsArrowRepeat} from "react-icons/bs"; +import {BsUpload, BsDownload, BsTrash, BsArrowRepeat, BsXCircleFill} from "react-icons/bs"; import {FilesStorage} from "@/interfaces/storage.files"; import axios from "axios"; @@ -14,6 +14,7 @@ const PaymentAssetManager = (props: { type: FilesStorage; reload: () => void; paymentId: string; + canEdit: boolean; }) => { const {asset, permissions, type, paymentId} = props; @@ -121,10 +122,14 @@ const PaymentAssetManager = (props: { return ( <> - fileInputReplaceRef.current?.click()} /> - - {renderFileInput((e: Event) => handleFileChange(e, "patch"), fileInputReplaceRef)} - {renderFileInput((e: Event) => handleFileChange(e, "post"), fileInputRef)} + {props.canEdit && ( + <> + fileInputReplaceRef.current?.click()} /> + + {renderFileInput((e: Event) => handleFileChange(e, "patch"), fileInputReplaceRef)} + {renderFileInput((e: Event) => handleFileChange(e, "post"), fileInputRef)} + + )} ); } @@ -132,11 +137,13 @@ const PaymentAssetManager = (props: { return ; } - return ( + return props.canEdit ? ( <> fileInputRef.current?.click()} /> {renderFileInput((e: Event) => handleFileChange(e, "post"), fileInputRef)} + ) : ( + ); }; diff --git a/src/pages/api/payments/[id].ts b/src/pages/api/payments/[id].ts index 0f5e7e25..e645fe91 100644 --- a/src/pages/api/payments/[id].ts +++ b/src/pages/api/payments/[id].ts @@ -1,10 +1,12 @@ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction import type {NextApiRequest, NextApiResponse} from "next"; -import {app} from "@/firebase"; +import {app, storage} from "@/firebase"; import {getFirestore, collection, getDocs, getDoc, doc, deleteDoc, setDoc} from "firebase/firestore"; import {withIronSessionApiRoute} from "iron-session/next"; import {sessionOptions} from "@/lib/session"; import {Group} from "@/interfaces/user"; +import {Payment} from "@/interfaces/paypal"; +import {deleteObject, ref} from "firebase/storage"; const db = getFirestore(app); @@ -44,11 +46,14 @@ async function del(req: NextApiRequest, res: NextApiResponse) { const {id} = req.query as {id: string}; const snapshot = await getDoc(doc(db, "payments", id)); + const data = snapshot.data() as Payment; const user = req.session.user; if (user.type === "admin" || user.type === "developer") { - await deleteDoc(snapshot.ref); + if (data.commissionTransfer) await deleteObject(ref(storage, data.commissionTransfer)); + if (data.corporateTransfer) await deleteObject(ref(storage, data.corporateTransfer)); + await deleteDoc(snapshot.ref); res.status(200).json({ok: true}); return; } diff --git a/src/pages/payment-record.tsx b/src/pages/payment-record.tsx index 30a2d775..dc6160b3 100644 --- a/src/pages/payment-record.tsx +++ b/src/pages/payment-record.tsx @@ -390,6 +390,7 @@ export default function PaymentRecord() { reload={reload} permissions={info.row.original.isPaid ? "read" : "write"} asset={info.row.original.corporateTransfer} + canEdit={!info.row.original.isPaid} paymentId={info.row.original.id} type="corporate" /> @@ -409,6 +410,7 @@ export default function PaymentRecord() { permissions="read" asset={info.row.original.commissionTransfer} paymentId={info.row.original.id} + canEdit={!info.row.original.isPaid} type="commission" /> @@ -427,6 +429,7 @@ export default function PaymentRecord() { permissions="read" asset={info.row.original.corporateTransfer} paymentId={info.row.original.id} + canEdit={!info.row.original.isPaid} type="corporate" /> @@ -442,6 +445,7 @@ export default function PaymentRecord() { permissions={info.row.original.isPaid ? "read" : "write"} asset={info.row.original.commissionTransfer} paymentId={info.row.original.id} + canEdit={!info.row.original.isPaid} type="commission" /> @@ -460,6 +464,7 @@ export default function PaymentRecord() { permissions="write" asset={info.row.original.corporateTransfer} paymentId={info.row.original.id} + canEdit={!info.row.original.isPaid} type="corporate" /> @@ -475,6 +480,7 @@ export default function PaymentRecord() { permissions="write" asset={info.row.original.commissionTransfer} paymentId={info.row.original.id} + canEdit={!info.row.original.isPaid} type="commission" /> @@ -534,6 +540,31 @@ export default function PaymentRecord() { } }; + const commissionColumn = () => { + if (user && user.type !== "corporate") + return [ + columnHelper.accessor("agentCommission", { + header: "Commission", + id: "agentCommission", + cell: (info) => { + const {value} = columHelperValue(info.column.id, info); + return <>{value}; + }, + }), + columnHelper.accessor("agentValue", { + header: "Commission Value", + id: "agentValue", + cell: (info) => { + const {value} = columHelperValue(info.column.id, info); + const currency = CURRENCIES.find((x) => x.currency === info.row.original.currency)?.label; + const finalValue = `${value} ${currency}`; + return {finalValue}; + }, + }), + ]; + return []; + }; + const defaultColumns = [ columnHelper.accessor("corporate", { header: "Corporate ID", @@ -593,24 +624,7 @@ export default function PaymentRecord() { ); }, }), - columnHelper.accessor("agentCommission", { - header: "Commission", - id: "agentCommission", - cell: (info) => { - const {value} = columHelperValue(info.column.id, info); - return <>{value}; - }, - }), - columnHelper.accessor("agentValue", { - header: "Commission Value", - id: "agentValue", - cell: (info) => { - const {value} = columHelperValue(info.column.id, info); - const currency = CURRENCIES.find((x) => x.currency === info.row.original.currency)?.label; - const finalValue = `${value} ${currency}`; - return {finalValue}; - }, - }), + ...commissionColumn(), columnHelper.accessor("isPaid", { header: "Paid", id: "isPaid",