diff --git a/internal/server/routes.go b/internal/server/routes.go index d67b380..c2f639b 100644 --- a/internal/server/routes.go +++ b/internal/server/routes.go @@ -1,6 +1,8 @@ package server import ( + MasterHandler "api-poliklinik/pkg/handlers/Master" + //MigrasiExtension "api-poliklinik/pkg/handlers/Migrasi/extension" patientHandler "api-poliklinik/pkg/handlers/MongoHandler/Patient" patientRelatedHandler "api-poliklinik/pkg/handlers/MongoHandler/PatientRelated" personHandler "api-poliklinik/pkg/handlers/MongoHandler/person" @@ -10,6 +12,7 @@ import ( datapractitionerHandler "api-poliklinik/pkg/handlers/Practitioner" dataAlamatHandler "api-poliklinik/pkg/handlers/address" MigrasiHandler "api-poliklinik/pkg/handlers/migrasi" + MigrasiAddress "api-poliklinik/pkg/handlers/migrasi/address" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "net/http" @@ -34,6 +37,12 @@ func (s *Server) RegisterRoutes() http.Handler { { migrasi.POST("/migrate/practitioners", MigrasiHandler.MigratePractitionerToFHIR) migrasi.POST("/migrate/pasien", MigrasiHandler.MigratePasienToFHIR) + migrasi.POST("/migrate/provinsi", MigrasiAddress.Migrasiprovinsi) + migrasi.POST("/migrate/kota", MigrasiAddress.Migrasikota) + migrasi.POST("/migrate/kecamatan", MigrasiAddress.Migrasikecamatan) + migrasi.POST("/migrate/kelurahan", MigrasiAddress.Migrasikelurahan) + //migrasi.POST("/migrate/bahasa", MigrasiExtension.Migrasibahasa) + } Poliklinik := v1.Group("/poliklinik") @@ -50,6 +59,8 @@ func (s *Server) RegisterRoutes() http.Handler { Alamat := v1.Group("/Alamat") { Alamat.GET("/getdata", dataAlamatHandler.GetDataAlamat) + //Alamat.GET("/getprovinsi", MigrasiAddress.GetProvinsi) + } Relasi := v1.Group("/relasi") @@ -60,7 +71,7 @@ func (s *Server) RegisterRoutes() http.Handler { patient := v1.Group("/patient") { - //patient.POST("/insertpatient", patientHandler.InsertPatient) + patient.POST("/insertpatient", patientHandler.InsertPatient) patient.GET("/getallpatient", patientHandler.GetAllPatient) patient.PUT("/updatepatient", patientHandler.UpdatePatient) patient.POST("/deletepatient", patientHandler.DeletePatient) @@ -104,10 +115,21 @@ func (s *Server) RegisterRoutes() http.Handler { //Location.POST("/deletelocation", personHandler.DeletePersonHand) } - Master := v1.Group("createdocument") + Master := v1.Group("/master") { - Master.GET("/getdatamaster", personHandler.GetDataPerson) + Master.GET("/getdataprovinsi", MasterHandler.GetProvinsi) + Master.GET("/getdatakota", MasterHandler.GetKota) + Master.GET("/getdatakecamatan", MasterHandler.GetKecamatan) + Master.GET("/getdatakelurahan", MasterHandler.GetKelurahan) + + Master.GET("/kelurahan/search", MasterHandler.SearchKelurahan) + Master.GET("/address/kelurahan/id/:id", MasterHandler.GetHierarchyByKelurahan) + Master.GET("/hierarchy/provinsi/:id", MasterHandler.GetHierarchyFromProvinsi) } + // Extension := v1.Group("/extension") + //{ + // //Extension.GET("/getcommunication", MasterHandler.Getsuku ) + //} return r diff --git a/pkg/database/mongo/patient.go b/pkg/database/mongo/patient.go index cb1cf4a..8a30dd0 100644 --- a/pkg/database/mongo/patient.go +++ b/pkg/database/mongo/patient.go @@ -45,6 +45,17 @@ func (s *DatabaseService) InsertPatient(req patient.Patient) error { return nil } +func (s *DatabaseService) InsertPatientmongo(req *patient.Patient) error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + _, err := s.DBMongo.Collection("patient").InsertOne(ctx, req) + if err != nil { + log.Println(err) + return err + } + return nil +} + func (s *DatabaseService) GetPatientByIdentifier(display string, value string) ([]*patient.Patient, error) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() diff --git a/pkg/database/mongo/provinsi.go b/pkg/database/mongo/provinsi.go new file mode 100644 index 0000000..08cc8c7 --- /dev/null +++ b/pkg/database/mongo/provinsi.go @@ -0,0 +1,532 @@ +package mongo + +import ( + Mongomaster "api-poliklinik/pkg/models/mongo/master/masteraddress" + "context" + "fmt" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" + "log" + "strings" + "time" +) + +func (s *DatabaseService) InsertState(req Mongomaster.State) error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + _, err := s.DBMongo.Collection("state").InsertOne(ctx, req) + if err != nil { + log.Println(err) + return err + } + return nil +} + +func (s *DatabaseService) InsertCity(req Mongomaster.City) error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + _, err := s.DBMongo.Collection("city").InsertOne(ctx, req) + if err != nil { + log.Println(err) + return err + } + return nil +} + +func (s *DatabaseService) InsertDistrict(req Mongomaster.District) error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + _, err := s.DBMongo.Collection("district").InsertOne(ctx, req) + if err != nil { + log.Println(err) + return err + } + return nil +} + +func (s *DatabaseService) InsertVillage(req Mongomaster.Village) error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + _, err := s.DBMongo.Collection("village").InsertOne(ctx, req) + if err != nil { + log.Println(err) + return err + } + return nil +} +func (s *DatabaseService) Getdataprovinsi() ([]*Mongomaster.State, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + dataprovinsi, err := s.DBMongo.Collection("state").Find(ctx, bson.D{}) + if err != nil { + log.Println(err) + } + var provinsi []*Mongomaster.State + err = dataprovinsi.All(ctx, &provinsi) + if err != nil { + log.Println(err) + return nil, err + } + return provinsi, nil +} + +func (s *DatabaseService) Getdatakota() ([]*Mongomaster.City, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + datakota, err := s.DBMongo.Collection("city").Find(ctx, bson.D{}) + if err != nil { + log.Println(err) + } + var kota []*Mongomaster.City + err = datakota.All(ctx, &kota) + if err != nil { + log.Println(err) + return nil, err + } + return kota, nil +} + +func (s *DatabaseService) Getdatakecamatan() ([]*Mongomaster.District, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + datakecamatan, err := s.DBMongo.Collection("district").Find(ctx, bson.D{}) + if err != nil { + log.Println(err) + } + var kecamatan []*Mongomaster.District + err = datakecamatan.All(ctx, &kecamatan) + if err != nil { + log.Println(err) + return nil, err + } + return kecamatan, nil +} + +func (s *DatabaseService) Getdatakelurahan(name string) ([]*Mongomaster.Village, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + filter := bson.M{ + "name": name, + } + datakelurahan, err := s.DBMongo.Collection("village").Find(ctx, filter) + if err != nil { + log.Println(err) + } + var kelurahan []*Mongomaster.Village + err = datakelurahan.All(ctx, &kelurahan) + if err != nil { + log.Println(err) + return nil, err + } + return kelurahan, nil +} + +func (s *DatabaseService) SearchKelurahan(query string) ([]*Mongomaster.Village, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // Buat regex pattern untuk pencarian case-insensitive + regex := primitive.Regex{Pattern: query, Options: "i"} + + // Buat filter untuk pencarian berdasarkan nama + filter := bson.M{ + "name": regex, + } + + // Cari kelurahan yang cocok, batasi 10 hasil + opts := options.Find().SetLimit(10) + cursor, err := s.DBMongo.Collection("village").Find(ctx, filter, opts) + if err != nil { + log.Println(err) + return nil, err + } + + // Decode hasil query ke dalam slice struct + var kelurahanList []*Mongomaster.Village + if err = cursor.All(ctx, &kelurahanList); err != nil { + log.Println(err) + return nil, err + } + + return kelurahanList, nil +} + +func (s *DatabaseService) GetHierarchyByKelurahan(kelurahanId string) (map[string]interface{}, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // 1. Cari data kelurahan berdasarkan identifier[0].value + filter := bson.M{ + "identifier.0.value": kelurahanId, + } + + log.Printf("Mencari kelurahan dengan filter: %v", filter) + + var kelurahan Mongomaster.Village + err := s.DBMongo.Collection("village").FindOne(ctx, filter).Decode(&kelurahan) + if err != nil { + log.Println("Error saat mencari kelurahan:", err) + return nil, err + } + + log.Printf("Kelurahan ditemukan: %s, reference kecamatan: %s", kelurahan.Name, kelurahan.District.Reference) + + // 2. Ekstrak ID kecamatan dari referensi + // PENTING: Periksa format referensi yang sebenarnya + districtRef := kelurahan.District.Reference + var districtId string + + // Coba berbagai format yang mungkin + if strings.HasPrefix(districtRef, "distric/") { + districtId = strings.Replace(districtRef, "distric/", "", 1) + } else if strings.HasPrefix(districtRef, "district/") { + districtId = strings.Replace(districtRef, "district/", "", 1) + } else { + // Jika format lain, ambil bagian setelah "/" + parts := strings.Split(districtRef, "/") + if len(parts) > 1 { + districtId = parts[1] + } else { + districtId = districtRef // Gunakan seluruh string jika tidak ada "/" + } + } + + log.Printf("ID kecamatan yang diekstrak: %s", districtId) + + // 3. Cari data kecamatan berdasarkan identifier.value + // Coba beberapa kemungkinan filter + var kecamatan Mongomaster.District + var kecamatanErr error + + // Coba dengan exact match pada identifier.value + kecamatanFilter1 := bson.M{ + "identifier.0.value": districtId, + } + log.Printf("Mencoba filter kecamatan 1: %v", kecamatanFilter1) + kecamatanErr = s.DBMongo.Collection("district").FindOne(ctx, kecamatanFilter1).Decode(&kecamatan) + + // Jika masih error, coba dengan _id + if kecamatanErr != nil { + log.Printf("Filter 1 gagal: %v, mencoba filter 2", kecamatanErr) + kecamatanFilter2 := bson.M{ + "_id": districtId, + } + kecamatanErr = s.DBMongo.Collection("district").FindOne(ctx, kecamatanFilter2).Decode(&kecamatan) + } + + // Jika masih error, coba dengan regex search pada name + if kecamatanErr != nil { + log.Printf("Filter 2 gagal: %v, mencoba filter berdasarkan display name", kecamatanErr) + kecamatanFilter3 := bson.M{ + "name": kelurahan.District.Display, + } + kecamatanErr = s.DBMongo.Collection("district").FindOne(ctx, kecamatanFilter3).Decode(&kecamatan) + } + + // Jika semua filter gagal + if kecamatanErr != nil { + log.Println("Error saat mencari kecamatan dengan semua filter:", kecamatanErr) + + // Tampilkan semua kecamatan untuk debugging + debugCursor, debugErr := s.DBMongo.Collection("district").Find(ctx, bson.M{}) + if debugErr == nil { + var allDistricts []Mongomaster.District + debugErr = debugCursor.All(ctx, &allDistricts) + if debugErr == nil { + log.Printf("Daftar semua kecamatan (sampel 3): %+v", allDistricts[:min(3, len(allDistricts))]) + } + } + + return nil, kecamatanErr + } + + log.Printf("Kecamatan ditemukan: %s, reference kota: %s", kecamatan.Name, kecamatan.City.Reference) + + // 4. Ekstrak ID kota dari referensi (dengan pendekatan yang sama) + cityRef := kecamatan.City.Reference + var cityId string + + if strings.HasPrefix(cityRef, "city/") { + cityId = strings.Replace(cityRef, "city/", "", 1) + } else { + parts := strings.Split(cityRef, "/") + if len(parts) > 1 { + cityId = parts[1] + } else { + cityId = cityRef + } + } + + log.Printf("ID kota yang diekstrak: %s", cityId) + + // 5. Cari data kota + kotaFilter := bson.M{ + "identifier.0.value": cityId, + } + + var kota Mongomaster.City + err = s.DBMongo.Collection("city").FindOne(ctx, kotaFilter).Decode(&kota) + if err != nil { + log.Println("Error saat mencari kota:", err) + return nil, err + } + + log.Printf("Kota ditemukan: %s, reference provinsi: %s", kota.Name, kota.State.Reference) + + // 6. Ekstrak ID provinsi + stateRef := kota.State.Reference + var stateId string + + if strings.HasPrefix(stateRef, "provinsi/") { + stateId = strings.Replace(stateRef, "provinsi/", "", 1) + } else { + parts := strings.Split(stateRef, "/") + if len(parts) > 1 { + stateId = parts[1] + } else { + stateId = stateRef + } + } + + log.Printf("ID provinsi yang diekstrak: %s", stateId) + + // 7. Cari data provinsi + provinsiFilter := bson.M{ + "identifier.0.value": stateId, + } + + var provinsi Mongomaster.State + err = s.DBMongo.Collection("state").FindOne(ctx, provinsiFilter).Decode(&provinsi) + if err != nil { + log.Println("Error saat mencari provinsi:", err) + return nil, err + } + + log.Printf("Provinsi ditemukan: %s", provinsi.Name) + + // 8. Buat respons dengan data lengkap + hierarchy := map[string]interface{}{ + "kecamatan": map[string]interface{}{ + "id": kecamatan.Identifier[0].Value, + "name": kecamatan.Name, + }, + + "kelurahan": map[string]interface{}{ + "id": kelurahan.Identifier[0].Value, + "name": kelurahan.Name, + }, + + "kota": map[string]interface{}{ + "id": kota.Identifier[0].Value, + "name": kota.Name, + }, + "provinsi": map[string]interface{}{ + "id": provinsi.Identifier[0].Value, + "name": provinsi.Name, + }, + } + + return hierarchy, nil +} + +// Helper function untuk min +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func (s *DatabaseService) GetHierarchyFromProvinsi(provinsiId string) (map[string]interface{}, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // 1. Ambil data provinsi + var provinsi Mongomaster.State + provinsiFilter := bson.M{ + "identifier.0.value": provinsiId, + } + + err := s.DBMongo.Collection("state").FindOne(ctx, provinsiFilter).Decode(&provinsi) + if err != nil { + log.Println("Error saat mencari provinsi:", err) + return nil, err + } + log.Printf("Provinsi ditemukan: %s", provinsi.Name) + + // DEBUGGING: Tampilkan struktur data kota + // Ambil semua kota tanpa filter untuk memeriksa struktur data + allCitiesCursor, err := s.DBMongo.Collection("city").Find(ctx, bson.M{}) + if err != nil { + log.Println("Error saat mengambil semua kota:", err) + return nil, err + } + + var allCities []Mongomaster.City + if err = allCitiesCursor.All(ctx, &allCities); err != nil { + log.Println("Error saat decode semua kota:", err) + return nil, err + } + + log.Printf("Total kota di database: %d", len(allCities)) + + // Periksa dan tampilkan format referensi di 3 kota pertama + for i, city := range allCities { + if i < 3 { + log.Printf("Kota: %s, State Reference: %+v", city.Name, city.State.Reference) + } + } + + // Cari kota berdasarkan provinsi setelah melihat format referensi yang benar + var kotaList []map[string]interface{} + + // Coba berbagai kemungkinan filter + filters := []bson.M{ + {"state.reference": "provinsi/" + provinsiId}, + {"state.reference": provinsiId}, + {"state.display": provinsi.Name}, + } + + var kota []Mongomaster.City + var foundFilter string + + for _, filter := range filters { + log.Printf("Mencoba filter kota: %v", filter) + kotaCursor, _ := s.DBMongo.Collection("city").Find(ctx, filter) + var tempKota []Mongomaster.City + if kotaCursor.All(ctx, &tempKota) == nil && len(tempKota) > 0 { + kota = tempKota + foundFilter = fmt.Sprintf("%v", filter) + log.Printf("Filter yang berhasil: %s, menemukan %d kota", foundFilter, len(kota)) + break + } + } + + // Jika semua filter gagal, gunakan pendekatan alternatif: manual matching + if len(kota) == 0 { + log.Println("Semua filter gagal, mencoba pendekatan manual matching") + + // Cari kota yang memiliki referensi ke provinsi ini dengan cara apa pun + for _, city := range allCities { + stateRef := city.State.Reference + stateDisplay := city.State.Display + + // Cek apakah referensi atau display cocok dengan provinsi + if strings.Contains(stateRef, provinsiId) || + strings.EqualFold(stateDisplay, provinsi.Name) { + kota = append(kota, city) + } + } + + log.Printf("Pendekatan manual menemukan %d kota", len(kota)) + } + + // Transform data kota + kotaList = make([]map[string]interface{}, 0) + + for _, k := range kota { + kotaId := k.Identifier[0].Value + log.Printf("Memproses kota: %s (ID: %s)", k.Name, kotaId) + + kotaItem := map[string]interface{}{ + "id": kotaId, + "name": k.Name, + "kecamatan": []map[string]interface{}{}, + } + + // DEBUGGING: Tampilkan struktur data kecamatan + allDistrictsCursor, _ := s.DBMongo.Collection("district").Find(ctx, bson.M{}) + var allDistricts []Mongomaster.District + if allDistrictsCursor.All(ctx, &allDistricts) == nil { + log.Printf("Total kecamatan di database: %d", len(allDistricts)) + + // Periksa kecamatan yang memiliki referensi ke kota ini + var kecamatanForCity []Mongomaster.District + + for _, district := range allDistricts { + cityRef := district.City.Reference + cityDisplay := district.City.Display + + // Cek apakah referensi atau display cocok dengan kota + if strings.Contains(cityRef, kotaId) || + strings.EqualFold(cityDisplay, k.Name) { + kecamatanForCity = append(kecamatanForCity, district) + } + } + + log.Printf("Menemukan %d kecamatan untuk kota %s", len(kecamatanForCity), k.Name) + + // Proses kecamatan yang ditemukan + kecamatanList := make([]map[string]interface{}, 0) + + for _, kec := range kecamatanForCity { + kecamatanId := kec.Identifier[0].Value + log.Printf("Memproses kecamatan: %s (ID: %s)", kec.Name, kecamatanId) + + kecamatanItem := map[string]interface{}{ + "id": kecamatanId, + "name": kec.Name, + "kelurahan": []map[string]interface{}{}, + } + + // DEBUGGING: Tampilkan struktur data kelurahan + allVillagesCursor, _ := s.DBMongo.Collection("village").Find(ctx, bson.M{}) + var allVillages []Mongomaster.Village + if allVillagesCursor.All(ctx, &allVillages) == nil { + log.Printf("Total kelurahan di database: %d", len(allVillages)) + + // Periksa kelurahan yang memiliki referensi ke kecamatan ini + var kelurahanForDistrict []Mongomaster.Village + + for _, village := range allVillages { + districtRef := village.District.Reference + districtDisplay := village.District.Display + + // Cek apakah referensi atau display cocok dengan kecamatan + if strings.Contains(districtRef, kecamatanId) || + strings.EqualFold(districtDisplay, kec.Name) { + kelurahanForDistrict = append(kelurahanForDistrict, village) + } + } + + log.Printf("Menemukan %d kelurahan untuk kecamatan %s", len(kelurahanForDistrict), kec.Name) + + // Proses kelurahan yang ditemukan + kelurahanList := make([]map[string]interface{}, 0) + + for _, kel := range kelurahanForDistrict { + kelurahanItem := map[string]interface{}{ + "id": kel.Identifier[0].Value, + "name": kel.Name, + } + + kelurahanList = append(kelurahanList, kelurahanItem) + } + + // Tambahkan kelurahan ke kecamatan + kecamatanItem["kelurahan"] = kelurahanList + } + + kecamatanList = append(kecamatanList, kecamatanItem) + } + + // Tambahkan kecamatan ke kota + kotaItem["kecamatan"] = kecamatanList + } + + kotaList = append(kotaList, kotaItem) + } + + // Buat response hierarki + hierarchy := map[string]interface{}{ + "provinsi": map[string]interface{}{ + "id": provinsi.Identifier[0].Value, + "name": provinsi.Name, + "kota": kotaList, + }, + } + + return hierarchy, nil +} diff --git a/pkg/database/satu_data/address.go b/pkg/database/satu_data/address.go index 2236934..4d02040 100644 --- a/pkg/database/satu_data/address.go +++ b/pkg/database/satu_data/address.go @@ -2,6 +2,7 @@ package satu_data import ( "api-poliklinik/pkg/models/satu_data" + "api-poliklinik/pkg/models/simrs" "errors" "gorm.io/gorm" "log" @@ -30,3 +31,81 @@ LIMIT 10` } return dataaddress } + +func (s *DatabaseService) Getprovinsi() []*simrs.Getprovinsi { + var dataprovinsi []*simrs.Getprovinsi + query := `select + mp.idprovinsi as id_idprovinsi, mp.namaprovinsi as nm_namaprovinsi +from m_provinsi mp` + errQuery := s.DB.Debug().Raw(query).Scan(&dataprovinsi).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil + } + log.Println(errQuery) + return nil + } + return dataprovinsi +} + +func (s *DatabaseService) Getkota() []*simrs.Getkota { + var datakota []*simrs.Getkota + query := `select + mk.idkota as id_idkota, mk.namakota as nm_namakota, + mp.idprovinsi as ref_idprovinsi , mp.namaprovinsi as ref_namaprovinsi +from m_kota mk +join m_provinsi mp on mp.idprovinsi = mk.idprovinsi;` + errQuery := s.DB.Debug().Raw(query).Scan(&datakota).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil + } + log.Println(errQuery) + return nil + } + return datakota +} + +func (s *DatabaseService) Getkecamatan() []*simrs.Getkecamatan { + var datakecamatan []*simrs.Getkecamatan + query := `select + mc.idkecamatan as id_idkecamatan, mc.namakecamatan as nm_namakecamatan, + mk.idkota as ref_idkota, mk.namakota as ref_namakota +from m_kecamatan mc +join m_kota mk on mk.idkota = mc.idkota` + errQuery := s.DB.Debug().Raw(query).Scan(&datakecamatan).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil + } + log.Println(errQuery) + return nil + } + return datakecamatan +} + +func (s *DatabaseService) Getkelurahan() []*simrs.GetKelurahan { + var datakelurahan []*simrs.GetKelurahan + query := `select + ml.idkelurahan as id_idkelurahan, ml.namakelurahan as nm_namakelurahan, + mc.idkecamatan as id_idkecamatan, mc.namakecamatan as nm_namakecamatan +from m_kelurahan ml +join m_kecamatan mc on mc.idkecamatan = ml.idkecamatan` + errQuery := s.DB.Debug().Raw(query).Scan(&datakelurahan).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil + } + log.Println(errQuery) + return nil + } + return datakelurahan +} diff --git a/pkg/database/satu_data/extension.go b/pkg/database/satu_data/extension.go new file mode 100644 index 0000000..f848986 --- /dev/null +++ b/pkg/database/satu_data/extension.go @@ -0,0 +1,134 @@ +package satu_data + +import ( + "api-poliklinik/pkg/models/simrs" + "errors" + "gorm.io/gorm" + "log" +) + +func (s *DatabaseService) Getbahasa() []*simrs.Bahasasimrs { + var databahasa []*simrs.Bahasasimrs + query := `select + mb.idxbahasa as id_idbahasa, mb.nmbahasa as nm_namabahasa +from m_bahasa mb` + errQuery := s.DB.Debug().Raw(query).Scan(&databahasa).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil + } + log.Println(errQuery) + return nil + } + return databahasa +} + +func (s *DatabaseService) Getdisabilitas() []*simrs.Disabilitassimrs { + var datadisabilitas []*simrs.Disabilitassimrs + query := `select + md.kode_disabilitas as id_iddisabilitas, md.nama_disabilitas as nm_namadisabilitas +from m_disabilitas md` + errQuery := s.DB.Debug().Raw(query).Scan(&datadisabilitas).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil + } + log.Println(errQuery) + return nil + } + return datadisabilitas +} + +func (s *DatabaseService) Getpendidikan() []*simrs.Pendidikansimrs { + var datapendidikan []*simrs.Pendidikansimrs + query := `select + mpp.id_pendidikan as id_idpendidikan, mpp.nama_pendidikan as nm_namapendidikan +from m_pendidikan_pasien mpp` + errQuery := s.DB.Debug().Raw(query).Scan(&datapendidikan).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil + } + log.Println(errQuery) + return nil + } + return datapendidikan +} + +func (s *DatabaseService) Getpekerjaan() []*simrs.Pekerjaansimrs { + var datapekerjaan []*simrs.Pekerjaansimrs + query := `select + mp.idxpekerjaan as id_idpekerjaan, mp.nmpekerjaan as nm_namapekerjaan, mp.st_pekerjaan as des_pekerjaan +from m_pekerjaan mp` + errQuery := s.DB.Debug().Raw(query).Scan(&datapekerjaan).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil + } + log.Println(errQuery) + return nil + } + return datapekerjaan +} + +func (s *DatabaseService) Getstatus() []*simrs.StatusPernikahansimrs { + var datastatus []*simrs.StatusPernikahansimrs + query := `select + msp.id_status as id_idstatus, msp.nama_status as nm_namastatus +from m_status_pasien msp` + errQuery := s.DB.Debug().Raw(query).Scan(&datastatus).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil + } + log.Println(errQuery) + return nil + } + return datastatus +} + +func (s *DatabaseService) Getagama() []*simrs.Agamasimrs { + var dataagama []*simrs.Agamasimrs + query := `select + mag.id_agama as id_idagama, mag.nama_agama as nm_namaagama +from m_agama_pasien mag` + errQuery := s.DB.Debug().Raw(query).Scan(&dataagama).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil + } + log.Println(errQuery) + return nil + } + return dataagama +} + +func (s *DatabaseService) Getsuku() []*simrs.Sukusimrs { + var datasuku []*simrs.Sukusimrs + query := `select + ms.idxsuku as id_idsuku, ms.nmsuku as nm_namasuku +from m_suku ms` + errQuery := s.DB.Debug().Raw(query).Scan(&datasuku).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil + } + log.Println(errQuery) + return nil + } + return datasuku +} diff --git a/pkg/handlers/Master/extension.go b/pkg/handlers/Master/extension.go new file mode 100644 index 0000000..88f304a --- /dev/null +++ b/pkg/handlers/Master/extension.go @@ -0,0 +1 @@ +package Master diff --git a/pkg/handlers/Master/master.go b/pkg/handlers/Master/master.go new file mode 100644 index 0000000..c7f1fb5 --- /dev/null +++ b/pkg/handlers/Master/master.go @@ -0,0 +1,181 @@ +package Master + +import ( + "api-poliklinik/internal/database" + "api-poliklinik/pkg/database/mongo" + "github.com/gin-gonic/gin" + "net/http" + "os" +) + +func GetProvinsi(c *gin.Context) { + local := os.Getenv("MONGODB_DEV_MASTER") + db := database.New(local).GetMongoDB() + if db == nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Database connection failed"}) + return + } + + mongoDB := mongo.NewDatabaseServiceMongo(db) + dataProvinsi, errSelect := mongoDB.Getdataprovinsi() + if errSelect != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": errSelect.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{ + "data": dataProvinsi, + "message": "Provinsi Sukses Ter-ambil ", + }) +} + +func GetKota(c *gin.Context) { + local := os.Getenv("MONGODB_DEV_MASTER") + db := database.New(local).GetMongoDB() + if db == nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Database connection failed"}) + return + } + + mongoDB := mongo.NewDatabaseServiceMongo(db) + dataKota, errSelect := mongoDB.Getdatakota() + if errSelect != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": errSelect.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{ + "data": dataKota, + "message": "Kota Sukses Ter-ambil ", + }) +} + +func GetKecamatan(c *gin.Context) { + local := os.Getenv("MONGODB_DEV_MASTER") + db := database.New(local).GetMongoDB() + if db == nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Database connection failed"}) + return + } + + mongoDB := mongo.NewDatabaseServiceMongo(db) + datakecamatan, errSelect := mongoDB.Getdatakecamatan() + if errSelect != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": errSelect.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{ + "data": datakecamatan, + "message": "Kecamatan Sukses Ter-ambil ", + }) +} + +func GetKelurahan(c *gin.Context) { + local := os.Getenv("MONGODB_DEV_MASTER") + db := database.New(local).GetMongoDB() + if db == nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Database connection failed"}) + return + } + display := c.Param("name") + + if display == "" { + c.JSON(http.StatusBadRequest, gin.H{"message": "Parameter 'name' dibutuhkan"}) + return + } + + mongoDB := mongo.NewDatabaseServiceMongo(db) + datakelurahan, errSelect := mongoDB.Getdatakelurahan(display) + if errSelect != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": errSelect.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{ + "data": datakelurahan, + "message": "Keluruhan Sukses Ter-ambil ", + }) +} + +// Handler untuk mencari kelurahan berdasarkan query +func SearchKelurahan(c *gin.Context) { + local := os.Getenv("MONGODB_DEV_MASTER") + db := database.New(local).GetMongoDB() + if db == nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Database connection failed"}) + return + } + + query := c.Query("name") + if query == "" { + c.JSON(http.StatusBadRequest, gin.H{"message": "Parameter 'name' dibutuhkan"}) + return + } + + // Gunakan service database untuk pencarian + mongoDB := mongo.NewDatabaseServiceMongo(db) + dataKelurahan, errSearch := mongoDB.SearchKelurahan(query) + if errSearch != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": errSearch.Error()}) + return + } + + c.JSON(http.StatusOK, gin.H{ + "data": dataKelurahan, + "message": "Pencarian kelurahan berhasil", + }) +} + +// Handler untuk mendapatkan hierarki berdasarkan kelurahan +func GetHierarchyByKelurahan(c *gin.Context) { + local := os.Getenv("MONGODB_DEV_MASTER") + db := database.New(local).GetMongoDB() + if db == nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Database connection failed"}) + return + } + + // Ambil ID kelurahan dari parameter path + kelurahanId := c.Param("id") + if kelurahanId == "" { + c.JSON(http.StatusBadRequest, gin.H{"message": "Parameter 'id' dibutuhkan"}) + return + } + + // Gunakan service database untuk mendapatkan hierarki + mongoDB := mongo.NewDatabaseServiceMongo(db) + hierarchy, errGet := mongoDB.GetHierarchyByKelurahan(kelurahanId) + if errGet != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": errGet.Error()}) + return + } + + c.JSON(http.StatusOK, gin.H{ + "data": hierarchy, + "message": "Hierarki kelurahan berhasil diambil", + }) +} + +func GetHierarchyFromProvinsi(c *gin.Context) { + local := os.Getenv("MONGODB_DEV_MASTER") + db := database.New(local).GetMongoDB() + if db == nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Database connection failed"}) + return + } + + provinsiId := c.Param("id") + if provinsiId == "" { + c.JSON(http.StatusBadRequest, gin.H{"message": "Parameter 'id' dibutuhkan"}) + return + } + + mongoDB := mongo.NewDatabaseServiceMongo(db) + hierarchy, errGet := mongoDB.GetHierarchyFromProvinsi(provinsiId) + if errGet != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": errGet.Error()}) + return + } + + c.JSON(http.StatusOK, gin.H{ + "data": hierarchy, + "message": "Hierarki dari provinsi berhasil diambil", + }) +} diff --git a/pkg/handlers/MongoHandler/Patient/patient.go b/pkg/handlers/MongoHandler/Patient/patient.go index 607c14e..6c97dbd 100644 --- a/pkg/handlers/MongoHandler/Patient/patient.go +++ b/pkg/handlers/MongoHandler/Patient/patient.go @@ -12,73 +12,61 @@ import ( "time" ) -//func InsertPatient(c *gin.Context) { -// local := os.Getenv("MONGODB_DEV_LOCAL") -// db := database.New(local).GetMongoDB() -// if db == nil { -// c.JSON(http.StatusInternalServerError, gin.H{"message": "Database connection failed"}) -// return -// } -// mongoDB := mongo.NewDatabaseServiceMongo(db) -// var req *patient.Patient -// err := c.Bind(&req) -// if err != nil { -// c.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) -// return -// } -// -// rekamMedikNumber, err := mongoDB.GetNextRekamMedikNumber() -// if err != nil { -// c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to generate rekamedik number"}) -// return -// } -// -// req.Identifier = append(req.Identifier, _struct.Identifier{ -// Use: "usual", -// Type: _struct.CodeableConcept{ -// Coding: []_struct.Coding{ -// { -// Code: "RM", -// Display: "RekamMedik", -// UserSelected: true, -// }, -// }, -// Text: "RM", -// }, -// Value: rekamMedikNumber, -// Period: _struct.Period{ -// Start: time.Now().Format("2006-01-02"), -// }, -// Assigner: _struct.Reference{}, -// }) -// -// dateCreated := time.Now().Format("2006-01-02 15:04:05") -// updateCreated := time.Now().Format("2006-01-02 15:04:05") -// -// if len(req.Extension) > 0 { -// req.Extension[0].Extension = append(req.Extension[0].Extension, -// _struct.ExtensionDetail{ -// URL: "createdAt", -// ValueDisplay: dateCreated, -// ValueCode: "", -// }, -// _struct.ExtensionDetail{ -// URL: "updatedAt", -// ValueDisplay: updateCreated, -// ValueCode: "", -// }, -// ) -// } -// errInsert := mongoDB.InsertPatient(req) -// if errInsert != nil { -// c.JSON(http.StatusInternalServerError, gin.H{"message": errInsert.Error()}) -// return -// } -// c.JSON(http.StatusOK, gin.H{ -// "data": rekamMedikNumber, -// "message": "Pasien berhasil di Buat", -// }) -//} +func InsertPatient(c *gin.Context) { + local := os.Getenv("MONGODB_DEV_LOCAL") + db := database.New(local).GetMongoDB() + if db == nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Database connection failed"}) + return + } + mongoDB := mongo.NewDatabaseServiceMongo(db) + var req *patient.Patient + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid request format"}) + return + } + + rekamMedikNumber, err := mongoDB.GetNextRekamMedikNumber() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": "Failed to generate rekamedik number"}) + return + } + + req.Identifier = append(req.Identifier, _struct.Identifier{ + Use: "usual", + Type: _struct.CodeableConcept{ + Coding: []_struct.Coding{ + { + Code: "RM", + Display: "RekamMedik", + UserSelected: true, + }, + }, + Text: "RM", + }, + Value: rekamMedikNumber, + Period: _struct.Period{ + Start: time.Now().Format("2006-01-02"), + }, + Assigner: _struct.Reference{}, + }) + + dateCreated := time.Now().Format("2006-01-02 15:04:05") + + req.CreatedAt = dateCreated + req.UpdatedAt = dateCreated + req.ResourceType = "Patient" + + errInsert := mongoDB.InsertPatientmongo(req) + if errInsert != nil { + c.JSON(http.StatusInternalServerError, gin.H{"message": errInsert.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{ + "data": rekamMedikNumber, + "message": "Pasien berhasil di Buat", + }) +} func GetDataBY(c *gin.Context) { local := os.Getenv("MONGODB_DEV_LOCAL") diff --git a/pkg/handlers/migrasi/address/address.go b/pkg/handlers/migrasi/address/address.go new file mode 100644 index 0000000..03783dc --- /dev/null +++ b/pkg/handlers/migrasi/address/address.go @@ -0,0 +1,408 @@ +package address + +import ( + "api-poliklinik/internal/database" + "api-poliklinik/pkg/database/mongo" + connDatabase "api-poliklinik/pkg/database/satu_data" + mongomaster "api-poliklinik/pkg/models/mongo/master/masteraddress" + _struct "api-poliklinik/pkg/models/struct" + "github.com/gin-gonic/gin" + "go.mongodb.org/mongo-driver/bson/primitive" + "log" + "net/http" + "os" + "time" +) + +func Migrasiprovinsi(c *gin.Context) { + db := database.New().GetDB("simrs") + simrs := connDatabase.NewDatabaseService(db) + + dataProvinsi := simrs.Getprovinsi() + if dataProvinsi == nil || len(dataProvinsi) == 0 { + c.JSON(http.StatusNotFound, gin.H{ + "status": "error", + "message": "Tidak ada data pasien untuk dimigrasi", + }) + return + } + + local := os.Getenv("MONGODB_DEV_MASTER") + mongoDBConn := database.New(local).GetMongoDB() + if mongoDBConn == nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "status": "error", + "message": "Koneksi database MongoDB gagal", + }) + return + } + mongoDB := mongo.NewDatabaseServiceMongo(mongoDBConn) + + migratedCount := 0 + failedCount := 0 + var migratedIDs []string + + for _, provinsi := range dataProvinsi { + dateCreated := time.Now().Format("2006-01-02 15:04:05") + objectID := primitive.NewObjectID() + var fhirProvinsi = mongomaster.State{ + ResourceType: "State", + ID: objectID, + } + // Mengisi properti Identifier + fhirProvinsi.Identifier = []_struct.Identifier{ + { + Use: "usual", + System: "", + Value: provinsi.IDProvinsi, + Type: _struct.CodeableConcept{ + Coding: []_struct.Coding{ + { + System: "", + Version: "", + Code: "idprovinsi", + Display: "ID m_provinsi Simrs 3.0", + UserSelected: true, + }, + }, + Text: "ID m_provinsi Simrs 3.0", + }, + Period: _struct.Period{ + Start: "", + End: "", + }, + Assigner: _struct.Reference{ + Reference: "", + Display: "", + }, + }, + } + + fhirProvinsi.Status = "active" + fhirProvinsi.Name = provinsi.NamaProvinsi + fhirProvinsi.Period = _struct.Period{ + Start: "", + End: "", + } + fhirProvinsi.CreatedAt = dateCreated + fhirProvinsi.UpdatedAt = dateCreated + + err := mongoDB.InsertState(fhirProvinsi) + + if err != nil { + log.Printf("Gagal migrasi data praktisi %s: %v", provinsi.IDProvinsi, err) + failedCount++ + continue + } + + migratedIDs = append(migratedIDs, objectID.Hex()) + migratedCount++ + } + + c.JSON(http.StatusOK, gin.H{ + "status": "success", + "message": "Migrasi data provinsi ke FHIR berhasil", + "total": len(dataProvinsi), + "migrated": migratedCount, + "failed": failedCount, + "migrated_ids": migratedIDs, + "timestamp": time.Now().Format(time.RFC3339), + }) +} + +func Migrasikota(c *gin.Context) { + db := database.New().GetDB("simrs") + simrs := connDatabase.NewDatabaseService(db) + + dataKota := simrs.Getkota() + if dataKota == nil || len(dataKota) == 0 { + c.JSON(http.StatusNotFound, gin.H{ + "status": "error", + "message": "Tidak ada data pasien untuk dimigrasi", + }) + return + } + + local := os.Getenv("MONGODB_DEV_MASTER") + mongoDBConn := database.New(local).GetMongoDB() + if mongoDBConn == nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "status": "error", + "message": "Koneksi database MongoDB gagal", + }) + return + } + mongoDB := mongo.NewDatabaseServiceMongo(mongoDBConn) + + migratedCount := 0 + failedCount := 0 + var migratedIDs []string + + for _, kota := range dataKota { + dateCreated := time.Now().Format("2006-01-02 15:04:05") + objectID := primitive.NewObjectID() + var fhirkota = mongomaster.City{ + ResourceType: "City", + ID: objectID, + } + fhirkota.Identifier = []_struct.Identifier{ + { + Use: "usual", + System: "", + Value: kota.IDKota, + Type: _struct.CodeableConcept{ + Coding: []_struct.Coding{ + { + System: "", + Version: "", + Code: "idkota", + Display: "ID m_kota Simrs 3.0", + UserSelected: true, + }, + }, + Text: "ID m_kota Simrs 3.0", + }, + Period: _struct.Period{ + Start: "", + End: "", + }, + Assigner: _struct.Reference{ + Reference: "", + Display: "", + }, + }, + } + + fhirkota.Status = "active" + fhirkota.Name = kota.NamaKota + fhirkota.State = _struct.Reference{ + Reference: "Provinsi/" + kota.IDProvinsi, + Display: kota.NamaProvinsi, + } + fhirkota.Period = _struct.Period{ + Start: "", + End: "", + } + fhirkota.CreatedAt = dateCreated + fhirkota.UpdatedAt = dateCreated + + err := mongoDB.InsertCity(fhirkota) + + if err != nil { + log.Printf("Gagal migrasi data kora %s: %v", kota.IDKota, err) + failedCount++ + continue + } + + migratedIDs = append(migratedIDs, objectID.Hex()) + migratedCount++ + } + + c.JSON(http.StatusOK, gin.H{ + "status": "success", + "message": "Migrasi data kota ke FHIR berhasil", + "total": len(dataKota), + "migrated": migratedCount, + "failed": failedCount, + "migrated_ids": migratedIDs, + "timestamp": time.Now().Format(time.RFC3339), + }) +} + +func Migrasikecamatan(c *gin.Context) { + db := database.New().GetDB("simrs") + simrs := connDatabase.NewDatabaseService(db) + + dataKecamatan := simrs.Getkecamatan() + if dataKecamatan == nil || len(dataKecamatan) == 0 { + c.JSON(http.StatusNotFound, gin.H{ + "status": "error", + "message": "Tidak ada data pasien untuk dimigrasi", + }) + return + } + + local := os.Getenv("MONGODB_DEV_MASTER") + mongoDBConn := database.New(local).GetMongoDB() + if mongoDBConn == nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "status": "error", + "message": "Koneksi database MongoDB gagal", + }) + return + } + mongoDB := mongo.NewDatabaseServiceMongo(mongoDBConn) + + migratedCount := 0 + failedCount := 0 + var migratedIDs []string + + for _, kecamatan := range dataKecamatan { + dateCreated := time.Now().Format("2006-01-02 15:04:05") + objectID := primitive.NewObjectID() + var fhirkecamatan = mongomaster.District{ + ResourceType: "District", + ID: objectID, + } + fhirkecamatan.Identifier = []_struct.Identifier{ + { + Use: "usual", + System: "", + Value: kecamatan.IDKecamatan, + Type: _struct.CodeableConcept{ + Coding: []_struct.Coding{ + { + System: "", + Version: "", + Code: "idkecamatan", + Display: "ID m_kecamatan Simrs 3.0", + UserSelected: true, + }, + }, + Text: "ID m_kecamatan Simrs 3.0", + }, + Period: _struct.Period{ + Start: "", + End: "", + }, + Assigner: _struct.Reference{ + Reference: "", + Display: "", + }, + }, + } + + fhirkecamatan.Status = "active" + fhirkecamatan.Name = kecamatan.NamaKecamatan + fhirkecamatan.City = _struct.Reference{ + Reference: "City/" + kecamatan.IDKota, + Display: kecamatan.NamaKota, + } + fhirkecamatan.Period = _struct.Period{ + Start: "", + End: "", + } + fhirkecamatan.CreatedAt = dateCreated + fhirkecamatan.UpdatedAt = dateCreated + + err := mongoDB.InsertDistrict(fhirkecamatan) + + if err != nil { + log.Printf("Gagal migrasi data kora %s: %v", kecamatan.IDKecamatan, err) + failedCount++ + continue + } + + migratedIDs = append(migratedIDs, objectID.Hex()) + migratedCount++ + } + + c.JSON(http.StatusOK, gin.H{ + "status": "success", + "message": "Migrasi data kecamatan ke FHIR berhasil", + "total": len(dataKecamatan), + "migrated": migratedCount, + "failed": failedCount, + "migrated_ids": migratedIDs, + "timestamp": time.Now().Format(time.RFC3339), + }) +} + +func Migrasikelurahan(c *gin.Context) { + db := database.New().GetDB("simrs") + simrs := connDatabase.NewDatabaseService(db) + + dataKelurahan := simrs.Getkelurahan() + if dataKelurahan == nil || len(dataKelurahan) == 0 { + c.JSON(http.StatusNotFound, gin.H{ + "status": "error", + "message": "Tidak ada data pasien untuk dimigrasi", + }) + return + } + + local := os.Getenv("MONGODB_DEV_MASTER") + mongoDBConn := database.New(local).GetMongoDB() + if mongoDBConn == nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "status": "error", + "message": "Koneksi database MongoDB gagal", + }) + return + } + mongoDB := mongo.NewDatabaseServiceMongo(mongoDBConn) + + migratedCount := 0 + failedCount := 0 + var migratedIDs []string + + for _, kelurahan := range dataKelurahan { + dateCreated := time.Now().Format("2006-01-02 15:04:05") + objectID := primitive.NewObjectID() + var fhirkelurahan = mongomaster.Village{ + ResourceType: "Village", + ID: objectID, + } + fhirkelurahan.Identifier = []_struct.Identifier{ + { + Use: "usual", + System: "", + Value: kelurahan.IDKelurahan, + Type: _struct.CodeableConcept{ + Coding: []_struct.Coding{ + { + System: "", + Version: "", + Code: "idkelurahan", + Display: "ID m_kelurahan Simrs 3.0", + UserSelected: true, + }, + }, + Text: "ID m_kelurahan Simrs 3.0", + }, + Period: _struct.Period{ + Start: "", + End: "", + }, + Assigner: _struct.Reference{ + Reference: "", + Display: "", + }, + }, + } + + fhirkelurahan.Status = "active" + fhirkelurahan.Name = kelurahan.NamaKelurahan + fhirkelurahan.District = _struct.Reference{ + Reference: "Distric/" + kelurahan.IDKecamatan, + Display: kelurahan.NamaKecamatan, + } + fhirkelurahan.Period = _struct.Period{ + Start: "", + End: "", + } + fhirkelurahan.CreatedAt = dateCreated + fhirkelurahan.UpdatedAt = dateCreated + + err := mongoDB.InsertVillage(fhirkelurahan) + + if err != nil { + log.Printf("Gagal migrasi data kelurahan %s: %v", kelurahan.IDKelurahan, err) + failedCount++ + continue + } + + migratedIDs = append(migratedIDs, objectID.Hex()) + migratedCount++ + } + + c.JSON(http.StatusOK, gin.H{ + "status": "success", + "message": "Migrasi data kelurahan ke FHIR berhasil", + "total": len(dataKelurahan), + "migrated": migratedCount, + "failed": failedCount, + "migrated_ids": migratedIDs, + "timestamp": time.Now().Format(time.RFC3339), + }) +} diff --git a/pkg/handlers/migrasi/extension/extension.go b/pkg/handlers/migrasi/extension/extension.go new file mode 100644 index 0000000..c9fa464 --- /dev/null +++ b/pkg/handlers/migrasi/extension/extension.go @@ -0,0 +1,113 @@ +package extension + +import ( + "api-poliklinik/internal/database" + "api-poliklinik/pkg/database/mongo" + connDatabase "api-poliklinik/pkg/database/satu_data" + mongomaster "api-poliklinik/pkg/models/mongo/master/masteraddress" + _struct "api-poliklinik/pkg/models/struct" + "github.com/gin-gonic/gin" + "go.mongodb.org/mongo-driver/bson/primitive" + "net/http" + "os" + "time" +) + +func Migrasibahasa(c *gin.Context) { + db := database.New().GetDB("simrs") + simrs := connDatabase.NewDatabaseService(db) + + dataKelurahan := simrs.Getkelurahan() + if dataKelurahan == nil || len(dataKelurahan) == 0 { + c.JSON(http.StatusNotFound, gin.H{ + "status": "error", + "message": "Tidak ada data pasien untuk dimigrasi", + }) + return + } + + local := os.Getenv("MONGODB_DEV_MASTER") + mongoDBConn := database.New(local).GetMongoDB() + if mongoDBConn == nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "status": "error", + "message": "Koneksi database MongoDB gagal", + }) + return + } + mongoDB := mongo.NewDatabaseServiceMongo(mongoDBConn) + + migratedCount := 0 + failedCount := 0 + var migratedIDs []string + + for _, kelurahan := range dataKelurahan { + dateCreated := time.Now().Format("2006-01-02 15:04:05") + objectID := primitive.NewObjectID() + var fhirkelurahan = mongomaster.Village{ + ResourceType: "Village", + ID: objectID, + } + fhirkelurahan.Identifier = []_struct.Identifier{ + { + Use: "usual", + System: "", + Value: kelurahan.IDKelurahan, + Type: _struct.CodeableConcept{ + Coding: []_struct.Coding{ + { + System: "", + Version: "", + Code: "idkelurahan", + Display: "ID m_kelurahan Simrs 3.0", + UserSelected: true, + }, + }, + Text: "ID m_kelurahan Simrs 3.0", + }, + Period: _struct.Period{ + Start: "", + End: "", + }, + Assigner: _struct.Reference{ + Reference: "", + Display: "", + }, + }, + } + + fhirkelurahan.Status = "active" + fhirkelurahan.Name = kelurahan.NamaKelurahan + fhirkelurahan.District = _struct.Reference{ + Reference: "Distric/" + kelurahan.IDKecamatan, + Display: kelurahan.NamaKecamatan, + } + fhirkelurahan.Period = _struct.Period{ + Start: "", + End: "", + } + fhirkelurahan.CreatedAt = dateCreated + fhirkelurahan.UpdatedAt = dateCreated + + err := mongoDB.InsertVillage(fhirkelurahan) + + if err != nil { + log.Printf("Gagal migrasi data kelurahan %s: %v", kelurahan.IDKelurahan, err) + failedCount++ + continue + } + + migratedIDs = append(migratedIDs, objectID.Hex()) + migratedCount++ + } + + c.JSON(http.StatusOK, gin.H{ + "status": "success", + "message": "Migrasi data kelurahan ke FHIR berhasil", + "total": len(dataKelurahan), + "migrated": migratedCount, + "failed": failedCount, + "migrated_ids": migratedIDs, + "timestamp": time.Now().Format(time.RFC3339), + }) +} diff --git a/pkg/handlers/migrasi/migrasi.go b/pkg/handlers/migrasi/migrasi.go index e5b491c..6d2e22b 100644 --- a/pkg/handlers/migrasi/migrasi.go +++ b/pkg/handlers/migrasi/migrasi.go @@ -652,20 +652,12 @@ func MigratePasienToFHIR(c *gin.Context) { Type: "", }, } - + fhirPasien.CreatedAt = pasien.CreatedAt + fhirPasien.UpdatedAt = pasien.UpdatedAt fhirPasien.Extension = []_struct.Extension{ { URL: "", Extension: []_struct.ExtensionDetail{ - { - URL: "CreatedAt", - ValueDisplay: pasien.CreatedAt, - ValueCode: "", - }, { - URL: "UpdateAt", - ValueDisplay: pasien.UpdatedAt, - ValueCode: "", - }, { URL: "trible", ValueDisplay: pasien.Suku, diff --git a/pkg/models/mongo/episodeofcare/episodeofcare.go b/pkg/models/mongo/episodeofcare/episodeofcare.go new file mode 100644 index 0000000..362cb72 --- /dev/null +++ b/pkg/models/mongo/episodeofcare/episodeofcare.go @@ -0,0 +1,27 @@ +package episodeofcare + +import ( + _struct "api-poliklinik/pkg/models/struct" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type EpisodeOfCare struct { + ResourceType string `json:"resourceType" bson:"resourceType,omitempty" ` + ID primitive.ObjectID `bson:"_id,omitempty" json:"id" ` + Status bool `json:"status" bson:"status"` + StatusHistory []_struct.StatusHistrory `bson:"statusHistory,omitempty" json:"statusHistory" ` + Type []_struct.CodeableConcept `bson:"type,omitempty" json:"type" ` + Reason []_struct.Reason `bson:"reason,omitempty" json:"reason" ` + Diagnosis []_struct.Diagnosis `bson:"diagnosis,omitempty" json:"diagnosis" ` + Patient _struct.Reference `bson:"patient,omitempty" json:"patient" ` + ManagingOrganization []_struct.Reference `bson:"managingOrganization,omitempty" json:"managingOrganization" ` + Period []_struct.Period `bson:"period,omitempty" json:"period" ` + ReferralRequest _struct.Reference `bson:"referralRequest,omitempty" json:"referralRequest" ` + CareManager _struct.Reference `bson:"careManager,omitempty" json:"careManager" ` + CareTeam _struct.Reference `bson:"careTea,omitempty" json:"careTea" ` + Account _struct.Reference `bson:"account,omitempty" json:"account" ` + CreatedAt string `bson:"createdAt,omitempty" json:"createdAt" ` + UpdatedAt string `bson:"updatedAt,omitempty" json:"updatedAt" ` + DeletedAt string `bson:"deletedAt,omitempty" json:"deletedAt" ` + Extension []_struct.Extension `bson:"extension,omitempty" json:"extension" ` +} diff --git a/pkg/models/mongo/healthcareservice/healthcareservice.go b/pkg/models/mongo/healthcareservice/healthcareservice.go new file mode 100644 index 0000000..5ad92fd --- /dev/null +++ b/pkg/models/mongo/healthcareservice/healthcareservice.go @@ -0,0 +1,35 @@ +package healthcareservice + +import ( + _struct "api-poliklinik/pkg/models/struct" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type HealthcareService struct { + ResourceType string `json:"resourceType" bson:"resourceType,omitempty" ` + ID primitive.ObjectID `bson:"_id,omitempty" json:"id" ` + ProvidedBy _struct.Reference `bson:"providedBy,omitempty" json:"providedBy,omitempty" ` + OfferedIn []_struct.Reference `bson:"offeredIn,omitempty" json:"offeredIn,omitempty" ` + Category []_struct.CodeableConcept `bson:"category,omitempty" json:"category,omitempty" ` + Type []_struct.CodeableConcept `bson:"type,omitempty" json:"type,omitempty" ` + Specialty []_struct.CodeableConcept `bson:"specialty,omitempty" json:"specialty,omitempty" ` + Location []_struct.Reference `bson:"location,omitempty" json:"location,omitempty" ` + Name string `bson:"name" json:"name"` + Comment string `bson:"comment,omitempty" json:"comment,omitempty" ` + ExtraDetails string `bson:"extraDetails,omitempty" json:"extraDetails,omitempty" ` + Photo []_struct.Photo `json:"photo" bson:"photo,omitempty" ` + Contact []_struct.ExtendedContactDetail `json:"contact" bson:"contact,omitempty" ` + CoverageArea []_struct.Reference `json:"coverageArea" bson:"coverageArea,omitempty" ` + ServiceProvisionCode []_struct.CodeableConcept `json:"serviceProvisionCode" bson:"serviceProvisionCode,omitempty" ` + Eligibility []_struct.Code `json:"eligibility" bson:"eligibility,omitempty" ` + Program []_struct.Code `json:"program" bson:"program,omitempty" ` + Communication []_struct.Code `json:"communication" bson:"communication,omitempty" ` + ReferralMethod []_struct.Code `json:"referralMethod" bson:"referralMethod,omitempty" ` + AppointmentRequired bool `json:"appointmentRequired" bson:"appointmentRequired,omitempty" ` + Availibity []_struct.Availability `json:"availibity" bson:"availibity,omitempty" ` + Endpoint []_struct.Reference `json:"endpoint" bson:"endpoint,omitempty" ` + CreatedAt string `json:"createdAt" bson:"createdAt,omitempty" ` + UpdatedAt string `json:"updatedAt" bson:"updatedAt,omitempty" ` + DeletedAt string `json:"deletedAt" bson:"deletedAt,omitempty" ` + Extension []_struct.Extension `json:"extension" bson:"extension,omitempty" ` +} diff --git a/pkg/models/mongo/insertpatient/insertPatientRelated.go b/pkg/models/mongo/insertpatient/insertPatientRelated.go index a40a989..04f50d2 100644 --- a/pkg/models/mongo/insertpatient/insertPatientRelated.go +++ b/pkg/models/mongo/insertpatient/insertPatientRelated.go @@ -24,6 +24,9 @@ type Patient struct { Contact []_struct.Contact `json:"contact" bson:"contact,omitempty" ` Communication []_struct.Communication `json:"communication" bson:"communication,omitempty" ` Link []_struct.Link `json:"link" bson:"link,omitempty" ` + CreatedAt string `json:"createdAt" bson:"createdAt" ` + UpdatedAt string `json:"updatedAt" bson:"updatedAt" ` + DeletedAt string `json:"deletedAt" bson:"deletedAt,omitempty" ` Extension []_struct.Extension `json:"extension" bson:"extension,omitempty" ` } diff --git a/pkg/models/mongo/master/masteraddress/masteraddress.go b/pkg/models/mongo/master/masteraddress/masteraddress.go new file mode 100644 index 0000000..7d67071 --- /dev/null +++ b/pkg/models/mongo/master/masteraddress/masteraddress.go @@ -0,0 +1,53 @@ +package masteraddress + +import ( + _struct "api-poliklinik/pkg/models/struct" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type State struct { + ResourceType string `json:"resourceType" bson:"resourceType,omitempty" ` + ID primitive.ObjectID `bson:"_id,omitempty" json:"id" ` + Identifier []_struct.Identifier `bson:"identifier" json:"identifier"` + Status string `bson:"status" json:"status"` + Name string `bson:"name" json:"name"` + Period _struct.Period `bson:"period" json:"period"` + CreatedAt string `bson:"createdAt" json:"createdAt"` + UpdatedAt string `bson:"updatedAt" json:"updatedAt"` +} + +type City struct { + ResourceType string `json:"resourceType" bson:"resourceType,omitempty" ` + ID primitive.ObjectID `bson:"_id,omitempty" json:"id" ` + Identifier []_struct.Identifier `bson:"identifier" json:"identifier"` + Status string `bson:"status" json:"status"` + Name string `bson:"name" json:"name"` + State _struct.Reference `bson:"state" json:"state"` + Period _struct.Period `bson:"period" json:"period"` + CreatedAt string `bson:"createdAt" json:"createdAt"` + UpdatedAt string `bson:"updatedAt" json:"updatedAt"` +} + +type District struct { + ResourceType string `json:"resourceType" bson:"resourceType,omitempty" ` + ID primitive.ObjectID `bson:"_id,omitempty" json:"id" ` + Identifier []_struct.Identifier `bson:"identifier" json:"identifier"` + Status string `bson:"status" json:"status"` + Name string `bson:"name" json:"name"` + City _struct.Reference `bson:"city" json:"city"` + Period _struct.Period `bson:"period" json:"period"` + CreatedAt string `bson:"createdAt" json:"createdAt"` + UpdatedAt string `bson:"updatedAt" json:"updatedAt"` +} + +type Village struct { + ResourceType string `json:"resourceType" bson:"resourceType,omitempty" ` + ID primitive.ObjectID `bson:"_id,omitempty" json:"id" ` + Identifier []_struct.Identifier `bson:"identifier" json:"identifier"` + Status string `bson:"status" json:"status"` + Name string `bson:"name" json:"name"` + District _struct.Reference `bson:"district" json:"district"` + Period _struct.Period `bson:"period" json:"period"` + CreatedAt string `bson:"createdAt" json:"createdAt"` + UpdatedAt string `bson:"updatedAt" json:"updatedAt"` +} diff --git a/pkg/models/simrs/address.go b/pkg/models/simrs/address.go new file mode 100644 index 0000000..4e94473 --- /dev/null +++ b/pkg/models/simrs/address.go @@ -0,0 +1,27 @@ +package simrs + +type Getprovinsi struct { + IDProvinsi string `gorm:"column:id_idprovinsi" json:"idprovinsi"` + NamaProvinsi string `gorm:"column:nm_namaprovinsi" json:"namaprovinsi"` +} + +type Getkota struct { + IDKota string `gorm:"column:id_idkota" json:"id_kota"` + NamaKota string `gorm:"column:nm_namakota" json:"nama_kota"` + IDProvinsi string `gorm:"column:ref_idprovinsi" json:"id_provinsi"` + NamaProvinsi string `gorm:"column:ref_namaprovinsi" json:"nama_provinsi"` +} + +type Getkecamatan struct { + IDKecamatan string `gorm:"column:id_idkecamatan" json:"id_kecamatan"` + NamaKecamatan string `gorm:"column:nm_namakecamatan" json:"nama_kecamatan"` + IDKota string `gorm:"column:ref_idkota" json:"id_kota"` + NamaKota string `gorm:"column:ref_namakota" json:"nama_kota"` +} + +type GetKelurahan struct { + IDKelurahan string `gorm:"column:id_idkelurahan" json:"id_kelurahan"` + NamaKelurahan string `gorm:"column:nm_namakelurahan" json:"nama_kelurahan"` + IDKecamatan string `gorm:"column:id_idkecamatan" json:"id_kecamatan"` + NamaKecamatan string `gorm:"column:nm_namakecamatan" json:"nama_kecamatan"` +} diff --git a/pkg/models/simrs/extension.go b/pkg/models/simrs/extension.go new file mode 100644 index 0000000..eb7c073 --- /dev/null +++ b/pkg/models/simrs/extension.go @@ -0,0 +1,37 @@ +package simrs + +type Bahasasimrs struct { + IDBahasa string `gorm:"column:id_idbahasa" json:"id_bahasa"` + NamaBahasa string `gorm:"column:nm_namabahasa" json:"nama_bahasa"` +} + +type Disabilitassimrs struct { + IDDisabilitas string `gorm:"column:id_iddisabilitas" json:"id_disabilitas"` + NamaDisabilitas string `gorm:"column:nm_namadisabilitas" json:"nama_disbilitas"` +} + +type Pendidikansimrs struct { + IDPendidikan string `gorm:"column:id_idpendidikan" json:"id_pendidikan"` + NamaPendidikan string `gorm:"column:nm_namapendidikan" json:"nama_pendidikan"` +} + +type Pekerjaansimrs struct { + IDPekerjaan string `gorm:"column:id_idpekerjaan" json:"id_pekerjaan"` + NamaPekerjaan string `gorm:"column:nm_namapekerjaan" json:"nama_pekerjaan"` + DesPekerjaan string `gorm:"column:des_pekerjaan" json:"des_pekerjaan"` +} + +type StatusPernikahansimrs struct { + IDStatus string `gorm:"column:id_idstatus" json:"id_status"` + NamaStatus string `gorm:"column:nm_namastatus" json:"nama_status"` +} + +type Agamasimrs struct { + IDAgama string `gorm:"column:id_idagama" json:"id_agama"` + NamaAgama string `gorm:"column:nm_namaagama" json:"nama_agama"` +} + +type Sukusimrs struct { + IDSuku string `gorm:"column:id_idsuku" json:"id_suku"` + NamaSuku string `gorm:"column:nm_namasuku" json:"nama_suku"` +} diff --git a/pkg/models/struct/fhir.go b/pkg/models/struct/fhir.go index 597ab05..1fa678e 100644 --- a/pkg/models/struct/fhir.go +++ b/pkg/models/struct/fhir.go @@ -1,5 +1,9 @@ package _struct +type StatusHistrory struct { + Status string `json:"status" ,bson:"status"` + Period Period `json:"period" ,bson:"period"` +} type Identifier struct { Use string `json:"use,omitempty" bson:"use"` Type CodeableConcept `json:"type,omitempty" bson:"type"` @@ -7,7 +11,7 @@ type Identifier struct { Value string `json:"value,omitempty" bson:"value"` Period Period `json:"period,omitempty" bson:"period"` Assigner Reference `json:"assigner,omitempty" bson:"assigner"` - Coding Coding + Coding Coding `json:"coding,omitempty" bson:"coding,omitempty"` } type CodeableConcept struct { @@ -119,14 +123,33 @@ type LinkTarget struct { } type ExtendedContactDetail struct { - Purpose CodeableConcept `json:"purpose" bson:"purpose"` - Name []HumanName `json:"name,omitempty" bson:"name"` - Telecom []ContactPoint `json:"telecom,omitempty" bson:"telecom"` - Address []Address `json:"address,omitempty" bson:"address"` - Organization Reference `json:"organization,omitempty" bson:"organization"` - Period Period `json:"period,omitempty" bson:"period"` + Purpose Purpose `json:"purpose" bson:"purpose"` + Name []HumanName `json:"name,omitempty" bson:"name"` + Telecom []ContactPoint `json:"telecom,omitempty" bson:"telecom"` + Address []Address `json:"address,omitempty" bson:"address"` + Organization Reference `json:"organization,omitempty" bson:"organization"` + Period Period `json:"period,omitempty" bson:"period"` } +type Purpose struct { + Purpose CodeableConcept `json:"purpose" bson:"purpose"` +} + +type Reason struct { + Use CodeableConcept `json:"use" bson:"use"` + Value []Value `json:"value" bson:"value"` + Reference Reference `json:"reference" bson:"reference"` +} + +type Value struct { + Concept CodeableConcept `json:"concept" bson:"concept"` + Reference Reference `json:"reference" bson:"reference"` +} + +type Diagnosis struct { + Condition []Value `json:"condition" bson:"condition"` + Use []CodeableConcept `json:"use" bson:"use"` +} type Quantity struct { Value float64 `json:"value,omitempty" bson:"value,omitempty"` Comparator string `json:"comparator,omitempty" bson:"comparator,omitempty"` @@ -141,6 +164,11 @@ type Qualification struct { Period Period `json:"period,omitempty" bson:"period,omitempty"` Issuer Reference `json:"issuer,omitempty" bson:"issuer,omitempty"` } + +type Code struct { + Code []CodeableConcept `json:"code" bson:"code"` + Comment string `json:"comment,omitempty" bson:"comment,omitempty"` +} type Position struct { Longitude float64 `json:"longitude,omitempty" bson:"longitude,omitempty"` Latitude float64 `json:"latitude,omitempty" bson:"latitude,omitempty"`