delete dealer

This commit is contained in:
2026-10-01 13:37:39 +05:30
parent 1ea59d8a3a
commit e5bc11b6de
2 changed files with 103 additions and 0 deletions
+46
View File
@@ -355,6 +355,52 @@ async function run(port) {
reassigned.status === 200 && reassigned.json.data.assignedDealerIds.includes(dealerC.json.data.id),
'assign dealer failed'
);
const dealerD = await request(port, 'POST', '/api/admin/dealers', {
token: adminToken,
body: { name: 'Delete Motors', code: 'DEL', district: 'Colombo', phone: '94776666666' },
});
assert(dealerD.status === 201, 'dealer for delete test failed');
await addStock('CH-DEL', 'EN-DEL', 1, dealerD.json.data.id);
const transferred = await request(port, 'POST', '/api/stocks/CH-DEL/transfer', {
token: adminToken,
body: { dealerId: dealerA.json.data.id },
});
assert(transferred.status === 200, 'transfer before delete failed');
const dealerDToken = await approveDealer('94776666666', adminToken);
const doomedEvent = await request(port, 'POST', '/api/events', {
token: dealerDToken,
body: {
dealerId: dealerD.json.data.id,
planType: 'general',
title: 'Going away',
description: 'Removed with the dealer',
expense: 10,
imageUrls: [],
},
});
assert(doomedEvent.status === 201, 'event before delete failed');
const repDelete = await request(port, 'DELETE', `/api/admin/dealers/${dealerD.json.data.id}`, {
token: repToken,
});
assert(repDelete.status === 403, 'sales rep should not delete a dealer');
const removed = await request(port, 'DELETE', `/api/admin/dealers/${dealerD.json.data.id}`, {
token: adminToken,
});
assert(removed.status === 200, `dealer delete failed ${removed.status} ${JSON.stringify(removed.json)}`);
const dealerGone = await prisma.dealer.findUnique({ where: { id: dealerD.json.data.id } });
const loginGone = await prisma.user.findUnique({ where: { phone: '94776666666' } });
const eventGone = await prisma.event.findUnique({ where: { id: doomedEvent.json.data.id } });
const stockKept = await prisma.stock.findUnique({ where: { chassisNumber: 'CH-DEL' } });
assert(!dealerGone && !loginGone && !eventGone, 'dealer, login, and plans should be removed');
assert(stockKept && stockKept.currentDealerId === dealerA.json.data.id, 'stock already transferred should stay');
const missingDelete = await request(port, 'DELETE', `/api/admin/dealers/${dealerD.json.data.id}`, {
token: adminToken,
});
assert(missingDelete.status === 404, 'deleting a missing dealer should be 404');
}
async function main() {
+57
View File
@@ -51,6 +51,63 @@ router.post(
})
);
router.delete(
'/dealers/:id',
requireRole('superAdmin'),
asyncHandler(async (req, res) => {
const id = String(req.params.id || '').trim();
const dealer = await prisma.dealer.findUnique({ where: { id } });
if (!dealer) throw httpError(404, 'Dealer not found');
await prisma.$transaction(async (tx) => {
const staff = await tx.user.findMany({
where: { dealerId: id },
select: { id: true },
});
const staffIds = staff.map((user) => user.id);
const stocks = await tx.stock.findMany({
where: { currentDealerId: id },
select: { id: true },
});
const stockIds = stocks.map((stock) => stock.id);
await tx.stockTransfer.deleteMany({
where: {
OR: [
{ fromDealerId: id },
{ toDealerId: id },
...(stockIds.length ? [{ stockId: { in: stockIds } }] : []),
],
},
});
if (staffIds.length) {
await tx.stockTransfer.updateMany({
where: { actorId: { in: staffIds } },
data: { actorId: req.user.id },
});
await tx.event.updateMany({
where: { createdById: { in: staffIds }, dealerId: { not: id } },
data: { createdById: req.user.id },
});
await tx.servicePoint.updateMany({
where: { createdById: { in: staffIds } },
data: { createdById: req.user.id },
});
}
await tx.event.deleteMany({ where: { dealerId: id } });
await tx.stock.deleteMany({ where: { currentDealerId: id } });
if (staffIds.length) {
await tx.user.deleteMany({ where: { id: { in: staffIds } } });
}
await tx.dealer.delete({ where: { id } });
});
return res.json({ success: true });
})
);
router.get(
'/sales-reps',
requireRole('superAdmin'),