diff --git a/frontend/modules/directory/services/addresses.ts b/frontend/modules/directory/services/addresses.ts
new file mode 100644
index 0000000..3676e8f
--- /dev/null
+++ b/frontend/modules/directory/services/addresses.ts
@@ -0,0 +1,32 @@
+import type { Address, AddressWrite } from './dto/address'
+import type { HydraCollection } from '~/utils/api'
+import { extractHydraMembers } from '~/utils/api'
+
+type Owner = { client?: string, prospect?: string }
+
+export function useAddressService() {
+ const api = useApi()
+
+ async function getByOwner(owner: Owner): Promise
{
+ const data = await api.get>('/addresses', owner as Record)
+ return extractHydraMembers(data)
+ }
+
+ async function create(payload: AddressWrite): Promise {
+ return api.post('/addresses', payload as Record, {
+ toastSuccessKey: 'directory.addresses.saved',
+ })
+ }
+
+ async function update(id: number, payload: Partial): Promise {
+ return api.patch(`/addresses/${id}`, payload as Record, {
+ toastSuccessKey: 'directory.addresses.saved',
+ })
+ }
+
+ async function remove(id: number): Promise {
+ await api.delete(`/addresses/${id}`, {}, { toastSuccessKey: 'directory.addresses.deleted' })
+ }
+
+ return { getByOwner, create, update, remove }
+}
diff --git a/frontend/modules/directory/services/commercial-reports.ts b/frontend/modules/directory/services/commercial-reports.ts
new file mode 100644
index 0000000..4f27deb
--- /dev/null
+++ b/frontend/modules/directory/services/commercial-reports.ts
@@ -0,0 +1,32 @@
+import type { CommercialReport, CommercialReportWrite } from './dto/commercial-report'
+import type { HydraCollection } from '~/utils/api'
+import { extractHydraMembers } from '~/utils/api'
+
+type Owner = { client?: string, prospect?: string }
+
+export function useCommercialReportService() {
+ const api = useApi()
+
+ async function getByOwner(owner: Owner): Promise {
+ const data = await api.get>('/commercial_reports', owner as Record)
+ return extractHydraMembers(data)
+ }
+
+ async function create(payload: CommercialReportWrite): Promise {
+ return api.post('/commercial_reports', payload as Record, {
+ toastSuccessKey: 'directory.reports.saved',
+ })
+ }
+
+ async function update(id: number, payload: Partial): Promise {
+ return api.patch(`/commercial_reports/${id}`, payload as Record, {
+ toastSuccessKey: 'directory.reports.saved',
+ })
+ }
+
+ async function remove(id: number): Promise {
+ await api.delete(`/commercial_reports/${id}`, {}, { toastSuccessKey: 'directory.reports.deleted' })
+ }
+
+ return { getByOwner, create, update, remove }
+}
diff --git a/frontend/modules/directory/services/contacts.ts b/frontend/modules/directory/services/contacts.ts
new file mode 100644
index 0000000..551b3d2
--- /dev/null
+++ b/frontend/modules/directory/services/contacts.ts
@@ -0,0 +1,32 @@
+import type { Contact, ContactWrite } from './dto/contact'
+import type { HydraCollection } from '~/utils/api'
+import { extractHydraMembers } from '~/utils/api'
+
+type Owner = { client?: string, prospect?: string }
+
+export function useContactService() {
+ const api = useApi()
+
+ async function getByOwner(owner: Owner): Promise {
+ const data = await api.get>('/contacts', owner as Record)
+ return extractHydraMembers(data)
+ }
+
+ async function create(payload: ContactWrite): Promise {
+ return api.post('/contacts', payload as Record, {
+ toastSuccessKey: 'directory.contacts.saved',
+ })
+ }
+
+ async function update(id: number, payload: Partial): Promise {
+ return api.patch(`/contacts/${id}`, payload as Record, {
+ toastSuccessKey: 'directory.contacts.saved',
+ })
+ }
+
+ async function remove(id: number): Promise {
+ await api.delete(`/contacts/${id}`, {}, { toastSuccessKey: 'directory.contacts.deleted' })
+ }
+
+ return { getByOwner, create, update, remove }
+}
diff --git a/frontend/modules/directory/services/report-documents.ts b/frontend/modules/directory/services/report-documents.ts
new file mode 100644
index 0000000..3306496
--- /dev/null
+++ b/frontend/modules/directory/services/report-documents.ts
@@ -0,0 +1,39 @@
+import type { ReportDocument } from './dto/report-document'
+import type { HydraCollection } from '~/utils/api'
+import { extractHydraMembers } from '~/utils/api'
+import { $fetch } from 'ofetch'
+
+export function useReportDocumentService() {
+ const api = useApi()
+ const config = useRuntimeConfig()
+ const baseURL = config.public.apiBase || '/api'
+
+ async function getByReport(reportId: number): Promise {
+ const data = await api.get>('/report_documents', {
+ commercialReport: `/api/commercial_reports/${reportId}`,
+ })
+ return extractHydraMembers(data)
+ }
+
+ async function upload(reportId: number, file: File): Promise {
+ const formData = new FormData()
+ formData.append('file', file)
+ formData.append('commercialReport', `/api/commercial_reports/${reportId}`)
+
+ return $fetch(`${baseURL}/report_documents`, {
+ method: 'POST',
+ body: formData,
+ credentials: 'include',
+ })
+ }
+
+ async function remove(id: number): Promise {
+ await api.delete(`/report_documents/${id}`, {}, { toastSuccessKey: 'directory.documents.deleted' })
+ }
+
+ function getDownloadUrl(id: number): string {
+ return `${baseURL}/report_documents/${id}/download`
+ }
+
+ return { getByReport, upload, remove, getDownloadUrl }
+}