diff --git a/apps/edr-freight-web/backoffice/src/App.tsx b/apps/edr-freight-web/backoffice/src/App.tsx index f48f302a1..83cf82909 100644 --- a/apps/edr-freight-web/backoffice/src/App.tsx +++ b/apps/edr-freight-web/backoffice/src/App.tsx @@ -51,8 +51,7 @@ import { NO_ACCESS_PATH, resolveLandingPath } from "./lib/landing"; import NoAccessPage from "./pages/NoAccessPage"; import FileUploadSettingsPage from "./pages/documents/FileUploadSettingsPage"; import DropdownSettingsPage from "./pages/dropdown_settings/DropdownSettingsPage"; -import StampSettings from "./record-management/components/Settings/uploadTeeterandSingature"; -import InvoiceStampSettingsPage from "./pages/settings/InvoiceStampSettingsPage"; +import CompanyStampSettingsPage from "./pages/settings/CompanyStampSettingsPage"; import ContractTemplatesPage from "./pages/contract_templates/ContractTemplatesPage"; import PortalContentPage from "./pages/portal_content/PortalContentPage"; import ContractTemplateEditorPage from "./pages/contract_templates/ContractTemplateEditorPage"; @@ -786,24 +785,28 @@ const App = () => { } /> + {/* + The ONE company stamp, for every generated document. The per-officer + teeter (ማህተም) that used to sit beside it at /dashboard/stamp-settings + now lives at /user-management/teeter-and-signature — it is a different + thing (an individual's approval stamp), and pairing the two here was + the duplication. + */} - - - } - /> - - + } /> + {/* Old URL kept alive so existing links/bookmarks do not 404. */} + } + /> , - permission: FREIGHT_PERMS.settings.stamp.view, - }, - { - label: "Invoice stamp", - href: "/dashboard/invoice-stamp-settings", - icon: , + icon: , permission: FREIGHT_PERMS.settings.invoiceStamp.view, }, { diff --git a/apps/edr-freight-web/backoffice/src/pages/settings/InvoiceStampSettingsPage.tsx b/apps/edr-freight-web/backoffice/src/pages/settings/CompanyStampSettingsPage.tsx similarity index 70% rename from apps/edr-freight-web/backoffice/src/pages/settings/InvoiceStampSettingsPage.tsx rename to apps/edr-freight-web/backoffice/src/pages/settings/CompanyStampSettingsPage.tsx index 407218d70..730458f2a 100644 --- a/apps/edr-freight-web/backoffice/src/pages/settings/InvoiceStampSettingsPage.tsx +++ b/apps/edr-freight-web/backoffice/src/pages/settings/CompanyStampSettingsPage.tsx @@ -17,10 +17,16 @@ import { } from "@/hooks/useStampSettings"; /** - * The one company stamp/seal stamped onto every generated invoice/receipt - * PDF (InvoiceDocumentService). Single global image — no per-employee choice. + * The ONE company stamp/seal, read by every document path server-side via + * StampSettingsService: invoices and receipts (InvoiceDocumentService), + * warehouse release + handover papers, and the EDR side of contract signature + * blocks. Single global image — no per-employee choice, and staff never upload + * one when signing. + * + * Not to be confused with the per-officer teeter (ማህተም) at + * /user-management/teeter-and-signature, which is genuinely per-person. */ -export default function InvoiceStampSettingsPage() { +export default function CompanyStampSettingsPage() { const { data, isLoading } = useStampSettingsQuery(); const setStamp = useSetStamp(); const clearStamp = useClearStamp(); @@ -47,11 +53,13 @@ export default function InvoiceStampSettingsPage() {
- Invoice stamp + Company stamp - Stamped onto every generated invoice and receipt PDF. Replacing it - here changes it everywhere at once — there is no per-invoice or - per-user choice. + The single EDR seal, applied to every generated document — invoices + and receipts, warehouse release and handover papers, and the EDR + side of signed contracts. Replacing it here changes it everywhere at + once; there is no per-document, per-invoice or per-employee choice. + Staff do not upload their own. diff --git a/apps/edr-freight-web/backoffice/src/user-management/route.tsx b/apps/edr-freight-web/backoffice/src/user-management/route.tsx index f1e2a8611..ed6b13413 100644 --- a/apps/edr-freight-web/backoffice/src/user-management/route.tsx +++ b/apps/edr-freight-web/backoffice/src/user-management/route.tsx @@ -3,7 +3,7 @@ import { Navigate, Outlet, Route } from "react-router-dom"; import { useAuth } from "@/auth/useAuth"; import { NO_ACCESS_PATH, resolveLandingPath } from "@/lib/landing"; -import { isSuperAdmin } from "@/lib/permissions"; +import { FREIGHT_PERMS, isSuperAdmin } from "@/lib/permissions"; import { WithPermission } from "@/shared/hooks/useHas"; import PendingExternalUsers from "@/super-admin/components/externalUsers/PendingExternalUsers"; import TemplatePage from "@/super-admin/components/templates/components/templates"; @@ -44,6 +44,8 @@ import { SidebarProvider } from "@/shared/common/ui/sidebar"; import { AuthProvider as UmAuthProvider } from "@/shared/context/AuthContext"; import { PermissionProvider } from "@/shared/context/PermissionContext"; import UserManagementPage from "@/pages/UserManagementPage"; +import { RequirePermission } from "@/components/auth/RequirePermission"; +import UploadTeeterAndSignature from "@/record-management/components/Settings/uploadTeeterandSingature"; /** * Provider shell for the vendored IAM UI. Feeds its Auth + Permission contexts @@ -138,6 +140,25 @@ export function UserManagementRoutes(): ReactElement { path="user-management/position-management" element={} /> + {/* + The per-officer teeter (ማህተም) + signature upload. This + is NOT the company stamp: it is the individual approval + stamp a record officer applies to records, locale-aware + (am/en) and genuinely per-person. It used to sit at + /dashboard/stamp-settings under Settings, next to the + single global company stamp, which read as duplication. + Permission gate unchanged from that route. + */} + + + + } + /> }