diff --git a/cmd/main-migration/migrations/20251118074929.sql b/cmd/main-migration/migrations/20251118074929.sql new file mode 100644 index 00000000..758110f2 --- /dev/null +++ b/cmd/main-migration/migrations/20251118074929.sql @@ -0,0 +1,2 @@ +-- Modify "GeneralConsent" table +ALTER TABLE "public"."GeneralConsent" DROP CONSTRAINT "fk_GeneralConsent_Encounter", ADD CONSTRAINT "fk_Encounter_GeneralConsents" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20251119065730.sql b/cmd/main-migration/migrations/20251119065730.sql new file mode 100644 index 00000000..23015cdb --- /dev/null +++ b/cmd/main-migration/migrations/20251119065730.sql @@ -0,0 +1,6 @@ +-- Modify "Person" table +ALTER TABLE "public"."Person" DROP CONSTRAINT "uni_Person_DrivingLicenseNumber", DROP CONSTRAINT "uni_Person_PassportNumber", ALTER COLUMN "ResidentIdentityNumber" TYPE character varying(16), ALTER COLUMN "Nationality" TYPE character varying(50); +-- Create index "idx_driver_license" to table: "Person" +CREATE UNIQUE INDEX "idx_driver_license" ON "public"."Person" ("DrivingLicenseNumber") WHERE ("DeletedAt" IS NULL); +-- Create index "idx_passport" to table: "Person" +CREATE UNIQUE INDEX "idx_passport" ON "public"."Person" ("PassportNumber") WHERE ("DeletedAt" IS NULL); diff --git a/cmd/main-migration/migrations/20251119072302.sql b/cmd/main-migration/migrations/20251119072302.sql new file mode 100644 index 00000000..28208ae7 --- /dev/null +++ b/cmd/main-migration/migrations/20251119072302.sql @@ -0,0 +1,2 @@ +-- Modify "VclaimSepPrint" table +ALTER TABLE "public"."VclaimSepPrint" DROP CONSTRAINT "fk_VclaimSepPrint_VclaimSep", ADD CONSTRAINT "fk_VclaimSep_Prints" FOREIGN KEY ("VclaimSep_Number") REFERENCES "public"."VclaimSep" ("Number") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20251119072450.sql b/cmd/main-migration/migrations/20251119072450.sql new file mode 100644 index 00000000..1332c843 --- /dev/null +++ b/cmd/main-migration/migrations/20251119072450.sql @@ -0,0 +1,15 @@ +-- Create "VclaimSepControlLetter" table +CREATE TABLE "public"."VclaimSepControlLetter" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "VclaimSep_Number" character varying(19) NULL, + "Number" character varying(20) NULL, + "Value" text NULL, + "FileUrl" character varying(1024) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_VclaimSepControlLetter_FileUrl" UNIQUE ("FileUrl"), + CONSTRAINT "uni_VclaimSepControlLetter_Number" UNIQUE ("Number"), + CONSTRAINT "fk_VclaimSep_ControlLetters" FOREIGN KEY ("VclaimSep_Number") REFERENCES "public"."VclaimSep" ("Number") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 7d7f66ee..e4ce72b0 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:UhULOHIbuhMYkKVWh97sQJdSpsgfHegvn8gwivFk6YQ= +h1:8gw1BB9DWz+cNATJjG1oMXA+QAF1HrIw47xjbI33aC4= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -120,4 +120,8 @@ h1:UhULOHIbuhMYkKVWh97sQJdSpsgfHegvn8gwivFk6YQ= 20251114062746.sql h1:FInLaEFQByESEwFJKuKnuUSTKmcDpi3ZXaxkKwz2+D8= 20251117005942.sql h1:wD3BWrUSmo1HlW16V3lkaBkJvbAZ0fNk77te7J9NhOc= 20251117075427.sql h1:TqU9VKZa3I8YNXUGQWY3WVBYN+1FvyyaKy0hB1jgAho= -20251119063438.sql h1:7BCr8Pr2doQT2BmsKYpyGa7gap4pWH711vClDw/VQ6s= +20251118074929.sql h1:p1KsWqCuR1JXA/jVO5BmOhCcaQ8clT7t0YRszAhPFbg= +20251119063438.sql h1:NVGM0X/LHD37EaPl8SNzkNiZDJ7AB1QR+LLwLh6WRdg= +20251119065730.sql h1:U5lzk1WvMB0bw3kwckou7jkEt4bwdYItwHr2Vxqe7w4= +20251119072302.sql h1:8L+NsXPFXGZDQZIOhShvuBM9aLwU3h95tXnz6jxHhlA= +20251119072450.sql h1:ksTc8ljaHFrBo1/HiHtcnT+iJ7kPS93KgetFTf3p4Qc= diff --git a/internal/domain/bpjs-entities/vclaim-sep-control-letter/dto.go b/internal/domain/bpjs-entities/vclaim-sep-control-letter/dto.go new file mode 100644 index 00000000..f12b57da --- /dev/null +++ b/internal/domain/bpjs-entities/vclaim-sep-control-letter/dto.go @@ -0,0 +1,61 @@ +package vclaimsepcontrolletter + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + VclaimSep_Number *string `json:"vclaimSep_number"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Sort string `json:"sort"` + Pagination ecore.Pagination +} + +type FilterDto struct { + VclaimSep_Number *string `json:"vclaimSep_number"` +} + +type ReadDetailDto struct { + Id uint `json:"id"` +} + +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 + VclaimSep_Number *string `json:"vclaimSep_number"` + Counter *uint `json:"counter"` +} + +func (d VclaimSepControlLetter) ToResponse() ResponseDto { + resp := ResponseDto{ + VclaimSep_Number: d.VclaimSep_Number, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []VclaimSepControlLetter) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/bpjs-entities/vclaim-sep-control-letter/entity.go b/internal/domain/bpjs-entities/vclaim-sep-control-letter/entity.go new file mode 100644 index 00000000..57f758fb --- /dev/null +++ b/internal/domain/bpjs-entities/vclaim-sep-control-letter/entity.go @@ -0,0 +1,13 @@ +package vclaimsepcontrolletter + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type VclaimSepControlLetter struct { + ecore.Main + VclaimSep_Number *string `json:"vclaimSep_number"` + Number *string `json:"number" gorm:"unique;size:20"` + Value *string `json:"value"` + FileUrl *string `json:"fileUrl" gorm:"unique;size:1024"` +} diff --git a/internal/domain/bpjs-entities/vclaim-sep-print/entity.go b/internal/domain/bpjs-entities/vclaim-sep-print/entity.go index 1bd5e9fc..52809352 100644 --- a/internal/domain/bpjs-entities/vclaim-sep-print/entity.go +++ b/internal/domain/bpjs-entities/vclaim-sep-print/entity.go @@ -2,12 +2,10 @@ package vclaimsepprint import ( ecore "simrs-vx/internal/domain/base-entities/core" - evs "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" ) type VclaimSepPrint struct { ecore.Main - VclaimSep_Number *string `json:"vclaimSep_number"` - VclaimSep *evs.VclaimSep `json:"vclaimSep,omitempty" gorm:"foreignKey:VclaimSep_Number;references:Number"` - Counter *uint `json:"counter"` + VclaimSep_Number *string `json:"vclaimSep_number"` + Counter *uint `json:"counter"` } diff --git a/internal/domain/bpjs-entities/vclaim-sep/entitiy.go b/internal/domain/bpjs-entities/vclaim-sep/entitiy.go index e23106d8..f175e4cb 100644 --- a/internal/domain/bpjs-entities/vclaim-sep/entitiy.go +++ b/internal/domain/bpjs-entities/vclaim-sep/entitiy.go @@ -2,10 +2,14 @@ package vclaimsep import ( ecore "simrs-vx/internal/domain/base-entities/core" + evscl "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter" + evsp "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print" ) type VclaimSep struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Number *string `json:"number" gorm:"unique;size:19"` + Encounter_Id *uint `json:"encounter_id"` + Number *string `json:"number" gorm:"unique;size:19"` + Prints []*evsp.VclaimSepPrint `json:"prints,omitempty" gorm:"foreignKey:VclaimSep_Number;references:Number"` + ControlLetters []*evscl.VclaimSepControlLetter `json:"controlLetters,omitempty" gorm:"foreignKey:VclaimSep_Number;references:Number"` } diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 3939f546..c188bb1a 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -10,6 +10,7 @@ import ( eem "simrs-vx/internal/domain/main-entities/emergency" ee "simrs-vx/internal/domain/main-entities/employee" eed "simrs-vx/internal/domain/main-entities/encounter-document" + egc "simrs-vx/internal/domain/main-entities/general-consent" eip "simrs-vx/internal/domain/main-entities/inpatient" ei "simrs-vx/internal/domain/main-entities/insurance-company" eir "simrs-vx/internal/domain/main-entities/internal-reference" @@ -72,6 +73,7 @@ type Encounter struct { Rehab *er.Basic `json:"rehab,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` RehabChildren *[]er.Basic `json:"rehabChildren,omitempty" gorm:"foreignKey:Parent_Encounter_Id;references:Id"` EncounterDocuments *[]eed.EncounterDocument `json:"encounterDocuments,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + GeneralConsents *[]egc.GeneralConsent `json:"generalConsents,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` } func (d Encounter) IsDone() bool { diff --git a/internal/domain/main-entities/general-consent/entity.go b/internal/domain/main-entities/general-consent/entity.go index f5ce6394..622c82bc 100644 --- a/internal/domain/main-entities/general-consent/entity.go +++ b/internal/domain/main-entities/general-consent/entity.go @@ -2,13 +2,11 @@ package general_consent import ( "simrs-vx/internal/domain/base-entities/core" - ee "simrs-vx/internal/domain/main-entities/encounter" ) type GeneralConsent struct { core.Main - Encounter_Id *uint `json:"encounter_id" gorm:"not null"` - Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` - Value *string `json:"value"` - FileUrl *string `json:"fileUrl" gorm:"size:1024"` + Encounter_Id *uint `json:"encounter_id" gorm:"not null"` + Value *string `json:"value"` + FileUrl *string `json:"fileUrl" gorm:"size:1024"` } diff --git a/internal/domain/main-entities/person/entity.go b/internal/domain/main-entities/person/entity.go index fe2513aa..8d7f79a8 100644 --- a/internal/domain/main-entities/person/entity.go +++ b/internal/domain/main-entities/person/entity.go @@ -25,9 +25,9 @@ type Person struct { BirthRegency_Code *string `json:"birthRegency_code" gorm:"size:4"` BirthRegency *er.Regency `json:"birthRegency,omitempty" gorm:"foreignKey:BirthRegency_Code;references:Code"` Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` - ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"uniqueIndex:idx_resident_identity,where:\"DeletedAt\" IS NULL"` - PassportNumber *string `json:"passportNumber" gorm:"unique;size:20"` - DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"unique;size:20"` + ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"uniqueIndex:idx_resident_identity,where:\"DeletedAt\" IS NULL;size:16"` + PassportNumber *string `json:"passportNumber" gorm:"uniqueIndex:idx_passport,where:\"DeletedAt\" IS NULL;size:20"` + DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"uniqueIndex:idx_driver_license,where:\"DeletedAt\" IS NULL;size:20"` Religion_Code *erp.ReligionCode `json:"religion_code" gorm:"size:10"` Confidence *string `json:"confidence" gorm:"size:512"` Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 94b5d545..23e7422c 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -103,6 +103,7 @@ import ( ///BPJS vclaimmember "simrs-vx/internal/domain/bpjs-entities/vclaim-member" vclaimsep "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" + vclaimsepcontrolletter "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter" vclaimsephist "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" vclaimsepprint "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print" ) @@ -211,5 +212,6 @@ func getMainEntities() []any { &rehab.Rehab{}, &chemoprotocol.ChemoProtocol{}, &fileattachemnt.EncounterDocument{}, + &vclaimsepcontrolletter.VclaimSepControlLetter{}, } } diff --git a/internal/use-case/main-use-case/generate-file/tycovar.go b/internal/use-case/main-use-case/generate-file/tycovar.go new file mode 100644 index 00000000..fed3e28c --- /dev/null +++ b/internal/use-case/main-use-case/generate-file/tycovar.go @@ -0,0 +1,63 @@ +package generatefile + +import ( + erc "simrs-vx/internal/domain/references/common" + ere "simrs-vx/internal/domain/references/encounter" +) + +type GeneralConsentPDF struct { + Relatives []string `json:"relatives"` + Responsible string `json:"responsible"` + Informant string `json:"informant"` + Witness1 string `json:"witness1"` + Witness2 string `json:"witness2"` + Date string `json:"date"` +} + +type GenerateDto struct { + EntityType_Code ere.EntityTypeCode `json:"entityType_code" validate:"required"` + Ref_Id *uint `json:"ref_id" validate:"required"` + Type_Code ere.DocTypeCode `json:"type_code" validate:"required"` + FormatType erc.DocFormatTypeCode `json:"formatType"` + TemplateName TemplateDocsName `json:"-"` + Encounter_Id *uint `json:"-"` +} + +type VclaimControlLetter struct { + Number string `json:"noSuratKontrol"` + Date string `json:"tglRencanaKontrol"` + Doctor_Name string `json:"namaDokter"` + DstUnit_Name string `json:"namaPoliTujuan"` + ResponsibleDoctor_Name string `json:"namaDokterPembuat"` + VclaimSep VclaimSep `json:"sep"` +} + +type VclaimSep struct { + VclaimMember VclaimMember `json:"peserta"` + Diagnose string `json:"diagnosa"` + Number string `json:"noSep"` +} + +type VclaimMember struct { + CardNumber string `json:"noKartu"` + Name string `json:"nama"` + BirthDate string `json:"tglLahir"` + Gender string `json:"kelamin"` +} + +type GeneratePDFdto struct { + TemplatePath string + TemplateData any + PdfPath string +} + +type ResponseDto struct { + FileUrl string `json:"fileUrl"` +} + +type TemplateDocsName string + +// TemplateDocsName is the name of the template file in the assets/docs folder +const ( + TDNGC TemplateDocsName = "general-consent.html" +)