- 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
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import React, {ChangeEvent} from "react";
|
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 {FilesStorage} from "@/interfaces/storage.files";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
|
||||||
@@ -14,6 +14,7 @@ const PaymentAssetManager = (props: {
|
|||||||
type: FilesStorage;
|
type: FilesStorage;
|
||||||
reload: () => void;
|
reload: () => void;
|
||||||
paymentId: string;
|
paymentId: string;
|
||||||
|
canEdit: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
const {asset, permissions, type, paymentId} = props;
|
const {asset, permissions, type, paymentId} = props;
|
||||||
|
|
||||||
@@ -121,22 +122,28 @@ const PaymentAssetManager = (props: {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<BsDownload onClick={downloadAsset} />
|
<BsDownload onClick={downloadAsset} />
|
||||||
|
{props.canEdit && (
|
||||||
|
<>
|
||||||
<BsArrowRepeat onClick={() => fileInputReplaceRef.current?.click()} />
|
<BsArrowRepeat onClick={() => fileInputReplaceRef.current?.click()} />
|
||||||
<BsTrash onClick={deleteAsset} />
|
<BsTrash onClick={deleteAsset} />
|
||||||
{renderFileInput((e: Event) => handleFileChange(e, "patch"), fileInputReplaceRef)}
|
{renderFileInput((e: Event) => handleFileChange(e, "patch"), fileInputReplaceRef)}
|
||||||
{renderFileInput((e: Event) => handleFileChange(e, "post"), fileInputRef)}
|
{renderFileInput((e: Event) => handleFileChange(e, "post"), fileInputRef)}
|
||||||
</>
|
</>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return <span className="loading loading-infinity w-8" />;
|
return <span className="loading loading-infinity w-8" />;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return props.canEdit ? (
|
||||||
<>
|
<>
|
||||||
<BsUpload onClick={() => fileInputRef.current?.click()} />
|
<BsUpload onClick={() => fileInputRef.current?.click()} />
|
||||||
{renderFileInput((e: Event) => handleFileChange(e, "post"), fileInputRef)}
|
{renderFileInput((e: Event) => handleFileChange(e, "post"), fileInputRef)}
|
||||||
</>
|
</>
|
||||||
|
) : (
|
||||||
|
<BsXCircleFill />
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
|
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
|
||||||
import type {NextApiRequest, NextApiResponse} from "next";
|
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 {getFirestore, collection, getDocs, getDoc, doc, deleteDoc, setDoc} from "firebase/firestore";
|
||||||
import {withIronSessionApiRoute} from "iron-session/next";
|
import {withIronSessionApiRoute} from "iron-session/next";
|
||||||
import {sessionOptions} from "@/lib/session";
|
import {sessionOptions} from "@/lib/session";
|
||||||
import {Group} from "@/interfaces/user";
|
import {Group} from "@/interfaces/user";
|
||||||
|
import {Payment} from "@/interfaces/paypal";
|
||||||
|
import {deleteObject, ref} from "firebase/storage";
|
||||||
|
|
||||||
const db = getFirestore(app);
|
const db = getFirestore(app);
|
||||||
|
|
||||||
@@ -44,11 +46,14 @@ async function del(req: NextApiRequest, res: NextApiResponse) {
|
|||||||
const {id} = req.query as {id: string};
|
const {id} = req.query as {id: string};
|
||||||
|
|
||||||
const snapshot = await getDoc(doc(db, "payments", id));
|
const snapshot = await getDoc(doc(db, "payments", id));
|
||||||
|
const data = snapshot.data() as Payment;
|
||||||
|
|
||||||
const user = req.session.user;
|
const user = req.session.user;
|
||||||
if (user.type === "admin" || user.type === "developer") {
|
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});
|
res.status(200).json({ok: true});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -390,6 +390,7 @@ export default function PaymentRecord() {
|
|||||||
reload={reload}
|
reload={reload}
|
||||||
permissions={info.row.original.isPaid ? "read" : "write"}
|
permissions={info.row.original.isPaid ? "read" : "write"}
|
||||||
asset={info.row.original.corporateTransfer}
|
asset={info.row.original.corporateTransfer}
|
||||||
|
canEdit={!info.row.original.isPaid}
|
||||||
paymentId={info.row.original.id}
|
paymentId={info.row.original.id}
|
||||||
type="corporate"
|
type="corporate"
|
||||||
/>
|
/>
|
||||||
@@ -409,6 +410,7 @@ export default function PaymentRecord() {
|
|||||||
permissions="read"
|
permissions="read"
|
||||||
asset={info.row.original.commissionTransfer}
|
asset={info.row.original.commissionTransfer}
|
||||||
paymentId={info.row.original.id}
|
paymentId={info.row.original.id}
|
||||||
|
canEdit={!info.row.original.isPaid}
|
||||||
type="commission"
|
type="commission"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -427,6 +429,7 @@ export default function PaymentRecord() {
|
|||||||
permissions="read"
|
permissions="read"
|
||||||
asset={info.row.original.corporateTransfer}
|
asset={info.row.original.corporateTransfer}
|
||||||
paymentId={info.row.original.id}
|
paymentId={info.row.original.id}
|
||||||
|
canEdit={!info.row.original.isPaid}
|
||||||
type="corporate"
|
type="corporate"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -442,6 +445,7 @@ export default function PaymentRecord() {
|
|||||||
permissions={info.row.original.isPaid ? "read" : "write"}
|
permissions={info.row.original.isPaid ? "read" : "write"}
|
||||||
asset={info.row.original.commissionTransfer}
|
asset={info.row.original.commissionTransfer}
|
||||||
paymentId={info.row.original.id}
|
paymentId={info.row.original.id}
|
||||||
|
canEdit={!info.row.original.isPaid}
|
||||||
type="commission"
|
type="commission"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -460,6 +464,7 @@ export default function PaymentRecord() {
|
|||||||
permissions="write"
|
permissions="write"
|
||||||
asset={info.row.original.corporateTransfer}
|
asset={info.row.original.corporateTransfer}
|
||||||
paymentId={info.row.original.id}
|
paymentId={info.row.original.id}
|
||||||
|
canEdit={!info.row.original.isPaid}
|
||||||
type="corporate"
|
type="corporate"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -475,6 +480,7 @@ export default function PaymentRecord() {
|
|||||||
permissions="write"
|
permissions="write"
|
||||||
asset={info.row.original.commissionTransfer}
|
asset={info.row.original.commissionTransfer}
|
||||||
paymentId={info.row.original.id}
|
paymentId={info.row.original.id}
|
||||||
|
canEdit={!info.row.original.isPaid}
|
||||||
type="commission"
|
type="commission"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -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 <span>{finalValue}</span>;
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
];
|
||||||
|
return [];
|
||||||
|
};
|
||||||
|
|
||||||
const defaultColumns = [
|
const defaultColumns = [
|
||||||
columnHelper.accessor("corporate", {
|
columnHelper.accessor("corporate", {
|
||||||
header: "Corporate ID",
|
header: "Corporate ID",
|
||||||
@@ -593,24 +624,7 @@ export default function PaymentRecord() {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
columnHelper.accessor("agentCommission", {
|
...commissionColumn(),
|
||||||
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 <span>{finalValue}</span>;
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
columnHelper.accessor("isPaid", {
|
columnHelper.accessor("isPaid", {
|
||||||
header: "Paid",
|
header: "Paid",
|
||||||
id: "isPaid",
|
id: "isPaid",
|
||||||
|
|||||||
Reference in New Issue
Block a user