Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
29b3d5d4e5 | ||
|
|
ef32d5a917 | ||
|
|
a4945a87cf | ||
|
|
183a2c99ed | ||
|
|
279cd19308 | ||
|
|
de791fd17d | ||
|
|
d06f80e572 | ||
|
|
e0f0b2f1e9 | ||
|
|
82857b5aa8 | ||
|
|
5b478c327d | ||
|
|
6ec8b8400f | ||
|
|
19461098a0 | ||
|
|
74dcc8e5ac | ||
|
|
bd1043a3f4 | ||
|
|
107cd9753e | ||
|
|
194604004e | ||
|
|
bb920ce6f0 | ||
|
|
c0315a705d | ||
|
|
fbc437a670 | ||
|
|
e0f0700398 | ||
|
|
defd9685e0 | ||
|
|
1ed62b0d3f | ||
|
|
91de6df04d | ||
|
|
a5d97d65e1 | ||
|
|
f0128f66b0 | ||
|
|
b33c68feb0 | ||
|
|
15655e3987 | ||
|
|
d8b3864411 | ||
|
|
194cbd6ca8 | ||
|
|
d5445c2282 | ||
|
|
dcfefc8371 | ||
|
|
b5f14335c4 | ||
|
|
d44ac949b5 | ||
|
|
a5e939221d | ||
|
|
833e3e5a9c | ||
|
|
ba1975dd6d | ||
|
|
3025ef3d21 | ||
|
|
8564f8af83 |
@@ -340,7 +340,7 @@ financeRouter.put('/:id/expenses/:expenseId', requireEventPermission(EXPENSE_EDI
|
|||||||
});
|
});
|
||||||
|
|
||||||
financeRouter.delete('/:id/expenses/:expenseId', requireEventPermission(EXPENSE_EDITORS), async (c) => {
|
financeRouter.delete('/:id/expenses/:expenseId', requireEventPermission(EXPENSE_EDITORS), async (c) => {
|
||||||
const eventId = c.req.param('id')!;
|
const eventId = c.req.param('id');
|
||||||
const closed = await assertOpen(c, eventId);
|
const closed = await assertOpen(c, eventId);
|
||||||
if (closed) return closed;
|
if (closed) return closed;
|
||||||
const existing = await dbGet<any>(
|
const existing = await dbGet<any>(
|
||||||
@@ -468,7 +468,7 @@ financeRouter.put('/:id/other-income/:incomeId', requireEventPermission('edit_ex
|
|||||||
});
|
});
|
||||||
|
|
||||||
financeRouter.delete('/:id/other-income/:incomeId', requireEventPermission('edit_expenses'), async (c) => {
|
financeRouter.delete('/:id/other-income/:incomeId', requireEventPermission('edit_expenses'), async (c) => {
|
||||||
const eventId = c.req.param('id')!;
|
const eventId = c.req.param('id');
|
||||||
const closed = await assertOpen(c, eventId);
|
const closed = await assertOpen(c, eventId);
|
||||||
if (closed) return closed;
|
if (closed) return closed;
|
||||||
const existing = await dbGet<any>(
|
const existing = await dbGet<any>(
|
||||||
@@ -594,10 +594,10 @@ financeRouter.put('/:id/partners/:partnerId', requireEventPermission('edit_expen
|
|||||||
|
|
||||||
financeRouter.delete('/:id/partners/:partnerId', requireEventPermission('edit_expenses'), async (c) => {
|
financeRouter.delete('/:id/partners/:partnerId', requireEventPermission('edit_expenses'), async (c) => {
|
||||||
if (!canManageSplit(c)) return splitForbidden(c);
|
if (!canManageSplit(c)) return splitForbidden(c);
|
||||||
const eventId = c.req.param('id')!;
|
const eventId = c.req.param('id');
|
||||||
const closed = await assertOpen(c, eventId);
|
const closed = await assertOpen(c, eventId);
|
||||||
if (closed) return closed;
|
if (closed) return closed;
|
||||||
const existing = await loadPartner(eventId, c.req.param('partnerId')!);
|
const existing = await loadPartner(eventId, c.req.param('partnerId'));
|
||||||
if (!existing) return c.json({ error: 'Partner not found' }, 404);
|
if (!existing) return c.json({ error: 'Partner not found' }, 404);
|
||||||
const fronted = await dbGet<any>(
|
const fronted = await dbGet<any>(
|
||||||
(db as any).select({ id: (eventExpenses as any).id }).from(eventExpenses).where(eq((eventExpenses as any).paidByPartnerId, existing.id))
|
(db as any).select({ id: (eventExpenses as any).id }).from(eventExpenses).where(eq((eventExpenses as any).paidByPartnerId, existing.id))
|
||||||
@@ -732,7 +732,7 @@ financeRouter.post('/:id/finance/unfinalize', requireEventPermission('view_finan
|
|||||||
if (!canUnfinalize(access)) {
|
if (!canUnfinalize(access)) {
|
||||||
return c.json({ error: 'Only admins and co-managers can unfinalize', code: 'EVENT_PERMISSION' }, 403);
|
return c.json({ error: 'Only admins and co-managers can unfinalize', code: 'EVENT_PERMISSION' }, 403);
|
||||||
}
|
}
|
||||||
const eventId = c.req.param('id')!;
|
const eventId = c.req.param('id');
|
||||||
const state = await getFinanceState(eventId);
|
const state = await getFinanceState(eventId);
|
||||||
if (state.status === 'open') return c.json({ error: 'Not finalized' }, 409);
|
if (state.status === 'open') return c.json({ error: 'Not finalized' }, 409);
|
||||||
const user = currentUser(c);
|
const user = currentUser(c);
|
||||||
@@ -921,8 +921,8 @@ financeRouter.put('/:id/members/:memberId', requireEventPermission('manage_team'
|
|||||||
});
|
});
|
||||||
|
|
||||||
financeRouter.delete('/:id/members/:memberId', requireEventPermission('manage_team'), async (c) => {
|
financeRouter.delete('/:id/members/:memberId', requireEventPermission('manage_team'), async (c) => {
|
||||||
const eventId = c.req.param('id')!;
|
const eventId = c.req.param('id');
|
||||||
const existing = await loadMember(eventId, c.req.param('memberId')!);
|
const existing = await loadMember(eventId, c.req.param('memberId'));
|
||||||
if (!existing) return c.json({ error: 'Member not found' }, 404);
|
if (!existing) return c.json({ error: 'Member not found' }, 404);
|
||||||
const user = currentUser(c);
|
const user = currentUser(c);
|
||||||
const target = await loadUser(existing.userId);
|
const target = await loadUser(existing.userId);
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ financeGlobalRouter.put('/settings/expense-categories/:id', ADMIN, zValidator('j
|
|||||||
});
|
});
|
||||||
|
|
||||||
financeGlobalRouter.delete('/settings/expense-categories/:id', ADMIN, async (c) => {
|
financeGlobalRouter.delete('/settings/expense-categories/:id', ADMIN, async (c) => {
|
||||||
const id = c.req.param('id')!;
|
const id = c.req.param('id');
|
||||||
const existing = await dbGet<any>((db as any).select().from(expenseCategories).where(eq((expenseCategories as any).id, id)));
|
const existing = await dbGet<any>((db as any).select().from(expenseCategories).where(eq((expenseCategories as any).id, id)));
|
||||||
if (!existing) return c.json({ error: 'Category not found' }, 404);
|
if (!existing) return c.json({ error: 'Category not found' }, 404);
|
||||||
const [usedByExpense, usedByTemplate] = await Promise.all([
|
const [usedByExpense, usedByTemplate] = await Promise.all([
|
||||||
@@ -161,7 +161,7 @@ financeGlobalRouter.put('/settings/expense-templates/:id', ADMIN, zValidator('js
|
|||||||
});
|
});
|
||||||
|
|
||||||
financeGlobalRouter.delete('/settings/expense-templates/:id', ADMIN, async (c) => {
|
financeGlobalRouter.delete('/settings/expense-templates/:id', ADMIN, async (c) => {
|
||||||
const id = c.req.param('id')!;
|
const id = c.req.param('id');
|
||||||
const existing = await dbGet<any>((db as any).select().from(expenseTemplates).where(eq((expenseTemplates as any).id, id)));
|
const existing = await dbGet<any>((db as any).select().from(expenseTemplates).where(eq((expenseTemplates as any).id, id)));
|
||||||
if (!existing) return c.json({ error: 'Template not found' }, 404);
|
if (!existing) return c.json({ error: 'Template not found' }, 404);
|
||||||
const [usedByExpense, usedByPack] = await Promise.all([
|
const [usedByExpense, usedByPack] = await Promise.all([
|
||||||
@@ -250,7 +250,7 @@ financeGlobalRouter.put('/settings/expense-template-packs/:id', ADMIN, zValidato
|
|||||||
});
|
});
|
||||||
|
|
||||||
financeGlobalRouter.delete('/settings/expense-template-packs/:id', ADMIN, async (c) => {
|
financeGlobalRouter.delete('/settings/expense-template-packs/:id', ADMIN, async (c) => {
|
||||||
const id = c.req.param('id')!;
|
const id = c.req.param('id');
|
||||||
const before = (await loadPacks()).find((p) => p.id === id);
|
const before = (await loadPacks()).find((p) => p.id === id);
|
||||||
if (!before) return c.json({ error: 'Pack not found' }, 404);
|
if (!before) return c.json({ error: 'Pack not found' }, 404);
|
||||||
await runOps([
|
await runOps([
|
||||||
|
|||||||
Reference in New Issue
Block a user