93 lines
3.6 KiB
TypeScript
93 lines
3.6 KiB
TypeScript
import type { Contact } from '~/modules/directory/services/dto/contact'
|
|
import type { Address } from '~/modules/directory/services/dto/address'
|
|
import { useContactService } from '~/modules/directory/services/contacts'
|
|
import { useAddressService } from '~/modules/directory/services/addresses'
|
|
|
|
type Owner = { client?: string, prospect?: string }
|
|
|
|
/**
|
|
* Logique partagée des fiches détail Client/Prospect : gestion des blocs
|
|
* répétables Contact et Adresse (chargement, ajout, édition par bloc avec
|
|
* persistance immédiate, suppression). Paramétré par l'IRI du propriétaire
|
|
* (`{ client }` ou `{ prospect }`), réutilisé tel quel par les deux pages.
|
|
*/
|
|
export function useDirectoryDetail(owner: Owner) {
|
|
const contactService = useContactService()
|
|
const addressService = useAddressService()
|
|
|
|
const contacts = ref<Contact[]>([])
|
|
const addresses = ref<Address[]>([])
|
|
|
|
function emptyContact(): Contact {
|
|
return { id: 0, firstName: null, lastName: null, jobTitle: null, email: null, phonePrimary: null, phoneSecondary: null, ...owner }
|
|
}
|
|
function emptyAddress(): Address {
|
|
return { id: 0, label: null, street: null, streetComplement: null, postalCode: null, city: null, country: 'FR', ...owner }
|
|
}
|
|
|
|
async function onContactInput(index: number, value: Contact): Promise<void> {
|
|
contacts.value[index] = value
|
|
await persistContact(index)
|
|
}
|
|
async function persistContact(index: number): Promise<void> {
|
|
const c = contacts.value[index]
|
|
if (!c) return
|
|
const payload = { firstName: c.firstName, lastName: c.lastName, jobTitle: c.jobTitle, email: c.email, phonePrimary: c.phonePrimary, phoneSecondary: c.phoneSecondary, ...owner }
|
|
if (c.id && c.id > 0) {
|
|
await contactService.update(c.id, payload)
|
|
} else if (c.lastName || c.firstName) {
|
|
const created = await contactService.create(payload)
|
|
contacts.value[index] = created
|
|
}
|
|
}
|
|
function addContact(): void {
|
|
contacts.value.push(emptyContact())
|
|
}
|
|
async function removeContact(index: number): Promise<void> {
|
|
const c = contacts.value[index]
|
|
if (c?.id && c.id > 0) await contactService.remove(c.id)
|
|
contacts.value.splice(index, 1)
|
|
}
|
|
|
|
async function onAddressInput(index: number, value: Address): Promise<void> {
|
|
addresses.value[index] = value
|
|
await persistAddress(index)
|
|
}
|
|
async function persistAddress(index: number): Promise<void> {
|
|
const a = addresses.value[index]
|
|
if (!a) return
|
|
const payload = { label: a.label, street: a.street, streetComplement: a.streetComplement, postalCode: a.postalCode, city: a.city, country: a.country, ...owner }
|
|
if (a.id && a.id > 0) {
|
|
await addressService.update(a.id, payload)
|
|
} else if (a.street || a.city || a.postalCode) {
|
|
const created = await addressService.create(payload)
|
|
addresses.value[index] = created
|
|
}
|
|
}
|
|
function addAddress(): void {
|
|
addresses.value.push(emptyAddress())
|
|
}
|
|
async function removeAddress(index: number): Promise<void> {
|
|
const a = addresses.value[index]
|
|
if (a?.id && a.id > 0) await addressService.remove(a.id)
|
|
addresses.value.splice(index, 1)
|
|
}
|
|
|
|
async function load(): Promise<void> {
|
|
contacts.value = await contactService.getByOwner(owner)
|
|
addresses.value = await addressService.getByOwner(owner)
|
|
}
|
|
|
|
return {
|
|
contacts,
|
|
addresses,
|
|
onContactInput,
|
|
addContact,
|
|
removeContact,
|
|
onAddressInput,
|
|
addAddress,
|
|
removeAddress,
|
|
load,
|
|
}
|
|
}
|