Files
Khafid Prayoga 97d2b76ee3 refactor(person-relative): update schema and form components for family data
- Change value format in radio-parents-input from '1'/'0' to 'yes'/'no'
- Remove default labels from select-education and select-job components
- Update schema to make fields optional and add new fields
- Modify family-parents-form to use new schema and improve UI
- Update patient form and models to align with schema changes
2025-12-10 20:30:34 +07:00

187 lines
6.1 KiB
TypeScript

import { type Base, genBase } from './_base'
import { type Person, genPerson } from './person'
import type { PatientFormData } from '~/schemas/patient.schema'
import type { PersonAddressFormData } from '~/schemas/person-address.schema'
import type { PersonAddressRelativeFormData } from '~/schemas/person-address-relative.schema'
import type { PersonContactFormData } from '~/schemas/person-contact.schema'
import type { PersonRelativeFormData } from '~/schemas/person-relative.schema'
import type { PersonAddress } from './person-address'
import type { PersonContact } from './person-contact'
import type { PersonRelative } from './person-relative'
import { contactTypeMapping } from '~/lib/constants'
export interface PatientBase extends Base {
person_id?: number | null
newBornStatus?: boolean | string
registeredAt?: Date | string | null
status_code?: string | null
number?: string | null
}
export interface PatientEntity extends PatientBase {
person: Person
personAddresses: PersonAddress[]
personContacts: PersonContact[]
personRelatives: PersonRelative[]
}
export interface genPatientProps {
patient: PatientFormData
residentAddress: PersonAddressFormData
cardAddress: PersonAddressRelativeFormData
familyData: PersonRelativeFormData
contacts: PersonContactFormData
responsible: PersonRelativeFormData
}
export function genPatientEntity(props: genPatientProps, patientData: PatientEntity | null): PatientEntity {
const { patient, residentAddress, cardAddress, familyData, contacts, responsible } = props
// const val = toRaw(patientData)
const addresses: PersonAddress[] = [{ ...genBase(), person_id: patientData?.person?.id || 0, ...residentAddress }]
const familiesContact: PersonRelative[] = []
const personContacts: PersonContact[] = []
// jika alamat ktp sama dengan domisili saat ini
if (cardAddress.isSameAddress) {
addresses.push({
...genBase(),
...residentAddress,
id: cardAddress.id || 0,
person_id: 0,
locationType_code: cardAddress.locationType_code || 'identity',
})
} else {
// jika alamat berbeda, tambahkan alamat relatif
// Pastikan semua field yang diperlukan ada
const relativeAddress = {
...genBase(),
id: cardAddress.id || 0,
person_id: patientData?.person?.id || 0,
locationType_code: cardAddress.locationType_code || 'identity',
address: cardAddress.address || '',
province_code: cardAddress.province_code || '',
regency_code: cardAddress.regency_code || '',
district_code: cardAddress.district_code || '',
village_code: cardAddress.village_code || '',
postalRegion_code: cardAddress.postalRegion_code || '',
rt: cardAddress.rt,
rw: cardAddress.rw,
}
addresses.push(relativeAddress)
}
// add data orang tua
if (familyData._shareFamilyData === 'yes' && familyData.families && familyData.families.length > 0) {
for (const family of familyData.families) {
familiesContact.push({
id: family.id || 0,
relationship_code: family.relation,
name: family.name,
education_code: family.education_code,
occupation_name: family.occupation_name,
occupation_code: family.occupation_code,
responsible: false,
})
}
}
// add kontak pasien
if (contacts && contacts.contacts.length > 0) {
for (const contact of contacts.contacts) {
// Convert UI contactType to backend type_code using mapping
const mappedContactType = contactTypeMapping[contact.contactType]
personContacts.push({
...genBase(),
id: contact.id || 0,
person_id: patientData?.person?.id || 0,
type_code: mappedContactType || '',
value: contact.contactNumber,
})
}
}
// add penanggung jawab
if (responsible.contacts && responsible.contacts.length > 0) {
for (const contact of responsible.contacts) {
familiesContact.push({
id: contact.id || 0,
relationship_code: contact.relation,
name: contact.name,
address: contact.address,
phoneNumber: contact.phone,
responsible: true,
})
}
}
return {
person: {
id: patientData?.person?.id || 0,
name: patient.fullName,
// alias: patient.alias,
birthDate: patient.birthDate,
birthRegency_code: patient.birthPlace,
gender_code: patient.gender,
residentIdentityNumber: patient.identityNumber || null,
passportNumber: patient.passportNumber || null,
drivingLicenseNumber: patient.drivingLicenseNumber || null,
religion_code: patient.religion,
education_code: patient.education,
occupation_code: patient.job,
occupation_name: patient.job,
ethnic_code: patient.ethnicity,
language_code: patient.language,
communicationIssueStatus: patient.communicationBarrier,
disability: patient.disabilityType || '',
nationality: patient.nationality,
// residentIdentityFileUrl: patient.residentIdentityFileUrl,
// passportFileUrl: patient.passportFileUrl,
// drivingLicenseFileUrl: patient.drivingLicenseFileUrl,
// familyIdentityFileUrl: patient.familyIdentityFileUrl,
maritalStatus_code: patient.maritalStatus,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
deletedAt: null,
},
personAddresses: addresses,
personContacts: personContacts,
personRelatives: familiesContact,
registeredAt: new Date(),
status_code: 'active',
newBornStatus: patient.isNewBorn,
person_id: patientData?.person?.id || null,
id: patientData?.id || 0,
number: patientData?.number || null,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
deletedAt: null,
}
}
// New model
export interface Patient extends Base {
person_id?: number | null
person: Person
newBornStatus?: boolean | string
registeredAt?: Date | string | null
status_code?: string | null
number?: string | null
}
export function genPatient(): Patient {
return {
...genBase(),
person_id: 0,
registeredAt: '',
status_code: '',
number: '',
newBornStatus: false,
person: genPerson(),
}
}