From 66c9f17ddee889e558d1d490476a4acd90aa994d Mon Sep 17 00:00:00 2001 From: mirza Date: Fri, 31 Jan 2025 11:04:28 +0700 Subject: [PATCH] init project --- Dockerfile | 26 +++ Makefile | 18 +- README.md | 2 +- cmd/api/main.go | 2 +- docker-compose.yml | 53 ++++-- go.mod | 6 +- go.sum | 8 + internal/database/database.go | 76 ++++++--- internal/server/routes.go | 10 +- internal/server/server.go | 2 +- pkg/database/simrs/database.go | 11 ++ pkg/database/simrs/dokter.go | 16 ++ pkg/database/simrs/mikrobiologi.go | 82 +++++++++ pkg/database/simrs/pasien.go | 18 ++ pkg/database/simrs/pendaftaran.go | 19 +++ pkg/database/simrs/ruang.go | 17 ++ pkg/handlers/mikrobiologi/mikrobiologi.go | 156 +++++++++++++++++ pkg/handlers/mikrobiologi/response.go | 83 +++++++++ pkg/models/simrs/mikrobiologi/mikrobiologi.go | 157 ++++++++++++++++++ pkg/models/simrs/pasien/pasien.go | 14 ++ pkg/models/simrs/ruang/ruang.go | 6 + 21 files changed, 725 insertions(+), 57 deletions(-) create mode 100644 Dockerfile create mode 100644 pkg/database/simrs/database.go create mode 100644 pkg/database/simrs/dokter.go create mode 100644 pkg/database/simrs/mikrobiologi.go create mode 100644 pkg/database/simrs/pasien.go create mode 100644 pkg/database/simrs/pendaftaran.go create mode 100644 pkg/database/simrs/ruang.go create mode 100644 pkg/handlers/mikrobiologi/mikrobiologi.go create mode 100644 pkg/handlers/mikrobiologi/response.go create mode 100644 pkg/models/simrs/mikrobiologi/mikrobiologi.go create mode 100644 pkg/models/simrs/pasien/pasien.go create mode 100644 pkg/models/simrs/ruang/ruang.go diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..617d88c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +FROM golang:1.23-alpine AS builder + +WORKDIR /app + +COPY go.mod go.sum ./ + +RUN go mod tidy + +COPY . . + +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main ./cmd/api +# RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . + +FROM alpine:latest + +# Set timezone ke Asia/Jakarta +ENV TZ=Asia/Jakarta + +RUN apk --no-cache add ca-certificates tzdata + +WORKDIR /root/ + +COPY --from=builder /app/main . +COPY --from=builder /app/.env . +EXPOSE 8080 +CMD ["./main"] \ No newline at end of file diff --git a/Makefile b/Makefile index 9d76e0e..b77025c 100644 --- a/Makefile +++ b/Makefile @@ -14,13 +14,7 @@ run: @go run cmd/api/main.go # Create DB container docker-run: - @if docker compose up --build 2>/dev/null; then \ - : ; \ - else \ - echo "Falling back to Docker Compose V1"; \ - docker-compose up --build; \ - fi - + @docker-compose up --build # Shutdown DB container docker-down: @if docker compose down 2>/dev/null; then \ @@ -28,11 +22,6 @@ docker-down: else \ echo "Falling back to Docker Compose V1"; \ docker-compose down; \ - fi - -# Test the application -test: - @echo "Testing..." @go test ./... -v # Integrations Tests for the application itest: @@ -41,6 +30,11 @@ itest: # Clean the binary clean: + fi + +# Test the application +test: + @echo "Testing..." @echo "Cleaning..." @rm -f main diff --git a/README.md b/README.md index 3ff046c..9e9ad51 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Project bridging-lis +# Project api-lis One Paragraph of project description goes here diff --git a/cmd/api/main.go b/cmd/api/main.go index 51a97f1..a4099b7 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -9,7 +9,7 @@ import ( "syscall" "time" - "bridging-lis/internal/server" + "api-lis/internal/server" ) func gracefulShutdown(apiServer *http.Server, done chan bool) { diff --git a/docker-compose.yml b/docker-compose.yml index d399ae2..9aaed72 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,15 +1,44 @@ services: - psql_bp: - image: postgres:latest - restart: unless-stopped - environment: - POSTGRES_DB: ${BLUEPRINT_DB_DATABASE} - POSTGRES_USER: ${BLUEPRINT_DB_USERNAME} - POSTGRES_PASSWORD: ${BLUEPRINT_DB_PASSWORD} + app: + build: + context: . + dockerfile: Dockerfile + container_name: api-lis + restart: always ports: - - "${BLUEPRINT_DB_PORT}:5432" + - 8080:8080 volumes: - - psql_volume_bp:/var/lib/postgresql/data - -volumes: - psql_volume_bp: + - .:/app + - /etc/localtime:/etc/localtime:ro + - /etc/timezone:/etc/timezone:ro + environment: + # TIMEZONE + - TZ=Asia/Jakarta + # DATABASE SIMRS V3.0 + - POSTGRE_DB_HOST=10.10.123.223 + - POSTGRE_DB_PORT=5432 + - POSTGRE_DB_NAME=simrsbackup + - POSTGRE_DB_USER=simtest + - POSTGRE_DB_PASS=12345 + # DATABASE SATU DATA + - SATUDATA_HOST=10.10.123.165 + - SATUDATA_USERNAME=stim + - SATUDATA_PASSWORD=stim*RS54 + - SATUDATA_NAME=satu_db + - SATUDATA_PORT=5000 + # BPJS + - BASEURL_BPJS=https://apijkn.bpjs-kesehatan.go.id/ + - CONS_ID=5257 + - USER_KEY=4cf1cbef8c008440bbe9ef9ba789e482 + - SECRET_KEY=1bV363512D + # SERVICE ANTROL + - ANTREAN_RS=antreanrs + # BPJS VCLAIM + - VCALIM_RS=vclaim-rest + # BPJS PCARE + - PCARE_RS=pcare-rest + # BPJS ICARE + - PCARE_APLICARE=ihs + # LIS MIKROBIOLOGI + - LIS_MIKROBIOLOGI_URL=http://10.10.123.218/ + - LIS_REGISTERPASIEN=registerpasien \ No newline at end of file diff --git a/go.mod b/go.mod index 98902b3..87ed5d1 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module bridging-lis +module api-lis go 1.23.1 @@ -8,6 +8,8 @@ require ( github.com/joho/godotenv v1.5.1 github.com/testcontainers/testcontainers-go v0.35.0 github.com/testcontainers/testcontainers-go/modules/postgres v0.35.0 + gorm.io/driver/postgres v1.5.11 + gorm.io/gorm v1.25.12 ) require ( @@ -42,6 +44,8 @@ require ( github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.4 // indirect github.com/klauspost/cpuid/v2 v2.2.9 // indirect diff --git a/go.sum b/go.sum index ec2903b..66c07a0 100644 --- a/go.sum +++ b/go.sum @@ -81,6 +81,10 @@ github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -257,6 +261,10 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= +gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/internal/database/database.go b/internal/database/database.go index 44c46af..2e6c74c 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -2,7 +2,6 @@ package database import ( "context" - "database/sql" "fmt" "log" "os" @@ -11,31 +10,27 @@ import ( _ "github.com/jackc/pgx/v5/stdlib" _ "github.com/joho/godotenv/autoload" + "gorm.io/driver/postgres" + "gorm.io/gorm" ) -// Service represents a service that interacts with a database. type Service interface { - // Health returns a map of health status information. - // The keys and values in the map are service-specific. Health() map[string]string - - // Close terminates the database connection. - // It returns an error if the connection cannot be closed. Close() error + GetDB() *gorm.DB } type service struct { - db *sql.DB + db *gorm.DB } var ( - database = os.Getenv("BLUEPRINT_DB_DATABASE") - password = os.Getenv("BLUEPRINT_DB_PASSWORD") - username = os.Getenv("BLUEPRINT_DB_USERNAME") - port = os.Getenv("BLUEPRINT_DB_PORT") - host = os.Getenv("BLUEPRINT_DB_HOST") - schema = os.Getenv("BLUEPRINT_DB_SCHEMA") - dbInstance *service + hostSimrs = os.Getenv("POSTGRE_DB_HOST") + userNameSimrs = os.Getenv("POSTGRE_DB_USER") + passwordSimrs = os.Getenv("POSTGRE_DB_PASS") + dbNameSimrs = os.Getenv("POSTGRE_DB_NAME") + portSimrs = os.Getenv("POSTGRE_DB_PORT") + dbInstance *service ) func New() Service { @@ -43,13 +38,16 @@ func New() Service { if dbInstance != nil { return dbInstance } - connStr := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable&search_path=%s", username, password, host, port, database, schema) - db, err := sql.Open("pgx", connStr) + simrs := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Jakarta", hostSimrs, userNameSimrs, passwordSimrs, dbNameSimrs, portSimrs) + + SimrsDB, err := gorm.Open(postgres.Open(simrs), &gorm.Config{}) if err != nil { - log.Fatal(err) + log.Fatal("Failed to connect to SIM database: ", err) + } else { + log.Println("Successfully connected to the database") } dbInstance = &service{ - db: db, + db: SimrsDB, } return dbInstance } @@ -57,17 +55,25 @@ func New() Service { // Health checks the health of the database connection by pinging the database. // It returns a map with keys indicating various health statistics. func (s *service) Health() map[string]string { - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() stats := make(map[string]string) - // Ping the database - err := s.db.PingContext(ctx) + // Ping the database using GORM + db, err := s.db.DB() // Retrieve the underlying sql.DB instance from GORM + if err != nil { + stats["status"] = "down" + stats["error"] = fmt.Sprintf("failed to get sql.DB from GORM: %v", err) + log.Fatalf("failed to get sql.DB from GORM: %v", err) // Log the error and terminate the program + return stats + } + + err = db.PingContext(ctx) if err != nil { stats["status"] = "down" stats["error"] = fmt.Sprintf("db down: %v", err) - log.Fatalf(fmt.Sprintf("db down: %v", err)) // Log the error and terminate the program + log.Fatalf("db down: %v", err) // Log the error and terminate the program return stats } @@ -75,8 +81,8 @@ func (s *service) Health() map[string]string { stats["status"] = "up" stats["message"] = "It's healthy" - // Get database stats (like open connections, in use, idle, etc.) - dbStats := s.db.Stats() + // Get database stats + dbStats := db.Stats() stats["open_connections"] = strconv.Itoa(dbStats.OpenConnections) stats["in_use"] = strconv.Itoa(dbStats.InUse) stats["idle"] = strconv.Itoa(dbStats.Idle) @@ -110,6 +116,22 @@ func (s *service) Health() map[string]string { // If the connection is successfully closed, it returns nil. // If an error occurs while closing the connection, it returns the error. func (s *service) Close() error { - log.Printf("Disconnected from database: %s", database) - return s.db.Close() + db, err := s.db.DB() // Retrieve the underlying sql.DB instance from GORM + if err != nil { + log.Printf("Failed to retrieve sql.DB from GORM: %v", err) + return err + } + + err = db.Close() + if err != nil { + log.Printf("Error closing the database connection: %v", err) + return err + } + + log.Printf("Disconnected from database successfully") + return nil +} + +func (s *service) GetDB() *gorm.DB { + return s.db } diff --git a/internal/server/routes.go b/internal/server/routes.go index 1d349ed..92f6bfd 100644 --- a/internal/server/routes.go +++ b/internal/server/routes.go @@ -4,15 +4,21 @@ import ( "net/http" "github.com/gin-gonic/gin" + + mikrobiologiHandler "api-lis/pkg/handlers/mikrobiologi" ) func (s *Server) RegisterRoutes() http.Handler { r := gin.Default() - r.GET("/", s.HelloWorldHandler) - r.GET("/health", s.healthHandler) + v1 := r.Group("/api") + + mikrobiologi := v1.Group("/mikrobiologi") + { + mikrobiologi.POST("/sendmikro", mikrobiologiHandler.SendDataLISMikro) + } return r } diff --git a/internal/server/server.go b/internal/server/server.go index 0f0c050..0d295a3 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -9,7 +9,7 @@ import ( _ "github.com/joho/godotenv/autoload" - "bridging-lis/internal/database" + "api-lis/internal/database" ) type Server struct { diff --git a/pkg/database/simrs/database.go b/pkg/database/simrs/database.go new file mode 100644 index 0000000..f088da1 --- /dev/null +++ b/pkg/database/simrs/database.go @@ -0,0 +1,11 @@ +package databaserepo + +import "gorm.io/gorm" + +type DatabaseService struct { + DB *gorm.DB +} + +func NewDatabaseService(db *gorm.DB) *DatabaseService { + return &DatabaseService{DB: db} +} diff --git a/pkg/database/simrs/dokter.go b/pkg/database/simrs/dokter.go new file mode 100644 index 0000000..3de5a8b --- /dev/null +++ b/pkg/database/simrs/dokter.go @@ -0,0 +1,16 @@ +package databaserepo + +import ( + "log" +) + +func (s *DatabaseService) GetNamaDokter(kdDokter string) (string, error) { + var namaDokter string + querySelect := `SELECT namadokter FROM m_dokter where "kddokter" = ?` + errSelect := s.DB.Debug().Raw(querySelect, kdDokter).Scan(&namaDokter).Error + if errSelect != nil { + log.Println(errSelect) + return "", errSelect + } + return namaDokter, nil +} diff --git a/pkg/database/simrs/mikrobiologi.go b/pkg/database/simrs/mikrobiologi.go new file mode 100644 index 0000000..e34ea2c --- /dev/null +++ b/pkg/database/simrs/mikrobiologi.go @@ -0,0 +1,82 @@ +package databaserepo + +import ( + "api-lis/pkg/models/simrs/mikrobiologi" + "errors" + "log" + + "gorm.io/gorm" +) + +func (s *DatabaseService) GetDataMikroBiologi(req *mikrobiologi.RequestPasienMikrobiologi) ([]*mikrobiologi.DataPasienMikrobiologi, error) { + var dataPasien []*mikrobiologi.DataPasienMikrobiologi + query := `select tom."nomr" as nomr, tomm."nonota" as nonota, tom."idxdaftar" as idxdaftar, tom."tglorder" as tglorder, tom."nolab" as nolab, tom."rajal" as statusrajal, tom."aps" as statusaps, + mp."nama" as nama, mp."noktp" as noktp, mp."noktp_baru" as noktpbaru, mp."tempat" as tmptlahir, mp."tgllahir" as tgllahir, mp."jeniskelamin" as jeniskelamin, mp."alamat" as alamat, + mpa."nama" as namaaps, mpa."noktp" as noktpaps, mpa."tempat" as tmptlahiraps, mpa."tgllahir" as tgllahiraps, mpa."jeniskelamin" as jeniskelaminaps, mpa."alamat" as alamataps, + mr."nama" as namaruang, mr."kelas" as kelasruang, + trj."kodetarif" as kodetarifrajal, + trp."kodetarif" as kodetarifranap + from t_orderlabmikro tom + left join m_pasien mp on mp."nomr" = tom."nomr" + left join m_pasien_aps mpa on mpa."nomr" = tom."nomr" + left join m_ruang mr on mr."no" = tom."kdpoli" + left join t_orderlabmikro_main tomm on tomm."nolab" = tom."nolab" + left join t_billrajal trj on trj."nonota" = CAST(tomm."nonota" AS int8) + left join t_billranap trp on trp."nonota" = CAST(tomm."nonota" AS int8) + where tom."nomr" = ? + and tom."idxdaftar" = ? + group by (tom."nomr",tomm."nonota",tom."idxdaftar",tom."tglorder",tom."nolab",tom."rajal",tom."aps",mp."nama",mp."noktp",mp."noktp_baru",mp."tempat",mp."tgllahir",mp."jeniskelamin",mp."alamat",mpa."nama",mpa."noktp", + mpa."tempat",mpa."tgllahir",mpa."jeniskelamin",mpa."alamat",mr."nama",mr."kelas",trj."kodetarif",trp."kodetarif") + ` + errQuery := s.DB.Debug().Raw(query, req.NOMR, req.IDXDaftar).Scan(&dataPasien).Error + if errQuery != nil { + if errors.Is(errQuery, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil, errMsg + } + log.Println(errQuery) + return nil, errQuery + } + return dataPasien, nil +} + +func (s *DatabaseService) GetDataMikroBiologiByNoMR(req *mikrobiologi.RequestPasienMikrobiologi) ([]*mikrobiologi.OrderLabMikroMain, error) { + var data []*mikrobiologi.OrderLabMikroMain + query := `select * from "t_orderlabmikro_main" where "nomr" = ? and "idxdaftar" = ? and "nolab" = ?` + errSelect := s.DB.Debug().Raw(query, req.NOMR, req.IDXDaftar, req.NoLab).Scan(&data).Error + if errSelect != nil { + if errors.Is(errSelect, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil, errMsg + } + log.Println(errSelect) + return nil, errSelect + } + return data, nil +} + +func (s *DatabaseService) GetDataLabMikro(noLab string) ([]*mikrobiologi.OrderLabMikro, bool, error) { + var dataMikro []*mikrobiologi.OrderLabMikro + querySelect := `select olm."idxordermikro", olm."jenis_pemeriksaan" + from t_orderlabmikro olm + left join "m_form_lab" fl on olm."idxform" = fl."form_id" + where olm."nolab" = ? and fl."sub_kelompok" = 'Jenis Pemeriksaan'` + errSelect := s.DB.Debug().Raw(querySelect, noLab).Scan(&dataMikro).Error + if errSelect != nil { + log.Println(errSelect) + return nil, false, errSelect + } + return dataMikro, true, nil +} + +func (s *DatabaseService) UpdateLabMikro(req *mikrobiologi.ReqUpdateLisMikro) error { + queryUpdate := `update "t_orderlabmikro" set "no_lokal" = ? where "idxordermikro" = ?` + errUpdate := s.DB.Debug().Exec(queryUpdate, req.NoLokal, req.IdxOrderMikro).Error + if errUpdate != nil { + log.Println(errUpdate) + return errUpdate + } + return nil +} diff --git a/pkg/database/simrs/pasien.go b/pkg/database/simrs/pasien.go new file mode 100644 index 0000000..1d48ff6 --- /dev/null +++ b/pkg/database/simrs/pasien.go @@ -0,0 +1,18 @@ +package databaserepo + +import ( + "api-lis/pkg/models/simrs/mikrobiologi" + "api-lis/pkg/models/simrs/pasien" + "log" +) + +func (s *DatabaseService) GetMPasien(req *mikrobiologi.RequestPasienMikrobiologi) (*pasien.MPasien, error) { + var dataPasien *pasien.MPasien + querySelect := `select * from m_pasien where "nomr" = ?` + errSelect := s.DB.Debug().Raw(querySelect, req.NOMR).First(&dataPasien).Error + if errSelect != nil { + log.Println(errSelect) + return nil, errSelect + } + return dataPasien, nil +} diff --git a/pkg/database/simrs/pendaftaran.go b/pkg/database/simrs/pendaftaran.go new file mode 100644 index 0000000..ee7e2e8 --- /dev/null +++ b/pkg/database/simrs/pendaftaran.go @@ -0,0 +1,19 @@ +package databaserepo + +import ( + "api-lis/pkg/models/simrs/mikrobiologi" + "log" +) + +func (s *DatabaseService) GetCaraBayar(req *mikrobiologi.OrderLabMikroMain) (string, error) { + var CaraBayar string + query := `select mcb."nama" from t_pendaftaran tp + left join m_carabayar mcb on tp."kdcarabayar" = mcb.kode + where tp."idxdaftar" = ?` + errSelect := s.DB.Debug().Raw(query, req.IdxDaftar).First(&CaraBayar).Error + if errSelect != nil { + log.Println(errSelect) + return "", errSelect + } + return CaraBayar, nil +} diff --git a/pkg/database/simrs/ruang.go b/pkg/database/simrs/ruang.go new file mode 100644 index 0000000..6c2ea59 --- /dev/null +++ b/pkg/database/simrs/ruang.go @@ -0,0 +1,17 @@ +package databaserepo + +import ( + "api-lis/pkg/models/simrs/ruang" + "log" +) + +func (s *DatabaseService) GetNamaRuang(kdPoli string) (*ruang.MRuang, error) { + var poli *ruang.MRuang + query := `select "nama", "subsistem" from m_ruang where "no" = ?` + errSelect := s.DB.Debug().Raw(query, kdPoli).Scan(&poli).Error + if errSelect != nil { + log.Println(errSelect) + return nil, errSelect + } + return poli, nil +} diff --git a/pkg/handlers/mikrobiologi/mikrobiologi.go b/pkg/handlers/mikrobiologi/mikrobiologi.go new file mode 100644 index 0000000..38c3210 --- /dev/null +++ b/pkg/handlers/mikrobiologi/mikrobiologi.go @@ -0,0 +1,156 @@ +package mikrobiologi + +import ( + "api-lis/internal/database" + connDatabase "api-lis/pkg/database/simrs" + "api-lis/pkg/models/simrs/mikrobiologi" + "log" + "net/http" + "time" + + "github.com/gin-gonic/gin" +) + +func SendDataLISMikro(c *gin.Context) { + db := database.New().GetDB() + simrsDB := connDatabase.NewDatabaseService(db) + var req *mikrobiologi.RequestPasienMikrobiologi + + err := c.Bind(&req) + if err != nil { + log.Println(err) + c.JSON(http.StatusBadRequest, gin.H{ + "message": err, + }) + return + } + + log.Println("REQUEST", req) + + dataMikro, errData := simrsDB.GetDataMikroBiologiByNoMR(req) + if errData != nil { + log.Println(errData) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errData, + }) + return + } + + dataPasien, errPasien := simrsDB.GetMPasien(req) + if errPasien != nil { + log.Println(errPasien) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errPasien, + }) + return + } + + tglLahir, errParse := time.Parse(time.RFC3339, dataPasien.TanggalLahir) + if errParse != nil { + log.Println(errParse) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errParse, + }) + return + } + + var responseMikro []*mikrobiologi.ResponseLISMikro + var dataLisMikro *mikrobiologi.RequestLISMikro + tglLahirString := tglLahir.Format("2006-01-02") + for _, dataMikroMain := range dataMikro { + dataLabMikro, exist, errDiagnosa := simrsDB.GetDataLabMikro(dataMikroMain.NoLab) + if errDiagnosa != nil { + log.Println(errDiagnosa) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errDiagnosa, + }) + return + } + + if !exist { + log.Println("Data bukan pemeriksaan") + continue + } + + namaDokter, errDokter := simrsDB.GetNamaDokter(dataMikroMain.DokterPengirim) + if errDokter != nil { + log.Println(errDokter) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errDokter, + }) + return + } + poli, errDokter := simrsDB.GetNamaRuang(dataMikroMain.KodePoli) + if errDokter != nil { + log.Println(errDokter) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errDokter, + }) + return + } + + caraBayar, errCaraBayar := simrsDB.GetCaraBayar(dataMikroMain) + if errCaraBayar != nil { + log.Println(errCaraBayar) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errCaraBayar, + }) + return + } + for _, value := range dataLabMikro { + dataLisMikro = &mikrobiologi.RequestLISMikro{ + NoRM: dataMikroMain.NoMR, + Nama: dataPasien.Nama, + Alamat: dataPasien.Alamat, + Kota: dataPasien.Tempat, + TanggalLahir: tglLahirString, + NoHP: dataPasien.NoTelpon, + Kelamin: dataPasien.JenisKelamin, + NIK: dataPasien.NoKTP, + NoBPJS: dataPasien.NoKartu, + DokterPeminta: namaDokter, + AsalPasien: poli.NamaPoli, + Layanan: value.NamaPemeriksaan, + StatusBayar: "", + NoTransaksi: dataMikroMain.NoLab, + Asuransi: caraBayar, + Klinis: "", + KodeSpesimen: dataMikroMain.StatusSpesimen, + NamaSpesimen: dataMikroMain.Spesimen, + Pengambilan: "", + } + + resMikro, errMikro := SendLisMikro(dataLisMikro) + if errMikro != nil { + log.Println(errMikro) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errMikro.Error(), + }) + return + } + + log.Println(resMikro) + + reqUpdate := &mikrobiologi.ReqUpdateLisMikro{ + IdxOrderMikro: value.IdxOrderMikro, + NoLokal: resMikro.Message, + } + errUpdate := simrsDB.UpdateLabMikro(reqUpdate) + if errUpdate != nil { + log.Println(errUpdate) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errUpdate, + }) + return + } + + responseMikro = append(responseMikro, &mikrobiologi.ResponseLISMikro{ + NoLab: dataMikroMain.NoLab, + Status: resMikro.Status, + Message: resMikro.Message, + }) + } + } + log.Println("RESPONSE", responseMikro) + c.JSON(http.StatusOK, responseMikro) +} diff --git a/pkg/handlers/mikrobiologi/response.go b/pkg/handlers/mikrobiologi/response.go new file mode 100644 index 0000000..645a1fd --- /dev/null +++ b/pkg/handlers/mikrobiologi/response.go @@ -0,0 +1,83 @@ +package mikrobiologi + +import ( + "api-lis/pkg/models/simrs/mikrobiologi" + "bytes" + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "os" +) + +func SendLisMikro(request *mikrobiologi.RequestLISMikro) (*mikrobiologi.Response, error) { + baseUrl := os.Getenv("LIS_MIKROBIOLOGI_URL") + endpoint := os.Getenv("LIS_REGISTERPASIEN") + url := baseUrl + endpoint + log.Println("URL", url) + + reqMarshall, err := json.Marshal(request) + if err != nil { + log.Printf("Error json marshal: %v", err) + return nil, err + } + headers := map[string]string{ + "Accept": "application/json", + "Content-Type": "application/json", + } + log.Println("REQUEST: ", string(reqMarshall)) + + req, err := http.NewRequest("POST", url, bytes.NewReader(reqMarshall)) + if err != nil { + log.Printf("Error creating request: %v", err) + return nil, err + } + + for key, value := range headers { + req.Header.Set(key, value) + } + + client := http.Client{} + + response, err := client.Do(req) + if err != nil { + log.Printf("Error making external API request: %v", err) + return nil, err + } + + log.Println(response) + + res, err := io.ReadAll(response.Body) + if err != nil { + fmt.Println(err) + } + + if response.StatusCode != 201 { + var responseError *mikrobiologi.ResponseError + err = json.Unmarshal(res, &responseError) + if err != nil { + log.Printf("Error unmarshalling response: %v", err) + return nil, err + } + + log.Println("MASUK SINI?") + log.Println(responseError.Error) + return nil, fmt.Errorf(responseError.Error) + } + + var responses *mikrobiologi.Response + + log.Println("RESPONSE: ", string(res)) + err = json.Unmarshal(res, &responses) + if err != nil { + log.Printf("Error unmarshalling response: %v", err) + return nil, err + } + + return responses, nil +} + +func ResponseBatalMikro(request *mikrobiologi.RequestBatalMikro) { + +} diff --git a/pkg/models/simrs/mikrobiologi/mikrobiologi.go b/pkg/models/simrs/mikrobiologi/mikrobiologi.go new file mode 100644 index 0000000..fad06de --- /dev/null +++ b/pkg/models/simrs/mikrobiologi/mikrobiologi.go @@ -0,0 +1,157 @@ +package mikrobiologi + +type RequestPasienMikrobiologi struct { + NOMR string `json:"nomr"` + IDXDaftar string `json:"idxdaftar"` + NoLab string `json:"nolab"` +} + +type DataPasienMikrobiologi struct { + NOMR string `gorm:"column:nomr" json:"nomr"` + NoNota string `gorm:"column:nonota" json:"nonota"` + IDXDaftar int `gorm:"column:idxdaftar" json:"idxdaftar"` + TanggalOrder string `gorm:"column:tglorder" json:"tglorder"` + NoLab string `gorm:"column:nolab" json:"nolab"` + StatusRajal int `gorm:"column:statusrajal" json:"statusrajal"` + StatusAPS int `gorm:"column:statusaps" json:"statusaps"` + Nama string `gorm:"column:nama" json:"nama"` + NoKTP string `gorm:"column:noktp" json:"noktp"` + NoKTPBaru string `gorm:"column:noktpbaru" json:"noktpbaru"` + TempatLahir string `gorm:"column:tmptlahir" json:"tmptlahir"` + TanggalLahir string `gorm:"column:tgllahir" json:"tgllahir"` + JenisKelamin string `gorm:"column:jeniskelamin" json:"jeniskelamin"` + Alamat string `gorm:"column:alamat" json:"alamat"` + NamaAPS string `gorm:"column:namaaps" json:"namaaps"` + NoKTPAPS string `gorm:"column:noktpaps" json:"noktpaps"` + TempatLahirAPS string `gorm:"column:tmptlahiraps" json:"tmptlahiraps"` + TanggalLahirAPS string `gorm:"column:tgllahiraps" json:"tgllahiraps"` + JenisKelaminAPS string `gorm:"column:jeniskelaminaps" json:"jeniskelaminaps"` + AlamatAPS string `gorm:"column:alamataps" json:"alamataps"` + NamaRuang string `gorm:"column:namaruang" json:"namaruang"` + KelasRuang string `gorm:"column:kelasruang" json:"kelasruang"` + KodeTarifRajal string `gorm:"column:kodetarifrajal" json:"kodetarifrajal"` + KodeTarifRanap string `gorm:"column:kodetarifranap" json:"kodetarifranap"` +} + +type ResponseDataPasienRanap struct { + NOMR string `gorm:"column:nomr" json:"nomr"` + NoNota string `gorm:"column:nonota" json:"nonota"` + IDXDaftar int `gorm:"column:idxdaftar" json:"idxdaftar"` + TanggalOrder string `gorm:"column:tglorder" json:"tglorder"` + NoLab string `gorm:"column:nolab" json:"nolab"` + StatusRajal int `gorm:"column:statusrajal" json:"statusrajal"` + Nama string `gorm:"column:nama" json:"nama"` + NoKTP string `gorm:"column:noktp" json:"noktp"` + TempatLahir string `gorm:"column:tmptlahir" json:"tmptlahir"` + TanggalLahir string `gorm:"column:tgllahir" json:"tgllahir"` + JenisKelamin string `gorm:"column:jeniskelamin" json:"jeniskelamin"` + Alamat string `gorm:"column:alamat" json:"alamat"` + NamaRuang string `gorm:"column:namaruang" json:"namaruang"` + KelasRuang string `gorm:"column:kelasruang" json:"kelasruang"` + KodeTarifRanap string `gorm:"column:kodetarifranap" json:"kodetarifranap"` +} + +type ResponseDataPasienRajal struct { + NOMR string `gorm:"column:nomr" json:"nomr"` + NoNota string `gorm:"column:nonota" json:"nonota"` + IDXDaftar int `gorm:"column:idxdaftar" json:"idxdaftar"` + TanggalOrder string `gorm:"column:tglorder" json:"tglorder"` + NoLab string `gorm:"column:nolab" json:"nolab"` + StatusRajal int `gorm:"column:statusrajal" json:"statusrajal"` + Nama string `gorm:"column:nama" json:"nama"` + NoKTP string `gorm:"column:noktp" json:"noktp"` + TempatLahir string `gorm:"column:tmptlahir" json:"tmptlahir"` + TanggalLahir string `gorm:"column:tgllahir" json:"tgllahir"` + JenisKelamin string `gorm:"column:jeniskelamin" json:"jeniskelamin"` + Alamat string `gorm:"column:alamat" json:"alamat"` + NamaRuang string `gorm:"column:namaruang" json:"namaruang"` + KelasRuang string `gorm:"column:kelasruang" json:"kelasruang"` + KodeTarifRajal string `gorm:"column:kodetarifrajal" json:"kodetarifrajal"` +} + +type ResponseDataPasienRajalAPS struct { + NOMR string `gorm:"column:nomr" json:"nomr"` + NoNota string `gorm:"column:nonota" json:"nonota"` + IdxDaftar int `gorm:"column:idxdaftar" json:"idxdaftar"` + TanggalOrder string `gorm:"column:tglorder" json:"tglorder"` + NoLab string `gorm:"column:nolab" json:"nolab"` + StatusRajal int `gorm:"column:statusrajal" json:"statusrajal"` + StatusAPS int `gorm:"column:statusaps" json:"statusaps"` + NamaAPS string `gorm:"column:namaaps" json:"namaaps"` + NoKTPAPS string `gorm:"column:noktpaps" json:"noktpaps"` + TempatLahirAPS string `gorm:"column:tmptlahiraps" json:"tmptlahiraps"` + TanggalLahirAPS string `gorm:"column:tgllahiraps" json:"tgllahiraps"` + JenisKelaminAPS string `gorm:"column:jeniskelaminaps" json:"jeniskelaminaps"` + AlamatAPS string `gorm:"column:alamataps" json:"alamataps"` + NamaRuang string `gorm:"column:namaruang" json:"namaruang"` + KelasRuang string `gorm:"column:kelasruang" json:"kelasruang"` + KodeTarifRajal string `gorm:"column:kodetarifrajal" json:"kodetarifrajal"` +} + +type RequestLISMikro struct { + NoRM string `json:"norm"` + Nama string `json:"nama"` + Alamat string `json:"alamat"` + Kota string `json:"kota"` + TanggalLahir string `json:"tgllahir"` + NoHP string `json:"nohap"` + Kelamin string `json:"kelamin"` + NIK string `json:"nik"` + NoBPJS string `json:"nobpjs"` + DokterPeminta string `json:"drpeminta"` + AsalPasien string `json:"asalpasien"` + Layanan string `json:"layanan"` + StatusBayar string `json:"statusbayar"` + NoTransaksi string `json:"notransaksi"` + Asuransi string `json:"asuransi"` + Klinis string `json:"klinis"` + KodeSpesimen string `json:"kode"` + NamaSpesimen string `json:"spesimen"` + Pengambilan string `json:"pengambilan"` +} + +type OrderLabMikroMain struct { + IdxMikroMain string `gorm:"column:idxmikromain" json:"idxmikromain"` + NoLab string `gorm:"column:nolab" json:"nolab"` + IdxDaftar string `gorm:"column:idxdaftar" json:"idxdaftar"` + NoMR string `gorm:"column:nomr" json:"nomr"` + WaktuPengambilan string `gorm:"column:waktu_pengambilan" json:"waktu_pengambilan"` + TglOrder string `gorm:"column:tglorder" json:"tglorder"` + StatusSpesimen string `gorm:"column:status_specimen" json:"status_specimen"` + Spesimen string `gorm:"column:specimen" json:"specimen"` + DokterPengirim string `gorm:"column:drpengirim" json:"drpengirim"` + KodePoli string `gorm:"column:kdpoli" json:"kdpoli"` + NoNota string `gorm:"column:nonota" json:"nonota"` + StatusRajal string `gorm:"column:st_rajal" json:"st_rajal"` + StatusAPS string `gorm:"column:st_aps" json:"st_aps"` +} + +type OrderLabMikro struct { + IdxOrderMikro string `gorm:"column:idxordermikro" json:"idxordermikro"` + NamaPemeriksaan string `gorm:"column:nama_pemeriksaan" json:"nama_pemeriksaan"` +} + +type Response struct { + Status string `json:"status"` + Message string `json:"message"` +} + +type ResponseError struct { + Error string `json:"error"` +} + +type ResponseLISMikro struct { + NoLab string `json:"nolab"` + Status string `json:"status"` + Message string `json:"message"` +} + +type ReqUpdateLisMikro struct { + IdxOrderMikro string `gorm:"column:idxordermikro" json:"idxordermikro"` + NoLokal string `gorm:"column:no_lokal" json:"no_lokal"` +} + +type RequestBatalMikro struct { + NoLokal string `json:"no_lokal"` + Alasan string `json:"alasan"` +} diff --git a/pkg/models/simrs/pasien/pasien.go b/pkg/models/simrs/pasien/pasien.go new file mode 100644 index 0000000..3ffc59a --- /dev/null +++ b/pkg/models/simrs/pasien/pasien.go @@ -0,0 +1,14 @@ +package pasien + +type MPasien struct { + ID int `gorm:"column:id" json:"id"` + NoMR string `gorm:"column:no_mr" json:"no_mr"` + Nama string `gorm:"column:nama" json:"nama"` + Tempat string `gorm:"column:tempat" json:"tempat"` + TanggalLahir string `gorm:"column:tgllahir" json:"tgllahir"` + JenisKelamin string `gorm:"column:jeniskelamin" json:"jeniskelamin"` + Alamat string `gorm:"column:alamat" json:"alamat"` + NoKTP string `gorm:"column:noktp" json:"noktp"` + NoTelpon string `gorm:"column:notelp" json:"notelp"` + NoKartu string `gorm:"column:no_kartu" json:"no_kartu"` +} diff --git a/pkg/models/simrs/ruang/ruang.go b/pkg/models/simrs/ruang/ruang.go new file mode 100644 index 0000000..a8a26ae --- /dev/null +++ b/pkg/models/simrs/ruang/ruang.go @@ -0,0 +1,6 @@ +package ruang + +type MRuang struct { + NamaPoli string `gorm:"column:nama" json:"nama"` + Subsistem string `gorm:"column:subsistem" json:"subsistem"` +}