diff --git a/.env.example b/.env.example index c3264b5..d59fe22 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ APP_HOST=0.0.0.0 -APP_PORT=8080 +APP_PORT=8282 # Kode instance rumah sakit. Dipakai hanya untuk validasi X-RS-Code. CPONE_RS_CODE=AWALBROS_DEV diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3536131 --- /dev/null +++ b/Makefile @@ -0,0 +1,78 @@ +SHELL := /usr/bin/env bash + +APP_NAME ?= cpone-middleware +GOOS ?= linux +GOARCH ?= amd64 +CGO_ENABLED ?= 0 +BUILD_BINARY ?= dist/$(APP_NAME)-$(GOOS)-$(GOARCH) + +REMOTE_DIR ?= auto +REMOTE_BINARY ?= +SERVICE ?= $(APP_NAME).service +SERVICE_SCOPE ?= auto +RESTART_MODE ?= systemd-kill +SSH_OPTIONS ?= -o ConnectTimeout=10 -o ServerAliveInterval=5 -o ServerAliveCountMax=2 +SSH_TIMEOUT ?= 45s +TRANSFER_TIMEOUT ?= 120s + +# Supports both `make deploy one@host` and the explicit form +# `make deploy DEPLOY_TARGET=one@host`. +KNOWN_GOALS := help test vet build check-deploy-target deploy +POSITIONAL_TARGET := $(firstword $(filter-out $(KNOWN_GOALS),$(MAKECMDGOALS))) +DEPLOY_TARGET ?= $(POSITIONAL_TARGET) + +.DEFAULT_GOAL := help +.PHONY: help test vet build check-deploy-target deploy + +help: + @printf '%s\n' \ + 'Usage:' \ + ' make deploy one@devcpone.aplikasi.web.id' \ + ' make deploy DEPLOY_TARGET=one@devcpone.aplikasi.web.id' \ + '' \ + 'Optional overrides:' \ + ' REMOTE_DIR=auto (default: $${HOME}/apps di server)' \ + ' SERVICE=cpone-middleware.service' \ + ' SERVICE_SCOPE=auto|user|system' \ + ' RESTART_MODE=systemd-kill|systemctl' \ + ' SSH_OPTIONS="-p 22 -o ConnectTimeout=10"' \ + ' SSH_TIMEOUT=45s TRANSFER_TIMEOUT=120s' + +test: + go test ./... + +vet: + go vet ./... + +build: test vet + @mkdir -p "$$(dirname "$(BUILD_BINARY)")" + CGO_ENABLED=$(CGO_ENABLED) GOOS=$(GOOS) GOARCH=$(GOARCH) \ + go build -trimpath -ldflags='-s -w' -o "$(BUILD_BINARY)" ./cmd/server + @printf 'Built %s\n' "$(BUILD_BINARY)" + +check-deploy-target: + @if [[ -z "$(DEPLOY_TARGET)" ]]; then \ + echo 'Error: target server belum diisi.' >&2; \ + echo 'Contoh: make deploy one@devcpone.aplikasi.web.id' >&2; \ + exit 2; \ + fi + +deploy: check-deploy-target build + @APP_NAME="$(APP_NAME)" \ + BUILD_BINARY="$(BUILD_BINARY)" \ + REMOTE_DIR="$(REMOTE_DIR)" \ + REMOTE_BINARY="$(REMOTE_BINARY)" \ + SERVICE="$(SERVICE)" \ + SERVICE_SCOPE="$(SERVICE_SCOPE)" \ + RESTART_MODE="$(RESTART_MODE)" \ + SSH_OPTIONS="$(SSH_OPTIONS)" \ + SSH_TIMEOUT="$(SSH_TIMEOUT)" \ + TRANSFER_TIMEOUT="$(TRANSFER_TIMEOUT)" \ + ./scripts/deploy.sh "$(DEPLOY_TARGET)" + +# Extra command-line words are treated as the positional deploy target. +ifneq ($(strip $(POSITIONAL_TARGET)),) +.PHONY: $(POSITIONAL_TARGET) +$(POSITIONAL_TARGET): + @: +endif diff --git a/README.md b/README.md index 0d59cd9..287cad9 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,47 @@ # CPONE Middleware Go +## Deploy ke server + +Tool deploy melakukan test, vet, build binary `linux/amd64`, upload melalui +`scp`, mengganti binary secara atomik, membuat backup binary sebelumnya, lalu +me-restart service melalui systemd. + +Untuk server development yang sudah dikonfigurasi: + +```bash +make deploy one@devcpone.aplikasi.web.id +``` + +Bentuk eksplisit yang setara: + +```bash +make deploy DEPLOY_TARGET=one@devcpone.aplikasi.web.id +``` + +Default deploy menggunakan: + +- direktori aplikasi: diambil dari `WorkingDirectory` service (otomatis), atau + `$HOME/apps` bila service tidak mendefinisikannya +- binary: `/cpone-middleware` +- service: `cpone-middleware.service` +- service manager: otomatis mendeteksi systemd user (`systemctl --user`) atau + systemd system (`systemctl`) +- restart: menghentikan `MainPID`, lalu systemd `Restart=always` menyalakan + binary baru +- SSH memiliki timeout koneksi dan keepalive agar deploy tidak menggantung + +Jika server memakai izin systemd untuk `restart`, gunakan: + +```bash +make deploy one@host.example SERVICE=cpone-middleware.service RESTART_MODE=systemctl +``` + +Untuk direktori khusus, gunakan `REMOTE_DIR=/path/apps`. Untuk target lama +`one@devcpone.aplikasi.web.id`, hasil default tetap `/home/one/apps`. + +Target server harus sudah dapat diakses dengan SSH key/agent; tool tidak +menyimpan atau mengirim `.env` lokal. + Service Go untuk endpoint: ```text @@ -53,6 +95,10 @@ dipaginasi 20 data per halaman. GET /api/cpone/layanan-mapping-harga?periodeTarifID=10&layananID=6413,6414,1309 Authorization: Bearer +GET /api/cpone/reports/mcu?tanggal=2026-09-01&tanggal2=2026-09-07 +Authorization: Bearer +X-RS-Code: + POST /api/cpone/patients/lab-registration Authorization: Bearer Content-Type: application/json @@ -72,6 +118,18 @@ Content-Type: application/json Format payload dan response dibuat mengikuti controller PHP CPONE terkait. +Endpoint laporan MCU mengembalikan JSON dengan envelope standar `success`, +`message`, dan `data`. Setiap item `data` mempertahankan kolom yang ditulis oleh +`docs/lap_mcu.php`, termasuk nilai fallback seperti `Tidak Ada`, `Normal`, dan +`UMUM`. Alias kompatibel yang tersedia adalah `/api/cpone/laporan/mcu` dan +`/api/cpone/laporan-mcu` serta `/api/cpone/lap-mcu`. + +Query laporan membutuhkan privilege `SELECT` pada tabel MCU legacy: +`pengkajianmcu`, `tandavital_pasien`, `regpas_detail`, `gayahidup`, +`riwayatpenyakitdahulu`, `riwayatpenyakitkeluarga`, `riwayatalergi`, seluruh +tabel `pemeriksaanfisik_*` yang dipakai laporan, `pemeriksaankhusus`, dan +`penyakitakibatkerja`. + Contoh payload pembuatan paket beserta layanan: ```json diff --git a/cmd/server/main.go b/cmd/server/main.go index 6f4fb0d..5e3427e 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -62,6 +62,12 @@ func main() { mux.Handle("POST /api/cpone/patients/lab-registration/{regId}/services", protected(http.HandlerFunc(handler.AddLabServices))) mux.Handle("POST /api/cpone/patients/lab-registration/{regId}/packages", protected(http.HandlerFunc(handler.AddLabPackage))) mux.Handle("GET /api/cpone/patients/lab-results/{labNumber}", protected(http.HandlerFunc(handler.GetLabResult))) + // MCU report parity with docs/lap_mcu.php. The additional aliases keep the + // report reachable for clients that use the Indonesian legacy route name. + mux.Handle("GET /api/cpone/reports/mcu", protected(http.HandlerFunc(handler.ListLaporanMCU))) + mux.Handle("GET /api/cpone/laporan/mcu", protected(http.HandlerFunc(handler.ListLaporanMCU))) + mux.Handle("GET /api/cpone/laporan-mcu", protected(http.HandlerFunc(handler.ListLaporanMCU))) + mux.Handle("GET /api/cpone/lap-mcu", protected(http.HandlerFunc(handler.ListLaporanMCU))) mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) diff --git a/docs/akses-tabel-cpone-middleware.docx b/docs/akses-tabel-cpone-middleware.docx new file mode 100644 index 0000000..c3b7279 Binary files /dev/null and b/docs/akses-tabel-cpone-middleware.docx differ diff --git a/docs/akses-tabel-cpone-middleware.html b/docs/akses-tabel-cpone-middleware.html new file mode 100644 index 0000000..cb5be94 --- /dev/null +++ b/docs/akses-tabel-cpone-middleware.html @@ -0,0 +1,133 @@ + + + + +Daftar Akses Tabel CPONE Middleware + + + +
CPONE Middleware • Database Access Reference
+

Daftar Akses Tabel

+
Kebutuhan privilege database untuk service CPONE Middleware
+ + + + + + +
Database targetDatabase HIS yang dikonfigurasi pada CPONE_DB_DATABASE
Database userUser yang dikonfigurasi pada CPONE_DB_USERNAME
Dasar pemetaanQuery SQL pada folder internal/repository
Tanggal17 September 2026
+ +
Ringkasan: service membutuhkan akses SELECT pada tabel master dan tabel transaksi yang dibaca. Akses write diperlukan hanya pada tabel yang dipakai endpoint POST untuk membuat paket, pasien, registrasi, layanan laboratorium, nominal, dan diagnosis.
+ +

1. Tabel dengan READ dan WRITE

+

Tabel berikut membutuhkan akses SELECT dan operasi write seperti tercantum.

+ + + + + + + + + + + + + + + + + + + + +
Nama tabelREADWRITEKegunaan utama
medrecSELECTINSERTPencarian dan pembuatan data pasien/medical record.
regpasSELECTINSERTPembuatan dan pengecekan registrasi pasien.
regpas_nominalSELECTINSERT, UPDATENominal administrasi pada level registrasi pasien.
trxdepartemenSELECTINSERTPembuatan transaksi departemen.
trxdepartemen_nominalSELECTINSERT, UPDATERekap nominal layanan/item/tempat tidur dan total transaksi.
trxidlaboratoriumSELECTINSERTPembuatan nomor/transaksi laboratorium.
trxlayananSELECTINSERTPenambahan layanan pada transaksi.
trxlayanan_detailSELECTINSERTRelasi detail layanan dengan paket dispenser.
trxlayanan_penunjangSELECTINSERTRelasi layanan penunjang/header laboratorium.
lab_trxspesimenSELECTINSERTPencatatan spesimen laboratorium.
paket_headerSELECTINSERT, UPDATE, DELETEPembuatan paket; DELETE hanya untuk cleanup saat transaksi gagal.
paket_layananSELECTINSERT, DELETEDetail layanan paket; DELETE hanya untuk cleanup.
paket_departemenSELECTINSERT, DELETEDepartemen yang terkait dengan paket; DELETE hanya untuk cleanup.
paket_dispenser_headerSELECTINSERTHeader paket dispenser pada kunjungan pasien.
paket_dispenser_episode_rjSELECTINSERTEpisode kunjungan rawat jalan paket dispenser.
paket_dispenser_layananSELECTINSERTLayanan yang dihasilkan dari paket dispenser.
paket_dispenser_itemSELECTINSERTItem paket dispenser.
paket_dispenser_admSELECTINSERTAdministrasi paket dispenser.
+ +

2. Tabel dengan WRITE saja

+ + + + +
Nama tabelOperasi
diagnosa_logINSERT — menyimpan log diagnosis kerja pada registrasi laboratorium.
regpas_diagnosaINSERT — menyimpan diagnosis kerja yang terkait dengan pasien/registrasi.
+

Kedua tabel di atas tidak dibaca kembali oleh service dalam query saat ini, tetapi harus dapat menerima INSERT ketika endpoint registrasi laboratorium menyimpan diagnosis.

+ +

3. Tabel dengan READ saja

+

Tabel master dan referensi berikut hanya dibaca oleh service, sehingga cukup diberikan privilege SELECT.

+ + + + + + + + + +
KelompokNama tabel
Tarif dan layananadm_periode, harga_layanan_diskon, layanandepartemen, masterlayanan, jenislayanan, periode_tarif, perusahaan_grouptarif, perusahaan_tarif, perusahaan
Master rumah sakitdepartemen, dokter, rs, kelas, satuan, satuanlab, shiftharian
Master paketpaket_adm, paket_item, paket_operasi_header, paket_tt, paket_dispenser_operasi_header
Master operasi dan referensigolonganoperasi, jenisanestesi, kasusoperasi, mastertindakan, konversisatuan, margin_alkes, margin_obat, sys_setting
Master laboratoriumgrouplayanan, lab_jenisspesimen, lab_masterlayanan, lab_multiple, lab_reference, lab_spesimentest, lab_trxlayanan_setup, trxlayananlaboratorium, trxlayanan_proses
Master pasien/registrasijenispaket, jenispasien, jenisreg
Metadata MySQLinformation_schema.tables, information_schema.columns
+ +

4. Tabel dinamis

+ + + + +
Pola nama tabelKebutuhan akses
harga_layanan_{PeriodeTarifID}SELECT. Contoh: harga_layanan_10. Dipakai untuk membaca tarif layanan berdasarkan periode tarif.
perusahaan_tarif_layanan_{GroupTarifID}SELECT. Dipakai untuk membaca detail tarif kerja sama berdasarkan group tarif.
+ +

5. Rekomendasi grant

+

Untuk koneksi service, berikan privilege secara eksplisit pada database HIS. Gunakan nama database dan host user sesuai lingkungan server.

+
-- Ganti nama_database_his, cpone, dan host_user sesuai environment.
+GRANT SELECT ON `nama_database_his`.`adm_periode` TO 'cpone'@'host_user';
+
+-- Contoh tabel yang membutuhkan write:
+GRANT SELECT, INSERT ON `nama_database_his`.`medrec` TO 'cpone'@'host_user';
+GRANT SELECT, INSERT ON `nama_database_his`.`regpas` TO 'cpone'@'host_user';
+GRANT SELECT, INSERT, UPDATE ON `nama_database_his`.`regpas_nominal` TO 'cpone'@'host_user';
+GRANT SELECT, INSERT, UPDATE ON `nama_database_his`.`trxdepartemen_nominal` TO 'cpone'@'host_user';
+GRANT SELECT, INSERT, UPDATE, DELETE ON `nama_database_his`.`paket_header` TO 'cpone'@'host_user';
+
+-- Ulangi pola di atas untuk seluruh tabel pada daftar dokumen ini.
+-- Tabel dinamis memerlukan SELECT pada setiap tabel yang benar-benar digunakan.
+ +

6. Catatan penting

+
    +
  • Service hanya membuka koneksi ke database HIS melalui konfigurasi CPONE_DB_*.
  • +
  • Privilege DELETE pada paket_header, paket_layanan, dan paket_departemen diperlukan untuk cleanup jika proses pembuatan paket gagal sebagian.
  • +
  • regpas_nominal dibuat saat registrasi laboratorium untuk inisialisasi nominal administrasi dengan nilai awal nol dan metode Otomatis.
  • +
  • Tabel hospitals dan hospital_databases pada migration cpone_middleware belum digunakan oleh runtime Go service saat ini.
  • +
  • Daftar ini dipetakan dari kode aplikasi; validasi final tetap perlu disesuaikan dengan struktur tabel dan policy keamanan database HIS.
  • +
+ + + + diff --git a/docs/build_akses_docx.py b/docs/build_akses_docx.py new file mode 100644 index 0000000..b822b9d --- /dev/null +++ b/docs/build_akses_docx.py @@ -0,0 +1,209 @@ +from zipfile import ZipFile, ZIP_DEFLATED +from xml.sax.saxutils import escape +from pathlib import Path + +OUT = Path(__file__).with_name("akses-tabel-cpone-middleware.docx") + +W = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" +R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships" +CT = "http://schemas.openxmlformats.org/package/2006/content-types" +PR = "http://schemas.openxmlformats.org/package/2006/relationships" + +def qn(tag): + prefix, local = tag.split(":", 1) + return f"{{{ {'w': W, 'r': R, 'ct': CT, 'pr': PR}[prefix] }}}{local}" + +def attr(name, value): + return f' {name}="{escape(str(value))}"' + +def run(text, bold=False, color=None, size=21, font="Calibri", italic=False): + rpr = [f'', f'', f''] + if bold: + rpr.append('') + if italic: + rpr.append('') + if color: + rpr.append(f'') + return f'{"".join(rpr)}{escape(text)}' + +def paragraph(text="", style="Normal", before=0, after=120, color=None, bold=False, size=21, align=None, keep=False, page_break=False): + ppr = [f'', f''] + if align: + ppr.append(f'') + if keep: + ppr.append('') + if page_break: + ppr.append('') + body = run(text, bold=bold, color=color, size=size) if text else '' + return f'{"".join(ppr)}{body}' + +def code_paragraph(text, before=80, after=160): + ppr = [ + '', + f'', + ] + content = [] + for index, line in enumerate(text.splitlines()): + if index: + content.append('') + content.append(run(line, size=16, font="Consolas")) + return f'{"".join(ppr)}{"".join(content)}' + +def rich_paragraph(parts, style="Normal", before=0, after=120, align=None): + ppr = [f'', f''] + if align: + ppr.append(f'') + content = ''.join(run(text, bold=bold, color=color, size=size) for text, bold, color, size in parts) + return f'{"".join(ppr)}{content}' + +def cell(text, width, header=False, align="left"): + fill = 'E8EEF5' if header else 'FFFFFF' + color = '0B2545' if header else '1F2937' + size = 18 if header else 18 + tcpr = f'' + ppr = f'' + text_xml = run(text, bold=header, color=color, size=size, font="Consolas" if (not header and ("_" in text or "{" in text or "}" in text)) else "Calibri") + return f'{tcpr}{ppr}{text_xml}' + +def table(headers, rows, widths, aligns=None): + aligns = aligns or ["left"] * len(widths) + grid = ''.join(f'' for w in widths) + borders = '' + borders = borders.replace("AEB DCD", "AEBDCD") + cellmar = '' + tblpr = f'{borders}{cellmar}' + head = '' + ''.join(cell(h, w, True, aligns[i]) for i, (h, w) in enumerate(zip(headers, widths))) + '' + body = ''.join('' + ''.join(cell(str(value), w, False, aligns[i]) for i, (value, w) in enumerate(zip(row, widths))) + '' for row in rows) + return f'{tblpr}{grid}{head}{body}' + +def bullet(text): + return '' + run(text, size=20) + '' + +body = [] +body.append(paragraph("CPONE MIDDLEWARE • DATABASE ACCESS REFERENCE", color="2E74B5", bold=True, size=16, after=100)) +body.append(paragraph("Daftar Akses Tabel", style="DocTitle", size=48, color="0B2545", after=80)) +body.append(paragraph("Kebutuhan privilege database untuk service CPONE Middleware", color="475569", size=24, after=220)) +body.append(table(["Informasi", "Nilai"], [ + ("Database target", "Database HIS pada CPONE_DB_DATABASE"), + ("Database user", "User pada CPONE_DB_USERNAME"), + ("Dasar pemetaan", "Query SQL pada folder internal/repository"), + ("Tanggal", "17 September 2026"), +], [1900, 7460], ["left", "left"])) +body.append(rich_paragraph([("Ringkasan: ", True, "0B2545", 20), ("service membutuhkan SELECT pada tabel master dan tabel transaksi yang dibaca. Akses write hanya diperlukan pada tabel yang digunakan endpoint POST untuk membuat paket, pasien, registrasi, layanan laboratorium, nominal, dan diagnosis.", False, "1F2937", 20)], after=180)) + +body.append(paragraph("1. Tabel dengan READ dan WRITE", style="Heading1", before=260, after=100, keep=True)) +body.append(paragraph("Tabel berikut membutuhkan SELECT dan operasi write seperti tercantum.", after=100)) +body.append(table(["Nama tabel", "READ", "WRITE", "Kegunaan utama"], [ + ("medrec", "SELECT", "INSERT", "Pencarian dan pembuatan data pasien/medical record."), + ("regpas", "SELECT", "INSERT", "Pembuatan dan pengecekan registrasi pasien."), + ("regpas_nominal", "SELECT", "INSERT, UPDATE", "Nominal administrasi pada level registrasi pasien."), + ("trxdepartemen", "SELECT", "INSERT", "Pembuatan transaksi departemen."), + ("trxdepartemen_nominal", "SELECT", "INSERT, UPDATE", "Rekap nominal layanan/item/tempat tidur dan total transaksi."), + ("trxidlaboratorium", "SELECT", "INSERT", "Pembuatan nomor/transaksi laboratorium."), + ("trxlayanan", "SELECT", "INSERT", "Penambahan layanan pada transaksi."), + ("trxlayanan_detail", "SELECT", "INSERT", "Relasi detail layanan dengan paket dispenser."), + ("trxlayanan_penunjang", "SELECT", "INSERT", "Relasi layanan penunjang/header laboratorium."), + ("lab_trxspesimen", "SELECT", "INSERT", "Pencatatan spesimen laboratorium."), + ("paket_header", "SELECT", "INSERT, UPDATE, DELETE", "Pembuatan paket; DELETE hanya untuk cleanup saat transaksi gagal."), + ("paket_layanan", "SELECT", "INSERT, DELETE", "Detail layanan paket; DELETE hanya untuk cleanup."), + ("paket_departemen", "SELECT", "INSERT, DELETE", "Departemen terkait paket; DELETE hanya untuk cleanup."), + ("paket_dispenser_header", "SELECT", "INSERT", "Header paket dispenser pada kunjungan pasien."), + ("paket_dispenser_episode_rj", "SELECT", "INSERT", "Episode kunjungan rawat jalan paket dispenser."), + ("paket_dispenser_layanan", "SELECT", "INSERT", "Layanan yang dihasilkan dari paket dispenser."), + ("paket_dispenser_item", "SELECT", "INSERT", "Item paket dispenser."), + ("paket_dispenser_adm", "SELECT", "INSERT", "Administrasi paket dispenser."), +], [2600, 1000, 1600, 4160], ["left", "center", "center", "left"])) + +body.append(paragraph("2. Tabel dengan WRITE saja", style="Heading1", before=260, after=100, keep=True)) +body.append(table(["Nama tabel", "Operasi dan kegunaan"], [ + ("diagnosa_log", "INSERT — log diagnosis kerja pada registrasi laboratorium."), + ("regpas_diagnosa", "INSERT — diagnosis kerja yang terkait dengan pasien/registrasi."), +], [2600, 6760], ["left", "left"])) +body.append(paragraph("Kedua tabel ini tidak dibaca kembali oleh service dalam query saat ini, tetapi harus dapat menerima INSERT ketika endpoint registrasi laboratorium menyimpan diagnosis.", color="475569", size=18, after=100)) + +body.append(paragraph("3. Tabel dengan READ saja", style="Heading1", before=260, after=100, keep=True)) +body.append(paragraph("Tabel master dan referensi berikut hanya dibaca oleh service, sehingga cukup diberikan privilege SELECT.", after=100)) +body.append(table(["Kelompok", "Nama tabel"], [ + ("Tarif dan layanan", "adm_periode, harga_layanan_diskon, layanandepartemen, masterlayanan, jenislayanan, periode_tarif, perusahaan_grouptarif, perusahaan_tarif, perusahaan"), + ("Master rumah sakit", "departemen, dokter, rs, kelas, satuan, satuanlab, shiftharian"), + ("Master paket", "paket_adm, paket_item, paket_operasi_header, paket_tt, paket_dispenser_operasi_header"), + ("Master operasi dan referensi", "golonganoperasi, jenisanestesi, kasusoperasi, mastertindakan, konversisatuan, margin_alkes, margin_obat, sys_setting"), + ("Master laboratorium", "grouplayanan, lab_jenisspesimen, lab_masterlayanan, lab_multiple, lab_reference, lab_spesimentest, lab_trxlayanan_setup, trxlayananlaboratorium, trxlayanan_proses"), + ("Master pasien/registrasi", "jenispaket, jenispasien, jenisreg"), + ("Metadata MySQL", "information_schema.tables, information_schema.columns"), +], [2500, 6860], ["left", "left"])) + +body.append(paragraph("4. Tabel dinamis", style="Heading1", before=260, after=100, keep=True)) +body.append(table(["Pola nama tabel", "Kebutuhan akses"], [ + ("harga_layanan_{PeriodeTarifID}", "SELECT. Contoh: harga_layanan_10. Dipakai untuk membaca tarif layanan berdasarkan periode tarif."), + ("perusahaan_tarif_layanan_{GroupTarifID}", "SELECT. Dipakai untuk membaca detail tarif kerja sama berdasarkan group tarif."), +], [3000, 6360], ["left", "left"])) + +body.append(paragraph("5. Rekomendasi grant", style="Heading1", before=260, after=100, keep=True)) +body.append(paragraph("Berikan privilege secara eksplisit pada database HIS. Ganti nama database, user, dan host sesuai environment server.", after=100)) +grant_text = """-- Ganti nama_database_his, cpone, dan host_user sesuai environment. +GRANT SELECT ON `nama_database_his`.`adm_periode` TO 'cpone'@'host_user'; + +-- Contoh tabel yang membutuhkan write: +GRANT SELECT, INSERT ON `nama_database_his`.`medrec` TO 'cpone'@'host_user'; +GRANT SELECT, INSERT ON `nama_database_his`.`regpas` TO 'cpone'@'host_user'; +GRANT SELECT, INSERT, UPDATE ON `nama_database_his`.`regpas_nominal` TO 'cpone'@'host_user'; +GRANT SELECT, INSERT, UPDATE ON `nama_database_his`.`trxdepartemen_nominal` TO 'cpone'@'host_user'; +GRANT SELECT, INSERT, UPDATE, DELETE ON `nama_database_his`.`paket_header` TO 'cpone'@'host_user'; + +-- Ulangi pola di atas untuk seluruh tabel pada daftar ini. +-- Tabel dinamis memerlukan SELECT pada setiap tabel yang benar-benar digunakan.""" +body.append(code_paragraph(grant_text)) + +body.append(paragraph("6. Catatan penting", style="Heading1", before=260, after=100, keep=True)) +for item in [ + "Service hanya membuka koneksi ke database HIS melalui konfigurasi CPONE_DB_*.", + "Privilege DELETE pada paket_header, paket_layanan, dan paket_departemen diperlukan untuk cleanup jika proses pembuatan paket gagal sebagian.", + "regpas_nominal dibuat saat registrasi laboratorium untuk inisialisasi nominal administrasi dengan nilai awal nol dan metode Otomatis.", + "Tabel hospitals dan hospital_databases pada migration cpone_middleware belum digunakan oleh runtime Go service saat ini.", + "Daftar ini dipetakan dari kode aplikasi; validasi final tetap perlu disesuaikan dengan struktur tabel dan policy keamanan database HIS.", +]: + body.append(bullet(item)) + +body.append(paragraph("Dokumen internal • Sumber pemetaan: repository CPONE Middleware • Versi berdasarkan kode yang tersedia pada 17 September 2026", color="64748B", size=16, before=240, after=0)) + +document = f''' +{''.join(body)}''' + +styles = f''' + + + + + + + +''' + +numbering = f''' +''' + +document_rels = f''' +''' + +footer = f'''{run("CPONE Middleware • ", color="64748B", size=16)}1''' +header = f'''{run("CPONE Middleware | Daftar Akses Tabel", color="64748B", size=16)}''' + +content_types = f'''''' +root_rels = f'''''' +core = f'''Daftar Akses Tabel CPONE MiddlewareCPONE MiddlewareDatabase access reference''' +app = f'''CPONE Middleware''' + +with ZipFile(OUT, "w", ZIP_DEFLATED) as z: + z.writestr("[Content_Types].xml", content_types) + z.writestr("_rels/.rels", root_rels) + z.writestr("word/document.xml", document) + z.writestr("word/styles.xml", styles) + z.writestr("word/numbering.xml", numbering) + z.writestr("word/header1.xml", header) + z.writestr("word/footer1.xml", footer) + z.writestr("word/_rels/document.xml.rels", document_rels) + z.writestr("docProps/core.xml", core) + z.writestr("docProps/app.xml", app) + +print(OUT) diff --git a/docs/lap_mcu.php b/docs/lap_mcu.php new file mode 100644 index 0000000..18fc780 --- /dev/null +++ b/docs/lap_mcu.php @@ -0,0 +1,1417 @@ +addWorksheet('Perbandingan'); + + $title =& $b->addFormat(array('size' => 15, 'Align' => 'center', 'Bold' => 1)); + $header =& $b->addFormat(array('size' => 12, 'Align' => 'center', 'Bold' => 1, 'Border' => 1)); + $header_gl =& $b->addFormat(array('size' => 10, 'Align' => 'left', 'Bold' => 1, 'Border' => 1)); + $header_gr =& $b->addFormat(array('size' => 10, 'Align' => 'right', 'Bold' => 1, 'Border' => 1)); + $isi_l =& $b->addFormat(array('size' => 8, 'Align' => 'left')); + $isi_r =& $b->addFormat(array('size' => 8, 'Align' => 'right')); + $isi_c =& $b->addFormat(array('size' => 8, 'Align' => 'center')); + $footer_l =& $b->addFormat(array('size' => 12, 'Align' => 'left', 'Bold' => 1, 'Border' => 1)); + $footer_r =& $b->addFormat(array('size' => 12, 'Align' => 'right', 'Bold' => 1, 'Border' => 1)); + + //~~~~~ sheet rekap + $sh->setMerge(0, 0, 0, 18); + $sh->setMerge(1, 0, 1, 18); + $sh->setMerge(2, 0, 2, 18); + $sh->write(0, 0, strtoupper($_RS_Nama), $title); + $sh->write(1, 0, "Laporan MCU", $title); + $sh->write(2, 0, "Periode Tarik Data: $tanggal hingga: $tanggal2 " , $title); + + // Set lebar kolom + $sh->setColumn(0, 0, 5); + $sh->setColumn(1, 1, 15); + $sh->setColumn(2, 2, 20); + $sh->setColumn(3, 3, 15); + $sh->setColumn(4, 4, 12); + $sh->setColumn(5, 5, 12); + $sh->setColumn(6, 6, 12); + $sh->setColumn(7, 7, 20); + $sh->setColumn(8, 8, 20); + $sh->setColumn(9, 9, 20); + + $n=4; +$sh->write($n, 0, 'No', $header); + $sh->write($n, 1, 'RegID', $header); + $sh->write($n, 2, 'MEDRECID', $header); + $sh->write($n, 3, 'Nama Pasien', $header); + $sh->write($n, 4, 'Jenis Kelamin', $header); + $sh->write($n, 5, 'Tanggal Lahir', $header); + $sh->write($n, 6, 'Umur', $header); + $sh->write($n, 7, 'Tanggal MCU', $header); + //$sh->write($n, 8, 'Nama Paket', $header); //hapus + $sh->write($n, 8, 'Nama Penanggung', $header); + $sh->write($n, 9, 'Dokter MCU', $header); + $sh->write($n, 10, 'Instansi Kerja', $header); + $sh->write($n, 11, 'Tinggi Badan', $header); + $sh->write($n, 12, 'Berat Badan', $header); + $sh->write($n, 13, 'Tekanan Darah', $header); + $sh->write($n, 14, 'Nadi', $header); + $sh->write($n, 15, 'Suhu', $header); + $sh->write($n, 16, 'Pernafasan', $header); + $sh->write($n, 17, 'Diabetes', $header); + $sh->write($n, 18, 'Hipertensi', $header); + $sh->write($n, 19, 'Dyslipidemia ', $header); + $sh->write($n, 20, 'Jantung', $header); + $sh->write($n, 21, 'Stroke', $header); + $sh->write($n, 22, 'Asma', $header); + $sh->write($n, 23, 'Paru', $header); + $sh->write($n, 24, 'Riwayat Cidera', $header); + $sh->write($n, 25, 'Riwayat Rawat Inap', $header); + $sh->write($n, 26, 'Riwayat Operasi', $header); + $sh->write($n, 27, 'Lain - Lain', $header); + $sh->write($n, 28, 'Diabetes Keluarga', $header); + $sh->write($n, 29, 'Hipertensi Keluarga', $header); + $sh->write($n, 30, 'Dyslipidemia Keluarga', $header); + $sh->write($n, 31, 'Jantung Keluarga', $header); + $sh->write($n, 32, 'Stroke Keluarga', $header); + $sh->write($n, 33, 'Asma Keluarga', $header); + $sh->write($n, 34, 'Paru Keluarga', $header); + $sh->write($n, 35, 'Riwayat Cidera Keluarga', $header); + $sh->write($n, 36, 'Riwayat Rawat Inap Keluarga', $header); + $sh->write($n, 37, 'Riwayat Operasi Keluarga', $header); + $sh->write($n, 38, 'Lain - Lain Keluarga', $header); + $sh->write($n, 39, 'Alergi Obat', $header); + $sh->write($n, 40, 'Alergi Makanan', $header); + $sh->write($n, 41, 'Alergi Lain', $header); + $sh->write($n, 42, 'Merokok', $header); + $sh->write($n, 43, 'Alkohol', $header); + $sh->write($n, 44, 'Olahraga', $header); + $sh->write($n, 45, 'Keadaan Umum', $header); + $sh->write($n, 46, 'Keadaan Sakit', $header); + $sh->write($n, 47, 'StatusGizi', $header); + $sh->write($n, 48, 'Kesadaran', $header); + //$sh->write($n, 50, 'Habitus', $header);//hapus + //$sh->write($n, 51, 'Bentuk Kepala Kelainan', $header); + //$sh->write($n, 52, 'Kelainan Kepala Lain', $header); + //$sh->write($n, 53, 'Sianosis', $header); + //$sh->write($n, 54, 'Efloresensi', $header); + //$sh->write($n, 55, 'Turgor', $header); + //$sh->write($n, 56, 'Keringat', $header); + //$sh->write($n, 57, 'Allergis', $header); + //$sh->write($n, 58, 'Panu', $header); +// $sh->write($n, 59, 'Exemalodes', $header); + //$sh->write($n, 59, 'Kulit Lain', $header); + //$sh->write($n, 60, 'Pterigium', $header); + //$sh->write($n, 61, 'Exopthalmus', $header); + //$sh->write($n, 62, 'Conjunctivitis', $header); + //$sh->write($n, 63, 'Cataract', $header); + //$sh->write($n, 64, 'Strabismus', $header); + //$sh->write($n, 65, 'Nebula Macula', $header); + //$sh->write($n, 66, 'Icterus', $header); + //$sh->write($n, 67, 'Arcus Senilis', $header); + $sh->write($n, 49, 'Colour Blindness', $header); + //$sh->write($n, 69, 'Anemie', $header); + //$sh->write($n, 70, 'Pupil', $header); + //$sh->write($n, 71, 'Visus Jauh', $header); + //$sh->write($n, 72, 'Depth Perception', $header); + $sh->write($n, 50, 'Visus Dekat', $header); + //$sh->write($n, 74, 'Lapang Pandang Horizontal', $header); + $sh->write($n, 51, 'Kelainanan Mata Lain', $header); + //$sh->write($n, 76, 'Cerumen', $header); + //$sh->write($n, 77, 'Otitis', $header); + //$sh->write($n, 78, 'Membrane Tympani', $header); + //$sh->write($n, 80, 'Membrane Tympani Kelainan', $header); + //$sh->write($n, 79, 'Mastoid Region', $header); + //$sh->write($n, 80, 'Telinga Lain Lain', $header); + //$sh->write($n, 81, 'Septum', $header); + //$sh->write($n, 82, 'Selaput Lendir Kelainan', $header); + //$sh->write($n, 83, 'Pendarahan', $header); + //$sh->write($n, 84, 'Polip', $header); + //$sh->write($n, 85, 'Peradangan', $header); + //$sh->write($n, 86, 'Hidung Lain Lain', $header); + $sh->write($n, 52, 'Faring', $header); + $sh->write($n, 53, 'Tonsil', $header); + //$sh->write($n, 89, 'Lidah Kelainan', $header); + //$sh->write($n, 90, 'Bibir Kelainan', $header); + //$sh->write($n, 91, 'Gusi Kelainan', $header); + $sh->write($n, 54, 'Mulut Lain Lain', $header); + $sh->write($n, 55, 'Kelainan Gigi', $header); + //$sh->write($n, 94, 'Fetor ExOre', $header); + //$sh->write($n, 95, 'Karang Gigi', $header); + //$sh->write($n, 96, 'Prothesa', $header); + //$sh->write($n, 97, 'Kelenjar Limphe', $header); + //$sh->write($n, 98, 'Desakan Vena', $header); + //$sh->write($n, 99, 'Pembuluh darah', $header); + //$sh->write($n, 100, 'Kelenjar Gondok', $header); + //$sh->write($n, 101, 'Trachea', $header); + //$sh->write($n, 102, 'Kaku Kuduk', $header); + //$sh->write($n, 103, 'Bentuk Dada', $header); + //$sh->write($n, 104, 'Ictus Cordis', $header); + //$sh->write($n, 105, 'Sternum Kelainan', $header); + //$sh->write($n, 106, 'Sesak Napas', $header); + //$sh->write($n, 107, 'Mammae', $header); + //$sh->write($n, 108, 'Dada Lain', $header); + //$sh->write($n, 109, 'Suara Perkusi', $header); + //$sh->write($n, 110, 'Ronchi', $header); + //$sh->write($n, 111, 'Wheezing', $header); + //$sh->write($n, 112, 'Krepitasi', $header); + //$sh->write($n, 113, 'Suara Bronchial', $header); + //$sh->write($n, 114, 'Pleura Friction Rub', $header); + $sh->write($n, 56, 'Paru Lain', $header); + //$sh->write($n, 116, 'Voussure Cardiac', $header); + //$sh->write($n, 117, 'Thrill', $header); + //$sh->write($n, 118, 'Pembesaran', $header); + //$sh->write($n, 119, 'Bunyi Jantung', $header); + //$sh->write($n, 120, 'Gallop', $header); + //$sh->write($n, 121, 'Irama Jantung', $header); + $sh->write($n, 57, 'Jantung Lain', $header); + //$sh->write($n, 123, 'Bentuk Abdomen', $header); + //$sh->write($n, 124, 'Hati Membesar', $header); + //$sh->write($n, 125, 'Limpa Membesar', $header); + //$sh->write($n, 126, 'Asites', $header); + //$sh->write($n, 127, 'Peristaltik', $header); + $sh->write($n, 58, 'Hernia', $header); + //$sh->write($n, 129, 'Defans Muscular', $header); + //$sh->write($n, 130, 'Nyeri Tekan', $header); + //$sh->write($n, 131, 'Tumor', $header); + //$sh->write($n, 132, 'Abdomen Lain', $header); + //$sh->write($n, 133, 'Pergerakan Kelainan', $header); + //$sh->write($n, 134, 'Jari Tangan', $header); + //$sh->write($n, 135, 'Edema', $header); + //$sh->write($n, 136, 'Refleks Kelainan', $header); + //$sh->write($n, 137, 'Tremor', $header); + //$sh->write($n, 138, 'Bengkak Sendi', $header); + //$sh->write($n, 139, 'Simetrisitas', $header); + //$sh->write($n, 140, 'Kekuatan', $header); + //$sh->write($n, 141, 'Cicatrix', $header); + //$sh->write($n, 142, 'Deformitas', $header); + //$sh->write($n, 143, 'Amputasi', $header); + //$sh->write($n, 144, 'Varices', $header); + //$sh->write($n, 145, 'Tapak Ceper', $header); + //$sh->write($n, 146, 'Anggota Tubuh Lain', $header); + $sh->write($n, 59, 'Keluhan Utama', $header); + $sh->write($n, 60, 'Penyakit Sekarang', $header); + $sh->write($n, 61, 'Penyakit Dahulu', $header); + //$sh->write($n, 150, 'Pemeriksaan Fisik', $header);//hapus + //$sh->write($n, 151, 'Pemeriksaan Penunjang Laboratorium', $header); + //$sh->write($n, 152, 'Pemeriksaan Penunjang Radiologi', $header); + $sh->write($n, 62, 'E.C.G', $header); + //$sh->write($n, 154, 'Optic Service', $header); + $sh->write($n, 63, 'Audiometri', $header); + $sh->write($n, 64, 'Spirometri', $header); + $sh->write($n, 65, 'Pemeriksaan lain-lain', $header); + //$sh->write($n, 158, 'Kesimpulan', $header); + //$sh->write($n, 159, 'Pengobatan Yang Diberikan', $header); + //$sh->write($n, 160, 'Saran-Saran & Motivasi', $header); + $sh->write($n, 66, 'Saran Kesehatan Kerja', $header); + //tambahan penyakit akibar kerja + $sh->write($n, 67, 'Kebisingan akibat kerja', $header); + $sh->write($n, 68, 'SuhuPanas akibat kerja', $header); + $sh->write($n, 69, 'SuhuDingin akibat kerja', $header); + $sh->write($n, 70, 'RadiasiBukanPengion akibat kerja', $header); + $sh->write($n, 71, 'RadiasiPengion akibat kerja', $header); + $sh->write($n, 72, 'GetaranLokal akibat kerja', $header); + $sh->write($n, 73, 'GetaranSeluruhTubun akibat kerja', $header); + $sh->write($n, 74, 'Ketinggian akibat kerja', $header); + + $sh->write($n, 75, 'Lainlain akibat kerja', $header); + $sh->write($n, 76, 'DebuOrganik akibat kerja', $header); + $sh->write($n, 77, 'DebuAnorganik akibat kerja', $header); + $sh->write($n, 78, 'Asap akibat kerja', $header); + //bahan kimia + $sh->write($n, 79, 'LogamBerat akibat kerja', $header); + $sh->write($n, 80, 'PelarutOrganik akibat kerja', $header); + $sh->write($n, 81, 'IritanAsam akibat kerja', $header); + $sh->write($n, 82, 'IritanBasa akibat kerja', $header); + $sh->write($n, 83, 'CairanPembersih akibat kerja', $header); + $sh->write($n, 84, 'Pestisida akibat kerja', $header); + $sh->write($n, 85, 'UapLogam akibat kerja', $header); + $sh->write($n, 86, 'BahamKimiaLain akibat kerja', $header); + //Biologi + $sh->write($n, 87, 'Bakteri akibat kerja', $header); + $sh->write($n, 88, 'CairanTubuh akibat kerja', $header); + $sh->write($n, 89, 'Serangga akibat kerja', $header); + $sh->write($n, 90, 'Limbah akibat kerja', $header); + $sh->write($n, 91, 'BiologiLain akibat kerja', $header); + //Psikologis + $sh->write($n, 92, 'Overload akibat kerja', $header); + $sh->write($n, 93, 'Mismatch akibat kerja', $header); + $sh->write($n, 94, 'KetidakJelasan akibat kerja', $header); + $sh->write($n, 95, 'HambatanJenjangKarir akibat kerja', $header); + $sh->write($n, 96, 'KerjaShift akibat kerja', $header); + $sh->write($n, 97, 'KonflikTeman akibat kerja', $header); + $sh->write($n, 98, 'KonflikKeluarga akibat kerja', $header); + $sh->write($n, 99, 'PsikologisLain akibat kerja', $header); + //Ergonomis + $sh->write($n, 100, 'TanganBergerakUlang akibat kerja', $header); + $sh->write($n, 101, 'AngkatBerat akibat kerja', $header); + $sh->write($n, 102, 'DudukLama akibat kerja', $header); + $sh->write($n, 103, 'BerdiriLama akibat kerja', $header); + $sh->write($n, 104, 'PosisiTubuhTidakErgonomis akibat kerja', $header); + $sh->write($n, 105, 'PencahayaanTidakSesuai akibat kerja', $header); + $sh->write($n, 106, 'LihatMonitorLama akibat kerja', $header); + $sh->write($n, 107, 'ErgonomisLain akibat kerja', $header); + $sh->write($n, 108, 'VisusJauhTanpaKoreksiVOD', $header); + $sh->write($n, 109, 'VisusJauhTanpaKoreksiVOS', $header); + $sh->write($n, 110, 'VisusJauhDenganKoreksiVOD', $header); + $sh->write($n, 112, 'VisusJauhDenganKoreksiVOS', $header); + $sh->write($n, 113, 'Pekerjaan', $header); + $sh->write($n, 114, 'DokterPemeriksa', $header); + + + $tanggal=$_GET['tanggal']; + $tanggal2=$_GET['tanggal2']; + + $no=0; + + $s = "SELECT RegID from regpas where Tanggal between '$tanggal 00:00:01' and '$tanggal2 23:59:59' and JenisRegID = '2' and NA='N'"; + + $db->query($s); + $rows = $db->resultset(); + foreach ($rows as $row){ + $n++;$no++; + $RegID = $row['RegID']; + $db->query("SELECT r.RegID, r.Nama as NamaPasien, r.MEDRECID, r.Tanggal as TanggalDaftar, r.PaketLayananID, r.DokterID, pm.DepartemenKerja, pm.KesimpulanRingkasan, + pm.SaranMotivasiRingkasan, pm.SaranKesehatanKerjaRingkasan, pm.KeluhanAnamnesis, r.AsuransiID, pm.RiwayatPenyakitSekarangAnamnesis, pm.KeluhanUtamaRingkasan, pm.PenyakitSekarangRingkasan, pm.PenyakitDahuluRingkasan, pm.PemeriksaanFisikRingkasan, pm.PemeriksaanLainLainRingkasan, pm.KesimpulanRingkasan, pm.PengobatanDiberiRingkasan, pm.SaranMotivasiRingkasan, pm.DokterIDPengkaji + from regpas r + LEFT JOIN pengkajianmcu pm on r.RegID=pm.RegID + where r.RegID = '$RegID' limit 1"); + $DJ1x = $db->single(); + $RegID = $DJ1x['RegID']; + $NamaPasiennya = $DJ1x['NamaPasien']; + $MEDRECID = $DJ1x['MEDRECID']; + $TanggalDaftar = $DJ1x['TanggalDaftar']; + $PaketLayananIDnya = $DJ1x['PaketLayananID']; + $DokterIDnya = $DJ1x['DokterID']; + $DepartemenKerjanya = $DJ1x['DepartemenKerja']; + $KesimpulanRingkasannya = $DJ1x['KesimpulanRingkasan']; + $SaranMotivasiRingkasannya = $DJ1x['SaranMotivasiRingkasan']; + $SaranKesehatanKerjaRingkasannya = $DJ1x['SaranKesehatanKerjaRingkasan']; + $KeluhanAnamnesisnya = $DJ1x['KeluhanAnamnesis']; + $AsuransiIDnya = $DJ1x['AsuransiID']; + $RiwayatPenyakitSekarangAnamnesisNya = $DJ1x['RiwayatPenyakitSekarangAnamnesis']; + $KeluhanUtamaRingkasanNya = $DJ1x['KeluhanUtamaRingkasan']; + $PenyakitSekarangRingkasanNya = $DJ1x['PenyakitSekarangRingkasan']; + $PenyakitDahuluRingkasanNya = $DJ1x['PenyakitDahuluRingkasan']; + $PemeriksaanFisikRingkasanNya = $DJ1x['PemeriksaanFisikRingkasan']; + $PemeriksaanLainLainRingkasanNya = $DJ1x['PemeriksaanLainLainRingkasan']; + $KesimpulanRingkasanNya = $DJ1x['KesimpulanRingkasan']; + $PengobatanDiberiRingkasanNya = $DJ1x['PengobatanDiberiRingkasan']; + $SaranMotivasiRingkasanNya = $DJ1x['SaranMotivasiRingkasan']; + $DokterIDPengkaji = $DJ1x['DokterIDPengkaji']; + + + + //querry lihat medrec + $db->query("select Kelamin, TanggalLahir, TIMESTAMPDIFF(YEAR, TanggalLahir, CURDATE()) AS umur, Pekerjaan from medrec where MEDRECID = '$MEDRECID'"); + $DJ2x = $db->single(); + $kelaminnya = $DJ2x['Kelamin']; + $TanggalLahirnya = $DJ2x['TanggalLahir']; + $Umurnya = $DJ2x['umur']; + $Pekerjaan = $DJ2x['Pekerjaan']; + + if($DJ2x['Kelamin']=='L'){ + $kelamin='Laki - Laki'; + }else{ $kelamin= 'Perempuan';} + + + //query lihat Dokternya----------------------------------------------------- + $db->query("select Nama from dokter where DokterID = '$DokterIDnya' limit 1 "); + $DJ3x = $db->single(); + $NamaDokterNya = $DJ3x['Nama']; + + //query lihat Asuransi----------------------------------------------------- + $db->query("select Nama from perusahaan where PerusahaanID = '$AsuransiIDnya' limit 1 "); + $DJ0x = $db->single(); + $NamaperusahaanNya = $DJ0x['Nama']; + + if($DJ0x['Nama']==''){ + $perusahaan='UMUM'; + }else{ $perusahaan= $DJ0x['Nama'];} + + //query ambil PaketID + $db->query("select PaketID from paket_dispenser_header where RegID = '$RegID' limit 1 "); + $DJ88x = $db->single(); + $PaketID = $D88x['PaketID']; + + //query lihat Nama Paket------------------------------------------------------ + $db->query("select Nama from paket_header where PaketID = '$PaketID' limit 1 "); + $DJ4x = $db->single(); + $NamaPaketNya = $DJ4x['Nama']; + + //query lihat Nama Paket lama------------------------------------------------------ + //$db->query("select Nama from paket where PaketID = '$PaketLayananIDnya' limit 1 "); + //$DJ4x = $db->single(); + //$NamaPaketNya = $DJ4x['Nama']; + + //query lihat Tanda Vital Pasien----------------------------------------------- + $db->query("select Tekanandarah, Nadi, Pernafasan, Suhu from tandavital_pasien where RegID = '$RegID' and Tekanandarah not like '' limit 1 "); + $DJ5x = $db->single(); + $TekanandarahNya = $DJ5x['Tekanandarah']; + $NadiNya = $DJ5x['Nadi']; + $PernafasanNya = $DJ5x['Pernafasan']; + $SuhuNya = $DJ5x['Suhu']; + + //query lihat Detail Berat dan Tinggi-------------------------------------- + $db->query("select TinggiBadan, BeratBadan from regpas_detail where RegID = '$RegID' limit 1 "); + $DJ6x = $db->single(); + $TinggiBadanNya = $DJ6x['TinggiBadan']; + $BeratBadanNya = $DJ6x['BeratBadan']; + + + //query lihat Gaya Hidup------------------------------------------------ + $db->query("select SejakKapanMerokok, SejakKapanAlkohol, KebiasaanOlahragaAda from gayahidup where RegID = '$RegID' limit 1 "); + $DJ7x = $db->single(); + $SejakKapanMerokokNya = $DJ7x['SejakKapanMerokok']; + $SejakKapanAlkoholNya = $DJ7x['SejakKapanAlkohol']; + $KebiasaanOlahragaAdaNya = $DJ7x['KebiasaanOlahragaAda']; + + if($DJ7x['SejakKapanMerokok']==''){ + $merokok='Tidak Merokok'; + }else{ $merokok= $DJ7x['SejakKapanMerokok'];} + + if($DJ7x['SejakKapanAlkohol']==''){ + $alkohol='Tidak Minum ALkohol'; + }else{ $alkohol= $DJ7x['SejakKapanAlkohol'];} + + if($DJ7x['KebiasaanOlahragaAda']==''){ + $olahraga='Tidak Olahraga'; + }else{ $olahraga=$DJ7x['KebiasaanOlahragaAda'];} + + //query lihat Riwayat penyakit Dahulu-------------------------------------------- + $db->query("select DiabetesDahuluAda,HipertensiDahuluAda, KelebihanLemakDahuluAda, JantungDahuluAda, + StrokeDahuluAda, AsmaDahuluAda, ParuDahuluAda, CideraDahuluAda, RawatInapDahuluAda, OperasiDahuluAda, LainLainDahuluAda from riwayatpenyakitdahulu where RegID = '$RegID' limit 1 "); + $DJ8x = $db->single(); + $DiabetesDahuluAdaNya = $DJ8x['DiabetesDahuluAda']; + $HipertensiDahuluAdaNya = $DJ8x['HipertensiDahuluAda']; + $KelebihanLemakDahuluAdaNya = $DJ8x['KelebihanLemakDahuluAda']; + $JantungDahuluAdaNya = $DJ8x['JantungDahuluAda']; + $StrokeDahuluAdaNya = $DJ8x['StrokeDahuluAda']; + $AsmaDahuluAdaNya = $DJ8x['AsmaDahuluAda']; + $ParuDahuluAdaNya = $DJ8x['ParuDahuluAda']; + $CideraDahuluAdaNya = $DJ8x['CideraDahuluAda']; + $RawatInapDahuluAdaNya = $DJ8x['RawatInapDahuluAda']; + $OperasiDahuluAdaNya = $DJ8x['OperasiDahuluAda']; + $LainLainDahuluAdaNya = $DJ8x['LainLainDahuluAda']; + + if($DJ8x['DiabetesDahuluAda']==''){ + $diabetes='Tidak Ada'; + }else{ $diabetes= $DJ8x['DiabetesDahuluAda'];} + + if($DJ8x['HipertensiDahuluAda']==''){ + $hipertensi='Tidak Ada'; + }else{ $hipertensi= $DJ8x['HipertensiDahuluAda'];} + + if($DJ8x['KelebihanLemakDahuluAda']==''){ + $lemak='Tidak Ada'; + }else{ $lemak= $DJ8x['KelebihanLemakDahuluAda'];} + + if($DJ8x['JantungDahuluAda']==''){ + $jantung='Tidak Ada'; + }else{ $jantung= $DJ8x['JantungDahuluAda'];} + + if($DJ8x['StrokeDahuluAda']==''){ + $stroke='Tidak Ada'; + }else{ $stroke= $DJ8x['StrokeDahuluAda'];} + + if($DJ8x['AsmaDahuluAda']==''){ + $asma='Tidak Ada'; + }else{ $asma= $DJ8x['AsmaDahuluAda'];} + + if($DJ8x['ParuDahuluAda']==''){ + $paru='Tidak Ada'; + }else{ $paru= $DJ8x['ParuDahuluAda'];} + + if($DJ8x['CideraDahuluAda']==''){ + $cidera='Tidak Ada'; + }else{ $cidera= $DJ8x['CideraDahuluAda'];} + + if($DJ8x['RawatInapDahuluAda']==''){ + $rawatinap='Tidak Ada'; + }else{ $rawatinap= $DJ8x['RawatInapDahuluAda'];} + + if($DJ8x['OperasiDahuluAda']==''){ + $operasi='Tidak Ada'; + }else{ $operasi= $DJ8x['OperasiDahuluAda'];} + + if($DJ8x['LainLainDahuluAda']==''){ + $lain2='Tidak Ada'; + }else{ $lain2= $DJ8x['LainLainDahuluAda'];} + + +//query lihat Riwayat penyakit Keluarga-------------------------------------------- + $db->query("select DiabetesAda, HypertensiAda, KelebihanLemakAda , JantungAda, StrokeAda, AsmaAda, ParuAda , CideraAda ,RawatInapAda , OperasiAda ,LainLainAda from riwayatpenyakitkeluarga where RegID = '$RegID' limit 1 "); + $DJ9x = $db->single(); + $DiabetesAdaNya = $DJ9x['DiabetesAda']; + $HypertensiAdaNya = $DJ9x['HypertensiAda']; + $KelebihanLemakAdaNya = $DJ9x['KelebihanLemakAda']; + $JantungAdaNya = $DJ9x['JantungAda']; + $StrokeAdaNya = $DJ9x['StrokeAda']; + $AsmaAdaNya = $DJ9x['AsmaAda']; + $ParuAdaNya = $DJ9x['ParuAda']; + $CideraAdaNya = $DJ9x['CideraAda']; + $RawatInapAdaNya = $DJ9x['RawatInapAda']; + $OperasiAdaNya = $DJ9x['OperasiAda']; + $LainLainAdaNya = $DJ9x['LainLainAda']; + + if($DJ9x['DiabetesAda']==''){ + $diabetes1='Tidak Ada'; + }else{ $diabetes1= $DJ9x['DiabetesAda'];} + + if($DJ9x['HipertensiAda']==''){ + $hipertensi1='Tidak Ada'; + }else{ $hipertensi1= $DJ9x['HipertensiAda'];} + + if($DJ9x['KelebihanLemakAda']==''){ + $lemak1='Tidak Ada'; + }else{ $lemak1= $DJ9x['KelebihanLemakAda'];} + + if($DJ9x['JantungAda']==''){ + $jantung1='Tidak Ada'; + }else{ $jantung1= $DJ9x['JantungAda'];} + + if($DJ9x['StrokeAda']==''){ + $stroke1='Tidak Ada'; + }else{ $stroke1= $DJ9x['StrokeAda'];} + + if($DJ9x['AsmaAda']==''){ + $asma1='Tidak Ada'; + }else{ $asma1= $DJ9x['AsmaAda'];} + + if($DJ9x['ParuAda']==''){ + $paru1='Tidak Ada'; + }else{ $paru1= $DJ9x['ParuAda'];} + + if($DJ9x['CideraAda']==''){ + $cidera1='Tidak Ada'; + }else{ $cidera1= $DJ9x['CideraAda'];} + + if($DJ9x['RawatInapAda']==''){ + $rawatinap1='Tidak Ada'; + }else{ $rawatinap1= $DJ9x['RawatInapAda'];} + + if($DJ9x['OperasiAda']==''){ + $operasi1='Tidak Ada'; + }else{ $operasi1= $DJ9x['OperasiAda'];} + + if($DJ9x['LainLainAda']==''){ + $lain21='Tidak Ada'; + }else{ $lain21= $DJ9x['LainLainAda'];} + + + +//query lihat Riwayat Alergi----------------------------------------------- + $db->query("select AlergiObatAda , AlergiMakananAda, AlergiLainAda from riwayatalergi where MEDRECID = '$MEDRECID' limit 1 "); + $DJ10x = $db->single(); + $AlergiObatAdaNya = $DJ10x['AlergiObatAda']; + $AlergiMakananAdaNya = $DJ10x['AlergiMakananAda']; + $AlergiLainAdaNya = $DJ10x['AlergiLainAda']; + + + if($DJ10x['AlergiObatAda']==''){ + $alergiobat='Tidak Ada'; + }else{ $alergiobat= $DJ10x['AlergiObatAda'];} + + if($DJ10x['AlergiMakananAda']==''){ + $alergimakanan='Tidak Ada'; + }else{ $alergimakanan= $DJ10x['AlergiMakananAda'];} + + if($DJ10x['AlergiLainAda']==''){ + $alergilain='Tidak Ada'; + }else{ $alergilain= $DJ10x['AlergiLainAda'];} + + +//query lihat Fisik Umum----------------------------------------------- + $db->query("select KeadaanUmum, KeadaanSakit, Kesadaran, StatusGizi, Habitus from pemeriksaanfisik_umum where RegID = '$RegID' limit 1 "); + $DJ11x = $db->single(); + $KeadaanUmumNya = $DJ11x['KeadaanUmum']; + $KeadaanSakitNya = $DJ11x['KeadaanSakit']; + $KesadaranNya = $DJ11x['Kesadaran']; + $StatusGiziNya = $DJ11x['StatusGizi']; + $HabitusNya = $DJ11x['Habitus']; + + +//query lihat Fisik Kepala----------------------------------------------- + $db->query("select BentukKepalaKelainan , KepalaLainLainAda from pemeriksaanfisik_kepala where RegID = '$RegID' limit 1 "); + $DJ12x = $db->single(); + $BentukKepalaKelainanNya = $DJ12x['BentukKepalaKelainan']; + $KepalaLainLainAdaNya = $DJ12x['KepalaLainLainAda']; + + + if($DJ12x['BentukKepalaKelainan']==''){ + $kepala='Normal'; + }else{ $kepala= $DJ12x['BentukKepalaKelainan'];} + + if($DJ12x['KepalaLainLainAda']==''){ + $kepalalain='Tidak Ada'; + }else{ $kepalalain= $DJ12x['KepalaLainLainAda'];} + + +//query lihat Fisik Kulit----------------------------------------------- + $db->query("select SianosisAda, EfloresensiAda , Turgor, Keringat, AllergisAda, + PanuAda, ExemalodesAda , KulitLainLainAda from pemeriksaanfisik_kulit where RegID = '$RegID' limit 1 "); + $DJ13x = $db->single(); + $SianosisAdaNya = $DJ13x['SianosisAda']; + $EfloresensiAdaNya = $DJ13x['EfloresensiAda']; + $TurgorNya = $DJ13x['Turgor']; + $KeringatNya = $DJ13x['Keringat']; + $AllergisAdaNya = $DJ13x['AllergisAda']; + $PanuAdaNya = $DJ13x['PanuAda']; + $ExemalodesAdaNya = $DJ13x['ExemalodesAda']; + $KulitLainLainAdaNya = $DJ13x['KulitLainLainAda']; + + if($DJ13x['SianosisAda']==''){ + $sianosis='Tidak Ada'; + }else{ $sianosis= $DJ13x['SianosisAda'];} + + if($DJ13x['EfloresensiAda']==''){ + $efloresensi='Tidak Ada'; + }else{ $efloresensi= $DJ13x['EfloresensiAda'];} + + if($DJ13x['AllergisAda']==''){ + $allergis='Tidak Ada'; + }else{ $allergis= $DJ13x['AllergisAda'];} + + if($DJ13x['PanuAda']==''){ + $panu='Tidak Ada'; + }else{ $panu= $DJ13x['PanuAda'];} + + if($DJ13x['ExemalodesAda']==''){ + $exemalodes='Tidak Ada'; + }else{ $exemalodes= $DJ13x['ExemalodesAda'];} + + if($DJ13x['KulitLainLainAda']==''){ + $kulitlain='Tidak Ada'; + }else{ $kulitlain= $DJ13x['KulitLainLainAda'];} + + +//query lihat Fisik Mata-------------------------------------------- + //$db->query("select Pterigium, Exopthalmus, Conjunctivitis , Cataract, Strabismus, NebulaMacula, Icterus , ArcusSenilis ,ColourBlindness , Anemie ,Pupil, VisusJauh, DepthPerception, VisusDekatKelainan, LapangPandangHorizontal, MataLainLainAda from pemeriksaanfisik_mata where RegID = '$RegID' limit 1 "); +$db->query("select Pterigium, Exopthalmus, Conjunctivitis , Cataract, Strabismus, NebulaMacula, Icterus , ArcusSenilis ,ColourBlindness , Anemie ,Pupil, VisusJauh, DepthPerception, VisusDekatKelainan, LapangPandangHorizontal, MataLainLainAda, VisusJauhTanpaKoreksiVOD, VisusJauhTanpaKoreksiVOS, +VisusJauhDenganKoreksiVOD, VisusJauhDenganKoreksiVOS from pemeriksaanfisik_mata where RegID = '$RegID' limit 1 "); + + $DJ14x = $db->single(); + $PterigiumNya = $DJ14x['Pterigium']; + $ExopthalmusNya = $DJ14x['Exopthalmus']; + $ConjunctivitisNya = $DJ14x['Conjunctivitis']; + $CataractNya = $DJ14x['Cataract']; + $StrabismusNya = $DJ14x['Strabismus']; + $NebulaMaculaNya = $DJ14x['NebulaMacula']; + $IcterusNya = $DJ14x['Icterus']; + $ArcusSenilisNya = $DJ14x['ArcusSenilis']; + $ColourBlindnessNya = $DJ14x['ColourBlindness']; + $AnemieNya = $DJ14x['Anemie']; + $PupilNya = $DJ14x['Pupil']; + $VisusJauhNya = $DJ14x['VisusJauh']; + $DepthPerceptionNya = $DJ14x['DepthPerception']; + $VisusDekatKelainanNya = $DJ14x['VisusDekatKelainan']; + $LapangPandangHorizontalNya = $DJ14x['LapangPandangHorizontal']; + $MataLainLainAdaNya = $DJ14x['MataLainLainAda']; + $VisusJauhTanpaKoreksiVOD = $DJ14x['VisusJauhTanpaKoreksiVOD']; + $VisusJauhTanpaKoreksiVOS = $DJ14x['VisusJauhTanpaKoreksiVOS']; + $VisusJauhDenganKoreksiVOD = $DJ14x['VisusJauhDenganKoreksiVOD']; + $VisusJauhDenganKoreksiVOS = $DJ14x['VisusJauhDenganKoreksiVOS']; + + + if($DJ14x['VisusJauh']==''){ + $visusjauh='Normal'; + }else{ $visusjauh= $DJ14x['VisusJauh'];} + + if($DJ14x['VisusDekatKelainan']==''){ + $visusdekat='Normal'; + }else{ $visusdekat= $DJ14x['VisusDekatKelainan'];} + + if($DJ14x['MataLainLainAda']==''){ + $matalain='Tidak Ada'; + }else{ $matalain= $DJ14x['MataLainLainAda'];} + +//query lihat Fisik Telinga----------------------------------------------- + $db->query("select Cerumen, Otitis, MembraneTympani, MembraneTympaniKelainan, MastoidRegion, TelingaLainLainAda from pemeriksaanfisik_telinga where RegID = '$RegID' limit 1 "); + $DJ14x = $db->single(); + $CerumenNya = $DJ14x['Cerumen']; + $OtitisNya = $DJ14x['Otitis']; + $MembraneTympaniNya = $DJ14x['MembraneTympani']; + $MembraneTympaniKelainanNya = $DJ14x['MembraneTympaniKelainan']; + $MastoidRegionNya = $DJ14x['MastoidRegion']; + $TelingaLainLainAdaNya = $DJ14x['TelingaLainLainAda']; + + if($DJ14x['TelingaLainLainAda']==''){ + $telingalain='Tidak Ada'; + }else{ $telingalain= $DJ14x['TelingaLainLainAda'];} + + + +//query lihat Fisik Hidung----------------------------------------------- + $db->query("select Septum , SelaputLendirKelainan, Pendarahan, Polip, Peradangan, HidungLainLainAda from pemeriksaanfisik_hidung where RegID = '$RegID' limit 1 "); + $DJ15x = $db->single(); + $SeptumNya = $DJ15x['Septum']; + $SelaputLendirKelainanNya = $DJ15x['SelaputLendirKelainan']; + $PendarahanNya = $DJ15x['Pendarahan']; + $PolipNya = $DJ15x['Polip']; + $PeradanganNya = $DJ15x['Peradangan']; + $HidungLainLainAdaNya = $DJ15x['HidungLainLainAda']; + + if($DJ15x['SelaputLendirKelainan']==''){ + $selaput='Normal'; + }else{ $selaput= $DJ15x['SelaputLendirKelainan'];} + + if($DJ15x['HidungLainLainAda']==''){ + $hidunglain='Tidak Ada'; + }else{ $hidunglain= $DJ15x['HidungLainLainAda'];} + + +//query lihat Fisik Tenggorokan----------------------------------------------- + $db->query("select FaringKelainan , TonsilKelainan from pemeriksaanfisik_tenggorokan where RegID = '$RegID' limit 1 "); + $DJ26x = $db->single(); + $FaringKelainanNya = $DJ26x['FaringKelainan']; + $TonsilKelainanNya = $DJ26x['TonsilKelainan']; + + + if($DJ26x['FaringKelainan']==''){ + $faring='Normal'; + }else{ $faring= $DJ26x['FaringKelainan'];} + + if($DJ26x['TonsilKelainan']==''){ + $tonsil='Tidak Ada'; + }else{ $tonsil= $DJ26x['TonsilKelainan'];} + +//query lihat Fisik Mulut----------------------------------------------- + $db->query("select LidahKelainan, BibirKelainan, GusiKelainan, MulutLainLainAda from pemeriksaanfisik_mulut where RegID = '$RegID' limit 1 "); + $DJ16x = $db->single(); + $LidahKelainanNya = $DJ16x['LidahKelainan']; + $BibirKelainanNya = $DJ16x['BibirKelainan']; + $GusiKelainanNya = $DJ16x['GusiKelainan']; + $MulutLainLainAdaNya = $DJ16x['MulutLainLainAda']; + + if($DJ16x['LidahKelainan']==''){ + $lidah='Normal'; + }else{ $lidah= $DJ16x['LidahKelainan'];} + + if($DJ16x['BibirKelainan']==''){ + $bibir='Normal'; + }else{ $bibir= $DJ16x['BibirKelainan'];} + + if($DJ16x['GusiKelainan']==''){ + $gusi='Normal'; + }else{ $gusi= $DJ16x['GusiKelainan'];} + + if($DJ16x['MulutLainLainAda']==''){ + $mulut='Tidak Ada'; + }else{ $mulut= $DJ16x['MulutLainLainAda'];} + + +//query lihat Fisik Gigi----------------------------------------------- + $db->query("select KelainanGigiAda , FetorExOreAda, KarangGigiAda, ProthesaAda from pemeriksaanfisik_gigi where RegID = '$RegID' limit 1 "); + $DJ17x = $db->single(); + $KelainanGigiAdaNya = $DJ17x['KelainanGigiAda']; + $FetorExOreAdaNya = $DJ17x['FetorExOreAda']; + $KarangGigiAdaNya = $DJ17x['KarangGigiAda']; + $ProthesaAdaNya = $DJ17x['ProthesaAda']; + + if($DJ17x['KelainanGigiAda']==''){ + $gigi='Tidak Ada'; + }else{ $gigi= $DJ17x['KelainanGigiAda'];} + + if($DJ17x['FetorExOreAda']==''){ + $fetorexore='Tidak Ada'; + }else{ $fetorexore= $DJ17x['FetorExOreAda'];} + + if($DJ17x['KarangGigiAda']==''){ + $karanggigi='Tidak Ada'; + }else{ $karanggigi= $DJ17x['KarangGigiAda'];} + + if($DJ17x['ProthesaAda']==''){ + $prothesa='Tidak Ada'; + }else{ $prothesa= $DJ17x['ProthesaAda'];} + + +//query lihat Fisik Leher----------------------------------------------- + $db->query("select KelenjarLimpheTeraba, DesakanVenaMeninggi, PembuluhdarahMelebar, KelenjarGondokMelebar, Trachea, KakuKudukTeraba from pemeriksaanfisik_leher where RegID = '$RegID' limit 1 "); + $DJ18x = $db->single(); + $KelenjarLimpheTerabaNya = $DJ18x['KelenjarLimpheTeraba']; + $DesakanVenaMeninggiNya = $DJ18x['DesakanVenaMeninggi']; + $PembuluhdarahMelebarNya = $DJ18x['PembuluhdarahMelebar']; + $KelenjarGondokMelebarNya = $DJ18x['KelenjarGondokMelebar']; + $TracheaNya = $DJ18x['Trachea']; + $KakuKudukTerabaNya = $DJ18x['KakuKudukTeraba']; + + if($DJ18x['KelenjarLimpheTeraba']==''){ + $limphe='Tidak Teraba'; + }else{ $limphe= $DJ18x['KelenjarLimpheTeraba'];} + + if($DJ18x['DesakanVenaMeninggi']==''){ + $vena='Normal'; + }else{ $vena= $DJ18x['DesakanVenaMeninggi'];} + + if($DJ18x['PembuluhdarahMelebar']==''){ + $darah='Normal'; + }else{ $darah= $DJ18x['PembuluhdarahMelebar'];} + + if($DJ18x['KelenjarGondokMelebar']==''){ + $gondok='Normal'; + }else{ $gondok= $DJ18x['KelenjarGondokMelebar'];} + + if($DJ18x['KakuKudukTeraba']==''){ + $kuduk='Tidak Teraba'; + }else{ $kuduk= $DJ18x['KakuKudukTeraba'];} + +//query lihat Fisik Dada----------------------------------------------- + $db->query("select BentukDadaAsimetris, IctusCordisAda, SternumKelainan, SesakNapasAda, Mammae, DadaLainLainAda from pemeriksaanfisik_dada where RegID = '$RegID' limit 1 "); + $DJ19x = $db->single(); + $BentukDadaAsimetrisNya = $DJ19x['BentukDadaAsimetris']; + $IctusCordisAdaNya = $DJ19x['IctusCordisAda']; + $SternumKelainanNya = $DJ19x['SternumKelainan']; + $SesakNapasAdaNya = $DJ19x['SesakNapasAda']; + $MammaeNya = $DJ19x['Mammae']; + $DadaLainLainAdaNya = $DJ19x['DadaLainLainAda']; + + if($DJ19x['BentukDadaAsimetris']==''){ + $dada='Simetris'; + }else{ $dada= $DJ19x['BentukDadaAsimetris'];} + + if($DJ19x['IctusCordisAda']==''){ + $ictuscordis='Tidak Ada'; + }else{ $ictuscordis= $DJ19x['IctusCordisAda'];} + + if($DJ19x['SternumKelainan']==''){ + $sternum='Normal'; + }else{ $sternum= $DJ19x['SternumKelainan'];} + + if($DJ19x['SesakNapasAda']==''){ + $sesak='Tidak Ada'; + }else{ $sesak= $DJ19x['SesakNapasAda'];} + + if($DJ19x['DadaLainLainAda']==''){ + $dadalain='Tidak Ada'; + }else{ $dadalain= $DJ19x['DadaLainLainAda'];} + + +//query lihat Fisik Paru----------------------------------------------- + $db->query("select SuaraPerkusiKelainan , Ronchi, Wheezing, Krepitasi, SuaraBronchial, PleuraFrictionRub, ParuLainLainAda from pemeriksaanfisik_paru where RegID = '$RegID' limit 1 "); + $DJ20x = $db->single(); + $SuaraPerkusiKelainanNya = $DJ20x['SuaraPerkusiKelainan']; + $RonchiNya = $DJ20x['Ronchi']; + $WheezingNya = $DJ20x['Wheezing']; + $KrepitasiNya = $DJ20x['Krepitasi']; + $SuaraBronchialNya = $DJ20x['SuaraBronchial']; + $PleuraFrictionRubNya = $DJ20x['PleuraFrictionRub']; + $ParuLainLainAdaNya = $DJ20x['ParuLainLainAda']; + + if($DJ20x['SuaraPerkusiKelainan']==''){ + $perkusi='Normal'; + }else{ $perkusi= $DJ20x['SuaraPerkusiKelainan'];} + + if($DJ20x['ParuLainLainAda']==''){ + $parulain='Tidak Ada'; + }else{ $parulain= $DJ20x['ParuLainLainAda'];} + + + +//query lihat Fisik Jantung----------------------------------------------- + $db->query("select VoussureCardiacAda , ThrillAda, PembesaranAda, BunyiJantungKelainan, GallopAda, IramaJantungKelainan, JantungLainLainAda from pemeriksaanfisik_jantung where RegID = '$RegID' limit 1 "); + $DJ21x = $db->single(); + $VoussureCardiacAdaNya = $DJ21x['VoussureCardiacAda']; + $ThrillAdaNya = $DJ21x['ThrillAda']; + $PembesaranAdaNya = $DJ21x['PembesaranAda']; + $BunyiJantungKelainanNya = $DJ21x['BunyiJantungKelainan']; + $GallopAdaNya = $DJ21x['GallopAda']; + $IramaJantungKelainanNya = $DJ21x['IramaJantungKelainan']; + $JantungLainLainAdaNya = $DJ21x['JantungLainLainAda']; + + if($DJ21x['VoussureCardiacAda']==''){ + $voussure='Tidak Ada'; + }else{ $voussure= $DJ21x['VoussureCardiacAda'];} + + if($DJ21x['ThrillAda']==''){ + $thrill='Tidak Ada'; + }else{ $thrill= $DJ21x['ThrillAda'];} + + if($DJ21x['PembesaranAda']==''){ + $pembesaran='Tidak Ada'; + }else{ $pembesaran= $DJ21x['PembesaranAda'];} + + if($DJ21x['BunyiJantungKelainan']==''){ + $bunyijantung='Normal'; + }else{ $bunyijantung= $DJ21x['BunyiJantungKelainan'];} + + if($DJ21x['GallopAda']==''){ + $gallop='Tidak Ada'; + }else{ $gallop= $DJ21x['GallopAda'];} + + if($DJ21x['IramaJantungKelainan']==''){ + $irama='Normal'; + }else{ $irama= $DJ21x['IramaJantungKelainan'];} + + if($DJ21x['JantungLainLainAda']==''){ + $jantunglain='Tidak Ada'; + }else{ $jantunglain= $DJ21x['JantungLainLainAda'];} + + +//query lihat Fisik Abdomen----------------------------------------------- + $db->query("select BentukAbdomenLain , HatiMembesar, LimpaMembesar, AsitesAda, PeristaltikKelainan, HerniaAda, DefansMuscularAda, NyeriTekanAda, TumorAda, AbdomenLainLainAda from pemeriksaanfisik_abdomen where RegID = '$RegID' limit 1 "); + $DJ22x = $db->single(); + $BentukAbdomenLainNya = $DJ22x['BentukAbdomenLain']; + $HatiMembesarNya = $DJ22x['HatiMembesar']; + $LimpaMembesarNya = $DJ22x['LimpaMembesar']; + $AsitesAdaNya = $DJ22x['AsitesAda']; + $PeristaltikKelainanNya = $DJ22x['PeristaltikKelainan']; + $HerniaAdaNya = $DJ22x['HerniaAda']; + $DefansMuscularAdaNya = $DJ22x['DefansMuscularAda']; + $NyeriTekanAdaNya = $DJ22x['NyeriTekanAda']; + $TumorAdaNya = $DJ22x['TumorAda']; + $AbdomenLainLainAdaNya = $DJ22x['AbdomenLainLainAda']; + + if($DJ22x['BentukAbdomenLain']==''){ + $abdomen='Soepel'; + }else{ $abdomen= $DJ22x['BentukAbdomenLain'];} + + if($DJ22x['HatiMembesar']==''){ + $hati='Tidak Membesar'; + }else{ $hati= $DJ22x['HatiMembesar'];} + + if($DJ22x['LimpaMembesar']==''){ + $limpa='Tidak Membesar'; + }else{ $limpa= $DJ22x['LimpaMembesar'];} + + if($DJ22x['AsitesAda']==''){ + $asites='Tidak Ada'; + }else{ $asites= $DJ22x['AsitesAda'];} + + if($DJ22x['PeristaltikKelainan']==''){ + $peristal='Normal'; + }else{ $peristal= $DJ22x['PeristaltikKelainan'];} + + if($DJ22x['HerniaAda']==''){ + $hernia='Tidak Ada'; + }else{ $hernia= $DJ22x['HerniaAda'];} + + if($DJ22x['DefansMuscularAda']==''){ + $defans='Tidak Ada'; + }else{ $defans= $DJ22x['DefansMuscularAda'];} + + if($DJ22x['NyeriTekanAda']==''){ + $nyeritekan='Tidak Ada'; + }else{ $nyeritekan= $DJ22x['NyeriTekanAda'];} + + if($DJ22x['TumorAda']==''){ + $tumor='Tidak Ada'; + }else{ $tumor= $DJ22x['TumorAda'];} + + if($DJ22x['AbdomenLainLainAda']==''){ + $abdomenlain='Tidak Ada'; + }else{ $abdomenlain= $DJ22x['AbdomenLainLainAda'];} + + +//query lihat Fisik Anggota Tubuh----------------------------------------------- + $db->query("select PergerakanKelainan , JariTanganKelainan, EdemaAda, RefleksKelainan, TremorAda, BengkakSendiAda, SimetrisitasAsimetris, KekuatanTidakNormal, CicatrixAda, DeformitasAda, AmputasiAda, VaricesAda, TapakCeperAda, AnggotaTubuhLainLainAda from pemeriksaanfisik_anggota_tubuh where RegID = '$RegID' limit 1 "); + $DJ23x = $db->single(); + $PergerakanKelainanNya = $DJ23x['PergerakanKelainan']; + $JariTanganKelainanNya = $DJ23x['JariTanganKelainan']; + $EdemaAdaNya = $DJ23x['EdemaAda']; + $RefleksKelainanNya = $DJ23x['RefleksKelainan']; + $TremorAdaNya = $DJ23x['TremorAda']; + $BengkakSendiAdaNya = $DJ23x['BengkakSendiAda']; + $SimetrisitasAsimetrisNya = $DJ23x['SimetrisitasAsimetris']; + $KekuatanTidakNormalNya = $DJ23x['KekuatanTidakNormal']; + $CicatrixAdaNya = $DJ23x['CicatrixAda']; + $DeformitasAdaNya = $DJ23x['DeformitasAda']; + $AmputasiAdaNya = $DJ23x['AmputasiAda']; + $VaricesAdaNya = $DJ23x['VaricesAda']; + $TapakCeperAdaNya = $DJ23x['TapakCeperAda']; + $AnggotaTubuhLainLainAdaNya = $DJ23x['AnggotaTubuhLainLainAda']; + + if($DJ23x['PergerakanKelainan']==''){ + $pergerakan='Normal'; + }else{ $pergerakan= $DJ23x['PergerakanKelainan'];} + + if($DJ23x['JariTanganKelainan']==''){ + $jaritangan='Normal'; + }else{ $jaritangan= $DJ23x['JariTanganKelainan'];} + + if($DJ23x['EdemaAda']==''){ + $edema='Tidak Ada'; + }else{ $edema= $DJ23x['EdemaAda'];} + + if($DJ23x['RefleksKelainan']==''){ + $refleks='Normal'; + }else{ $refleks= $DJ23x['RefleksKelainan'];} + + if($DJ23x['TremorAda']==''){ + $tremor='Tidak Ada'; + }else{ $tremor= $DJ23x['TremorAda'];} + + if($DJ23x['BengkakSendiAda']==''){ + $bengkak='Tidak Ada'; + }else{ $bengkak= $DJ23x['BengkakSendiAda'];} + + if($DJ23x['SimetrisitasAsimetris']==''){ + $simetris='Simetris'; + }else{ $simetris= $DJ23x['SimetrisitasAsimetris'];} + + if($DJ23x['KekuatanTidakNormal']==''){ + $kekuatan='Normal'; + }else{ $kekuatan= $DJ23x['KekuatanTidakNormal'];} + + if($DJ23x['CicatrixAda']==''){ + $cicatrix='Tidak Ada'; + }else{ $cicatrix= $DJ23x['CicatrixAda'];} + + if($DJ23x['DeformitasAda']==''){ + $deformitas='Tidak Ada'; + }else{ $deformitas= $DJ23x['DeformitasAda'];} + + if($DJ23x['AmputasiAda']==''){ + $amputasi='Tidak Ada'; + }else{ $amputasi= $DJ23x['AmputasiAda'];} + + if($DJ23x['VaricesAda']==''){ + $varices='Tidak Ada'; + }else{ $varices= $DJ23x['VaricesAda'];} + + if($DJ23x['TapakCeperAda']==''){ + $tapak='Tidak Ada'; + }else{ $tapak= $DJ23x['TapakCeperAda'];} + + if($DJ23x['AnggotaTubuhLainLainAda']==''){ + $tubuhlain='Tidak Ada'; + }else{ $tubuhlain= $DJ23x['AnggotaTubuhLainLainAda'];} + +//query lihat Fisik Khusus----------------------------------------------- + $db->query("select ECG , OpticService, Audiometri, Spirometri from pemeriksaankhusus where RegID = '$RegID' limit 1 "); + $DJ24x = $db->single(); + $ECGNya = $DJ24x['ECG']; + $OpticServiceNya = $DJ24x['OpticService']; + $AudiometriNya = $DJ24x['Audiometri']; + $SpirometriNya = $DJ24x['Spirometri']; + +//query lihat Penunjang----------------------------------------------- + $db->query("select KeteranganLaboratorium , KeteranganRadiologi from pemeriksaanpenunjang where RegID = '$RegID' limit 1 "); + $DJ25x = $db->single(); + $KeteranganLaboratoriumNya = $DJ25x['KeteranganLaboratorium']; + $KeteranganRadiologiNya = $DJ25x['KeteranganRadiologi']; + +//query lihat Pajanan Pekerjaan----------------------------------------------- + $db->query("select * from penyakitakibatkerja where RegID = '$RegID' limit 1 "); + $DJ26x = $db->single(); + $kebisingan = $DJ26x['KebisinganAda']; + $suhupanas = $DJ26x['SuhuPanasAda']; + $suhudingin = $DJ26x['SuhuDinginAda']; + $radiasibp = $DJ26x['RadiasiBukanPengionAda']; + $radiasip = $DJ26x['RadiasiPengionAda']; + $getaran = $DJ26x['GetaranLokalAda']; + $ketinggian = $DJ26x['KetinggianAda']; + $fisiklain = $DJ26x['FisikLainAda']; + $debuanorganik = $DJ26x['DebuAnorganikAda']; + $debuorganik = $DJ26x['DebuOragnikAda']; + $asap = $DJ26x['AsapAda']; + $logamberat = $DJ26x['LogamBeratAda']; + // $asap = $DJ26x['AsapAda']; + $pelarutorganik = $DJ26x['PelarutOrganikAda']; + $iritanasam = $DJ26x['IritanAsamAda']; + $iritanbasa = $DJ26x['IritanBasaAda']; + $cairanpembersih = $DJ26x['CairanPembersihAda']; + $pestisida = $DJ26x['PestisidaAda']; + $uaplogam = $DJ26x['UapLogamAda']; + $bahayakimialain = $DJ26x['BahayaKimiaBerbahayaLainLainAda']; + $bakteri = $DJ26x['BakteriAda']; + $cairantubuh = $DJ26x['CairanTubuhAda']; + $serangga = $DJ26x['SeranggaAda']; + $limbah = $DJ26x['LimbahAda']; + $biologilain = $DJ26x['BiologiLainLainAda']; + $overloadkerjaan = $DJ26x['OverloadKerjaanAda']; + $mismatchkerjaan = $DJ26x['MismatchKerjaanAda']; + $ketidakjelasantugas = $DJ26x['KetidakjelasanTugasAda']; + $hambatanjenjangKarir = $DJ26x['HambatanjenjangKarirAda']; + $kerjashift = $DJ26x['KerjaShiftAda']; + $konfliktemankerja = $DJ26x['KonflikTemanKerjaAda']; + $konflikkeluarga = $DJ26x['KonflikKeluargaAda']; + $psikologislainlain = $DJ26x['PsikologisLainLainAda']; + $tanganbergerakberulang = $DJ26x['TanganBergerakBerulanAda']; + $angkatberat = $DJ26x['AngkatBeratAda']; + $duduklama = $DJ26x['DudukLamaAda']; + $berdirilama = $DJ26x['BerdiriLamaAda']; + $posisitubuh = $DJ26x['PosisiTubuhTidakErgonomisAda']; + $pencahayaan = $DJ26x['PencahayaanTidakSesuaiAda']; + $lihatmonitor = $DJ26x['LihatMonitorLamaAda']; + $ergonomislain = $DJ26x['ErgonomisLainLainAda']; + $getaranseluruhtubuh = $DJ26x['GetaranSeluruhTubuhAda']; + + if($DJ26x['KebisinganAda']==''){ + $kebisingan='TidakAda'; + }else{ $kebisingan= $DJ26x['KebisinganAda'];} + if($DJ26x['SuhuPanasAda']==''){ + $suhupanas='TidakAda'; + }else{ $suhupanas= $DJ26x['SuhuPanasAda'];} + if($DJ26x['SuhuDinginAda']==''){ + $suhudingin='TidakAda'; + }else{ $suhudingin= $DJ26x['SuhuDinginAda'];} + if($DJ26x['RadiasiBukanPengionAda']==''){ + $radiasibp='TidakAda'; + }else{ $radiasibp= $DJ26x['RadiasiBukanPengionAda'];} + if($DJ26x['RadiasiPengionAda']==''){ + $radiasip='TidakAda'; + }else{ $radiasip= $DJ26x['RadiasiPengionAda'];} + if($DJ26x['GetaranLokalAda']==''){ + $getaran='TidakAda'; + }else{ $getaran= $DJ26x['GetaranLokalAda'];} + if($DJ26x['KetinggianAda']==''){ + $ketinggian='TidakAda'; + }else{ $ketinggian= $DJ26x['KetinggianAda'];} + if($DJ26x['FisikLainAda']==''){ + $fisiklain='TidakAda'; + }else{ $fisiklain= $DJ26x['FisikLainAda'];} + if($DJ26x['DebuOrganikAda']==''){ + $debuorganik='TidakAda'; + }else{ $debuorganik= $DJ26x['DebuOrganikAda'];} + if($DJ26x['DebuAnorganikAda']==''){ + $debuanorganik='TidakAda'; + }else{ $debuorganik= $DJ26x['DebuOrganikAda'];} + if($DJ26x['AsapAda']==''){ + $asap='TidakAda'; + }else{ $asap= $DJ26x['AsapAda'];} + if($DJ26x['LogamBeratAda']==''){ + $logamberat='TidakAda'; + }else{ $logamberat= $DJ26x['LogamBeratAda'];} + if($DJ26x['PelarutOrganikAda']==''){ + $pelarutorganik='TidakAda'; + }else{ $pelarutorganik= $DJ26x['PelarutOranikAda'];} + if($DJ26x['IritanAsamAda']==''){ + $iritanasam='TidakAda'; + }else{ $iritanasam= $DJ26x['IritanAsamAda'];} + if($DJ26x['IritanBasaAda']==''){ + $iritanbasa='TidakAda'; + }else{ $iritanbasa= $DJ26x['IritanBasaAda'];} + if($DJ26x['CairanPembersihAda']==''){ + $cairanpembersih='TidakAda'; + }else{ $cairanpembersih= $DJ26x['CairanPembersihAda'];} + if($DJ26x['PestisidaAda']==''){ + $pestisida='TidakAda'; + }else{ $pestisida= $DJ26x['PestisidaAda'];} + if($DJ26x['UapLogamAda']==''){ + $uaplogam='TidakAda'; + }else{ $uaplogam= $DJ26x['UapLogamAda'];} + if($DJ26x['BahayaKimiaBerbahayaLainLainAda']==''){ + $bahayakimialain='TidakAda'; + }else{ $bahayakimialain= $DJ26x['BahayaKimiaBerbahayaLainAda'];} + if($DJ26x['BakteriAda']==''){ + $bakteri='TidakAda'; + }else{ $bakteri= $DJ26x['BakteriAda'];} + if($DJ26x['CairanTubuhAda']==''){ + $cairantubuh='TidakAda'; + }else{ $cairantubuh= $DJ26x['CairanTubuhAda'];} + if($DJ26x['SeranggaAda']==''){ + $serangga='TidakAda'; + }else{ $serangga= $DJ26x['SeranggaAda'];} + if($DJ26x['LimbahAda']==''){ + $limbah='TidakAda'; + }else{ $limbah= $DJ26x['LimbahAda'];} + if($DJ26x['BiologiLainLainAda']==''){ + $biologilain='TidakAda'; + }else{ $biologilain= $DJ26x['BiologiLainLainAda'];} + if($DJ26x['OverLoadKerjaanAda']==''){ + $overloadkerjaan='TidakAda'; + }else{ $overloadkerjaan= $DJ26x['OverLoadKerjaanAda'];} + if($DJ26x['mismatchKerjaanAda']==''){ + $mismatch='TidakAda'; + }else{ $mismatch= $DJ26x['MismatchKerjaanAda'];} + if($DJ26x['KetidakjelasanTugasAda']==''){ + $ketidakjelasantugas='TidakAda'; + }else{ $ketidakjelasantugas= $DJ26x['KetidakjelasanTugasAda'];} + if($DJ26x['HambatanJenjangKarirAda']==''){ + $hambatanjenjangkarir='TidakAda'; + }else{ $hambatanjenjangkarir= $DJ26x['HambatanJenjangKarirAda'];} + if($DJ26x['KerjaShiftAda']==''){ + $kerjashift='TidakAda'; + }else{ $kerjashift= $DJ26x['KerjaShiftAda'];} + if($DJ26x['KonflikTemanKerjaAda']==''){ + $konfliktemankerja='TidakAda'; + }else{ $konfliktemankerja= $DJ26x['KonflikTemanKerjaAda'];} + if($DJ26x['KonflikKeluargaAda']==''){ + $konflikkeluarga='TidakAda'; + }else{ $konflikkeluarga= $DJ26x['KonflikKeluargaAda'];} + if($DJ26x['PsikologisLainLainAda']==''){ + $psikologislainlain='TidakAda'; + }else{ $psikologislainlain= $DJ26x['PsikologisLainLainAda'];} + if($DJ26x['TanganBergerakBerulangAda']==''){ + $tanganbergerakberulang='TidakAda'; + }else{ $tanganbergerakberulang= $DJ26x['TanganBergerakBerulangAda'];} + if($DJ26x['AngkatBeratAda']==''){ + $angkatberat='TidakAda'; + }else{ $angkatberat= $DJ26x['AngkatBeratAda'];} + if($DJ26x['DudukLamaAda']==''){ + $duduklama='TidakAda'; + }else{ $duduklama= $DJ26x['DudukLamaAda'];} + if($DJ26x['BerdiriLamaAda']==''){ + $berdirilama='TidakAda'; + }else{ $berdirilama= $DJ26x['BerdiriLamaAda'];} + if($DJ26x['PosisiTubuhTidakErgonomisAda']==''){ + $posisitubuh='TidakAda'; + }else{ $posisitubuh= $DJ26x['PosisiTubuhTidakErgonomisAda'];} + if($DJ26x['PencahayaanTidakSesuaiAda']==''){ + $pencahayaan='TidakAda'; + }else{ $pencahayaan= $DJ26x['PencahayaanTidakSesuaiAda'];} + if($DJ26x['LihatMonitorLamaAda']==''){ + $lihatmonitor='TidakAda'; + }else{ $lihatmonitor= $DJ26x['LihatMonitorLamaAda'];} + if($DJ26x['ErgonomisLainLainAda']==''){ + $ergonomislain='TidakAda'; + }else{ $ergonomislain= $DJ26x['ErgonomisLainLainAda'];} + if($DJ26x['GetaranSeluruhTubuhAda']==''){ + $getaranseluruhtubuh='TidakAda'; + }else{ $getaranseluruhtubuh= $DJ26x['GetaranSeluruhTubuhAda']; + + //query lihat Pekerjaaan----------------------------------------------- + // $db->query("select m.Pekerjaan from regpas r left join medrec m on r.MEDRECID=m.MEDRECID where r.RegID = '$RegID' limit 1 "); + //$DJ27x = $db->single(); + //$Pekerjaan = $DJ27x['Pekerjaan']; + #$KeteranganRadiologiNya = $DJ25x['KeteranganRadiologi']; + + //query lihat Dokternya----------------------------------------------------- + $db->query("select Nama from dokter where DokterID = '$DokterIDPengkaji' limit 1 "); + $DJ27x = $db->single(); + $NamaDokterPengkaji = $DJ27x['Nama']; + + + + + } + + + + + //tuliskan isinya ke sini + $sh->write($n, 0, $no, $isi_c); + $sh->writestring($n, 1, $RegID, $isi_c); + $sh->writestring($n, 2, $MEDRECID, $isi_l); + $sh->write($n, 3, $NamaPasiennya, $isi_l); + $sh->write($n, 4, $kelamin, $isi_l); + $sh->write($n, 5, $TanggalLahirnya, $isi_r); + $sh->write($n, 6, $Umurnya, $isi_l); + $sh->write($n, 7, $TanggalDaftar, $isi_l); + //$sh->write($n, 8, $NamaPaketNya, $isi_l); + $sh->write($n, 8, $perusahaan, $isi_l); + $sh->write($n, 9, $NamaDokterNya, $isi_l); + $sh->write($n, 10, $DepartemenKerjanya, $isi_l); + $sh->write($n, 11, $TinggiBadanNya, $isi_l); + $sh->write($n, 12, $BeratBadanNya, $isi_l); + $sh->write($n, 13, $TekanandarahNya, $isi_l); + $sh->write($n, 14, $NadiNya, $isi_l); + $sh->write($n, 15, $SuhuNya, $isi_l); + $sh->write($n, 16, $PernafasanNya, $isi_l); + $sh->write($n, 17, $diabetes, $isi_l); + $sh->write($n, 18, $hipertensi, $isi_l); + $sh->write($n, 19, $lemak, $isi_l); + $sh->write($n, 20, $jantung, $isi_l); + $sh->write($n, 21, $stroke, $isi_l); + $sh->write($n, 22, $asma, $isi_l); + $sh->write($n, 23, $paru, $isi_l); + $sh->write($n, 24, $cidera, $isi_l); + $sh->write($n, 25, $rawatinap, $isi_l); + $sh->write($n, 26, $operasi, $isi_l); + $sh->write($n, 27, $lain2, $isi_l); + $sh->write($n, 28, $diabetes1, $isi_l); + $sh->write($n, 29, $hipertensi1, $isi_l); + $sh->write($n, 30, $lemak1, $isi_l); + $sh->write($n, 31, $jantung1, $isi_l); + $sh->write($n, 32, $stroke1, $isi_l); + $sh->write($n, 33, $asma1, $isi_l); + $sh->write($n, 34, $paru1, $isi_l); + $sh->write($n, 35, $cidera1, $isi_l); + $sh->write($n, 36, $rawatinap1, $isi_l); + $sh->write($n, 37, $operasi1, $isi_l); + $sh->write($n, 38, $lain21, $isi_l); + $sh->write($n, 39, $alergiobat, $isi_l); + $sh->write($n, 40, $alergimakanan, $isi_l); + $sh->write($n, 41, $alergilain, $isi_l); + $sh->write($n, 42, $merokok, $isi_l); + $sh->write($n, 43, $alkohol, $isi_l); + $sh->write($n, 44, $olahraga, $isi_l); + $sh->write($n, 45, $KeadaanUmumNya, $isi_l); + $sh->write($n, 46, $KeadaanSakitNya, $isi_l); + $sh->write($n, 47, $StatusGiziNya, $isi_l); + $sh->write($n, 48, $KesadaranNya, $isi_l); + /*$sh->write($n, 50, $HabitusNya, $isi_l); + $sh->write($n, 51, $kepala, $isi_l); + $sh->write($n, 52, $kepalalain, $isi_l); + $sh->write($n, 53, $sianosis, $isi_l); + $sh->write($n, 54, $efloresensi, $isi_l); + $sh->write($n, 55, $TurgorNya, $isi_l); + $sh->write($n, 56, $KeringatNya, $isi_l); + $sh->write($n, 57, $allergis, $isi_l); + $sh->write($n, 58, $panu, $isi_l); + // $sh->write($n, 59, $exemalodes, $isi_l); + $sh->write($n, 59, $kulitlain, $isi_l); + $sh->write($n, 60, $PterigiumNya, $isi_l); + $sh->write($n, 61, $ExopthalmusNya, $isi_l); + $sh->write($n, 62, $ConjunctivitisNya, $isi_l); + $sh->write($n, 63, $CataractNya, $isi_l); + $sh->write($n, 64, $StrabismusNya, $isi_l); + $sh->write($n, 65, $NebulaMaculaNya, $isi_l); + $sh->write($n, 66, $IcterusNya, $isi_l); + $sh->write($n, 67, $ArcusSenilisNya, $isi_l);*/ + $sh->write($n, 49, $ColourBlindnessNya, $isi_l); + /*$sh->write($n, 69, $AnemieNya, $isi_l); + $sh->write($n, 70, $PupilNya, $isi_l); + $sh->write($n, 71, $visusjauh, $isi_l); + $sh->write($n, 72, $DepthPerceptionNya, $isi_l);*/ + $sh->write($n, 50, $visusdekat, $isi_l); + //$sh->write($n, 74, $LapangPandangHorizontalNya, $isi_l); + $sh->write($n, 51, $matalain, $isi_l); + /*$sh->write($n, 76, $CerumenNya, $isi_l); + $sh->write($n, 77, $OtitisNya, $isi_l); + $sh->write($n, 78, $MembraneTympaniNya, $isi_l); + // $sh->write($n, 80, $MembraneTympaniKelainanNya, $isi_l); + $sh->write($n, 79, $MastoidRegionNya, $isi_l); + $sh->write($n, 80, $telingalain, $isi_l); + $sh->write($n, 81, $SeptumNya, $isi_l); + $sh->write($n, 82, $selaput, $isi_l); + $sh->write($n, 83, $PendarahanNya, $isi_l); + $sh->write($n, 84, $PolipNya, $isi_l); + $sh->write($n, 85, $PeradanganNya, $isi_l); + $sh->write($n, 86, $hidunglain, $isi_l);*/ + $sh->write($n, 52, $faring, $isi_l); + $sh->write($n, 53, $tonsil, $isi_l); + /* $sh->write($n, 89, $lidah, $isi_l); + $sh->write($n, 90, $bibir, $isi_l); + $sh->write($n, 91, $gusi, $isi_l);*/ + $sh->write($n, 54, $mulut, $isi_l); + $sh->write($n, 55, $gigi, $isi_l); + /*$sh->write($n, 94, $fetorexore, $isi_l); + $sh->write($n, 95, $karanggigi, $isi_l); + $sh->write($n, 96, $prothesa, $isi_l); + $sh->write($n, 97, $limphe, $isi_l); + $sh->write($n, 98, $vena, $isi_l); + $sh->write($n, 99, $darah, $isi_l); + $sh->write($n, 100, $gondok, $isi_l); + $sh->write($n, 101, $TracheaNya, $isi_l); + $sh->write($n, 102, $kuduk, $isi_l); + $sh->write($n, 103, $dada, $isi_l); + $sh->write($n, 104, $ictuscordis, $isi_l); + $sh->write($n, 105, $sternum, $isi_l); + $sh->write($n, 106, $sesak, $isi_l); + $sh->write($n, 107, $MammaeNya, $isi_l); + $sh->write($n, 108, $dadalain, $isi_l); + $sh->write($n, 109, $perkusi, $isi_l); + $sh->write($n, 110, $RonchiNya, $isi_l); + $sh->write($n, 111, $WheezingNya, $isi_l); + $sh->write($n, 112, $KrepitasiNya, $isi_l); + $sh->write($n, 113, $SuaraBronchialNya, $isi_l); + $sh->write($n, 114, $PleuraFrictionRubNya, $isi_l);*/ + $sh->write($n, 56, $parulain, $isi_l); + /* $sh->write($n, 116, $voussure, $isi_l); + $sh->write($n, 117, $thrill, $isi_l); + $sh->write($n, 118, $pembesaran, $isi_l); + $sh->write($n, 119, $bunyijantung, $isi_l); + $sh->write($n, 120, $gallop, $isi_l); + $sh->write($n, 121, $irama, $isi_l);*/ + $sh->write($n, 57, $jantunglain, $isi_l); + /* $sh->write($n, 123, $abdomen, $isi_l); + $sh->write($n, 124, $hati, $isi_l); + $sh->write($n, 125, $limpa, $isi_l); + $sh->write($n, 126, $asites, $isi_l); + $sh->write($n, 127, $peristal, $isi_l);*/ + $sh->write($n, 58, $hernia, $isi_l); + /* $sh->write($n, 129, $defans, $isi_l); + $sh->write($n, 130, $nyeritekan, $isi_l); + $sh->write($n, 131, $tumor, $isi_l); + $sh->write($n, 132, $abdomenlain, $isi_l); + $sh->write($n, 133, $pergerakan, $isi_l); + $sh->write($n, 134, $jaritangan, $isi_l); + $sh->write($n, 135, $edema, $isi_l); + $sh->write($n, 136, $refleks, $isi_l); + $sh->write($n, 137, $tremor, $isi_l); + $sh->write($n, 138, $bengkak, $isi_l); + $sh->write($n, 139, $simetris, $isi_l); + $sh->write($n, 140, $kekuatan, $isi_l); + $sh->write($n, 141, $cicatrix, $isi_l); + $sh->write($n, 142, $deformitas, $isi_l); + $sh->write($n, 143, $amputasi, $isi_l); + $sh->write($n, 144, $varices, $isi_l); + $sh->write($n, 145, $tapak, $isi_l); + $sh->write($n, 146, $tubuhlain, $isi_l);*/ + $sh->write($n, 59, $KeluhanUtamaRingkasanNya, $isi_l); + $sh->write($n, 60, $PenyakitSekarangRingkasanNya, $isi_l);//ini hapus + $sh->write($n, 61, $PenyakitDahuluRingkasanNya, $isi_l);//ini hapus + /* $sh->write($n, 150, $PemeriksaanFisikRingkasanNya, $isi_l);//ini hapus + $sh->write($n, 151, $KeteranganLaboratoriumNya, $isi_l);//ini hapus + $sh->write($n, 152, $KeteranganRadiologiNya, $isi_l); //ini hapus*/ + $sh->write($n, 62, $ECGNya, $isi_l); + // $sh->write($n, 154, $OpticServiceNya, $isi_l); + $sh->write($n, 63, $AudiometriNya, $isi_l); + $sh->write($n, 64, $SpirometriNya, $isi_l); + $sh->write($n, 65, $PemeriksaanLainLainRingkasanNya, $isi_l); + /*$sh->write($n, 158, $KesimpulanRingkasanNya, $isi_l);//ini hapus + $sh->write($n, 159, $PengobatanDiberiRingkasanNya, $isi_l); + $sh->write($n, 160, $SaranMotivasiRingkasanNya, $isi_l); //ini hapus*/ + $sh->write($n, 66, $SaranKesehatanKerjaRingkasannya, $isi_l); + + //Tambahan penyakit akibat kerja + + $sh->write($n, 67, $kebisingan, $isi_l); + $sh->write($n, 68, $suhupanas, $isi_l); + $sh->write($n, 69, $suhudingin, $isi_l); + $sh->write($n, 70, $radiasibp, $isi_l); + $sh->write($n, 71, $radiasip, $isi_l); + $sh->write($n, 72, $getaran, $isi_l); + $sh->write($n, 73, $getaranseluruhtubuh, $isi_l); + + $sh->write($n, 74, $ketinggian, $isi_l); + $sh->write($n, 75, $fisiklain, $isi_l); + + $sh->write($n, 76, $debuorganik, $isi_l); + $sh->write($n, 77, $debuanorganik, $isi_l); + $sh->write($n, 78, $asap, $isi_l); + $sh->write($n, 79, $logamberat, $isi_l); + $sh->write($n, 80, $pelarutorganik, $isi_l); + $sh->write($n, 81, $iritanasam, $isi_l); + $sh->write($n, 82, $iritanbasa, $isi_l); + $sh->write($n, 83, $cairanpembersih, $isi_l); + $sh->write($n, 84, $pestisida, $isi_l); + $sh->write($n, 85, $uaplogam, $isi_l); + $sh->write($n, 86, $bahayakimialain, $isi_l); + // + $sh->write($n, 87, $bakteri, $isi_l); + $sh->write($n, 88, $cairantubuh, $isi_l); + $sh->write($n, 89, $serangga, $isi_l); + $sh->write($n, 90, $limbah, $isi_l); + $sh->write($n, 91, $biologilain, $isi_l); + + + // + $sh->write($n, 92, $overloadkerjaan, $isi_l); + $sh->write($n, 93, $mismatch, $isi_l); + $sh->write($n, 94, $ketidakjelasantugas, $isi_l); + $sh->write($n, 95, $hambatanjenjangkarir, $isi_l); + $sh->write($n, 96, $kerjashift, $isi_l); + $sh->write($n, 97, $konfliktemankerja, $isi_l); + $sh->write($n, 98, $konflikkeluarga, $isi_l); + $sh->write($n, 99, $psikologislainlain, $isi_l); + $sh->write($n, 100, $tanganbergerakberulang, $isi_l); + $sh->write($n, 101, $angkatberat, $isi_l); + $sh->write($n, 102, $duduklama, $isi_l); + $sh->write($n, 103, $berdirilama, $isi_l); + $sh->write($n, 104, $posisitubuh, $isi_l); + $sh->write($n, 105, $pencahayaan, $isi_l); + $sh->write($n, 106, $lihatmonitor, $isi_l); + $sh->write($n, 107, $ergonomislain, $isi_l); + $sh->write($n, 108, $VisusJauhTanpaKoreksiVOD, $isi_l); + $sh->write($n, 109, $VisusJauhTanpaKoreksiVOS, $isi_l); + $sh->write($n, 110, $VisusJauhDenganKoreksiVOD, $isi_l); + $sh->write($n, 112, $VisusJauhDenganKoreksiVOS, $isi_l); + $sh->write($n, 113, $Pekerjaan, $isi_l); + $sh->write($n, 114, $NamaDokterPengkaji, $isi_l); + + } + + + // Kirim utk download + $b->send("mcu.xls"); + $b->close(); +} + +?> diff --git a/docs/resume_mcu.php b/docs/resume_mcu.php new file mode 100644 index 0000000..877272a --- /dev/null +++ b/docs/resume_mcu.php @@ -0,0 +1,1258 @@ +spreadsheet = new Spreadsheet(); + $this->koneksi = $koneksi; + $this->koneksifarmasi = $koneksifarmasi; + } + + /** + * Export data pasien ke Excel dengan multiple sheets + */ + public function exportDataPasien($Tanggal, $Tanggal2) + { + + $Tanggal = $_GET['Tanggal'] ?? date('Y-m-d'); + $Tanggal2 = $_GET['Tanggal2'] ?? $Tanggal; + + + $this->spreadsheet->removeSheetByIndex(0); + + // Sheet 1: Data Pasien Rawat Jalan + $this->createSheetRajal($Tanggal, $Tanggal2); + + // Sheet 2: Data Pasien Rawat Inap + // $this->createSheetRanap($Tanggal); + + // Sheet 3: Data Pasien Tunggu Layanan + // $this->createSheetTungguLayanan($Tanggal, $EXRJ); + + // Sheet 4: Data Farmasi + // $this->createSheetFarmasiRacikan($Tanggal); + + //$this->createSheetFarmasiNonRacikan($Tanggal); + + //$this->createSheetFarmasiImportResep($Tanggal); + + //$this->createSheetVisitDokter($Tanggal); + + //$this->createSheetWaktuBukaPoli($Tanggal, $EXRJ); + + + + + // Sheet 5: Rekap Harian + // $this->createSheetRekap($tanggal_awal, $tanggal_akhir); + + return $this->spreadsheet; + } + + /** + * Membuat sheet untuk data Rawat Jalan + */ + private function createSheetRajal($Tanggal, $Tanggal2) + { + + $sheet = $this->spreadsheet->createSheet(); + $sheet->setTitle('Rawat Jalan'); + + // Header + $headers = [ + 'No', + 'RegID', + 'MEDREC', + 'NAMA', + 'Tanggal', + 'Departemen', + 'Dokter', + 'Jaminan', + 'PulangTanggal', + //'Waktu Tunggu', + 'Kesimpulan', + 'Saran', + 'Laboratorium', + 'Radiologi', + 'PemeriksaanFisik', + 'PenyakitSekarangRingkasan', + 'PenyakitDahuluRingkasan', + 'RiwayatPenyakitSekarangAnamnesis', + 'SaranKesehatanKerjaRingkasan', + 'LaikKerjaCatatan', + 'SetujuiOLeh' + ]; + + $startRow = $this->setSimpleTitle($sheet, 'Lama Pasien Berobat Rawat Jalan', count($headers), $Tanggal); + $startRow = $this->setHeaders($sheet, $headers, $startRow); + + + $query = "select + a.RegID, + a.MEDRECID, + a.Nama, + a.Tanggal, + a.PulangTanggal, + d.Nama as NamaDepartemen, + b.Nama as NamaDokter, + c.Nama as NamaPerusahaan, + a.JenisPasienID, + pm.KesimpulanRingkasan as Kesimpulan, + pm.SaranMotivasiRingkasan as saran, + pp.KeteranganLaboratorium as lab, + pp.KeteranganRadiologi as rad, + pm.PemeriksaanFisikRingkasan, + pm.PenyakitSekarangRingkasan, + pm.PenyakitDahuluRingkasan, + pm.RiwayatPenyakitSekarangAnamnesis, + pm.SaranKesehatanKerjaRingkasan, + pm.LaikKerjaCatatan, + pm.SetujuiOLeh + from regpas as a + left join departemen d on a.DepartemenID = d.DepartemenID + left join dokter b on b.DokterID = a.DokterID + left join perusahaan c on c.PerusahaanID=a.PerusahaanID + LEFT JOIN pengkajianmcu pm on a.RegID=pm.RegID + LEFT join pemeriksaanpenunjang pp on a.RegID=pp.RegID + where a.Tanggal between ? and ? + and a.JenisRegID = '2' + and a.NA='N' + "; + + + $stmt = $this->koneksi->prepare($query); + $tanggal_awal = $Tanggal . ' 00:00:01'; + $tanggal_akhir = $Tanggal2 . ' 23:59:59'; + $stmt->bind_param("ss", $tanggal_awal, $tanggal_akhir); + $stmt->execute(); + $result = $stmt->get_result(); + + while ($row = $result->fetch_assoc()) { + $data_array[] = $row; + } + $row = $startRow; + $no = 1; + + foreach ($data_array as $key => $data) { + # code... + // } ($data = $result->fetch_assoc()) { + + $RegID = $data['RegID']; + $LAB = 'LAB'; + $RAD = 'RAD'; + + $sql2 = "select Tanggal from antrian where RegPasID = '$RegID' and Appointment = 'Y' limit 1"; + $query2 = mysqli_query($this->koneksi, $sql2); + $row3 = mysqli_fetch_array($query2); + // $Tanggalnya = $row3['Tanggal']; + if (empty($row3)) { + $TanggalAwal = $data['Tanggal']; + } else { + $TanggalAwal = $row3['Tanggal']; + } + + $sql3 = "select DepartemenID from trxdepartemen where RegID = '$RegID' and DepartemenID in ('$LAB','$RAD') group by RegID limit 1"; + $query3 = mysqli_query($this->koneksi, $sql3); + $row4 = mysqli_fetch_array($query3); + + + $sql = "select TanggalPanggil from nomor where RegID = '$RegID' and Panggil = 1 limit 1"; + $query = mysqli_query($this->koneksifarmasi, $sql); + $row2 = mysqli_fetch_array($query); + // $TanggalPanggil = $row2['TanggalPanggil']; + if (empty($row2)) { + $tanggal_pulang = $data['PulangTanggal']; + } else { + $tanggal_pulang = $row2['TanggalPanggil']; + } + + $Tanggal_masuk = new DateTime($TanggalAwal); + $PulangTanggal = new DateTime($tanggal_pulang); + $selisih_jam = $PulangTanggal->diff($Tanggal_masuk); + $jam = ($selisih_jam->format('%d') * 24 * 60 * 60) + ($selisih_jam->format('%h') * 60) + $selisih_jam->format('%i'); + $status = ''; + + + + // $DepartemenID = $row4['DepartemenID']; + + if (empty($row4['DepartemenID'])) { + if ($jam < 60) { + $status = 'Kurang 1 Jam'; + } else if ($jam >= 60 && $jam < 120) { + $status = '1 sampai 2 jam'; + } else if ($jam >= 120 && $jam < 180) { + $status = '2 sammpai 3 jam'; + } else if ($jam >= 180 && $jam < 240) { + $status = '3 sampai 4 jam'; + } else if ($jam >= 240) { + $status = 'Lebih dari 4 jam'; + } + + if ($data['JenisPasienID'] == 0) { + $jaminan = 'Umum'; + } else { + $jaminan = $data['NamaPerusahaan']; + } + + $sheet->setCellValue('A' . $row, $no++); + $sheet->setCellValue('B' . $row, $data['RegID']); + $sheet->setCellValue('C' . $row, $data['MEDRECID']); + $sheet->setCellValue('D' . $row, $data['Nama']); + $sheet->setCellValue('E' . $row, $data['Tanggal']); + $sheet->setCellValue('F' . $row, $data['NamaDepartemen']); + $sheet->setCellValue('G' . $row, $data['NamaDokter']); + $sheet->setCellValue('H' . $row, $jaminan); + $sheet->setCellValue('I' . $row, $data['PulangTanggal']); + //$sheet->setCellValue('I' . $row, $tanggal_pulang); + //$sheet->setCellValue('J' . $row, $jam . ' Menit'); + $sheet->setCellValue('J' . $row, $data['Kesimpulan']); + $sheet->setCellValue('K' . $row, $data['saran']); + $sheet->setCellValue('L' . $row, $data['lab']); + $sheet->setCellValue('M' . $row, $data['rad']); + $sheet->setCellValue('N' . $row, $data['PemeriksaanFisikRingkasan']); + $sheet->setCellValue('O' . $row, $data['PenyakitSekarangRingkasan']); + $sheet->setCellValue('P' . $row, $data['PenyakitDahuluRingkasan']); + $sheet->setCellValue('Q' . $row, $data['RiwayatPenyakitSekarangAnamnesis']); + $sheet->setCellValue('R' . $row, $data['SaranKesehatanKerjaRingkasan']); + $sheet->setCellValue('S' . $row, $data['LaikKerjaCatatan']); + $sheet->setCellValue('T' . $row, $data['SetujuiOLeh']); + //$sheet->setCellValue('O' . $row, $status); + $row++; + } + } + + + $this->autoSizeColumns($sheet, count($headers)); + $this->applyTableStyle($sheet, 3, $row - 1, count($headers)); + } + + /** + * Membuat sheet untuk data Rawat Inap + */ + private function createSheetRanap($Tanggal) + { + + $sheet = $this->spreadsheet->createSheet(); + $sheet->setTitle('Rawat Inap'); + + // Header + $headers = [ + 'No', + 'RegID', + 'MEDRECID', + 'Nama', + 'Departemen', + 'Dokter', + 'Jaminan', + 'Tanggal Masuk', + 'Tanggal Resume', + 'Tanggal Keluar Kamar', + 'Tanggal Pulang', + 'Lama', + 'Status', + 'a' + ]; + + $startRow = $this->setSimpleTitle($sheet, 'Lama Pasien Pulang Rawat Inap', count($headers), $Tanggal); + $startRow = $this->setHeaders($sheet, $headers, $startRow); + + $queryranap = "select + r.RegID, + r.MEDRECID, + r.Nama, + r.Tanggal, + r.PulangTanggal, + r.BolehPulangTanggal, + d.Nama as NamaDepartemen, + b.Nama as NamaDokter, + c.Nama as NamaPerusahaan, + r.JenisPasienID, + e.TanggalBuat, + e.TanggalEdit + from regpas r + left join pengkajianpasien_resume e on r.RegID = e.RegID + left join departemen d on r.DepartemenID = d.DepartemenID + left join dokter b on b.DokterID = r.DokterID + left join perusahaan c on c.PerusahaanID=r.PerusahaanID + where r.PulangTanggal between ? and ? + and r.JenisRegID = '1' + and r.Pulang = 'Y'"; + + // $querypulangranap = mysqli_query($koneksi, $queryranap); + $stmt = $this->koneksi->prepare($queryranap); + $tanggal_awal = $Tanggal . ' 00:00:00'; + $tanggal_akhir = $Tanggal . ' 23:59:59'; + $stmt->bind_param("ss", $tanggal_awal, $tanggal_akhir); + $stmt->execute(); + $result = $stmt->get_result(); + + + $row = $startRow; + $no = 1; + // $data = $result->fetch_assoc(); + // print_r($data); + // die; + while ($data = $result->fetch_assoc()) { + + if ($data['TanggalEdit'] == '0000-00-00 00:00:00') { + $ambiljam = $data['TanggalBuat']; + } else { + $ambiljam = $data['TanggalEdit']; + } + + $sql = "select TanggalKajian from pengkajianpasien where RegID = '$data[RegID]' and JnsKajian = 26 limit 1"; + $query = mysqli_query($this->koneksi, $sql); + $row2 = mysqli_fetch_array($query); + $TanggalKajian = $row2['TanggalKajian']; + //$Tanggalnow = date('Y-m-d'); + $new_date = date('Y-m-d', strtotime($ambiljam)); + $Tanggaln = date('Y-m-d', strtotime($data['BolehPulangTanggal'])); + + if (!empty($row2)) { + if ($new_date != $Tanggaln) { + $ambilawal = $TanggalKajian; + $a = 'ada resume beda tanggal pulang'; + } else { + $ambilawal = $TanggalKajian; + $a = 'ada resume sama tanggal pulang'; + } + // $a = 'ada resume'; + } else { + // if ($new_date != $Tanggaln) { + // $ambilawal = $TanggalKajian; + // } else { + // $ambilawal = $ambiljam; + // } + $ambilawal = $ambiljam; + $a = 'tidak ada resume'; + } + + $dateresume = new DateTime($ambilawal); + $datekeluarruangan = new DateTime($data['BolehPulangTanggal']); + $jamlamapulang = $datekeluarruangan->diff($dateresume); + $jamlamapulangget = ($jamlamapulang->format('%d') * 24 * 60 * 60) + ($jamlamapulang->format('%h') * 60) + $jamlamapulang->format('%i'); + + if ($jamlamapulangget < 120) { + $status = 'Kurang dari 2 jam'; + } else if ($jamlamapulangget >= 121 && $jamlamapulangget < 180) { + $status = 'Kurang dari 3 jam'; + } else if ($jamlamapulangget >= 180 && $jamlamapulangget < 720) { + $status = 'Kurang dari 12 jam'; + } else if ($jamlamapulangget >= 720) { + $status = 'Lebih dari 12 jam'; + } + + if ($data['JenisPasienID'] == 0) { + $jaminan = 'Umum'; + } else { + $jaminan = $data['NamaPerusahaan']; + } + + $sheet->setCellValue('A' . $row, $no++); + $sheet->setCellValue('B' . $row, $data['RegID']); + $sheet->setCellValue('C' . $row, $data['MEDRECID']); + $sheet->setCellValue('D' . $row, $data['Nama']); + $sheet->setCellValue('E' . $row, $data['NamaDepartemen']); + $sheet->setCellValue('F' . $row, $data['NamaDokter']); + $sheet->setCellValue('G' . $row, $jaminan); + $sheet->setCellValue('H' . $row, $data['Tanggal']); + $sheet->setCellValue('I' . $row, $dateresume); + $sheet->setCellValue('J' . $row, $data['PulangTanggal']); + $sheet->setCellValue('K' . $row, $data['BolehPulangTanggal']); + $sheet->setCellValue('L' . $row, $jamlamapulangget . ' Menit'); + $sheet->setCellValue('M' . $row, $status); + $sheet->setCellValue('N' . $row, $a); + $row++; + } + + $this->autoSizeColumns($sheet, count($headers)); + $this->applyTableStyle($sheet, 3, $row - 1, count($headers)); + } + + + /** + * Membuat sheet untuk data Tunggu Layanan + */ + private function createSheetTungguLayanan($Tanggal, $EXRJ) + { + $sheet = $this->spreadsheet->createSheet(); + $sheet->setTitle('Waktu Tunggu Layanan'); + + // Header + $headers = [ + 'No', + 'RegID', + 'MEDRECID', + 'Nama', + 'Departemen', + 'Dokter', + 'Jaminan', + 'Tanggal Masuk', + 'Tanggal Pemeriksaan Perawat', + 'Tanggal Pemeriksaan Dokter', + 'Lama', + 'Status' + ]; + + $startRow = $this->setSimpleTitle($sheet, 'Waktu Tunggu Layanan KPI Direktur', count($headers), $Tanggal); + $startRow = $this->setHeaders($sheet, $headers, $startRow); + + // Query data UGD + $query = "SELECT r.Nama, r.RegID, r.MEDRECID,r.Tanggal as TanggalMasuk,d.TanggalBuatDR,d.TanggalBuatNs,b.Nama as NamaDokter , + e.Nama as NamaDepartemen, + c.Nama as NamaPerusahaan, + r.JenisPasienID + from regpas r + left join detail_pemeriksaan_rj d on r.RegID = d.RegID + left join dokter b on r.DokterID = b.DokterID + left join departemen e on r.DepartemenID = e.DepartemenID + left join perusahaan c on c.PerusahaanID=r.PerusahaanID + where d.DokterID != '' and r.Tanggal BETWEEN '$Tanggal 00:00:01' + and '$Tanggal 22:00:01' + and r.JenisRegID=0 + and r.DepartemenID not in $EXRJ group by d.RegID"; + + $stmt = $this->koneksi->prepare($query); + // $stmt->bind_param("ss", $tanggal_awal, $tanggal_akhir); + $stmt->execute(); + $result = $stmt->get_result(); + + $row = $startRow; + $no = 1; + while ($data = $result->fetch_assoc()) { + + $RegID = $data['RegID']; + $sql2 = "select Tanggal from antrian where RegPasID = '$RegID' and Appointment = 'Y' order by Tanggal limit 1"; + $query2 = mysqli_query($this->koneksi, $sql2); + $row3 = mysqli_fetch_array($query2); + if (empty($row3)) { + $TanggalAwal = $data['TanggalMasuk']; + } else { + $TanggalAwal = $row3['Tanggal']; + } + + $ambilpulang = $data['TanggalBuatDR']; + $Tanggalawalmula = new DateTime($TanggalAwal); + $PulangTanggal = new DateTime($ambilpulang); + $bedanya = $PulangTanggal->diff($Tanggalawalmula); + $jamtunggu = ($bedanya->format('%d') * 24 * 60 * 60) + ($bedanya->format('%h') * 60) + $bedanya->format('%i'); + + if ($jamtunggu < 30) { + $status = 'Kurang dari 30 menittt'; + } else if ($Tanggalawalmula >= $PulangTanggal) { + $status = 'Kurang dari 30 menit (Daftar ADM)'; + } else if ($jamtunggu >= 150) { + $status = 'Lebih dari 2 Jam'; + } else if ($jamtunggu >= 30 && $jamtunggu < 60) { + $status = '30 sampai 60 menit'; + } else if ($jamtunggu >= 60 && $jamtunggu < 90) { + $status = '60 sampai 90 menit'; + } else if ($jamtunggu >= 90 && $jamtunggu < 120) { + $status = '90 sampai 120 menit'; + } else if ($jamtunggu >= 120 && $jamtunggu < 150) { + $status = 'Lebih dari 2 Jam'; + } + + + if ($data['JenisPasienID'] == 0) { + $jaminan = 'Umum'; + } else { + $jaminan = $data['NamaPerusahaan']; + } + + $sheet->setCellValue('A' . $row, $no++); + $sheet->setCellValue('B' . $row, $data['RegID']); + $sheet->setCellValue('C' . $row, $data['MEDRECID']); + $sheet->setCellValue('D' . $row, $data['Nama']); + $sheet->setCellValue('E' . $row, $data['NamaDepartemen']); + $sheet->setCellValue('F' . $row, $data['NamaDokter']); + $sheet->setCellValue('G' . $row, $jaminan); + $sheet->setCellValue('H' . $row, $TanggalAwal); + $sheet->setCellValue('I' . $row, $data['TanggalBuatNs']); + $sheet->setCellValue('J' . $row, $data['TanggalBuatDR']); + $sheet->setCellValue('K' . $row, $jamtunggu . ' Menit'); + $sheet->setCellValue('L' . $row, $status); + $row++; + } + + $this->autoSizeColumns($sheet, count($headers)); + $this->applyTableStyle($sheet, 1, $row - 1, count($headers)); + } + + /** + * Membuat sheet untuk data Farmasi + */ + private function createSheetFarmasiRacikan($Tanggal) + { + $sheet = $this->spreadsheet->createSheet(); + $sheet->setTitle('Tunggu Farmasi Racikan'); + + // Header + $headers = [ + 'No', + 'RegID', + 'MEDRECID', + 'Nama', + 'Departemen', + 'Jaminan', + 'Kirim Resep', + 'Waktu Pelayanan Farmasi', + 'Waktu Panggil Farmasi', + 'Waktu Selesai Farmasi', + 'Waktu Tunggu', + 'Status' + ]; + + $startRow = $this->setSimpleTitle($sheet, 'Waktu Tunggu Farmasi Racikan', count($headers), $Tanggal); + $startRow = $this->setHeaders($sheet, $headers, $startRow); + + // Query data Farmasi + // $query = "select + // TanggalCetak,RegID, TanggalPanggil, TanggalPelayanan, TanggalSelesai + // from nomor + // where Tanggal = '$Tanggal' + // and Panggil= '1' + // and Prefix = 'R'"; + $query = "select TanggalCetak,RegID,TrxID,TanggalPanggil,TanggalPelayanan, TanggalSelesai from nomor where Tanggal = '$Tanggal' and Panggil= '1' and Prefix = 'R'"; + $stmt = $this->koneksifarmasi->prepare($query); + $stmt->execute(); + $result = $stmt->get_result(); + + $row = $startRow; + $no = 1; + while ($data = $result->fetch_assoc()) { + + $sql2 = "select ResepID,RegID,TrxID from trxdepartemen where TrxID = '$data[TrxID]' limit 1"; + $query = mysqli_query($this->koneksi, $sql2); + $row3 = mysqli_fetch_array($query); + + + $sql = "select a.RegID, a.MEDRECID, a.Nama, b.Nama as NamaDepartemen, c.Nama as NamaPerusahaan,a.JenisPasienID from regpas a + left join departemen b on a.DepartemenID=b.DepartemenID + left join perusahaan c on a.PerusahaanID=c.PerusahaanID + where a.RegID = '$data[RegID]' limit 1"; + $query = mysqli_query($this->koneksi, $sql); + $row1 = mysqli_fetch_array($query); + + // $sql = "select Tanggal as TanggalKirim from resep where RegID = '$data[RegID]' and StatusID = '2' and v2 = 'N' limit 1"; + $sql = "select Tanggal as TanggalKirim from resep where ResepID = '$row3[ResepID]' and StatusID = '2' and v2 = 'N' limit 1"; + $query = mysqli_query($this->koneksi, $sql); + $row2 = mysqli_fetch_array($query); + + + $TanggalCetak = new DateTime($row2['TanggalKirim']); + $TanggalSelesai = new DateTime($data['TanggalPanggil']); + $bedanya2 = $TanggalSelesai->diff($TanggalCetak); + //$harikeseluruhan = $bedanya->format('%d'); + $jam2 = ($bedanya2->format('%d') * 24 * 60 * 60) + ($bedanya2->format('%h') * 60) + $bedanya2->format('%i'); + //$jamkeseluruhan = $bedanya->format('%H:%I'); + if ($jam2 < 30) { + $status = 'Kurang dari 30 menit'; + } else if ($jam2 >= 30 && $jam2 < 60) { + $status = '30 sampai 60 menit'; + } else if ($jam2 >= 60) { + $status = 'Lebih dari 60 menit'; + } + + if ($row1['JenisPasienID'] == 0) { + $jaminan = 'Umum'; + } else { + $jaminan = $row1['NamaPerusahaan']; + } + + $sheet->setCellValue('A' . $row, $no++); + $sheet->setCellValue('B' . $row, $data['RegID']); + $sheet->setCellValue('C' . $row, $row1['MEDRECID']); + $sheet->setCellValue('D' . $row, $row1['Nama']); + $sheet->setCellValue('E' . $row, $row1['NamaDepartemen']); + $sheet->setCellValue('F' . $row, $jaminan); + $sheet->setCellValue('G' . $row, $row2['TanggalKirim']); + $sheet->setCellValue('H' . $row, $data['TanggalPelayanan']); + $sheet->setCellValue('I' . $row, $data['TanggalPanggil']); + $sheet->setCellValue('J' . $row, $data['TanggalSelesai']); + $sheet->setCellValue('K' . $row, $jam2 . ' Menit'); + $sheet->setCellValue('L' . $row, $status); + $row++; + } + + $this->autoSizeColumns($sheet, count($headers)); + $this->applyTableStyle($sheet, 3, $row - 1, count($headers)); + } + + /** + * Membuat sheet untuk farmasi non racikan + */ + private function createSheetFarmasiNonRacikan($Tanggal) + { + $sheet = $this->spreadsheet->createSheet(); + $sheet->setTitle('Tunggu Farmasi Non Racikan'); + + // Header + $headers = [ + 'No', + 'RegID', + 'MEDRECID', + 'Nama', + 'Departemen', + 'Jaminan', + 'Kirim Resep', + 'Waktu Pelayanan Farmasi', + 'Waktu Panggil Farmasi', + 'Waktu Selesai Farmasi', + 'Waktu Tunggu', + 'Status' + ]; + + $startRow = $this->setSimpleTitle($sheet, 'Waktu Tunggu Farmasi Non Racikan', count($headers), $Tanggal); + $startRow = $this->setHeaders($sheet, $headers, $startRow); + + // $farmasiF = "select TanggalCetak,RegID, TanggalPanggil,TanggalPelayanan, TanggalSelesai from nomor where Tanggal = '$Tanggal' and Panggil= '1' and Prefix = 'F'"; + $farmasiF = "select TanggalCetak,RegID,TrxID,TanggalPanggil,TanggalPelayanan, TanggalSelesai from nomor where Tanggal = '$Tanggal' and Panggil= '1' and Prefix = 'F'"; + $stmt = $this->koneksifarmasi->prepare($farmasiF); + $stmt->execute(); + $result = $stmt->get_result(); + + $row = $startRow; + $no = 1; + while ($data = $result->fetch_assoc()) { + $sql2 = "select ResepID,RegID,TrxID from trxdepartemen where TrxID = '$data[TrxID]' limit 1"; + $query = mysqli_query($this->koneksi, $sql2); + $row3 = mysqli_fetch_array($query); + + $sql = "select a.RegID, a.MEDRECID, a.Nama, b.Nama as NamaDepartemen, c.Nama as NamaPerusahaan, a.JenisPasienID from regpas a + left join departemen b on a.DepartemenID=b.DepartemenID + left join perusahaan c on a.PerusahaanID=c.PerusahaanID + where a.RegID = '$data[RegID]' limit 1"; + $query = mysqli_query($this->koneksi, $sql); + $row1 = mysqli_fetch_array($query); + + // $sql = "select Tanggal as TanggalKirim from resep where RegID = '$data[RegID]' and StatusID = '2' and v2 = 'N' limit 1"; + $sql = "select Tanggal as TanggalKirim from resep where ResepID = '$row3[ResepID]' and StatusID = '2' and v2 = 'N' limit 1"; + $query = mysqli_query($this->koneksi, $sql); + $row2 = mysqli_fetch_array($query); + + if (empty($row2)) { + $TanggalAwal = $data['TanggalCetak']; + } else { + $TanggalAwal = $row2['TanggalKirim']; + } + + $TanggalCetak = new DateTime($TanggalAwal); + // $TanggalCetak = new DateTime($row2['TanggalKirim']); + $TanggalSelesai = new DateTime($data['TanggalPanggil']); + $bedanya3 = $TanggalSelesai->diff($TanggalCetak); + //$harikeseluruhan = $bedanya->format('%d'); + $jam3 = ($bedanya3->format('%d') * 24 * 60 * 60) + ($bedanya3->format('%h') * 60) + $bedanya3->format('%i'); + //$jamkeseluruhan = $bedanya->format('%H:%I'); + if ($jam3 < 20) { + $status = 'Kurang dari 20 menit'; + } else if ($jam3 >= 20 && $jam3 < 40) { + $status = '20 sampai 40 menit'; + } else if ($jam3 >= 40) { + $status = 'Lebih dari 40 menit'; + } + + if ($row1['JenisPasienID'] == 0) { + $jaminan = 'Umum'; + } else { + $jaminan = $row1['NamaPerusahaan']; + } + + $sheet->setCellValue('A' . $row, $no++); + $sheet->setCellValue('B' . $row, $data['RegID']); + $sheet->setCellValue('C' . $row, $row1['MEDRECID']); + $sheet->setCellValue('D' . $row, $row1['Nama']); + $sheet->setCellValue('E' . $row, $row1['NamaDepartemen']); + $sheet->setCellValue('F' . $row, $jaminan); + $sheet->setCellValue('G' . $row, $row2['TanggalKirim']); + $sheet->setCellValue('H' . $row, $data['TanggalPelayanan']); + $sheet->setCellValue('I' . $row, $data['TanggalPanggil']); + $sheet->setCellValue('J' . $row, $data['TanggalSelesai']); + $sheet->setCellValue('K' . $row, $jam3 . ' Menit'); + $sheet->setCellValue('L' . $row, $status); + $row++; + } + + $this->autoSizeColumns($sheet, count($headers)); + $this->applyTableStyle($sheet, 3, $row - 1, count($headers)); + } + + /** + * Membuat sheet untuk import resep + */ + private function createSheetFarmasiImportResep($Tanggal) + { + $sheet = $this->spreadsheet->createSheet(); + $sheet->setTitle('Import Resep'); + + // Header + $headers = [ + 'No', + 'RegID', + 'MEDRECID', + 'Nama', + 'Departemen', + 'Jaminan', + 'Dokter', + 'Waktu Resep', + 'Waktu Import Resep', + 'Waktu Tunggu', + 'Status' + ]; + + $startRow = $this->setSimpleTitle($sheet, 'Waktu Tunggu Resep Import', count($headers), $Tanggal); + $startRow = $this->setHeaders($sheet, $headers, $startRow); + + $queryimport = "select c.Nama, c.MEDRECID, d.Nama as NamaDepartemen, c.JenisPasienID as JenisPasien, f.Nama as NamaPerusahaan, e.Nama as NamaDokter, r.Tanggal as TanggalBikin, r.ResepID,r.RegID + from resep r + left join departemen d on r.DepartemenID = d.DepartemenID + left join regpas c on c.RegID = r.RegID + left join dokter e on e.DokterID = r.DokterID + left join perusahaan f on f.PerusahaanID=c.PerusahaanID + where r.Tanggal between '$Tanggal 00:00:01' and '$Tanggal 23:59:59' + and r.StatusID = '2' + and r.v2 = 'N' + and d.RJ = '1'"; + + $stmt = $this->koneksi->prepare($queryimport); + $stmt->execute(); + $result = $stmt->get_result(); + + $row = $startRow; + $no = 0; + while ($data = $result->fetch_assoc()) { + + $sql = "select Tanggal as TanggalTrxDepartemen from trxdepartemen where ResepID = '$data[ResepID]' limit 1"; + $query = mysqli_query($this->koneksi, $sql); + $row2 = mysqli_fetch_array($query); + + $TanggalBikin = new DateTime($data['TanggalBikin']); + $TanggalTrxDepartemen = new DateTime($row2['TanggalTrxDepartemen']); + $bedanya3 = $TanggalTrxDepartemen->diff($TanggalBikin); + //$harikeseluruhan = $bedanya->format('%d'); + $jam3 = ($bedanya3->format('%d') * 24 * 60 * 60) + ($bedanya3->format('%h') * 60) + $bedanya3->format('%i'); + //$jamkeseluruhan = $bedanya->format('%H:%I'); + if ($jam3 < 5) { + $status = 'Kurang dari 5 menit'; + } else if ($jam3 >= 5 && $jam3 < 15) { + $status = '5 Sampai Dengan 15 menit'; + } else if ($jam3 >= 15) { + $status = 'Lebih dari 15 menit'; + } + + if ($data['JenisPasien'] == 0) { + $jaminan = 'Umum'; + } else { + $jaminan = $data['NamaPerusahaan']; + } + + $sheet->setCellValue('A' . $row, $no++); + $sheet->setCellValue('B' . $row, $data['RegID']); + $sheet->setCellValue('C' . $row, $data['MEDRECID']); + $sheet->setCellValue('D' . $row, $data['Nama']); + $sheet->setCellValue('E' . $row, $data['NamaDepartemen']); + $sheet->setCellValue('F' . $row, $jaminan); + $sheet->setCellValue('G' . $row, $data['NamaDokter']); + $sheet->setCellValue('H' . $row, $data['TanggalBikin']); + $sheet->setCellValue('I' . $row, $row2['TanggalTrxDepartemen']); + $sheet->setCellValue('J' . $row, $jam3 . ' Menit'); + $sheet->setCellValue('K' . $row, $status); + $row++; + } + + $this->autoSizeColumns($sheet, count($headers)); + $this->applyTableStyle($sheet, 3, $row - 1, count($headers)); + } + + /** + * Membuat sheet untuk waktu visit dokter + */ + private function createSheetVisitDokter($Tanggal) + { + $sheet = $this->spreadsheet->createSheet(); + $sheet->setTitle('Visit Dokter'); + + // Header + $headers = [ + 'No', + 'RegID', + 'MEDRECID', + 'Nama', + 'Departemen', + 'Jaminan', + 'Dokter', + 'Tanggal Daftar', + 'Waktu Visite', + 'Status' + ]; + + $startRow = $this->setSimpleTitle($sheet, 'Waktu Visite Dokter', count($headers), $Tanggal); + $startRow = $this->setHeaders($sheet, $headers, $startRow); + + $tanggalKemarin = date('Y-m-d', strtotime($Tanggal . ' -1 day')); + $qvisite = "select a.RegID, a.MEDRECID, a.Nama as NamaPasien, b.Nama as NamaDepartemen, d.Nama as NamaPerusahaan, c.Nama as NamaDokter, a.JenisPasienID, a.DokterID, a.Tanggal from regpas as a + left join departemen b on a.DepartemenID = b.DepartemenID + left join dokter c on c.DokterID = a.DokterID + left join perusahaan d on d.PerusahaanID=a.PerusahaanID + where a.JenisRegID = '1' + and a.Pulang = 'N' + and a.BolehPulang = 'N' + and a.NA= 'N' + and a.Tanggal <= '$tanggalKemarin 16:00:00'"; + + $stmt = $this->koneksi->prepare($qvisite); + $stmt->execute(); + $result = $stmt->get_result(); + + $row = $startRow; + $no = 1; + while ($data = $result->fetch_assoc()) { + $RegID = $data['RegID']; + $DokterID = $data['DokterID']; + + $sqluserdokter = "select UserID from user where DokterID = '$data[DokterID]'"; + $queryuserdokter = mysqli_query($this->koneksi, $sqluserdokter); + $rowuserdokter = mysqli_fetch_array($queryuserdokter); + + $sqlcatatan = "select Oleh, TanggalBuat from catatan where Oleh = '$rowuserdokter[UserID]' and RegID = '$RegID' and Judul = 'Ctt. Terintegrasi' + and TanggalBuat between '$Tanggal 00:00:01' and '$Tanggal 23:59:59' order by TanggalBuat desc limit 1"; + $querycatatan = mysqli_query($this->koneksi, $sqlcatatan); + $rowcatatan = mysqli_fetch_array($querycatatan); + + if (empty($rowcatatan['TanggalBuat'])) { + $status = 'Belum visite'; + } else { + $tanggalBuat = new DateTime($rowcatatan['TanggalBuat']); + $batas = new DateTime($Tanggal . " 11:00:00"); + + if ($tanggalBuat > $batas) { + // $visitediatasjam11++; + $status = 'Visite lebih dari jam 11'; + } else { + $status = 'Visite kurang dari jam 11'; + } + } + if ($data['JenisPasienID'] == 0) { + $jaminan = 'Umum'; + } else { + $jaminan = $data['NamaPerusahaan']; + } + + $sheet->setCellValue('A' . $row, $no++); + $sheet->setCellValue('B' . $row, $data['RegID']); + $sheet->setCellValue('C' . $row, $data['MEDRECID']); + $sheet->setCellValue('D' . $row, $data['NamaPasien']); + $sheet->setCellValue('E' . $row, $data['NamaDepartemen']); + $sheet->setCellValue('F' . $row, $jaminan); + $sheet->setCellValue('G' . $row, $data['NamaDokter']); + $sheet->setCellValue('H' . $row, $data['Tanggal']); + $sheet->setCellValue('I' . $row, $rowcatatan['TanggalBuat']); + $sheet->setCellValue('J' . $row, $status); + $row++; + } + + $this->autoSizeColumns($sheet, count($headers)); + $this->applyTableStyle($sheet, 3, $row - 1, count($headers)); + } + + /** + * Membuat sheet untuk waktu buka poli + */ + private function createSheetWaktuBukaPoli($Tanggal, $EXRJ) + { + $sheet = $this->spreadsheet->createSheet(); + $sheet->setTitle('Ketepatan Buka Poli'); + + // Header + $headers = [ + 'No', + 'Nama Dokter', + 'Jam Praktek', + 'Jam Mulai Poli', + 'Selisih', + 'Status' + ]; + + $startRow = $this->setSimpleTitle($sheet, 'Ketepatan Dokter Buka Poli', count($headers), $Tanggal); + $startRow = $this->setHeaders($sheet, $headers, $startRow); + + $HariKe = date('N', strtotime($Tanggal)); + + + //$HariKe = 1; + $qsoapperdana = "select m.JadwalID, m.DokterID, d.Nama as NamaDokter from masterjadwaldokter m + left join dokter d Using(DokterID) + where m.HariID = '$HariKe' and m.NA = 'N' and d.NA = 'N' and d.Tipe not in ('Umum','') and m.DepartemenID not in $EXRJ"; + + $stmt = $this->koneksi->prepare($qsoapperdana); + $stmt->execute(); + $result = $stmt->get_result(); + + $row = $startRow; + $no = 1; + while ($data = $result->fetch_assoc()) { + $JadwalID = $data['JadwalID']; + $DokterID = $data['DokterID']; + + $sqljadwal = "SELECT Jam FROM masterjadwaldokterjam WHERE JadwalID = '$JadwalID' ORDER BY Jam ASC "; + $queryjadwal = mysqli_query($this->koneksi, $sqljadwal); + $rowjadwal = mysqli_fetch_array($queryjadwal); + //10:00:00 + //$batas = new DateTime($Tanggal . " 11:00:00"); + $Jampraktekawal = $rowjadwal['Jam']; + + $cutidokter = "SELECT Tanggal as TanggalCuti , Catatan FROM cutidokter where DokterID = '$DokterID' and Tanggal ='$Tanggal' + order by Tanggal Asc limit 1 "; + $cuti = mysqli_query($this->koneksi, $cutidokter); + $rowcutidokter = mysqli_fetch_array($cuti); + + $sqlsoappertama = "SELECT Tanggal as soappertama , RegID FROM detail_pemeriksaan_rj where DokterID = '$DokterID' and Tanggal between '$Tanggal 00:00:01' and '$Tanggal 23:59:59' + order by Tanggal Asc limit 1 "; + $querysoappertama = mysqli_query($this->koneksi, $sqlsoappertama); + $rowsoappertama = mysqli_fetch_array($querysoappertama); + $RegID = $rowsoappertama['RegID']; + + $Jampraktek = new DateTime($Tanggal . " $Jampraktekawal"); + $JampraktekStr = $Jampraktek->format('Y-m-d H:i:s'); + $tanggalBuatsoappertama = new DateTime($rowsoappertama['soappertama']); + $tanggalBuatsoappertamaPlus1jam = clone $tanggalBuatsoappertama; + $tanggalBuatsoappertamaPlus1jam->sub(new DateInterval('PT1H')); // tambah 1 jam ke depan + + + $JampBuatsoap = ''; + $waktu = ''; + $nilai = ''; + if (empty($rowsoappertama['soappertama'])) { + $status = 'Poli belum dimulai'; + } else if (!empty($rowcutidokter['Catatan'])) { + $status = 'Cuti'; + } else { + $JampBuatsoap = $tanggalBuatsoappertama->format('H:i:s'); + $bedanya3 = $Jampraktek->diff($tanggalBuatsoappertama); + $jam3 = ($bedanya3->format('%d') * 24 * 60 * 60) + ($bedanya3->format('%h') * 60) + $bedanya3->format('%i'); + if ($Jampraktek >= $tanggalBuatsoappertama) { + $status = 'Poli Ontime'; + $nilai = '+'; + $waktu = $nilai . ' ' . $jam3 . ' Menit'; + $sheet->setCellValue('A' . $row, $no++); + $sheet->setCellValue('B' . $row, $data['NamaDokter']); + $sheet->setCellValue('C' . $row, $Jampraktekawal); + $sheet->setCellValue('D' . $row, $JampBuatsoap); + $sheet->setCellValue('E' . $row, $waktu); + $sheet->setCellValue('F' . $row, $status); + $row++; + } else { + $status = 'Poli tidak Ontime'; + $nilai = '-'; + $waktu = $nilai . ' ' . $jam3 . ' Menit'; + $sheet->setCellValue('A' . $row, $no++); + $sheet->setCellValue('B' . $row, $data['NamaDokter']); + $sheet->setCellValue('C' . $row, $Jampraktekawal); + $sheet->setCellValue('D' . $row, $JampBuatsoap); + $sheet->setCellValue('E' . $row, $waktu); + $sheet->setCellValue('F' . $row, $status); + $row++; + } + } + + + // $sheet->setCellValue('A' . $row, $no++); + // $sheet->setCellValue('B' . $row, $data['NamaDokter']); + // $sheet->setCellValue('C' . $row, $Jampraktekawal); + // $sheet->setCellValue('D' . $row, $JampBuatsoap); + // $sheet->setCellValue('E' . $row, $waktu); + // $sheet->setCellValue('F' . $row, $status); + // $row++; + } + + $this->autoSizeColumns($sheet, count($headers)); + $this->applyTableStyle($sheet, 3, $row - 1, count($headers)); + } + + /** + * Set judul sederhana untuk sheet + */ + private function setSimpleTitle($sheet, $title, $columnCount = 8, $tanggal = '') + { + // Set judul di baris pertama + $sheet->setCellValue('A1', $title); + + // Merge cells untuk judul + $lastColumn = $this->getColumnLetter($columnCount); + $sheet->mergeCells('A1:' . $lastColumn . '1'); + + // Style sederhana untuk judul + $titleStyle = [ + 'font' => [ + 'bold' => true, + 'size' => 14, + ], + 'alignment' => [ + 'horizontal' => Alignment::HORIZONTAL_CENTER, + ], + ]; + + $sheet->getStyle('A1:' . $lastColumn . '1')->applyFromArray($titleStyle); + + // Set tanggal di baris kedua (jika ada tanggal) + if (!empty($tanggal)) { + $dateText = 'Tanggal: ' . date('d/m/Y', strtotime($tanggal)); + $sheet->setCellValue('A2', $dateText); + $lastColumn2 = $this->getColumnLetter($columnCount); + $sheet->mergeCells('A2:' . $lastColumn2 . '2'); + + // Style untuk baris tanggal + $dateStyle = [ + 'font' => [ + 'bold' => false, + 'size' => 11, + 'color' => ['rgb' => '666666'], + ], + 'alignment' => [ + 'horizontal' => Alignment::HORIZONTAL_LEFT, + ], + ]; + + $sheet->getStyle('A2:' . $lastColumn2 . '2')->applyFromArray($dateStyle); + + return 3; // Return baris berikutnya untuk header + } else { + return 2; // Return baris berikutnya untuk header (tanpa baris tanggal) + } + } + + /** + * Set header untuk sheet + */ + private function setHeaders($sheet, $headers, $startRow = 2) + { + $col = 'A'; + foreach ($headers as $header) { + $sheet->setCellValue($col . $startRow, $header); + $col++; + } + + // Style header + $headerStyle = [ + 'font' => [ + 'bold' => true, + 'color' => ['rgb' => 'FFFFFF'], + ], + 'fill' => [ + 'fillType' => Fill::FILL_SOLID, + 'startColor' => ['rgb' => '4472C4'], + ], + 'alignment' => [ + 'horizontal' => Alignment::HORIZONTAL_CENTER, + 'vertical' => Alignment::VERTICAL_CENTER, + ], + ]; + + $sheet->getStyle('A' . $startRow . ':' . $col . $startRow)->applyFromArray($headerStyle); + + return $startRow + 1; // Return baris berikutnya untuk data + } + + /** + * Auto size columns + */ + private function autoSizeColumns($sheet, $columnCount) + { + for ($i = 1; $i <= $columnCount; $i++) { + $sheet->getColumnDimensionByColumn($i)->setAutoSize(true); + } + } + + /** + * Apply table style dengan deteksi otomatis baris mulai + */ + private function applyTableStyle($sheet, $startRow, $endRow, $columnCount) + { + $styleArray = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ], + 'alignment' => [ + 'vertical' => Alignment::VERTICAL_CENTER, + ], + ]; + + $sheet->getStyle('A' . $startRow . ':' . $this->getColumnLetter($columnCount) . $endRow)->applyFromArray($styleArray); + } + + /** + * Get column letter from number + */ + private function getColumnLetter($columnNumber) + { + $letter = ''; + while ($columnNumber > 0) { + $columnNumber--; + $letter = chr(65 + ($columnNumber % 26)) . $letter; + $columnNumber = intval($columnNumber / 26); + } + return $letter; + } + + /** + * Download file Excel + */ + public function download($filename = 'data_pasien.xlsx') + { + $writer = new Xlsx($this->spreadsheet); + + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + header('Content-Disposition: attachment;filename="' . $filename . '"'); + header('Cache-Control: max-age=0'); + + $writer->save('php://output'); + exit; + } +} + +// Contoh penggunaan +if (isset($_GET['Tanggal'])) { + $Tanggal = $_GET['Tanggal']; + if ($Tanggal == '') { + $Tanggal = date('Y-m-d'); + } + $exporter = new ExcelExporter($koneksi, $koneksifarmasi); + $exporter->exportDataPasien($Tanggal, $EXRJ); + $exporter->download('laporan_pasien_' . $Tanggal . '.xlsx'); +} +?> + + + + + + + + Export Data ke Excel + + + + +
+

Export Data ke Excel

+ +
+ Informasi: Data akan di-export ke Excel dengan 5 sheet: +
    +
  • Rawat Jalan
  • +
  • Rawat Inap
  • +
  • UGD
  • +
  • Farmasi
  • +
  • Rekap Harian
  • +
+
+ +
+
+ + +
+ +
+ + +
+ + +
+
+ + + \ No newline at end of file diff --git a/internal/http/handler.go b/internal/http/handler.go index 03ad0b6..50f238f 100644 --- a/internal/http/handler.go +++ b/internal/http/handler.go @@ -64,6 +64,10 @@ type DokterRepository interface { ListDokter(ctx context.Context, params repository.DokterListParams) (repository.DokterPage, error) } +type LaporanMCURepository interface { + ListLaporanMCU(ctx context.Context, params repository.LaporanMCUParams) ([]repository.LaporanMCURow, error) +} + type Handler struct { layananRepo LayananRepository labRepo LabRegistrationRepository @@ -76,6 +80,7 @@ type Handler struct { periodeTarifDetailRepo PeriodeTarifDetailRepository perusahaanRepo PerusahaanRepository dokterRepo DokterRepository + laporanMCURepo LaporanMCURepository hospitalCode string departmentID string } @@ -95,12 +100,19 @@ type CPONERepository interface { } func NewHandler(repo CPONERepository) Handler { - return Handler{ + handler := Handler{ layananRepo: repo, labRepo: repo, patientRepo: repo, registrationRepo: repo, labResultRepo: repo, paketRepo: repo, tarifRepo: repo, periodeTarifRepo: repo, periodeTarifDetailRepo: repo, perusahaanRepo: repo, dokterRepo: repo, } + // Keep NewHandler source-compatible with repositories created before the + // MCU report was added. The concrete MySQL repository implements this + // optional capability and the dynamic production handler uses it. + if reportRepo, ok := any(repo).(LaporanMCURepository); ok { + handler.laporanMCURepo = reportRepo + } + return handler } func NewDynamicHandler(hospitalCode string, departmentID string) Handler { @@ -187,6 +199,13 @@ func (h Handler) dokterRepository(ctx context.Context) DokterRepository { return h.dokterRepo } +func (h Handler) laporanMCURepository(ctx context.Context) LaporanMCURepository { + if repo, ok := selectedRepository(ctx); ok { + return repo + } + return h.laporanMCURepo +} + func (h Handler) MappingHarga(w http.ResponseWriter, r *http.Request) { layananIDs := parseLayananIDs(r) if len(layananIDs) == 0 { diff --git a/internal/http/laporan_mcu.go b/internal/http/laporan_mcu.go new file mode 100644 index 0000000..d28fd52 --- /dev/null +++ b/internal/http/laporan_mcu.go @@ -0,0 +1,72 @@ +package http + +import ( + "net/http" + "strings" + "time" + + "primaya-api/cpone-middleware/internal/repository" +) + +// ListLaporanMCU exposes the data formerly produced as mcu.xls by +// docs/lap_mcu.php. The API keeps the same lower-case date parameters as the +// PHP script and returns the spreadsheet rows as JSON data. +func (h Handler) ListLaporanMCU(w http.ResponseWriter, r *http.Request) { + tanggal, ok := firstQueryValue(r, "tanggal", "Tanggal") + if !ok || strings.TrimSpace(tanggal) == "" { + WriteJSON(w, http.StatusUnprocessableEntity, Response{ + Success: false, Message: "Parameter tanggal wajib diisi", Data: nil, + }) + return + } + tanggal2, ok := firstQueryValue(r, "tanggal2", "Tanggal2") + if !ok || strings.TrimSpace(tanggal2) == "" { + WriteJSON(w, http.StatusUnprocessableEntity, Response{ + Success: false, Message: "Parameter tanggal2 wajib diisi", Data: nil, + }) + return + } + + start, err := parseReportDate(tanggal) + if err != nil { + WriteJSON(w, http.StatusUnprocessableEntity, Response{ + Success: false, Message: "Parameter tanggal harus format Y-m-d", Data: nil, + }) + return + } + end, err := parseReportDate(tanggal2) + if err != nil { + WriteJSON(w, http.StatusUnprocessableEntity, Response{ + Success: false, Message: "Parameter tanggal2 harus format Y-m-d", Data: nil, + }) + return + } + if end.Before(start) { + WriteJSON(w, http.StatusUnprocessableEntity, Response{ + Success: false, Message: "Parameter tanggal2 tidak boleh lebih kecil dari tanggal", Data: nil, + }) + return + } + + rows, err := h.laporanMCURepository(r.Context()).ListLaporanMCU(r.Context(), repository.LaporanMCUParams{ + Tanggal: start.Format("2006-01-02"), Tanggal2: end.Format("2006-01-02"), + }) + if err != nil { + WriteJSON(w, http.StatusInternalServerError, Response{ + Success: false, Message: "internal server error", Data: nil, + }) + return + } + + WriteJSON(w, http.StatusOK, Response{Success: true, Message: "ok", Data: rows}) +} + +// GetLaporanMCU is an explicit alias for callers that use the Get naming +// convention for report endpoints. +func (h Handler) GetLaporanMCU(w http.ResponseWriter, r *http.Request) { + h.ListLaporanMCU(w, r) +} + +func parseReportDate(value string) (time.Time, error) { + return time.Parse("2006-01-02", strings.TrimSpace(value)) +} diff --git a/internal/http/laporan_mcu_test.go b/internal/http/laporan_mcu_test.go new file mode 100644 index 0000000..44899c5 --- /dev/null +++ b/internal/http/laporan_mcu_test.go @@ -0,0 +1,74 @@ +package http + +import ( + "context" + "errors" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "primaya-api/cpone-middleware/internal/repository" +) + +type fakeLaporanMCURepository struct { + rows []repository.LaporanMCURow + err error + params repository.LaporanMCUParams +} + +func (f *fakeLaporanMCURepository) ListLaporanMCU(_ context.Context, params repository.LaporanMCUParams) ([]repository.LaporanMCURow, error) { + f.params = params + return f.rows, f.err +} + +func TestListLaporanMCUResponseAndDateRange(t *testing.T) { + regID := "MCU260900001" + repo := &fakeLaporanMCURepository{rows: []repository.LaporanMCURow{{No: 1, RegID: ®ID}}} + handler := Handler{laporanMCURepo: repo} + recorder := httptest.NewRecorder() + request := httptest.NewRequest(http.MethodGet, "/api/cpone/reports/mcu?tanggal=2026-09-01&tanggal2=2026-09-07", nil) + + handler.ListLaporanMCU(recorder, request) + + if recorder.Code != http.StatusOK { + t.Fatalf("status=%d body=%s", recorder.Code, recorder.Body.String()) + } + if repo.params.Tanggal != "2026-09-01" || repo.params.Tanggal2 != "2026-09-07" { + t.Fatalf("params=%+v", repo.params) + } + for _, expected := range []string{`"success":true`, `"message":"ok"`, `"No":1`, `"RegID":"MCU260900001"`} { + if !strings.Contains(recorder.Body.String(), expected) { + t.Fatalf("response missing %s: %s", expected, recorder.Body.String()) + } + } +} + +func TestListLaporanMCUValidatesDateRange(t *testing.T) { + repo := &fakeLaporanMCURepository{} + handler := Handler{laporanMCURepo: repo} + for target := range map[string]struct{}{ + "/api/cpone/reports/mcu": {}, + "/api/cpone/reports/mcu?tanggal=01-09-2026&tanggal2=2026-09-07": {}, + "/api/cpone/reports/mcu?tanggal=2026-09-08&tanggal2=2026-09-07": {}, + "/api/cpone/reports/mcu?tanggal=2026-09-01&tanggal2=not-a-date": {}, + } { + recorder := httptest.NewRecorder() + handler.ListLaporanMCU(recorder, httptest.NewRequest(http.MethodGet, target, nil)) + if recorder.Code != http.StatusUnprocessableEntity { + t.Fatalf("target=%s status=%d body=%s", target, recorder.Code, recorder.Body.String()) + } + } + if repo.params != (repository.LaporanMCUParams{}) { + t.Fatalf("repository should not be called for invalid dates: %+v", repo.params) + } +} + +func TestListLaporanMCUInternalError(t *testing.T) { + handler := Handler{laporanMCURepo: &fakeLaporanMCURepository{err: errors.New("database unavailable")}} + recorder := httptest.NewRecorder() + handler.ListLaporanMCU(recorder, httptest.NewRequest(http.MethodGet, "/api/cpone/reports/mcu?tanggal=2026-09-01&tanggal2=2026-09-01", nil)) + if recorder.Code != http.StatusInternalServerError { + t.Fatalf("status=%d body=%s", recorder.Code, recorder.Body.String()) + } +} diff --git a/internal/repository/laporan_mcu.go b/internal/repository/laporan_mcu.go new file mode 100644 index 0000000..e47e939 --- /dev/null +++ b/internal/repository/laporan_mcu.go @@ -0,0 +1,326 @@ +package repository + +import ( + "context" + "database/sql" +) + +// LaporanMCUParams is the date range used by docs/lap_mcu.php. The bounds are +// deliberately second-based because the legacy report queried +// "tanggal 00:00:01" through "tanggal2 23:59:59". +type LaporanMCUParams struct { + Tanggal string + Tanggal2 string +} + +// LaporanMCURow contains the columns that the legacy Excel report writes. +// Nullable values remain pointers so an absent HIS record is represented as +// null by the API, while values for which the PHP report supplied a fallback +// are always non-null. +type LaporanMCURow struct { + No int `json:"No"` + RegID *string `json:"RegID"` + MEDRECID *string `json:"MEDRECID"` + NamaPasien *string `json:"NamaPasien"` + JenisKelamin *string `json:"JenisKelamin"` + TanggalLahir *string `json:"TanggalLahir"` + Umur *int64 `json:"Umur"` + TanggalMCU *string `json:"TanggalMCU"` + NamaPenanggung *string `json:"NamaPenanggung"` + DokterMCU *string `json:"DokterMCU"` + InstansiKerja *string `json:"InstansiKerja"` + TinggiBadan *string `json:"TinggiBadan"` + BeratBadan *string `json:"BeratBadan"` + TekananDarah *string `json:"TekananDarah"` + Nadi *string `json:"Nadi"` + Suhu *string `json:"Suhu"` + Pernafasan *string `json:"Pernafasan"` + Diabetes *string `json:"Diabetes"` + Hipertensi *string `json:"Hipertensi"` + Dyslipidemia *string `json:"Dyslipidemia"` + Jantung *string `json:"Jantung"` + Stroke *string `json:"Stroke"` + Asma *string `json:"Asma"` + Paru *string `json:"Paru"` + RiwayatCidera *string `json:"RiwayatCidera"` + RiwayatRawatInap *string `json:"RiwayatRawatInap"` + RiwayatOperasi *string `json:"RiwayatOperasi"` + LainLain *string `json:"LainLain"` + DiabetesKeluarga *string `json:"DiabetesKeluarga"` + HipertensiKeluarga *string `json:"HipertensiKeluarga"` + DyslipidemiaKeluarga *string `json:"DyslipidemiaKeluarga"` + JantungKeluarga *string `json:"JantungKeluarga"` + StrokeKeluarga *string `json:"StrokeKeluarga"` + AsmaKeluarga *string `json:"AsmaKeluarga"` + ParuKeluarga *string `json:"ParuKeluarga"` + RiwayatCideraKeluarga *string `json:"RiwayatCideraKeluarga"` + RiwayatRawatInapKeluarga *string `json:"RiwayatRawatInapKeluarga"` + RiwayatOperasiKeluarga *string `json:"RiwayatOperasiKeluarga"` + LainLainKeluarga *string `json:"LainLainKeluarga"` + AlergiObat *string `json:"AlergiObat"` + AlergiMakanan *string `json:"AlergiMakanan"` + AlergiLain *string `json:"AlergiLain"` + Merokok *string `json:"Merokok"` + Alkohol *string `json:"Alkohol"` + Olahraga *string `json:"Olahraga"` + KeadaanUmum *string `json:"KeadaanUmum"` + KeadaanSakit *string `json:"KeadaanSakit"` + StatusGizi *string `json:"StatusGizi"` + Kesadaran *string `json:"Kesadaran"` + ColourBlindness *string `json:"ColourBlindness"` + VisusDekat *string `json:"VisusDekat"` + KelainananMataLain *string `json:"KelainananMataLain"` + Faring *string `json:"Faring"` + Tonsil *string `json:"Tonsil"` + MulutLainLain *string `json:"MulutLainLain"` + KelainanGigi *string `json:"KelainanGigi"` + ParuLain *string `json:"ParuLain"` + JantungLain *string `json:"JantungLain"` + Hernia *string `json:"Hernia"` + KeluhanUtama *string `json:"KeluhanUtama"` + PenyakitSekarang *string `json:"PenyakitSekarang"` + PenyakitDahulu *string `json:"PenyakitDahulu"` + ECG *string `json:"ECG"` + Audiometri *string `json:"Audiometri"` + Spirometri *string `json:"Spirometri"` + PemeriksaanLainLain *string `json:"PemeriksaanLainLain"` + SaranKesehatanKerja *string `json:"SaranKesehatanKerja"` + Kebisingan *string `json:"Kebisingan"` + SuhuPanas *string `json:"SuhuPanas"` + SuhuDingin *string `json:"SuhuDingin"` + RadiasiBukanPengion *string `json:"RadiasiBukanPengion"` + RadiasiPengion *string `json:"RadiasiPengion"` + GetaranLokal *string `json:"GetaranLokal"` + GetaranSeluruhTubuh *string `json:"GetaranSeluruhTubuh"` + Ketinggian *string `json:"Ketinggian"` + LainLainAkibatKerja *string `json:"LainLainAkibatKerja"` + DebuOrganik *string `json:"DebuOrganik"` + DebuAnorganik *string `json:"DebuAnorganik"` + Asap *string `json:"Asap"` + LogamBerat *string `json:"LogamBerat"` + PelarutOrganik *string `json:"PelarutOrganik"` + IritanAsam *string `json:"IritanAsam"` + IritanBasa *string `json:"IritanBasa"` + CairanPembersih *string `json:"CairanPembersih"` + Pestisida *string `json:"Pestisida"` + UapLogam *string `json:"UapLogam"` + BahayaKimiaLain *string `json:"BahayaKimiaLain"` + Bakteri *string `json:"Bakteri"` + CairanTubuh *string `json:"CairanTubuh"` + Serangga *string `json:"Serangga"` + Limbah *string `json:"Limbah"` + BiologiLain *string `json:"BiologiLain"` + Overload *string `json:"Overload"` + Mismatch *string `json:"Mismatch"` + KetidakJelasan *string `json:"KetidakJelasan"` + HambatanJenjangKarir *string `json:"HambatanJenjangKarir"` + KerjaShift *string `json:"KerjaShift"` + KonflikTeman *string `json:"KonflikTeman"` + KonflikKeluarga *string `json:"KonflikKeluarga"` + PsikologisLain *string `json:"PsikologisLain"` + TanganBergerakUlang *string `json:"TanganBergerakUlang"` + AngkatBerat *string `json:"AngkatBerat"` + DudukLama *string `json:"DudukLama"` + BerdiriLama *string `json:"BerdiriLama"` + PosisiTubuhTidakErgonomis *string `json:"PosisiTubuhTidakErgonomis"` + PencahayaanTidakSesuai *string `json:"PencahayaanTidakSesuai"` + LihatMonitorLama *string `json:"LihatMonitorLama"` + ErgonomisLain *string `json:"ErgonomisLain"` + VisusJauhTanpaKoreksiVOD *string `json:"VisusJauhTanpaKoreksiVOD"` + VisusJauhTanpaKoreksiVOS *string `json:"VisusJauhTanpaKoreksiVOS"` + VisusJauhDenganKoreksiVOD *string `json:"VisusJauhDenganKoreksiVOD"` + VisusJauhDenganKoreksiVOS *string `json:"VisusJauhDenganKoreksiVOS"` + Pekerjaan *string `json:"Pekerjaan"` + DokterPemeriksa *string `json:"DokterPemeriksa"` +} + +func (r MySQLLayananRepository) ListLaporanMCU(ctx context.Context, params LaporanMCUParams) ([]LaporanMCURow, error) { + rows, err := r.db.QueryContext(ctx, laporanMCUQuery, params.Tanggal+" 00:00:01", params.Tanggal2+" 23:59:59") + if err != nil { + return nil, err + } + defer rows.Close() + + result := make([]LaporanMCURow, 0) + for rows.Next() { + row, err := scanLaporanMCURow(rows) + if err != nil { + return nil, err + } + row.No = len(result) + 1 + result = append(result, row) + } + if err := rows.Err(); err != nil { + return nil, err + } + return result, nil +} + +const laporanMCUQuery = ` +SELECT + r.RegID, r.MEDRECID, r.Nama, + CASE WHEN m.Kelamin = 'L' THEN 'Laki - Laki' ELSE 'Perempuan' END, + DATE_FORMAT(m.TanggalLahir, '%Y-%m-%d'), TIMESTAMPDIFF(YEAR, m.TanggalLahir, CURDATE()), + DATE_FORMAT(r.Tanggal, '%Y-%m-%d %H:%i:%s'), + COALESCE(NULLIF(p.Nama, ''), 'UMUM'), d.Nama, pm.DepartemenKerja, + rd.TinggiBadan, rd.BeratBadan, tv.Tekanandarah, tv.Nadi, tv.Suhu, tv.Pernafasan, + COALESCE(NULLIF(rpd.DiabetesDahuluAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpd.HipertensiDahuluAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpd.KelebihanLemakDahuluAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpd.JantungDahuluAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpd.StrokeDahuluAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpd.AsmaDahuluAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpd.ParuDahuluAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpd.CideraDahuluAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpd.RawatInapDahuluAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpd.OperasiDahuluAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpd.LainLainDahuluAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpk.DiabetesAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpk.HypertensiAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpk.KelebihanLemakAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpk.JantungAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpk.StrokeAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpk.AsmaAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpk.ParuAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpk.CideraAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpk.RawatInapAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpk.OperasiAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(rpk.LainLainAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(ra.AlergiObatAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(ra.AlergiMakananAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(ra.AlergiLainAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(gl.SejakKapanMerokok, ''), 'Tidak Merokok'), + COALESCE(NULLIF(gl.SejakKapanAlkohol, ''), 'Tidak Minum ALkohol'), + COALESCE(NULLIF(gl.KebiasaanOlahragaAda, ''), 'Tidak Olahraga'), + pfu.KeadaanUmum, pfu.KeadaanSakit, pfu.StatusGizi, pfu.Kesadaran, + pmata.ColourBlindness, + COALESCE(NULLIF(pmata.VisusDekatKelainan, ''), 'Normal'), + COALESCE(NULLIF(pmata.MataLainLainAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(ptg.FaringKelainan, ''), 'Normal'), + COALESCE(NULLIF(ptg.TonsilKelainan, ''), 'Tidak Ada'), + COALESCE(NULLIF(pmulut.MulutLainLainAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(pgigi.KelainanGigiAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(pparu.ParuLainLainAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(pjantung.JantungLainLainAda, ''), 'Tidak Ada'), + COALESCE(NULLIF(pabd.HerniaAda, ''), 'Tidak Ada'), + pm.KeluhanUtamaRingkasan, pm.PenyakitSekarangRingkasan, pm.PenyakitDahuluRingkasan, + ph.ECG, ph.Audiometri, ph.Spirometri, pm.PemeriksaanLainLainRingkasan, + pm.SaranKesehatanKerjaRingkasan, + COALESCE(NULLIF(pak.KebisinganAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.SuhuPanasAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.SuhuDinginAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.RadiasiBukanPengionAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.RadiasiPengionAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.GetaranLokalAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.GetaranSeluruhTubuhAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.KetinggianAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.FisikLainLainAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.DebuOrganikAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.DebuAnorganikAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.AsapAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.LogamBeratAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.PelarutOrganikAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.IritanAsamAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.IritanBasaAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.CairanPembersihAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.PestisidaAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.UapLogamAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.BahanKimiaBerbahayaLainLainAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.BakteriAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.CairanTubuhAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.SeranggaAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.LimbahAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.BiologiLainLainAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.OverLoadKerjaanAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.MismatchKerjaanAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.KetidakjelasanTugasAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.HambatanJenjangKarirAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.KerjaShiftAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.KonflikTemanKerjaAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.KonflikKeluargaAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.PsikologisLainLainAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.TanganBergerakBerulangAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.AngkatBebanBeratAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.DudukLamaAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.BerdiriLamaAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.PosisiTubuhTidakErgonomisAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.PencahayaanTidakSesuaiAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.LihatMonitorLamaAda, ''), 'TidakAda'), + COALESCE(NULLIF(pak.ErgonomisLainLainAda, ''), 'TidakAda'), + pmata.VisusJauhTanpaKoreksiVOD, pmata.VisusJauhTanpaKoreksiVOS, + pmata.VisusJauhDenganKoreksiVOD, pmata.VisusJauhDenganKoreksiVOS, + m.Pekerjaan, dp.Nama +FROM regpas AS r +LEFT JOIN medrec AS m ON m.MEDRECID = r.MEDRECID +LEFT JOIN pengkajianmcu AS pm ON pm.RegID = r.RegID +LEFT JOIN dokter AS d ON d.DokterID = r.DokterID +LEFT JOIN dokter AS dp ON dp.DokterID = pm.DokterIDPengkaji +LEFT JOIN perusahaan AS p ON p.PerusahaanID = r.AsuransiID + LEFT JOIN tandavital_pasien AS tv ON tv.RegID = r.RegID AND tv.TekananDarah NOT LIKE '' +LEFT JOIN regpas_detail AS rd ON rd.RegID = r.RegID +LEFT JOIN gayahidup AS gl ON gl.RegID = r.RegID +LEFT JOIN riwayatpenyakitdahulu AS rpd ON rpd.RegID = r.RegID +LEFT JOIN riwayatpenyakitkeluarga AS rpk ON rpk.RegID = r.RegID +LEFT JOIN riwayatalergi AS ra ON ra.MEDRECID = r.MEDRECID +LEFT JOIN pemeriksaanfisik_umum AS pfu ON pfu.RegID = r.RegID +LEFT JOIN pemeriksaanfisik_mata AS pmata ON pmata.RegID = r.RegID +LEFT JOIN pemeriksaanfisik_tenggorokan AS ptg ON ptg.RegID = r.RegID +LEFT JOIN pemeriksaanfisik_mulut AS pmulut ON pmulut.RegID = r.RegID +LEFT JOIN pemeriksaanfisik_gigi AS pgigi ON pgigi.RegID = r.RegID +LEFT JOIN pemeriksaanfisik_paru AS pparu ON pparu.RegID = r.RegID +LEFT JOIN pemeriksaanfisik_jantung AS pjantung ON pjantung.RegID = r.RegID +LEFT JOIN pemeriksaanfisik_abdomen AS pabd ON pabd.RegID = r.RegID +LEFT JOIN pemeriksaankhusus AS ph ON ph.RegID = r.RegID +LEFT JOIN penyakitakibatkerja AS pak ON pak.RegID = r.RegID +WHERE r.Tanggal BETWEEN ? AND ? AND r.JenisRegID = '2' AND r.NA = 'N' +ORDER BY r.Tanggal, r.RegID` + +func scanLaporanMCURow(scanner rowScanner) (LaporanMCURow, error) { + var row LaporanMCURow + var regID, medrecID, nama, jenisKelamin, tanggalLahir, tanggalMCU, namaPenanggung, dokterMCU, instansiKerja sql.NullString + var umur sql.NullInt64 + var fields [103]sql.NullString + args := []any{ + ®ID, &medrecID, &nama, &jenisKelamin, &tanggalLahir, &umur, &tanggalMCU, + &namaPenanggung, &dokterMCU, &instansiKerja, + } + for i := range fields { + args = append(args, &fields[i]) + } + if err := scanner.Scan(args...); err != nil { + return LaporanMCURow{}, err + } + + row.RegID = nullStringPtr(regID) + row.MEDRECID = nullStringPtr(medrecID) + row.NamaPasien = nullStringPtr(nama) + row.JenisKelamin = nullStringPtr(jenisKelamin) + row.TanggalLahir = nullStringPtr(tanggalLahir) + row.Umur = nullInt64Ptr(umur) + row.TanggalMCU = nullStringPtr(tanggalMCU) + row.NamaPenanggung = nullStringPtr(namaPenanggung) + row.DokterMCU = nullStringPtr(dokterMCU) + row.InstansiKerja = nullStringPtr(instansiKerja) + + values := make([]*string, len(fields)) + for i := range fields { + values[i] = nullStringPtr(fields[i]) + } + assignLaporanMCUFields(&row, values) + return row, nil +} + +func assignLaporanMCUFields(row *LaporanMCURow, v []*string) { + // The SELECT order intentionally mirrors the legacy spreadsheet column + // order after the ten patient/header columns above. + row.TinggiBadan, row.BeratBadan, row.TekananDarah, row.Nadi, row.Suhu, row.Pernafasan = v[0], v[1], v[2], v[3], v[4], v[5] + row.Diabetes, row.Hipertensi, row.Dyslipidemia, row.Jantung, row.Stroke, row.Asma, row.Paru, row.RiwayatCidera, row.RiwayatRawatInap, row.RiwayatOperasi, row.LainLain = v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15], v[16] + row.DiabetesKeluarga, row.HipertensiKeluarga, row.DyslipidemiaKeluarga, row.JantungKeluarga, row.StrokeKeluarga, row.AsmaKeluarga, row.ParuKeluarga, row.RiwayatCideraKeluarga, row.RiwayatRawatInapKeluarga, row.RiwayatOperasiKeluarga, row.LainLainKeluarga = v[17], v[18], v[19], v[20], v[21], v[22], v[23], v[24], v[25], v[26], v[27] + row.AlergiObat, row.AlergiMakanan, row.AlergiLain, row.Merokok, row.Alkohol, row.Olahraga = v[28], v[29], v[30], v[31], v[32], v[33] + row.KeadaanUmum, row.KeadaanSakit, row.StatusGizi, row.Kesadaran, row.ColourBlindness, row.VisusDekat, row.KelainananMataLain = v[34], v[35], v[36], v[37], v[38], v[39], v[40] + row.Faring, row.Tonsil, row.MulutLainLain, row.KelainanGigi, row.ParuLain, row.JantungLain, row.Hernia = v[41], v[42], v[43], v[44], v[45], v[46], v[47] + row.KeluhanUtama, row.PenyakitSekarang, row.PenyakitDahulu, row.ECG, row.Audiometri, row.Spirometri, row.PemeriksaanLainLain, row.SaranKesehatanKerja = v[48], v[49], v[50], v[51], v[52], v[53], v[54], v[55] + row.Kebisingan, row.SuhuPanas, row.SuhuDingin, row.RadiasiBukanPengion, row.RadiasiPengion, row.GetaranLokal, row.GetaranSeluruhTubuh, row.Ketinggian, row.LainLainAkibatKerja, row.DebuOrganik, row.DebuAnorganik, row.Asap, row.LogamBerat, row.PelarutOrganik, row.IritanAsam, row.IritanBasa, row.CairanPembersih, row.Pestisida, row.UapLogam, row.BahayaKimiaLain = v[56], v[57], v[58], v[59], v[60], v[61], v[62], v[63], v[64], v[65], v[66], v[67], v[68], v[69], v[70], v[71], v[72], v[73], v[74], v[75] + row.Bakteri, row.CairanTubuh, row.Serangga, row.Limbah, row.BiologiLain, row.Overload, row.Mismatch, row.KetidakJelasan, row.HambatanJenjangKarir, row.KerjaShift, row.KonflikTeman, row.KonflikKeluarga, row.PsikologisLain, row.TanganBergerakUlang, row.AngkatBerat, row.DudukLama, row.BerdiriLama, row.PosisiTubuhTidakErgonomis, row.PencahayaanTidakSesuai, row.LihatMonitorLama, row.ErgonomisLain = v[76], v[77], v[78], v[79], v[80], v[81], v[82], v[83], v[84], v[85], v[86], v[87], v[88], v[89], v[90], v[91], v[92], v[93], v[94], v[95], v[96] + row.VisusJauhTanpaKoreksiVOD, row.VisusJauhTanpaKoreksiVOS, row.VisusJauhDenganKoreksiVOD, row.VisusJauhDenganKoreksiVOS, row.Pekerjaan, row.DokterPemeriksa = v[97], v[98], v[99], v[100], v[101], v[102] +} diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100755 index 0000000..96ea36f --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,189 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +remote_target="${1:-}" +app_name="${APP_NAME:-cpone-middleware}" +build_binary="${BUILD_BINARY:-dist/${app_name}-linux-amd64}" +requested_remote_dir="${REMOTE_DIR:-auto}" +remote_binary_override="${REMOTE_BINARY:-}" +service="${SERVICE:-${app_name}.service}" +service_scope="${SERVICE_SCOPE:-auto}" +restart_mode="${RESTART_MODE:-systemd-kill}" +ssh_timeout="${SSH_TIMEOUT:-45s}" +transfer_timeout="${TRANSFER_TIMEOUT:-120s}" + +if [[ -z "$remote_target" ]]; then + printf 'Error: target server belum diisi.\n' >&2 + exit 2 +fi + +if [[ ! "$remote_target" =~ ^[A-Za-z0-9._-]+@[A-Za-z0-9._:-]+$ ]]; then + printf 'Error: target harus berbentuk user@host (gunakan SSH_OPTIONS untuk port).\n' >&2 + exit 2 +fi + +if [[ ! -f "$build_binary" ]]; then + printf 'Error: binary tidak ditemukan: %s\n' "$build_binary" >&2 + printf 'Jalankan `make build` terlebih dahulu.\n' >&2 + exit 2 +fi + +case "$restart_mode" in + systemd-kill|systemctl) ;; + *) + printf 'Error: RESTART_MODE harus systemd-kill atau systemctl.\n' >&2 + exit 2 + ;; +esac + +case "$service_scope" in + auto|user|system) ;; + *) + printf 'Error: SERVICE_SCOPE harus auto, user, atau system.\n' >&2 + exit 2 + ;; +esac + +if ! command -v ssh >/dev/null 2>&1 || ! command -v scp >/dev/null 2>&1 || ! command -v timeout >/dev/null 2>&1; then + printf 'Error: ssh, scp, dan timeout wajib tersedia di komputer lokal.\n' >&2 + exit 2 +fi + +read -r -a ssh_options <<< "${SSH_OPTIONS:-}" + +remote_metadata="$(timeout --foreground "$ssh_timeout" ssh "${ssh_options[@]}" "$remote_target" bash -s -- "$service" "$service_scope" <<'REMOTE_METADATA' +set -Eeuo pipefail + +service="$1" +requested_scope="$2" + +if [[ "$requested_scope" == "user" ]]; then + systemctl_cmd=(systemctl --user) + resolved_scope=user +elif [[ "$requested_scope" == "system" ]]; then + systemctl_cmd=(systemctl) + resolved_scope=system +elif systemctl --user show "$service" >/dev/null 2>&1; then + systemctl_cmd=(systemctl --user) + resolved_scope=user +elif systemctl show "$service" >/dev/null 2>&1; then + systemctl_cmd=(systemctl) + resolved_scope=system +else + echo "Service tidak ditemukan: $service" >&2 + exit 1 +fi + +working_directory="$("${systemctl_cmd[@]}" show "$service" -p WorkingDirectory --value 2>/dev/null || true)" +printf '%s\t%s\n' "$resolved_scope" "$working_directory" +REMOTE_METADATA +)" +IFS=$'\t' read -r resolved_service_scope service_working_directory <<< "$remote_metadata" + +if [[ "$resolved_service_scope" != user && "$resolved_service_scope" != system ]]; then + printf 'Error: scope service remote tidak valid: %s\n' "$resolved_service_scope" >&2 + exit 1 +fi + +if [[ "$requested_remote_dir" == "auto" ]]; then + if [[ -n "$service_working_directory" && "$service_working_directory" != "-" ]]; then + remote_dir="${service_working_directory%/}" + else + remote_home="$(timeout --foreground "$ssh_timeout" ssh "${ssh_options[@]}" "$remote_target" 'printf "%s" "$HOME"')" + if [[ -z "$remote_home" ]]; then + printf 'Error: tidak dapat menentukan HOME pada server remote.\n' >&2 + exit 1 + fi + remote_dir="${remote_home%/}/apps" + fi +else + remote_dir="$requested_remote_dir" +fi + +remote_binary="${remote_binary_override:-${remote_dir}/${app_name}}" +remote_tmp="${remote_dir}/.${app_name}.new.$$.$RANDOM" +cleanup_needed=0 + +cleanup_remote_tmp() { + if (( cleanup_needed )); then + timeout --foreground "$ssh_timeout" ssh "${ssh_options[@]}" "$remote_target" bash -s -- "$remote_tmp" <<'REMOTE_CLEANUP' >/dev/null 2>&1 || true +set -eu +rm -f -- "$1" +REMOTE_CLEANUP + fi +} +trap cleanup_remote_tmp EXIT + +printf 'Preparing remote directory %s:%s\n' "$remote_target" "$remote_dir" +timeout --foreground "$ssh_timeout" ssh "${ssh_options[@]}" "$remote_target" bash -s -- "$remote_dir" <<'REMOTE_PREPARE' +set -eu +install -d -- "$1" +REMOTE_PREPARE + +printf 'Uploading %s -> %s:%s\n' "$build_binary" "$remote_target" "$remote_tmp" +timeout --foreground "$transfer_timeout" scp "${ssh_options[@]}" "$build_binary" "$remote_target:$remote_tmp" +cleanup_needed=1 + +printf 'Installing binary and restarting %s\n' "$service" +timeout --foreground "$ssh_timeout" ssh "${ssh_options[@]}" "$remote_target" bash -s -- \ + "$remote_binary" "$service" "$remote_tmp" "$restart_mode" "$resolved_service_scope" <<'REMOTE_INSTALL' +set -Eeuo pipefail + +binary="$1" +service="$2" +tmp="$3" +restart_mode="$4" +service_scope="$5" +main_pid="" + +if [[ "$service_scope" == "user" ]]; then + systemctl_cmd=(systemctl --user) +else + systemctl_cmd=(systemctl) +fi + +if [[ ! -s "$tmp" ]]; then + echo "Uploaded binary kosong atau tidak ditemukan: $tmp" >&2 + exit 1 +fi + +if [[ "$restart_mode" == "systemd-kill" ]]; then + main_pid="$("${systemctl_cmd[@]}" show "$service" -p MainPID --value 2>/dev/null || true)" + if [[ ! "$main_pid" =~ ^[1-9][0-9]*$ ]]; then + echo "Tidak dapat menemukan MainPID aktif untuk $service; binary belum diganti." >&2 + exit 1 + fi +fi + +chmod 0755 "$tmp" +if [[ -e "$binary" ]]; then + backup="${binary}.before-$(date +%Y%m%d%H%M%S)-$$" + cp -p -- "$binary" "$backup" + echo "Backup: $backup" +fi +mv -f -- "$tmp" "$binary" + +if [[ "$restart_mode" == "systemctl" ]]; then + "${systemctl_cmd[@]}" restart "$service" +else + kill -TERM "$main_pid" +fi + +for attempt in {1..20}; do + if "${systemctl_cmd[@]}" is-active --quiet "$service"; then + new_pid="$("${systemctl_cmd[@]}" show "$service" -p MainPID --value 2>/dev/null || true)" + if [[ "$restart_mode" == "systemctl" || "$new_pid" != "$main_pid" ]]; then + echo "Service aktif: $service (MainPID=${new_pid:-unknown})" + exit 0 + fi + fi + sleep 1 +done + +echo "Service tidak kembali aktif dalam 20 detik: $service" >&2 +"${systemctl_cmd[@]}" status "$service" --no-pager >&2 || true +exit 1 +REMOTE_INSTALL +cleanup_needed=0 + +printf 'Deploy selesai ke %s\n' "$remote_target"