From 7c7f5a7a7025eada52c9b5bc62da17ebbdf72e47 Mon Sep 17 00:00:00 2001 From: Abubeker Yasin Date: Fri, 4 Sep 2026 11:09:06 +0300 Subject: [PATCH] feat: ( permissions ) add granular CRUD, cancel and per-report keys --- .../seed/passenger-permissions.registry.ts | 172 ++++++++++++++++++ .../backoffice/src/lib/permissions.ts | 82 +++++++++ 2 files changed, 254 insertions(+) diff --git a/apps/edr-passenger-api/src/seed/passenger-permissions.registry.ts b/apps/edr-passenger-api/src/seed/passenger-permissions.registry.ts index d30f37d94..e907ef013 100644 --- a/apps/edr-passenger-api/src/seed/passenger-permissions.registry.ts +++ b/apps/edr-passenger-api/src/seed/passenger-permissions.registry.ts @@ -68,6 +68,87 @@ export const PASSENGER_PERMISSIONS: PassengerPermissionSeed[] = [ perm('b4e63290-cc3a-4df8-9f2a-9ff726e86e36', 'edr_passenger_app:payment_methods:view', 'View payment methods'), perm('f9fb6af2-e869-4e6e-938c-259643393315', 'edr_passenger_app:payment_methods:manage', 'Manage payment methods'), + // ── CRUD split — create / edit / delete for every resource that has a `:manage` ─── + perm('1e443b37-e4f5-458f-bfcb-7a74acb9aaed', 'edr_passenger_app:bookings:create', 'Create bookings'), + perm('a7c66e27-bad9-4459-bf89-3624d11a9f49', 'edr_passenger_app:bookings:edit', 'Edit bookings'), + perm('f8b3ef47-7f58-41c2-af77-c55905b6bcd4', 'edr_passenger_app:bookings:delete', 'Delete bookings'), + perm('2cd6e2ad-e614-49c3-bd37-2a2286659702', 'edr_passenger_app:passengers:create', 'Create passengers'), + perm('be6b1ee9-7685-4e14-bcfb-60710791dac0', 'edr_passenger_app:passengers:edit', 'Edit passengers'), + perm('f97793b5-2500-4c91-add6-785a31dd21ac', 'edr_passenger_app:passengers:delete', 'Delete passengers'), + perm('78afaaab-e004-48a7-bb91-3d8c6195a624', 'edr_passenger_app:tickets:create', 'Create tickets'), + perm('bf148b6a-d5e6-489c-823c-3cabc4d0f7db', 'edr_passenger_app:tickets:edit', 'Edit tickets'), + perm('3557699a-5eee-480e-b9c5-7a731c546c12', 'edr_passenger_app:tickets:delete', 'Delete tickets'), + perm('800dee2f-6d6a-42e2-8ad3-dffbc66508d0', 'edr_passenger_app:payments:create', 'Create payments'), + perm('3e029a68-f7d5-4857-a4de-30a8bce27e9a', 'edr_passenger_app:payments:edit', 'Edit payments'), + perm('90965ca7-976b-476f-b7bb-96b96f081e6d', 'edr_passenger_app:payments:delete', 'Delete payments'), + perm('b656ef2a-07d2-4a14-9ae5-d16fd8311430', 'edr_passenger_app:payment_methods:create', 'Create payment methods'), + perm('58fda910-afa9-45f8-8316-491a7ee66c19', 'edr_passenger_app:payment_methods:edit', 'Edit payment methods'), + perm('d37ea9a6-1003-4dea-a41b-e12d43b0b3c7', 'edr_passenger_app:payment_methods:delete', 'Delete payment methods'), + perm('ab666cff-8bf1-4664-9b5c-47ce7ad680e8', 'edr_passenger_app:stations:create', 'Create stations'), + perm('30f71070-a6ae-466f-a7fe-67d31dbec79b', 'edr_passenger_app:stations:edit', 'Edit stations'), + perm('3e0b3798-d0ec-427d-b775-452e848538c7', 'edr_passenger_app:stations:delete', 'Delete stations'), + perm('832dc94d-d8a2-4bea-8de6-75ec5cc53577', 'edr_passenger_app:trains:create', 'Create trains'), + perm('032eb29d-c9ae-4974-88f4-7aa386fd988e', 'edr_passenger_app:trains:edit', 'Edit trains'), + perm('b9eeb7a7-9bb2-441e-8780-f9bbfd361608', 'edr_passenger_app:trains:delete', 'Delete trains'), + perm('4c2b86b1-7ba4-4fbe-b317-c2f98270cdf4', 'edr_passenger_app:coaches:create', 'Create coaches'), + perm('6bedb989-06fc-4609-9a3a-f73f9bb7d878', 'edr_passenger_app:coaches:edit', 'Edit coaches'), + perm('7d01fdcf-0661-479a-ad0f-af703a479520', 'edr_passenger_app:coaches:delete', 'Delete coaches'), + perm('7da048d8-eb12-4ea3-8204-2afe3778cd77', 'edr_passenger_app:seats:create', 'Create seats'), + perm('08ec0c8d-23a3-4061-8060-78223d3b9461', 'edr_passenger_app:seats:edit', 'Edit seats'), + perm('f72d65a9-5269-49e2-bcdb-5df69869119b', 'edr_passenger_app:seats:delete', 'Delete seats'), + perm('22c8f4f2-a1a3-48a6-8546-a8adf41dfbc2', 'edr_passenger_app:classes:create', 'Create classes'), + perm('c567c887-7c69-444c-a24b-78acd20692ac', 'edr_passenger_app:classes:edit', 'Edit classes'), + perm('e858d0f4-96e1-4614-95c2-1cf8adbb2494', 'edr_passenger_app:classes:delete', 'Delete classes'), + perm('b69019ed-2e55-4452-9b99-14a42781ab33', 'edr_passenger_app:routes:create', 'Create routes'), + perm('cf708629-cd10-4dd1-b287-4d043ec1ef79', 'edr_passenger_app:routes:edit', 'Edit routes'), + perm('084ae4a0-7c86-4d60-aefd-0ad768ae7394', 'edr_passenger_app:routes:delete', 'Delete routes'), + perm('827d5b4f-8a9d-4678-807d-92fc61a640e5', 'edr_passenger_app:schedules:create', 'Create schedules'), + perm('2c65502e-adda-4f5f-a38a-d964134ea826', 'edr_passenger_app:schedules:edit', 'Edit schedules'), + perm('ab592f0d-480e-4b68-99f1-fd98573beffb', 'edr_passenger_app:schedules:delete', 'Delete schedules'), + perm('1b04a00e-0027-4e77-9f29-33b77d7b1cfc', 'edr_passenger_app:packages:create', 'Create packages'), + perm('f9124c13-2314-42ea-8836-61fe981d6398', 'edr_passenger_app:packages:edit', 'Edit packages'), + perm('2e2b9fc9-b2ca-4502-ba74-8563bce6c94c', 'edr_passenger_app:packages:delete', 'Delete packages'), + perm('1c5cb191-25d3-4d6d-8fcf-168c09c434cd', 'edr_passenger_app:inquiries:create', 'Create package inquiries'), + perm('054c8ffd-0d82-4014-ac0d-8fd2e1bc257c', 'edr_passenger_app:inquiries:edit', 'Edit package inquiries'), + perm('dac24152-465c-4c89-a547-c73ad0818e34', 'edr_passenger_app:inquiries:delete', 'Delete package inquiries'), + perm('aa5bf1ee-5771-4008-a8c7-fd30cb112727', 'edr_passenger_app:tariff_rates:create', 'Create tariff rates'), + perm('24a53bea-cfcf-4ddf-a156-a3f4ca90ac1c', 'edr_passenger_app:tariff_rates:edit', 'Edit tariff rates'), + perm('540a9fe9-bd4e-4d9d-acbf-6a00762e4929', 'edr_passenger_app:tariff_rates:delete', 'Delete tariff rates'), + perm('cabb6e6d-3ba4-455e-b19b-eccdb60c9bca', 'edr_passenger_app:fraud:create', 'Create fraud rules'), + perm('a9a6942f-8ba0-4b33-abc2-0d4c25d62e26', 'edr_passenger_app:fraud:edit', 'Edit fraud rules'), + perm('9415abe7-0c11-4e8c-b59b-4e07d18ba649', 'edr_passenger_app:fraud:delete', 'Delete fraud rules'), + perm('5e8eaf85-d453-48fe-91ae-4bf2f6a8716f', 'edr_passenger_app:agents:create', 'Create agents'), + perm('763bbe62-53e7-494c-8a8e-553c52bdfb29', 'edr_passenger_app:agents:edit', 'Edit agents'), + perm('4fe4088f-fa55-4117-bd71-305a65f69056', 'edr_passenger_app:agents:delete', 'Delete agents'), + perm('6a678100-4dce-4fda-9cdb-7f75ffa1f187', 'edr_passenger_app:currencies:create', 'Create currencies'), + perm('c1d66663-6077-4199-9e2e-00b254e5a954', 'edr_passenger_app:currencies:edit', 'Edit currencies'), + perm('8c1295e8-fa77-4ab7-9684-e55fa970010c', 'edr_passenger_app:currencies:delete', 'Delete currencies'), + + // ── Domain actions that create/edit/delete cannot express ─────────────────────── + perm('2ce6d0e3-3426-4424-a239-3ddf95b001c4', 'edr_passenger_app:schedules:cancel', 'Cancel schedules'), + perm('045d3f55-d5fc-4ef4-8d4f-949496b77c25', 'edr_passenger_app:seats:block', 'Block and unblock seats'), + perm('8ac8f5de-26b0-469b-993e-2abfa005d223', 'edr_passenger_app:packages:publish', 'Activate and deactivate packages'), + + // ── Schedule fares — split out of `schedules:manage` ──────────────────────────── + perm('7e7406b3-77dc-422a-b5de-a8286f973b38', 'edr_passenger_app:schedule_fares:view', 'View schedule fares'), + perm('c4c205a1-06d4-4a60-a2cd-c06f4732a733', 'edr_passenger_app:schedule_fares:create', 'Create schedule fares'), + perm('516f8fe2-792d-4f4a-a1d4-ea1a0bd759e2', 'edr_passenger_app:schedule_fares:edit', 'Edit schedule fares'), + perm('30e8aa00-e32d-492e-bfbe-ee8fe1e9ad24', 'edr_passenger_app:schedule_fares:delete', 'Delete schedule fares'), + perm('d358ede2-0c19-48d2-92a6-aa54fa91086d', 'edr_passenger_app:schedule_fares:manage', 'Manage schedule fares'), + + // ── Per-report permissions — `reports:view` stays the all-reports umbrella ────── + perm('69cf2f52-e8be-447e-90fa-9d4f12d77824', 'edr_passenger_app:reports_overall:view', 'View overall report'), + perm('d4229615-1a7a-40c1-a8da-5fbc9681f8da', 'edr_passenger_app:reports_finance:view', 'View finance summary report'), + perm('a8291a6f-bd38-4be2-a9e5-0b3036242bd5', 'edr_passenger_app:reports_finance:export', 'Export finance summary report'), + perm('d50fd4ec-1914-48e2-ade2-056d3d97a79b', 'edr_passenger_app:reports_coach_utilization:view', 'View coach utilization report'), + perm('aa0c3321-ff08-4c7e-8e0f-24042c68c8a8', 'edr_passenger_app:reports_seat_status:view', 'View seat status report'), + perm('0ea7547f-d8a0-448c-a0d8-9341cd00383a', 'edr_passenger_app:reports_blocked_seats:view', 'View blocked seat revenue loss report'), + perm('4855be9b-23ac-4f27-8c5f-2a18974afeb7', 'edr_passenger_app:reports_blocked_seats:export', 'Export blocked seat revenue loss report'), + perm('8fec9101-4a7b-4089-b4cf-a252ca80481a', 'edr_passenger_app:reports_passengers:view', 'View passengers report'), + perm('744f6cd0-cbef-4beb-8afe-180866e3a4a2', 'edr_passenger_app:reports_boarding:view', 'View boarding report'), + perm('2a8fb77e-4bf6-42e0-80ca-53ca142b1b23', 'edr_passenger_app:reports_payments:view', 'View payments report'), + perm('3476bbe6-47f5-4040-8b3c-88b417b1c0c2', 'edr_passenger_app:reports_catalog:view', 'View generated report catalog'), + perm('49fd28cd-5b58-4403-8e53-1df4b93cbbd2', 'edr_passenger_app:admin', 'Full admin access'), ]; @@ -79,19 +160,31 @@ export const PASSENGER_PERMS = { manage: 'edr_passenger_app:bookings:manage', cancel: 'edr_passenger_app:bookings:cancel', reschedule: 'edr_passenger_app:bookings:reschedule', + create: 'edr_passenger_app:bookings:create', + edit: 'edr_passenger_app:bookings:edit', + delete: 'edr_passenger_app:bookings:delete', }, passengers: { view: 'edr_passenger_app:passengers:view', manage: 'edr_passenger_app:passengers:manage', + create: 'edr_passenger_app:passengers:create', + edit: 'edr_passenger_app:passengers:edit', + delete: 'edr_passenger_app:passengers:delete', }, tickets: { view: 'edr_passenger_app:tickets:view', manage: 'edr_passenger_app:tickets:manage', generate: 'edr_passenger_app:tickets:generate', + create: 'edr_passenger_app:tickets:create', + edit: 'edr_passenger_app:tickets:edit', + delete: 'edr_passenger_app:tickets:delete', }, payments: { view: 'edr_passenger_app:payments:view', manage: 'edr_passenger_app:payments:manage', + create: 'edr_passenger_app:payments:create', + edit: 'edr_passenger_app:payments:edit', + delete: 'edr_passenger_app:payments:delete', // legacy keys — retained as aliases for backward compatibility viewAll: 'edr_passenger_app:payments:view_all', refund: 'edr_passenger_app:payments:refund', @@ -100,53 +193,126 @@ export const PASSENGER_PERMS = { paymentMethods: { view: 'edr_passenger_app:payment_methods:view', manage: 'edr_passenger_app:payment_methods:manage', + create: 'edr_passenger_app:payment_methods:create', + edit: 'edr_passenger_app:payment_methods:edit', + delete: 'edr_passenger_app:payment_methods:delete', }, stations: { view: 'edr_passenger_app:stations:view', manage: 'edr_passenger_app:stations:manage', + create: 'edr_passenger_app:stations:create', + edit: 'edr_passenger_app:stations:edit', + delete: 'edr_passenger_app:stations:delete', }, trains: { view: 'edr_passenger_app:trains:view', manage: 'edr_passenger_app:trains:manage', + create: 'edr_passenger_app:trains:create', + edit: 'edr_passenger_app:trains:edit', + delete: 'edr_passenger_app:trains:delete', }, coaches: { view: 'edr_passenger_app:coaches:view', manage: 'edr_passenger_app:coaches:manage', + create: 'edr_passenger_app:coaches:create', + edit: 'edr_passenger_app:coaches:edit', + delete: 'edr_passenger_app:coaches:delete', }, seats: { view: 'edr_passenger_app:seats:view', manage: 'edr_passenger_app:seats:manage', + create: 'edr_passenger_app:seats:create', + edit: 'edr_passenger_app:seats:edit', + delete: 'edr_passenger_app:seats:delete', + block: 'edr_passenger_app:seats:block', }, classes: { view: 'edr_passenger_app:classes:view', manage: 'edr_passenger_app:classes:manage', + create: 'edr_passenger_app:classes:create', + edit: 'edr_passenger_app:classes:edit', + delete: 'edr_passenger_app:classes:delete', }, routes: { view: 'edr_passenger_app:routes:view', manage: 'edr_passenger_app:routes:manage', + create: 'edr_passenger_app:routes:create', + edit: 'edr_passenger_app:routes:edit', + delete: 'edr_passenger_app:routes:delete', }, schedules: { view: 'edr_passenger_app:schedules:view', manage: 'edr_passenger_app:schedules:manage', + create: 'edr_passenger_app:schedules:create', + edit: 'edr_passenger_app:schedules:edit', + delete: 'edr_passenger_app:schedules:delete', + cancel: 'edr_passenger_app:schedules:cancel', + }, + /** + * Fare rules hanging off /schedules. Split out of `schedules:manage` so editing a + * timetable and changing a price are separate grants. Guards keep `schedules.manage` + * in the OR array so today's fare editors are not locked out. + */ + scheduleFares: { + view: 'edr_passenger_app:schedule_fares:view', + manage: 'edr_passenger_app:schedule_fares:manage', + create: 'edr_passenger_app:schedule_fares:create', + edit: 'edr_passenger_app:schedule_fares:edit', + delete: 'edr_passenger_app:schedule_fares:delete', }, packages: { view: 'edr_passenger_app:packages:view', manage: 'edr_passenger_app:packages:manage', + create: 'edr_passenger_app:packages:create', + edit: 'edr_passenger_app:packages:edit', + delete: 'edr_passenger_app:packages:delete', + publish: 'edr_passenger_app:packages:publish', }, inquiries: { view: 'edr_passenger_app:inquiries:view', manage: 'edr_passenger_app:inquiries:manage', + create: 'edr_passenger_app:inquiries:create', + edit: 'edr_passenger_app:inquiries:edit', + delete: 'edr_passenger_app:inquiries:delete', }, tariffRates: { view: 'edr_passenger_app:tariff_rates:view', manage: 'edr_passenger_app:tariff_rates:manage', + create: 'edr_passenger_app:tariff_rates:create', + edit: 'edr_passenger_app:tariff_rates:edit', + delete: 'edr_passenger_app:tariff_rates:delete', }, reports: { + /** + * The all-reports umbrella. Kept as a plain string — `reports.controller.ts` and the + * `finance` / `financeManager` / `director` presets depend on it — and kept in every + * per-report guard array so existing holders keep seeing every report. + */ view: 'edr_passenger_app:reports:view', + + // Per-report keys. Grant these instead of `view` to hand out a subset. + overall: { view: 'edr_passenger_app:reports_overall:view' }, + finance: { + view: 'edr_passenger_app:reports_finance:view', + export: 'edr_passenger_app:reports_finance:export', + }, + coachUtilization: { view: 'edr_passenger_app:reports_coach_utilization:view' }, + seatStatus: { view: 'edr_passenger_app:reports_seat_status:view' }, + blockedSeats: { + view: 'edr_passenger_app:reports_blocked_seats:view', + export: 'edr_passenger_app:reports_blocked_seats:export', + }, + passengers: { view: 'edr_passenger_app:reports_passengers:view' }, + boarding: { view: 'edr_passenger_app:reports_boarding:view' }, + payments: { view: 'edr_passenger_app:reports_payments:view' }, + catalog: { view: 'edr_passenger_app:reports_catalog:view' }, }, fraud: { view: 'edr_passenger_app:fraud:view', manage: 'edr_passenger_app:fraud:manage', + create: 'edr_passenger_app:fraud:create', + edit: 'edr_passenger_app:fraud:edit', + delete: 'edr_passenger_app:fraud:delete', }, audit: { view: 'edr_passenger_app:audit:view', @@ -154,10 +320,16 @@ export const PASSENGER_PERMS = { agents: { view: 'edr_passenger_app:agents:view', manage: 'edr_passenger_app:agents:manage', + create: 'edr_passenger_app:agents:create', + edit: 'edr_passenger_app:agents:edit', + delete: 'edr_passenger_app:agents:delete', }, currencies: { view: 'edr_passenger_app:currencies:view', manage: 'edr_passenger_app:currencies:manage', + create: 'edr_passenger_app:currencies:create', + edit: 'edr_passenger_app:currencies:edit', + delete: 'edr_passenger_app:currencies:delete', }, notifications: { send: 'edr_passenger_app:notifications:send', diff --git a/apps/edr-passenger-web/backoffice/src/lib/permissions.ts b/apps/edr-passenger-web/backoffice/src/lib/permissions.ts index 2c2d54f80..6c8e03dc1 100644 --- a/apps/edr-passenger-web/backoffice/src/lib/permissions.ts +++ b/apps/edr-passenger-web/backoffice/src/lib/permissions.ts @@ -4,65 +4,118 @@ export const PERMS = { view: 'edr_passenger_app:bookings:view', manage: 'edr_passenger_app:bookings:manage', cancel: 'edr_passenger_app:bookings:cancel', + reschedule: 'edr_passenger_app:bookings:reschedule', + create: 'edr_passenger_app:bookings:create', + edit: 'edr_passenger_app:bookings:edit', + delete: 'edr_passenger_app:bookings:delete', }, passengers: { view: 'edr_passenger_app:passengers:view', manage: 'edr_passenger_app:passengers:manage', + create: 'edr_passenger_app:passengers:create', + edit: 'edr_passenger_app:passengers:edit', + delete: 'edr_passenger_app:passengers:delete', }, tickets: { view: 'edr_passenger_app:tickets:view', manage: 'edr_passenger_app:tickets:manage', generate: 'edr_passenger_app:tickets:generate', + create: 'edr_passenger_app:tickets:create', + edit: 'edr_passenger_app:tickets:edit', + delete: 'edr_passenger_app:tickets:delete', }, // ── Master Data ──────────────────────────────────────────────── stations: { view: 'edr_passenger_app:stations:view', manage: 'edr_passenger_app:stations:manage', + create: 'edr_passenger_app:stations:create', + edit: 'edr_passenger_app:stations:edit', + delete: 'edr_passenger_app:stations:delete', }, trains: { view: 'edr_passenger_app:trains:view', manage: 'edr_passenger_app:trains:manage', + create: 'edr_passenger_app:trains:create', + edit: 'edr_passenger_app:trains:edit', + delete: 'edr_passenger_app:trains:delete', }, coaches: { view: 'edr_passenger_app:coaches:view', manage: 'edr_passenger_app:coaches:manage', + create: 'edr_passenger_app:coaches:create', + edit: 'edr_passenger_app:coaches:edit', + delete: 'edr_passenger_app:coaches:delete', }, seats: { view: 'edr_passenger_app:seats:view', manage: 'edr_passenger_app:seats:manage', + create: 'edr_passenger_app:seats:create', + edit: 'edr_passenger_app:seats:edit', + delete: 'edr_passenger_app:seats:delete', + block: 'edr_passenger_app:seats:block', }, classes: { view: 'edr_passenger_app:classes:view', manage: 'edr_passenger_app:classes:manage', + create: 'edr_passenger_app:classes:create', + edit: 'edr_passenger_app:classes:edit', + delete: 'edr_passenger_app:classes:delete', }, routes: { view: 'edr_passenger_app:routes:view', manage: 'edr_passenger_app:routes:manage', + create: 'edr_passenger_app:routes:create', + edit: 'edr_passenger_app:routes:edit', + delete: 'edr_passenger_app:routes:delete', }, schedules: { view: 'edr_passenger_app:schedules:view', manage: 'edr_passenger_app:schedules:manage', + create: 'edr_passenger_app:schedules:create', + edit: 'edr_passenger_app:schedules:edit', + delete: 'edr_passenger_app:schedules:delete', + cancel: 'edr_passenger_app:schedules:cancel', + }, + scheduleFares: { + view: 'edr_passenger_app:schedule_fares:view', + manage: 'edr_passenger_app:schedule_fares:manage', + create: 'edr_passenger_app:schedule_fares:create', + edit: 'edr_passenger_app:schedule_fares:edit', + delete: 'edr_passenger_app:schedule_fares:delete', }, // ── Tourism ──────────────────────────────────────────────────── packages: { view: 'edr_passenger_app:packages:view', manage: 'edr_passenger_app:packages:manage', + create: 'edr_passenger_app:packages:create', + edit: 'edr_passenger_app:packages:edit', + delete: 'edr_passenger_app:packages:delete', + publish: 'edr_passenger_app:packages:publish', }, inquiries: { view: 'edr_passenger_app:inquiries:view', manage: 'edr_passenger_app:inquiries:manage', + create: 'edr_passenger_app:inquiries:create', + edit: 'edr_passenger_app:inquiries:edit', + delete: 'edr_passenger_app:inquiries:delete', }, // ── Finance ──────────────────────────────────────────────────── tariffRates: { view: 'edr_passenger_app:tariff_rates:view', manage: 'edr_passenger_app:tariff_rates:manage', + create: 'edr_passenger_app:tariff_rates:create', + edit: 'edr_passenger_app:tariff_rates:edit', + delete: 'edr_passenger_app:tariff_rates:delete', }, payments: { view: 'edr_passenger_app:payments:view', manage: 'edr_passenger_app:payments:manage', + create: 'edr_passenger_app:payments:create', + edit: 'edr_passenger_app:payments:edit', + delete: 'edr_passenger_app:payments:delete', // legacy aliases — still honoured by the backend guards viewAll: 'edr_passenger_app:payments:view_all', refund: 'edr_passenger_app:payments:refund', @@ -71,18 +124,44 @@ export const PERMS = { paymentMethods: { view: 'edr_passenger_app:payment_methods:view', manage: 'edr_passenger_app:payment_methods:manage', + create: 'edr_passenger_app:payment_methods:create', + edit: 'edr_passenger_app:payment_methods:edit', + delete: 'edr_passenger_app:payment_methods:delete', }, currencies: { view: 'edr_passenger_app:currencies:view', manage: 'edr_passenger_app:currencies:manage', + create: 'edr_passenger_app:currencies:create', + edit: 'edr_passenger_app:currencies:edit', + delete: 'edr_passenger_app:currencies:delete', }, reports: { + // all-reports umbrella — kept, and kept in every per-report guard array view: 'edr_passenger_app:reports:view', + + overall: { view: 'edr_passenger_app:reports_overall:view' }, + finance: { + view: 'edr_passenger_app:reports_finance:view', + export: 'edr_passenger_app:reports_finance:export', + }, + coachUtilization: { view: 'edr_passenger_app:reports_coach_utilization:view' }, + seatStatus: { view: 'edr_passenger_app:reports_seat_status:view' }, + blockedSeats: { + view: 'edr_passenger_app:reports_blocked_seats:view', + export: 'edr_passenger_app:reports_blocked_seats:export', + }, + passengers: { view: 'edr_passenger_app:reports_passengers:view' }, + boarding: { view: 'edr_passenger_app:reports_boarding:view' }, + payments: { view: 'edr_passenger_app:reports_payments:view' }, + catalog: { view: 'edr_passenger_app:reports_catalog:view' }, }, fraud: { view: 'edr_passenger_app:fraud:view', manage: 'edr_passenger_app:fraud:manage', + create: 'edr_passenger_app:fraud:create', + edit: 'edr_passenger_app:fraud:edit', + delete: 'edr_passenger_app:fraud:delete', }, audit: { view: 'edr_passenger_app:audit:view', @@ -90,6 +169,9 @@ export const PERMS = { agents: { view: 'edr_passenger_app:agents:view', manage: 'edr_passenger_app:agents:manage', + create: 'edr_passenger_app:agents:create', + edit: 'edr_passenger_app:agents:edit', + delete: 'edr_passenger_app:agents:delete', }, notifications: { send: 'edr_passenger_app:notifications:send',