diff --git a/index.js b/index.js index 9733591..4cfa095 100644 --- a/index.js +++ b/index.js @@ -986,6 +986,7 @@ app.post("/all-payments/send", async (req, res) => { } else { await taavonSendDataZarinPal(province, data); } + await coll.deleteOne({ _id: new ObjectId(id) }); return res.json({ ok: true, message: "ارسال شد" }); } catch (err) { console.error("all-payments send error", err); @@ -993,6 +994,49 @@ app.post("/all-payments/send", async (req, res) => { } }); +// all-payments/remove: remove one payment from MongoDB +app.post("/all-payments/remove", async (req, res) => { + const { id } = req.body; + if (!id) { + return res.status(400).json({ error: "id is required" }); + } + try { + const coll = await getSepPayCollection(); + const result = await coll.deleteOne({ _id: new ObjectId(id) }); + if (result.deletedCount === 0) { + return res.status(404).json({ error: "Record not found" }); + } + return res.json({ ok: true, message: "حذف شد" }); + } catch (err) { + console.error("all-payments remove error", err); + return res.status(500).json({ error: err.message }); + } +}); + +// all-payments/remove-all: remove all payments from MongoDB +app.post("/all-payments/remove-all", async (req, res) => { + try { + const coll = await getSepPayCollection(); + const result = await coll.deleteMany({}); + return res.json({ + ok: true, + message: "همه حذف شد", + deletedCount: result.deletedCount, + }); + } catch (err) { + console.error("all-payments remove-all error", err); + return res.status(500).json({ error: err.message }); + } +}); + +// Province code (first 2 digits) -> name for all-payments +const PROVINCE_NAMES = { + 10: "تست", + 18: "همدان", + 47: "مرکزی", + 51: "کردستان", +}; + // all-payments: list of saved SEP pay requests (from MongoDB) app.get("/all-payments", async (req, res) => { let list = []; @@ -1003,10 +1047,15 @@ app.get("/all-payments", async (req, res) => { .sort({ createdAt: -1 }) .limit(500) .toArray(); - list = raw.map((doc) => ({ - ...doc, - _id: doc._id ? doc._id.toString() : doc._id, - })); + list = raw.map((doc) => { + const code = (doc.provincecode || "").toString().substring(0, 2); + const provinceName = PROVINCE_NAMES[code] || doc.provincecode || "-"; + return { + ...doc, + _id: doc._id ? doc._id.toString() : doc._id, + provinceName, + }; + }); } catch (err) { console.error("all-payments list error", err); } @@ -1033,9 +1082,14 @@ app.get("/all-payments", async (req, res) => { th, td { padding: 10px 12px; text-align: right; border-bottom: 1px solid #eee; } th { background: #fafafa; font-weight: bold; color: #555; } tr:hover { background: #f9f9f9; } - .btn-send { background: #1976d2; color: #fff; border: none; padding: 6px 12px; border-radius: 6px; cursor: pointer; font-size: 13px; } + .btn-send { background: #1976d2; color: #fff; border: none; padding: 6px 12px; border-radius: 6px; cursor: pointer; font-size: 13px; margin-left: 6px; } .btn-send:hover { background: #1565c0; } .btn-send:disabled { background: #9e9e9e; cursor: not-allowed; } + .btn-remove { background: #c62828; color: #fff; border: none; padding: 6px 12px; border-radius: 6px; cursor: pointer; font-size: 13px; } + .btn-remove:hover { background: #b71c1c; } + .btn-remove:disabled { background: #9e9e9e; cursor: not-allowed; } + .btn-remove-all { background: #c62828; color: #fff; border: none; padding: 8px 16px; border-radius: 6px; cursor: pointer; font-size: 14px; margin-bottom: 12px; } + .btn-remove-all:hover { background: #b71c1c; } .cell-msg { font-size: 12px; padding: 4px 0; } .cell-msg.ok { color: #2e7d32; } .cell-msg.err { color: #c62828; } @@ -1043,21 +1097,24 @@ app.get("/all-payments", async (req, res) => {

همه پرداخت‌ها

+