delete dealer
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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'),
|
||||
|
||||
Reference in New Issue
Block a user