diff --git a/cmd/migration/migrations/20250902063217.sql b/cmd/migration/migrations/20250902063217.sql new file mode 100644 index 00000000..9231a697 --- /dev/null +++ b/cmd/migration/migrations/20250902063217.sql @@ -0,0 +1,20 @@ +-- Create "PersonRelative" table +CREATE TABLE "public"."PersonRelative" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Person_Id" bigint NULL, + "Relationship_Code" character varying(100) NOT NULL, + "Name" character varying(100) NULL, + "Address" character varying(100) NULL, + "Village_Code" character varying(10) NULL, + "Gender_Code" character varying(10) NULL, + "PhoneNumber" character varying(30) NULL, + "Education_Code" character varying(10) NULL, + "Occupation_Code" character varying(10) NULL, + "Occupation_Name" character varying(50) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_PersonRelative_Village" FOREIGN KEY ("Village_Code") REFERENCES "public"."Village" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Person_Relatives" FOREIGN KEY ("Person_Id") REFERENCES "public"."Person" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/migration/migrations/atlas.sum b/cmd/migration/migrations/atlas.sum index 610cf79f..1c92502f 100644 --- a/cmd/migration/migrations/atlas.sum +++ b/cmd/migration/migrations/atlas.sum @@ -1,6 +1,7 @@ -h1:1//2fu4kC38Dh7Uay7V1mN3umZje2BP/P7dxjdyRc4c= +h1:xLrXCY32L4rM4g9bNhReT/a49v6gwYzJSNnzwSmFFlc= 20250829081952.sql h1:YMsYq3uPsx70EjWSGfYnVRR5GV0q1fRGIszYZAWzXNo= 20250901073356.sql h1:jjd5TLs+Pyi0u3SrOM+aNTbHxSJboXgcOz/L4bkYx+c= 20250901080035.sql h1:LWa3X0NWjalVcxNbk5HaHj1Oqu60/AQabi0jBmCeQBI= 20250901105703.sql h1:2h2B/wOFM0826sBXQutTtq24C+5duLqi4zEFOdbPsCI= -20250902052320.sql h1:bnTbx2vkZ7jscOdgjL8G1cuKzZ7rMMsR+KawkX8w74g= +20250902052320.sql h1:+tWdeS4NorPj5WdKHMirBfP4EeS01wyyfdT03DBMmcI= +20250902063217.sql h1:ZDyL6lk12uFmboUCMfRTh5sfQ4wsC3bWSI+vAUFUiAA= diff --git a/internal/domain/main-entities/person-relative/dto.go b/internal/domain/main-entities/person-relative/dto.go new file mode 100644 index 00000000..9474255e --- /dev/null +++ b/internal/domain/main-entities/person-relative/dto.go @@ -0,0 +1,61 @@ +package personrelative + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + erp "simrs-vx/internal/domain/references/person" +) + +type CreateDto struct { + Person_Id uint `json:"person_id"` + Type_Code erp.ContactTypeCode `json:"type_code"` + Value string `json:"value"` +} + +type ReadListDto struct { + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint `json:"id"` + Person_Id uint `json:"person_id"` + Type_Code erp.ContactTypeCode `json:"type_code"` + Value string `json:"value"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Person_Id uint `json:"person_id"` + Type_Code erp.ContactTypeCode `json:"type_code"` + Value string `json:"value"` +} + +func (d *PersonRelative) ToResponse() ResponseDto { + resp := ResponseDto{} + resp.Main = d.Main + return resp +} + +func ToResponseList(data []PersonRelative) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/person-relative/entity.go b/internal/domain/main-entities/person-relative/entity.go new file mode 100644 index 00000000..9b67bd0b --- /dev/null +++ b/internal/domain/main-entities/person-relative/entity.go @@ -0,0 +1,22 @@ +package personrelative + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ev "simrs-vx/internal/domain/main-entities/village" + erp "simrs-vx/internal/domain/references/person" +) + +type PersonRelative struct { + ecore.Main // adjust this according to the needs + Person_Id uint `json:"person_id"` + Relationship_Code erp.RelationshipCode `json:"relationship_code" gorm:"not null;size:100"` + Name *string `json:"name" gorm:"size:100"` + Address *string `json:"address" gorm:"size:100"` + Village_Code *string `json:"village_code" gorm:"size:10"` + Village *ev.Village `json:"village,omitempty" gorm:"foreignKey:Village_Code;references:Code"` + Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` + PhoneNumber *string `json:"phoneNumber" gorm:"size:30"` + Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` + Occupation_Code *erp.OcupationCode `json:"occupation_code" gorm:"size:10"` + Occupation_Name *string `json:"occupation_name" gorm:"size:50"` +} diff --git a/internal/domain/main-entities/person/entity.go b/internal/domain/main-entities/person/entity.go index 7b83ece7..940e2484 100644 --- a/internal/domain/main-entities/person/entity.go +++ b/internal/domain/main-entities/person/entity.go @@ -6,30 +6,32 @@ import ( el "simrs-vx/internal/domain/main-entities/language" epa "simrs-vx/internal/domain/main-entities/person-address" epc "simrs-vx/internal/domain/main-entities/person-contact" + epr "simrs-vx/internal/domain/main-entities/person-relative" erp "simrs-vx/internal/domain/references/person" "time" ) type Person struct { - ecore.Main // adjust this according to the needs - Name string `json:"name" gorm:"not null;size:150"` - FrontTitle *string `json:"frontTitle" gorm:"size:50"` - EndTitle *string `json:"endTitle" gorm:"size:50"` - BirthDate *time.Time `json:"birthDate,omitempty"` - BirthRegency_Code *string `json:"birthRegency_code" gorm:"size:4"` - Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` - ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"size:16"` - PassportNumber *string `json:"passportNumber" gorm:"size:20"` - DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"size:20"` - Religion_Code *erp.ReligionCode `json:"religion_code" gorm:"size:10"` - Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` - Ocupation_Code *erp.OcupationCode `json:"occupation_code" gorm:"size:15"` - Ocupation_Name *string `json:"occupation_name" gorm:"size:50"` - Ethnic_Code *string `json:"ethnic_code" gorm:"size:20"` - Ethnic *ee.Ethnic `json:"ethnic,omitempty" gorm:"foreignKey:Ethnic_Code;references:Code"` - Addresses *[]epa.PersonAddress `json:"addresses" gorm:"foreignKey:Person_Id"` - Contacts *[]epc.PersonContact `json:"contacts" gorm:"foreignKey:Person_Id"` - Language_Code *string `json:"language_code" gorm:"size:10"` - Language *el.Language `json:"language,omitempty" gorm:"foreignKey:Language_Code;references:Code"` + ecore.Main // adjust this according to the needs + Name string `json:"name" gorm:"not null;size:150"` + FrontTitle *string `json:"frontTitle" gorm:"size:50"` + EndTitle *string `json:"endTitle" gorm:"size:50"` + BirthDate *time.Time `json:"birthDate,omitempty"` + BirthRegency_Code *string `json:"birthRegency_code" gorm:"size:4"` + Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` + ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"size:16"` + PassportNumber *string `json:"passportNumber" gorm:"size:20"` + DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"size:20"` + Religion_Code *erp.ReligionCode `json:"religion_code" gorm:"size:10"` + Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` + Ocupation_Code *erp.OcupationCode `json:"occupation_code" gorm:"size:15"` + Ocupation_Name *string `json:"occupation_name" gorm:"size:50"` + Ethnic_Code *string `json:"ethnic_code" gorm:"size:20"` + Ethnic *ee.Ethnic `json:"ethnic,omitempty" gorm:"foreignKey:Ethnic_Code;references:Code"` + Addresses *[]epa.PersonAddress `json:"addresses" gorm:"foreignKey:Person_Id"` + Contacts *[]epc.PersonContact `json:"contacts" gorm:"foreignKey:Person_Id"` + Relatives *[]epr.PersonRelative `json:"relatives" gorm:"foreignKey:Person_Id"` + Language_Code *string `json:"language_code" gorm:"size:10"` + Language *el.Language `json:"language,omitempty" gorm:"foreignKey:Language_Code;references:Code"` } diff --git a/internal/domain/references/person/person.go b/internal/domain/references/person/person.go index 74afbb8d..dd41bd25 100644 --- a/internal/domain/references/person/person.go +++ b/internal/domain/references/person/person.go @@ -11,6 +11,7 @@ type ( AgeGroupForMedicineCode string RelativeCode string ContactTypeCode string + RelationshipCode string ) const ( @@ -18,9 +19,7 @@ const ( GCFemale GenderCode = "female" GCNotStated GenderCode = "not-stated" GCUnknown GenderCode = "unknown" -) -const ( BTCAPositive BloodTypeCode = "A+" BTCANegative BloodTypeCode = "A-" BTCBPositive BloodTypeCode = "B+" @@ -29,25 +28,19 @@ const ( BTCABNegative BloodTypeCode = "AB-" BTCOPositive BloodTypeCode = "O+" BTCONegative BloodTypeCode = "O-" -) -const ( MSCBelumKawin MaritalStatusCode = "S" MSCKawin MaritalStatusCode = "M" MSCCeraiHidup MaritalStatusCode = "D" MSCCeraiMati MaritalStatusCode = "W" -) -const ( RCIslam ReligionCode = "islam" RCProtestan ReligionCode = "protestan" RCKatolik ReligionCode = "katolik" RCHindu ReligionCode = "hindu" RCBudha ReligionCode = "budha" RCKonghucu ReligionCode = "konghucu" -) -const ( ECTS EducationCode = "TS" ECTK EducationCode = "TK" ECSD EducationCode = "SD" @@ -60,9 +53,7 @@ const ( ECS1 EducationCode = "S1" ECS2 EducationCode = "S2" ECS3 EducationCode = "S3" -) -const ( OCTidakBekerja OcupationCode = "tidak-bekerja" OCPns OcupationCode = "pns" OCTniPolisi OcupationCode = "polisi" @@ -71,9 +62,7 @@ const ( OCWiraswasta OcupationCode = "wiraswasta" OCKarySwasta OcupationCode = "kary-swasta" OCLainlain OcupationCode = "lainnya" -) -const ( AGCEUnknown AgeGroupCode = "unkown" AGCLTE5 AgeGroupCode = "LT5" AGCEU19 AgeGroupCode = "UE19" @@ -82,17 +71,13 @@ const ( AGCEU49 AgeGroupCode = "UE49" AGCEU59 AgeGroupCode = "UE50" AGCGE60 AgeGroupCode = "E60" -) -const ( AGMCNew AgeGroupForMedicineCode = "new-born" AGMCInfant AgeGroupForMedicineCode = "infant" AGMCToddler AgeGroupForMedicineCode = "toddler" AGMCKid AgeGroupForMedicineCode = "kid" AGMCAdult AgeGroupForMedicineCode = "adult" -) -const ( RCMSuami RelativeCode = "suami" RCMIstri RelativeCode = "istri" RCMAnak RelativeCode = "anak" @@ -107,13 +92,23 @@ const ( RCMBibi RelativeCode = "bibi" RCMPamanKakek RelativeCode = "kakek" RCMPamanNenek RelativeCode = "nenek" -) -const ( CTPhone ContactTypeCode = "phone" CTMPhone ContactTypeCode = "m-phone" CTEmail ContactTypeCode = "email" CTFax ContactTypeCode = "fax" + + RCMother RelationshipCode = "mother" // Ibu + RCFather RelationshipCode = "father" // Ayah + RCUncle RelationshipCode = "uncle" // Paman + RCAunt RelationshipCode = "aunt" // Bibi + RCSibling RelationshipCode = "sibling" // Saudara + RCGdMother RelationshipCode = "gd-mother" // Nenek + RCGdFather RelationshipCode = "gd-father" // Kakek + RCChild RelationshipCode = "child" // Anak + RCNephew RelationshipCode = "nephew" // Keponakan + RCGdChild RelationshipCode = "gd-child" // Cucu + RCOther RelationshipCode = "other" // Lainnya ) func GetGenderCodes() map[GenderCode]string { @@ -239,6 +234,22 @@ func GetContactTypeCodes() map[ContactTypeCode]string { } } +func GetRelationshipCodes() map[RelationshipCode]string { + return map[RelationshipCode]string{ + RCMother: "Ibu", + RCFather: "Ayah", + RCUncle: "Paman", + RCAunt: "Bibi", + RCSibling: "Saudara", + RCGdMother: "Nenek", + RCGdFather: "Kakek", + RCChild: "Anak", + RCNephew: "Keponakan", + RCGdChild: "Cucu", + RCOther: "Lainnya", + } +} + func (obj GenderCode) String() string { return GetGenderCodes()[obj] } @@ -273,3 +284,7 @@ func (obj RelativeCode) String() string { func (obj ContactTypeCode) String() string { return GetContactTypeCodes()[obj] } + +func (obj RelationshipCode) String() string { + return GetRelationshipCodes()[obj] +} diff --git a/internal/interface/migration/migration.go b/internal/interface/migration/migration.go index 1d4e62b5..14eb1560 100644 --- a/internal/interface/migration/migration.go +++ b/internal/interface/migration/migration.go @@ -36,6 +36,7 @@ import ( person "simrs-vx/internal/domain/main-entities/person" personaddress "simrs-vx/internal/domain/main-entities/person-address" personcontact "simrs-vx/internal/domain/main-entities/person-contact" + personrelative "simrs-vx/internal/domain/main-entities/person-relative" pharmacist "simrs-vx/internal/domain/main-entities/pharmacist" pharmacycompany "simrs-vx/internal/domain/main-entities/pharmacy-company" practiceschedule "simrs-vx/internal/domain/main-entities/practice-schedule" @@ -121,6 +122,7 @@ func GetEntities() []any { &device.Device{}, &doctorfee.DoctorFee{}, &language.Language{}, + &personrelative.PersonRelative{}, } }