first commit

This commit is contained in:
sas.fajri
2025-04-24 10:25:31 +07:00
commit ccca4e7f4f
26 changed files with 8470 additions and 0 deletions

121
README.md Normal file
View File

@@ -0,0 +1,121 @@
# Sistem Aplikasi Laboratorium Lingkungan
Repositori ini berisi desain dan dokumentasi untuk Sistem Aplikasi Laboratorium Lingkungan, yang dikembangkan berdasarkan alur pelayanan laboratorium lingkungan yang ada.
## Deskripsi
Sistem Aplikasi Laboratorium Lingkungan adalah sistem manajemen terintegrasi yang mendukung seluruh alur kerja laboratorium lingkungan, mulai dari permintaan pelanggan, perencanaan sampling, pengambilan sampel, analisis laboratorium, hingga pelaporan hasil uji. Sistem ini dirancang untuk meningkatkan efisiensi, akurasi, dan pelacakan proses laboratorium.
## Struktur Repositori
Repositori ini berisi file-file berikut:
1. **lab_env_database_structure.sql**
- File SQL yang berisi struktur database lengkap dan data contoh
- Mencakup definisi tabel, relasi, dan sample data untuk pengujian
2. **lab_env_database_explanation.md**
- Dokumentasi terperinci tentang struktur database
- Penjelasan setiap tabel dan kolom
- Contoh data nyata untuk setiap tabel
3. **lab_env_database_erd.md**
- Entity Relationship Diagram (ERD) untuk visualisasi hubungan antar tabel
- Penjelasan relasi antar entitas
- Penjelasan proses bisnis berdasarkan struktur database
4. **lab_env_database_mermaid_erd.md**
- ERD dalam format Mermaid untuk visualisasi interaktif
- Dapat dirender di GitHub dan platform yang mendukung Mermaid
- Representasi lebih modern dan interaktif dari hubungan antar tabel
5. **lab_env_workflow_flowchart.md**
- Flowchart Mermaid yang menggambarkan alur pelayanan laboratorium
- Visualisasi interaktif proses bisnis
- Menjelaskan peran dan tanggung jawab setiap bagian
6. **lab_env_db_class_diagram.md**
- Diagram kelas UML dalam format Mermaid
- Menggabungkan struktur database dengan fungsi sistem
- Memvisualisasikan bagaimana data dan proses saling terkait
7. **lab_env_app_features.md**
- Dokumentasi fitur-fitur sistem aplikasi
- Modul dan kemampuan utama dari aplikasi
- Keuntungan implementasi dan fase pengembangan yang disarankan
8. **Screenshot 2025-04-23 at 08.26.07.png**
- Diagram alur pelayanan laboratorium lingkungan yang menjadi dasar desain sistem
## Alur Pelayanan Laboratorium Lingkungan
Sistem ini didasarkan pada alur pelayanan berikut:
1. **Customer (Internal dan eksternal)**
- Permintaan sampling dan analisis
- Analisis sampel
2. **Admin Lab Ling**
- Menyiapkan Surat Penawaran
- Menyiapkan Quotation
- Melengkapi data teknis tentang order pelanggan
- Memberikan Bukti pembayaran DP
- Registrasi
- Mempersiapkan dan kirim hasil uji
3. **Petugas Sampling**
- Menyiapkan rencana sampling (SDM, Konfirmasi jadwal, dll)
- Menyiapkan peralatan sampling
4. **Bagian penerimaan contoh uji**
- Menerima sampel
- Melakukan preparasi
5. **Bagian Analisis Laboratorium**
- Analisa sampel uji di laboratorium sesuai jenis sampel
6. **Bagian Verifikasi Hasil Uji**
- Petugas melakukan verifikasi hasil uji
## Diagram Mermaid
Repositori ini menggunakan diagram Mermaid untuk visualisasi interaktif. Untuk melihat diagram Mermaid:
1. Buka file Markdown yang berisi diagram Mermaid di GitHub, yang secara otomatis akan merender diagram
2. Gunakan [Mermaid Live Editor](https://mermaid.live/) untuk melihat atau mengedit diagram
3. Ekspor diagram ke PNG, SVG, atau PDF untuk digunakan dalam dokumentasi
## Cara Penggunaan
### Persiapan Database
1. Buat database baru di server MySQL/MariaDB:
```
CREATE DATABASE lab_lingkungan;
```
2. Import struktur database dan data contoh:
```
mysql -u username -p lab_lingkungan < lab_env_database_structure.sql
```
3. Atur konfigurasi koneksi database di file konfigurasi aplikasi.
### Pengembangan Aplikasi
Sistem aplikasi ini dapat dikembangkan menggunakan berbagai teknologi, termasuk:
- **Backend**: PHP, Laravel, Node.js, Django, Spring Boot
- **Frontend**: React, Vue.js, Angular
- **Database**: MySQL, PostgreSQL
- **Mobile**: React Native, Flutter
Disarankan untuk menggunakan pendekatan modular sesuai dengan fase implementasi yang diuraikan dalam `lab_env_app_features.md`.
## Kontribusi
Silakan ajukan issue atau pull request jika Anda memiliki saran perbaikan untuk struktur database atau fitur aplikasi.
## Lisensi
Proyek ini dibawah lisensi [MIT](LICENSE).

108
catatan.txt Normal file
View File

@@ -0,0 +1,108 @@
Contoh Rencana Sampling dan Peralatan Sampling untuk Laboratorium Lingkungan
Saya telah membuat dua template utama untuk membantu proses sampling lingkungan:
1. Template Rencana Sampling
Template rencana sampling (sampling_plan_template.html) mencakup beberapa bagian penting:
a. Informasi Umum
Nama proyek
Nama klien
Informasi kontak
Tanggal sampling
b. Lokasi Sampling
ID lokasi
Deskripsi lokasi
Koordinat GPS
Informasi akses lokasi
c. Parameter Sampling
Nama parameter (misalnya pH, BOD, COD)
Metode analisis (misalnya SNI 06-6989.11-2019)
Jenis wadah sampel
Metode preservasi
Waktu simpan (holding time)
d. Protokol Sampling
Metode pengambilan sampel (grab sampling, composite sampling)
Kebutuhan QA/QC (blanko lapangan, sampel duplikat)
Prosedur preservasi sampel
e. Pengelolaan Sampel
Format label sampel
Prosedur chain of custody
Metode transportasi sampel ke laboratorium
f. Kesehatan dan Keselamatan
Penilaian bahaya
Kebutuhan APD (Alat Pelindung Diri)
Prosedur darurat
2. Daftar Peralatan Sampling
Template daftar peralatan sampling (sampling_equipment_list.html) mencakup:
a. Peralatan Sampling Air
Wadah Sampel:
Botol HDPE (1L) untuk parameter umum
Botol kaca amber (1L) untuk parameter organik
Botol steril (250mL) untuk analisis mikrobiologi
Vial VOC (40mL) untuk senyawa organik volatil
Alat Pengambil Sampel:
Tongkat sampling teleskopik
Van Dorn Water Sampler
Pompa peristaltik
Bailer (disposable)
Alat Pengukuran Lapangan:
Multiparameter Water Quality Meter
DO Meter (cadangan)
pH Meter (cadangan)
Turbidity Meter
Secchi Disk
Flow Meter
b. Peralatan Sampling Tanah/Sedimen
Scoops stainless steel
Soil auger
Core sampler tanah
Sediment grab sampler
Wadah sampel tanah
c. Peralatan Preservasi dan Transportasi
Bahan Pengawet:
Asam sulfat (H₂SO₄)
Asam nitrat (HNO₃)
Natrium thiosulfat
Seng asetat
Peralatan Pendingin dan Transportasi:
Ice pack
Cooler (kotak pendingin)
Kantong zip-lock
Bubble wrap
Temperature blank
d. Dokumentasi Lapangan
Buku catatan lapangan (waterproof)
Formulir chain of custody
Label sampel
Spidol permanen tahan air
Perangkat GPS
Kamera digital
Meteran
Clipboard
e. Alat Pelindung Diri (APD)
Sarung tangan nitrile
Sepatu safety
Waders (bila diperlukan untuk akses sungai)
Kacamata safety
Rompi keselamatan
Kotak P3K
Repellent serangga
Sunscreen
Cara Penggunaan Template
Membuat Rencana Sampling Baru:
Buka halaman /sampling/plan/new
Isi formulir dengan detail proyek
Tambahkan lokasi sampling, parameter, dan metodologi
Kirim untuk persetujuan atau simpan sebagai draft
Menyiapkan Daftar Peralatan:
Buka halaman /sampling/equipment/new
Pilih jenis dan jumlah peralatan yang diperlukan
Tambahkan kebutuhan khusus
Kirim formulir permintaan peralatan
Melihat Rencana yang Sudah Ada:
Buka /sampling/plan/<request_id> untuk melihat rencana spesifik
Manfaat Template Ini
Standardisasi: Memastikan semua petugas sampling mengikuti protokol yang sama
Kelengkapan: Mencakup semua aspek penting dalam perencanaan sampling lingkungan
Dokumentasi: Memberikan catatan yang jelas untuk audit dan pelaporan
Efisiensi: Mempercepat proses persiapan sampling dengan formulir yang terstruktur
Kepatuhan: Membantu memenuhi persyaratan standar SNI dan regulasi lainnya
Template-template ini dirancang sesuai dengan studi kasus yang Anda berikan, termasuk untuk pemantauan limbah industri dan pemantauan kualitas air sungai multi-titik. Formulir ini responsif, mudah digunakan, dan mencakup validasi data untuk memastikan akurasi dalam perencanaan sampling lingkungan.

View File

@@ -0,0 +1,282 @@
-- Database Structure and Sample Data for Work Climate and Humidity Measurement
-- Based on PMK RI No.2 Tahun 2023
-- ------------------------------------------------------------------------------
-- Master Tables - Data Referensi
-- ------------------------------------------------------------------------------
-- Master Regulasi
CREATE TABLE IF NOT EXISTS master_regulasi (
id_regulasi INT PRIMARY KEY,
kode_regulasi VARCHAR(50) NOT NULL,
nama_regulasi VARCHAR(255) NOT NULL,
instansi_penerbit VARCHAR(100) NOT NULL,
tanggal_terbit DATE NOT NULL,
tanggal_berlaku DATE NOT NULL,
deskripsi TEXT,
file_path VARCHAR(255),
status BOOLEAN DEFAULT TRUE,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50)
);
-- Master Parameter Iklim Kerja
CREATE TABLE IF NOT EXISTS master_parameter_iklim (
id_parameter INT PRIMARY KEY,
kode_parameter VARCHAR(20) NOT NULL,
nama_parameter VARCHAR(100) NOT NULL,
satuan VARCHAR(20),
metode_analisis VARCHAR(100),
biaya DECIMAL(10, 2),
akreditasi BOOLEAN DEFAULT FALSE,
keterangan TEXT,
status BOOLEAN DEFAULT TRUE,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50)
);
-- Master Baku Mutu Iklim Kerja
CREATE TABLE IF NOT EXISTS master_bakumutu_iklim (
id_bakumutu INT PRIMARY KEY,
id_parameter INT NOT NULL,
id_regulasi INT NOT NULL,
jenis_ruangan VARCHAR(100) NOT NULL,
nilai_min DECIMAL(6, 2),
nilai_max DECIMAL(6, 2),
keterangan TEXT,
status BOOLEAN DEFAULT TRUE,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50),
FOREIGN KEY (id_parameter) REFERENCES master_parameter_iklim(id_parameter),
FOREIGN KEY (id_regulasi) REFERENCES master_regulasi(id_regulasi)
);
-- Master Metode Sampling Iklim Kerja
CREATE TABLE IF NOT EXISTS master_metode_sampling_iklim (
id_metode INT PRIMARY KEY,
kode_metode VARCHAR(50) NOT NULL,
nama_metode VARCHAR(255) NOT NULL,
deskripsi TEXT,
jenis_parameter VARCHAR(100),
status BOOLEAN DEFAULT TRUE,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50)
);
-- Master Peralatan Pengukuran Iklim Kerja
CREATE TABLE IF NOT EXISTS master_peralatan_iklim (
id_peralatan INT PRIMARY KEY,
kode_peralatan VARCHAR(20) NOT NULL,
nama_peralatan VARCHAR(100) NOT NULL,
merk VARCHAR(100),
model VARCHAR(100),
serial_number VARCHAR(100),
spesifikasi TEXT,
tanggal_kalibrasi DATE,
tanggal_kalibrasi_berikutnya DATE,
status_kalibrasi VARCHAR(20),
file_sertifikat VARCHAR(255),
status BOOLEAN DEFAULT TRUE,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50)
);
-- ------------------------------------------------------------------------------
-- Transaction Tables - Data Transaksi
-- ------------------------------------------------------------------------------
-- Sampling Plan Pengukuran Iklim Kerja
CREATE TABLE IF NOT EXISTS trx_sampling_plan_iklim (
id_sampling_plan INT PRIMARY KEY,
kode_sampling_plan VARCHAR(50) NOT NULL,
nama_project VARCHAR(255) NOT NULL,
id_client INT NOT NULL,
tanggal_rencana_sampling DATE NOT NULL,
lokasi_sampling TEXT NOT NULL,
jumlah_titik INT,
status_approval VARCHAR(20) DEFAULT 'DRAFT',
catatan TEXT,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50)
);
-- Requisisi Peralatan untuk Pengukuran Iklim Kerja
CREATE TABLE IF NOT EXISTS trx_requisisi_peralatan_iklim (
id_requisisi INT PRIMARY KEY,
id_sampling_plan INT NOT NULL,
tanggal_requisisi DATE NOT NULL,
tanggal_kebutuhan DATE NOT NULL,
status_requisisi VARCHAR(20) DEFAULT 'DRAFT',
catatan TEXT,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50),
FOREIGN KEY (id_sampling_plan) REFERENCES trx_sampling_plan_iklim(id_sampling_plan)
);
-- Detail Requisisi Peralatan
CREATE TABLE IF NOT EXISTS trx_requisisi_peralatan_iklim_detail (
id_requisisi_detail INT PRIMARY KEY,
id_requisisi INT NOT NULL,
id_peralatan INT NOT NULL,
jumlah INT NOT NULL,
status_persetujuan VARCHAR(20) DEFAULT 'PENDING',
catatan TEXT,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50),
FOREIGN KEY (id_requisisi) REFERENCES trx_requisisi_peralatan_iklim(id_requisisi),
FOREIGN KEY (id_peralatan) REFERENCES master_peralatan_iklim(id_peralatan)
);
-- Hasil Pengukuran Iklim Kerja
CREATE TABLE IF NOT EXISTS trx_hasil_ukur_iklim (
id_hasil_ukur INT PRIMARY KEY,
id_sampling_plan INT NOT NULL,
kode_laporan VARCHAR(50) NOT NULL,
tanggal_sampling DATE NOT NULL,
waktu_mulai TIME,
waktu_selesai TIME,
kondisi_cuaca VARCHAR(100),
petugas_sampling VARCHAR(100),
status_laporan VARCHAR(20) DEFAULT 'DRAFT',
catatan TEXT,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50),
FOREIGN KEY (id_sampling_plan) REFERENCES trx_sampling_plan_iklim(id_sampling_plan)
);
-- Detail Hasil Pengukuran Iklim Kerja
CREATE TABLE IF NOT EXISTS trx_hasil_ukur_iklim_detail (
id_hasil_ukur_detail INT PRIMARY KEY,
id_hasil_ukur INT NOT NULL,
kode_titik VARCHAR(20) NOT NULL,
nama_lokasi VARCHAR(255) NOT NULL,
jenis_ruangan VARCHAR(100) NOT NULL,
id_parameter INT NOT NULL,
hasil_pengukuran DECIMAL(6, 2) NOT NULL,
baku_mutu_min DECIMAL(6, 2),
baku_mutu_max DECIMAL(6, 2),
id_metode INT NOT NULL,
id_peralatan INT NOT NULL,
status_kesesuaian VARCHAR(20),
catatan TEXT,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50),
FOREIGN KEY (id_hasil_ukur) REFERENCES trx_hasil_ukur_iklim(id_hasil_ukur),
FOREIGN KEY (id_parameter) REFERENCES master_parameter_iklim(id_parameter),
FOREIGN KEY (id_metode) REFERENCES master_metode_sampling_iklim(id_metode),
FOREIGN KEY (id_peralatan) REFERENCES master_peralatan_iklim(id_peralatan)
);
-- ------------------------------------------------------------------------------
-- Sample Data Insertion
-- ------------------------------------------------------------------------------
-- Insert Data Master Regulasi
INSERT INTO master_regulasi (id_regulasi, kode_regulasi, nama_regulasi, instansi_penerbit, tanggal_terbit, tanggal_berlaku, deskripsi, file_path, status, user_input)
VALUES
(1, 'PMK-02-2023', 'Peraturan Menteri Kesehatan Republik Indonesia Nomor 2 Tahun 2023 tentang Standar Baku Mutu Kesehatan Lingkungan dan Persyaratan Kesehatan', 'Kementerian Kesehatan RI', '2023-01-15', '2023-02-01', 'Standar Baku Mutu Kesehatan Lingkungan untuk Media Air, Udara, Tanah, Pangan, Sarana dan Bangunan, serta Vektor dan Binatang Pembawa Penyakit, dan Persyaratan Kesehatan', '/dokumen/regulasi/PMK_02_2023.pdf', TRUE, 'admin'),
(2, 'PERMENAKER-05-2018', 'Peraturan Menteri Ketenagakerjaan Republik Indonesia Nomor 5 Tahun 2018 tentang Keselamatan dan Kesehatan Kerja Lingkungan Kerja', 'Kementerian Ketenagakerjaan RI', '2018-04-17', '2018-05-01', 'Keselamatan dan Kesehatan Kerja Lingkungan Kerja meliputi faktor fisika, kimia, biologi, ergonomi, dan psikologi', '/dokumen/regulasi/PERMENAKER_05_2018.pdf', TRUE, 'admin');
-- Insert Data Master Parameter Iklim Kerja
INSERT INTO master_parameter_iklim (id_parameter, kode_parameter, nama_parameter, satuan, metode_analisis, biaya, akreditasi, keterangan, status, user_input)
VALUES
(1, 'SUHU-01', 'Suhu Udara', '°C', 'SNI 7062:2019', 50000.00, TRUE, 'Pengukuran suhu udara dalam ruangan', TRUE, 'admin'),
(2, 'KELEM-01', 'Kelembaban Udara', '%RH', 'SNI 7062:2019', 50000.00, TRUE, 'Pengukuran kelembaban relatif udara dalam ruangan', TRUE, 'admin'),
(3, 'KEC-UDARA-01', 'Kecepatan Aliran Udara', 'm/s', 'SNI 7062:2019', 60000.00, TRUE, 'Pengukuran kecepatan aliran udara dalam ruangan', TRUE, 'admin'),
(4, 'ISBB-01', 'Indeks Suhu Basah dan Bola (ISBB)', '°C', 'SNI 7062:2019', 85000.00, TRUE, 'Pengukuran Indeks Suhu Basah dan Bola untuk analisis beban kerja', TRUE, 'admin');
-- Insert Data Master Baku Mutu Iklim Kerja
INSERT INTO master_bakumutu_iklim (id_bakumutu, id_parameter, id_regulasi, jenis_ruangan, nilai_min, nilai_max, keterangan, status, user_input)
VALUES
-- Suhu Udara
(1, 1, 1, 'Ruang Administrasi/Kantor', 20.0, 25.0, 'Ruang kerja administrasi dan kantor', TRUE, 'admin'),
(2, 1, 1, 'Ruang Produksi', 23.0, 26.0, 'Area produksi dengan aktivitas fisik ringan sampai sedang', TRUE, 'admin'),
(3, 1, 1, 'Ruang Istirahat', 22.0, 28.0, 'Area istirahat, kantin, dan ruang tunggu', TRUE, 'admin'),
(4, 1, 1, 'Ruang Khusus', 18.0, 24.0, 'Ruang server, laboratorium, dan ruang khusus lainnya', TRUE, 'admin'),
-- Kelembaban Udara
(5, 2, 1, 'Ruang Administrasi/Kantor', 40.0, 60.0, 'Ruang kerja administrasi dan kantor', TRUE, 'admin'),
(6, 2, 1, 'Ruang Produksi', 40.0, 60.0, 'Area produksi dengan aktivitas fisik ringan sampai sedang', TRUE, 'admin'),
(7, 2, 1, 'Ruang Istirahat', 40.0, 60.0, 'Area istirahat, kantin, dan ruang tunggu', TRUE, 'admin'),
(8, 2, 1, 'Ruang Khusus', 40.0, 60.0, 'Ruang server, laboratorium, dan ruang khusus lainnya', TRUE, 'admin'),
-- Kecepatan Aliran Udara
(9, 3, 1, 'Ruang Administrasi/Kantor', 0.1, 0.2, 'Ruang kerja administrasi dan kantor', TRUE, 'admin'),
(10, 3, 1, 'Ruang Produksi', 0.1, 0.3, 'Area produksi dengan aktivitas fisik ringan sampai sedang', TRUE, 'admin'),
(11, 3, 1, 'Ruang Istirahat', 0.1, 0.25, 'Area istirahat, kantin, dan ruang tunggu', TRUE, 'admin'),
(12, 3, 1, 'Ruang Khusus', 0.1, 0.3, 'Ruang server, laboratorium, dan ruang khusus lainnya', TRUE, 'admin'),
-- ISBB (Indeks Suhu Basah dan Bola)
(13, 4, 2, 'Beban Kerja Ringan', NULL, 30.0, 'Alokasi istirahat 75% kerja, 25% istirahat', TRUE, 'admin'),
(14, 4, 2, 'Beban Kerja Sedang', NULL, 28.0, 'Alokasi istirahat 75% kerja, 25% istirahat', TRUE, 'admin'),
(15, 4, 2, 'Beban Kerja Berat', NULL, 25.0, 'Alokasi istirahat 75% kerja, 25% istirahat', TRUE, 'admin');
-- Insert Data Master Metode Sampling Iklim Kerja
INSERT INTO master_metode_sampling_iklim (id_metode, kode_metode, nama_metode, deskripsi, jenis_parameter, status, user_input)
VALUES
(1, 'SNI-7062-2019-SUHU', 'SNI 7062:2019 - Pengukuran Suhu Udara', 'Metode standar pengukuran suhu udara menggunakan termometer ruangan', 'Suhu Udara', TRUE, 'admin'),
(2, 'SNI-7062-2019-KELEMBABAN', 'SNI 7062:2019 - Pengukuran Kelembaban Udara', 'Metode standar pengukuran kelembaban relatif udara menggunakan hygrometer', 'Kelembaban Udara', TRUE, 'admin'),
(3, 'SNI-7062-2019-ANEMO', 'SNI 7062:2019 - Pengukuran Kecepatan Aliran Udara', 'Metode standar pengukuran kecepatan aliran udara menggunakan anemometer', 'Kecepatan Aliran Udara', TRUE, 'admin'),
(4, 'SNI-7062-2019-ISBB', 'SNI 7062:2019 - Pengukuran ISBB', 'Metode standar pengukuran Indeks Suhu Basah dan Bola menggunakan WBGT meter', 'ISBB', TRUE, 'admin');
-- Insert Data Master Peralatan Pengukuran Iklim Kerja
INSERT INTO master_peralatan_iklim (id_peralatan, kode_peralatan, nama_peralatan, merk, model, serial_number, spesifikasi, tanggal_kalibrasi, tanggal_kalibrasi_berikutnya, status_kalibrasi, file_sertifikat, status, user_input)
VALUES
(1, 'THERMO-01', 'Termohigrometer Digital', 'Lutron', 'PHB-318', 'LT12345678', 'Range suhu: -20 - 60°C, Range kelembaban: 10 - 95% RH, Resolusi: 0.1°C / 0.1% RH', '2023-05-10', '2024-05-10', 'VALID', '/dokumen/kalibrasi/thermo_lutron_2023.pdf', TRUE, 'admin'),
(2, 'THERMO-02', 'Termohigrometer Digital', 'Extech', 'RHT50', 'EX87654321', 'Range suhu: -30 - 70°C, Range kelembaban: 0 - 99% RH, Resolusi: 0.1°C / 0.1% RH', '2023-08-15', '2024-08-15', 'VALID', '/dokumen/kalibrasi/thermo_extech_2023.pdf', TRUE, 'admin'),
(3, 'ANEMO-01', 'Anemometer Digital', 'Lutron', 'AM-4214SD', 'LA23456789', 'Range kecepatan udara: 0.2 - 20.0 m/s, Resolusi: 0.01 m/s', '2023-03-20', '2024-03-20', 'VALID', '/dokumen/kalibrasi/anemo_lutron_2023.pdf', TRUE, 'admin'),
(4, 'WBGT-01', 'Wet Bulb Globe Temperature Meter', 'Extech', 'HT30', 'EX55667788', 'Range WBGT: 0 - 50°C, Range TA: 0 - 50°C, Range TG: 0 - 80°C, Range RH: 0 - 100%', '2023-06-05', '2024-06-05', 'VALID', '/dokumen/kalibrasi/wbgt_extech_2023.pdf', TRUE, 'admin'),
(5, 'THERMO-03', 'Termohigrometer Ruangan', 'Testo', '608-H1', 'TS12131415', 'Range suhu: -10 - 70°C, Range kelembaban: 10 - 98% RH, Akurasi: ±0.5°C / ±3% RH', '2023-07-22', '2024-07-22', 'VALID', '/dokumen/kalibrasi/thermo_testo_2023.pdf', TRUE, 'admin');
-- -----------------------------------------------------------------------------
-- Insert Contoh Data Transaksi
-- -----------------------------------------------------------------------------
-- Contoh Data Sampling Plan Pengukuran Iklim Kerja
INSERT INTO trx_sampling_plan_iklim (id_sampling_plan, kode_sampling_plan, nama_project, id_client, tanggal_rencana_sampling, lokasi_sampling, jumlah_titik, status_approval, catatan, tanggal_input, user_input)
VALUES
(1, 'SP-IK-2024-001', 'Monitoring Iklim Kerja Semester I 2024 - PT. Indonesia Manufacturing Industry', 101, '2024-04-25', 'PT. Indonesia Manufacturing Industry, Jl. Industry Raya No. 123, Jakarta', 5, 'APPROVED', 'Monitoring rutin semester I tahun 2024 sesuai program K3', '2024-04-10 09:15:00', 'supervisor');
-- Contoh Data Requisisi Peralatan untuk Pengukuran Iklim Kerja
INSERT INTO trx_requisisi_peralatan_iklim (id_requisisi, id_sampling_plan, tanggal_requisisi, tanggal_kebutuhan, status_requisisi, catatan, tanggal_input, user_input)
VALUES
(1, 1, '2024-04-15', '2024-04-25', 'APPROVED', 'Requisisi peralatan untuk monitoring iklim kerja PT. Indonesia Manufacturing Industry', '2024-04-15 10:30:00', 'officer');
-- Contoh Data Detail Requisisi Peralatan
INSERT INTO trx_requisisi_peralatan_iklim_detail (id_requisisi_detail, id_requisisi, id_peralatan, jumlah, status_persetujuan, catatan, tanggal_input, user_input)
VALUES
(1, 1, 1, 1, 'APPROVED', 'Termohigrometer Digital Lutron untuk pengukuran suhu dan kelembaban', '2024-04-15 10:31:00', 'officer'),
(2, 1, 3, 1, 'APPROVED', 'Anemometer Digital Lutron untuk pengukuran kecepatan aliran udara', '2024-04-15 10:32:00', 'officer');
-- Contoh Data Hasil Pengukuran Iklim Kerja
INSERT INTO trx_hasil_ukur_iklim (id_hasil_ukur, id_sampling_plan, kode_laporan, tanggal_sampling, waktu_mulai, waktu_selesai, kondisi_cuaca, petugas_sampling, status_laporan, catatan, tanggal_input, user_input)
VALUES
(1, 1, 'LHU/IKLIM/04/2024/001', '2024-04-25', '09:00:00', '11:15:00', 'Cuaca cerah, suhu luar 31°C', 'Deni Hermawan', 'FINAL', 'Pengukuran berjalan lancar sesuai dengan rencana', '2024-04-25 15:30:00', 'officer');
-- Contoh Data Detail Hasil Pengukuran Iklim Kerja
INSERT INTO trx_hasil_ukur_iklim_detail (id_hasil_ukur_detail, id_hasil_ukur, kode_titik, nama_lokasi, jenis_ruangan, id_parameter, hasil_pengukuran, baku_mutu_min, baku_mutu_max, id_metode, id_peralatan, status_kesesuaian, catatan, tanggal_input, user_input)
VALUES
-- Main Meeting Room
(1, 1, 'T1', 'Main Meeting Room', 'Ruang Administrasi/Kantor', 1, 21.0, 20.0, 25.0, 1, 1, 'COMPLY', '', '2024-04-25 15:35:00', 'officer'),
(2, 1, 'T1', 'Main Meeting Room', 'Ruang Administrasi/Kantor', 2, 50.5, 40.0, 60.0, 2, 1, 'COMPLY', '', '2024-04-25 15:35:00', 'officer'),
(3, 1, 'T1', 'Main Meeting Room', 'Ruang Administrasi/Kantor', 3, 0.15, 0.1, 0.2, 3, 3, 'COMPLY', '', '2024-04-25 15:35:00', 'officer'),
-- HR Work Area
(4, 1, 'T2', 'HR Work Area', 'Ruang Administrasi/Kantor', 1, 22.0, 20.0, 25.0, 1, 1, 'COMPLY', '', '2024-04-25 15:45:00', 'officer'),
(5, 1, 'T2', 'HR Work Area', 'Ruang Administrasi/Kantor', 2, 52.0, 40.0, 60.0, 2, 1, 'COMPLY', '', '2024-04-25 15:45:00', 'officer'),
(6, 1, 'T2', 'HR Work Area', 'Ruang Administrasi/Kantor', 3, 0.12, 0.1, 0.2, 3, 3, 'COMPLY', '', '2024-04-25 15:45:00', 'officer'),
-- Server Room
(7, 1, 'T3', 'Server Room', 'Ruang Khusus', 1, 19.0, 18.0, 24.0, 1, 1, 'COMPLY', '', '2024-04-25 15:55:00', 'officer'),
(8, 1, 'T3', 'Server Room', 'Ruang Khusus', 2, 45.0, 40.0, 60.0, 2, 1, 'COMPLY', '', '2024-04-25 15:55:00', 'officer'),
(9, 1, 'T3', 'Server Room', 'Ruang Khusus', 3, 0.25, 0.1, 0.3, 3, 3, 'COMPLY', '', '2024-04-25 15:55:00', 'officer'),
-- Production Line A
(10, 1, 'T4', 'Production Line A', 'Ruang Produksi', 1, 26.0, 23.0, 26.0, 1, 1, 'COMPLY', '', '2024-04-25 16:05:00', 'officer'),
(11, 1, 'T4', 'Production Line A', 'Ruang Produksi', 2, 65.0, 40.0, 60.0, 2, 1, 'NOT_COMPLY', 'Kelembaban melebihi baku mutu, perlu perbaikan sistem ventilasi', '2024-04-25 16:05:00', 'officer'),
(12, 1, 'T4', 'Production Line A', 'Ruang Produksi', 3, 0.30, 0.1, 0.3, 3, 3, 'COMPLY', '', '2024-04-25 16:05:00', 'officer'),
-- Canteen Area
(13, 1, 'T5', 'Canteen Area', 'Ruang Istirahat', 1, 24.0, 22.0, 28.0, 1, 1, 'COMPLY', '', '2024-04-25 16:15:00', 'officer'),
(14, 1, 'T5', 'Canteen Area', 'Ruang Istirahat', 2, 55.0, 40.0, 60.0, 2, 1, 'COMPLY', '', '2024-04-25 16:15:00', 'officer'),
(15, 1, 'T5', 'Canteen Area', 'Ruang Istirahat', 3, 0.20, 0.1, 0.25, 3, 3, 'COMPLY', '', '2024-04-25 16:15:00', 'officer');

View File

@@ -0,0 +1,379 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Work Climate and Humidity Measurement Report</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
color: #333;
font-size: 12px;
}
.container {
width: 210mm;
margin: 0 auto;
padding: 10mm;
box-sizing: border-box;
}
.header {
border-bottom: 2px solid #333;
padding-bottom: 10px;
margin-bottom: 20px;
}
.logo {
float: left;
max-height: 80px;
}
.lab-info {
float: right;
text-align: right;
}
.title {
text-align: center;
margin: 20px 0;
clear: both;
}
.title h1 {
margin: 0;
font-size: 18px;
font-weight: bold;
}
.title h2 {
margin: 5px 0;
font-size: 16px;
font-weight: normal;
}
.title h3 {
margin: 5px 0;
font-size: 14px;
font-weight: normal;
}
.clearfix::after {
content: "";
clear: both;
display: table;
}
.section {
margin-bottom: 15px;
}
.section-title {
font-weight: bold;
margin-bottom: 5px;
font-size: 13px;
background-color: #f0f0f0;
padding: 5px;
border-left: 3px solid #333;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 15px;
}
table, th, td {
border: 1px solid #999;
}
th {
background-color: #f0f0f0;
padding: 8px 5px;
text-align: center;
font-weight: bold;
}
td {
padding: 8px 5px;
text-align: left;
}
.text-center {
text-align: center;
}
.text-right {
text-align: right;
}
.footer {
margin-top: 30px;
border-top: 1px solid #999;
padding-top: 10px;
}
.signature {
float: right;
width: 33%;
text-align: center;
margin-top: 20px;
}
.signature-line {
border-top: 1px solid #333;
margin-top: 50px;
margin-left: auto;
margin-right: auto;
width: 80%;
}
.compliance {
padding: 3px;
border-radius: 3px;
font-weight: bold;
}
.comply {
background-color: #dff0d8;
color: #3c763d;
}
.not-comply {
background-color: #f2dede;
color: #a94442;
}
.watermark {
position: absolute;
top: 50%;
left: 25%;
transform: rotate(-45deg);
transform-origin: 50% 50%;
opacity: 0.1;
font-size: 100px;
z-index: -1;
color: #000;
white-space: nowrap;
}
@page {
size: A4;
margin: 0;
}
@media print {
.container {
width: 210mm;
height: 297mm;
padding: 10mm;
box-sizing: border-box;
}
}
</style>
</head>
<body>
<div class="container">
<div class="watermark">LABORATORY REPORT</div>
<div class="header clearfix">
<img src="lab_logo.png" alt="Laboratory Logo" class="logo">
<div class="lab-info">
<h2>ENVIRONMENTAL TESTING LABORATORY</h2>
<p>Jl. Laboratorium Lingkungan No. 123, Jakarta</p>
<p>Phone: (021) 555-1234, Email: info@env-lab.co.id</p>
<p>ACCREDITED KAN: LP-001-IDN</p>
</div>
</div>
<div class="title">
<h1>WORK CLIMATE MEASUREMENT REPORT</h1>
<h2>REPORT NUMBER: LHU/IKLIM/04/2024/001</h2>
<h3>Based on PMK RI No.2 Year 2023</h3>
</div>
<div class="section">
<div class="section-title">1. CLIENT INFORMATION</div>
<table>
<tr>
<td width="30%">Client Name</td>
<td width="70%">PT. Indonesia Manufacturing Industry</td>
</tr>
<tr>
<td>Address</td>
<td>Jl. Industry Raya No. 123, Jakarta</td>
</tr>
<tr>
<td>Contact Person</td>
<td>Budi Santoso (HSE Manager)</td>
</tr>
<tr>
<td>Request Number</td>
<td>REQ/2024/04/001</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">2. MEASUREMENT INFORMATION</div>
<table>
<tr>
<td width="30%">Measurement Date</td>
<td width="70%">April 25, 2024</td>
</tr>
<tr>
<td>Measurement Time</td>
<td>09:00 - 11:15 WIB</td>
</tr>
<tr>
<td>Measurement Officers</td>
<td>Deni Hermawan (Sampling Officer)</td>
</tr>
<tr>
<td>Weather Condition</td>
<td>Sunny, 31°C (outdoor temperature)</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">3. MEASUREMENT RESULTS</div>
<table>
<thead>
<tr>
<th rowspan="2">No.</th>
<th rowspan="2">Location</th>
<th rowspan="2">Room Type</th>
<th colspan="2">Temperature</th>
<th colspan="2">Humidity</th>
<th rowspan="2">Air Velocity (m/s)</th>
<th rowspan="2">Compliance Status</th>
</tr>
<tr>
<th>Result (°C)</th>
<th>Standard (°C)</th>
<th>Result (%RH)</th>
<th>Standard (%RH)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="text-center">1</td>
<td>Main Meeting Room</td>
<td>Administration</td>
<td class="text-center">21.0</td>
<td class="text-center">20.0 - 25.0</td>
<td class="text-center">50.5</td>
<td class="text-center">40 - 60</td>
<td class="text-center">0.15</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">2</td>
<td>HR Work Area</td>
<td>Administration</td>
<td class="text-center">22.0</td>
<td class="text-center">20.0 - 25.0</td>
<td class="text-center">52.0</td>
<td class="text-center">40 - 60</td>
<td class="text-center">0.12</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">3</td>
<td>Server Room</td>
<td>Special Room</td>
<td class="text-center">19.0</td>
<td class="text-center">18.0 - 24.0</td>
<td class="text-center">45.0</td>
<td class="text-center">40 - 60</td>
<td class="text-center">0.25</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">4</td>
<td>Production Line A</td>
<td>Production</td>
<td class="text-center">26.0</td>
<td class="text-center">23.0 - 26.0</td>
<td class="text-center">65.0</td>
<td class="text-center">40 - 60</td>
<td class="text-center">0.30</td>
<td class="text-center"><span class="compliance not-comply">NOT COMPLY</span></td>
</tr>
<tr>
<td class="text-center">5</td>
<td>Canteen Area</td>
<td>Common Area</td>
<td class="text-center">24.0</td>
<td class="text-center">22.0 - 28.0</td>
<td class="text-center">55.0</td>
<td class="text-center">40 - 60</td>
<td class="text-center">0.20</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
</tbody>
</table>
</div>
<div class="section">
<div class="section-title">4. MEASUREMENT METHOD</div>
<table>
<tr>
<th width="20%">Parameter</th>
<th width="20%">Method</th>
<th width="35%">Equipment</th>
<th width="25%">Calibration Status</th>
</tr>
<tr>
<td>Temperature</td>
<td>SNI 7062: 2019</td>
<td>Thermohygrometer Lutron PHB-318 SN:LT12345678</td>
<td>Valid until May 10, 2024</td>
</tr>
<tr>
<td>Humidity</td>
<td>SNI 7062: 2019</td>
<td>Thermohygrometer Lutron PHB-318 SN:LT12345678</td>
<td>Valid until May 10, 2024</td>
</tr>
<tr>
<td>Air Velocity</td>
<td>SNI 7062: 2019</td>
<td>Anemometer Lutron AM-4214SD SN:LA23456789</td>
<td>Valid until March 20, 2024</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">5. NOTES AND RECOMMENDATIONS</div>
<p>Based on the measurement results, the following findings and recommendations are provided:</p>
<ol>
<li>Most of the rooms measured have work climate parameters within the standard limits set by PMK RI No.2 Year 2023.</li>
<li>The Production Line A area shows humidity level (65% RH) exceeding the standard limit (40-60% RH). It is recommended to:
<ul>
<li>Check and optimize the HVAC system serving this area</li>
<li>Consider installing additional dehumidifiers</li>
<li>Ensure proper ventilation to reduce moisture buildup</li>
</ul>
</li>
<li>Regular maintenance of air conditioning and ventilation systems is recommended to maintain optimal work climate conditions.</li>
</ol>
</div>
<div class="section">
<div class="section-title">6. REGULATION REFERENCES</div>
<p>This measurement report refers to:</p>
<ol>
<li>PMK RI No.2 Year 2023 regarding Environmental Health Quality Standards and Health Requirements</li>
<li>SNI 7062: 2019 regarding Work Climate Measurement Methods</li>
</ol>
</div>
<div class="footer clearfix">
<p>Report Issue Date: April 28, 2024</p>
<p>This report is only valid for the samples measured and may not be reproduced partially without written approval from the laboratory.</p>
<div class="signature">
<p>Analyst</p>
<div class="signature-line"></div>
<p>Ratna Dewi</p>
<p>Senior Analyst</p>
</div>
<div class="signature">
<p>Verified by</p>
<div class="signature-line"></div>
<p>Hendra Wijaya</p>
<p>Testing Supervisor</p>
</div>
<div class="signature">
<p>Approved by</p>
<div class="signature-line"></div>
<p>Farida Nurhasanah</p>
<p>Laboratory Manager</p>
</div>
</div>
<div style="text-align: center; margin-top: 50px; font-size: 10px;">
<p>*END OF REPORT*</p>
<p>Page 1 of 1</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,301 @@
-- Master Data untuk Pengelolaan Laporan Pengukuran Iklim Kerja Suhu
-- Berdasarkan PMK RI No.2 Tahun 2023
-- Tabel Master Regulasi
CREATE TABLE master_regulasi (
regulasi_id INT PRIMARY KEY AUTO_INCREMENT,
kode_regulasi VARCHAR(50) NOT NULL,
nama_regulasi VARCHAR(200) NOT NULL,
instansi_penerbit VARCHAR(100) NOT NULL,
tahun_terbit INT NOT NULL,
tanggal_berlaku DATE,
deskripsi TEXT,
file_path VARCHAR(255),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Tabel Master Parameter Lingkungan Kerja
CREATE TABLE master_parameter (
parameter_id INT PRIMARY KEY AUTO_INCREMENT,
kode_parameter VARCHAR(50) NOT NULL,
nama_parameter VARCHAR(100) NOT NULL,
kelompok_parameter VARCHAR(50), -- Fisika, Kimia, Biologi
satuan VARCHAR(20),
metode_analisis VARCHAR(100),
deskripsi TEXT,
harga DECIMAL(12, 2),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Tabel Master Nilai Ambang Batas untuk Iklim Kerja
CREATE TABLE master_nilai_ambang_batas (
nab_id INT PRIMARY KEY AUTO_INCREMENT,
regulasi_id INT,
parameter_id INT,
tipe_ruangan VARCHAR(100) NOT NULL,
nilai_minimal DECIMAL(8, 2),
nilai_maksimal DECIMAL(8, 2),
satuan VARCHAR(20),
keterangan TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (regulasi_id) REFERENCES master_regulasi(regulasi_id),
FOREIGN KEY (parameter_id) REFERENCES master_parameter(parameter_id)
);
-- Tabel Master Pelanggan
CREATE TABLE master_pelanggan (
pelanggan_id INT PRIMARY KEY AUTO_INCREMENT,
kode_pelanggan VARCHAR(50) NOT NULL,
nama_pelanggan VARCHAR(200) NOT NULL,
alamat TEXT,
kota VARCHAR(100),
provinsi VARCHAR(100),
kode_pos VARCHAR(20),
no_telepon VARCHAR(50),
email VARCHAR(100),
contact_person VARCHAR(100),
jabatan_contact VARCHAR(100),
bidang_usaha VARCHAR(100),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Tabel Master Personel (Petugas Sampling, Analis, dll)
CREATE TABLE master_personel (
personel_id INT PRIMARY KEY AUTO_INCREMENT,
nik VARCHAR(50) NOT NULL,
nama VARCHAR(100) NOT NULL,
jabatan VARCHAR(100),
departemen VARCHAR(100),
email VARCHAR(100),
no_telepon VARCHAR(50),
sertifikasi TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Tabel Master Peralatan Pengukuran
CREATE TABLE master_peralatan (
peralatan_id INT PRIMARY KEY AUTO_INCREMENT,
kode_peralatan VARCHAR(50) NOT NULL,
nama_peralatan VARCHAR(100) NOT NULL,
merk VARCHAR(100),
model VARCHAR(100),
nomor_seri VARCHAR(100),
tanggal_kalibrasi DATE,
tanggal_kalibrasi_selanjutnya DATE,
parameter_id INT,
spesifikasi TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (parameter_id) REFERENCES master_parameter(parameter_id)
);
-- Tabel Master Lokasi Sampling
CREATE TABLE master_lokasi_sampling (
lokasi_id INT PRIMARY KEY AUTO_INCREMENT,
pelanggan_id INT,
nama_lokasi VARCHAR(200) NOT NULL,
alamat TEXT,
koordinat_latitude DECIMAL(10, 8),
koordinat_longitude DECIMAL(11, 8),
jenis_ruangan VARCHAR(100),
deskripsi TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (pelanggan_id) REFERENCES master_pelanggan(pelanggan_id)
);
-- Tabel Permintaan Pengukuran (Form Request)
CREATE TABLE permintaan_pengukuran (
permintaan_id INT PRIMARY KEY AUTO_INCREMENT,
nomor_permintaan VARCHAR(50) NOT NULL,
pelanggan_id INT,
tanggal_permintaan DATE,
tanggal_rencana_sampling DATE,
contact_person VARCHAR(100),
status VARCHAR(50), -- draft, submitted, approved, scheduled, completed, canceled
catatan TEXT,
dibuat_oleh INT,
disetujui_oleh INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (pelanggan_id) REFERENCES master_pelanggan(pelanggan_id),
FOREIGN KEY (dibuat_oleh) REFERENCES master_personel(personel_id),
FOREIGN KEY (disetujui_oleh) REFERENCES master_personel(personel_id)
);
-- Tabel Detail Permintaan Pengukuran
CREATE TABLE detail_permintaan_pengukuran (
detail_permintaan_id INT PRIMARY KEY AUTO_INCREMENT,
permintaan_id INT,
parameter_id INT,
lokasi_id INT,
jumlah_titik INT DEFAULT 1,
harga_satuan DECIMAL(12, 2),
subtotal DECIMAL(12, 2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (permintaan_id) REFERENCES permintaan_pengukuran(permintaan_id),
FOREIGN KEY (parameter_id) REFERENCES master_parameter(parameter_id),
FOREIGN KEY (lokasi_id) REFERENCES master_lokasi_sampling(lokasi_id)
);
-- Tabel Jadwal Pengukuran
CREATE TABLE jadwal_pengukuran (
jadwal_id INT PRIMARY KEY AUTO_INCREMENT,
nomor_jadwal VARCHAR(50) NOT NULL,
permintaan_id INT,
tanggal_pengukuran DATE,
petugas_id INT,
status VARCHAR(50), -- scheduled, completed, rescheduled, canceled
catatan TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (permintaan_id) REFERENCES permintaan_pengukuran(permintaan_id),
FOREIGN KEY (petugas_id) REFERENCES master_personel(personel_id)
);
-- Tabel Laporan Hasil Uji Iklim Kerja
CREATE TABLE laporan_hasil_uji (
laporan_id INT PRIMARY KEY AUTO_INCREMENT,
nomor_laporan VARCHAR(50) NOT NULL,
permintaan_id INT,
jadwal_id INT,
tanggal_pengukuran DATE,
tanggal_terbit DATE,
pelanggan_id INT,
petugas_id INT,
diverifikasi_oleh INT,
disetujui_oleh INT,
status VARCHAR(50), -- draft, verification, approved, published, revised
halaman_jumlah INT DEFAULT 1,
catatan TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (permintaan_id) REFERENCES permintaan_pengukuran(permintaan_id),
FOREIGN KEY (jadwal_id) REFERENCES jadwal_pengukuran(jadwal_id),
FOREIGN KEY (pelanggan_id) REFERENCES master_pelanggan(pelanggan_id),
FOREIGN KEY (petugas_id) REFERENCES master_personel(personel_id),
FOREIGN KEY (diverifikasi_oleh) REFERENCES master_personel(personel_id),
FOREIGN KEY (disetujui_oleh) REFERENCES master_personel(personel_id)
);
-- Tabel Detail Hasil Pengukuran Iklim Kerja Suhu
CREATE TABLE hasil_pengukuran_suhu (
hasil_id INT PRIMARY KEY AUTO_INCREMENT,
laporan_id INT,
lokasi_id INT,
kode_sampel VARCHAR(50) NOT NULL,
waktu_pengukuran_mulai TIME,
waktu_pengukuran_selesai TIME,
parameter_id INT,
hasil_pengukuran DECIMAL(8, 2),
satuan VARCHAR(20),
metode VARCHAR(100),
nab_id INT,
keterangan TEXT,
peralatan_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (laporan_id) REFERENCES laporan_hasil_uji(laporan_id),
FOREIGN KEY (lokasi_id) REFERENCES master_lokasi_sampling(lokasi_id),
FOREIGN KEY (parameter_id) REFERENCES master_parameter(parameter_id),
FOREIGN KEY (nab_id) REFERENCES master_nilai_ambang_batas(nab_id),
FOREIGN KEY (peralatan_id) REFERENCES master_peralatan(peralatan_id)
);
-- ================================
-- INSERT DATA MASTER
-- ================================
-- Insert Master Regulasi
INSERT INTO master_regulasi (regulasi_id, kode_regulasi, nama_regulasi, instansi_penerbit, tahun_terbit, tanggal_berlaku, deskripsi, file_path, is_active) VALUES
(1, 'PMK-02-2023', 'Peraturan Menteri Kesehatan Republik Indonesia Nomor 2 Tahun 2023', 'Kementerian Kesehatan RI', 2023, '2023-02-01', 'Peraturan mengenai Standar Baku Mutu Kesehatan Lingkungan dan Persyaratan Kesehatan', '/documents/regulasi/PMK_02_2023.pdf', TRUE),
(2, 'PERMENAKER-05-2018', 'Peraturan Menteri Ketenagakerjaan Republik Indonesia Nomor 5 Tahun 2018', 'Kementerian Ketenagakerjaan RI', 2018, '2018-05-10', 'Peraturan mengenai Keselamatan dan Kesehatan Kerja Lingkungan Kerja', '/documents/regulasi/PERMENAKER_05_2018.pdf', TRUE);
-- Insert Master Parameter
INSERT INTO master_parameter (parameter_id, kode_parameter, nama_parameter, kelompok_parameter, satuan, metode_analisis, deskripsi, harga, is_active) VALUES
(1, 'SUHU', 'Suhu', 'Fisika', '°C', 'SNI 7062: 2019', 'Parameter iklim kerja untuk pengukuran suhu ruangan', 75000.00, TRUE),
(2, 'KELEMBABAN', 'Kelembaban', 'Fisika', '%RH', 'SNI 7062: 2019', 'Parameter iklim kerja untuk pengukuran kelembaban relatif', 75000.00, TRUE),
(3, 'ISBB', 'Indeks Suhu Basah dan Bola', 'Fisika', '°C', 'SNI 7062: 2019', 'Parameter iklim kerja untuk pengukuran ISBB indoor/outdoor', 100000.00, TRUE),
(4, 'KECUDARA', 'Kecepatan Aliran Udara', 'Fisika', 'm/s', 'SNI 7062: 2019', 'Parameter iklim kerja untuk pengukuran kecepatan aliran udara', 75000.00, TRUE);
-- Insert Master Nilai Ambang Batas untuk Parameter Suhu
INSERT INTO master_nilai_ambang_batas (nab_id, regulasi_id, parameter_id, tipe_ruangan, nilai_minimal, nilai_maksimal, satuan, keterangan, is_active) VALUES
(1, 1, 1, 'Administrasi', 20.00, 25.00, '°C', 'Ruang kerja administrasi dan perkantoran', TRUE),
(2, 1, 1, 'Ruangan Khusus', 18.00, 24.00, '°C', 'Ruang server, laboratorium, dll', TRUE),
(3, 1, 1, 'Produksi', 23.00, 26.00, '°C', 'Ruang produksi', TRUE),
(4, 1, 1, 'Ruang Umum', 22.00, 28.00, '°C', 'Ruang umum, kantin, lobi', TRUE),
(5, 1, 1, 'Toilet', 22.00, 28.00, '°C', 'Kamar mandi, toilet', TRUE),
(6, 1, 1, 'Gudang', 16.00, 30.00, '°C', 'Ruang penyimpanan, gudang', TRUE);
-- Insert Master Pelanggan
INSERT INTO master_pelanggan (pelanggan_id, kode_pelanggan, nama_pelanggan, alamat, kota, provinsi, kode_pos, no_telepon, email, contact_person, jabatan_contact, bidang_usaha, is_active) VALUES
(1, 'PLG-001', 'PT. Industri Manufaktur Indonesia', 'Jl. Industri Raya No. 123', 'Jakarta', 'DKI Jakarta', '12950', '021-5551234', 'contact@manufakturindonesia.com', 'Budi Santoso', 'HSE Manager', 'Manufaktur', TRUE),
(2, 'PLG-002', 'PT. Teknologi Digital Nusantara', 'Jl. Gatot Subroto Kav. 52-53', 'Jakarta', 'DKI Jakarta', '12710', '021-5552345', 'hrd@tdn.co.id', 'Siti Rahma', 'HR Director', 'Teknologi Informasi', TRUE),
(3, 'PLG-003', 'RSUD Kota Sehat', 'Jl. Kesehatan No. 45', 'Bandung', 'Jawa Barat', '40112', '022-7654321', 'info@rsudkotasehat.go.id', 'dr. Ahmad Hidayat', 'Direktur', 'Kesehatan', TRUE);
-- Insert Master Personel
INSERT INTO master_personel (personel_id, nik, nama, jabatan, departemen, email, no_telepon, sertifikasi, is_active) VALUES
(1, 'EMP-001', 'Hendra Wijaya', 'Supervisor Pengujian', 'Laboratorium', 'hendra@lab-env.co.id', '081234567890', 'Sertifikasi Pengambilan Contoh Uji Lingkungan Kerja', TRUE),
(2, 'EMP-002', 'Ratna Dewi', 'Analis Senior', 'Laboratorium', 'ratna@lab-env.co.id', '081234567891', 'Sertifikasi Analis Laboratorium, Ahli K3 Umum', TRUE),
(3, 'EMP-003', 'Deni Hermawan', 'Petugas Sampling', 'Laboratorium', 'deni@lab-env.co.id', '081234567892', 'Sertifikasi Pengambilan Contoh Uji', TRUE),
(4, 'EMP-004', 'Farida Nurhasanah', 'Manager Laboratorium', 'Laboratorium', 'farida@lab-env.co.id', '081234567893', 'Sertifikasi Manager Mutu, Sertifikasi Ahli K3', TRUE);
-- Insert Master Peralatan Pengukuran
INSERT INTO master_peralatan (peralatan_id, kode_peralatan, nama_peralatan, merk, model, nomor_seri, tanggal_kalibrasi, tanggal_kalibrasi_selanjutnya, parameter_id, spesifikasi, is_active) VALUES
(1, 'EQP-TH001', 'Thermohygrometer', 'Lutron', 'PHB-318', 'LT12345678', '2023-11-10', '2024-05-10', 1, 'Range suhu: -20°C hingga 60°C, akurasi ±0.8°C', TRUE),
(2, 'EQP-TH002', 'Thermohygrometer', 'Extech', 'RHT50', 'EX87654321', '2023-10-15', '2024-04-15', 1, 'Range suhu: -30°C hingga 70°C, akurasi ±0.5°C', TRUE),
(3, 'EQP-WBGT001', 'WBGT Meter', 'Lutron', 'WBGT-2010SD', 'LW12348765', '2023-11-05', '2024-05-05', 3, 'Range WBGT: 15°C hingga 59°C, akurasi ±0.8°C', TRUE),
(4, 'EQP-ANM001', 'Anemometer', 'Lutron', 'AM-4214SD', 'LA23456789', '2023-09-20', '2024-03-20', 4, 'Range kecepatan udara: 0.2 m/s hingga 35 m/s, akurasi ±2%', TRUE);
-- Insert Master Lokasi Sampling untuk PT. Industri Manufaktur Indonesia
INSERT INTO master_lokasi_sampling (lokasi_id, pelanggan_id, nama_lokasi, alamat, jenis_ruangan, deskripsi, is_active) VALUES
(1, 1, 'Ruang Meeting Utama', 'Lantai 2, Gedung Utama', 'Administrasi', 'Ruang meeting dengan kapasitas 20 orang', TRUE),
(2, 1, 'Ruang Kerja HRD', 'Lantai 2, Gedung Utama', 'Administrasi', 'Ruang kerja staff HRD', TRUE),
(3, 1, 'Ruang Server', 'Lantai 1, Gedung Utama', 'Ruangan Khusus', 'Ruang server dengan pendingin khusus', TRUE),
(4, 1, 'Area Produksi Line A', 'Lantai 1, Gedung Produksi', 'Produksi', 'Area produksi utama line A', TRUE),
(5, 1, 'Area Kantin', 'Lantai 1, Gedung Pendukung', 'Ruang Umum', 'Kantin karyawan dengan kapasitas 100 orang', TRUE);
-- ================================
-- CONTOH DATA TRANSAKSI
-- ================================
-- Contoh Permintaan Pengukuran
INSERT INTO permintaan_pengukuran (permintaan_id, nomor_permintaan, pelanggan_id, tanggal_permintaan, tanggal_rencana_sampling, contact_person, status, catatan, dibuat_oleh, disetujui_oleh) VALUES
(1, 'REQ/2024/04/001', 1, '2024-04-05', '2024-04-25', 'Budi Santoso', 'approved', 'Pengukuran rutin triwulanan untuk parameter iklim kerja', 3, 4);
-- Contoh Detail Permintaan Pengukuran
INSERT INTO detail_permintaan_pengukuran (detail_permintaan_id, permintaan_id, parameter_id, lokasi_id, jumlah_titik, harga_satuan, subtotal) VALUES
(1, 1, 1, 1, 1, 75000.00, 75000.00),
(2, 1, 1, 2, 1, 75000.00, 75000.00),
(3, 1, 1, 3, 1, 75000.00, 75000.00),
(4, 1, 1, 4, 1, 75000.00, 75000.00),
(5, 1, 1, 5, 1, 75000.00, 75000.00);
-- Contoh Jadwal Pengukuran
INSERT INTO jadwal_pengukuran (jadwal_id, nomor_jadwal, permintaan_id, tanggal_pengukuran, petugas_id, status, catatan) VALUES
(1, 'SCH/2024/04/001', 1, '2024-04-25', 3, 'completed', 'Pengukuran dilakukan pada jam operasional normal');
-- Contoh Laporan Hasil Uji
INSERT INTO laporan_hasil_uji (laporan_id, nomor_laporan, permintaan_id, jadwal_id, tanggal_pengukuran, tanggal_terbit, pelanggan_id, petugas_id, diverifikasi_oleh, disetujui_oleh, status, halaman_jumlah, catatan) VALUES
(1, 'LHU/KLIM/04/2024/001', 1, 1, '2024-04-25', '2024-04-28', 1, 3, 2, 4, 'published', 2, 'Hasil pengukuran menunjukkan semua parameter dalam batas normal');
-- Contoh Hasil Pengukuran Suhu
INSERT INTO hasil_pengukuran_suhu (hasil_id, laporan_id, lokasi_id, kode_sampel, waktu_pengukuran_mulai, waktu_pengukuran_selesai, parameter_id, hasil_pengukuran, satuan, metode, nab_id, keterangan, peralatan_id) VALUES
(1, 1, 1, 'C2504090001', '09:00:00', '09:15:00', 1, 21.00, '°C', 'SNI 7062: 2019', 1, NULL, 1),
(2, 1, 2, 'C2504090002', '09:30:00', '09:45:00', 1, 22.00, '°C', 'SNI 7062: 2019', 1, NULL, 1),
(3, 1, 3, 'C2504090003', '10:00:00', '10:15:00', 1, 19.00, '°C', 'SNI 7062: 2019', 2, NULL, 1),
(4, 1, 4, 'C2504090004', '10:30:00', '10:45:00', 1, 26.00, '°C', 'SNI 7062: 2019', 3, NULL, 1),
(5, 1, 5, 'C2504090005', '11:00:00', '11:15:00', 1, 24.00, '°C', 'SNI 7062: 2019', 4, NULL, 1);

View File

@@ -0,0 +1,419 @@
<?php
/**
* Iklim Kerja Suhu Report Generator
*
* Script untuk menghasilkan laporan pengukuran iklim kerja suhu
* berdasarkan PMK RI No.2 Tahun 2023
*/
// Konfigurasi database
$db_config = [
'host' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'lab_lingkungan_db'
];
// Koneksi ke database
function connectDB($config) {
try {
$conn = new PDO(
"mysql:host={$config['host']};dbname={$config['database']}",
$config['username'],
$config['password']
);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
} catch(PDOException $e) {
die("Koneksi database gagal: " . $e->getMessage());
}
}
// Ambil data laporan berdasarkan ID
function getLaporanData($conn, $laporan_id) {
$query = "
SELECT
l.*,
p.nama_pelanggan, p.alamat, p.kota, p.provinsi, p.kode_pos,
ps.nama AS petugas_sampling,
DATE_FORMAT(l.tanggal_pengukuran, '%d %M %Y') AS tanggal_pengukuran_format,
DATE_FORMAT(l.tanggal_terbit, '%d %M %Y') AS tanggal_terbit_format
FROM
laporan_hasil_uji l
JOIN
master_pelanggan p ON l.pelanggan_id = p.pelanggan_id
JOIN
master_personel ps ON l.petugas_id = ps.personel_id
WHERE
l.laporan_id = :laporan_id
";
$stmt = $conn->prepare($query);
$stmt->execute(['laporan_id' => $laporan_id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
// Ambil data hasil pengukuran
function getHasilPengukuran($conn, $laporan_id) {
$query = "
SELECT
h.*,
ls.nama_lokasi,
p.nama_parameter, p.satuan,
nab.nilai_minimal, nab.nilai_maksimal, nab.tipe_ruangan,
e.nama_peralatan, e.merk, e.model, e.nomor_seri
FROM
hasil_pengukuran_suhu h
JOIN
master_lokasi_sampling ls ON h.lokasi_id = ls.lokasi_id
JOIN
master_parameter p ON h.parameter_id = p.parameter_id
JOIN
master_nilai_ambang_batas nab ON h.nab_id = nab.nab_id
JOIN
master_peralatan e ON h.peralatan_id = e.peralatan_id
WHERE
h.laporan_id = :laporan_id
ORDER BY
h.hasil_id ASC
";
$stmt = $conn->prepare($query);
$stmt->execute(['laporan_id' => $laporan_id]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Ambil data personel untuk tanda tangan
function getPersonelData($conn, $personel_id) {
$query = "
SELECT
*
FROM
master_personel
WHERE
personel_id = :personel_id
";
$stmt = $conn->prepare($query);
$stmt->execute(['personel_id' => $personel_id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
// Generate HTML laporan
function generateLaporanHTML($laporan, $hasil_pengukuran, $verifikator, $penguji) {
ob_start();
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Laporan Hasil Uji Iklim Kerja Suhu</title>
<style>
@page {
size: A4;
margin: 1cm;
}
* {
box-sizing: border-box;
font-family: Arial, sans-serif;
}
body {
margin: 0;
padding: 0;
font-size: 12pt;
line-height: 1.3;
}
.container {
max-width: 21cm;
margin: 0 auto;
padding: 0.5cm;
position: relative;
}
.header {
position: relative;
border-bottom: 2px solid #000;
padding-bottom: 10px;
margin-bottom: 20px;
}
.report-number {
position: absolute;
top: 0;
right: 0;
text-align: right;
font-size: 10pt;
}
.company-code {
position: absolute;
top: 0;
right: 0;
text-align: right;
font-size: 10pt;
}
.page-number {
position: absolute;
top: 50px;
right: 0;
font-size: 72pt;
font-weight: bold;
color: #000;
}
.report-title {
text-align: center;
margin-bottom: 20px;
}
.report-title h1 {
font-size: 16pt;
font-weight: bold;
margin: 0;
text-transform: uppercase;
}
.report-subtitle {
font-size: 12pt;
margin: 5px 0;
text-align: center;
}
.client-info {
margin-bottom: 20px;
}
.client-info-row {
display: flex;
margin-bottom: 5px;
}
.client-info-label {
width: 150px;
}
.client-info-colon {
width: 20px;
text-align: center;
}
.measurement-title {
text-align: center;
font-weight: bold;
margin: 20px 0;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
}
table, th, td {
border: 1px solid #000;
}
th, td {
padding: 8px;
text-align: center;
vertical-align: middle;
}
th {
background-color: #fff;
font-weight: bold;
}
.reference-header {
text-align: center;
}
.issue-date {
margin-top: 20px;
margin-bottom: 20px;
}
.notes {
margin-top: 20px;
border: 1px solid #000;
padding: 10px;
min-height: 100px;
}
.signatures {
display: flex;
justify-content: space-between;
margin-top: 40px;
}
.signature-box {
width: 30%;
text-align: center;
}
.signature-line {
margin-top: 80px;
border-top: 1px solid #000;
margin-bottom: 5px;
}
@media print {
.container {
padding: 0;
}
@page {
size: A4;
margin: 1cm;
}
}
</style>
</head>
<body>
<div class="container">
<div class="company-code">Kode Lab: FLHU/<?php echo date('y'); ?>/<?php echo date('m'); ?>/<?php echo sprintf('%03d', $laporan['laporan_id']); ?></div>
<div class="report-title">
<h1>LAPORAN HASIL UJI</h1>
<p class="report-subtitle">NO : <?php echo $laporan['nomor_laporan']; ?></p>
</div>
<div class="page-number">2</div>
<div class="client-info">
<div class="client-info-row">
<div class="client-info-label">Nama Pelanggan</div>
<div class="client-info-colon">:</div>
<div class="client-info-value"><?php echo $laporan['nama_pelanggan']; ?></div>
</div>
<div class="client-info-row">
<div class="client-info-label">Alamat pelanggan</div>
<div class="client-info-colon">:</div>
<div class="client-info-value"><?php echo $laporan['alamat'] . ', ' . $laporan['kota'] . ', ' . $laporan['provinsi'] . ' ' . $laporan['kode_pos']; ?></div>
</div>
<div class="client-info-row">
<div class="client-info-label">Petugas sampling</div>
<div class="client-info-colon">:</div>
<div class="client-info-value"><?php echo $laporan['petugas_sampling']; ?></div>
</div>
<div class="client-info-row">
<div class="client-info-label">Tanggal pengukuran</div>
<div class="client-info-colon">:</div>
<div class="client-info-value"><?php echo $laporan['tanggal_pengukuran_format']; ?></div>
</div>
</div>
<div class="measurement-title">
Hasil Pengujian Iklim Kerja Suhu
</div>
<table>
<thead>
<tr>
<th rowspan="2">No</th>
<th rowspan="2">Lokasi Pengukuran</th>
<th rowspan="2">Kode sampel</th>
<th rowspan="2">Waktu<br>Pengukuran</th>
<th rowspan="2">Hasil</th>
<th rowspan="2">Satuan</th>
<th rowspan="2">Metode</th>
<th colspan="2" class="reference-header">Referensi : PMK RI No.2 Tahun 2023</th>
<th rowspan="2">Keterangan</th>
</tr>
<tr>
<th>NAB</th>
<th>Ruang</th>
</tr>
</thead>
<tbody>
<?php $no = 1; foreach ($hasil_pengukuran as $hasil): ?>
<tr>
<td><?php echo $no++; ?></td>
<td><?php echo $hasil['nama_lokasi']; ?></td>
<td><?php echo $hasil['kode_sampel']; ?></td>
<td><?php
echo date('H.i', strtotime($hasil['waktu_pengukuran_mulai'])) . ' - ' .
date('H.i', strtotime($hasil['waktu_pengukuran_selesai']));
?></td>
<td><?php echo number_format($hasil['hasil_pengukuran'], 0); ?></td>
<td><?php echo $hasil['satuan']; ?></td>
<td><?php echo $hasil['metode']; ?></td>
<td><?php echo number_format($hasil['nilai_minimal'], 0) . ' - ' . number_format($hasil['nilai_maksimal'], 0); ?></td>
<td><?php echo $hasil['tipe_ruangan']; ?></td>
<td><?php echo $hasil['keterangan']; ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<div class="issue-date">
Diterbitkan tanggal : <?php echo $laporan['tanggal_terbit_format']; ?>
</div>
<div class="notes">
<div>Catatan :</div>
<?php echo nl2br($laporan['catatan']); ?>
</div>
<div class="signatures">
<div class="signature-box">
<div>Diverifikasi oleh,</div>
<div class="signature-line"></div>
<div><strong><?php echo $verifikator['nama']; ?></strong></div>
<div><?php echo $verifikator['jabatan']; ?></div>
</div>
<div class="signature-box">
<div></div>
<div class="signature-line"></div>
<div></div>
</div>
<div class="signature-box">
<div>Diukur oleh,</div>
<div class="signature-line"></div>
<div><strong><?php echo $penguji['nama']; ?></strong></div>
<div><?php echo $penguji['jabatan']; ?></div>
</div>
</div>
</div>
</body>
</html>
<?php
return ob_get_clean();
}
// Proses dan tampilkan laporan
function processReport($laporan_id) {
global $db_config;
$conn = connectDB($db_config);
// Ambil data laporan
$laporan = getLaporanData($conn, $laporan_id);
if (!$laporan) {
die("Laporan dengan ID {$laporan_id} tidak ditemukan");
}
// Ambil data hasil pengukuran
$hasil_pengukuran = getHasilPengukuran($conn, $laporan_id);
// Ambil data personel
$verifikator = getPersonelData($conn, $laporan['diverifikasi_oleh']);
$penguji = getPersonelData($conn, $laporan['petugas_id']);
// Generate laporan HTML
$html = generateLaporanHTML($laporan, $hasil_pengukuran, $verifikator, $penguji);
return $html;
}
// Jalankan aplikasi (contoh penggunaan)
$laporan_id = isset($_GET['id']) ? (int)$_GET['id'] : 1;
$html = processReport($laporan_id);
echo $html;
?>

View File

@@ -0,0 +1,319 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Laporan Hasil Uji Iklim Kerja Suhu</title>
<style>
@page {
size: A4;
margin: 1cm;
}
* {
box-sizing: border-box;
font-family: Arial, sans-serif;
}
body {
margin: 0;
padding: 0;
font-size: 12pt;
line-height: 1.3;
}
.container {
max-width: 21cm;
margin: 0 auto;
padding: 0.5cm;
position: relative;
}
.header {
position: relative;
border-bottom: 2px solid #000;
padding-bottom: 10px;
margin-bottom: 20px;
}
.report-number {
position: absolute;
top: 0;
right: 0;
text-align: right;
font-size: 10pt;
}
.company-code {
position: absolute;
top: 0;
right: 0;
text-align: right;
font-size: 10pt;
}
.page-number {
position: absolute;
top: 50px;
right: 0;
font-size: 72pt;
font-weight: bold;
color: #000;
}
.report-title {
text-align: center;
margin-bottom: 20px;
}
.report-title h1 {
font-size: 16pt;
font-weight: bold;
margin: 0;
text-transform: uppercase;
}
.report-subtitle {
font-size: 12pt;
margin: 5px 0;
text-align: center;
}
.client-info {
margin-bottom: 20px;
}
.client-info-row {
display: flex;
margin-bottom: 5px;
}
.client-info-label {
width: 150px;
}
.client-info-colon {
width: 20px;
text-align: center;
}
.measurement-title {
text-align: center;
font-weight: bold;
margin: 20px 0;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
}
table, th, td {
border: 1px solid #000;
}
th, td {
padding: 8px;
text-align: center;
vertical-align: middle;
}
th {
background-color: #fff;
font-weight: bold;
}
.reference-header {
text-align: center;
}
.issue-date {
margin-top: 20px;
margin-bottom: 20px;
}
.notes {
margin-top: 20px;
border: 1px solid #000;
padding: 10px;
min-height: 100px;
}
.signatures {
display: flex;
justify-content: space-between;
margin-top: 40px;
}
.signature-box {
width: 30%;
text-align: center;
}
.signature-line {
margin-top: 80px;
border-top: 1px solid #000;
margin-bottom: 5px;
}
@media print {
.container {
padding: 0;
}
@page {
size: A4;
margin: 1cm;
}
}
</style>
</head>
<body>
<div class="container">
<div class="company-code">Kode Lab: FLHU/../../....</div>
<div class="report-title">
<h1>LAPORAN HASIL UJI</h1>
<p class="report-subtitle">NO : ...../klim/bulan/tahun</p>
</div>
<div class="page-number">2</div>
<div class="client-info">
<div class="client-info-row">
<div class="client-info-label">Nama Pelanggan</div>
<div class="client-info-colon">:</div>
<div class="client-info-value"></div>
</div>
<div class="client-info-row">
<div class="client-info-label">Alamat pelanggan</div>
<div class="client-info-colon">:</div>
<div class="client-info-value"></div>
</div>
<div class="client-info-row">
<div class="client-info-label">Petugas sampling</div>
<div class="client-info-colon">:</div>
<div class="client-info-value"></div>
</div>
<div class="client-info-row">
<div class="client-info-label">Tanggal pengukuran</div>
<div class="client-info-colon">:</div>
<div class="client-info-value"></div>
</div>
</div>
<div class="measurement-title">
Hasil Pengujian Iklim Kerja Suhu
</div>
<table>
<thead>
<tr>
<th rowspan="2">No</th>
<th rowspan="2">Lokasi Pengukuran</th>
<th rowspan="2">Kode sampel</th>
<th rowspan="2">Waktu<br>Pengukuran</th>
<th rowspan="2">Hasil</th>
<th rowspan="2">Satuan</th>
<th rowspan="2">Metode</th>
<th colspan="2" class="reference-header">Referensi : PMK RI No.2 Tahun 2023</th>
<th rowspan="2">Keterangan</th>
</tr>
<tr>
<th>NAB</th>
<th>Ruang</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Ruang Meeting</td>
<td>C2504090001</td>
<td>09.00 - 09.15</td>
<td>21</td>
<td>°C</td>
<td>SNI 7062: 2019</td>
<td>20 - 25</td>
<td>Administrasi</td>
<td></td>
</tr>
<tr>
<td>2</td>
<td>Ruang Kerja</td>
<td>C2504090002</td>
<td>09.30 - 09.45</td>
<td>22</td>
<td>°C</td>
<td>SNI 7062: 2019</td>
<td>20 - 25</td>
<td>Administrasi</td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>Ruang Server</td>
<td>C2504090003</td>
<td>10.00 - 10.15</td>
<td>19</td>
<td>°C</td>
<td>SNI 7062: 2019</td>
<td>18 - 24</td>
<td>Ruangan Khusus</td>
<td></td>
</tr>
<tr>
<td>4</td>
<td>Ruang Produksi</td>
<td>C2504090004</td>
<td>10.30 - 10.45</td>
<td>26</td>
<td>°C</td>
<td>SNI 7062: 2019</td>
<td>23 - 26</td>
<td>Produksi</td>
<td></td>
</tr>
<tr>
<td>5</td>
<td>Area Kantin</td>
<td>C2504090005</td>
<td>11.00 - 11.15</td>
<td>24</td>
<td>°C</td>
<td>SNI 7062: 2019</td>
<td>22 - 28</td>
<td>Ruang Umum</td>
<td></td>
</tr>
</tbody>
</table>
<div class="issue-date">
Diterbitkan tanggal :
</div>
<div class="notes">
<div>Catatan :</div>
</div>
<div class="signatures">
<div class="signature-box">
<div>Diverifikasi oleh,</div>
<div class="signature-line"></div>
<div></div>
</div>
<div class="signature-box">
<div></div>
<div class="signature-line"></div>
<div></div>
</div>
<div class="signature-box">
<div>Diukur oleh,</div>
<div class="signature-line"></div>
<div></div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,195 @@
-- Database Structure and Sample Data for ISBB Work Climate Measurement
-- Based on Permenaker No.5 Tahun 2018
-- ------------------------------------------------------------------------------
-- Master Tables - ISBB Specific
-- ------------------------------------------------------------------------------
-- Master Kategori Beban Kerja (Work Load Categories)
CREATE TABLE IF NOT EXISTS master_kategori_beban_kerja (
id_kategori INT PRIMARY KEY,
nama_kategori VARCHAR(50) NOT NULL,
keterangan TEXT,
kisaran_energi VARCHAR(50),
contoh_aktivitas TEXT,
status BOOLEAN DEFAULT TRUE,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50)
);
-- Master Alokasi Kerja-Istirahat (Work-Rest Allocation)
CREATE TABLE IF NOT EXISTS master_alokasi_kerja_istirahat (
id_alokasi INT PRIMARY KEY,
nama_alokasi VARCHAR(50) NOT NULL,
persentase_kerja VARCHAR(20) NOT NULL,
persentase_istirahat VARCHAR(20) NOT NULL,
keterangan TEXT,
status BOOLEAN DEFAULT TRUE,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50)
);
-- Master Baku Mutu ISBB (WBGT Standard Values)
CREATE TABLE IF NOT EXISTS master_bakumutu_isbb (
id_bakumutu_isbb INT PRIMARY KEY,
id_regulasi INT NOT NULL,
id_kategori INT NOT NULL,
id_alokasi INT NOT NULL,
nilai_baku_mutu DECIMAL(5, 2) NOT NULL,
keterangan TEXT,
status BOOLEAN DEFAULT TRUE,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50),
FOREIGN KEY (id_regulasi) REFERENCES master_regulasi(id_regulasi),
FOREIGN KEY (id_kategori) REFERENCES master_kategori_beban_kerja(id_kategori),
FOREIGN KEY (id_alokasi) REFERENCES master_alokasi_kerja_istirahat(id_alokasi)
);
-- ------------------------------------------------------------------------------
-- Transaction Tables - ISBB Specific
-- ------------------------------------------------------------------------------
-- Hasil Pengukuran ISBB (WBGT Measurement Results)
CREATE TABLE IF NOT EXISTS trx_hasil_ukur_isbb (
id_hasil_ukur_isbb INT PRIMARY KEY,
id_sampling_plan INT NOT NULL,
kode_laporan VARCHAR(50) NOT NULL,
tanggal_sampling DATE NOT NULL,
waktu_mulai TIME,
waktu_selesai TIME,
kondisi_cuaca VARCHAR(100),
petugas_sampling VARCHAR(100),
status_laporan VARCHAR(20) DEFAULT 'DRAFT',
catatan TEXT,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50),
FOREIGN KEY (id_sampling_plan) REFERENCES trx_sampling_plan_iklim(id_sampling_plan)
);
-- Detail Hasil Pengukuran ISBB (WBGT Measurement Detail)
CREATE TABLE IF NOT EXISTS trx_hasil_ukur_isbb_detail (
id_hasil_ukur_isbb_detail INT PRIMARY KEY,
id_hasil_ukur_isbb INT NOT NULL,
kode_titik VARCHAR(20) NOT NULL,
nama_lokasi VARCHAR(255) NOT NULL,
jenis_pekerjaan VARCHAR(255) NOT NULL,
id_kategori INT NOT NULL,
id_alokasi INT NOT NULL,
suhu_basah DECIMAL(5, 2) NOT NULL, -- natural wet bulb (Tnw)
suhu_bola DECIMAL(5, 2) NOT NULL, -- globe temperature (Tg)
suhu_kering DECIMAL(5, 2) NOT NULL, -- dry bulb (Ta)
nilai_isbb DECIMAL(5, 2) NOT NULL, -- calculated WBGT value
id_bakumutu_isbb INT NOT NULL,
status_kesesuaian VARCHAR(20),
rekomendasi TEXT,
lokasi_pengukuran VARCHAR(100),
tinggi_pengukuran DECIMAL(4, 2),
catatan TEXT,
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50),
FOREIGN KEY (id_hasil_ukur_isbb) REFERENCES trx_hasil_ukur_isbb(id_hasil_ukur_isbb),
FOREIGN KEY (id_kategori) REFERENCES master_kategori_beban_kerja(id_kategori),
FOREIGN KEY (id_alokasi) REFERENCES master_alokasi_kerja_istirahat(id_alokasi),
FOREIGN KEY (id_bakumutu_isbb) REFERENCES master_bakumutu_isbb(id_bakumutu_isbb)
);
-- Rekomendasi Pengendalian (Control Recommendations)
CREATE TABLE IF NOT EXISTS trx_rekomendasi_pengendalian_isbb (
id_rekomendasi INT PRIMARY KEY,
id_hasil_ukur_isbb_detail INT NOT NULL,
jenis_pengendalian VARCHAR(50) NOT NULL,
deskripsi_pengendalian TEXT NOT NULL,
prioritas INT,
estimasi_biaya DECIMAL(12, 2),
perkiraan_efektivitas TEXT,
status_implementasi VARCHAR(20) DEFAULT 'PLANNED',
tanggal_input TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_input VARCHAR(50),
FOREIGN KEY (id_hasil_ukur_isbb_detail) REFERENCES trx_hasil_ukur_isbb_detail(id_hasil_ukur_isbb_detail)
);
-- ------------------------------------------------------------------------------
-- Sample Data Insertion - Master Tables
-- ------------------------------------------------------------------------------
-- Insert Data Master Kategori Beban Kerja
INSERT INTO master_kategori_beban_kerja (id_kategori, nama_kategori, keterangan, kisaran_energi, contoh_aktivitas, status, user_input)
VALUES
(1, 'Ringan', 'Beban kerja ringan dengan pengeluaran energi minimal', '100-200 Kcal/jam', 'Pekerjaan administratif, kontrol ruangan, pekerjaan perakitan ringan, mengemudi', TRUE, 'admin'),
(2, 'Sedang', 'Beban kerja sedang dengan aktivitas fisik moderat', '200-350 Kcal/jam', 'Berjalan normal, mengangkat beban sedang, mendorong atau menarik, perakitan / perbaikan mesin', TRUE, 'admin'),
(3, 'Berat', 'Beban kerja berat dengan aktivitas fisik intens', '350-500 Kcal/jam', 'Berjalan cepat/naik tangga, mengangkat beban berat, pekerjaan konstruksi, penggalian, penambangan', TRUE, 'admin');
-- Insert Data Master Alokasi Kerja-Istirahat
INSERT INTO master_alokasi_kerja_istirahat (id_alokasi, nama_alokasi, persentase_kerja, persentase_istirahat, keterangan, status, user_input)
VALUES
(1, '75-100% Kerja', '75-100%', '0-25%', 'Alokasi 75-100% waktu untuk bekerja, 0-25% untuk istirahat dalam satu jam', TRUE, 'admin'),
(2, '50-75% Kerja', '50-75%', '25-50%', 'Alokasi 50-75% waktu untuk bekerja, 25-50% untuk istirahat dalam satu jam', TRUE, 'admin'),
(3, '25-50% Kerja', '25-50%', '50-75%', 'Alokasi 25-50% waktu untuk bekerja, 50-75% untuk istirahat dalam satu jam', TRUE, 'admin'),
(4, '0-25% Kerja', '0-25%', '75-100%', 'Alokasi 0-25% waktu untuk bekerja, 75-100% untuk istirahat dalam satu jam', TRUE, 'admin');
-- Insert Data Master Baku Mutu ISBB
INSERT INTO master_bakumutu_isbb (id_bakumutu_isbb, id_regulasi, id_kategori, id_alokasi, nilai_baku_mutu, keterangan, status, user_input)
VALUES
-- Kategori Ringan
(1, 2, 1, 1, 31.0, 'Nilai ISBB maksimum untuk beban kerja ringan dengan alokasi kerja 75-100%', TRUE, 'admin'),
(2, 2, 1, 2, 31.0, 'Nilai ISBB maksimum untuk beban kerja ringan dengan alokasi kerja 50-75%', TRUE, 'admin'),
(3, 2, 1, 3, 32.0, 'Nilai ISBB maksimum untuk beban kerja ringan dengan alokasi kerja 25-50%', TRUE, 'admin'),
(4, 2, 1, 4, 32.2, 'Nilai ISBB maksimum untuk beban kerja ringan dengan alokasi kerja 0-25%', TRUE, 'admin'),
-- Kategori Sedang
(5, 2, 2, 1, 28.0, 'Nilai ISBB maksimum untuk beban kerja sedang dengan alokasi kerja 75-100%', TRUE, 'admin'),
(6, 2, 2, 2, 29.0, 'Nilai ISBB maksimum untuk beban kerja sedang dengan alokasi kerja 50-75%', TRUE, 'admin'),
(7, 2, 2, 3, 30.0, 'Nilai ISBB maksimum untuk beban kerja sedang dengan alokasi kerja 25-50%', TRUE, 'admin'),
(8, 2, 2, 4, 31.1, 'Nilai ISBB maksimum untuk beban kerja sedang dengan alokasi kerja 0-25%', TRUE, 'admin'),
-- Kategori Berat
(9, 2, 3, 1, NULL, 'Untuk beban kerja berat tidak direkomendasikan alokasi kerja 75-100%', TRUE, 'admin'),
(10, 2, 3, 2, 27.5, 'Nilai ISBB maksimum untuk beban kerja berat dengan alokasi kerja 50-75%', TRUE, 'admin'),
(11, 2, 3, 3, 29.0, 'Nilai ISBB maksimum untuk beban kerja berat dengan alokasi kerja 25-50%', TRUE, 'admin'),
(12, 2, 3, 4, 30.0, 'Nilai ISBB maksimum untuk beban kerja berat dengan alokasi kerja 0-25%', TRUE, 'admin');
-- ------------------------------------------------------------------------------
-- Sample Data Insertion - Transaction Tables
-- ------------------------------------------------------------------------------
-- Contoh Data Sampling Plan (Referensi dari tabel yang sudah ada)
INSERT INTO trx_sampling_plan_iklim (id_sampling_plan, kode_sampling_plan, nama_project, id_client, tanggal_rencana_sampling, lokasi_sampling, jumlah_titik, status_approval, catatan, tanggal_input, user_input)
VALUES
(2, 'SP-ISBB-2024-001', 'Pengukuran ISBB di PT. Indonesia Steel Manufacturing', 102, '2024-05-12', 'PT. Indonesia Steel Manufacturing, Jl. Industri Baja No. 75, Cikarang, Bekasi', 5, 'APPROVED', 'Pengukuran ISBB untuk area furnace, casting, rolling mill, welding, dan control room', '2024-05-01 10:30:00', 'supervisor');
-- Contoh Data Hasil Pengukuran ISBB
INSERT INTO trx_hasil_ukur_isbb (id_hasil_ukur_isbb, id_sampling_plan, kode_laporan, tanggal_sampling, waktu_mulai, waktu_selesai, kondisi_cuaca, petugas_sampling, status_laporan, catatan, tanggal_input, user_input)
VALUES
(1, 2, 'LHU/ISBB/05/2024/001', '2024-05-12', '10:00:00', '14:30:00', 'Cuaca cerah, suhu luar 33°C', 'Ahmad Kusuma, Budi Santoso', 'FINAL', 'Pengukuran berjalan dengan baik', '2024-05-12 16:45:00', 'analyst');
-- Contoh Data Detail Hasil Pengukuran ISBB
INSERT INTO trx_hasil_ukur_isbb_detail (id_hasil_ukur_isbb_detail, id_hasil_ukur_isbb, kode_titik, nama_lokasi, jenis_pekerjaan, id_kategori, id_alokasi, suhu_basah, suhu_bola, suhu_kering, nilai_isbb, id_bakumutu_isbb, status_kesesuaian, rekomendasi, lokasi_pengukuran, tinggi_pengukuran, catatan, tanggal_input, user_input)
VALUES
-- Furnace Operation Area
(1, 1, 'T1', 'Furnace Operation Area', 'Furnace monitoring and control', 2, 1, 27.8, 35.6, 32.5, 29.7, 5, 'NOT_COMPLY', 'Tingkatkan ventilasi, kurangi waktu paparan, atau ubah alokasi kerja', 'Dekat panel kontrol operator', 1.1, 'Pengukuran dilakukan saat furnace beroperasi normal', '2024-05-12 16:50:00', 'analyst'),
-- Cold Rolling Mill
(2, 1, 'T2', 'Cold Rolling Mill', 'Machine operation and material handling', 2, 1, 25.2, 31.5, 30.1, 26.8, 5, 'COMPLY', '', 'Area operator mesin rolling', 1.1, 'Pengukuran dilakukan saat proses rolling berjalan normal', '2024-05-12 17:00:00', 'analyst'),
-- Steel Casting Section
(3, 1, 'T3', 'Steel Casting Section', 'Heavy manual casting tasks', 3, 2, 28.4, 36.8, 33.2, 30.2, 10, 'NOT_COMPLY', 'Pasang pelindung panas tambahan, ubah alokasi kerja menjadi 25% kerja', 'Area penuangan logam', 1.1, 'Suhu sangat tinggi di sekitar area penuangan', '2024-05-12 17:15:00', 'analyst'),
-- Welding Section
(4, 1, 'T4', 'Welding Section', 'Manual welding tasks', 2, 2, 24.6, 31.0, 29.5, 26.1, 6, 'COMPLY', '', 'Area pengelasan manual', 1.1, 'Pengukuran dilakukan pada jarak 1.5 meter dari titik pengelasan', '2024-05-12 17:30:00', 'analyst'),
-- Production Control Room
(5, 1, 'T5', 'Production Control Room', 'Monitoring and administrative tasks', 1, 1, 23.8, 29.2, 28.6, 25.2, 1, 'COMPLY', '', 'Ruang kontrol produksi', 1.1, 'Ruangan ber-AC, kondisi stabil', '2024-05-12 17:45:00', 'analyst');
-- Contoh Data Rekomendasi Pengendalian
INSERT INTO trx_rekomendasi_pengendalian_isbb (id_rekomendasi, id_hasil_ukur_isbb_detail, jenis_pengendalian, deskripsi_pengendalian, prioritas, estimasi_biaya, perkiraan_efektivitas, status_implementasi, tanggal_input, user_input)
VALUES
-- Rekomendasi untuk Furnace Area
(1, 1, 'Pengendalian Teknik', 'Pemasangan local exhaust ventilation tambahan di area furnace', 1, 25000000.00, 'Diperkirakan dapat menurunkan ISBB 1.5-2°C', 'PLANNED', '2024-05-13 09:00:00', 'analyst'),
(2, 1, 'Pengendalian Administratif', 'Mengubah alokasi kerja menjadi 50% kerja, 50% istirahat', 1, 0.00, 'Memenuhi baku mutu untuk kategori kerja sedang', 'PLANNED', '2024-05-13 09:05:00', 'analyst'),
(3, 1, 'APD', 'Menyediakan cooling vest bagi operator furnace', 2, 5000000.00, 'Mengurangi beban panas pada pekerja', 'PLANNED', '2024-05-13 09:10:00', 'analyst'),
-- Rekomendasi untuk Steel Casting Section
(4, 3, 'Pengendalian Teknik', 'Pemasangan heat shield tambahan di sekitar area penuangan', 1, 18000000.00, 'Diperkirakan dapat menurunkan ISBB 1-1.5°C', 'PLANNED', '2024-05-13 09:15:00', 'analyst'),
(5, 3, 'Pengendalian Teknik', 'Pemasangan spot cooling di area kerja manual', 1, 12000000.00, 'Diperkirakan dapat menurunkan ISBB 1-2°C', 'PLANNED', '2024-05-13 09:20:00', 'analyst'),
(6, 3, 'Pengendalian Administratif', 'Rotasi kerja dan mengubah alokasi menjadi 25% kerja, 75% istirahat', 1, 0.00, 'Memenuhi baku mutu untuk kategori kerja berat', 'PLANNED', '2024-05-13 09:25:00', 'analyst'),
(7, 3, 'APD', 'Menyediakan pakaian pelindung reflektif panas', 2, 7500000.00, 'Mengurangi beban panas radiasi pada pekerja', 'PLANNED', '2024-05-13 09:30:00', 'analyst');

477
isbb_report_template.html Normal file
View File

@@ -0,0 +1,477 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ISBB Work Climate Measurement Report</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
color: #333;
font-size: 12px;
}
.container {
width: 210mm;
margin: 0 auto;
padding: 10mm;
box-sizing: border-box;
}
.header {
border-bottom: 2px solid #333;
padding-bottom: 10px;
margin-bottom: 20px;
}
.logo {
float: left;
max-height: 80px;
}
.lab-info {
float: right;
text-align: right;
}
.title {
text-align: center;
margin: 20px 0;
clear: both;
}
.title h1 {
margin: 0;
font-size: 18px;
font-weight: bold;
}
.title h2 {
margin: 5px 0;
font-size: 16px;
font-weight: normal;
}
.title h3 {
margin: 5px 0;
font-size: 14px;
font-weight: normal;
}
.clearfix::after {
content: "";
clear: both;
display: table;
}
.section {
margin-bottom: 15px;
}
.section-title {
font-weight: bold;
margin-bottom: 5px;
font-size: 13px;
background-color: #f0f0f0;
padding: 5px;
border-left: 3px solid #333;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 15px;
}
table, th, td {
border: 1px solid #999;
}
th {
background-color: #f0f0f0;
padding: 8px 5px;
text-align: center;
font-weight: bold;
}
td {
padding: 8px 5px;
text-align: left;
}
.text-center {
text-align: center;
}
.text-right {
text-align: right;
}
.footer {
margin-top: 30px;
border-top: 1px solid #999;
padding-top: 10px;
}
.signature {
float: right;
width: 33%;
text-align: center;
margin-top: 20px;
}
.signature-line {
border-top: 1px solid #333;
margin-top: 50px;
margin-left: auto;
margin-right: auto;
width: 80%;
}
.compliance {
padding: 3px;
border-radius: 3px;
font-weight: bold;
}
.comply {
background-color: #dff0d8;
color: #3c763d;
}
.not-comply {
background-color: #f2dede;
color: #a94442;
}
.watermark {
position: absolute;
top: 50%;
left: 25%;
transform: rotate(-45deg);
transform-origin: 50% 50%;
opacity: 0.1;
font-size: 100px;
z-index: -1;
color: #000;
white-space: nowrap;
}
.explanation-box {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 10px;
margin: 10px 0;
font-style: italic;
}
.workload-table {
margin-top: 10px;
width: 70%;
}
@page {
size: A4;
margin: 0;
}
@media print {
.container {
width: 210mm;
height: 297mm;
padding: 10mm;
box-sizing: border-box;
}
}
</style>
</head>
<body>
<div class="container">
<div class="watermark">LABORATORY REPORT</div>
<div class="header clearfix">
<img src="lab_logo.png" alt="Laboratory Logo" class="logo">
<div class="lab-info">
<h2>ENVIRONMENTAL TESTING LABORATORY</h2>
<p>Jl. Laboratorium Lingkungan No. 123, Jakarta</p>
<p>Phone: (021) 555-1234, Email: info@env-lab.co.id</p>
<p>ACCREDITED KAN: LP-001-IDN</p>
</div>
</div>
<div class="title">
<h1>INDEKS SUHU BASAH DAN BOLA (ISBB) MEASUREMENT REPORT</h1>
<h2>REPORT NUMBER: LHU/ISBB/05/2024/001</h2>
<h3>Based on Permenaker No.5 Tahun 2018</h3>
</div>
<div class="section">
<div class="section-title">1. CLIENT INFORMATION</div>
<table>
<tr>
<td width="30%">Client Name</td>
<td width="70%">PT. Indonesia Steel Manufacturing</td>
</tr>
<tr>
<td>Address</td>
<td>Jl. Industri Baja No. 75, Cikarang, Bekasi</td>
</tr>
<tr>
<td>Contact Person</td>
<td>Ir. Adi Nugroho (HSE Manager)</td>
</tr>
<tr>
<td>Request Number</td>
<td>REQ/2024/05/002</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">2. MEASUREMENT INFORMATION</div>
<table>
<tr>
<td width="30%">Measurement Date</td>
<td width="70%">May 12, 2024</td>
</tr>
<tr>
<td>Measurement Time</td>
<td>10:00 - 14:30 WIB</td>
</tr>
<tr>
<td>Measurement Officers</td>
<td>Ahmad Kusuma (Sampling Officer), Budi Santoso (Technical Analyst)</td>
</tr>
<tr>
<td>Weather Condition</td>
<td>Sunny, 33°C (outdoor temperature)</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">3. EXPLANATION OF WORK LOAD CATEGORIES</div>
<div class="explanation-box">
<p>According to Permenaker No.5 Tahun 2018, work loads are categorized as follows:</p>
<ul>
<li><strong>Light Work:</strong> Activities that require 100-200 Kcal/hour energy expenditure, such as office work, control room operation, light assembly work.</li>
<li><strong>Moderate Work:</strong> Activities that require 200-350 Kcal/hour energy expenditure, such as moderate lifting, pushing, or pulling tasks, walking at moderate pace.</li>
<li><strong>Heavy Work:</strong> Activities that require 350-500 Kcal/hour energy expenditure, such as intensive manual labor, heavy lifting, shoveling, digging, etc.</li>
</ul>
<table class="workload-table">
<tr>
<th>Work Allocation</th>
<th>Light Work (°C)</th>
<th>Moderate Work (°C)</th>
<th>Heavy Work (°C)</th>
</tr>
<tr>
<td>75% - 100% Work</td>
<td class="text-center">31.0</td>
<td class="text-center">28.0</td>
<td class="text-center">--</td>
</tr>
<tr>
<td>50% - 75% Work</td>
<td class="text-center">31.0</td>
<td class="text-center">29.0</td>
<td class="text-center">27.5</td>
</tr>
<tr>
<td>25% - 50% Work</td>
<td class="text-center">32.0</td>
<td class="text-center">30.0</td>
<td class="text-center">29.0</td>
</tr>
<tr>
<td>0% - 25% Work</td>
<td class="text-center">32.2</td>
<td class="text-center">31.1</td>
<td class="text-center">30.0</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="section-title">4. MEASUREMENT RESULTS</div>
<table>
<thead>
<tr>
<th rowspan="2">No.</th>
<th rowspan="2">Location</th>
<th rowspan="2">Work Type</th>
<th rowspan="2">Work Category</th>
<th rowspan="2">Work-Rest Allocation</th>
<th colspan="3">Temperature (°C)</th>
<th rowspan="2">ISBB Value (°C)</th>
<th rowspan="2">ISBB Standard (°C)</th>
<th rowspan="2">Compliance Status</th>
</tr>
<tr>
<th>Dry (Ta)</th>
<th>Wet (Tnw)</th>
<th>Globe (Tg)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="text-center">1</td>
<td>Furnace Operation Area</td>
<td>Furnace monitoring and control</td>
<td>Moderate</td>
<td>75% work, 25% rest</td>
<td class="text-center">32.5</td>
<td class="text-center">27.8</td>
<td class="text-center">35.6</td>
<td class="text-center">29.7</td>
<td class="text-center">28.0</td>
<td class="text-center"><span class="compliance not-comply">NOT COMPLY</span></td>
</tr>
<tr>
<td class="text-center">2</td>
<td>Cold Rolling Mill</td>
<td>Machine operation and material handling</td>
<td>Moderate</td>
<td>75% work, 25% rest</td>
<td class="text-center">30.1</td>
<td class="text-center">25.2</td>
<td class="text-center">31.5</td>
<td class="text-center">26.8</td>
<td class="text-center">28.0</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">3</td>
<td>Steel Casting Section</td>
<td>Heavy manual casting tasks</td>
<td>Heavy</td>
<td>50% work, 50% rest</td>
<td class="text-center">33.2</td>
<td class="text-center">28.4</td>
<td class="text-center">36.8</td>
<td class="text-center">30.2</td>
<td class="text-center">29.0</td>
<td class="text-center"><span class="compliance not-comply">NOT COMPLY</span></td>
</tr>
<tr>
<td class="text-center">4</td>
<td>Welding Section</td>
<td>Manual welding tasks</td>
<td>Moderate</td>
<td>50% work, 50% rest</td>
<td class="text-center">29.5</td>
<td class="text-center">24.6</td>
<td class="text-center">31.0</td>
<td class="text-center">26.1</td>
<td class="text-center">29.0</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">5</td>
<td>Production Control Room</td>
<td>Monitoring and administrative tasks</td>
<td>Light</td>
<td>75% work, 25% rest</td>
<td class="text-center">28.6</td>
<td class="text-center">23.8</td>
<td class="text-center">29.2</td>
<td class="text-center">25.2</td>
<td class="text-center">31.0</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
</tbody>
</table>
<p><strong>Notes:</strong></p>
<ul>
<li>ISBB (WBGT indoors) = 0.7 Tnw + 0.3 Tg</li>
<li>Ta = Dry bulb temperature, Tnw = Natural wet bulb temperature, Tg = Globe temperature</li>
<li>Measurement conducted at 1.1m height (standing worker's breathing zone)</li>
</ul>
</div>
<div class="section">
<div class="section-title">5. MEASUREMENT METHOD</div>
<table>
<tr>
<th width="20%">Parameter</th>
<th width="20%">Method</th>
<th width="35%">Equipment</th>
<th width="25%">Calibration Status</th>
</tr>
<tr>
<td>ISBB (WBGT) Index</td>
<td>SNI 7062: 2019</td>
<td>WBGT Meter Extech HT30 SN:EX55667788</td>
<td>Valid until June 5, 2024</td>
</tr>
<tr>
<td>Dry Bulb Temperature</td>
<td>SNI 7062: 2019</td>
<td>WBGT Meter Extech HT30 SN:EX55667788</td>
<td>Valid until June 5, 2024</td>
</tr>
<tr>
<td>Wet Bulb Temperature</td>
<td>SNI 7062: 2019</td>
<td>WBGT Meter Extech HT30 SN:EX55667788</td>
<td>Valid until June 5, 2024</td>
</tr>
<tr>
<td>Globe Temperature</td>
<td>SNI 7062: 2019</td>
<td>WBGT Meter Extech HT30 SN:EX55667788</td>
<td>Valid until June 5, 2024</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">6. NOTES AND RECOMMENDATIONS</div>
<p>Based on the measurement results, the following findings and recommendations are provided:</p>
<ol>
<li>Two areas (Furnace Operation Area and Steel Casting Section) exceed the ISBB threshold limits according to Permenaker No.5 Tahun 2018.</li>
<li>For the Furnace Operation Area with ISBB of 29.7°C (exceeding the 28.0°C limit for moderate work with 75% work allocation), it is recommended to:
<ul>
<li>Adjust work-rest allocation to 50% work, 50% rest to comply with the 29.0°C threshold for moderate work</li>
<li>Improve ventilation and heat controls in the area</li>
<li>Provide personal cooling garments for workers</li>
<li>Increase frequency of breaks in cool rest areas</li>
</ul>
</li>
<li>For the Steel Casting Section with ISBB of 30.2°C (exceeding the 29.0°C limit for heavy work with 50% work allocation), it is recommended to:
<ul>
<li>Reduce work allocation to 25% work, 75% rest or implement job rotation</li>
<li>Install additional heat shields near heat sources</li>
<li>Install additional local exhaust ventilation or spot cooling</li>
<li>Provide adequate cool drinking water and electrolyte replacement</li>
<li>Implement a heat acclimatization program for new workers</li>
</ul>
</li>
<li>Cold Rolling Mill, Welding Section and Production Control Room have ISBB values below the threshold limits and are in compliance.</li>
<li>General recommendations for all areas:
<ul>
<li>Ensure regular maintenance of ventilation systems</li>
<li>Provide training for workers on heat stress recognition and first aid</li>
<li>Conduct regular medical surveillance for workers in hot environments</li>
<li>Monitor ISBB values during peak hot season</li>
</ul>
</li>
</ol>
</div>
<div class="section">
<div class="section-title">7. REGULATION REFERENCES</div>
<p>This measurement report refers to:</p>
<ol>
<li>Peraturan Menteri Ketenagakerjaan Republik Indonesia Nomor 5 Tahun 2018 tentang Keselamatan dan Kesehatan Kerja Lingkungan Kerja</li>
<li>SNI 7062: 2019 regarding Work Climate Measurement Methods</li>
<li>ACGIH (American Conference of Governmental Industrial Hygienists) Threshold Limit Values for Heat Stress</li>
</ol>
</div>
<div class="footer clearfix">
<p>Report Issue Date: May 15, 2024</p>
<p>This report is only valid for the samples measured and may not be reproduced partially without written approval from the laboratory.</p>
<div class="signature">
<p>Analyst</p>
<div class="signature-line"></div>
<p>Budi Santoso</p>
<p>Industrial Hygienist</p>
</div>
<div class="signature">
<p>Verified by</p>
<div class="signature-line"></div>
<p>Hendra Wijaya</p>
<p>Testing Supervisor</p>
</div>
<div class="signature">
<p>Approved by</p>
<div class="signature-line"></div>
<p>Farida Nurhasanah</p>
<p>Laboratory Manager</p>
</div>
</div>
<div style="text-align: center; margin-top: 50px; font-size: 10px;">
<p>*END OF REPORT*</p>
<p>Page 1 of 1</p>
</div>
</div>
</body>
</html>

186
lab_env_app_features.md Normal file
View File

@@ -0,0 +1,186 @@
# Fitur Sistem Aplikasi Laboratorium Lingkungan
Berdasarkan struktur database dan alur pelayanan yang telah dibuat, berikut adalah fitur-fitur utama yang disarankan untuk sistem aplikasi laboratorium lingkungan:
## 1. Modul Manajemen Pelanggan
- **Pendaftaran dan Profil Pelanggan**
- Pendaftaran pelanggan baru (internal dan eksternal)
- Pengelolaan profil pelanggan
- Riwayat permintaan analisis per pelanggan
- Riwayat pembayaran
- **Dashboard Pelanggan**
- Status permintaan analisis (Perlu status: Baru, Proses, Selesai, Dibatalkan)
- Hasil analisis terbaru
- Notifikasi jadwal sampling
- Download laporan hasil pengujian
## 2. Modul Permintaan Layanan
- **Pengelolaan Permintaan**
- Form permintaan analisis (sampling & analisis atau analisis saja)
- Pemilihan parameter yang akan dianalisis (Perlu fitur: Pilihan parameter dari template sampling, Pilihan parameter dari template analisis, Pilihan parameter dari template analisis non lab)
- Persetujuan permintaan (Perlu fitur: Persetujuan permintaan dari petugas sampling, Persetujuan permintaan dari petugas pengujian)
- Pelacakan status permintaan (Perlu fitur: Pelacakan status permintaan dari petugas sampling, Pelacakan status permintaan dari petugas pengujian)
- **Penawaran dan Quotation**
- Pembuatan surat penawaran otomatis (Perlu fitur: Pembuatan surat penawaran otomatis dari template, Pembuatan surat penawaran otomatis dari template analisis non lab)
- Perhitungan biaya berdasarkan parameter yang dipilih
- Manajemen quotation dan persetujuan
- Pencatatan bukti pembayaran DP
## 3. Modul Perencanaan Sampling
- **Manajemen Rencana Sampling**
- Pembuatan jadwal sampling
- Penugasan petugas sampling
- Pencatatan lokasi dan koordinat GPS
- Daftar peralatan yang diperlukan
- **Aplikasi Mobile untuk Petugas Sampling**
- Daftar tugas sampling
- Pencatatan data sampling di lapangan
- Dokumentasi foto lokasi dan kondisi sampling
- Pelacakan GPS lokasi sampling
## 4. Modul Penerimaan Sampel
- **Sistem Penerimaan dan Registrasi Sampel**
- Pencatatan penerimaan sampel di laboratorium
- Pembuatan kode sampel unik
- Pencatatan kondisi sampel saat diterima
- Alokasi sampel ke jenis pengujian
- **Manajemen Preparasi Sampel**
- Pencatatan metode preparasi dan pengawetan
- Pembagian sampel untuk berbagai parameter
- Pelacakan status preparasi
- Pencetakan label sampel
## 5. Modul Analisis Laboratorium
- **Sistem Manajemen Pengujian**
- Daftar sampel yang harus dianalisis
- Form pencatatan hasil pengujian
- Validasi hasil terhadap baku mutu
- Pencatatan metode analisis yang digunakan
- **Integrasi dengan Peralatan Lab (Opsional)**
- Konfigurasi integrasi dengan instrumen lab
- Pengambilan hasil analisis otomatis
- Kalibrasi dan pemeliharaan alat
## 6. Modul Verifikasi Hasil Uji
- **Sistem Verifikasi**
- Daftar hasil yang perlu diverifikasi
- Form persetujuan hasil
- Pencatatan koreksi dan komentar
- Notifikasi hasil tidak sesuai standar
- **Manajemen Laporan**
- Pembuatan laporan hasil uji (LHU)
- Template laporan yang dapat dikonfigurasi
- Pencetakan dan ekspor laporan
- Distribusi laporan ke pelanggan
## 7. Fitur Administrasi
- **Manajemen Pengguna**
- Pengelolaan akun pengguna
- Manajemen peran dan hak akses
- Audit trail aktivitas pengguna
- Reset password dan keamanan akun
- **Pengelolaan Data Master**
- Manajemen parameter analisis dan harga
- Konfigurasi jenis sampel
- Manajemen metode analisis dan baku mutu
- Konfigurasi template dokumen
## 8. Modul Pelaporan & Analitik
- **Laporan Operasional**
- Laporan jumlah sampel per periode
- Laporan pendapatan dan invoice
- Laporan kinerja laboratorium
- Statistik parameter tidak sesuai standar
- **Dashboard Analitik**
- Visualisasi tren analisis
- Kinerja petugas dan waktu penyelesaian
- Analisis beban kerja laboratorium
- Prediksi permintaan analisis
## 9. Fitur Integrasi & Ekspor
- **Integrasi Sistem**
- API untuk integrasi dengan sistem eksternal
- Ekspor data ke format Excel/CSV/PDF
- Notifikasi email dan SMS
- Backup dan restore database
- **Mobile App & Web Responsif**
- Aplikasi mobile untuk petugas lapangan
- Web responsif untuk akses dari berbagai perangkat
- Notifikasi push untuk status permintaan
- Akses offline untuk pengumpulan data lapangan
## 10. Fitur Kepatuhan & Dokumentasi
- **Manajemen Dokumen**
- Penyimpanan dokumen standar operasional
- Manajemen dokumen sertifikasi dan akreditasi
- Pencatatan kalibrasi peralatan
- Dokumentasi metode analisis
- **Kepatuhan Regulasi**
- Pelacakan perubahan baku mutu
- Rekaman ketidaksesuaian dan tindakan koreksi
- Validasi metode analisis
- Jaminan kualitas hasil pengujian
## Keuntungan Implementasi Sistem
1. **Peningkatan Efisiensi**
- Otomatisasi alur kerja laboratorium
- Pengurangan kerja administratif manual
- Pelacakan sampel dan hasil pengujian yang lebih baik
2. **Peningkatan Akurasi**
- Pengurangan kesalahan pencatatan manual
- Validasi data secara otomatis
- Pelacakan versi dan perubahan dokumen
3. **Peningkatan Layanan Pelanggan**
- Akses pelanggan ke status pengujian secara real-time
- Pengiriman laporan hasil lebih cepat
- Pembuatan quotation dan penawaran lebih efisien
4. **Kepatuhan dan Audit**
- Pencatatan lengkap untuk keperluan akreditasi
- Audit trail semua aktivitas sistem
- Dokumentasi yang lebih baik untuk inspeksi
5. **Pengambilan Keputusan Berbasis Data**
- Analisis tren dan pola dari data historis
- Manajemen beban kerja laboratorium yang lebih baik
- Perencanaan sumber daya berdasarkan prediksi permintaan
## Fase Implementasi yang Disarankan
1. **Fase 1: Manajemen Pelanggan & Permintaan**
- Modul pelanggan dan permintaan layanan
- Pembuatan quotation dan penawaran
- Dashboard dasar
2. **Fase 2: Sampling & Penerimaan Sampel**
- Modul perencanaan sampling
- Sistem penerimaan sampel
- Manajemen kode sampel
3. **Fase 3: Analisis & Verifikasi**
- Pencatatan hasil analisis
- Sistem verifikasi hasil
- Pembuatan laporan hasil uji
4. **Fase 4: Analitik & Integrasi**
- Dashboard analitik lanjutan
- Integrasi dengan peralatan lab
- Aplikasi mobile untuk petugas sampling
5. **Fase 5: Optimasi & Skalabilitas**
- Pengembangan API untuk integrasi eksternal
- Optimasi performa sistem
- Fitur kepatuhan dan dokumentasi lanjutan

469
lab_env_case_study.md Normal file
View File

@@ -0,0 +1,469 @@
# Studi Kasus: Penawaran, Quotation, dan Pengelolaan Order Pelanggan
## Kasus 1: Pemantauan Limbah Rutin Industri Tekstil
### **Latar Belakang**
PT. Industri Tekstil Nusantara (ITN) adalah perusahaan tekstil yang beroperasi di Bandung. Sebagai bagian dari kepatuhan lingkungan, perusahaan ini diwajibkan melakukan pemantauan kualitas air limbah setiap tiga bulan dan melaporkan hasilnya ke Dinas Lingkungan Hidup setempat. Pada awal Januari 2025, Budi Santoso selaku Environmental Officer PT. ITN menghubungi laboratorium untuk melakukan analisis triwulanan.
### **Alur Proses**
#### 1. Permintaan Awal
- **Pelanggan:** Budi Santoso (PT. Industri Tekstil Nusantara)
- **Kontak:** 08123456789, budi@tekstilnusantara.com
- **Jenis Permintaan:** Sampling dan Analisis
- **Deskripsi:** Pemantauan Limbah Triwulan I 2025
- **Lokasi Sampling:** Outlet IPAL PT. Industri Tekstil Nusantara, Jl. Industri No. 123, Bandung
- **Parameter yang diminta:** pH, TSS, COD, BOD, Ammonia (sesuai baku mutu air limbah industri tekstil)
#### 2. Penerimaan dan Pencatatan oleh Admin
Admin Lab, Dini Wijaya, menerima permintaan dari Budi dan mencatat di sistem:
```mermaid
sequenceDiagram
actor Customer as Budi Santoso
actor Admin as Dini Wijaya (Admin)
participant System as Sistem Lab
Customer->>Admin: Menghubungi untuk pemantauan triwulanan
Admin->>System: Membuat entry permintaan baru
System-->>Admin: Form permintaan layanan
Admin->>System: Mengisi detail pelanggan & permintaan
System-->>Admin: Menyimpan data permintaan
Admin->>Customer: Konfirmasi penerimaan permintaan
```
Entry data di sistem:
```
SERVICE_REQUESTS:
- request_id: 1
- customer_id: 1 (PT. Industri Tekstil Nusantara)
- request_date: 2025-01-10 09:15:00
- request_type: "Sampling and Analysis"
- project_name: "Pemantauan Limbah Triwulan I 2025"
- project_location: "Outlet IPAL PT. Industri Tekstil Nusantara, Bandung"
- status: "Draft"
- admin_id: 1 (Dini Wijaya)
- notes: "Permintaan rutin triwulanan untuk kepatuhan lingkungan"
```
#### 3. Penyiapan Penawaran
Admin Lab melakukan pengecekan terhadap parameter yang diminta dan menyiapkan surat penawaran:
```mermaid
sequenceDiagram
actor Admin as Dini Wijaya (Admin)
participant System as Sistem Lab
participant Params as Master Parameter
Admin->>System: Memilih parameter yang diminta
System->>Params: Query harga parameter
Params-->>System: Data harga parameter
System-->>Admin: Menampilkan daftar parameter & harga
Admin->>System: Mengisi jumlah sampel (1 outlet)
System-->>Admin: Menghitung total biaya
Admin->>System: Generate surat penawaran
System-->>Admin: Surat penawaran dalam format PDF
```
Entry data di sistem:
```
REQUEST_PARAMETERS:
- parameter_id: 1 (pH), quantity: 1, price_per_unit: 50.000
- parameter_id: 2 (TSS), quantity: 1, price_per_unit: 75.000
- parameter_id: 3 (COD), quantity: 1, price_per_unit: 125.000
- parameter_id: 4 (BOD), quantity: 1, price_per_unit: 150.000
- parameter_id: 5 (Ammonia), quantity: 1, price_per_unit: 100.000
```
#### 4. Pembuatan Quotation
Admin Lab menyiapkan quotation resmi berdasarkan parameter yang diminta:
```
Nomor: Q-2025-001
Tanggal: 15 Januari 2025
Kepada: PT. Industri Tekstil Nusantara
(Attn: Budi Santoso)
Perihal: Quotation Analisis Air Limbah Triwulan I 2025
Detail Analisis:
+--------+---------------+----------+--------+-------------+
| No. | Parameter | Metode | Jumlah | Harga (Rp) |
+--------+---------------+----------+--------+-------------+
| 1 | pH | SNI-01 | 1 | 50.000 |
| 2 | TSS | SNI-02 | 1 | 75.000 |
| 3 | COD | SNI-03 | 1 | 125.000 |
| 4 | BOD | SNI-04 | 1 | 150.000 |
| 5 | Ammonia | SNI-05 | 1 | 100.000 |
+--------+---------------+----------+--------+-------------+
| Subtotal Analisis | 500.000 |
+------------------------------------------+---------------+
| Biaya Sampling | 300.000 |
| Biaya Transport | 200.000 |
| Biaya Administrasi & Pelaporan | 100.000 |
+------------------------------------------+---------------+
| Total | 1.100.000 |
+------------------------------------------+---------------+
Catatan:
- Harga belum termasuk PPN 11%
- Pembayaran DP 50% sebelum sampling dilakukan
- Hasil analisis akan diberikan 7 hari kerja setelah sampling
```
Update data di sistem:
```
SERVICE_REQUESTS (update):
- quotation_number: "Q-2025-001"
- quotation_date: "2025-01-15"
- total_amount: 1100000
- status: "Quotation Sent"
```
#### 5. Persetujuan Quotation oleh Pelanggan
Admin mengirimkan quotation kepada pelanggan dan pelanggan memberikan persetujuan:
```mermaid
sequenceDiagram
actor Admin as Dini Wijaya (Admin)
actor Customer as Budi Santoso
participant System as Sistem Lab
Admin->>Customer: Mengirim quotation via email
Customer->>Admin: Menyetujui quotation via email
Admin->>System: Mencatat persetujuan
Customer->>Admin: Mengirim bukti transfer DP 50%
Admin->>System: Upload bukti pembayaran
System-->>Admin: Update status permintaan
```
Update data di sistem:
```
SERVICE_REQUESTS (update):
- status: "Approved"
- approved_date: "2025-01-20"
- payment_proof: "bukti_transfer_ITN_20250120.jpg"
- payment_date: "2025-01-20"
```
#### 6. Melengkapi Data Teknis Order Pelanggan
Admin melengkapi detail teknis terkait order berdasarkan kebutuhan pelanggan:
```mermaid
sequenceDiagram
actor Admin as Dini Wijaya (Admin)
participant System as Sistem Lab
participant Sampling as Modul Sampling
Admin->>System: Buka detail permintaan
Admin->>System: Tambahkan informasi teknis
System-->>Admin: Form data teknis
Admin->>System: Isi data titik sampling
Admin->>System: Isi data metode sampling
Admin->>System: Isi instruksi khusus
System->>Sampling: Siapkan jadwal sampling
Sampling-->>System: Konfirmasi jadwal
System-->>Admin: Tampilkan ringkasan order
```
Data teknis yang dilengkapi Admin:
```
TECHNICAL_DETAILS:
- Jenis Sampling: Grab Sampling
- Metode Pengawetan: Sesuai SNI 6989.59:2008
- Wadah Sampel: Botol kaca untuk BOD, botol plastik untuk parameter lain
- Preservasi Khusus: H₂SO₄ untuk COD, BOD, dan Ammonia
- Pengukuran In-situ: pH dan Suhu
- Instruksi Khusus: Sampel diambil saat produksi penuh (antara jam 10:00-12:00)
- Pelaporan Tambahan: Perbandingan dengan hasil triwulan sebelumnya
- Format Laporan: Digital (PDF) dan 2 hardcopy
```
```
SAMPLING_PLANS:
- plan_id: 1
- request_id: 1
- planned_date: "2025-01-25"
- location: "Outlet IPAL PT. Industri Tekstil Nusantara"
- coordinates: "-6.914744, 107.609810"
- sampling_method: "Grab Sampling sesuai SNI 6989.59:2008"
- equipment_needed: "Botol sampling, pH meter, termometer, cool box"
- sampling_officer_id: 2 (Ahmad Ramadhan)
- status: "Planned"
- notes: "Sampling dilakukan saat produksi penuh (10:00-12:00)"
```
#### 7. Registrasi Order
Admin menyelesaikan proses registrasi order di sistem, yang mencakup:
```mermaid
sequenceDiagram
actor Admin as Dini Wijaya (Admin)
participant System as Sistem Lab
participant DB as Database
Admin->>System: Finalisasi order
System->>DB: Generate kode unik order
System->>DB: Assign petugas sampling
System->>DB: Create work order
DB-->>System: Konfirmasi registrasi
System-->>Admin: Tampilkan detail registrasi
Admin->>System: Cetak Surat Perintah Kerja (SPK)
```
Data registrasi order:
```
ORDER_REGISTRATION:
- registration_number: "REG-2025-001"
- registration_date: "2025-01-22"
- assigned_officer: "Ahmad Ramadhan (Sampling), Ani Suryani (Analis)"
- estimated_completion: "2025-02-01"
- reporting_deadline: "2025-02-05"
```
## Kasus 2: Monitoring Kualitas Air Sungai Multi-titik
### **Latar Belakang**
Dinas Lingkungan Hidup Kota (DLH) sedang melakukan program monitoring kualitas air Sungai Citarum di 5 titik sepanjang sungai yang melewati kota. Siti Aminah, selaku koordinator pemantauan kualitas air DLH, menghubungi laboratorium untuk melakukan sampling dan analisis di 5 titik yang telah ditentukan.
### **Alur Proses**
#### 1. Permintaan Awal
- **Pelanggan:** Siti Aminah (DLH Kota)
- **Kontak:** 08765432100, siti@dlh.kotabjb.go.id
- **Jenis Permintaan:** Sampling dan Analisis
- **Deskripsi:** Monitoring Kualitas Air Sungai Citarum
- **Lokasi Sampling:** 5 titik sepanjang Sungai Citarum (koordinat disediakan)
- **Parameter yang diminta:** pH, TSS, DO, BOD, COD, Total Coliform, Logam Berat (Pb, Cd, Hg)
#### 2. Analisis Kebutuhan dan Penyiapan Penawaran Kompleks
Admin Lab melakukan analisis kebutuhan spesifik untuk monitoring multi-titik:
```mermaid
sequenceDiagram
actor Admin as Faisal Rahman (Admin)
participant System as Sistem Lab
participant Mapping as Modul Pemetaan
Admin->>System: Input permintaan multi-titik
System-->>Admin: Form entri lokasi multiple
Admin->>Mapping: Plot 5 titik sampling di peta
Mapping-->>Admin: Konfirmasi koordinat & jarak
Admin->>System: Hitung biaya per titik sampling
System-->>Admin: Kalkulasi estimasi biaya total
Admin->>System: Terapkan diskon volume
System-->>Admin: Generate penawaran multi-titik
```
Detail perhitungan biaya untuk multi-titik:
```
Biaya per Parameter:
- pH: 50.000 x 5 titik = 250.000
- TSS: 75.000 x 5 titik = 375.000
- DO: 80.000 x 5 titik = 400.000
- BOD: 150.000 x 5 titik = 750.000
- COD: 125.000 x 5 titik = 625.000
- Total Coliform: 175.000 x 5 titik = 875.000
- Pb: 200.000 x 5 titik = 1.000.000
- Cd: 200.000 x 5 titik = 1.000.000
- Hg: 250.000 x 5 titik = 1.250.000
Subtotal Analisis: 6.525.000
Diskon Volume (10%): -652.500
Biaya Sampling (5 titik): 1.000.000
Biaya Transport: 500.000
Biaya Administrasi & Pelaporan: 250.000
Total setelah diskon: 7.622.500
```
#### 3. Pembuatan Quotation Khusus
Admin menyiapkan quotation khusus yang mendetailkan biaya per titik sampling dan diskon volume:
```
Nomor: Q-2025-002
Tanggal: 10 Februari 2025
Kepada: Dinas Lingkungan Hidup Kota
(Attn: Siti Aminah)
Perihal: Quotation Monitoring Kualitas Air Sungai Citarum (5 Titik)
Detail Analisis:
+--------+---------------+----------+--------+-------------+
| No. | Parameter | Metode | Titik | Harga (Rp) |
+--------+---------------+----------+--------+-------------+
| 1 | pH | SNI-01 | 5 | 250.000 |
| 2 | TSS | SNI-02 | 5 | 375.000 |
| 3 | DO | SNI-08 | 5 | 400.000 |
| 4 | BOD | SNI-04 | 5 | 750.000 |
| 5 | COD | SNI-03 | 5 | 625.000 |
| 6 | Total Coliform| SNI-07 | 5 | 875.000 |
| 7 | Logam Pb | SNI-06 | 5 | 1.000.000 |
| 8 | Logam Cd | SNI-09 | 5 | 1.000.000 |
| 9 | Logam Hg | SNI-10 | 5 | 1.250.000 |
+--------+---------------+----------+--------+-------------+
| Subtotal Analisis | 6.525.000 |
| Diskon Volume 10% | -652.500 |
+------------------------------------------+---------------+
| Biaya Sampling (5 titik) | 1.000.000 |
| Biaya Transport | 500.000 |
| Biaya Administrasi & Pelaporan | 250.000 |
+------------------------------------------+---------------+
| Total | 7.622.500 |
+------------------------------------------+---------------+
Detail Lokasi Sampling:
1. Titik 1 (Hulu): Koordinat -6.947890, 107.632505
2. Titik 2: Koordinat -6.933456, 107.621234
3. Titik 3: Koordinat -6.925678, 107.612345
4. Titik 4: Koordinat -6.912345, 107.603456
5. Titik 5 (Hilir): Koordinat -6.901234, 107.594567
Catatan:
- Harga sudah termasuk PPN (DLH dibebaskan dari PPN)
- Pembayaran dapat dilakukan dengan mekanisme penagihan anggaran pemerintah
- Hasil analisis akan diberikan 10 hari kerja setelah sampling
- Laporan akan mencakup interpretasi hasil dan visualisasi spasial
```
#### 4. Melengkapi Data Teknis yang Kompleks
Admin melengkapi data teknis yang lebih kompleks karena melibatkan multiple titik dan parameter yang lebih banyak:
```mermaid
sequenceDiagram
actor Admin as Faisal Rahman (Admin)
participant System as Sistem Lab
participant Schedule as Modul Penjadwalan
Admin->>System: Buka modul data teknis
Admin->>System: Input detail protokol sampling multi-titik
Admin->>System: Upload peta lokasi sampling
Admin->>System: Input kebutuhan peralatan khusus
Admin->>System: Input metode preservasi per parameter
Admin->>Schedule: Buat jadwal tim sampling
Schedule-->>System: Konfirmasi ketersediaan personil
System-->>Admin: Tampilkan ringkasan teknis
```
Data teknis kompleks yang dilengkapi:
```
MULTI_POINT_SAMPLING_DETAILS:
- Protokol Sampling: "Sesuai Permen LH No. 115 Tahun 2003"
- Urutan Pengambilan: "Dari hilir ke hulu untuk menghindari kontaminasi"
- Waktu Sampling: "Dilakukan pada pagi hari (07:00-10:00)"
- Tim Sampling: "2 petugas sampling + 1 petugas dokumentasi"
- Transportasi: "Perlu kendaraan 4WD untuk akses titik 1 dan 2"
- Peralatan Khusus: "DO meter, Multiparameter water quality tester, GPS"
- Metode Preservasi: "Cold storage untuk mikrobiologi, Asam nitrat untuk logam berat"
- Kebutuhan QA/QC: "Duplikat sampel untuk titik 3, Blank sample untuk parameter logam"
- Format Pelaporan: "Termasuk visualisasi spasial dan trend analisis"
```
```
MULTI_POINT_SAMPLING_PLANS:
- Plan for Point 1 (Hulu): {...}
- Plan for Point 2: {...}
- Plan for Point 3: {...}
- Plan for Point 4: {...}
- Plan for Point 5 (Hilir): {...}
EQUIPMENT_REQUISITION:
- Multiparameter water quality tester (YSI ProDSS): 1 unit
- DO meter: 1 unit
- pH meter (backup): 1 unit
- Botol sampel mikrobiologi (steril): 10 buah
- Botol sampel kaca amber (organik): 10 buah
- Botol sampel HDPE (anorganik): 25 buah
- Cool box besar: 2 unit
- GPS: 1 unit
- Kamera dokumentasi: 1 unit
- Kit preservasi sampel: 1 set
```
#### 5. Registrasi Order Kompleks
Admin melakukan registrasi order yang lebih kompleks dengan beberapa sub-order:
```mermaid
sequenceDiagram
actor Admin as Faisal Rahman (Admin)
participant System as Sistem Lab
participant Order as Modul Order
participant Lab as Laboratorium
Admin->>System: Finalisasi order multi-titik
System->>Order: Generate 5 sub-order (per titik)
Order->>Lab: Cek kapasitas lab untuk tanggal tersebut
Lab-->>Order: Konfirmasi kapasitas tersedia
Order-->>System: Assign kode sampel untuk 45 sampel (9 parameter x 5 titik)
System-->>Admin: Tampilkan ringkasan order kompleks
Admin->>System: Cetak dokumen Work Order
```
Data registrasi order kompleks:
```
MULTI_POINT_ORDER_REGISTRATION:
- master_registration_number: "REG-2025-002"
- sub_registrations: ["REG-2025-002-T1", "REG-2025-002-T2", "REG-2025-002-T3", "REG-2025-002-T4", "REG-2025-002-T5"]
- total_samples: 5
- total_analyses: 45
- assigned_officers: ["Team A: Ahmad & Budi (Sampling)", "Team B: Ani, Dedi, Eva (Analis)"]
- estimated_field_work: "1 hari (20 Februari 2025)"
- estimated_lab_work: "7 hari kerja"
- reporting_deadline: "3 Maret 2025"
- special_instructions: "Prioritaskan analisis mikrobiologi, maksimal 6 jam setelah sampling"
```
## Ringkasan Proses Admin dalam Sistem Laboratorium
Berdasarkan studi kasus di atas, berikut adalah ringkasan proses yang dilakukan oleh Admin Lab dalam sistem aplikasi laboratorium lingkungan:
### 1. Penerimaan dan Pencatatan Permintaan
- Menerima permintaan dari pelanggan
- Mencatat detail pelanggan di sistem
- Membuat entry permintaan layanan baru
- Mencatat parameter yang diminta
### 2. Penyiapan Penawaran
- Memeriksa ketersediaan parameter yang diminta
- Menghitung biaya berdasarkan parameter dan jumlah titik
- Menambahkan biaya tambahan (sampling, transport, dll)
- Menerapkan diskon jika diperlukan
- Menyiapkan dokumen penawaran
### 3. Pembuatan Quotation
- Membuat dokumen quotation resmi
- Mencantumkan detail parameter, metode, dan biaya
- Menambahkan detail lokasi sampling
- Mencantumkan syarat dan ketentuan
- Mendapatkan persetujuan dari kepala laboratorium
- Mengirimkan quotation ke pelanggan
### 4. Penerimaan Persetujuan dan Pembayaran
- Menerima persetujuan dari pelanggan
- Mencatat persetujuan di sistem
- Menerima bukti pembayaran DP
- Mengupload bukti pembayaran ke sistem
- Mengupdate status permintaan
### 5. Melengkapi Data Teknis Order
- Mencatat detail lokasi sampling
- Menentukan metode sampling yang sesuai
- Mencatat kebutuhan peralatan
- Menentukan metode preservasi sampel
- Mencatat instruksi khusus dari pelanggan
- Mengupload dokumen pendukung (peta, foto lokasi, dll)
### 6. Registrasi Order
- Membuat kode registrasi unik
- Menugaskan petugas sampling dan analis
- Menjadwalkan kegiatan sampling
- Mempersiapkan dokumen Work Order
- Mengkomunikasikan jadwal ke tim terkait
- Memastikan koordinasi antar departemen
### 7. Monitoring dan Komunikasi
- Memantau status pelaksanaan sampling
- Memantau progres analisis di laboratorium
- Menginformasikan status ke pelanggan
- Mengelola perubahan permintaan jika ada
- Memastikan timeline sesuai dengan yang dijanjikan
Proses-proses di atas menunjukkan peran krusial Admin Lab dalam menjembatani kebutuhan pelanggan dengan operasional laboratorium, memastikan data teknis yang lengkap dan akurat, serta menjamin kelancaran alur kerja laboratorium secara keseluruhan.

161
lab_env_database_erd.md Normal file
View File

@@ -0,0 +1,161 @@
# Entity Relationship Diagram (ERD) - Sistem Aplikasi Laboratorium Lingkungan
Berikut adalah representasi hubungan antar entitas dalam sistem aplikasi laboratorium lingkungan.
```
+----------------+ +-------------------+ +---------------------+
| CUSTOMERS | | SERVICE REQUESTS | | REQUEST PARAMETERS |
+----------------+ +-------------------+ +---------------------+
| PK customer_id |<------| FK customer_id | | PK request_param_id |
| customer_name | | PK request_id |<------| FK request_id |
| customer_type | | request_date | | FK parameter_id |
| contact_person | | request_type | | quantity |
| phone_number | | project_name | | price_per_unit |
| email | | project_location | +---------------------+
| address | | status | ^
| company_name | | admin_id | |
+----------------+ | quotation_number | |
| quotation_date | +---------------------+
| approved_date | | ANALYSIS PARAMETERS |
| payment_proof | +---------------------+
| payment_date | | PK parameter_id |------+
| total_amount | | parameter_name | |
| notes | | unit | |
+-------------------+ | method | |
| | FK sample_type_id |---+ |
| | standard_value | | |
v | price | | |
+-------------------+ +---------------------+ | |
| SAMPLING PLANS | | |
+-------------------+ +---------------------+ | |
| PK plan_id | | SAMPLE TYPES | | |
| FK request_id | +---------------------+ | |
| planned_date | | PK sample_type_id |<---+ |
| location | | type_name | |
| coordinates | | description | |
| sampling_method | | standard_method | |
| equipment_needed | +---------------------+ |
| sampling_officer_id| |
| status | |
| notes | +---------------------+ |
+-------------------+ | SAMPLES | |
| +---------------------+ |
| | PK sample_id | |
+----------------->| FK request_id | |
| FK plan_id | |
| sample_code | |
| FK sample_type_id |------+
| sampling_date |
| sampling_location |
| sampling_officer_id|
| received_date |
| received_by |
| sample_condition |
| preparation_notes |
| preservation_method|
| status |
+---------------------+
|
|
v
+---------------------+ +----------------+
| ANALYSIS RESULTS | | REPORTS |
+---------------------+ +----------------+
| PK result_id | | PK report_id |
| FK sample_id | | FK request_id |
| FK parameter_id |------>| report_number |
| analyst_id | | report_date |
| analysis_date | | prepared_by |
| result_value | | verified_by |
| unit | | approved_by |
| method_used | | status |
| is_within_standard | | file_path |
| notes | | notes |
| status | +----------------+
| verified_by |
| verification_date |
+---------------------+
+----------------+ +---------------------+
| USERS | | ACTIVITY LOGS |
+----------------+ +---------------------+
| PK user_id |<------| FK user_id |
| username | | PK log_id |
| password | | action |
| full_name | | table_name |
| email | | record_id |
| role | | details |
| department | | ip_address |
| is_active | | created_at |
| last_login | +---------------------+
+----------------+
```
## Keterangan Relasi
1. **Customers** (1) -- (N) **Service Requests**
- Satu pelanggan (customer) dapat memiliki banyak permintaan layanan (service requests).
2. **Service Requests** (1) -- (N) **Request Parameters**
- Satu permintaan layanan dapat meminta banyak parameter untuk diuji.
3. **Analysis Parameters** (1) -- (N) **Request Parameters**
- Satu parameter analisis dapat diminta dalam banyak permintaan layanan.
4. **Sample Types** (1) -- (N) **Analysis Parameters**
- Satu jenis sampel dapat memiliki banyak parameter analisis.
5. **Service Requests** (1) -- (N) **Sampling Plans**
- Satu permintaan layanan dapat memiliki banyak rencana sampling.
6. **Sampling Plans** (1) -- (N) **Samples**
- Satu rencana sampling dapat menghasilkan banyak sampel.
7. **Service Requests** (1) -- (N) **Samples**
- Satu permintaan layanan dapat memiliki banyak sampel.
8. **Sample Types** (1) -- (N) **Samples**
- Satu jenis sampel dapat memiliki banyak sampel.
9. **Samples** (1) -- (N) **Analysis Results**
- Satu sampel dapat memiliki banyak hasil analisis.
10. **Analysis Parameters** (1) -- (N) **Analysis Results**
- Satu parameter analisis dapat digunakan untuk banyak hasil analisis.
11. **Service Requests** (1) -- (N) **Reports**
- Satu permintaan layanan dapat menghasilkan banyak laporan.
12. **Users** (1) -- (N) **Activity Logs**
- Satu pengguna dapat memiliki banyak catatan aktivitas.
13. **Users** berhubungan dengan banyak tabel lain melalui kolom seperti:
- admin_id pada Service Requests
- sampling_officer_id pada Sampling Plans
- sampling_officer_id pada Samples
- received_by pada Samples
- analyst_id pada Analysis Results
- verified_by pada Analysis Results
- prepared_by, verified_by, approved_by pada Reports
Relasi ini menggambarkan alur layanan laboratorium lingkungan sesuai dengan diagram alur pelayanan yang disediakan.
## Penjelasan Proses Bisnis berdasarkan Diagram ERD
Dengan mengikuti ERD di atas, proses bisnis laboratorium lingkungan berjalan sebagai berikut:
1. **Customer** (internal atau eksternal) mengajukan permintaan layanan (service request).
2. **Admin Lab** memproses permintaan, membuat penawaran dan quotation, mencatat detail parameter yang akan dianalisis.
3. **Petugas Sampling** membuat rencana sampling berdasarkan permintaan layanan.
4. Sampel diambil oleh **Petugas Sampling** sesuai dengan rencana sampling.
5. Sampel diterima oleh **Bagian Penerimaan Contoh Uji** yang mencatat kondisi sampel dan melakukan persiapan sampel.
6. **Bagian Analisis Laboratorium** melakukan analisis sampel dan mencatat hasilnya di tabel Analysis Results.
7. **Bagian Verifikasi Hasil Uji** memverifikasi hasil analisis dan menyiapkan laporan hasil uji.
8. Semua aktivitas pengguna dicatat dalam Activity Logs untuk audit trail dan pelacakan.

View File

@@ -0,0 +1,276 @@
# Struktur Database Sistem Aplikasi Laboratorium Lingkungan
Berikut adalah penjelasan struktur database yang dirancang untuk sistem aplikasi laboratorium lingkungan berdasarkan alur pelayanan yang ada pada diagram.
## Gambaran Umum Alur Layanan
Alur laboratorium lingkungan melibatkan beberapa tahapan utama:
1. **Customer** (internal/eksternal) mengajukan permintaan sampling dan analisis
2. **Admin Lab** memproses permintaan, menyiapkan surat penawaran, quotation, dan registrasi
3. **Petugas Sampling** menyiapkan rencana sampling dan peralatan
4. **Bagian Penerimaan Contoh Uji** menerima dan mempreparasi sampel
5. **Bagian Analisis Laboratorium** menganalisa sampel uji sesuai jenis sampel
6. **Bagian Verifikasi Hasil Uji** melakukan verifikasi hasil uji
## Struktur Tabel
### 1. Tabel Customers (Pelanggan)
Menyimpan data pelanggan baik internal maupun eksternal yang meminta layanan pengujian.
| Field | Tipe Data | Keterangan |
|-------|-----------|------------|
| customer_id | INT | Primary Key, ID unik pelanggan |
| customer_name | VARCHAR(100) | Nama pelanggan |
| customer_type | ENUM | Tipe pelanggan: 'Internal' atau 'External' |
| contact_person | VARCHAR(100) | Nama kontak person |
| phone_number | VARCHAR(20) | Nomor telepon |
| email | VARCHAR(100) | Alamat email |
| address | TEXT | Alamat lengkap |
| company_name | VARCHAR(100) | Nama perusahaan/instansi |
| created_at | TIMESTAMP | Tanggal pembuatan record |
| updated_at | TIMESTAMP | Tanggal update terakhir |
### 2. Tabel Sample Types (Jenis Sampel)
Menyimpan jenis-jenis sampel yang dapat dianalisis oleh laboratorium.
| Field | Tipe Data | Keterangan |
|-------|-----------|------------|
| sample_type_id | INT | Primary Key, ID unik jenis sampel |
| type_name | VARCHAR(100) | Nama jenis sampel (contoh: Air Limbah, Air Permukaan, dll) |
| description | TEXT | Deskripsi jenis sampel |
| standard_method | TEXT | Metode standar untuk sampling dan analisis |
| created_at | TIMESTAMP | Tanggal pembuatan record |
### 3. Tabel Analysis Parameters (Parameter Analisis)
Menyimpan parameter-parameter yang dapat dianalisis oleh laboratorium.
| Field | Tipe Data | Keterangan |
|-------|-----------|------------|
| parameter_id | INT | Primary Key, ID unik parameter |
| parameter_name | VARCHAR(100) | Nama parameter (contoh: pH, BOD, COD, dll) |
| unit | VARCHAR(50) | Satuan parameter (mg/L, NTU, dll) |
| method | VARCHAR(100) | Metode analisis parameter |
| sample_type_id | INT | Foreign Key ke tabel sample_types |
| standard_value | VARCHAR(100) | Nilai baku mutu atau rentang standar |
| price | DECIMAL(10,2) | Harga analisis parameter |
| created_at | TIMESTAMP | Tanggal pembuatan record |
### 4. Tabel Service Requests (Permintaan Layanan)
Menyimpan permintaan layanan dari pelanggan.
| Field | Tipe Data | Keterangan |
|-------|-----------|------------|
| request_id | INT | Primary Key, ID unik permintaan |
| customer_id | INT | Foreign Key ke tabel customers |
| request_date | TIMESTAMP | Tanggal permintaan |
| request_type | ENUM | Tipe permintaan: 'Sampling and Analysis' atau 'Analysis Only' |
| project_name | VARCHAR(200) | Nama proyek |
| project_location | TEXT | Lokasi proyek |
| status | ENUM | Status permintaan (Draft, Submitted, Quotation Sent, Approved, dll) |
| admin_id | INT | ID admin yang menangani |
| quotation_number | VARCHAR(50) | Nomor quotation |
| quotation_date | DATE | Tanggal quotation |
| approved_date | DATE | Tanggal persetujuan |
| payment_proof | VARCHAR(255) | Bukti pembayaran DP |
| payment_date | DATE | Tanggal pembayaran |
| total_amount | DECIMAL(12,2) | Total biaya |
| notes | TEXT | Catatan tambahan |
| created_at | TIMESTAMP | Tanggal pembuatan record |
| updated_at | TIMESTAMP | Tanggal update terakhir |
### 5. Tabel Request Parameters (Parameter yang Diminta)
Menyimpan parameter-parameter yang diminta untuk dianalisis dalam suatu permintaan.
| Field | Tipe Data | Keterangan |
|-------|-----------|------------|
| request_parameter_id | INT | Primary Key, ID unik |
| request_id | INT | Foreign Key ke tabel service_requests |
| parameter_id | INT | Foreign Key ke tabel analysis_parameters |
| quantity | INT | Jumlah sampel untuk parameter |
| price_per_unit | DECIMAL(10,2) | Harga per unit |
| created_at | TIMESTAMP | Tanggal pembuatan record |
### 6. Tabel Sampling Plans (Rencana Sampling)
Menyimpan rencana-rencana sampling.
| Field | Tipe Data | Keterangan |
|-------|-----------|------------|
| plan_id | INT | Primary Key, ID unik rencana |
| request_id | INT | Foreign Key ke tabel service_requests |
| planned_date | DATE | Tanggal rencana sampling |
| location | TEXT | Lokasi sampling |
| coordinates | VARCHAR(100) | Koordinat GPS lokasi sampling |
| sampling_method | TEXT | Metode sampling yang digunakan |
| equipment_needed | TEXT | Peralatan yang dibutuhkan |
| sampling_officer_id | INT | ID petugas sampling |
| status | ENUM | Status rencana (Planned, Confirmed, Completed, Cancelled) |
| notes | TEXT | Catatan tambahan |
| created_at | TIMESTAMP | Tanggal pembuatan record |
| updated_at | TIMESTAMP | Tanggal update terakhir |
### 7. Tabel Samples (Sampel)
Menyimpan data sampel yang diambil.
| Field | Tipe Data | Keterangan |
|-------|-----------|------------|
| sample_id | INT | Primary Key, ID unik sampel |
| request_id | INT | Foreign Key ke tabel service_requests |
| plan_id | INT | Foreign Key ke tabel sampling_plans |
| sample_code | VARCHAR(50) | Kode unik sampel |
| sample_type_id | INT | Foreign Key ke tabel sample_types |
| sampling_date | DATETIME | Tanggal dan waktu pengambilan sampel |
| sampling_location | TEXT | Lokasi pengambilan sampel |
| sampling_officer_id | INT | ID petugas yang mengambil sampel |
| received_date | DATETIME | Tanggal dan waktu penerimaan sampel di lab |
| received_by | INT | ID petugas yang menerima sampel |
| sample_condition | TEXT | Kondisi sampel saat diterima |
| preparation_notes | TEXT | Catatan preparasi sampel |
| preservation_method | TEXT | Metode preservasi sampel |
| status | ENUM | Status sampel (Planned, Collected, Received, In Preparation, dll) |
| created_at | TIMESTAMP | Tanggal pembuatan record |
| updated_at | TIMESTAMP | Tanggal update terakhir |
### 8. Tabel Analysis Results (Hasil Analisis)
Menyimpan hasil-hasil analisis laboratorium.
| Field | Tipe Data | Keterangan |
|-------|-----------|------------|
| result_id | INT | Primary Key, ID unik hasil |
| sample_id | INT | Foreign Key ke tabel samples |
| parameter_id | INT | Foreign Key ke tabel analysis_parameters |
| analyst_id | INT | ID analis yang melakukan pengujian |
| analysis_date | DATETIME | Tanggal dan waktu analisis |
| result_value | VARCHAR(100) | Nilai hasil analisis |
| unit | VARCHAR(50) | Satuan hasil |
| method_used | VARCHAR(100) | Metode yang digunakan |
| is_within_standard | BOOLEAN | Apakah hasil dalam batas standar |
| notes | TEXT | Catatan analisis |
| status | ENUM | Status hasil (Planned, In Progress, Completed, Verified, Rejected) |
| verified_by | INT | ID petugas yang memverifikasi hasil |
| verification_date | DATETIME | Tanggal dan waktu verifikasi |
| created_at | TIMESTAMP | Tanggal pembuatan record |
| updated_at | TIMESTAMP | Tanggal update terakhir |
### 9. Tabel Reports (Laporan)
Menyimpan laporan hasil uji.
| Field | Tipe Data | Keterangan |
|-------|-----------|------------|
| report_id | INT | Primary Key, ID unik laporan |
| request_id | INT | Foreign Key ke tabel service_requests |
| report_number | VARCHAR(50) | Nomor laporan hasil uji |
| report_date | DATE | Tanggal laporan |
| prepared_by | INT | ID petugas yang menyiapkan laporan |
| verified_by | INT | ID petugas yang memverifikasi laporan |
| approved_by | INT | ID petugas yang menyetujui laporan |
| status | ENUM | Status laporan (Draft, Verified, Approved, Sent, Received) |
| file_path | VARCHAR(255) | Path ke file laporan |
| notes | TEXT | Catatan laporan |
| created_at | TIMESTAMP | Tanggal pembuatan record |
| updated_at | TIMESTAMP | Tanggal update terakhir |
### 10. Tabel Users (Pengguna)
Menyimpan data pengguna sistem (staf laboratorium).
| Field | Tipe Data | Keterangan |
|-------|-----------|------------|
| user_id | INT | Primary Key, ID unik pengguna |
| username | VARCHAR(50) | Username untuk login |
| password | VARCHAR(255) | Password terenkripsi |
| full_name | VARCHAR(100) | Nama lengkap pengguna |
| email | VARCHAR(100) | Email pengguna |
| role | ENUM | Peran pengguna (Admin, Sampling Officer, Lab Analyst, dll) |
| department | VARCHAR(100) | Departemen pengguna |
| is_active | BOOLEAN | Status aktif atau tidak |
| last_login | DATETIME | Waktu login terakhir |
| created_at | TIMESTAMP | Tanggal pembuatan record |
| updated_at | TIMESTAMP | Tanggal update terakhir |
### 11. Tabel Activity Logs (Log Aktivitas)
Menyimpan log aktivitas pada sistem.
| Field | Tipe Data | Keterangan |
|-------|-----------|------------|
| log_id | INT | Primary Key, ID unik log |
| user_id | INT | Foreign Key ke tabel users |
| action | VARCHAR(255) | Aksi yang dilakukan |
| table_name | VARCHAR(100) | Nama tabel yang berubah |
| record_id | INT | ID record yang berubah |
| details | TEXT | Detail perubahan |
| ip_address | VARCHAR(45) | Alamat IP |
| created_at | TIMESTAMP | Tanggal dan waktu log |
## Contoh Data Real
Berikut adalah contoh data nyata untuk beberapa tabel utama:
### Contoh Data Customers
```
1, 'PT. Industri Tekstil Nusantara', 'External', 'Budi Santoso', '08123456789', 'budi@tekstilnusantara.com', 'Jl. Industri No. 123, Bandung', 'PT. Industri Tekstil Nusantara'
2, 'Dinas Lingkungan Hidup Kota', 'External', 'Siti Aminah', '08765432100', 'siti@dlh.kotabjb.go.id', 'Jl. Pemkot No. 45, Kota BJB', 'Dinas Lingkungan Hidup Kota BJB'
3, 'Departemen Produksi', 'Internal', 'Rudi Hartono', '08567891234', 'rudi@internal.lab.com', 'Gedung Utama Lt. 2, Lab Lingkungan', 'Lab Lingkungan'
```
### Contoh Data Sample Types
```
1, 'Air Limbah', 'Sampel air limbah dari industri atau fasilitas', 'SNI 6989.59:2008'
2, 'Air Permukaan', 'Sampel air sungai, danau, atau badan air lainnya', 'SNI 6989.57:2008'
3, 'Air Tanah', 'Sampel air dari sumur atau mata air', 'SNI 6989.58:2008'
```
### Contoh Data Analysis Parameters
```
1, 'pH', '-', 'SNI 06-6989.11-2004', 1, '6-9', 50000.00
2, 'TSS', 'mg/L', 'SNI 06-6989.3-2004', 1, '100', 75000.00
3, 'COD', 'mg/L', 'SNI 6989.73:2009', 1, '100', 125000.00
4, 'BOD', 'mg/L', 'SNI 6989.72:2009', 1, '30', 150000.00
```
### Contoh Data Service Requests
```
1, 1, '2025-01-15 09:30:00', 'Sampling and Analysis', 'Pemantauan Limbah Triwulan I 2025', 'Pabrik Tekstil Bandung', 'Approved', 1, 'Q-2025-001', '2025-01-15', '2025-01-20', 'payment_proof_001.jpg', '2025-01-18', 2500000.00, 'Permintaan rutin triwulanan'
```
### Contoh Data Sampling Plans
```
1, 1, '2025-01-25', 'Outlet IPAL PT. Industri Tekstil Nusantara', '-6.914744, 107.609810', 'Grab Sampling sesuai SNI 6989.59:2008', 'Botol sampling, pH meter, termometer, cool box', 2, 'Completed', 'Sampling dilakukan pada pagi hari'
```
### Contoh Data Samples
```
1, 1, 1, 'ITN-2025-001', 1, '2025-01-25 10:15:00', 'Outlet IPAL PT. Industri Tekstil Nusantara', 2, '2025-01-25 15:30:00', 3, 'Baik, suhu 20°C', 'Sampel disaring untuk analisis TSS', 'Preservation with H2SO4 for COD', 'Analysis Complete'
```
### Contoh Data Analysis Results
```
1, 1, 1, 3, '2025-01-26 09:00:00', '7.6', '-', 'SNI 06-6989.11-2004', TRUE, 'pH diukur in-situ dan di laboratorium', 'Verified', 4, '2025-01-27 10:00:00'
2, 1, 2, 3, '2025-01-26 11:00:00', '45', 'mg/L', 'SNI 06-6989.3-2004', TRUE, 'Sampel disaring dengan kertas saring', 'Verified', 4, '2025-01-27 10:00:00'
```
## Kesesuaian dengan Alur Layanan
Struktur database ini dirancang untuk mendukung alur layanan laboratorium lingkungan seperti pada diagram:
1. **Customer (Internal dan eksternal)**
- Tabel `customers` menyimpan informasi pelanggan
- Tabel `service_requests` menyimpan permintaan sampling dan analisis
2. **Admin Lab Ling**
- Tabel `service_requests` menyimpan data penawaran, quotation, order pelanggan
- Tabel `users` menyimpan data admin yang bertanggung jawab
3. **Petugas Sampling**
- Tabel `sampling_plans` menyimpan rencana sampling
- Tabel `samples` menyimpan data sampel yang diambil
4. **Bagian penerimaan contoh uji**
- Tabel `samples` menyimpan informasi penerimaan dan preparasi sampel
5. **Bagian Analisis Laboratorium**
- Tabel `analysis_results` menyimpan hasil analisa sampel uji
6. **Bagian Verifikasi Hasil Uji**
- Tabel `analysis_results` menyimpan data verifikasi hasil uji
- Tabel `reports` menyimpan laporan hasil uji yang telah diverifikasi
Dengan struktur database ini, sistem dapat melacak seluruh alur dari permintaan pelanggan hingga penerbitan laporan hasil uji, sesuai dengan alur pelayanan pada diagram.

View File

@@ -0,0 +1,237 @@
# Entity Relationship Diagram (ERD) - Sistem Aplikasi Laboratorium Lingkungan (Mermaid)
Berikut adalah representasi hubungan antar entitas dalam sistem aplikasi laboratorium lingkungan menggunakan format Mermaid.
```mermaid
erDiagram
CUSTOMERS ||--o{ SERVICE_REQUESTS : "mengajukan"
CUSTOMERS {
int customer_id PK
varchar customer_name
enum customer_type
varchar contact_person
varchar phone_number
varchar email
text address
varchar company_name
timestamp created_at
timestamp updated_at
}
SERVICE_REQUESTS ||--o{ REQUEST_PARAMETERS : "memiliki"
SERVICE_REQUESTS ||--o{ SAMPLING_PLANS : "memiliki"
SERVICE_REQUESTS ||--o{ SAMPLES : "memiliki"
SERVICE_REQUESTS ||--o{ REPORTS : "menghasilkan"
SERVICE_REQUESTS {
int request_id PK
int customer_id FK
timestamp request_date
enum request_type
varchar project_name
text project_location
enum status
int admin_id
varchar quotation_number
date quotation_date
date approved_date
varchar payment_proof
date payment_date
decimal total_amount
text notes
timestamp created_at
timestamp updated_at
}
SAMPLE_TYPES ||--o{ ANALYSIS_PARAMETERS : "mendefinisikan"
SAMPLE_TYPES ||--o{ SAMPLES : "dikategorikan sebagai"
SAMPLE_TYPES {
int sample_type_id PK
varchar type_name
text description
text standard_method
timestamp created_at
}
ANALYSIS_PARAMETERS ||--o{ REQUEST_PARAMETERS : "diminta dalam"
ANALYSIS_PARAMETERS ||--o{ ANALYSIS_RESULTS : "digunakan untuk"
ANALYSIS_PARAMETERS {
int parameter_id PK
varchar parameter_name
varchar unit
varchar method
int sample_type_id FK
varchar standard_value
decimal price
timestamp created_at
}
REQUEST_PARAMETERS {
int request_parameter_id PK
int request_id FK
int parameter_id FK
int quantity
decimal price_per_unit
timestamp created_at
}
SAMPLING_PLANS ||--o{ SAMPLES : "menghasilkan"
SAMPLING_PLANS {
int plan_id PK
int request_id FK
date planned_date
text location
varchar coordinates
text sampling_method
text equipment_needed
int sampling_officer_id
enum status
text notes
timestamp created_at
timestamp updated_at
}
SAMPLES ||--o{ ANALYSIS_RESULTS : "dianalisis menjadi"
SAMPLES {
int sample_id PK
int request_id FK
int plan_id FK
varchar sample_code
int sample_type_id FK
datetime sampling_date
text sampling_location
int sampling_officer_id
datetime received_date
int received_by
text sample_condition
text preparation_notes
text preservation_method
enum status
timestamp created_at
timestamp updated_at
}
ANALYSIS_RESULTS {
int result_id PK
int sample_id FK
int parameter_id FK
int analyst_id
datetime analysis_date
varchar result_value
varchar unit
varchar method_used
boolean is_within_standard
text notes
enum status
int verified_by
datetime verification_date
timestamp created_at
timestamp updated_at
}
REPORTS {
int report_id PK
int request_id FK
varchar report_number
date report_date
int prepared_by
int verified_by
int approved_by
enum status
varchar file_path
text notes
timestamp created_at
timestamp updated_at
}
USERS ||--o{ ACTIVITY_LOGS : "melakukan"
USERS {
int user_id PK
varchar username
varchar password
varchar full_name
varchar email
enum role
varchar department
boolean is_active
datetime last_login
timestamp created_at
timestamp updated_at
}
ACTIVITY_LOGS {
int log_id PK
int user_id FK
varchar action
varchar table_name
int record_id
text details
varchar ip_address
text user_agent
timestamp created_at
}
```
## Penjelasan Relasi
1. **Customers** (1) -- (0..*) **Service Requests**
- Satu pelanggan (customer) dapat memiliki banyak permintaan layanan (service requests).
2. **Service Requests** (1) -- (0..*) **Request Parameters**
- Satu permintaan layanan dapat meminta banyak parameter untuk diuji.
3. **Analysis Parameters** (1) -- (0..*) **Request Parameters**
- Satu parameter analisis dapat diminta dalam banyak permintaan layanan.
4. **Sample Types** (1) -- (0..*) **Analysis Parameters**
- Satu jenis sampel dapat memiliki banyak parameter analisis.
5. **Service Requests** (1) -- (0..*) **Sampling Plans**
- Satu permintaan layanan dapat memiliki banyak rencana sampling.
6. **Sampling Plans** (1) -- (0..*) **Samples**
- Satu rencana sampling dapat menghasilkan banyak sampel.
7. **Service Requests** (1) -- (0..*) **Samples**
- Satu permintaan layanan dapat memiliki banyak sampel.
8. **Sample Types** (1) -- (0..*) **Samples**
- Satu jenis sampel dapat memiliki banyak sampel.
9. **Samples** (1) -- (0..*) **Analysis Results**
- Satu sampel dapat memiliki banyak hasil analisis.
10. **Analysis Parameters** (1) -- (0..*) **Analysis Results**
- Satu parameter analisis dapat digunakan untuk banyak hasil analisis.
11. **Service Requests** (1) -- (0..*) **Reports**
- Satu permintaan layanan dapat menghasilkan banyak laporan.
12. **Users** (1) -- (0..*) **Activity Logs**
- Satu pengguna dapat memiliki banyak catatan aktivitas.
13. **Users** berhubungan dengan banyak tabel lain melalui kolom seperti:
- admin_id pada Service Requests
- sampling_officer_id pada Sampling Plans
- sampling_officer_id pada Samples
- received_by pada Samples
- analyst_id pada Analysis Results
- verified_by pada Analysis Results
- prepared_by, verified_by, approved_by pada Reports
## Cara Menggunakan Diagram Mermaid
Diagram Mermaid ini dapat divisualisasikan dengan beberapa cara:
1. **GitHub**: GitHub secara native mendukung rendering diagram Mermaid dalam file Markdown.
2. **Mermaid Live Editor**: Kunjungi [Mermaid Live Editor](https://mermaid.live/) dan paste kode Mermaid di atas untuk melihat dan mengedit diagram secara interaktif.
3. **Plugin VS Code**: Gunakan plugin Mermaid untuk Visual Studio Code untuk melihat diagram secara langsung saat mengedit.
4. **Website Dengan Mermaid.js**: Tambahkan script Mermaid.js ke website Anda:
```html
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
<script>mermaid.initialize({startOnLoad:true});</script>
```
5. **Export ke Image**: Gunakan Mermaid Live Editor untuk mengekspor diagram ke format PNG, SVG, atau PDF.

View File

@@ -0,0 +1,307 @@
-- Database Structure for Environmental Laboratory Management System
-- Based on the workflow diagram provided
-- Create database
CREATE DATABASE IF NOT EXISTS lab_lingkungan;
USE lab_lingkungan;
-- Customers table (Internal and External)
CREATE TABLE customers (
customer_id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL,
customer_type ENUM('Internal', 'External') NOT NULL,
contact_person VARCHAR(100),
phone_number VARCHAR(20),
email VARCHAR(100),
address TEXT,
company_name VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Sample Types table
CREATE TABLE sample_types (
sample_type_id INT AUTO_INCREMENT PRIMARY KEY,
type_name VARCHAR(100) NOT NULL,
description TEXT,
standard_method TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Analysis Parameters table
CREATE TABLE analysis_parameters (
parameter_id INT AUTO_INCREMENT PRIMARY KEY,
parameter_name VARCHAR(100) NOT NULL,
unit VARCHAR(50),
method VARCHAR(100),
sample_type_id INT,
standard_value VARCHAR(100),
price DECIMAL(10, 2),
FOREIGN KEY (sample_type_id) REFERENCES sample_types(sample_type_id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Service Requests table
CREATE TABLE service_requests (
request_id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT NOT NULL,
request_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
request_type ENUM('Sampling and Analysis', 'Analysis Only') NOT NULL,
project_name VARCHAR(200),
project_location TEXT,
status ENUM('Draft', 'Submitted', 'Quotation Sent', 'Approved', 'Rejected', 'Completed', 'Cancelled') DEFAULT 'Draft',
admin_id INT,
quotation_number VARCHAR(50),
quotation_date DATE,
approved_date DATE,
payment_proof VARCHAR(255),
payment_date DATE,
total_amount DECIMAL(12, 2),
notes TEXT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Request Parameters (mapping between requests and required parameters)
CREATE TABLE request_parameters (
request_parameter_id INT AUTO_INCREMENT PRIMARY KEY,
request_id INT NOT NULL,
parameter_id INT NOT NULL,
quantity INT DEFAULT 1,
price_per_unit DECIMAL(10, 2),
FOREIGN KEY (request_id) REFERENCES service_requests(request_id),
FOREIGN KEY (parameter_id) REFERENCES analysis_parameters(parameter_id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Sampling Plans table
CREATE TABLE sampling_plans (
plan_id INT AUTO_INCREMENT PRIMARY KEY,
request_id INT NOT NULL,
planned_date DATE NOT NULL,
location TEXT NOT NULL,
coordinates VARCHAR(100),
sampling_method TEXT,
equipment_needed TEXT,
sampling_officer_id INT,
status ENUM('Planned', 'Confirmed', 'Completed', 'Cancelled') DEFAULT 'Planned',
notes TEXT,
FOREIGN KEY (request_id) REFERENCES service_requests(request_id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Samples table
CREATE TABLE samples (
sample_id INT AUTO_INCREMENT PRIMARY KEY,
request_id INT NOT NULL,
plan_id INT,
sample_code VARCHAR(50) NOT NULL,
sample_type_id INT NOT NULL,
sampling_date DATETIME,
sampling_location TEXT,
sampling_officer_id INT,
received_date DATETIME,
received_by INT,
sample_condition TEXT,
preparation_notes TEXT,
preservation_method TEXT,
status ENUM('Planned', 'Collected', 'Received', 'In Preparation', 'In Analysis', 'Analysis Complete', 'Verified', 'Reported') DEFAULT 'Planned',
FOREIGN KEY (request_id) REFERENCES service_requests(request_id),
FOREIGN KEY (plan_id) REFERENCES sampling_plans(plan_id),
FOREIGN KEY (sample_type_id) REFERENCES sample_types(sample_type_id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Analysis Results table
CREATE TABLE analysis_results (
result_id INT AUTO_INCREMENT PRIMARY KEY,
sample_id INT NOT NULL,
parameter_id INT NOT NULL,
analyst_id INT,
analysis_date DATETIME,
result_value VARCHAR(100),
unit VARCHAR(50),
method_used VARCHAR(100),
is_within_standard BOOLEAN,
notes TEXT,
status ENUM('Planned', 'In Progress', 'Completed', 'Verified', 'Rejected') DEFAULT 'Planned',
verified_by INT,
verification_date DATETIME,
FOREIGN KEY (sample_id) REFERENCES samples(sample_id),
FOREIGN KEY (parameter_id) REFERENCES analysis_parameters(parameter_id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Reports table
CREATE TABLE reports (
report_id INT AUTO_INCREMENT PRIMARY KEY,
request_id INT NOT NULL,
report_number VARCHAR(50) NOT NULL,
report_date DATE NOT NULL,
prepared_by INT,
verified_by INT,
approved_by INT,
status ENUM('Draft', 'Verified', 'Approved', 'Sent', 'Received') DEFAULT 'Draft',
file_path VARCHAR(255),
notes TEXT,
FOREIGN KEY (request_id) REFERENCES service_requests(request_id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Users table (Staff)
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
full_name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
role ENUM('Admin', 'Sampling Officer', 'Lab Analyst', 'Verification Officer', 'Manager') NOT NULL,
department VARCHAR(100),
is_active BOOLEAN DEFAULT TRUE,
last_login DATETIME,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Activity Logs table
CREATE TABLE activity_logs (
log_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
action VARCHAR(255) NOT NULL,
table_name VARCHAR(100),
record_id INT,
details TEXT,
ip_address VARCHAR(45),
user_agent TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
-- Insert sample data for testing
-- Sample Users
INSERT INTO users (username, password, full_name, email, role, department) VALUES
('admin1', '$2y$10$somehashedpassword1', 'Administrator 1', 'admin1@lab.com', 'Admin', 'Administration'),
('sampler1', '$2y$10$somehashedpassword2', 'Sampling Officer 1', 'sampler1@lab.com', 'Sampling Officer', 'Field Operations'),
('analyst1', '$2y$10$somehashedpassword3', 'Lab Analyst 1', 'analyst1@lab.com', 'Lab Analyst', 'Laboratory'),
('verifier1', '$2y$10$somehashedpassword4', 'Verification Officer 1', 'verifier1@lab.com', 'Verification Officer', 'Quality Control'),
('manager1', '$2y$10$somehashedpassword5', 'Manager 1', 'manager1@lab.com', 'Manager', 'Management');
-- Sample Types
INSERT INTO sample_types (type_name, description, standard_method) VALUES
('Air Limbah', 'Sampel air limbah dari industri atau fasilitas', 'SNI 6989.59:2008'),
('Air Permukaan', 'Sampel air sungai, danau, atau badan air lainnya', 'SNI 6989.57:2008'),
('Air Tanah', 'Sampel air dari sumur atau mata air', 'SNI 6989.58:2008'),
('Tanah', 'Sampel tanah untuk analisis parameter lingkungan', 'SNI 8520:2018'),
('Udara Ambien', 'Sampel udara ambient untuk analisis kualitas udara', 'SNI 7119:2017');
-- Analysis Parameters
INSERT INTO analysis_parameters (parameter_name, unit, method, sample_type_id, standard_value, price) VALUES
('pH', '-', 'SNI 06-6989.11-2004', 1, '6-9', 50000.00),
('TSS', 'mg/L', 'SNI 06-6989.3-2004', 1, '100', 75000.00),
('COD', 'mg/L', 'SNI 6989.73:2009', 1, '100', 125000.00),
('BOD', 'mg/L', 'SNI 6989.72:2009', 1, '30', 150000.00),
('Ammonia', 'mg/L', 'SNI 06-6989.30-2005', 1, '10', 100000.00),
('Logam Berat Pb', 'mg/L', 'SNI 6989.8:2009', 1, '0.1', 200000.00),
('Total Coliform', 'MPN/100mL', 'SNI 01-2897-1992', 2, '1000', 175000.00),
('DO', 'mg/L', 'SNI 06-6989.14-2004', 2, '4', 80000.00),
('Sulfida', 'mg/L', 'SNI 6989.70:2009', 1, '0.5', 125000.00),
('Minyak & Lemak', 'mg/L', 'SNI 6989.10:2011', 1, '10', 150000.00);
-- Sample Customers
INSERT INTO customers (customer_name, customer_type, contact_person, phone_number, email, address, company_name) VALUES
('PT. Industri Tekstil Nusantara', 'External', 'Budi Santoso', '08123456789', 'budi@tekstilnusantara.com', 'Jl. Industri No. 123, Bandung', 'PT. Industri Tekstil Nusantara'),
('Dinas Lingkungan Hidup Kota', 'External', 'Siti Aminah', '08765432100', 'siti@dlh.kotabjb.go.id', 'Jl. Pemkot No. 45, Kota BJB', 'Dinas Lingkungan Hidup Kota BJB'),
('Departemen Produksi', 'Internal', 'Rudi Hartono', '08567891234', 'rudi@internal.lab.com', 'Gedung Utama Lt. 2, Lab Lingkungan', 'Lab Lingkungan'),
('PT. Kimia Farma', 'External', 'Diana Putri', '08123456790', 'diana@kimiafarma.co.id', 'Jl. Pahlawan No. 67, Jakarta', 'PT. Kimia Farma'),
('Departemen R&D', 'Internal', 'Hendra Wijaya', '08567891235', 'hendra@internal.lab.com', 'Gedung Riset Lt. 3, Lab Lingkungan', 'Lab Lingkungan');
-- Sample Service Requests
INSERT INTO service_requests (customer_id, request_type, project_name, project_location, status, quotation_number, quotation_date, approved_date, total_amount) VALUES
(1, 'Sampling and Analysis', 'Pemantauan Limbah Triwulan I 2025', 'Pabrik Tekstil Bandung', 'Approved', 'Q-2025-001', '2025-01-15', '2025-01-20', 2500000.00),
(2, 'Sampling and Analysis', 'Monitoring Kualitas Air Sungai Citarum', 'Sungai Citarum, 5 titik sampling', 'Completed', 'Q-2025-002', '2025-02-10', '2025-02-15', 3750000.00),
(3, 'Analysis Only', 'Analisis Limbah Internal Bulanan', 'IPAL Gedung Utama', 'In Progress', 'Q-2025-003', '2025-03-05', '2025-03-07', 1250000.00),
(4, 'Sampling and Analysis', 'Audit Lingkungan Semester I', 'Pabrik Farmasi Jakarta', 'Quotation Sent', 'Q-2025-004', '2025-03-20', NULL, 4500000.00),
(5, 'Analysis Only', 'Pengujian Efisiensi Filter Karbon', 'Lab R&D', 'Submitted', NULL, NULL, NULL, NULL);
-- Sample Request Parameters
INSERT INTO request_parameters (request_id, parameter_id, quantity, price_per_unit) VALUES
(1, 1, 1, 50000.00), -- pH for Request 1
(1, 2, 1, 75000.00), -- TSS for Request 1
(1, 3, 1, 125000.00), -- COD for Request 1
(1, 4, 1, 150000.00), -- BOD for Request 1
(1, 5, 1, 100000.00), -- Ammonia for Request 1
(2, 1, 5, 50000.00), -- pH for Request 2 (5 titik)
(2, 2, 5, 75000.00), -- TSS for Request 2 (5 titik)
(2, 7, 5, 175000.00), -- Total Coliform for Request 2 (5 titik)
(2, 8, 5, 80000.00), -- DO for Request 2 (5 titik)
(3, 1, 1, 50000.00), -- pH for Request 3
(3, 2, 1, 75000.00), -- TSS for Request 3
(3, 3, 1, 125000.00), -- COD for Request 3
(3, 4, 1, 150000.00), -- BOD for Request 3
(4, 1, 3, 50000.00), -- pH for Request 4 (3 titik)
(4, 2, 3, 75000.00), -- TSS for Request 4 (3 titik)
(4, 3, 3, 125000.00), -- COD for Request 4 (3 titik)
(4, 4, 3, 150000.00), -- BOD for Request 4 (3 titik)
(4, 6, 3, 200000.00), -- Logam Berat Pb for Request 4 (3 titik)
(4, 9, 3, 125000.00), -- Sulfida for Request 4 (3 titik)
(4, 10, 3, 150000.00);-- Minyak & Lemak for Request 4 (3 titik)
-- Sample Sampling Plans
INSERT INTO sampling_plans (request_id, planned_date, location, coordinates, sampling_method, equipment_needed, sampling_officer_id, status) VALUES
(1, '2025-01-25', 'Outlet IPAL PT. Industri Tekstil Nusantara', '-6.914744, 107.609810', 'Grab Sampling sesuai SNI 6989.59:2008', 'Botol sampling, pH meter, termometer, cool box', 2, 'Completed'),
(2, '2025-02-20', 'Sungai Citarum - Titik 1 (Hulu)', '-6.947890, 107.632505', 'Grab Sampling sesuai SNI 6989.57:2008', 'Botol sampling, pH meter, DO meter, termometer, cool box', 2, 'Completed'),
(2, '2025-02-20', 'Sungai Citarum - Titik 2', '-6.933456, 107.621234', 'Grab Sampling sesuai SNI 6989.57:2008', 'Botol sampling, pH meter, DO meter, termometer, cool box', 2, 'Completed'),
(2, '2025-02-20', 'Sungai Citarum - Titik 3', '-6.925678, 107.612345', 'Grab Sampling sesuai SNI 6989.57:2008', 'Botol sampling, pH meter, DO meter, termometer, cool box', 2, 'Completed'),
(2, '2025-02-20', 'Sungai Citarum - Titik 4', '-6.912345, 107.603456', 'Grab Sampling sesuai SNI 6989.57:2008', 'Botol sampling, pH meter, DO meter, termometer, cool box', 2, 'Completed'),
(2, '2025-02-20', 'Sungai Citarum - Titik 5 (Hilir)', '-6.901234, 107.594567', 'Grab Sampling sesuai SNI 6989.57:2008', 'Botol sampling, pH meter, DO meter, termometer, cool box', 2, 'Completed'),
(4, '2025-04-05', 'Outlet IPAL PT. Kimia Farma', '-6.186486, 106.834091', 'Grab Sampling sesuai SNI 6989.59:2008', 'Botol sampling, pH meter, termometer, cool box', 2, 'Planned'),
(4, '2025-04-05', 'Area Produksi PT. Kimia Farma', '-6.186123, 106.833987', 'Grab Sampling sesuai SNI 6989.59:2008', 'Botol sampling, pH meter, termometer, cool box', 2, 'Planned'),
(4, '2025-04-05', 'Area Penyimpanan Bahan Baku PT. Kimia Farma', '-6.185789, 106.834567', 'Grab Sampling sesuai SNI 6989.59:2008', 'Botol sampling, pH meter, termometer, cool box', 2, 'Planned');
-- Sample Samples
INSERT INTO samples (request_id, plan_id, sample_code, sample_type_id, sampling_date, sampling_location, sampling_officer_id, received_date, received_by, sample_condition, preparation_notes, status) VALUES
(1, 1, 'ITN-2025-001', 1, '2025-01-25 10:15:00', 'Outlet IPAL PT. Industri Tekstil Nusantara', 2, '2025-01-25 15:30:00', 3, 'Baik, suhu 20°C', 'Sampel disaring untuk analisis TSS', 'Analysis Complete'),
(2, 2, 'SC-H-2025-001', 2, '2025-02-20 08:30:00', 'Sungai Citarum - Titik 1 (Hulu)', 2, '2025-02-20 16:00:00', 3, 'Baik, suhu 19°C', 'Sampel diawetkan dengan H₂SO₄ untuk COD', 'Analysis Complete'),
(2, 3, 'SC-2-2025-002', 2, '2025-02-20 09:45:00', 'Sungai Citarum - Titik 2', 2, '2025-02-20 16:00:00', 3, 'Baik, suhu 19°C', 'Sampel diawetkan dengan H₂SO₄ untuk COD', 'Analysis Complete'),
(2, 4, 'SC-3-2025-003', 2, '2025-02-20 11:00:00', 'Sungai Citarum - Titik 3', 2, '2025-02-20 16:00:00', 3, 'Baik, suhu 20°C', 'Sampel diawetkan dengan H₂SO₄ untuk COD', 'Analysis Complete'),
(2, 5, 'SC-4-2025-004', 2, '2025-02-20 13:15:00', 'Sungai Citarum - Titik 4', 2, '2025-02-20 16:00:00', 3, 'Baik, suhu 20°C', 'Sampel diawetkan dengan H₂SO₄ untuk COD', 'Analysis Complete'),
(2, 6, 'SC-I-2025-005', 2, '2025-02-20 14:30:00', 'Sungai Citarum - Titik 5 (Hilir)', 2, '2025-02-20 16:00:00', 3, 'Baik, suhu 21°C', 'Sampel diawetkan dengan H₂SO₄ untuk COD', 'Analysis Complete'),
(3, NULL, 'INT-2025-001', 1, NULL, 'IPAL Gedung Utama', NULL, '2025-03-10 10:00:00', 3, 'Baik, suhu 22°C', 'Sampel dikirim oleh Departemen Produksi', 'In Analysis');
-- Sample Analysis Results (for request 1 and 2)
INSERT INTO analysis_results (sample_id, parameter_id, analyst_id, analysis_date, result_value, unit, method_used, is_within_standard, status, verified_by, verification_date) VALUES
(1, 1, 3, '2025-01-26 09:00:00', '7.6', '-', 'SNI 06-6989.11-2004', TRUE, 'Verified', 4, '2025-01-27 10:00:00'),
(1, 2, 3, '2025-01-26 11:00:00', '45', 'mg/L', 'SNI 06-6989.3-2004', TRUE, 'Verified', 4, '2025-01-27 10:00:00'),
(1, 3, 3, '2025-01-26 13:00:00', '87', 'mg/L', 'SNI 6989.73:2009', TRUE, 'Verified', 4, '2025-01-27 10:00:00'),
(1, 4, 3, '2025-01-26 15:00:00', '28', 'mg/L', 'SNI 6989.72:2009', TRUE, 'Verified', 4, '2025-01-27 10:00:00'),
(1, 5, 3, '2025-01-26 16:00:00', '3.5', 'mg/L', 'SNI 06-6989.30-2005', TRUE, 'Verified', 4, '2025-01-27 10:00:00'),
(2, 1, 3, '2025-02-21 09:00:00', '7.2', '-', 'SNI 06-6989.11-2004', TRUE, 'Verified', 4, '2025-02-22 11:00:00'),
(2, 2, 3, '2025-02-21 11:00:00', '12', 'mg/L', 'SNI 06-6989.3-2004', TRUE, 'Verified', 4, '2025-02-22 11:00:00'),
(2, 7, 3, '2025-02-21 13:00:00', '210', 'MPN/100mL', 'SNI 01-2897-1992', TRUE, 'Verified', 4, '2025-02-22 11:00:00'),
(2, 8, 3, '2025-02-21 15:00:00', '5.6', 'mg/L', 'SNI 06-6989.14-2004', TRUE, 'Verified', 4, '2025-02-22 11:00:00'),
(3, 1, 3, '2025-02-21 09:30:00', '7.1', '-', 'SNI 06-6989.11-2004', TRUE, 'Verified', 4, '2025-02-22 11:00:00'),
(3, 2, 3, '2025-02-21 11:30:00', '18', 'mg/L', 'SNI 06-6989.3-2004', TRUE, 'Verified', 4, '2025-02-22 11:00:00'),
(3, 7, 3, '2025-02-21 13:30:00', '320', 'MPN/100mL', 'SNI 01-2897-1992', TRUE, 'Verified', 4, '2025-02-22 11:00:00'),
(3, 8, 3, '2025-02-21 15:30:00', '5.2', 'mg/L', 'SNI 06-6989.14-2004', TRUE, 'Verified', 4, '2025-02-22 11:00:00');
-- Sample Reports
INSERT INTO reports (request_id, report_number, report_date, prepared_by, verified_by, approved_by, status, file_path) VALUES
(1, 'LHU-2025-001', '2025-01-29', 3, 4, 5, 'Sent', '/reports/2025/LHU-2025-001.pdf'),
(2, 'LHU-2025-002', '2025-02-25', 3, 4, 5, 'Sent', '/reports/2025/LHU-2025-002.pdf');
-- Sample Activity Logs
INSERT INTO activity_logs (user_id, action, table_name, record_id, details, ip_address) VALUES
(1, 'CREATE', 'service_requests', 1, 'Created new service request for PT. Industri Tekstil Nusantara', '192.168.1.100'),
(1, 'UPDATE', 'service_requests', 1, 'Updated status to Approved', '192.168.1.100'),
(2, 'CREATE', 'sampling_plans', 1, 'Created sampling plan for request #1', '192.168.1.101'),
(2, 'CREATE', 'samples', 1, 'Collected sample ITN-2025-001', '192.168.1.101'),
(3, 'UPDATE', 'samples', 1, 'Sample received at laboratory', '192.168.1.102'),
(3, 'CREATE', 'analysis_results', 1, 'Recorded pH analysis result', '192.168.1.102'),
(4, 'UPDATE', 'analysis_results', 1, 'Verified analysis result', '192.168.1.103'),
(5, 'CREATE', 'reports', 1, 'Created report LHU-2025-001', '192.168.1.104');

275
lab_env_db_class_diagram.md Normal file
View File

@@ -0,0 +1,275 @@
# Diagram Kelas Sistem Aplikasi Laboratorium Lingkungan
Berikut adalah diagram kelas yang memvisualisasikan struktur database dan menunjukkan hubungannya dengan alur proses laboratorium lingkungan.
```mermaid
classDiagram
class Customer {
+customer_id: int
+customer_name: varchar
+customer_type: enum
+contact_person: varchar
+phone_number: varchar
+email: varchar
+address: text
+company_name: varchar
+createRequest()
+viewRequestStatus()
+downloadReports()
}
class ServiceRequest {
+request_id: int
+customer_id: int
+request_date: timestamp
+request_type: enum
+project_name: varchar
+project_location: text
+status: enum
+admin_id: int
+quotation_number: varchar
+quotation_date: date
+approved_date: date
+payment_proof: varchar
+payment_date: date
+total_amount: decimal
+notes: text
+createQuotation()
+updateStatus()
+assignToSampling()
+recordPayment()
}
class RequestParameter {
+request_parameter_id: int
+request_id: int
+parameter_id: int
+quantity: int
+price_per_unit: decimal
+calculateCost()
}
class AnalysisParameter {
+parameter_id: int
+parameter_name: varchar
+unit: varchar
+method: varchar
+sample_type_id: int
+standard_value: varchar
+price: decimal
+checkCompliance()
}
class SampleType {
+sample_type_id: int
+type_name: varchar
+description: text
+standard_method: text
}
class SamplingPlan {
+plan_id: int
+request_id: int
+planned_date: date
+location: text
+coordinates: varchar
+sampling_method: text
+equipment_needed: text
+sampling_officer_id: int
+status: enum
+notes: text
+scheduleSampling()
+assignSamplingOfficer()
+listEquipment()
}
class Sample {
+sample_id: int
+request_id: int
+plan_id: int
+sample_code: varchar
+sample_type_id: int
+sampling_date: datetime
+sampling_location: text
+sampling_officer_id: int
+received_date: datetime
+received_by: int
+sample_condition: text
+preparation_notes: text
+preservation_method: text
+status: enum
+collectSample()
+receiveSample()
+prepareSample()
+trackStatus()
}
class AnalysisResult {
+result_id: int
+sample_id: int
+parameter_id: int
+analyst_id: int
+analysis_date: datetime
+result_value: varchar
+unit: varchar
+method_used: varchar
+is_within_standard: boolean
+notes: text
+status: enum
+verified_by: int
+verification_date: datetime
+recordResult()
+verifyResult()
+compareToStandard()
}
class Report {
+report_id: int
+request_id: int
+report_number: varchar
+report_date: date
+prepared_by: int
+verified_by: int
+approved_by: int
+status: enum
+file_path: varchar
+notes: text
+generateReport()
+approveReport()
+sendToCustomer()
}
class User {
+user_id: int
+username: varchar
+password: varchar
+full_name: varchar
+email: varchar
+role: enum
+department: varchar
+is_active: boolean
+last_login: datetime
+login()
+updateProfile()
+resetPassword()
+assignTasks()
}
class ActivityLog {
+log_id: int
+user_id: int
+action: varchar
+table_name: varchar
+record_id: int
+details: text
+ip_address: varchar
+created_at: timestamp
+recordActivity()
+viewAuditTrail()
}
Customer "1" --> "*" ServiceRequest : mengajukan
ServiceRequest "1" --> "*" RequestParameter : memiliki
ServiceRequest "1" --> "*" SamplingPlan : menyertakan
ServiceRequest "1" --> "*" Sample : menghasilkan
ServiceRequest "1" --> "*" Report : melaporkan
AnalysisParameter "1" --> "*" RequestParameter : diminta dalam
AnalysisParameter "1" --> "*" AnalysisResult : diuji dalam
SampleType "1" --> "*" AnalysisParameter : mendefinisikan
SampleType "1" --> "*" Sample : mengkategorikan
SamplingPlan "1" --> "*" Sample : menghasilkan
Sample "1" --> "*" AnalysisResult : dianalisis menjadi
User "1" --> "*" ActivityLog : merekam aktivitas
%% Tambahan relasi untuk memetakan peran user
User "1" --> "*" ServiceRequest : mengelola sebagai admin
User "1" --> "*" SamplingPlan : bertugas sebagai sampling officer
User "1" --> "*" Sample : bertugas sebagai sampling officer/penerima
User "1" --> "*" AnalysisResult : bertugas sebagai analis/verifikator
User "1" --> "*" Report : menyiapkan/memverifikasi/menyetujui
```
## Penjelasan Diagram Kelas
Diagram kelas di atas tidak hanya menampilkan struktur database, tetapi juga fungsionalitas utama dari setiap entitas dalam sistem aplikasi laboratorium lingkungan.
### Entitas Utama dan Fungsinya
1. **Customer**
- Mewakili pelanggan internal dan eksternal
- Fungsi: membuat permintaan, melihat status, mengunduh laporan
2. **ServiceRequest**
- Mewakili permintaan layanan dari pelanggan
- Fungsi: membuat quotation, memperbarui status, merekam pembayaran
3. **SamplingPlan**
- Mewakili rencana pengambilan sampel
- Fungsi: menjadwalkan sampling, menugaskan petugas, mencatat peralatan
4. **Sample**
- Mewakili sampel yang diambil/diterima
- Fungsi: mencatat pengambilan, penerimaan, preparasi sampel
5. **AnalysisResult**
- Mewakili hasil analisis laboratorium
- Fungsi: merekam hasil, memverifikasi, membandingkan dengan standar
6. **Report**
- Mewakili laporan hasil uji
- Fungsi: membuat laporan, menyetujui, mengirim ke pelanggan
7. **User**
- Mewakili pengguna sistem (admin, petugas sampling, analis, dll)
- Fungsi: login, mengelola profil, menugaskan aktivitas
8. **ActivityLog**
- Mewakili catatan aktivitas sistem
- Fungsi: merekam aktivitas, menampilkan audit trail
### Alur Proses dalam Sistem
Diagram kelas ini memvisualisasikan alur proses berikut:
1. **Permintaan Layanan**
- Customer mengajukan ServiceRequest
- ServiceRequest memiliki RequestParameter yang merinci parameter yang akan dianalisis
2. **Proses Sampling (jika diperlukan)**
- ServiceRequest memicu pembuatan SamplingPlan
- SamplingPlan ditugaskan kepada User (Sampling Officer)
- SamplingPlan menghasilkan Sample
3. **Penerimaan dan Preparasi Sampel**
- Sample diterima dan dipreparasi oleh User (Lab Staff)
- Sample dikategorikan menurut SampleType
4. **Analisis Laboratorium**
- Sample menghasilkan AnalysisResult
- AnalysisResult dikaitkan dengan AnalysisParameter
- AnalysisResult dicatat dan diverifikasi oleh User (Analyst, Verifier)
5. **Pelaporan Hasil**
- ServiceRequest menghasilkan Report
- Report disiapkan, diverifikasi, dan disetujui oleh User
- Report dikirimkan kepada Customer
6. **Audit dan Pelacakan**
- Semua aktivitas User direkam dalam ActivityLog
- ActivityLog menyediakan audit trail untuk akreditasi dan kepatuhan
## Cara Menggunakan Diagram
Diagram kelas Mermaid ini dapat membantu:
1. **Pengembang Sistem**: Untuk memahami struktur database dan hubungan antar entitas
2. **Analis Bisnis**: Untuk memahami alur proses laboratorium dan bagaimana data mengalir antar komponen
3. **Pengelola Laboratorium**: Untuk memvisualisasikan bagaimana peran staf terkait dengan proses bisnis
4. **Auditor**: Untuk memahami bagaimana sistem melacak aktivitas dan memastikan kepatuhan
Seperti diagram Mermaid lainnya, diagram ini dapat dilihat menggunakan Mermaid Live Editor atau di platform yang mendukung rendering Mermaid seperti GitHub.

View File

@@ -0,0 +1,237 @@
# Diagram Alur Penawaran, Quotation, dan Pengisian Data Teknis
Berikut adalah diagram yang menggambarkan alur proses detail untuk penawaran, quotation, dan pengisian data teknis oleh Admin laboratorium lingkungan.
## 1. Diagram Alur Keseluruhan
```mermaid
flowchart TD
subgraph "Tahap 1: Permintaan & Penawaran"
A1[Permintaan Pelanggan] -->|Diterima oleh| A2[Admin Lab]
A2 -->|Mencatat Permintaan| A3[Entry Permintaan di Sistem]
A3 -->|Analisis Kebutuhan| A4[Identifikasi Parameter]
A4 -->|Kalkulasi Biaya| A5[Penyiapan Penawaran]
A5 -->|Generate Dokumen| A6[Penawaran]
end
subgraph "Tahap 2: Quotation & Persetujuan"
B1[Pembuatan Quotation] -->|Generate Dokumen Resmi| B2[Quotation]
B2 -->|Pengiriman ke Pelanggan| B3[Menunggu Persetujuan]
B3 -->|Diterima| B4[Approval dari Pelanggan]
B4 -->|Pembayaran DP| B5[Verifikasi Pembayaran]
B5 -->|Konfirmasi| B6[Status Order: Approved]
end
subgraph "Tahap 3: Data Teknis & Registrasi"
C1[Pengisian Data Teknis] -->|Detail Sampling| C2[Protokol Sampling]
C1 -->|Jadwal & Tim| C3[Penjadwalan Sampling]
C1 -->|Peralatan| C4[Requisition Peralatan]
C2 --> C5[Registrasi Order]
C3 --> C5
C4 --> C5
C5 -->|Generate| C6[Surat Perintah Kerja]
C6 -->|Pelaksanaan| C7[Sampling & Analisis]
end
A6 --> B1
B6 --> C1
classDef requestStage fill:#ffcccc,stroke:#ff6666
classDef quotationStage fill:#ccffcc,stroke:#66ff66
classDef technicalStage fill:#ccccff,stroke:#6666ff
class A1,A2,A3,A4,A5,A6 requestStage
class B1,B2,B3,B4,B5,B6 quotationStage
class C1,C2,C3,C4,C5,C6,C7 technicalStage
```
## 2. Diagram Detail: Proses Pembuatan Quotation
```mermaid
sequenceDiagram
actor Customer as Pelanggan
actor Admin as Admin Lab
participant QuotSystem as Sistem Quotation
participant PriceDB as Database Harga
participant ApprovalFlow as Alur Persetujuan
Customer->>Admin: Permintaan Layanan
Admin->>QuotSystem: Login ke Modul Quotation
QuotSystem->>Admin: Tampilkan Form Quotation Baru
Admin->>QuotSystem: Input Data Pelanggan
Admin->>QuotSystem: Pilih Jenis Permintaan<br/>(Sampling & Analisis/Analisis Saja)
Admin->>QuotSystem: Tambahkan Parameter Analisis
QuotSystem->>PriceDB: Query Harga Parameter
PriceDB-->>QuotSystem: Return Data Harga
Admin->>QuotSystem: Input Jumlah Titik/Sampel
Admin->>QuotSystem: Tambahkan Biaya Tambahan<br/>(Sampling, Transport, dll)
QuotSystem->>QuotSystem: Kalkulasi Total
QuotSystem-->>Admin: Tampilkan Preview Quotation
Admin->>QuotSystem: Terapkan Diskon (jika ada)
Admin->>QuotSystem: Tambahkan Syarat & Ketentuan
opt Quotation Kompleks/Nilai Besar
Admin->>ApprovalFlow: Submit untuk Persetujuan
ApprovalFlow->>ApprovalFlow: Review oleh Supervisor
ApprovalFlow-->>Admin: Persetujuan Diberikan
end
Admin->>QuotSystem: Finalisasi Quotation
QuotSystem-->>Admin: Generate Dokumen PDF
Admin->>Customer: Kirim Quotation via Email
Customer->>Admin: Konfirmasi Persetujuan
Admin->>QuotSystem: Catat Persetujuan
Customer->>Admin: Kirim Bukti Pembayaran DP
Admin->>QuotSystem: Upload Bukti Pembayaran
QuotSystem->>QuotSystem: Update Status Order
QuotSystem-->>Admin: Konfirmasi Order Disetujui
```
## 3. Diagram Detail: Pengisian Data Teknis
```mermaid
flowchart LR
A[Admin Lab] -->|Akses| B[Modul Data Teknis]
subgraph "Pengisian Data Teknis"
B --> C1[Data Lokasi Sampling]
B --> C2[Metode Sampling]
B --> C3[Metode Preservasi]
B --> C4[Kebutuhan Peralatan]
B --> C5[Instruksi Khusus]
B --> C6[Tim & Jadwal]
C1 --> D1[Koordinat GPS]
C1 --> D2[Deskripsi Lokasi]
C1 --> D3[Akses Lokasi]
C2 --> E1[Protokol Sampling]
C2 --> E2[Jenis Sampling]
C2 --> E3[Volume Sampel]
C3 --> F1[Preservasi Kimia]
C3 --> F2[Preservasi Fisik]
C3 --> F3[Waktu Holding]
C4 --> G1[Alat Sampling]
C4 --> G2[Alat Uji Lapangan]
C4 --> G3[Media Preservasi]
C5 --> H1[Persyaratan Pelanggan]
C5 --> H2[Kontrol Kualitas]
C5 --> H3[Dokumentasi]
C6 --> I1[Petugas Sampling]
C6 --> I2[Tanggal & Waktu]
C6 --> I3[Durasi Pengerjaan]
end
subgraph "Finalisasi"
J[Sistem Lab] <--> C1 & C2 & C3 & C4 & C5 & C6
J --> K[Registrasi Order]
K --> L[Work Order]
L --> M[Pelaksanaan]
end
classDef adminClass fill:#ffdddd,stroke:#ff9999
classDef moduleClass fill:#ddffdd,stroke:#99ff99
classDef dataClass fill:#ddddff,stroke:#9999ff
classDef detailClass fill:#ffffdd,stroke:#ffff99
classDef finalClass fill:#ddffff,stroke:#99ffff
class A adminClass
class B moduleClass
class C1,C2,C3,C4,C5,C6 dataClass
class D1,D2,D3,E1,E2,E3,F1,F2,F3,G1,G2,G3,H1,H2,H3,I1,I2,I3 detailClass
class J,K,L,M finalClass
```
## 4. Status Permintaan Layanan
```mermaid
stateDiagram-v2
[*] --> Draft: Admin membuat permintaan baru
Draft --> Submitted: Admin submit permintaan ke sistem
Submitted --> Quote_Preparation: Admin menyiapkan penawaran
Quote_Preparation --> Quotation_Sent: Penawaran dikirim ke pelanggan
Quotation_Sent --> Approved: Pelanggan menyetujui
Quotation_Sent --> Rejected: Pelanggan menolak
Quotation_Sent --> Negotiation: Pelanggan minta revisi
Negotiation --> Quote_Preparation: Perlu revisi penawaran
Approved --> Technical_Details: Admin lengkapi data teknis
Technical_Details --> Registered: Order diregistrasi
Registered --> In_Progress: Sampling/analisis dimulai
In_Progress --> Completed: Analisis selesai
Completed --> Verified: Hasil diverifikasi
Verified --> Reported: Laporan dibuat
Rejected --> [*]
Reported --> [*]
state Quotation_Process {
[*] --> Quote_Draft
Quote_Draft --> Quote_Review
Quote_Review --> Quote_Approval
Quote_Approval --> Quote_Final
Quote_Final --> [*]
}
```
## Penjelasan Diagram
### 1. Diagram Alur Keseluruhan
Diagram ini menampilkan alur proses dari awal permintaan pelanggan hingga pelaksanaan sampling dan analisis, dibagi menjadi tiga tahap utama:
- **Tahap 1**: Proses menerima permintaan dan menyiapkan penawaran
- **Tahap 2**: Proses membuat quotation, mendapatkan persetujuan, dan verifikasi pembayaran
- **Tahap 3**: Proses melengkapi data teknis dan registrasi order
### 2. Diagram Detail: Proses Pembuatan Quotation
Diagram sequence ini menunjukkan interaksi detail antara Pelanggan, Admin Lab, dan berbagai komponen sistem saat menyiapkan quotation, termasuk:
- Proses query harga parameter dari database
- Proses kalkulasi biaya
- Proses persetujuan internal (untuk quotation nilai besar)
- Proses pengiriman, persetujuan, dan verifikasi pembayaran
### 3. Diagram Detail: Pengisian Data Teknis
Diagram ini memperlihatkan komponen-komponen data teknis yang perlu dilengkapi oleh Admin Lab, termasuk:
- Data lokasi sampling dengan detail koordinat dan akses
- Metode sampling dan preservasi
- Kebutuhan peralatan
- Instruksi khusus dari pelanggan
- Informasi tim dan jadwal
### 4. Status Permintaan Layanan
Diagram status ini menunjukkan berbagai status yang mungkin dialami oleh permintaan layanan dari awal hingga akhir, termasuk:
- Proses persetujuan quotation
- Proses negosiasi jika diperlukan
- Alur kerja setelah order disetujui
## Keuntungan Diagram Ini untuk Pengembangan Sistem
1. **Pemahaman Alur Kerja yang Jelas**: Memberikan pemahaman yang jelas tentang alur kerja proses penawaran, quotation, dan pengisian data teknis.
2. **Identifikasi Interaksi Sistem**: Memetakan interaksi antara pengguna (Admin dan Pelanggan) dengan berbagai komponen sistem.
3. **Panduan Pengembangan UI/UX**: Dapat digunakan sebagai panduan untuk merancang antarmuka pengguna sesuai dengan alur kerja.
4. **Dokumentasi Proses Bisnis**: Berfungsi sebagai dokumentasi proses bisnis yang dapat digunakan untuk pelatihan staf baru.
5. **Identifikasi Kebutuhan Validasi Data**: Menunjukkan titik-titik di mana validasi data diperlukan dalam sistem.
Diagram-diagram ini dapat digunakan sebagai referensi dalam pengembangan modul penawaran, quotation, dan pengisian data teknis dalam sistem aplikasi laboratorium lingkungan.

View File

@@ -0,0 +1,117 @@
# Alur Pelayanan Laboratorium Lingkungan (Mermaid Flowchart)
Berikut adalah representasi alur pelayanan laboratorium lingkungan dalam format diagram Mermaid.
```mermaid
flowchart TD
A[Customer\nInternal & Eksternal] -->|Permintaan sampling\ndan analisis| B[Admin Lab Ling]
subgraph Proses Admin
B -->|Menyiapkan| B1[Surat Penawaran]
B -->|Menyiapkan| B2[Quotation]
B -->|Melengkapi| B3[Data Teknis Order Pelanggan]
B -->|Mencatat| B4[Bukti Pembayaran DP]
B -->|Melakukan| B5[Registrasi]
end
B -->|Perlu Sampling| C[Petugas Sampling]
B -.->|Hanya Analisis| D[Bagian Penerimaan\nContoh Uji]
subgraph Proses Sampling
C -->|Menyiapkan| C1[Rencana Sampling]
C -->|Menyiapkan| C2[Peralatan Sampling]
C -->|Melakukan| C3[Pengambilan Sampel]
end
C -->|Sampel Uji| D[Bagian Penerimaan\nContoh Uji]
subgraph Proses Penerimaan Sampel
D -->|Menerima| D1[Sampel]
D -->|Melakukan| D2[Preparasi]
end
D -->|Sampel Siap Uji| E[Bagian Analisis\nLaboratorium]
subgraph Proses Analisis
E -->|Melakukan| E1[Analisa sampel uji]
E -->|Mencatat| E2[Hasil Analisis]
end
E -->|Hasil Analisis| F[Bagian Verifikasi\nHasil Uji]
subgraph Proses Verifikasi
F -->|Verifikasi| F1[Hasil Uji]
F -->|Menyiapkan| F2[Laporan Hasil Uji]
end
F -->|Hasil Uji| B
B -->|Laporan Hasil Uji| A
classDef customer fill:#f9f,stroke:#333,stroke-width:2px
classDef admin fill:#bbf,stroke:#333,stroke-width:2px
classDef sampling fill:#dfd,stroke:#333,stroke-width:2px
classDef receiving fill:#ffd,stroke:#333,stroke-width:2px
classDef analysis fill:#dff,stroke:#333,stroke-width:2px
classDef verification fill:#fdf,stroke:#333,stroke-width:2px
class A customer
class B,B1,B2,B3,B4,B5 admin
class C,C1,C2,C3 sampling
class D,D1,D2 receiving
class E,E1,E2 analysis
class F,F1,F2 verification
```
## Penjelasan Alur Pelayanan
1. **Customer (Internal dan Eksternal)**
- Mengajukan permintaan sampling dan analisis sampel
- Menerima laporan hasil uji dari Admin Lab
2. **Admin Lab Ling**
- Menerima permintaan dari Customer
- Menyiapkan Surat Penawaran dan Quotation
- Melengkapi data teknis tentang order pelanggan
- Mencatat bukti pembayaran DP
- Melakukan registrasi permintaan
- Mengarahkan permintaan ke proses sampling (jika perlu) atau langsung ke penerimaan sampel
- Mengirimkan hasil uji ke Customer
3. **Petugas Sampling**
- Menyiapkan rencana sampling (SDM, konfirmasi jadwal, dll)
- Menyiapkan peralatan sampling yang dibutuhkan
- Melakukan pengambilan sampel di lokasi
- Mengirim sampel ke bagian penerimaan contoh uji
4. **Bagian Penerimaan Contoh Uji**
- Menerima sampel dari Petugas Sampling atau langsung dari Customer (untuk permintaan analisis saja)
- Melakukan preparasi sampel
- Mengirim sampel siap uji ke bagian analisis laboratorium
5. **Bagian Analisis Laboratorium**
- Melakukan analisa sampel uji di laboratorium sesuai jenis sampel
- Mencatat hasil analisis
- Mengirim hasil analisis ke bagian verifikasi
6. **Bagian Verifikasi Hasil Uji**
- Melakukan verifikasi hasil uji
- Menyiapkan laporan hasil uji
- Mengirim hasil uji terverifikasi ke Admin Lab
## Cara Menggunakan Diagram Mermaid
Diagram Mermaid ini dapat divisualisasikan dengan beberapa cara:
1. **GitHub**: GitHub secara native mendukung rendering diagram Mermaid dalam file Markdown.
2. **Mermaid Live Editor**: Kunjungi [Mermaid Live Editor](https://mermaid.live/) dan paste kode Mermaid di atas untuk melihat dan mengedit diagram secara interaktif.
3. **Plugin VS Code**: Gunakan plugin Mermaid untuk Visual Studio Code untuk melihat diagram secara langsung saat mengedit.
4. **Website Dengan Mermaid.js**: Tambahkan script Mermaid.js ke website Anda:
```html
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
<script>mermaid.initialize({startOnLoad:true});</script>
```
5. **Export ke Image**: Gunakan Mermaid Live Editor untuk mengekspor diagram ke format PNG, SVG, atau PDF.

View File

@@ -0,0 +1,635 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Laporan Hasil Pengukuran Intensitas Cahaya</title>
<style>
:root {
--primary-color: #1e5288;
--secondary-color: #4a8fde;
--accent-color: #f39c12;
--success-color: #27ae60;
--danger-color: #e74c3c;
--warning-color: #f1c40f;
--light-color: #f8f9fa;
--dark-color: #343a40;
--gray-color: #6c757d;
--border-color: #dee2e6;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Arial', sans-serif;
}
body {
background-color: #f5f5f5;
color: #333;
line-height: 1.6;
}
.container {
max-width: 1140px;
margin: 0 auto;
padding: 20px;
background-color: white;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 20px;
border-bottom: 2px solid var(--primary-color);
margin-bottom: 20px;
}
.logo {
display: flex;
align-items: center;
}
.logo img {
height: 80px;
margin-right: 20px;
}
.company-info {
flex-grow: 1;
}
.company-info h1 {
font-size: 24px;
color: var(--primary-color);
margin-bottom: 5px;
}
.company-info p {
font-size: 14px;
color: var(--gray-color);
margin: 0;
}
.report-title {
text-align: center;
margin: 30px 0;
}
.report-title h2 {
font-size: 22px;
text-transform: uppercase;
color: var(--primary-color);
margin-bottom: 5px;
}
.report-title p {
font-size: 16px;
color: var(--gray-color);
}
.report-meta {
display: flex;
justify-content: space-between;
margin-bottom: 30px;
background-color: var(--light-color);
padding: 15px;
border-radius: 5px;
}
.meta-section {
flex: 1;
padding: 0 10px;
}
.meta-section h3 {
font-size: 16px;
color: var(--primary-color);
margin-bottom: 10px;
border-bottom: 1px solid var(--border-color);
padding-bottom: 5px;
}
.meta-item {
display: flex;
margin-bottom: 5px;
}
.meta-item .label {
width: 140px;
font-weight: bold;
font-size: 14px;
}
.meta-item .value {
flex-grow: 1;
font-size: 14px;
}
.section {
margin-bottom: 30px;
}
.section-title {
font-size: 18px;
color: var(--primary-color);
margin-bottom: 15px;
padding-bottom: 5px;
border-bottom: 1px solid var(--border-color);
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
}
table th, table td {
padding: 12px 15px;
text-align: left;
border: 1px solid var(--border-color);
font-size: 14px;
}
table th {
background-color: var(--primary-color);
color: white;
font-weight: bold;
}
table tr:nth-child(even) {
background-color: var(--light-color);
}
.status-badge {
display: inline-block;
padding: 3px 10px;
border-radius: 3px;
font-size: 12px;
font-weight: bold;
text-align: center;
}
.status-comply {
background-color: var(--success-color);
color: white;
}
.status-not-comply {
background-color: var(--danger-color);
color: white;
}
.summary {
background-color: var(--light-color);
padding: 15px;
border-radius: 5px;
margin-bottom: 30px;
}
.summary h3 {
font-size: 16px;
color: var(--primary-color);
margin-bottom: 10px;
}
.chart-container {
display: flex;
justify-content: space-between;
margin-bottom: 30px;
}
.chart {
flex: 1;
background-color: white;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
padding: 15px;
margin: 0 10px;
border-radius: 5px;
}
.chart-placeholder {
width: 100%;
height: 250px;
background-color: var(--light-color);
display: flex;
align-items: center;
justify-content: center;
color: var(--gray-color);
font-style: italic;
}
.footer {
margin-top: 50px;
padding-top: 20px;
border-top: 1px solid var(--border-color);
display: flex;
justify-content: space-between;
}
.signature-section {
flex: 1;
padding: 0 20px;
text-align: center;
}
.signature-line {
margin: 50px 0 10px;
border-top: 1px solid var(--dark-color);
width: 80%;
margin-left: auto;
margin-right: auto;
}
.notes {
margin-top: 30px;
padding: 15px;
background-color: var(--light-color);
border-left: 4px solid var(--warning-color);
}
.notes h3 {
font-size: 16px;
color: var(--dark-color);
margin-bottom: 10px;
}
.regulatory-reference {
margin-top: 20px;
padding: 15px;
background-color: var(--light-color);
border-radius: 5px;
}
.regulatory-reference h3 {
font-size: 16px;
color: var(--primary-color);
margin-bottom: 10px;
}
.regulatory-item {
margin-bottom: 10px;
font-size: 14px;
}
.regulatory-item strong {
color: var(--primary-color);
}
@media print {
body {
background-color: white;
}
.container {
max-width: 100%;
box-shadow: none;
padding: 15px;
}
.chart-container {
page-break-inside: avoid;
}
.section {
page-break-inside: avoid;
}
}
</style>
</head>
<body>
<div class="container">
<!-- Header -->
<div class="header">
<div class="logo">
<img src="https://via.placeholder.com/150x80?text=LOGO" alt="Logo Perusahaan">
<div class="company-info">
<h1>PT. LINGKUNGAN ANALITIK</h1>
<p>Jl. Analisa No. 123, Bandung, Jawa Barat 40123</p>
<p>Telp: (022) 1234567, Email: info@lingkungan-analitik.co.id</p>
<p>Laboratorium Terakreditasi KAN LP-001-IDN</p>
</div>
</div>
<div>
<p><strong>No. Laporan:</strong> LHU/CAH/2024/001</p>
<p><strong>Tanggal Terbit:</strong> 25 Januari 2024</p>
<p><strong>Halaman:</strong> 1 dari 4</p>
</div>
</div>
<!-- Report Title -->
<div class="report-title">
<h2>Laporan Hasil Pengukuran Intensitas Cahaya</h2>
<p>Periode Pengukuran: Triwulan I 2024</p>
</div>
<!-- Report Metadata -->
<div class="report-meta">
<div class="meta-section">
<h3>Informasi Client</h3>
<div class="meta-item">
<div class="label">Nama Client:</div>
<div class="value">PT. Industri Tekstil Nusantara</div>
</div>
<div class="meta-item">
<div class="label">Alamat:</div>
<div class="value">Jl. Industri No. 123, Bandung, Jawa Barat 40123</div>
</div>
<div class="meta-item">
<div class="label">Kontak Person:</div>
<div class="value">Budi Santoso</div>
</div>
<div class="meta-item">
<div class="label">Telepon:</div>
<div class="value">08123456789</div>
</div>
</div>
<div class="meta-section">
<h3>Informasi Sampling</h3>
<div class="meta-item">
<div class="label">Tanggal Sampling:</div>
<div class="value">20 Januari 2024</div>
</div>
<div class="meta-item">
<div class="label">Waktu Sampling:</div>
<div class="value">09:00 - 14:00 WIB</div>
</div>
<div class="meta-item">
<div class="label">Petugas Sampling:</div>
<div class="value">Budi Santoso (EMP003)</div>
</div>
<div class="meta-item">
<div class="label">Metode Sampling:</div>
<div class="value">MS-CAHAYA-01 (SNI 16-7062-2004)</div>
</div>
</div>
</div>
<!-- Summary Section -->
<div class="summary">
<h3>Ringkasan Hasil</h3>
<p>Berdasarkan hasil pengukuran intensitas cahaya yang dilakukan pada 5 lokasi di PT. Industri Tekstil Nusantara pada tanggal 20 Januari 2024, diperoleh hasil bahwa seluruh titik pengukuran (100%) memenuhi baku mutu yang dipersyaratkan sesuai dengan Permenaker No.5 Tahun 2018 dan PMK RI No.2 Tahun 2023.</p>
</div>
<!-- Measurement Results -->
<div class="section">
<h3 class="section-title">1. Hasil Pengukuran Intensitas Cahaya</h3>
<table>
<thead>
<tr>
<th>No</th>
<th>Lokasi</th>
<th>Titik Pengukuran</th>
<th>Hasil (Lux)</th>
<th>Baku Mutu (Lux)</th>
<th>Keterangan</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Area Kerja Produksi</td>
<td>Titik 1 (Depan)</td>
<td>325.50</td>
<td>200</td>
<td>Permenaker No.5/2018 (Pekerjaan Sedang)</td>
<td><span class="status-badge status-comply">Memenuhi</span></td>
</tr>
<tr>
<td>2</td>
<td>Area Kerja Produksi</td>
<td>Titik 2 (Tengah)</td>
<td>310.20</td>
<td>200</td>
<td>Permenaker No.5/2018 (Pekerjaan Sedang)</td>
<td><span class="status-badge status-comply">Memenuhi</span></td>
</tr>
<tr>
<td>3</td>
<td>Area Kerja Produksi</td>
<td>Titik 3 (Belakang)</td>
<td>290.80</td>
<td>200</td>
<td>Permenaker No.5/2018 (Pekerjaan Sedang)</td>
<td><span class="status-badge status-comply">Memenuhi</span></td>
</tr>
<tr>
<td>4</td>
<td>Area IPAL</td>
<td>Titik 1 (Pintu Masuk)</td>
<td>180.40</td>
<td>100</td>
<td>Permenaker No.5/2018 (Pekerjaan Kasar)</td>
<td><span class="status-badge status-comply">Memenuhi</span></td>
</tr>
<tr>
<td>5</td>
<td>Area IPAL</td>
<td>Titik 2 (Area Kontrol)</td>
<td>165.30</td>
<td>100</td>
<td>Permenaker No.5/2018 (Pekerjaan Kasar)</td>
<td><span class="status-badge status-comply">Memenuhi</span></td>
</tr>
<tr>
<td>6</td>
<td>Ruang Administrasi</td>
<td>Meja Kerja Utama</td>
<td>350.20</td>
<td>300</td>
<td>PMK RI No.2/2023 (Ruang Kerja Perkantoran)</td>
<td><span class="status-badge status-comply">Memenuhi</span></td>
</tr>
<tr>
<td>7</td>
<td>Ruang Desain Produk</td>
<td>Meja Kerja Utama</td>
<td>520.40</td>
<td>500</td>
<td>PMK RI No.2/2023 (Ruang Komputer)</td>
<td><span class="status-badge status-comply">Memenuhi</span></td>
</tr>
<tr>
<td>8</td>
<td>Laboratorium QC</td>
<td>Area Inspeksi Produk</td>
<td>540.80</td>
<td>500</td>
<td>PMK RI No.2/2023 (Ruang Laboratorium)</td>
<td><span class="status-badge status-comply">Memenuhi</span></td>
</tr>
</tbody>
</table>
</div>
<!-- Luminance Results -->
<div class="section">
<h3 class="section-title">2. Hasil Pengukuran Luminansi</h3>
<table>
<thead>
<tr>
<th>No</th>
<th>Lokasi</th>
<th>Titik Pengukuran</th>
<th>Hasil (cd/m²)</th>
<th>Baku Mutu (cd/m²)</th>
<th>Keterangan</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Ruang Desain Produk</td>
<td>Layar Monitor 1</td>
<td>120.50</td>
<td>5000</td>
<td>Permenaker No.5/2018 (Luminansi Maksimum)</td>
<td><span class="status-badge status-comply">Memenuhi</span></td>
</tr>
</tbody>
</table>
</div>
<!-- Chart Section -->
<div class="section">
<h3 class="section-title">3. Visualisasi Data</h3>
<div class="chart-container">
<div class="chart">
<h4>Perbandingan Intensitas Cahaya Terhadap Baku Mutu</h4>
<div class="chart-placeholder">
[Grafik Intensitas Cahaya - Bar Chart]
</div>
</div>
<div class="chart">
<h4>Distribusi Intensitas Cahaya Per Area</h4>
<div class="chart-placeholder">
[Grafik Distribusi - Pie Chart]
</div>
</div>
</div>
</div>
<!-- Instruments Information -->
<div class="section">
<h3 class="section-title">4. Informasi Peralatan Pengukuran</h3>
<table>
<thead>
<tr>
<th>Nama Peralatan</th>
<th>Kode Alat</th>
<th>Merk/Model</th>
<th>No. Seri</th>
<th>Tanggal Kalibrasi</th>
<th>Kalibrasi Berikutnya</th>
</tr>
</thead>
<tbody>
<tr>
<td>Lux Meter Digital</td>
<td>LUX001</td>
<td>Testo 540</td>
<td>TS5401234</td>
<td>15 November 2023</td>
<td>13 Mei 2024</td>
</tr>
<tr>
<td>Lux Meter Digital</td>
<td>LUX002</td>
<td>Konica Minolta T-10A</td>
<td>KM10A5678</td>
<td>20 Agustus 2023</td>
<td>16 Februari 2024</td>
</tr>
<tr>
<td>Luminance Meter</td>
<td>LUM003</td>
<td>Konica Minolta LS-150</td>
<td>KM1501234</td>
<td>10 Agustus 2023</td>
<td>6 Februari 2024</td>
</tr>
</tbody>
</table>
</div>
<!-- Conditions & Notes -->
<div class="section">
<h3 class="section-title">5. Kondisi Pengukuran</h3>
<table>
<tbody>
<tr>
<td><strong>Kondisi Cuaca</strong></td>
<td>Cerah</td>
</tr>
<tr>
<td><strong>Suhu Lingkungan</strong></td>
<td>28.5°C</td>
</tr>
<tr>
<td><strong>Kelembaban Relatif</strong></td>
<td>65%</td>
</tr>
<tr>
<td><strong>Sumber Cahaya</strong></td>
<td>Lampu fluorescent (area produksi, administrasi), Lampu LED (area IPAL), Kombinasi cahaya alami dan buatan (area kantor)</td>
</tr>
<tr>
<td><strong>Kondisi Operasional</strong></td>
<td>Pengukuran dilakukan saat aktivitas produksi dan operasional normal</td>
</tr>
</tbody>
</table>
</div>
<!-- Regulatory References -->
<div class="regulatory-reference">
<h3>Referensi Baku Mutu</h3>
<div class="regulatory-item">
<strong>1. PMK RI No.2 Tahun 2023</strong> tentang Standar Baku Mutu Kesehatan Lingkungan dan Persyaratan Kesehatan
</div>
<div class="regulatory-item">
<strong>2. Permenaker No.5 Tahun 2018</strong> tentang Keselamatan dan Kesehatan Kerja Lingkungan Kerja
</div>
</div>
<!-- Notes -->
<div class="notes">
<h3>Catatan:</h3>
<ol>
<li>Hasil pengukuran hanya berlaku untuk lokasi dan waktu saat pengukuran dilakukan.</li>
<li>Laporan hasil pengukuran tidak boleh digandakan kecuali secara lengkap dan dengan izin tertulis dari laboratorium.</li>
<li>Pengukuran dilakukan sesuai dengan metode standar SNI 16-7062-2004 tentang Pengukuran Intensitas Cahaya di Tempat Kerja.</li>
<li>Ketidakpastian pengukuran intensitas cahaya: ± 3% dari nilai hasil pengukuran.</li>
</ol>
</div>
<!-- Footer & Signatures -->
<div class="footer">
<div class="signature-section">
<p>Petugas Pengukuran</p>
<div class="signature-line"></div>
<p><strong>Budi Santoso</strong></p>
<p>Field Technician</p>
<p>NIP. EMP003</p>
</div>
<div class="signature-section">
<p>Analis</p>
<div class="signature-line"></div>
<p><strong>Nita Anggraini</strong></p>
<p>Analyst</p>
<p>NIP. EMP010</p>
</div>
<div class="signature-section">
<p>Menyetujui</p>
<div class="signature-line"></div>
<p><strong>Siti Aminah</strong></p>
<p>Sampling Team Leader</p>
<p>NIP. EMP002</p>
</div>
</div>
</div>
</body>
</html>

522
masterdata.txt Normal file
View File

@@ -0,0 +1,522 @@
CREATE TABLE master_parameters (
parameter_id INT PRIMARY KEY AUTO_INCREMENT,
parameter_code VARCHAR(20) NOT NULL,
parameter_name VARCHAR(100) NOT NULL,
parameter_group VARCHAR(50), -- misalnya: fisika, kimia, mikrobiologi, logam berat
standard_method VARCHAR(100), -- metode analisis sesuai SNI atau standard lain
unit VARCHAR(20), -- satuan parameter (mg/L, cfu/100mL, dsb)
price DECIMAL(12, 2), -- harga analisis per parameter
instrumentation VARCHAR(100), -- peralatan analisis yang diperlukan
mdl DECIMAL(12, 6), -- Method Detection Limit
container_type VARCHAR(50), -- jenis wadah (HDPE, kaca, dsb)
preservation VARCHAR(200), -- metode preservasi
holding_time VARCHAR(50), -- waktu simpan maksimum
remarks TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE master_equipment (
equipment_id INT PRIMARY KEY AUTO_INCREMENT,
equipment_code VARCHAR(20) NOT NULL,
equipment_name VARCHAR(100) NOT NULL,
equipment_type VARCHAR(50) NOT NULL, -- sampling, pengukuran lapangan, preservasi, dll
specifications TEXT,
brand VARCHAR(100),
model VARCHAR(100),
serial_number VARCHAR(100),
purchase_date DATE,
calibration_interval INT, -- interval kalibrasi dalam hari
last_calibration_date DATE,
next_calibration_date DATE,
status VARCHAR(20), -- available, in use, maintenance, retired
location VARCHAR(100), -- lokasi penyimpanan
remarks TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE master_personnel (
personnel_id INT PRIMARY KEY AUTO_INCREMENT,
employee_code VARCHAR(20) NOT NULL,
name VARCHAR(100) NOT NULL,
position VARCHAR(50),
department VARCHAR(50),
specialization VARCHAR(100), -- bidang keahlian/spesialisasi
certifications TEXT, -- sertifikasi yang dimiliki
contact_number VARCHAR(20),
email VARCHAR(100),
join_date DATE,
qualification TEXT, -- kualifikasi/pendidikan
status VARCHAR(20), -- active, inactive
remarks TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE master_clients (
client_id INT PRIMARY KEY AUTO_INCREMENT,
client_code VARCHAR(20) NOT NULL,
client_name VARCHAR(200) NOT NULL,
client_type VARCHAR(50), -- industry, government, private, etc
industry_sector VARCHAR(100),
address TEXT,
city VARCHAR(100),
province VARCHAR(100),
postal_code VARCHAR(20),
main_contact_person VARCHAR(100),
contact_position VARCHAR(100),
contact_phone VARCHAR(20),
contact_email VARCHAR(100),
tax_id VARCHAR(50), -- NPWP
payment_terms VARCHAR(50),
discount_rate DECIMAL(5, 2),
credit_limit DECIMAL(15, 2),
status VARCHAR(20), -- active, inactive
remarks TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE master_sampling_locations (
location_id INT PRIMARY KEY AUTO_INCREMENT,
location_code VARCHAR(20) NOT NULL,
location_name VARCHAR(200) NOT NULL,
client_id INT,
location_type VARCHAR(50), -- outlet, inlet, sungai, danau, sumur, dsb
address TEXT,
coordinates POINT, -- koordinat GPS (latitude, longitude)
elevation DECIMAL(10, 2), -- elevasi dalam meter
description TEXT,
access_information TEXT,
sampling_point_details TEXT,
remarks TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (client_id) REFERENCES master_clients(client_id)
);
CREATE TABLE master_sampling_methods (
method_id INT PRIMARY KEY AUTO_INCREMENT,
method_code VARCHAR(20) NOT NULL,
method_name VARCHAR(100) NOT NULL,
standard_reference VARCHAR(100), -- referensi standar (SNI, APHA, EPA, dsb)
applicable_matrix VARCHAR(50), -- air, tanah, udara, dsb
method_description TEXT,
equipment_needed TEXT,
procedure_summary TEXT,
qc_requirements TEXT, -- persyaratan quality control
limitations TEXT,
remarks TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE master_preservation_methods (
preservation_id INT PRIMARY KEY AUTO_INCREMENT,
preservation_code VARCHAR(20) NOT NULL,
preservation_name VARCHAR(100) NOT NULL,
chemical_used VARCHAR(100),
applicable_parameters TEXT, -- parameter yang menggunakan metode preservasi ini
procedure TEXT,
storage_condition VARCHAR(100),
holding_time VARCHAR(50),
safety_precautions TEXT,
remarks TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE master_sample_containers (
container_id INT PRIMARY KEY AUTO_INCREMENT,
container_code VARCHAR(20) NOT NULL,
container_name VARCHAR(100) NOT NULL,
material VARCHAR(50), -- HDPE, glass, amber glass, dsb
capacity VARCHAR(20), -- misalnya: 250mL, 1L
cap_type VARCHAR(50), -- jenis tutup
sterilization VARCHAR(50), -- metode sterilisasi jika perlu
applicable_parameters TEXT, -- parameter yang menggunakan wadah ini
washing_procedure TEXT, -- prosedur pencucian wadah
storage_requirements TEXT,
remarks TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE master_regulations (
regulation_id INT PRIMARY KEY AUTO_INCREMENT,
regulation_code VARCHAR(20) NOT NULL,
regulation_name VARCHAR(200) NOT NULL,
issuing_authority VARCHAR(100), -- instansi yang mengeluarkan regulasi
regulation_type VARCHAR(50), -- Peraturan Menteri, Peraturan Pemerintah, dsb
issue_date DATE,
effective_date DATE,
applicable_sector VARCHAR(100), -- sektor yang diregulasi
scope TEXT,
summary TEXT,
file_path VARCHAR(255), -- path ke file dokumen regulasi
remarks TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE master_quality_standards (
standard_id INT PRIMARY KEY AUTO_INCREMENT,
standard_code VARCHAR(20) NOT NULL,
standard_name VARCHAR(200) NOT NULL,
regulation_id INT,
matrix_type VARCHAR(50), -- air limbah, air sungai, air tanah, dsb
industry_type VARCHAR(100), -- tipe industri (jika spesifik)
parameter_id INT,
min_value DECIMAL(12, 6),
max_value DECIMAL(12, 6),
unit VARCHAR(20),
remarks TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (regulation_id) REFERENCES master_regulations(regulation_id),
FOREIGN KEY (parameter_id) REFERENCES master_parameters(parameter_id)
);
CREATE TABLE parameter_method_mapping (
mapping_id INT PRIMARY KEY AUTO_INCREMENT,
parameter_id INT,
method_id INT,
container_id INT,
preservation_id INT,
is_default BOOLEAN DEFAULT FALSE, -- metode default untuk parameter
remarks TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (parameter_id) REFERENCES master_parameters(parameter_id),
FOREIGN KEY (method_id) REFERENCES master_sampling_methods(method_id),
FOREIGN KEY (container_id) REFERENCES master_sample_containers(container_id),
FOREIGN KEY (preservation_id) REFERENCES master_preservation_methods(preservation_id)
);
CREATE TABLE sampling_plans (
plan_id INT PRIMARY KEY AUTO_INCREMENT,
plan_code VARCHAR(30) NOT NULL,
project_name VARCHAR(200) NOT NULL,
client_id INT,
contact_person_id INT,
request_date DATETIME,
planned_sampling_date DATE,
status VARCHAR(20), -- draft, submitted, approved, completed, cancelled
created_by INT,
approved_by INT,
approval_date DATETIME,
total_locations INT,
total_parameters INT,
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (client_id) REFERENCES master_clients(client_id),
FOREIGN KEY (created_by) REFERENCES master_personnel(personnel_id),
FOREIGN KEY (approved_by) REFERENCES master_personnel(personnel_id)
);
CREATE TABLE sampling_plan_locations (
plan_location_id INT PRIMARY KEY AUTO_INCREMENT,
plan_id INT,
location_id INT,
sampling_date DATE,
sampling_time TIME,
sampling_method_id INT,
sampling_personnel_id INT,
field_parameters TEXT, -- parameter yang diukur di lapangan
special_instructions TEXT,
status VARCHAR(20), -- planned, sampled, failed
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (plan_id) REFERENCES sampling_plans(plan_id),
FOREIGN KEY (location_id) REFERENCES master_sampling_locations(location_id),
FOREIGN KEY (sampling_method_id) REFERENCES master_sampling_methods(method_id),
FOREIGN KEY (sampling_personnel_id) REFERENCES master_personnel(personnel_id)
);
CREATE TABLE sampling_plan_parameters (
plan_parameter_id INT PRIMARY KEY AUTO_INCREMENT,
plan_id INT,
plan_location_id INT,
parameter_id INT,
container_id INT,
preservation_id INT,
quantity INT DEFAULT 1,
unit_price DECIMAL(12, 2),
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (plan_id) REFERENCES sampling_plans(plan_id),
FOREIGN KEY (plan_location_id) REFERENCES sampling_plan_locations(plan_location_id),
FOREIGN KEY (parameter_id) REFERENCES master_parameters(parameter_id),
FOREIGN KEY (container_id) REFERENCES master_sample_containers(container_id),
FOREIGN KEY (preservation_id) REFERENCES master_preservation_methods(preservation_id)
);
CREATE TABLE equipment_requisitions (
requisition_id INT PRIMARY KEY AUTO_INCREMENT,
requisition_code VARCHAR(30) NOT NULL,
plan_id INT,
requisition_date DATETIME,
requested_by INT,
approved_by INT,
approval_date DATETIME,
sampling_date DATE,
return_date DATE,
status VARCHAR(20), -- draft, submitted, approved, issued, returned
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (plan_id) REFERENCES sampling_plans(plan_id),
FOREIGN KEY (requested_by) REFERENCES master_personnel(personnel_id),
FOREIGN KEY (approved_by) REFERENCES master_personnel(personnel_id)
);
CREATE TABLE equipment_requisition_items (
requisition_item_id INT PRIMARY KEY AUTO_INCREMENT,
requisition_id INT,
equipment_id INT,
quantity INT,
issued_quantity INT,
issued_by INT,
issued_date DATETIME,
returned_quantity INT,
returned_condition VARCHAR(50), -- good, damaged, lost
returned_date DATETIME,
verified_by INT,
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (requisition_id) REFERENCES equipment_requisitions(requisition_id),
FOREIGN KEY (equipment_id) REFERENCES master_equipment(equipment_id),
FOREIGN KEY (issued_by) REFERENCES master_personnel(personnel_id),
FOREIGN KEY (verified_by) REFERENCES master_personnel(personnel_id)
);
CREATE TABLE samples (
sample_id INT PRIMARY KEY AUTO_INCREMENT,
sample_code VARCHAR(50) NOT NULL,
plan_id INT,
plan_location_id INT,
sampling_date DATE,
sampling_time TIME,
sampler_id INT,
preservation_time DATETIME,
temperature DECIMAL(5, 2), -- suhu sampel saat pengambilan
weather_condition VARCHAR(50),
field_ph DECIMAL(5, 2),
field_do DECIMAL(5, 2),
field_conductivity DECIMAL(10, 2),
field_turbidity DECIMAL(10, 2),
sample_matrix VARCHAR(50), -- air, tanah, sedimen, dsb
sample_source VARCHAR(100),
container_id INT,
preservation_id INT,
received_by INT,
received_date DATETIME,
received_condition VARCHAR(50), -- good, compromised, rejected
storage_location VARCHAR(100),
remarks TEXT,
status VARCHAR(20), -- collected, in transit, received, in analysis, reported
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (plan_id) REFERENCES sampling_plans(plan_id),
FOREIGN KEY (plan_location_id) REFERENCES sampling_plan_locations(plan_location_id),
FOREIGN KEY (sampler_id) REFERENCES master_personnel(personnel_id),
FOREIGN KEY (container_id) REFERENCES master_sample_containers(container_id),
FOREIGN KEY (preservation_id) REFERENCES master_preservation_methods(preservation_id),
FOREIGN KEY (received_by) REFERENCES master_personnel(personnel_id)
);
CREATE TABLE measurement_results_light (
result_id INT PRIMARY KEY AUTO_INCREMENT,
sample_id INT,
measurement_date DATE,
measurement_time TIME,
parameter_id INT,
measurement_value DECIMAL(10, 2),
measurement_unit VARCHAR(20),
measurement_point VARCHAR(50),
weather_condition VARCHAR(50),
light_source VARCHAR(100),
ambient_condition VARCHAR(200),
standard_id INT,
is_compliant BOOLEAN,
analyst_id INT,
verified_by INT,
verification_date DATETIME,
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (sample_id) REFERENCES samples(sample_id),
FOREIGN KEY (parameter_id) REFERENCES master_parameters(parameter_id),
FOREIGN KEY (standard_id) REFERENCES master_quality_standards(standard_id),
FOREIGN KEY (analyst_id) REFERENCES master_personnel(personnel_id),
FOREIGN KEY (verified_by) REFERENCES master_personnel(personnel_id)
);
INSERT INTO master_parameters (parameter_id, parameter_code, parameter_name, parameter_group, standard_method, unit, price, instrumentation, mdl, container_type, preservation, holding_time, remarks, is_active) VALUES
(1, 'pH', 'pH', 'Fisika', 'SNI 06-6989.11-2019', 'unit', 50000.00, 'pH meter', 0.01, 'HDPE/Glass', 'Analisis segera', '15 menit (lapangan) / 24 jam', 'Parameter lapangan, prioritas analisis', TRUE),
(2, 'TSS', 'Total Suspended Solid', 'Fisika', 'SNI 06-6989.3-2019', 'mg/L', 75000.00, 'Analytical Balance, Oven', 1.00, 'HDPE/Glass', 'Pendinginan 4°C', '7 hari', NULL, TRUE),
(3, 'COD', 'Chemical Oxygen Demand', 'Kimia', 'SNI 6989.73:2019', 'mg/L', 125000.00, 'COD Reactor, Spektrofotometer', 5.00, 'Glass', 'H₂SO₄ hingga pH<2, pendinginan 4°C', '28 hari', NULL, TRUE),
(4, 'BOD', 'Biological Oxygen Demand', 'Kimia', 'SNI 6989.72:2009', 'mg/L', 150000.00, 'DO meter, BOD Incubator', 2.00, 'Glass', 'Pendinginan 4°C', '48 jam', 'Memerlukan inkubasi 5 hari', TRUE),
(5, 'DO', 'Dissolved Oxygen', 'Kimia', 'SNI 06-6989.14-2004', 'mg/L', 80000.00, 'DO meter', 0.10, 'Glass BOD bottle', 'Analisis segera/fiksasi di lapangan', '8 jam setelah fiksasi', 'Parameter lapangan, prioritas analisis', TRUE),
(6, 'NH3-N', 'Ammonia Nitrogen', 'Kimia', 'SNI 06-6989.30-2005', 'mg/L', 100000.00, 'Spektrofotometer UV-Vis', 0.01, 'HDPE/Glass', 'H₂SO₄ hingga pH<2, pendinginan 4°C', '28 hari', NULL, TRUE),
(7, 'NO3-N', 'Nitrate Nitrogen', 'Kimia', 'SNI 6989.79:2011', 'mg/L', 100000.00, 'Spektrofotometer UV-Vis', 0.01, 'HDPE/Glass', 'Pendinginan 4°C', '48 jam', NULL, TRUE),
(8, 'Pb', 'Timbal', 'Logam Berat', 'SNI 6989.8:2009', 'mg/L', 200000.00, 'AAS/ICP-MS', 0.01, 'HDPE/Glass', 'HNO₃ hingga pH<2', '6 bulan', 'Memerlukan digestion sebelum analisis', TRUE),
(9, 'Cd', 'Kadmium', 'Logam Berat', 'SNI 6989.16:2009', 'mg/L', 200000.00, 'AAS/ICP-MS', 0.005, 'HDPE/Glass', 'HNO₃ hingga pH<2', '6 bulan', 'Memerlukan digestion sebelum analisis', TRUE),
(10, 'Hg', 'Merkuri', 'Logam Berat', 'SNI 6989.78:2011', 'mg/L', 250000.00, 'Mercury Analyzer', 0.0005, 'Glass', 'HNO₃ hingga pH<2, pendinginan 4°C', '28 hari', 'Menggunakan wadah khusus bebas kontaminasi', TRUE),
(11, 'MBAS', 'Surfaktan Anionik', 'Kimia', 'SNI 06-6989.51-2005', 'mg/L', 150000.00, 'Spektrofotometer UV-Vis', 0.05, 'Glass', 'Pendinginan 4°C', '48 jam', NULL, TRUE),
(12, 'OG', 'Minyak & Lemak', 'Kimia', 'SNI 6989.10:2011', 'mg/L', 175000.00, 'Analytical Balance, Oven', 1.00, 'Glass', 'H₂SO₄ hingga pH<2, pendinginan 4°C', '28 hari', 'Hindari kontak dengan plastik', TRUE),
(13, 'TCOLI', 'Total Coliform', 'Mikrobiologi', 'SNI 01-2332.1-2006', 'MPN/100mL', 175000.00, 'Incubator, Laminar Flow', 1.80, 'Sterile Glass/Plastic', 'Na₂S₂O₃, pendinginan 4°C', '6 jam', 'Wadah steril, sampling aseptik', TRUE),
(14, 'ECOLI', 'Escherichia coli', 'Mikrobiologi', 'SNI 2897:2008', 'MPN/100mL', 200000.00, 'Incubator, Laminar Flow', 1.80, 'Sterile Glass/Plastic', 'Na₂S₂O₃, pendinginan 4°C', '6 jam', 'Wadah steril, sampling aseptik', TRUE),
(15, 'PO4', 'Fosfat', 'Kimia', 'SNI 06-6989.31-2005', 'mg/L', 110000.00, 'Spektrofotometer UV-Vis', 0.01, 'HDPE/Glass', 'Pendinginan 4°C', '48 jam', NULL, TRUE),
(16, 'CAHAYA', 'Intensitas Cahaya', 'Fisika', 'SNI 16-7062-2004', 'Lux', 75000.00, 'Lux meter', 1.00, 'N/A', 'Pengukuran langsung di lapangan', 'N/A', 'Parameter fisika untuk lingkungan dan ruang kerja', TRUE),
(17, 'LUMI', 'Luminansi', 'Fisika', 'IES LM-79-08', 'cd/m²', 85000.00, 'Luminance meter', 0.10, 'N/A', 'Pengukuran langsung di lapangan', 'N/A', 'Parameter untuk pengukuran kecerahan permukaan', TRUE),
(18, 'SILAU', 'Kesilauan', 'Fisika', 'CIE 112-1994', 'UGR', 90000.00, 'Glare meter', 1.00, 'N/A', 'Pengukuran langsung di lapangan', 'N/A', 'Pengukuran untuk menilai tingkat silau di ruang kerja', TRUE),
(19, 'CFLUKS', 'Fluks Cahaya', 'Fisika', 'IES LM-79-08', 'Lumen', 95000.00, 'Integrating Sphere', 10.00, 'N/A', 'Pengukuran langsung di lapangan', 'N/A', 'Parameter untuk mengukur total output cahaya dari sumber', TRUE);
INSERT INTO master_equipment (equipment_id, equipment_code, equipment_name, equipment_type, specifications, brand, model, serial_number, purchase_date, calibration_interval, last_calibration_date, next_calibration_date, status, location, remarks, is_active) VALUES
(1, 'MULTIP001', 'Multiparameter Water Quality Meter', 'Field Measurement', 'Parameter: pH, DO, Conductivity, Temperature, Turbidity', 'YSI', 'ProDSS', 'YS19K12345', '2023-01-15', 180, '2023-12-10', '2024-06-08', 'available', 'Equipment Room A', 'Alat utama untuk pengukuran lapangan', TRUE),
(2, 'pH002', 'pH Meter Portable', 'Field Measurement', 'Range: 0-14, Resolution: 0.01, Accuracy: ±0.02', 'Hanna', 'HI98191', 'HI12345678', '2023-03-20', 90, '2024-01-05', '2024-04-04', 'available', 'Equipment Room A', 'Backup untuk pengukuran pH lapangan', TRUE),
(3, 'DO003', 'DO Meter Portable', 'Field Measurement', 'Range: 0-50 mg/L, Resolution: 0.01 mg/L', 'Lutron', 'DO-5519', 'LT5519876', '2022-11-10', 90, '2024-01-10', '2024-04-09', 'in use', 'Field Team B', NULL, TRUE),
(4, 'VDS004', 'Van Dorn Water Sampler', 'Sampling', 'Horizontal, 2.2L capacity, PVC material', 'Wildco', 'Alpha', 'WC1234567', '2023-02-18', 365, '2023-02-18', '2024-02-18', 'available', 'Equipment Room B', NULL, TRUE),
(5, 'VDS005', 'Van Dorn Water Sampler', 'Sampling', 'Horizontal, 4.2L capacity, PVC material', 'Wildco', 'Beta', 'WC8765432', '2023-02-18', 365, '2023-02-18', '2024-02-18', 'maintenance', 'Maintenance Room', 'Sedang perbaikan tali', TRUE),
(6, 'PER006', 'Peristaltic Pump', 'Sampling', 'Flow rate: 50-500 mL/min, Silicon tubing', 'Masterflex', 'L/S', 'MF987654', '2022-08-25', 180, '2023-08-25', '2024-02-21', 'available', 'Equipment Room B', NULL, TRUE),
(7, 'TSP007', 'Telescopic Sampling Pole', 'Sampling', 'Extendable 2-5m, Aluminum', 'In-house', 'Custom', 'N/A', '2023-05-10', 365, '2023-05-10', '2024-05-09', 'available', 'Equipment Room B', NULL, TRUE),
(8, 'COL008', 'Cooler Box (Large)', 'Transport', '50L capacity, Insulated, with ice pack slots', 'Coleman', 'Xtreme', 'N/A', '2023-04-12', 0, NULL, NULL, 'available', 'Equipment Room B', NULL, TRUE),
(9, 'COL009', 'Cooler Box (Medium)', 'Transport', '25L capacity, Insulated, with ice pack slots', 'Coleman', 'Xtreme', 'N/A', '2023-04-12', 0, NULL, NULL, 'in use', 'Field Team A', NULL, TRUE),
(10, 'GPS010', 'GPS Device', 'Field Measurement', 'Accuracy: 3m, Waterproof IPX7', 'Garmin', 'GPSMAP 65s', 'GM98765432', '2023-01-30', 365, '2023-01-30', '2024-01-30', 'available', 'Equipment Room A', NULL, TRUE),
(11, 'TUR011', 'Turbidity Meter', 'Field Measurement', 'Range: 0-1000 NTU, Accuracy: ±2%', 'Hach', '2100Q', 'HC2100123', '2022-10-15', 180, '2023-10-15', '2024-04-13', 'available', 'Equipment Room A', NULL, TRUE),
(12, 'FMT012', 'Flow Meter', 'Field Measurement', 'Range: 0.1-5 m/s, Digital display', 'Global Water', 'FP111', 'GW123456', '2023-06-20', 180, '2023-12-20', '2024-06-18', 'in use', 'Field Team C', NULL, TRUE),
(13, 'CAM013', 'Digital Camera', 'Documentation', 'Waterproof, 20MP, GPS tagging', 'Olympus', 'Tough TG-6', 'OL987654', '2023-03-15', 0, NULL, NULL, 'available', 'Equipment Room A', NULL, TRUE),
(14, 'SAU014', 'Soil Auger', 'Sampling', 'Hand-operated, 50cm depth', 'AMS', 'Standard', 'AMS12345', '2023-02-10', 0, NULL, NULL, 'available', 'Equipment Room C', NULL, TRUE),
(15, 'SGS015', 'Sediment Grab Sampler', 'Sampling', 'Petite Ponar type, Stainless steel', 'Wildco', 'Ponar', 'WC456789', '2023-02-18', 365, '2023-02-18', '2024-02-18', 'available', 'Equipment Room C', NULL, TRUE),
(16, 'LUX001', 'Lux Meter Digital', 'Field Measurement', 'Range: 0-200,000 lux, Resolution: 0.1 lux, Accuracy: ±3%', 'Testo', '540', 'TS5401234', '2023-05-15', 180, '2023-11-15', '2024-05-13', 'available', 'Equipment Room A', NULL, TRUE),
(17, 'LUX002', 'Lux Meter Digital', 'Field Measurement', 'Range: 0-100,000 lux, Resolution: 0.1 lux, Accuracy: ±2%', 'Konica Minolta', 'T-10A', 'KM10A5678', '2022-08-20', 180, '2023-08-20', '2024-02-16', 'available', 'Equipment Room A', NULL, TRUE),
(18, 'LUM003', 'Luminance Meter', 'Field Measurement', 'Range: 0.01-999,900 cd/m², Accuracy: ±2%', 'Konica Minolta', 'LS-150', 'KM1501234', '2023-02-10', 180, '2023-08-10', '2024-02-06', 'available', 'Equipment Room A', 'Untuk pengukuran kecerahan permukaan', TRUE),
(19, 'GLARE004', 'Glare Meter', 'Field Measurement', 'Range: UGR 5-40, Accuracy: ±1 UGR', 'GL Optic', 'GL Spectis 1.0 T Flicker', 'GL12345', '2023-01-25', 180, '2023-07-25', '2024-01-21', 'in use', 'Field Team A', 'Untuk pengukuran tingkat silau', TRUE),
(20, 'GRID005', 'Grid Mapping Kit', 'Sampling', 'Grid markers, Measuring tape, Laser distance meter', 'In-house', 'Custom', 'N/A', '2023-03-15', 0, NULL, NULL, 'available', 'Equipment Room B', 'Peralatan penunjang untuk mapping titik sampling', TRUE);
INSERT INTO master_personnel (personnel_id, employee_code, name, position, department, specialization, certifications, contact_number, email, join_date, qualification, status, remarks, is_active) VALUES
(1, 'EMP001', 'Ahmad Ramadhan', 'Lab Manager', 'Laboratory', 'Environmental Analysis', 'KAN Lead Assessor, ISO 17025 Internal Auditor', '081234567890', 'ahmad@lab-env.co.id', '2015-03-10', 'M.Sc. Environmental Chemistry', 'active', NULL, TRUE),
(2, 'EMP002', 'Siti Aminah', 'Sampling Team Leader', 'Field Operations', 'Water Quality Sampling', 'Certified Environmental Sampler, First Aid', '082345678901', 'siti@lab-env.co.id', '2017-06-15', 'B.Sc. Environmental Science', 'active', NULL, TRUE),
(3, 'EMP003', 'Budi Santoso', 'Field Technician', 'Field Operations', 'Water & Soil Sampling', 'Certified Environmental Sampler', '083456789012', 'budi@lab-env.co.id', '2019-01-10', 'Diploma in Environmental Technology', 'active', NULL, TRUE),
(4, 'EMP004', 'Dini Wijaya', 'Admin Lab', 'Administration', 'Customer Service, Documentation', 'ISO 9001 Documentation', '084567890123', 'dini@lab-env.co.id', '2020-02-15', 'B.A. Business Administration', 'active', NULL, TRUE),
(5, 'EMP005', 'Faisal Rahman', 'Senior Analyst', 'Laboratory', 'Chemical Analysis', 'AAS Specialist, GC-MS Operator', '085678901234', 'faisal@lab-env.co.id', '2016-08-20', 'M.Sc. Analytical Chemistry', 'active', NULL, TRUE),
(6, 'EMP006', 'Eva Susanti', 'Microbiologist', 'Laboratory', 'Microbiological Analysis', 'Food Safety Microbiology', '086789012345', 'eva@lab-env.co.id', '2018-11-05', 'B.Sc. Microbiology', 'active', NULL, TRUE),
(7, 'EMP007', 'Dedi Kurniawan', 'Field Technician', 'Field Operations', 'Air Quality Sampling', 'Air Quality Monitoring, Stack Sampling', '087890123456', 'dedi@lab-env.co.id', '2021-03-15', 'B.Sc. Environmental Engineering', 'active', NULL, TRUE),
(8, 'EMP008', 'Yanti Susilo', 'QA/QC Officer', 'Quality Assurance', 'Quality Management System', 'ISO 17025 Lead Assessor, ISO 9001 Lead Auditor', '088901234567', 'yanti@lab-env.co.id', '2017-07-10', 'M.Sc. Quality Management', 'active', NULL, TRUE),
(9, 'EMP009', 'Hendra Gunawan', 'Field Technician', 'Field Operations', 'Water & Soil Sampling', 'Water Quality Sampling', '089012345678', 'hendra@lab-env.co.id', '2022-01-10', 'Diploma in Environmental Technology', 'active', NULL, TRUE),
(10, 'EMP010', 'Nita Anggraini', 'Analyst', 'Laboratory', 'Chemical Analysis', 'HPLC Operator', '081122334455', 'nita@lab-env.co.id', '2022-05-10', 'B.Sc. Chemistry', 'active', NULL, TRUE),
(11, 'EMP011', 'Rudi Hartono', 'IT Support', 'IT', 'LIMS, Network Management', 'CCNA, Microsoft Certified', '081234543210', 'rudi@lab-env.co.id', '2020-11-15', 'B.Sc. Information Technology', 'active', NULL, TRUE),
(12, 'EMP012', 'Dr. Surya Wijaya', 'Technical Director', 'Management', 'Environmental Analytics, Research', 'ISO 17025 Technical Expert', '087654321098', 'surya@lab-env.co.id', '2010-02-01', 'Ph.D. Environmental Chemistry', 'active', NULL, TRUE);
INSERT INTO master_clients (client_id, client_code, client_name, client_type, industry_sector, address, city, province, postal_code, main_contact_person, contact_position, contact_phone, contact_email, tax_id, payment_terms, discount_rate, credit_limit, status, remarks, is_active) VALUES
(1, 'CL001', 'PT. Industri Tekstil Nusantara', 'industry', 'Textile', 'Jl. Industri No. 123', 'Bandung', 'Jawa Barat', '40123', 'Budi Santoso', 'Environmental Officer', '08123456789', 'budi@tekstilnusantara.com', '01.234.567.8-901.000', 'Net 30', 0.00, 10000000.00, 'active', 'Pelanggan reguler triwulanan', TRUE),
(2, 'CL002', 'PT. Kimia Farma Tbk', 'industry', 'Pharmaceutical', 'Jl. Veteran No. 45', 'Jakarta', 'DKI Jakarta', '10110', 'Ani Wijaya', 'EHS Manager', '08234567890', 'ani@kimiafarma.co.id', '02.345.678.9-012.000', 'Net 15', 5.00, 25000000.00, 'active', NULL, TRUE),
(3, 'CL003', 'Dinas Lingkungan Hidup Kota', 'government', 'Environmental Regulation', 'Jl. Ahmad Yani No. 35', 'Bandung', 'Jawa Barat', '40115', 'Siti Aminah', 'Koordinator Pemantauan Air', '08765432100', 'siti@dlh.kotabjb.go.id', '03.456.789.0-123.000', 'Government Invoice', 0.00, 50000000.00, 'active', 'Kontrak tahunan', TRUE),
(4, 'CL004', 'PT. Aneka Tambang Tbk', 'industry', 'Mining', 'Jl. TB Simatupang No. 67', 'Jakarta', 'DKI Jakarta', '12520', 'Hadi Sutrisno', 'Environmental Compliance Manager', '08345678901', 'hadi@antam.com', '04.567.890.1-234.000', 'Net 30', 0.00, 35000000.00, 'active', NULL, TRUE),
(5, 'CL005', 'PT. Tirta Investama (Aqua)', 'industry', 'Food & Beverage', 'Jl. Pulo Lentut No. 3', 'Bekasi', 'Jawa Barat', '17122', 'Maya Indah', 'Quality Assurance Manager', '08456789012', 'maya@aqua.com', '05.678.901.2-345.000', 'Net 15', 2.50, 20000000.00, 'active', NULL, TRUE),
(6, 'CL006', 'Balai Besar Wilayah Sungai Citarum', 'government', 'Water Resources', 'Jl. Braga No. 137', 'Bandung', 'Jawa Barat', '40111', 'Agus Hermawan', 'Kepala Seksi Kualitas Air', '08987654321', 'agus@bbwscitarum.com', '06.789.012.3-456.000', 'Government Invoice', 0.00, 40000000.00, 'active', 'Program Citarum Harum', TRUE),
(7, 'CL007', 'PT. Indofood CBP Sukses Makmur Tbk', 'industry', 'Food Processing', 'Jl. Industri Selatan No. 45', 'Bekasi', 'Jawa Barat', '17530', 'Dewi Sartika', 'EHS Compliance Officer', '08567890123', 'dewi@indofood.co.id', '07.890.123.4-567.000', 'Net 30', 0.00, 30000000.00, 'active', NULL, TRUE),
(8, 'CL008', 'PT. PLN (Persero)', 'government', 'Energy & Power', 'Jl. Trunojoyo Blok M-I No.135', 'Jakarta', 'DKI Jakarta', '12160', 'Bambang Irawan', 'Environmental Officer', '08678901234', 'bambang@pln.co.id', '08.901.234.5-678.000', 'Net 45', 0.00, 45000000.00, 'active', NULL, TRUE),
(9, 'CL009', 'PT. Pertamina EP', 'government', 'Oil & Gas', 'Jl. Medan Merdeka Timur No. 1A', 'Jakarta', 'DKI Jakarta', '10110', 'Joko Susilo', 'HSE Manager', '08789012345', 'joko@pertamina.com', '09.012.345.6-789.000', 'Net 45', 0.00, 50000000.00, 'active', NULL, TRUE),
(10, 'CL010', 'PT. Jakarta Propertindo', 'government', 'Property Development', 'Jl. Kebon Sirih No. 12', 'Jakarta', 'DKI Jakarta', '10340', 'Lina Hartati', 'Environmental Manager', '08890123456', 'lina@jakpro.co.id', '10.123.456.7-890.000', 'Net 30', 0.00, 25000000.00, 'active', NULL, TRUE);
INSERT INTO master_sampling_locations (location_id, location_code, location_name, client_id, location_type, address, coordinates, elevation, description, access_information, sampling_point_details, remarks, is_active) VALUES
(1, 'LOC001', 'Outlet IPAL PT. ITN', 1, 'outlet', 'Jl. Industri No. 123, Bandung', POINT(-6.914744, 107.609810), 650.5, 'Outlet dari Instalasi Pengolahan Air Limbah utama', 'Akses melalui pintu belakang pabrik, koordinasi dengan security', 'Sampel diambil dari saluran outlet sebelum bercampur dengan badan air penerima', NULL, TRUE),
(2, 'LOC002', 'Inlet IPAL PT. ITN', 1, 'inlet', 'Jl. Industri No. 123, Bandung', POINT(-6.914789, 107.609835), 652.0, 'Inlet menuju Instalasi Pengolahan Air Limbah', 'Akses melalui area produksi, perlu ijin khusus', 'Sampel diambil dari bak ekualisasi sebelum treatment', 'Memerlukan APD lengkap, beresiko bau menyengat', TRUE),
(3, 'LOC003', 'Titik 1 Sungai Citarum (Hulu)', 3, 'sungai', 'Desa Cikitu, Kab. Bandung', POINT(-6.947890, 107.632505), 875.3, 'Lokasi hulu Sungai Citarum', 'Akses dengan kendaraan 4WD + jalan kaki 500m', 'Sampel diambil dari tengah sungai dengan perahu', 'Koordinasi dengan penduduk lokal untuk akses', TRUE),
(4, 'LOC004', 'Titik 2 Sungai Citarum', 3, 'sungai', 'Desa Dayeuhkolot, Kab. Bandung', POINT(-6.933456, 107.621234), 780.0, 'Lokasi setelah kawasan industri', 'Akses dari jembatan', 'Sampel diambil dari tengah sungai dengan tali dan ember', NULL, TRUE),
(5, 'LOC005', 'Titik 3 Sungai Citarum', 3, 'sungai', 'Kecamatan Baleendah, Kab. Bandung', POINT(-6.925678, 107.612345), 720.4, 'Lokasi dekat pemukiman padat', 'Akses dari jalan desa, parkir di lapangan', 'Sampel diambil dari tepi sungai dengan telescopic pole', NULL, TRUE),
(6, 'LOC006', 'Titik 4 Sungai Citarum', 3, 'sungai', 'Kecamatan Dayeuhkolot, Kab. Bandung', POINT(-6.912345, 107.603456), 680.2, 'Lokasi setelah pertemuan dengan anak sungai', 'Akses dari jalan provinsi, parkir di bahu jalan', 'Sampel diambil dari jembatan dengan tali dan ember', 'Arus cukup deras di lokasi ini', TRUE),
(7, 'LOC007', 'Titik 5 Sungai Citarum (Hilir)', 3, 'sungai', 'Kecamatan Bojongsoang, Kab. Bandung', POINT(-6.901234, 107.594567), 650.8, 'Lokasi hilir sebelum bendungan', 'Akses dari jalan desa, parkir di rumah penduduk', 'Sampel diambil dari tepi sungai dengan telescopic pole', NULL, TRUE),
(8, 'LOC008', 'Sumur Pantau 1 PT. Aneka Tambang', 4, 'sumur pantau', 'Area Tambang Timur, Kabupaten Bogor', POINT(-6.412345, 106.857654), 342.5, 'Sumur pantau untuk monitoring air tanah', 'Akses dengan kendaraan tambang, koordinasi dengan security', 'Sumur PVC 4 inch, kedalaman 15m, pakai bailer', 'Perlu pengukuran level air tanah sebelum sampling', TRUE),
(9, 'LOC009', 'Sumur Pantau 2 PT. Aneka Tambang', 4, 'sumur pantau', 'Area Tambang Barat, Kabupaten Bogor', POINT(-6.418765, 106.849876), 356.8, 'Sumur pantau untuk monitoring air tanah', 'Akses dengan kendaraan tambang, koordinasi dengan security', 'Sumur PVC 4 inch, kedalaman 20m, pakai bailer', 'Perlu pengukuran level air tanah sebelum sampling', TRUE),
(10, 'LOC010', 'Outlet IPAL PT. Kimia Farma', 2, 'outlet', 'Jl. Veteran No. 45, Jakarta', POINT(-6.183456, 106.823456), 12.5, 'Outlet IPAL produksi farmasi', 'Akses melalui laboratorium QC, koordinasi dengan staff EHS', 'Sampel diambil dari bak kontrol setelah IPAL', 'Kemungkinan mengandung residu antibiotik', TRUE),
(11, 'LOC011', 'Sumber Air Baku Aqua', 5, 'sumber air', 'Desa Babakan, Kabupaten Sukabumi', POINT(-6.912387, 106.912345), 875.4, 'Sumber mata air untuk produksi air minum', 'Akses terbatas, perlu ijin khusus dan didampingi staff', 'Sampel diambil langsung dari mata air', 'Area steril, perlu protokol khusus', TRUE),
(12, 'LOC012', 'Sungai Ciliwung Hulu', 10, 'sungai', 'Kebun Raya Bogor', POINT(-6.597890, 106.799012), 260.5, 'Bagian hulu sungai, kawasan konservasi', 'Akses dari Kebun Raya, perlu izin masuk', 'Sampel diambil dari jembatan dengan tali dan ember', 'Sampel baseline kualitas air', TRUE);
INSERT INTO master_sampling_methods (method_id, method_code, method_name, standard_reference, applicable_matrix, method_description, equipment_needed, procedure_summary, qc_requirements, limitations, remarks, is_active) VALUES
(1, 'GS-001', 'Grab Sampling for Surface Water', 'SNI 6989.57:2008', 'air permukaan', 'Pengambilan sampel sesaat untuk air permukaan', 'Botol sampel sesuai parameter, tali, ember, tongkat sampling', 'Sampel diambil secara langsung dari badan air dengan kedalaman sekitar 30cm dari permukaan', 'Blanko lapangan, sampel duplikat 1 per 10 sampel', NULL, NULL, TRUE),
(2, 'MS-CAHAYA-01', 'Pengukuran Intensitas Cahaya Ruangan', 'SNI 16-7062-2004', 'ruang_kerja', 'Metode pengukuran intensitas cahaya dalam ruangan', 'Lux meter, tripod, meteran', 'Pengukuran dilakukan dengan menempatkan sensor lux meter pada bidang kerja (umumnya 0.75-0.85m dari lantai). Diambil minimal 3 titik pengukuran yang mewakili area kerja. Untuk ruangan <10m², minimal 1 titik di tengah ruangan.', 'Kalibrasi lux meter sebelum pengukuran, verifikasi dengan standar cahaya (jika ada)', 'Hasil dapat dipengaruhi oleh kondisi cuaca, bayangan, dan refleksi cahaya', NULL, TRUE),
(3, 'MS-CAHAYA-02', 'Pengukuran Intensitas Cahaya Area Kerja Industri', 'PERMENAKER No.5 Tahun 2018', 'area_kerja', 'Metode pengukuran intensitas cahaya untuk area kerja industri', 'Lux meter digital, tripod, meteran, lembar grid area kerja', 'Pengukuran dilakukan dengan membuat grid area kerja. Untuk area <100m², minimal 9 titik pengukuran (grid 3x3). Sensor diletakkan pada bidang kerja atau 0.85m dari lantai. Pengukuran dilakukan dalam kondisi operasional normal.', 'Kalibrasi lux meter, pengukuran duplikat minimal 10% dari total titik', 'Pengukuran optimal dilakukan saat aktivitas produksi normal. Perhatikan pengaruh bayangan mesin dan peralatan.', 'Untuk area produksi dengan pencahayaan kritis, perlu pengukuran pada waktu yang berbeda (pagi, siang, malam)', TRUE),
(4, 'MS-CAHAYA-03', 'Pengukuran Luminansi Permukaan', 'IES LM-79-08', 'permukaan_kerja', 'Metode pengukuran luminansi (kecerahan) permukaan', 'Luminance meter, tripod, material reflektansi standar', 'Pengukuran dilakukan dengan mengarahkan luminance meter ke permukaan yang diukur pada sudut pengamatan normal. Jarak pengukuran disesuaikan dengan spesifikasi alat.', 'Kalibrasi dengan material reflektansi standar', 'Refleksi cahaya dari permukaan lain dapat mempengaruhi hasil', 'Terutama untuk evaluasi silau dan kontras pencahayaan', TRUE),
(5, 'MS-CAHAYA-04', 'Pengukuran Distribusi Cahaya', 'CIE S 025/E:2015', 'ruang_tiga_dimensi', 'Metode pengukuran distribusi cahaya dalam ruang tiga dimensi', 'Lux meter dengan probe 3D, tripod, perangkat lunak pemetaan cahaya', 'Pengukuran dilakukan pada grid tiga dimensi dalam ruangan untuk memetakan distribusi cahaya. Pengukuran minimal pada 3 ketinggian berbeda.', 'Verifikasi dengan pengukuran pada titik referensi', 'Memerlukan waktu pengukuran yang lebih lama', 'Untuk analisis distribusi cahaya yang lebih komprehensif', TRUE);
INSERT INTO master_regulations (regulation_id, regulation_code, regulation_name, issuing_authority, regulation_type, issue_date, effective_date, applicable_sector, scope, summary, file_path, remarks, is_active) VALUES
(1, 'PMK-02-2023', 'Peraturan Menteri Kesehatan Republik Indonesia Nomor 2 Tahun 2023', 'Kementerian Kesehatan', 'Peraturan Menteri', '2023-01-20', '2023-02-01', 'Kesehatan Lingkungan, Kesehatan Kerja', 'Standar Baku Mutu Kesehatan Lingkungan dan Persyaratan Kesehatan', 'Peraturan ini mengatur tentang standar baku mutu kesehatan lingkungan untuk media udara, air, tanah, pangan, dan sarana/bangunan, serta persyaratan kesehatan lainnya', '/dokumen/regulasi/PMK_02_2023.pdf', 'Menggantikan PMK No.32 Tahun 2017', TRUE),
(2, 'PERMENAKER-05-2018', 'Peraturan Menteri Ketenagakerjaan Republik Indonesia Nomor 5 Tahun 2018', 'Kementerian Ketenagakerjaan', 'Peraturan Menteri', '2018-04-25', '2018-05-10', 'Keselamatan dan Kesehatan Kerja', 'Keselamatan dan Kesehatan Kerja Lingkungan Kerja', 'Peraturan ini mengatur tentang standar K3 Lingkungan Kerja termasuk faktor fisika, kimia, biologi, ergonomi dan psikologi', '/dokumen/regulasi/PERMENAKER_05_2018.pdf', NULL, TRUE);
INSERT INTO master_quality_standards (standard_id, standard_code, standard_name, regulation_id, matrix_type, industry_type, parameter_id, min_value, max_value, unit, remarks, is_active) VALUES
-- Berdasarkan PMK RI No.2 Tahun 2023
(1, 'PMK-CAH-01', 'Intensitas Cahaya Ruang Kerja Perkantoran', 1, 'ruang_kerja', 'perkantoran', 16, 300.00, NULL, 'Lux', 'Intensitas cahaya untuk pekerjaan rutin', TRUE),
(2, 'PMK-CAH-02', 'Intensitas Cahaya Ruang Rapat', 1, 'ruang_rapat', NULL, 16, 300.00, NULL, 'Lux', NULL, TRUE),
(3, 'PMK-CAH-03', 'Intensitas Cahaya Ruang Arsip', 1, 'ruang_arsip', NULL, 16, 150.00, NULL, 'Lux', NULL, TRUE),
(4, 'PMK-CAH-04', 'Intensitas Cahaya Ruang Resepsionis', 1, 'ruang_resepsionis', NULL, 16, 300.00, NULL, 'Lux', NULL, TRUE),
(5, 'PMK-CAH-05', 'Intensitas Cahaya Ruang Komputer', 1, 'ruang_komputer', NULL, 16, 500.00, NULL, 'Lux', 'Untuk menghindari kelelahan mata dan refleksi layar', TRUE),
(6, 'PMK-CAH-06', 'Intensitas Cahaya Ruang Gambar', 1, 'ruang_gambar', NULL, 16, 750.00, NULL, 'Lux', 'Untuk pekerjaan detail tinggi', TRUE),
(7, 'PMK-CAH-07', 'Intensitas Cahaya Ruang Perpustakaan', 1, 'ruang_perpustakaan', NULL, 16, 300.00, NULL, 'Lux', NULL, TRUE),
(8, 'PMK-CAH-08', 'Intensitas Cahaya Ruang Laboratorium', 1, 'ruang_laboratorium', NULL, 16, 500.00, NULL, 'Lux', NULL, TRUE),
(9, 'PMK-CAH-09', 'Intensitas Cahaya Ruang Pemeriksaan', 1, 'ruang_pemeriksaan', 'kesehatan', 16, 500.00, NULL, 'Lux', NULL, TRUE),
-- Berdasarkan Permenaker No.5 Tahun 2018
(10, 'PMN-CAH-01', 'Intensitas Cahaya Pekerjaan Kasar', 2, 'area_kerja', 'industri', 16, 100.00, NULL, 'Lux', 'Pekerjaan dengan detail besar, tidak teliti', TRUE),
(11, 'PMN-CAH-02', 'Intensitas Cahaya Pekerjaan Sedang', 2, 'area_kerja', 'industri', 16, 200.00, NULL, 'Lux', 'Pekerjaan dengan detail sedang', TRUE),
(12, 'PMN-CAH-03', 'Intensitas Cahaya Pekerjaan Halus', 2, 'area_kerja', 'industri', 16, 500.00, NULL, 'Lux', 'Pekerjaan dengan detail kecil', TRUE),
(13, 'PMN-CAH-04', 'Intensitas Cahaya Pekerjaan Amat Halus', 2, 'area_kerja', 'industri', 16, 1000.00, NULL, 'Lux', 'Pekerjaan dengan detail sangat kecil', TRUE),
(14, 'PMN-CAH-05', 'Intensitas Cahaya Pekerjaan Terinci', 2, 'area_kerja', 'industri', 16, 2000.00, NULL, 'Lux', 'Pekerjaan yang membutuhkan ketelitian tinggi', TRUE),
(15, 'PMN-CAH-06', 'Intensitas Cahaya Lorong', 2, 'area_kerja', 'industri', 16, 50.00, NULL, 'Lux', 'Area sirkulasi', TRUE),
(16, 'PMN-CAH-07', 'Intensitas Cahaya Tangga', 2, 'area_kerja', 'industri', 16, 100.00, NULL, 'Lux', 'Area sirkulasi vertikal', TRUE),
(17, 'PMN-CAH-08', 'Intensitas Cahaya Gudang', 2, 'area_kerja', 'industri', 16, 100.00, NULL, 'Lux', 'Area penyimpanan dengan aktivitas rendah', TRUE),
(18, 'PMN-CAH-09', 'Luminansi Maksimum', 2, 'area_kerja', 'industri', 17, NULL, 5000.00, 'cd/m²', 'Untuk menghindari efek silau', TRUE),
(19, 'PMN-CAH-10', 'Indeks Kesilauan Maksimum', 2, 'area_kerja', 'industri', 18, NULL, 19.00, 'UGR', 'Batas kesilauan yang dapat ditoleransi', TRUE);
INSERT INTO sampling_plans (plan_id, plan_code, project_name, client_id, contact_person_id, request_date, planned_sampling_date, status, created_by, approved_by, approval_date, total_locations, total_parameters, remarks, created_at) VALUES
(1, 'SP-LX-2024-001', 'Monitoring Pencahayaan Ruang Kerja Triwulan I 2024', 1, NULL, '2024-01-05 09:00:00', '2024-01-20', 'approved', 4, 1, '2024-01-10 14:30:00', 10, 1, 'Monitoring rutin triwulanan sesuai PMK No.2 Tahun 2023', '2024-01-05 09:15:20');
INSERT INTO sampling_plan_locations (plan_location_id, plan_id, location_id, sampling_date, sampling_time, sampling_method_id, sampling_personnel_id, field_parameters, special_instructions, status, remarks) VALUES
(1, 1, 1, '2024-01-20', '09:00:00', 2, 3, 'Intensitas Cahaya', 'Pengukuran dilakukan saat kondisi pencahayaan normal (tidak ada maintenance lampu)', 'planned', 'Area kerja produksi utama'),
(2, 1, 2, '2024-01-20', '10:30:00', 2, 3, 'Intensitas Cahaya', 'Pengukuran dilakukan saat kondisi pencahayaan normal (tidak ada maintenance lampu)', 'planned', 'Area IPAL'),
(3, 1, NULL, '2024-01-20', '11:30:00', 2, 3, 'Intensitas Cahaya', 'Pengukuran pada area kantor administrasi', 'planned', 'Ruang administrasi lantai 2'),
(4, 1, NULL, '2024-01-20', '13:00:00', 2, 3, 'Intensitas Cahaya, Luminansi', 'Pengukuran pada area kerja dengan penggunaan komputer', 'planned', 'Ruang desain produk'),
(5, 1, NULL, '2024-01-20', '14:00:00', 2, 3, 'Intensitas Cahaya', 'Pengukuran pada area QC', 'planned', 'Laboratorium QC');
INSERT INTO sampling_plan_parameters (plan_parameter_id, plan_id, plan_location_id, parameter_id, container_id, preservation_id, quantity, unit_price, remarks) VALUES
(1, 1, 1, 16, NULL, NULL, 1, 75000.00, 'Pengukuran grid 3x3'),
(2, 1, 2, 16, NULL, NULL, 1, 75000.00, 'Pengukuran grid 3x3'),
(3, 1, 3, 16, NULL, NULL, 1, 75000.00, 'Pengukuran pada meja kerja utama'),
(4, 1, 4, 16, NULL, NULL, 1, 75000.00, 'Pengukuran pada meja kerja utama'),
(5, 1, 4, 17, NULL, NULL, 1, 85000.00, 'Pengukuran luminansi layar monitor'),
(6, 1, 5, 16, NULL, NULL, 1, 75000.00, 'Pengukuran pada area inspeksi produk');
INSERT INTO equipment_requisitions (requisition_id, requisition_code, plan_id, requisition_date, requested_by, approved_by, approval_date, sampling_date, return_date, status, remarks) VALUES
(1, 'REQ-LX-2024-001', 1, '2024-01-15 10:30:00', 4, 1, '2024-01-16 09:15:00', '2024-01-20', '2024-01-21', 'approved', 'Peralatan untuk monitoring pencahayaan PT. ITN');
INSERT INTO equipment_requisition_items (requisition_item_id, requisition_id, equipment_id, quantity, issued_quantity, issued_by, issued_date, returned_quantity, returned_condition, returned_date, verified_by, remarks) VALUES
(1, 1, 16, 1, 1, 8, '2024-01-19 15:00:00', NULL, NULL, NULL, NULL, 'Lux meter utama'),
(2, 1, 17, 1, 1, 8, '2024-01-19 15:00:00', NULL, NULL, NULL, NULL, 'Lux meter backup'),
(3, 1, 18, 1, 1, 8, '2024-01-19 15:00:00', NULL, NULL, NULL, NULL, 'Untuk pengukuran luminansi layar monitor'),
(4, 1, 20, 1, 1, 8, '2024-01-19 15:00:00', NULL, NULL, NULL, NULL, 'Peralatan penunjang grid mapping');
INSERT INTO measurement_results_light (result_id, sample_id, measurement_date, measurement_time, parameter_id, measurement_value, measurement_unit, measurement_point, weather_condition, light_source, ambient_condition, standard_id, is_compliant, analyst_id, verified_by, verification_date, remarks) VALUES
(1, 1, '2024-01-20', '09:15:00', 16, 325.50, 'Lux', 'Titik 1 (Depan)', 'Cerah', 'Lampu fluorescent + Cahaya alami', 'Tirai jendela dibuka 50%', 11, TRUE, 3, 2, '2024-01-21 10:00:00', 'Memenuhi standar Permenaker'),
(2, 1, '2024-01-20', '09:20:00', 16, 310.20, 'Lux', 'Titik 2 (Tengah)', 'Cerah', 'Lampu fluorescent + Cahaya alami', 'Tirai jendela dibuka 50%', 11, TRUE, 3, 2, '2024-01-21 10:00:00', 'Memenuhi standar Permenaker'),
(3, 1, '2024-01-20', '09:25:00', 16, 290.80, 'Lux', 'Titik 3 (Belakang)', 'Cerah', 'Lampu fluorescent + Cahaya alami', 'Tirai jendela dibuka 50%', 11, TRUE, 3, 2, '2024-01-21 10:00:00', 'Memenuhi standar Permenaker'),
(4, 2, '2024-01-20', '10:45:00', 16, 180.40, 'Lux', 'Titik 1 (Pintu Masuk)', 'Cerah', 'Lampu LED', 'Indoor, pencahayaan buatan', 10, TRUE, 3, 2, '2024-01-21 10:15:00', 'Memenuhi standar untuk pekerjaan kasar'),
(5, 2, '2024-01-20', '10:50:00', 16, 165.30, 'Lux', 'Titik 2 (Area Kontrol)', 'Cerah', 'Lampu LED', 'Indoor, pencahayaan buatan', 10, TRUE, 3, 2, '2024-01-21 10:15:00', 'Memenuhi standar untuk pekerjaan kasar'),
(6, 4, '2024-01-20', '13:15:00', 17, 120.50, 'cd/m²', 'Layar Monitor 1', 'Cerah', 'Layar Monitor', 'Indoor, pencahayaan buatan dan alami', 18, TRUE, 3, 2, '2024-01-21 10:30:00', 'Luminansi layar dalam batas aman');

View File

@@ -0,0 +1,246 @@
-- Database Structure and Sample Data for Environmental Noise Measurement
-- Based on PMK RI No.2 Tahun 2023
-- ------------------------------------------------------------------------------
-- Master Tables - Noise Specific
-- ------------------------------------------------------------------------------
-- Master Area Types
CREATE TABLE IF NOT EXISTS master_area_types (
area_type_id INT PRIMARY KEY,
area_type_name VARCHAR(100) NOT NULL,
description TEXT,
status BOOLEAN DEFAULT TRUE,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50)
);
-- Master Noise Quality Standards
CREATE TABLE IF NOT EXISTS master_noise_standards (
standard_id INT PRIMARY KEY,
regulation_id INT NOT NULL,
area_type_id INT NOT NULL,
standard_value DECIMAL(5, 1) NOT NULL,
unit VARCHAR(10) DEFAULT 'dB(A)',
measurement_time VARCHAR(50),
description TEXT,
status BOOLEAN DEFAULT TRUE,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50),
FOREIGN KEY (regulation_id) REFERENCES master_regulations(regulation_id),
FOREIGN KEY (area_type_id) REFERENCES master_area_types(area_type_id)
);
-- Master Noise Measurement Methods
CREATE TABLE IF NOT EXISTS master_noise_methods (
method_id INT PRIMARY KEY,
method_code VARCHAR(50) NOT NULL,
method_name VARCHAR(255) NOT NULL,
description TEXT,
standard_reference VARCHAR(100),
status BOOLEAN DEFAULT TRUE,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50)
);
-- Master Noise Measurement Equipment
CREATE TABLE IF NOT EXISTS master_noise_equipment (
equipment_id INT PRIMARY KEY,
equipment_code VARCHAR(20) NOT NULL,
equipment_name VARCHAR(100) NOT NULL,
equipment_type VARCHAR(50),
brand VARCHAR(100),
model VARCHAR(100),
serial_number VARCHAR(100),
accuracy_type VARCHAR(20), -- Type 0, 1, 2 for SLM
specifications TEXT,
calibration_date DATE,
next_calibration_date DATE,
calibration_status VARCHAR(20),
certificate_file VARCHAR(255),
status BOOLEAN DEFAULT TRUE,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50)
);
-- ------------------------------------------------------------------------------
-- Transaction Tables - Noise Specific
-- ------------------------------------------------------------------------------
-- Noise Sampling Plan
CREATE TABLE IF NOT EXISTS trx_noise_sampling_plan (
sampling_plan_id INT PRIMARY KEY,
sampling_plan_code VARCHAR(50) NOT NULL,
project_name VARCHAR(255) NOT NULL,
client_id INT NOT NULL,
planned_sampling_date DATE NOT NULL,
sampling_location TEXT NOT NULL,
point_count INT,
approval_status VARCHAR(20) DEFAULT 'DRAFT',
notes TEXT,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50)
);
-- Noise Measurement Results
CREATE TABLE IF NOT EXISTS trx_noise_measurement_results (
measurement_id INT PRIMARY KEY,
sampling_plan_id INT NOT NULL,
report_code VARCHAR(50) NOT NULL,
sampling_date DATE NOT NULL,
start_time TIME,
end_time TIME,
weather_condition VARCHAR(100),
temperature DECIMAL(5, 2),
humidity DECIMAL(5, 2),
wind_speed DECIMAL(5, 2),
wind_direction VARCHAR(10),
sampling_officers VARCHAR(100),
report_status VARCHAR(20) DEFAULT 'DRAFT',
notes TEXT,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50),
FOREIGN KEY (sampling_plan_id) REFERENCES trx_noise_sampling_plan(sampling_plan_id)
);
-- Noise Measurement Details
CREATE TABLE IF NOT EXISTS trx_noise_measurement_details (
measurement_detail_id INT PRIMARY KEY,
measurement_id INT NOT NULL,
point_code VARCHAR(20) NOT NULL,
location_name VARCHAR(255) NOT NULL,
area_description TEXT,
area_type_id INT NOT NULL,
latitude DECIMAL(10, 6),
longitude DECIMAL(10, 6),
measurement_height DECIMAL(4, 2),
distance_from_source DECIMAL(6, 2),
noise_source TEXT,
noise_characteristics VARCHAR(50), -- Continuous, Intermittent, Impulsive, etc.
method_id INT NOT NULL,
equipment_id INT NOT NULL,
day_value DECIMAL(5, 1) NOT NULL, -- Ld (day)
evening_value DECIMAL(5, 1) NOT NULL, -- Le (evening)
night_value DECIMAL(5, 1) NOT NULL, -- Ln (night)
leq24_value DECIMAL(5, 1) NOT NULL, -- Leq 24 hours
standard_id INT NOT NULL,
compliance_status VARCHAR(20),
recommendations TEXT,
notes TEXT,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50),
FOREIGN KEY (measurement_id) REFERENCES trx_noise_measurement_results(measurement_id),
FOREIGN KEY (area_type_id) REFERENCES master_area_types(area_type_id),
FOREIGN KEY (method_id) REFERENCES master_noise_methods(method_id),
FOREIGN KEY (equipment_id) REFERENCES master_noise_equipment(equipment_id),
FOREIGN KEY (standard_id) REFERENCES master_noise_standards(standard_id)
);
-- Noise Control Recommendations
CREATE TABLE IF NOT EXISTS trx_noise_control_recommendations (
recommendation_id INT PRIMARY KEY,
measurement_detail_id INT NOT NULL,
control_type VARCHAR(50) NOT NULL, -- Engineering, Administrative, PPE
control_description TEXT NOT NULL,
priority INT,
estimated_cost DECIMAL(12, 2),
estimated_reduction DECIMAL(5, 1),
implementation_status VARCHAR(20) DEFAULT 'PLANNED',
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50),
FOREIGN KEY (measurement_detail_id) REFERENCES trx_noise_measurement_details(measurement_detail_id)
);
-- ------------------------------------------------------------------------------
-- Sample Data Insertion - Master Tables
-- ------------------------------------------------------------------------------
-- Insert Data Master Area Types
INSERT INTO master_area_types (area_type_id, area_type_name, description, status, input_user)
VALUES
(1, 'Residential Areas', 'Residential housing and settlements', TRUE, 'admin'),
(2, 'Commercial and Trade Areas', 'Commercial and service areas, including offices', TRUE, 'admin'),
(3, 'Office and Commercial Areas', 'Office and commercial areas', TRUE, 'admin'),
(4, 'Industrial Areas', 'Manufacturing industrial areas', TRUE, 'admin'),
(5, 'Hospitals and Healthcare Facilities', 'Hospitals, health centers, and other healthcare facilities', TRUE, 'admin'),
(6, 'Schools and Educational Facilities', 'Educational areas including schools, madrasas, colleges', TRUE, 'admin'),
(7, 'Places of Worship', 'Worship areas such as mosques, churches, temples, and other religious buildings', TRUE, 'admin');
-- Insert Data Master Noise Standards
INSERT INTO master_noise_standards (standard_id, regulation_id, area_type_id, standard_value, unit, measurement_time, description, status, input_user)
VALUES
(1, 1, 1, 55.0, 'dB(A)', 'Leq 24 hours', 'Noise quality standard for residential areas', TRUE, 'admin'),
(2, 1, 2, 70.0, 'dB(A)', 'Leq 24 hours', 'Noise quality standard for commercial and trade areas', TRUE, 'admin'),
(3, 1, 3, 65.0, 'dB(A)', 'Leq 24 hours', 'Noise quality standard for office and commercial areas', TRUE, 'admin'),
(4, 1, 4, 70.0, 'dB(A)', 'Leq 24 hours', 'Noise quality standard for industrial areas', TRUE, 'admin'),
(5, 1, 5, 55.0, 'dB(A)', 'Leq 24 hours', 'Noise quality standard for hospitals and healthcare facilities', TRUE, 'admin'),
(6, 1, 6, 55.0, 'dB(A)', 'Leq during school hours', 'Noise quality standard for schools and educational facilities', TRUE, 'admin'),
(7, 1, 7, 55.0, 'dB(A)', 'Leq during worship times', 'Noise quality standard for places of worship', TRUE, 'admin');
-- Insert Data Master Noise Measurement Methods
INSERT INTO master_noise_methods (method_id, method_code, method_name, description, standard_reference, status, input_user)
VALUES
(1, 'SNI-7231-2009', 'SNI 7231:2009 - Environmental Noise Measurement Method', 'Method for measuring environmental noise levels using Sound Level Meter', 'SNI 7231:2009', TRUE, 'admin'),
(2, 'KEPMEN-LH-48-1996', 'Ministry of Environment Decree No. 48 of 1996 - Appendix II', 'Noise level measurement method based on the Ministry of Environment Decree', 'Ministry of Environment Decree No.48 of 1996', TRUE, 'admin');
-- Insert Data Master Noise Measurement Equipment
INSERT INTO master_noise_equipment (equipment_id, equipment_code, equipment_name, equipment_type, brand, model, serial_number, accuracy_type, specifications, calibration_date, next_calibration_date, calibration_status, certificate_file, status, input_user)
VALUES
(1, 'SLM-01', 'Sound Level Meter', 'SLM', 'RION', 'NL-52', '12345678', 'Type 1', 'Range: 20-130 dB, Accuracy: ±1.0 dB, Frequency range: 20 Hz - 20 kHz', '2024-02-15', '2025-02-15', 'VALID', '/documents/calibration/slm_rion_2024.pdf', TRUE, 'admin'),
(2, 'CAL-01', 'Acoustic Calibrator', 'Calibrator', 'RION', 'NC-74', '87654321', 'Class 1', 'Calibration level: 94 dB, Accuracy: ±0.3 dB', '2024-02-15', '2025-02-15', 'VALID', '/documents/calibration/cal_rion_2024.pdf', TRUE, 'admin'),
(3, 'SLM-02', 'Sound Level Meter', 'SLM', 'Cirrus', 'CR171B', 'CR123456', 'Type 1', 'Range: 20-140 dB, Accuracy: ±0.5 dB, Frequency range: 10 Hz - 20 kHz', '2023-11-20', '2024-11-20', 'VALID', '/documents/calibration/slm_cirrus_2023.pdf', TRUE, 'admin'),
(4, 'WS-01', 'Weather Station', 'Weather Meter', 'Kestrel', '5500', 'KW123456', 'N/A', 'Wind speed, direction, temperature, humidity, pressure measurement', '2023-10-10', '2024-10-10', 'VALID', '/documents/calibration/weather_kestrel_2023.pdf', TRUE, 'admin');
-- ------------------------------------------------------------------------------
-- Sample Data Insertion - Transaction Tables
-- ------------------------------------------------------------------------------
-- Sample Noise Sampling Plan
INSERT INTO trx_noise_sampling_plan (sampling_plan_id, sampling_plan_code, project_name, client_id, planned_sampling_date, sampling_location, point_count, approval_status, notes, input_date, input_user)
VALUES
(1, 'SP-NOISE-2024-001', 'Environmental Noise Measurement at PT. Integrated Manufacturing Industries', 201, '2024-06-10', 'PT. Integrated Manufacturing Industries, Industrial Zone Block C5, Karawang, West Java', 6, 'APPROVED', 'Environmental noise measurement for compliance with standards', '2024-06-01 09:00:00', 'supervisor');
-- Sample Noise Measurement Results
INSERT INTO trx_noise_measurement_results (measurement_id, sampling_plan_id, report_code, sampling_date, start_time, end_time, weather_condition, temperature, humidity, wind_speed, wind_direction, sampling_officers, report_status, notes, input_date, input_user)
VALUES
(1, 1, 'LHU/NOISE/06/2024/003', '2024-06-10', '08:00:00', '17:00:00', 'Sunny', 30.0, 65.0, 1.5, 'East', 'Agus Setiawan, Dina Wijaya', 'FINAL', 'Measurement proceeded smoothly as planned', '2024-06-10 17:30:00', 'analyst');
-- Sample Noise Measurement Details
INSERT INTO trx_noise_measurement_details (measurement_detail_id, measurement_id, point_code, location_name, area_description, area_type_id, latitude, longitude, measurement_height, distance_from_source, noise_source, noise_characteristics, method_id, equipment_id, day_value, evening_value, night_value, leq24_value, standard_id, compliance_status, recommendations, notes, input_date, input_user)
VALUES
-- Main Factory Entrance
(1, 1, 'NL-1', 'Main Factory Entrance', 'Main factory gate area, moderate traffic level', 4, -6.372500, 107.524167, 1.5, 3.0, 'Vehicle traffic, loading/unloading activities', 'Intermittent', 1, 1, 67.8, 65.2, 62.1, 66.3, 4, 'COMPLY', '', 'Noise is quite high during morning and evening peak hours', '2024-06-10 17:35:00', 'analyst'),
-- Production Building
(2, 1, 'NL-2', 'Production Building', 'Main production building area, high activity level', 4, -6.372778, 107.524444, 1.5, 1.0, 'Production machinery, stamping, air compressors', 'Continuous, Impulsive', 1, 1, 73.4, 72.1, 68.5, 72.2, 4, 'NOT_COMPLY', 'Install sound absorbers, check machine maintenance', 'High noise from stamping machines and compressors', '2024-06-10 17:40:00', 'analyst'),
-- Office Building
(3, 1, 'NL-3', 'Office Building', 'Administrative office area, active HVAC system', 3, -6.372944, 107.525000, 1.5, 5.0, 'HVAC system, general office activities', 'Continuous, Low Frequency', 1, 1, 64.5, 62.3, 58.7, 63.2, 3, 'COMPLY', '', 'Noise primarily from air conditioning system', '2024-06-10 17:45:00', 'analyst'),
-- Facility Boundary (East)
(4, 1, 'NL-4', 'Facility Boundary (East)', 'Eastern factory boundary, close to public road', 4, -6.373111, 107.526111, 1.5, 10.0, 'Factory operations, public road traffic', 'Intermittent', 1, 1, 68.9, 67.2, 65.6, 67.8, 4, 'COMPLY', '', 'Highest noise from road traffic', '2024-06-10 17:50:00', 'analyst'),
-- Power Generator Area
(5, 1, 'NL-5', 'Power Generator Area', 'Generator area, very high noise level', 4, -6.373278, 107.524722, 1.5, 1.0, 'Power generators, cooling systems', 'Continuous, Tonal', 1, 1, 78.6, 77.5, 76.3, 77.9, 4, 'NOT_COMPLY', 'Install enclosure, add acoustic insulation', 'Noise very high even outside generator area', '2024-06-10 17:55:00', 'analyst'),
-- Nearest Residential Area
(6, 1, 'NL-6', 'Nearest Residential Area', 'Nearest residential area to factory', 1, -6.374167, 107.527222, 1.5, 300.0, 'Factory noise, general traffic', 'Intermittent, Background', 1, 1, 57.3, 55.6, 52.1, 55.9, 1, 'NOT_COMPLY', 'Install sound barriers, limit night operations', 'Factory noise still audible in residential area', '2024-06-10 18:00:00', 'analyst');
-- Sample Noise Control Recommendations
INSERT INTO trx_noise_control_recommendations (recommendation_id, measurement_detail_id, control_type, control_description, priority, estimated_cost, estimated_reduction, implementation_status, input_date, input_user)
VALUES
-- Recommendations for Production Building
(1, 2, 'Engineering Control', 'Installation of sound absorbers on walls and ceiling of production area', 1, 75000000.00, 3.5, 'PLANNED', '2024-06-15 09:00:00', 'analyst'),
(2, 2, 'Engineering Control', 'Installation of enclosure for stamping machines', 1, 120000000.00, 8.0, 'PLANNED', '2024-06-15 09:05:00', 'analyst'),
(3, 2, 'Administrative Control', 'Preventive maintenance program for production machinery', 2, 0.00, 2.0, 'PLANNED', '2024-06-15 09:10:00', 'analyst'),
(4, 2, 'PPE', 'Provision of ear muffs for workers in production area', 1, 15000000.00, 0.0, 'PLANNED', '2024-06-15 09:15:00', 'analyst'),
-- Recommendations for Power Generator Area
(5, 5, 'Engineering Control', 'Installation of acoustic enclosure for generators', 1, 200000000.00, 15.0, 'PLANNED', '2024-06-15 09:20:00', 'analyst'),
(6, 5, 'Engineering Control', 'Installation of silencers on air intake and exhaust', 1, 85000000.00, 6.0, 'PLANNED', '2024-06-15 09:25:00', 'analyst'),
(7, 5, 'Administrative Control', 'Relocate generators further from office areas and property boundaries', 2, 350000000.00, 10.0, 'PLANNED', '2024-06-15 09:30:00', 'analyst'),
-- Recommendations for Nearest Residential Area
(8, 6, 'Engineering Control', 'Installation of noise barrier along factory boundary facing residential area', 1, 180000000.00, 5.0, 'PLANNED', '2024-06-15 09:35:00', 'analyst'),
(9, 6, 'Administrative Control', 'Restriction of noisy equipment operation during night time', 1, 0.00, 3.0, 'PLANNED', '2024-06-15 09:40:00', 'analyst'),
(10, 6, 'Administrative Control', 'Regular noise monitoring program at residential boundary', 2, 30000000.00, 0.0, 'PLANNED', '2024-06-15 09:45:00', 'analyst');

552
noise_report_template.html Normal file
View File

@@ -0,0 +1,552 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Environmental Noise Measurement Report</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
color: #333;
font-size: 12px;
}
.container {
width: 210mm;
margin: 0 auto;
padding: 10mm;
box-sizing: border-box;
}
.header {
border-bottom: 2px solid #333;
padding-bottom: 10px;
margin-bottom: 20px;
}
.logo {
float: left;
max-height: 80px;
}
.lab-info {
float: right;
text-align: right;
}
.title {
text-align: center;
margin: 20px 0;
clear: both;
}
.title h1 {
margin: 0;
font-size: 18px;
font-weight: bold;
}
.title h2 {
margin: 5px 0;
font-size: 16px;
font-weight: normal;
}
.title h3 {
margin: 5px 0;
font-size: 14px;
font-weight: normal;
}
.clearfix::after {
content: "";
clear: both;
display: table;
}
.section {
margin-bottom: 15px;
}
.section-title {
font-weight: bold;
margin-bottom: 5px;
font-size: 13px;
background-color: #f0f0f0;
padding: 5px;
border-left: 3px solid #333;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 15px;
}
table, th, td {
border: 1px solid #999;
}
th {
background-color: #f0f0f0;
padding: 8px 5px;
text-align: center;
font-weight: bold;
}
td {
padding: 8px 5px;
text-align: left;
}
.text-center {
text-align: center;
}
.text-right {
text-align: right;
}
.footer {
margin-top: 30px;
border-top: 1px solid #999;
padding-top: 10px;
}
.signature {
float: right;
width: 33%;
text-align: center;
margin-top: 20px;
}
.signature-line {
border-top: 1px solid #333;
margin-top: 50px;
margin-left: auto;
margin-right: auto;
width: 80%;
}
.compliance {
padding: 3px;
border-radius: 3px;
font-weight: bold;
}
.comply {
background-color: #dff0d8;
color: #3c763d;
}
.not-comply {
background-color: #f2dede;
color: #a94442;
}
.watermark {
position: absolute;
top: 50%;
left: 25%;
transform: rotate(-45deg);
transform-origin: 50% 50%;
opacity: 0.1;
font-size: 100px;
z-index: -1;
color: #000;
white-space: nowrap;
}
.explanation-box {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 10px;
margin: 10px 0;
font-style: italic;
}
.standard-table {
margin-top: 10px;
width: 100%;
}
.chart-container {
width: 100%;
height: 300px;
margin: 20px 0;
border: 1px solid #ddd;
padding: 10px;
box-sizing: border-box;
background-color: #f9f9f9;
text-align: center;
}
.chart-placeholder {
font-style: italic;
color: #777;
}
@page {
size: A4;
margin: 0;
}
@media print {
.container {
width: 210mm;
height: 297mm;
padding: 10mm;
box-sizing: border-box;
}
}
</style>
</head>
<body>
<div class="container">
<div class="watermark">LABORATORY REPORT</div>
<div class="header clearfix">
<img src="lab_logo.png" alt="Laboratory Logo" class="logo">
<div class="lab-info">
<h2>ENVIRONMENTAL TESTING LABORATORY</h2>
<p>Jl. Laboratorium Lingkungan No. 123, Jakarta</p>
<p>Phone: (021) 555-1234, Email: info@env-lab.co.id</p>
<p>ACCREDITED KAN: LP-001-IDN</p>
</div>
</div>
<div class="title">
<h1>ENVIRONMENTAL NOISE MEASUREMENT REPORT</h1>
<h2>REPORT NUMBER: LHU/BISING/06/2024/003</h2>
<h3>Based on PMK RI No.2 Tahun 2023</h3>
</div>
<div class="section">
<div class="section-title">1. CLIENT INFORMATION</div>
<table>
<tr>
<td width="30%">Client Name</td>
<td width="70%">PT. Industri Manufaktur Terpadu</td>
</tr>
<tr>
<td>Address</td>
<td>Jl. Kawasan Industri Blok C5, Karawang, Jawa Barat</td>
</tr>
<tr>
<td>Contact Person</td>
<td>Ir. Budi Pratama (Environmental Manager)</td>
</tr>
<tr>
<td>Request Number</td>
<td>REQ/2024/06/005</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">2. MEASUREMENT INFORMATION</div>
<table>
<tr>
<td width="30%">Measurement Date</td>
<td width="70%">June 10, 2024</td>
</tr>
<tr>
<td>Measurement Time</td>
<td>08:00 - 17:00 WIB</td>
</tr>
<tr>
<td>Measurement Officers</td>
<td>Agus Setiawan (Sampling Officer), Dina Wijaya (Technical Analyst)</td>
</tr>
<tr>
<td>Weather Condition</td>
<td>Sunny, 30°C, Humidity 65%, Wind speed 1.5 m/s</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">3. NOISE QUALITY STANDARDS</div>
<div class="explanation-box">
<p>According to PMK RI No.2 Tahun 2023, noise level standards are as follows:</p>
<table class="standard-table">
<tr>
<th width="40%">Area</th>
<th width="30%">Noise Level Standard</th>
<th width="30%">Time Unit</th>
</tr>
<tr>
<td>Residential Areas</td>
<td class="text-center">55 dB(A)</td>
<td class="text-center">Leq 24 hours</td>
</tr>
<tr>
<td>Commercial and Office Areas</td>
<td class="text-center">70 dB(A)</td>
<td class="text-center">Leq 24 hours</td>
</tr>
<tr>
<td>Industrial Areas</td>
<td class="text-center">70 dB(A)</td>
<td class="text-center">Leq 24 hours</td>
</tr>
<tr>
<td>Schools and Educational Institutions</td>
<td class="text-center">55 dB(A)</td>
<td class="text-center">Leq during school hours</td>
</tr>
<tr>
<td>Hospitals and Health Facilities</td>
<td class="text-center">55 dB(A)</td>
<td class="text-center">Leq 24 hours</td>
</tr>
<tr>
<td>Places of Worship</td>
<td class="text-center">55 dB(A)</td>
<td class="text-center">Leq during worship times</td>
</tr>
</table>
<p><strong>Note:</strong> Leq = Equivalent Continuous Sound Level</p>
</div>
</div>
<div class="section">
<div class="section-title">4. MEASUREMENT RESULTS</div>
<table>
<thead>
<tr>
<th rowspan="2">No.</th>
<th rowspan="2">Sampling Location</th>
<th rowspan="2">Area Description</th>
<th rowspan="2">Area Type</th>
<th colspan="3">Noise Level dB(A)</th>
<th rowspan="2">Leq 24 hour<br>dB(A)</th>
<th rowspan="2">Standard<br>dB(A)</th>
<th rowspan="2">Compliance Status</th>
</tr>
<tr>
<th>Daytime<br>(L<sub>d</sub>)</th>
<th>Evening<br>(L<sub>e</sub>)</th>
<th>Night<br>(L<sub>n</sub>)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="text-center">1</td>
<td>NL-1</td>
<td>Main Factory Entrance</td>
<td>Industrial</td>
<td class="text-center">67.8</td>
<td class="text-center">65.2</td>
<td class="text-center">62.1</td>
<td class="text-center">66.3</td>
<td class="text-center">70.0</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">2</td>
<td>NL-2</td>
<td>Production Building</td>
<td>Industrial</td>
<td class="text-center">73.4</td>
<td class="text-center">72.1</td>
<td class="text-center">68.5</td>
<td class="text-center">72.2</td>
<td class="text-center">70.0</td>
<td class="text-center"><span class="compliance not-comply">NOT COMPLY</span></td>
</tr>
<tr>
<td class="text-center">3</td>
<td>NL-3</td>
<td>Office Building</td>
<td>Commercial</td>
<td class="text-center">64.5</td>
<td class="text-center">62.3</td>
<td class="text-center">58.7</td>
<td class="text-center">63.2</td>
<td class="text-center">70.0</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">4</td>
<td>NL-4</td>
<td>Facility Boundary (East)</td>
<td>Industrial</td>
<td class="text-center">68.9</td>
<td class="text-center">67.2</td>
<td class="text-center">65.6</td>
<td class="text-center">67.8</td>
<td class="text-center">70.0</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">5</td>
<td>NL-5</td>
<td>Power Generator Area</td>
<td>Industrial</td>
<td class="text-center">78.6</td>
<td class="text-center">77.5</td>
<td class="text-center">76.3</td>
<td class="text-center">77.9</td>
<td class="text-center">70.0</td>
<td class="text-center"><span class="compliance not-comply">NOT COMPLY</span></td>
</tr>
<tr>
<td class="text-center">6</td>
<td>NL-6</td>
<td>Nearest Residential Area</td>
<td>Residential</td>
<td class="text-center">57.3</td>
<td class="text-center">55.6</td>
<td class="text-center">52.1</td>
<td class="text-center">55.9</td>
<td class="text-center">55.0</td>
<td class="text-center"><span class="compliance not-comply">NOT COMPLY</span></td>
</tr>
</tbody>
</table>
<p><strong>Notes:</strong></p>
<ul>
<li>Daytime (L<sub>d</sub>): 06:00 - 18:00</li>
<li>Evening (L<sub>e</sub>): 18:00 - 22:00</li>
<li>Night (L<sub>n</sub>): 22:00 - 06:00</li>
<li>Leq 24 hour calculation: Leq = 10 × log [1/24 × (12 × 10<sup>Ld/10</sup> + 4 × 10<sup>Le/10</sup> + 8 × 10<sup>Ln/10</sup>)]</li>
</ul>
<div class="chart-container">
<p class="chart-placeholder">[Noise Level Distribution Chart - This would display a bar graph comparing measured noise levels against standards for each location]</p>
</div>
</div>
<div class="section">
<div class="section-title">5. MEASUREMENT METHOD</div>
<table>
<tr>
<th width="20%">Parameter</th>
<th width="20%">Method</th>
<th width="35%">Equipment</th>
<th width="25%">Calibration Status</th>
</tr>
<tr>
<td>Noise Level</td>
<td>SNI 7231:2009</td>
<td>Sound Level Meter Type 1 - RION NL-52 SN:12345678</td>
<td>Valid until August 15, 2024</td>
</tr>
<tr>
<td>Acoustic Calibrator</td>
<td>ANSI/ASA S1.40-2006</td>
<td>Calibrator RION NC-74 SN:87654321</td>
<td>Valid until August 15, 2024</td>
</tr>
<tr>
<td>Weather Parameters</td>
<td>In-situ measurement</td>
<td>Weather Station Kestrel 5500 SN:KW123456</td>
<td>Valid until October 10, 2024</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">6. NOISE SOURCES AND CHARACTERISTICS</div>
<table>
<tr>
<th width="15%">Location ID</th>
<th width="35%">Major Noise Sources</th>
<th width="25%">Noise Characteristics</th>
<th width="25%">Distance to Nearest Receptor</th>
</tr>
<tr>
<td>NL-1</td>
<td>Vehicle movement, loading/unloading activities</td>
<td>Intermittent</td>
<td>200 m to office building</td>
</tr>
<tr>
<td>NL-2</td>
<td>Production machinery, metal stamping, air compressors</td>
<td>Continuous, impulsive</td>
<td>150 m to office building</td>
</tr>
<tr>
<td>NL-3</td>
<td>HVAC systems, general office activities</td>
<td>Continuous, low frequency</td>
<td>Within receptor area</td>
</tr>
<tr>
<td>NL-4</td>
<td>General facility operations, traffic on adjacent road</td>
<td>Intermittent</td>
<td>100 m to residential area</td>
</tr>
<tr>
<td>NL-5</td>
<td>Power generators, cooling systems</td>
<td>Continuous, tonal</td>
<td>120 m to office building</td>
</tr>
<tr>
<td>NL-6</td>
<td>Industrial facility noise, traffic noise</td>
<td>Intermittent, background</td>
<td>Within receptor area</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">7. NOTES AND RECOMMENDATIONS</div>
<p>Based on the measurement results, the following findings and recommendations are provided:</p>
<ol>
<li>Three measurement locations exceed the noise threshold limits according to PMK RI No.2 Tahun 2023.</li>
<li>For the Production Building (NL-2) with noise level of 72.2 dB(A) (exceeding the 70.0 dB(A) standard), it is recommended to:
<ul>
<li>Install acoustic barriers or enclosures around high-noise machinery</li>
<li>Implement regular maintenance program to reduce noise from machinery</li>
<li>Provide hearing protection for workers in this area</li>
<li>Consider rescheduling noisy operations to reduce night time noise levels</li>
</ul>
</li>
<li>For the Power Generator Area (NL-5) with noise level of 77.9 dB(A) (significantly exceeding the 70.0 dB(A) standard), it is recommended to:
<ul>
<li>Install acoustic enclosures around generators</li>
<li>Add sound-absorbing materials to walls and ceilings in the generator room</li>
<li>Install silencers on air intakes and exhausts</li>
<li>Consider relocating generators further from office areas and property boundaries</li>
</ul>
</li>
<li>For the Nearest Residential Area (NL-6) with noise level of 55.9 dB(A) (slightly exceeding the 55.0 dB(A) residential standard), it is recommended to:
<ul>
<li>Construct a noise barrier or vegetative buffer along property boundary facing residential areas</li>
<li>Limit night-time operations of noisy equipment</li>
<li>Develop a noise monitoring program for the residential area boundary</li>
<li>Establish a community liaison program to address noise concerns</li>
</ul>
</li>
<li>General recommendations for the facility:
<ul>
<li>Develop and implement a comprehensive noise management plan</li>
<li>Conduct regular noise training for employees</li>
<li>Establish procedures for maintenance of equipment to minimize noise</li>
<li>Conduct follow-up measurements after implementing noise control measures</li>
</ul>
</li>
</ol>
</div>
<div class="section">
<div class="section-title">8. REGULATION REFERENCES</div>
<p>This measurement report refers to:</p>
<ol>
<li>Peraturan Menteri Kesehatan Republik Indonesia Nomor 2 Tahun 2023 tentang Standar Baku Mutu Kesehatan Lingkungan dan Persyaratan Kesehatan</li>
<li>SNI 7231:2009 regarding Environmental Noise Measurement Methods</li>
<li>Keputusan Menteri Lingkungan Hidup No. 48 Tahun 1996 tentang Baku Tingkat Kebisingan</li>
</ol>
</div>
<div class="footer clearfix">
<p>Report Issue Date: June 15, 2024</p>
<p>This report is only valid for the conditions during measurement and may not be reproduced partially without written approval from the laboratory.</p>
<div class="signature">
<p>Analyst</p>
<div class="signature-line"></div>
<p>Dina Wijaya</p>
<p>Environmental Analyst</p>
</div>
<div class="signature">
<p>Verified by</p>
<div class="signature-line"></div>
<p>Hendra Wijaya</p>
<p>Testing Supervisor</p>
</div>
<div class="signature">
<p>Approved by</p>
<div class="signature-line"></div>
<p>Farida Nurhasanah</p>
<p>Laboratory Manager</p>
</div>
</div>
<div style="text-align: center; margin-top: 50px; font-size: 10px;">
<p>*END OF REPORT*</p>
<p>Page 1 of 1</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,289 @@
-- Database Structure and Sample Data for Total Particulate Measurement
-- Based on PMK RI No.2 Tahun 2023
-- ------------------------------------------------------------------------------
-- Master Tables - Particulate Specific
-- ------------------------------------------------------------------------------
-- Master Area Types
CREATE TABLE IF NOT EXISTS master_area_types (
area_type_id INT PRIMARY KEY,
area_type_name VARCHAR(100) NOT NULL,
description TEXT,
status BOOLEAN DEFAULT TRUE,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50)
);
-- Master Particulate Standards
CREATE TABLE IF NOT EXISTS master_particulate_standards (
standard_id INT PRIMARY KEY,
regulation_id INT NOT NULL,
area_type_id INT NOT NULL,
parameter_code VARCHAR(20) NOT NULL, -- TSP, PM10, PM2.5
standard_value DECIMAL(7, 2) NOT NULL,
unit VARCHAR(20) DEFAULT 'μg/Nm³',
averaging_time VARCHAR(50),
description TEXT,
status BOOLEAN DEFAULT TRUE,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50),
FOREIGN KEY (regulation_id) REFERENCES master_regulations(regulation_id),
FOREIGN KEY (area_type_id) REFERENCES master_area_types(area_type_id)
);
-- Master Particulate Measurement Methods
CREATE TABLE IF NOT EXISTS master_particulate_methods (
method_id INT PRIMARY KEY,
method_code VARCHAR(50) NOT NULL,
method_name VARCHAR(255) NOT NULL,
parameter_code VARCHAR(20) NOT NULL, -- TSP, PM10, PM2.5
description TEXT,
standard_reference VARCHAR(100),
status BOOLEAN DEFAULT TRUE,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50)
);
-- Master Particulate Measurement Equipment
CREATE TABLE IF NOT EXISTS master_particulate_equipment (
equipment_id INT PRIMARY KEY,
equipment_code VARCHAR(20) NOT NULL,
equipment_name VARCHAR(100) NOT NULL,
equipment_type VARCHAR(50),
brand VARCHAR(100),
model VARCHAR(100),
serial_number VARCHAR(100),
parameter_measured VARCHAR(100), -- TSP, PM10, PM2.5, Multi-parameter
specifications TEXT,
flow_rate VARCHAR(50),
filter_type VARCHAR(100),
calibration_date DATE,
next_calibration_date DATE,
calibration_status VARCHAR(20),
certificate_file VARCHAR(255),
status BOOLEAN DEFAULT TRUE,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50)
);
-- ------------------------------------------------------------------------------
-- Transaction Tables - Particulate Specific
-- ------------------------------------------------------------------------------
-- Particulate Sampling Plan
CREATE TABLE IF NOT EXISTS trx_particulate_sampling_plan (
sampling_plan_id INT PRIMARY KEY,
sampling_plan_code VARCHAR(50) NOT NULL,
project_name VARCHAR(255) NOT NULL,
client_id INT NOT NULL,
planned_sampling_date DATE NOT NULL,
sampling_location TEXT NOT NULL,
point_count INT,
parameters VARCHAR(100), -- Comma separated list: TSP, PM10, PM2.5
approval_status VARCHAR(20) DEFAULT 'DRAFT',
notes TEXT,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50)
);
-- Particulate Measurement Results - Header
CREATE TABLE IF NOT EXISTS trx_particulate_measurement_results (
measurement_id INT PRIMARY KEY,
sampling_plan_id INT NOT NULL,
report_code VARCHAR(50) NOT NULL,
sampling_date DATE NOT NULL,
start_time TIME,
end_time TIME,
weather_condition VARCHAR(100),
temperature DECIMAL(5, 2),
humidity DECIMAL(5, 2),
wind_speed DECIMAL(5, 2),
wind_direction VARCHAR(10),
pressure DECIMAL(7, 2),
sampling_officers VARCHAR(100),
report_status VARCHAR(20) DEFAULT 'DRAFT',
notes TEXT,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50),
FOREIGN KEY (sampling_plan_id) REFERENCES trx_particulate_sampling_plan(sampling_plan_id)
);
-- Particulate Measurement Details
CREATE TABLE IF NOT EXISTS trx_particulate_measurement_details (
measurement_detail_id INT PRIMARY KEY,
measurement_id INT NOT NULL,
point_code VARCHAR(20) NOT NULL,
location_name VARCHAR(255) NOT NULL,
area_description TEXT,
area_type_id INT NOT NULL,
latitude DECIMAL(10, 6),
longitude DECIMAL(10, 6),
sampling_height DECIMAL(4, 2),
sampling_duration DECIMAL(5, 2),
parameter_code VARCHAR(20) NOT NULL, -- TSP, PM10, PM2.5
method_id INT NOT NULL,
equipment_id INT NOT NULL,
filter_id VARCHAR(50),
initial_weight DECIMAL(10, 5),
final_weight DECIMAL(10, 5),
flow_rate DECIMAL(7, 2),
volume_sampled DECIMAL(10, 2),
result_value DECIMAL(8, 2) NOT NULL,
standard_id INT NOT NULL,
compliance_status VARCHAR(20),
major_sources TEXT,
recommendations TEXT,
notes TEXT,
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50),
FOREIGN KEY (measurement_id) REFERENCES trx_particulate_measurement_results(measurement_id),
FOREIGN KEY (area_type_id) REFERENCES master_area_types(area_type_id),
FOREIGN KEY (method_id) REFERENCES master_particulate_methods(method_id),
FOREIGN KEY (equipment_id) REFERENCES master_particulate_equipment(equipment_id),
FOREIGN KEY (standard_id) REFERENCES master_particulate_standards(standard_id)
);
-- Dust Control Recommendations
CREATE TABLE IF NOT EXISTS trx_dust_control_recommendations (
recommendation_id INT PRIMARY KEY,
measurement_detail_id INT NOT NULL,
control_type VARCHAR(50) NOT NULL, -- Engineering, Administrative, PPE
control_description TEXT NOT NULL,
priority INT,
estimated_cost DECIMAL(12, 2),
estimated_reduction DECIMAL(5, 1),
implementation_status VARCHAR(20) DEFAULT 'PLANNED',
input_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
input_user VARCHAR(50),
FOREIGN KEY (measurement_detail_id) REFERENCES trx_particulate_measurement_details(measurement_detail_id)
);
-- ------------------------------------------------------------------------------
-- Sample Data Insertion - Master Tables
-- ------------------------------------------------------------------------------
-- Insert Data Master Area Types
INSERT INTO master_area_types (area_type_id, area_type_name, description, status, input_user)
VALUES
(1, 'Industrial Areas', 'Manufacturing and industrial activity areas', TRUE, 'admin'),
(2, 'Residential Areas', 'Residential housing and settlements', TRUE, 'admin'),
(3, 'Office and Commercial Areas', 'Office buildings and commercial areas', TRUE, 'admin'),
(4, 'Parks and Green Areas', 'Public parks and green spaces', TRUE, 'admin'),
(5, 'Sensitive Areas', 'Hospitals, schools, and other sensitive locations', TRUE, 'admin');
-- Insert Data Master Particulate Standards
INSERT INTO master_particulate_standards (standard_id, regulation_id, area_type_id, parameter_code, standard_value, unit, averaging_time, description, status, input_user)
VALUES
-- TSP/Total Particulate Matter Standards
(1, 1, 1, 'TSP', 230.00, 'μg/Nm³', '24 hours', 'Industrial areas TSP standard', TRUE, 'admin'),
(2, 1, 2, 'TSP', 90.00, 'μg/Nm³', '24 hours', 'Residential areas TSP standard', TRUE, 'admin'),
(3, 1, 3, 'TSP', 90.00, 'μg/Nm³', '24 hours', 'Office and commercial areas TSP standard', TRUE, 'admin'),
(4, 1, 4, 'TSP', 90.00, 'μg/Nm³', '24 hours', 'Parks and green areas TSP standard', TRUE, 'admin'),
(5, 1, 5, 'TSP', 90.00, 'μg/Nm³', '24 hours', 'Sensitive areas TSP standard', TRUE, 'admin'),
-- PM10 Standards
(6, 1, 1, 'PM10', 150.00, 'μg/Nm³', '24 hours', 'Industrial areas PM10 standard', TRUE, 'admin'),
(7, 1, 2, 'PM10', 75.00, 'μg/Nm³', '24 hours', 'Residential areas PM10 standard', TRUE, 'admin'),
(8, 1, 3, 'PM10', 75.00, 'μg/Nm³', '24 hours', 'Office and commercial areas PM10 standard', TRUE, 'admin'),
(9, 1, 4, 'PM10', 75.00, 'μg/Nm³', '24 hours', 'Parks and green areas PM10 standard', TRUE, 'admin'),
(10, 1, 5, 'PM10', 75.00, 'μg/Nm³', '24 hours', 'Sensitive areas PM10 standard', TRUE, 'admin'),
-- PM2.5 Standards
(11, 1, 1, 'PM2.5', 55.00, 'μg/Nm³', '24 hours', 'Industrial areas PM2.5 standard', TRUE, 'admin'),
(12, 1, 2, 'PM2.5', 55.00, 'μg/Nm³', '24 hours', 'Residential areas PM2.5 standard', TRUE, 'admin'),
(13, 1, 3, 'PM2.5', 55.00, 'μg/Nm³', '24 hours', 'Office and commercial areas PM2.5 standard', TRUE, 'admin'),
(14, 1, 4, 'PM2.5', 55.00, 'μg/Nm³', '24 hours', 'Parks and green areas PM2.5 standard', TRUE, 'admin'),
(15, 1, 5, 'PM2.5', 55.00, 'μg/Nm³', '24 hours', 'Sensitive areas PM2.5 standard', TRUE, 'admin');
-- Insert Data Master Particulate Measurement Methods
INSERT INTO master_particulate_methods (method_id, method_code, method_name, parameter_code, description, standard_reference, status, input_user)
VALUES
(1, 'SNI-7119.3-2005', 'High Volume Method for TSP', 'TSP', 'Gravimetric method for TSP using high volume sampler', 'SNI 19-7119.3-2005', TRUE, 'admin'),
(2, 'SNI-7119.15-2016', 'High Volume Method for PM10', 'PM10', 'Gravimetric method for PM10 using high volume sampler with PM10 inlet', 'SNI 19-7119.15-2016', TRUE, 'admin'),
(3, 'SNI-7119.14-2016', 'Gravimetric Method for PM2.5', 'PM2.5', 'Gravimetric method for PM2.5 using low volume sampler with PM2.5 inlet', 'SNI 19-7119.14-2016', TRUE, 'admin'),
(4, 'US-EPA-IO-2.1', 'EPA Method IO-2.1 for TSP', 'TSP', 'EPA Method for sampling TSP using high volume samplers', 'US EPA IO-2.1', TRUE, 'admin'),
(5, 'US-EPA-IO-3.1', 'EPA Method IO-3.1 for PM10', 'PM10', 'EPA Method for PM10 sampling', 'US EPA IO-3.1', TRUE, 'admin');
-- Insert Data Master Particulate Measurement Equipment
INSERT INTO master_particulate_equipment (equipment_id, equipment_code, equipment_name, equipment_type, brand, model, serial_number, parameter_measured, specifications, flow_rate, filter_type, calibration_date, next_calibration_date, calibration_status, certificate_file, status, input_user)
VALUES
(1, 'HVAS-01', 'High Volume Air Sampler', 'HVAS', 'Tisch Environmental', 'TE-5000', 'HV12345', 'TSP', 'Flow rate: 1.13-1.70 m³/min, Motor: Continuous duty brushes', '1.13-1.70 m³/min', 'Glass Fiber Filter 8×10 inch', '2024-04-05', '2025-04-05', 'VALID', '/documents/calibration/hvas_tisch_2024.pdf', TRUE, 'admin'),
(2, 'PM10-01', 'PM10 High Volume Sampler', 'PM10 HVAS', 'Tisch Environmental', 'TE-6070', 'PM10-7890', 'PM10', 'Flow rate: 1.13-1.70 m³/min, Size-selective inlet', '1.13-1.70 m³/min', 'Quartz Fiber Filter 8×10 inch', '2024-04-10', '2025-04-10', 'VALID', '/documents/calibration/pm10_tisch_2024.pdf', TRUE, 'admin'),
(3, 'PM25-01', 'Low Volume PM2.5 Sampler', 'PM2.5 LVS', 'BGI', 'PQ200', 'PQ-5678', 'PM2.5', 'Flow rate: 16.7 L/min, WINS impactor', '16.7 L/min', '47mm PTFE membrane filter', '2024-03-15', '2025-03-15', 'VALID', '/documents/calibration/pm25_bgi_2024.pdf', TRUE, 'admin'),
(4, 'MET-01', 'Weather Station', 'Weather Monitor', 'Davis', 'Vantage Pro2', 'WS78901', 'Meteorological Parameters', 'Temperature, humidity, pressure, wind speed/direction', 'N/A', 'N/A', '2024-03-15', '2025-03-15', 'VALID', '/documents/calibration/met_davis_2024.pdf', TRUE, 'admin'),
(5, 'BAL-01', 'Analytical Balance', 'Microbalance', 'Mettler Toledo', 'XPR2U', 'MT34567', 'Filter Weighing', 'Range: 0-2.1g, Readability: 0.1μg, Repeatability: 0.15μg', 'N/A', 'N/A', '2024-02-20', '2025-02-20', 'VALID', '/documents/calibration/bal_mettler_2024.pdf', TRUE, 'admin');
-- ------------------------------------------------------------------------------
-- Sample Data Insertion - Transaction Tables
-- ------------------------------------------------------------------------------
-- Sample Particulate Sampling Plan
INSERT INTO trx_particulate_sampling_plan (sampling_plan_id, sampling_plan_code, project_name, client_id, planned_sampling_date, sampling_location, point_count, parameters, approval_status, notes, input_date, input_user)
VALUES
(1, 'SP-PART-2024-002', 'Total Particulate Measurement at PT. Integrated Manufacturing Industries', 201, '2024-06-15', 'PT. Integrated Manufacturing Industries, Industrial Zone Block C5, Karawang, West Java', 6, 'TSP,PM10', 'APPROVED', 'Particulate measurement for environmental compliance monitoring', '2024-06-05 10:00:00', 'supervisor');
-- Sample Particulate Measurement Results - Header
INSERT INTO trx_particulate_measurement_results (measurement_id, sampling_plan_id, report_code, sampling_date, start_time, end_time, weather_condition, temperature, humidity, wind_speed, wind_direction, pressure, sampling_officers, report_status, notes, input_date, input_user)
VALUES
(1, 1, 'LHU/PART/06/2024/005', '2024-06-15', '08:30:00', '16:30:00', 'Sunny', 31.0, 68.0, 1.2, 'North', 760.0, 'Rudi Hartono, Siti Fauziah', 'FINAL', 'Measurement conducted during normal operations', '2024-06-15 17:00:00', 'analyst');
-- Sample Particulate Measurement Details
INSERT INTO trx_particulate_measurement_details (measurement_detail_id, measurement_id, point_code, location_name, area_description, area_type_id, latitude, longitude, sampling_height, sampling_duration, parameter_code, method_id, equipment_id, filter_id, initial_weight, final_weight, flow_rate, volume_sampled, result_value, standard_id, compliance_status, major_sources, recommendations, notes, input_date, input_user)
VALUES
-- Main Factory Entrance - TSP
(1, 1, 'TPM-1', 'Main Factory Entrance', 'Main entrance with moderate traffic', 1, -6.372500, 107.524167, 1.5, 8.0, 'TSP', 1, 1, 'GF-20240615-01', 4.52130, 4.62875, 1.15, 552.0, 215.4, 1, 'COMPLY', 'Vehicle traffic, material transport activities', '', 'Moderate traffic flow during sampling', '2024-06-15 17:05:00', 'analyst'),
-- Main Factory Entrance - PM10
(2, 1, 'TPM-1', 'Main Factory Entrance', 'Main entrance with moderate traffic', 1, -6.372500, 107.524167, 1.5, 8.0, 'PM10', 2, 2, 'QF-20240615-01', 4.48730, 4.54947, 1.15, 552.0, 112.7, 6, 'COMPLY', 'Vehicle traffic, material transport activities', '', 'PM10 fraction shows significant contribution', '2024-06-15 17:10:00', 'analyst'),
-- Production Area (Crusher Unit) - TSP
(3, 1, 'TPM-2', 'Production Area (Crusher Unit)', 'Area with crushing equipment and high dust generation', 1, -6.372778, 107.524444, 1.5, 8.0, 'TSP', 1, 1, 'GF-20240615-02', 4.51890, 4.67765, 1.15, 552.0, 287.6, 1, 'NOT_COMPLY', 'Crushing activities, material handling, conveyor transfer points', 'Install dust suppression systems, implement proper enclosure', 'Visible dust emissions during crusher operation', '2024-06-15 17:15:00', 'analyst'),
-- Production Area (Crusher Unit) - PM10
(4, 1, 'TPM-2', 'Production Area (Crusher Unit)', 'Area with crushing equipment and high dust generation', 1, -6.372778, 107.524444, 1.5, 8.0, 'PM10', 2, 2, 'QF-20240615-02', 4.49120, 4.57748, 1.15, 552.0, 156.3, 6, 'NOT_COMPLY', 'Crushing activities, material handling, conveyor transfer points', 'Install dust collection systems with adequate filtration', 'High respirable fraction indicates health concerns', '2024-06-15 17:20:00', 'analyst'),
-- Office Building - TSP
(5, 1, 'TPM-3', 'Office Building', 'Administrative office area', 3, -6.372944, 107.525000, 1.5, 8.0, 'TSP', 1, 1, 'GF-20240615-03', 4.52670, 4.57255, 1.15, 552.0, 83.1, 3, 'COMPLY', 'Limited sources, mainly from HVAC system', '', 'Indoor air quality with minimal outdoor influence', '2024-06-15 17:25:00', 'analyst'),
-- Office Building - PM10
(6, 1, 'TPM-3', 'Office Building', 'Administrative office area', 3, -6.372944, 107.525000, 1.5, 8.0, 'PM10', 2, 2, 'QF-20240615-03', 4.48950, 4.51467, 1.15, 552.0, 45.6, 8, 'COMPLY', 'Limited sources, mainly from HVAC system', '', 'Low PM10 levels indicate good air filtration', '2024-06-15 17:30:00', 'analyst'),
-- Eastern Facility Boundary - TSP
(7, 1, 'TPM-4', 'Eastern Facility Boundary', 'Eastern boundary of the facility', 1, -6.373111, 107.526111, 1.5, 8.0, 'TSP', 1, 1, 'GF-20240615-04', 4.53010, 4.62778, 1.15, 552.0, 176.8, 1, 'COMPLY', 'General facility operations, stockpiles, road dust', '', 'Unpaved areas contributing to dust levels', '2024-06-15 17:35:00', 'analyst'),
-- Eastern Facility Boundary - PM10
(8, 1, 'TPM-4', 'Eastern Facility Boundary', 'Eastern boundary of the facility', 1, -6.373111, 107.526111, 1.5, 8.0, 'PM10', 2, 2, 'QF-20240615-04', 4.49070, 4.53997, 1.15, 552.0, 89.3, 6, 'COMPLY', 'General facility operations, stockpiles, road dust', '', 'PM10 levels below industrial standard', '2024-06-15 17:40:00', 'analyst'),
-- Material Storage Area - TSP
(9, 1, 'TPM-5', 'Material Storage Area', 'Raw material storage with open piles', 1, -6.373278, 107.524722, 1.5, 8.0, 'TSP', 1, 1, 'GF-20240615-05', 4.52230, 4.67025, 1.15, 552.0, 268.2, 1, 'NOT_COMPLY', 'Raw material stockpiles, loading/unloading operations', 'Cover stockpiles, implement water spraying', 'Wind-blown dust from uncovered material piles', '2024-06-15 17:45:00', 'analyst'),
-- Material Storage Area - PM10
(10, 1, 'TPM-5', 'Material Storage Area', 'Raw material storage with open piles', 1, -6.373278, 107.524722, 1.5, 8.0, 'PM10', 2, 2, 'QF-20240615-05', 4.48870, 4.56737, 1.15, 552.0, 142.5, 6, 'COMPLY', 'Raw material stockpiles, loading/unloading operations', 'Minimize material handling during high winds', 'PM10 fraction still within limits but elevated', '2024-06-15 17:50:00', 'analyst'),
-- Nearest Residential Area - TSP
(11, 1, 'TPM-6', 'Nearest Residential Area', 'Residential area near the industrial facility', 2, -6.374167, 107.527222, 1.5, 8.0, 'TSP', 1, 1, 'GF-20240615-06', 4.52450, 4.57884, 1.15, 552.0, 98.5, 2, 'NOT_COMPLY', 'Industrial facility emissions, community activities', 'Establish vegetation buffer, improve dust control', 'Residential area ~500m from facility boundary', '2024-06-15 17:55:00', 'analyst'),
-- Nearest Residential Area - PM10
(12, 1, 'TPM-6', 'Nearest Residential Area', 'Residential area near the industrial facility', 2, -6.374167, 107.527222, 1.5, 8.0, 'PM10', 2, 2, 'QF-20240615-06', 4.49210, 4.52103, 1.15, 552.0, 52.4, 7, 'COMPLY', 'Industrial facility emissions, community activities', '', 'PM10 levels within residential standard', '2024-06-15 18:00:00', 'analyst');
-- Sample Dust Control Recommendations
INSERT INTO trx_dust_control_recommendations (recommendation_id, measurement_detail_id, control_type, control_description, priority, estimated_cost, estimated_reduction, implementation_status, input_date, input_user)
VALUES
-- Recommendations for Production Area (Crusher Unit)
(1, 3, 'Engineering Control', 'Installation of water spray systems at crusher loading and discharge points', 1, 45000000.00, 30.0, 'PLANNED', '2024-06-20 09:00:00', 'analyst'),
(2, 3, 'Engineering Control', 'Enclosure of crushing and screening equipment with appropriate dust collection', 1, 120000000.00, 50.0, 'PLANNED', '2024-06-20 09:05:00', 'analyst'),
(3, 3, 'Administrative Control', 'Implement preventive maintenance program for dust collection systems', 2, 0.00, 15.0, 'PLANNED', '2024-06-20 09:10:00', 'analyst'),
(4, 4, 'PPE', 'Provision of N95 respirators for workers in crushing area', 1, 15000000.00, 0.0, 'PLANNED', '2024-06-20 09:15:00', 'analyst'),
-- Recommendations for Material Storage Area
(5, 9, 'Engineering Control', 'Installation of wind barriers around material storage area', 1, 75000000.00, 25.0, 'PLANNED', '2024-06-20 09:20:00', 'analyst'),
(6, 9, 'Engineering Control', 'Coverage of stockpiles with tarpaulins or other appropriate materials', 1, 30000000.00, 35.0, 'PLANNED', '2024-06-20 09:25:00', 'analyst'),
(7, 9, 'Engineering Control', 'Installation of fixed water sprinkler system for storage area', 2, 60000000.00, 30.0, 'PLANNED', '2024-06-20 09:30:00', 'analyst'),
(8, 9, 'Administrative Control', 'Implement SOP for minimizing drop heights during material transfer', 1, 5000000.00, 10.0, 'PLANNED', '2024-06-20 09:35:00', 'analyst'),
-- Recommendations for Nearest Residential Area
(9, 11, 'Engineering Control', 'Establishment of vegetation buffer zone between facility and residential areas', 1, 90000000.00, 15.0, 'PLANNED', '2024-06-20 09:40:00', 'analyst'),
(10, 11, 'Engineering Control', 'Paving of unpaved roads near residential boundary', 2, 120000000.00, 20.0, 'PLANNED', '2024-06-20 09:45:00', 'analyst'),
(11, 11, 'Administrative Control', 'Implementation of community notification system for high-dust activities', 1, 25000000.00, 0.0, 'PLANNED', '2024-06-20 09:50:00', 'analyst'),
(12, 11, 'Administrative Control', 'Schedule dust-generating activities based on wind direction and speed', 1, 0.00, 10.0, 'PLANNED', '2024-06-20 09:55:00', 'analyst');

View File

@@ -0,0 +1,534 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Total Particulate Measurement Report</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
color: #333;
font-size: 12px;
}
.container {
width: 210mm;
margin: 0 auto;
padding: 10mm;
box-sizing: border-box;
}
.header {
border-bottom: 2px solid #333;
padding-bottom: 10px;
margin-bottom: 20px;
}
.logo {
float: left;
max-height: 80px;
}
.lab-info {
float: right;
text-align: right;
}
.title {
text-align: center;
margin: 20px 0;
clear: both;
}
.title h1 {
margin: 0;
font-size: 18px;
font-weight: bold;
}
.title h2 {
margin: 5px 0;
font-size: 16px;
font-weight: normal;
}
.title h3 {
margin: 5px 0;
font-size: 14px;
font-weight: normal;
}
.clearfix::after {
content: "";
clear: both;
display: table;
}
.section {
margin-bottom: 15px;
}
.section-title {
font-weight: bold;
margin-bottom: 5px;
font-size: 13px;
background-color: #f0f0f0;
padding: 5px;
border-left: 3px solid #333;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 15px;
}
table, th, td {
border: 1px solid #999;
}
th {
background-color: #f0f0f0;
padding: 8px 5px;
text-align: center;
font-weight: bold;
}
td {
padding: 8px 5px;
text-align: left;
}
.text-center {
text-align: center;
}
.text-right {
text-align: right;
}
.footer {
margin-top: 30px;
border-top: 1px solid #999;
padding-top: 10px;
}
.signature {
float: right;
width: 33%;
text-align: center;
margin-top: 20px;
}
.signature-line {
border-top: 1px solid #333;
margin-top: 50px;
margin-left: auto;
margin-right: auto;
width: 80%;
}
.compliance {
padding: 3px;
border-radius: 3px;
font-weight: bold;
}
.comply {
background-color: #dff0d8;
color: #3c763d;
}
.not-comply {
background-color: #f2dede;
color: #a94442;
}
.watermark {
position: absolute;
top: 50%;
left: 25%;
transform: rotate(-45deg);
transform-origin: 50% 50%;
opacity: 0.1;
font-size: 100px;
z-index: -1;
color: #000;
white-space: nowrap;
}
.explanation-box {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 10px;
margin: 10px 0;
font-style: italic;
}
.standard-table {
margin-top: 10px;
width: 100%;
}
.chart-container {
width: 100%;
height: 300px;
margin: 20px 0;
border: 1px solid #ddd;
padding: 10px;
box-sizing: border-box;
background-color: #f9f9f9;
text-align: center;
}
.chart-placeholder {
font-style: italic;
color: #777;
}
@page {
size: A4;
margin: 0;
}
@media print {
.container {
width: 210mm;
height: 297mm;
padding: 10mm;
box-sizing: border-box;
}
}
</style>
</head>
<body>
<div class="container">
<div class="watermark">LABORATORY REPORT</div>
<div class="header clearfix">
<img src="lab_logo.png" alt="Laboratory Logo" class="logo">
<div class="lab-info">
<h2>ENVIRONMENTAL TESTING LABORATORY</h2>
<p>Jl. Laboratorium Lingkungan No. 123, Jakarta</p>
<p>Phone: (021) 555-1234, Email: info@env-lab.co.id</p>
<p>ACCREDITED KAN: LP-001-IDN</p>
</div>
</div>
<div class="title">
<h1>TOTAL PARTICULATE MATTER (TPM) MEASUREMENT REPORT</h1>
<h2>REPORT NUMBER: LHU/PART/06/2024/005</h2>
<h3>Based on PMK RI No.2 Tahun 2023</h3>
</div>
<div class="section">
<div class="section-title">1. CLIENT INFORMATION</div>
<table>
<tr>
<td width="30%">Client Name</td>
<td width="70%">PT. Industri Manufaktur Terpadu</td>
</tr>
<tr>
<td>Address</td>
<td>Jl. Kawasan Industri Blok C5, Karawang, Jawa Barat</td>
</tr>
<tr>
<td>Contact Person</td>
<td>Ir. Budi Pratama (Environmental Manager)</td>
</tr>
<tr>
<td>Request Number</td>
<td>REQ/2024/06/008</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">2. MEASUREMENT INFORMATION</div>
<table>
<tr>
<td width="30%">Measurement Date</td>
<td width="70%">June 15, 2024</td>
</tr>
<tr>
<td>Measurement Time</td>
<td>08:30 - 16:30 WIB</td>
</tr>
<tr>
<td>Measurement Officers</td>
<td>Rudi Hartono (Sampling Officer), Siti Fauziah (Technical Analyst)</td>
</tr>
<tr>
<td>Weather Condition</td>
<td>Sunny, 31°C, Humidity 68%, Wind speed 1.2 m/s</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">3. PARTICULATE MATTER QUALITY STANDARDS</div>
<div class="explanation-box">
<p>According to PMK RI No.2 Tahun 2023, total particulate matter (TPM) standards are as follows:</p>
<table class="standard-table">
<tr>
<th width="40%">Area Type</th>
<th width="30%">TPM Standard</th>
<th width="30%">Averaging Time</th>
</tr>
<tr>
<td>Industrial Areas</td>
<td class="text-center">230 μg/Nm³</td>
<td class="text-center">24 hours</td>
</tr>
<tr>
<td>Residential Areas</td>
<td class="text-center">90 μg/Nm³</td>
<td class="text-center">24 hours</td>
</tr>
<tr>
<td>Office and Commercial Areas</td>
<td class="text-center">90 μg/Nm³</td>
<td class="text-center">24 hours</td>
</tr>
<tr>
<td>Parks and Green Areas</td>
<td class="text-center">90 μg/Nm³</td>
<td class="text-center">24 hours</td>
</tr>
<tr>
<td>Sensitive Areas (Hospitals, Schools)</td>
<td class="text-center">90 μg/Nm³</td>
<td class="text-center">24 hours</td>
</tr>
</table>
<p><strong>Note:</strong> μg/Nm³ = micrograms per normal cubic meter at 25°C and 760 mmHg</p>
</div>
</div>
<div class="section">
<div class="section-title">4. MEASUREMENT RESULTS</div>
<table>
<thead>
<tr>
<th rowspan="2">No.</th>
<th rowspan="2">Sampling Location</th>
<th rowspan="2">Area Type</th>
<th rowspan="2">Sampling Time<br>(hours)</th>
<th colspan="2">Parameters</th>
<th rowspan="2">Standard<br>(μg/Nm³)</th>
<th rowspan="2">Compliance Status</th>
</tr>
<tr>
<th>TSP/TPM<br>(μg/Nm³)</th>
<th>PM10<br>(μg/Nm³)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="text-center">1</td>
<td>TPM-1</td>
<td>Main Factory Entrance</td>
<td class="text-center">8</td>
<td class="text-center">215.4</td>
<td class="text-center">112.7</td>
<td class="text-center">230</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">2</td>
<td>TPM-2</td>
<td>Production Area (Crusher Unit)</td>
<td class="text-center">8</td>
<td class="text-center">287.6</td>
<td class="text-center">156.3</td>
<td class="text-center">230</td>
<td class="text-center"><span class="compliance not-comply">NOT COMPLY</span></td>
</tr>
<tr>
<td class="text-center">3</td>
<td>TPM-3</td>
<td>Office Building</td>
<td class="text-center">8</td>
<td class="text-center">83.1</td>
<td class="text-center">45.6</td>
<td class="text-center">90</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">4</td>
<td>TPM-4</td>
<td>Eastern Facility Boundary</td>
<td class="text-center">8</td>
<td class="text-center">176.8</td>
<td class="text-center">89.3</td>
<td class="text-center">230</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">5</td>
<td>TPM-5</td>
<td>Material Storage Area</td>
<td class="text-center">8</td>
<td class="text-center">268.2</td>
<td class="text-center">142.5</td>
<td class="text-center">230</td>
<td class="text-center"><span class="compliance not-comply">NOT COMPLY</span></td>
</tr>
<tr>
<td class="text-center">6</td>
<td>TPM-6</td>
<td>Nearest Residential Area</td>
<td class="text-center">8</td>
<td class="text-center">98.5</td>
<td class="text-center">52.4</td>
<td class="text-center">90</td>
<td class="text-center"><span class="compliance not-comply">NOT COMPLY</span></td>
</tr>
</tbody>
</table>
<p><strong>Notes:</strong></p>
<ul>
<li>TSP/TPM = Total Suspended Particulates/Total Particulate Matter</li>
<li>PM10 = Particulate Matter with diameter ≤ 10 μm</li>
<li>Results are the average of measurements taken throughout the sampling period</li>
<li>All measurements have been corrected to standard conditions (25°C, 760 mmHg)</li>
</ul>
<div class="chart-container">
<p class="chart-placeholder">[Particulate Concentration Chart - This would display a bar graph comparing measured particulate levels against standards for each location]</p>
</div>
</div>
<div class="section">
<div class="section-title">5. MEASUREMENT METHOD</div>
<table>
<tr>
<th width="20%">Parameter</th>
<th width="20%">Method</th>
<th width="35%">Equipment</th>
<th width="25%">Calibration Status</th>
</tr>
<tr>
<td>Total Particulate Matter (TPM)</td>
<td>SNI 19-7119.3-2005</td>
<td>High Volume Air Sampler (HVAS) Tisch TE-5000, SN: HV12345</td>
<td>Valid until October 5, 2024</td>
</tr>
<tr>
<td>PM10</td>
<td>SNI 19-7119.15-2016</td>
<td>PM10 Hi-Vol Sampler Tisch TE-6070, SN: PM10-7890</td>
<td>Valid until October 10, 2024</td>
</tr>
<tr>
<td>Weather Parameters</td>
<td>Direct measurement</td>
<td>Weather Station Davis Vantage Pro2, SN: WS78901</td>
<td>Valid until September 15, 2024</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">6. PARTICULATE SOURCES AND METEOROLOGICAL CONDITIONS</div>
<table>
<tr>
<th width="15%">Location ID</th>
<th width="35%">Major Particulate Sources</th>
<th width="25%">Wind Direction</th>
<th width="25%">Additional Observations</th>
</tr>
<tr>
<td>TPM-1</td>
<td>Vehicle traffic, material transport activities</td>
<td>Northwest (NW)</td>
<td>Traffic intensity: medium</td>
</tr>
<tr>
<td>TPM-2</td>
<td>Crushing activities, material handling, conveyor transfer points</td>
<td>North (N)</td>
<td>Visible dust emissions during crusher operation</td>
</tr>
<tr>
<td>TPM-3</td>
<td>Limited sources, mainly from HVAC system</td>
<td>East (E)</td>
<td>Indoor air quality; minimal outdoor influence</td>
</tr>
<tr>
<td>TPM-4</td>
<td>General facility operations, stockpiles, road dust</td>
<td>Southeast (SE)</td>
<td>Unpaved areas contributing to dust</td>
</tr>
<tr>
<td>TPM-5</td>
<td>Raw material stockpiles, loading/unloading operations</td>
<td>Southwest (SW)</td>
<td>Wind-blown dust from uncovered material piles</td>
</tr>
<tr>
<td>TPM-6</td>
<td>Industrial facility emissions, community activities</td>
<td>West (W)</td>
<td>Residential area ~500m from facility boundary</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">7. NOTES AND RECOMMENDATIONS</div>
<p>Based on the measurement results, the following findings and recommendations are provided:</p>
<ol>
<li>Three measurement locations exceed the particulate threshold limits according to PMK RI No.2 Tahun 2023.</li>
<li>For the Production Area (Crusher Unit) with TPM level of 287.6 μg/Nm³ (exceeding the 230 μg/Nm³ standard), it is recommended to:
<ul>
<li>Install additional dust suppression systems (water sprays) at crusher loading and discharge points</li>
<li>Implement proper enclosure of crushing and screening equipment</li>
<li>Increase frequency of dust collection system maintenance</li>
<li>Consider installation of local exhaust ventilation with dust collectors</li>
</ul>
</li>
<li>For the Material Storage Area with TPM level of 268.2 μg/Nm³ (exceeding the 230 μg/Nm³ standard), it is recommended to:
<ul>
<li>Cover or enclose raw material stockpiles to prevent wind erosion</li>
<li>Implement regular water spraying of storage areas during dry conditions</li>
<li>Establish windbreaks around storage areas</li>
<li>Minimize drop heights during material transfer operations</li>
</ul>
</li>
<li>For the Nearest Residential Area with TPM level of 98.5 μg/Nm³ (exceeding the 90 μg/Nm³ residential standard), it is recommended to:
<ul>
<li>Establish a vegetation buffer zone between the facility and residential areas</li>
<li>Improve dust control measures at the facility boundaries nearest to residential areas</li>
<li>Schedule dust-generating activities to consider wind direction and speed</li>
<li>Implement a community complaint response system and regular monitoring program</li>
</ul>
</li>
<li>General recommendations for the facility:
<ul>
<li>Develop and implement a comprehensive dust management plan</li>
<li>Pave unpaved roads and implement regular road cleaning</li>
<li>Install wheel washing stations at facility exits</li>
<li>Train employees on dust control practices and proper equipment operation</li>
<li>Conduct follow-up measurements after implementing dust control measures</li>
</ul>
</li>
</ol>
</div>
<div class="section">
<div class="section-title">8. REGULATION REFERENCES</div>
<p>This measurement report refers to:</p>
<ol>
<li>Peraturan Menteri Kesehatan Republik Indonesia Nomor 2 Tahun 2023 tentang Standar Baku Mutu Kesehatan Lingkungan dan Persyaratan Kesehatan</li>
<li>SNI 19-7119.3-2005 regarding Ambient Air - Part 3: Method for Sampling and Measurement of Total Suspended Particulate Using High Volume Air Sampler</li>
<li>SNI 19-7119.15-2016 regarding Ambient Air Quality - Part 15: Method for Sampling and Measurement of PM10 Using High Volume Air Sampler with PM10 Inlet</li>
</ol>
</div>
<div class="footer clearfix">
<p>Report Issue Date: June 20, 2024</p>
<p>This report is only valid for the conditions during measurement and may not be reproduced partially without written approval from the laboratory.</p>
<div class="signature">
<p>Analyst</p>
<div class="signature-line"></div>
<p>Siti Fauziah</p>
<p>Environmental Analyst</p>
</div>
<div class="signature">
<p>Verified by</p>
<div class="signature-line"></div>
<p>Hendra Wijaya</p>
<p>Testing Supervisor</p>
</div>
<div class="signature">
<p>Approved by</p>
<div class="signature-line"></div>
<p>Farida Nurhasanah</p>
<p>Laboratory Manager</p>
</div>
</div>
<div style="text-align: center; margin-top: 50px; font-size: 10px;">
<p>*END OF REPORT*</p>
<p>Page 1 of 1</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,524 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Total Particulate Matter Measurement Report</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
color: #333;
font-size: 12px;
}
.container {
width: 210mm;
margin: 0 auto;
padding: 10mm;
box-sizing: border-box;
}
.header {
border-bottom: 2px solid #333;
padding-bottom: 10px;
margin-bottom: 20px;
}
.logo {
float: left;
max-height: 80px;
}
.lab-info {
float: right;
text-align: right;
}
.title {
text-align: center;
margin: 20px 0;
clear: both;
}
.title h1 {
margin: 0;
font-size: 18px;
font-weight: bold;
}
.title h2 {
margin: 5px 0;
font-size: 16px;
font-weight: normal;
}
.title h3 {
margin: 5px 0;
font-size: 14px;
font-weight: normal;
}
.clearfix::after {
content: "";
clear: both;
display: table;
}
.section {
margin-bottom: 15px;
}
.section-title {
font-weight: bold;
margin-bottom: 5px;
font-size: 13px;
background-color: #f0f0f0;
padding: 5px;
border-left: 3px solid #333;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 15px;
}
table, th, td {
border: 1px solid #999;
}
th {
background-color: #f0f0f0;
padding: 8px 5px;
text-align: center;
font-weight: bold;
}
td {
padding: 8px 5px;
text-align: left;
}
.text-center {
text-align: center;
}
.text-right {
text-align: right;
}
.footer {
margin-top: 30px;
border-top: 1px solid #999;
padding-top: 10px;
}
.signature {
float: right;
width: 33%;
text-align: center;
margin-top: 20px;
}
.signature-line {
border-top: 1px solid #333;
margin-top: 50px;
margin-left: auto;
margin-right: auto;
width: 80%;
}
.compliance {
padding: 3px;
border-radius: 3px;
font-weight: bold;
}
.comply {
background-color: #dff0d8;
color: #3c763d;
}
.not-comply {
background-color: #f2dede;
color: #a94442;
}
.watermark {
position: absolute;
top: 50%;
left: 25%;
transform: rotate(-45deg);
transform-origin: 50% 50%;
opacity: 0.1;
font-size: 100px;
z-index: -1;
color: #000;
white-space: nowrap;
}
.explanation-box {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 10px;
margin: 10px 0;
font-style: italic;
}
.standard-table {
margin-top: 10px;
width: 100%;
}
.chart-container {
width: 100%;
height: 300px;
margin: 20px 0;
border: 1px solid #ddd;
padding: 10px;
box-sizing: border-box;
background-color: #f9f9f9;
text-align: center;
}
.chart-placeholder {
font-style: italic;
color: #777;
}
@page {
size: A4;
margin: 0;
}
@media print {
.container {
width: 210mm;
height: 297mm;
padding: 10mm;
box-sizing: border-box;
}
}
</style>
</head>
<body>
<div class="container">
<div class="watermark">LABORATORY REPORT</div>
<div class="header clearfix">
<img src="lab_logo.png" alt="Laboratory Logo" class="logo">
<div class="lab-info">
<h2>ENVIRONMENTAL TESTING LABORATORY</h2>
<p>Jl. Laboratorium Lingkungan No. 123, Jakarta</p>
<p>Phone: (021) 555-1234, Email: info@env-lab.co.id</p>
<p>ACCREDITED KAN: LP-001-IDN</p>
</div>
</div>
<div class="title">
<h1>TOTAL PARTICULATE MATTER MEASUREMENT REPORT</h1>
<h2>REPORT NUMBER: LHU/TPM/06/2024/005</h2>
<h3>Based on PMK RI No.2 Tahun 2023</h3>
</div>
<div class="section">
<div class="section-title">1. CLIENT INFORMATION</div>
<table>
<tr>
<td width="30%">Client Name</td>
<td width="70%">PT. Industrial Manufacturing Company</td>
</tr>
<tr>
<td>Address</td>
<td>Jl. Industrial Zone Block D7, Bekasi, West Java</td>
</tr>
<tr>
<td>Contact Person</td>
<td>Ir. Ahmad Sanjaya (EHS Manager)</td>
</tr>
<tr>
<td>Request Number</td>
<td>REQ/2024/06/012</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">2. MEASUREMENT INFORMATION</div>
<table>
<tr>
<td width="30%">Measurement Date</td>
<td width="70%">June 15, 2024</td>
</tr>
<tr>
<td>Measurement Time</td>
<td>09:00 - 15:00 WIB</td>
</tr>
<tr>
<td>Measurement Officers</td>
<td>Budi Santoso (Sampling Officer), Lisa Anggraini (Technical Analyst)</td>
</tr>
<tr>
<td>Weather Condition</td>
<td>Partly Cloudy, 29°C, Humidity 68%, Wind speed 1.2 m/s</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">3. TOTAL PARTICULATE MATTER QUALITY STANDARDS</div>
<div class="explanation-box">
<p>According to PMK RI No.2 Tahun 2023, Total Suspended Particulate (TSP) standards are as follows:</p>
<table class="standard-table">
<tr>
<th width="40%">Parameter</th>
<th width="30%">Standard Value</th>
<th width="30%">Time Unit</th>
</tr>
<tr>
<td>Total Suspended Particulate (TSP)</td>
<td class="text-center">90 µg/m³</td>
<td class="text-center">24 hours</td>
</tr>
<tr>
<td>PM<sub>10</sub></td>
<td class="text-center">75 µg/m³</td>
<td class="text-center">24 hours</td>
</tr>
<tr>
<td>PM<sub>2.5</sub></td>
<td class="text-center">55 µg/m³</td>
<td class="text-center">24 hours</td>
</tr>
</table>
<p><strong>Note:</strong> TSP = Total Suspended Particulate, PM<sub>10</sub> = Particulate Matter with diameter ≤ 10 µm, PM<sub>2.5</sub> = Particulate Matter with diameter ≤ 2.5 µm</p>
</div>
</div>
<div class="section">
<div class="section-title">4. MEASUREMENT RESULTS</div>
<table>
<thead>
<tr>
<th rowspan="2">No.</th>
<th rowspan="2">Sampling Location</th>
<th rowspan="2">Location Description</th>
<th colspan="3">Particulate Matter Concentration</th>
<th rowspan="2">Standard<br>µg/m³</th>
<th rowspan="2">Compliance Status</th>
</tr>
<tr>
<th>TSP<br>(µg/m³)</th>
<th>PM<sub>10</sub><br>(µg/m³)</th>
<th>PM<sub>2.5</sub><br>(µg/m³)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="text-center">1</td>
<td>TPM-1</td>
<td>Main Factory Entrance</td>
<td class="text-center">76.4</td>
<td class="text-center">62.7</td>
<td class="text-center">41.2</td>
<td class="text-center">90.0</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">2</td>
<td>TPM-2</td>
<td>Production Building</td>
<td class="text-center">105.3</td>
<td class="text-center">83.1</td>
<td class="text-center">48.6</td>
<td class="text-center">90.0</td>
<td class="text-center"><span class="compliance not-comply">NOT COMPLY</span></td>
</tr>
<tr>
<td class="text-center">3</td>
<td>TPM-3</td>
<td>Office Building</td>
<td class="text-center">52.8</td>
<td class="text-center">37.4</td>
<td class="text-center">22.3</td>
<td class="text-center">90.0</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">4</td>
<td>TPM-4</td>
<td>Raw Material Storage</td>
<td class="text-center">118.7</td>
<td class="text-center">91.5</td>
<td class="text-center">62.4</td>
<td class="text-center">90.0</td>
<td class="text-center"><span class="compliance not-comply">NOT COMPLY</span></td>
</tr>
<tr>
<td class="text-center">5</td>
<td>TPM-5</td>
<td>Facility Boundary (West)</td>
<td class="text-center">81.4</td>
<td class="text-center">67.3</td>
<td class="text-center">45.8</td>
<td class="text-center">90.0</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
<tr>
<td class="text-center">6</td>
<td>TPM-6</td>
<td>Nearest Residential Area</td>
<td class="text-center">58.3</td>
<td class="text-center">42.6</td>
<td class="text-center">28.1</td>
<td class="text-center">90.0</td>
<td class="text-center"><span class="compliance comply">COMPLY</span></td>
</tr>
</tbody>
</table>
<p><strong>Notes:</strong></p>
<ul>
<li>Sampling duration: 8 hours for each location</li>
<li>TSP = Total Suspended Particulate</li>
<li>PM<sub>10</sub> = Particulate Matter with diameter ≤ 10 µm</li>
<li>PM<sub>2.5</sub> = Particulate Matter with diameter ≤ 2.5 µm</li>
</ul>
<div class="chart-container">
<p class="chart-placeholder">[Particulate Matter Concentration Chart - This would display a bar graph comparing measured TSP, PM10, and PM2.5 levels against standards for each location]</p>
</div>
</div>
<div class="section">
<div class="section-title">5. MEASUREMENT METHOD</div>
<table>
<tr>
<th width="20%">Parameter</th>
<th width="20%">Method</th>
<th width="35%">Equipment</th>
<th width="25%">Calibration Status</th>
</tr>
<tr>
<td>TSP</td>
<td>SNI 19-7119.3-2005</td>
<td>High Volume Air Sampler (HVAS) - Staplex TFIA SN:12345</td>
<td>Valid until September 10, 2024</td>
</tr>
<tr>
<td>PM<sub>10</sub></td>
<td>SNI 19-7119.3-2005</td>
<td>PM10 High Volume Sampler - Graseby-Andersen SN:PM10-789</td>
<td>Valid until August 22, 2024</td>
</tr>
<tr>
<td>PM<sub>2.5</sub></td>
<td>USEPA Compendium Method IO-2.1</td>
<td>PM2.5 Low Volume Sampler - BGI PQ200 SN:2675BG</td>
<td>Valid until July 15, 2024</td>
</tr>
<tr>
<td>Weather Parameters</td>
<td>In-situ measurement</td>
<td>Weather Station Kestrel 5500 SN:KW456789</td>
<td>Valid until October 30, 2024</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">6. PARTICULATE SOURCES AND CHARACTERISTICS</div>
<table>
<tr>
<th width="15%">Location ID</th>
<th width="35%">Major Particulate Sources</th>
<th width="25%">Wind Direction</th>
<th width="25%">Distance to Nearest Receptor</th>
</tr>
<tr>
<td>TPM-1</td>
<td>Vehicle movement, road dust</td>
<td>NE, 1.3 m/s</td>
<td>180 m to office building</td>
</tr>
<tr>
<td>TPM-2</td>
<td>Production machinery, material processing, grinding operations</td>
<td>E, 1.1 m/s</td>
<td>120 m to office building</td>
</tr>
<tr>
<td>TPM-3</td>
<td>HVAC systems, minor infiltration from outside</td>
<td>SE, 0.8 m/s</td>
<td>Within receptor area</td>
</tr>
<tr>
<td>TPM-4</td>
<td>Material handling, loading/unloading operations, powder materials</td>
<td>S, 1.2 m/s</td>
<td>160 m to office building</td>
</tr>
<tr>
<td>TPM-5</td>
<td>General facility operations, boundary conditions</td>
<td>SW, 1.4 m/s</td>
<td>90 m to residential area</td>
</tr>
<tr>
<td>TPM-6</td>
<td>Background sources, traffic, general community activities</td>
<td>W, 1.0 m/s</td>
<td>Within receptor area</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">7. NOTES AND RECOMMENDATIONS</div>
<p>Based on the measurement results, the following findings and recommendations are provided:</p>
<ol>
<li>Two measurement locations exceed the TSP threshold limits according to PMK RI No.2 Tahun 2023.</li>
<li>For the Production Building (TPM-2) with TSP level of 105.3 µg/m³ (exceeding the 90.0 µg/m³ standard), it is recommended to:
<ul>
<li>Install or upgrade dust collection systems at source points</li>
<li>Implement wet suppression methods for dust control during material processing</li>
<li>Improve ventilation systems with appropriate filters</li>
<li>Provide respiratory protection for workers in this area</li>
</ul>
</li>
<li>For the Raw Material Storage (TPM-4) with TSP level of 118.7 µg/m³ (significantly exceeding the 90.0 µg/m³ standard), it is recommended to:
<ul>
<li>Enclose storage areas for dusty raw materials</li>
<li>Implement water spraying systems for bulk material piles</li>
<li>Improve material handling procedures to minimize dust generation</li>
<li>Install windbreaks or barriers around storage areas</li>
<li>Consider covered storage solutions for dusty materials</li>
</ul>
</li>
<li>The PM<sub>10</sub> level at the Raw Material Storage (91.5 µg/m³) also exceeds the standard (75 µg/m³), indicating that fine particulates may be spreading beyond the immediate area.</li>
<li>General recommendations for the facility:
<ul>
<li>Develop and implement a comprehensive dust control management plan</li>
<li>Conduct regular maintenance on dust control equipment</li>
<li>Establish regular cleaning protocols for work areas</li>
<li>Conduct follow-up measurements after implementing dust control measures</li>
<li>Provide training for employees on dust control practices</li>
</ul>
</li>
</ol>
</div>
<div class="section">
<div class="section-title">8. REGULATION REFERENCES</div>
<p>This measurement report refers to:</p>
<ol>
<li>Peraturan Menteri Kesehatan Republik Indonesia Nomor 2 Tahun 2023 tentang Standar Baku Mutu Kesehatan Lingkungan dan Persyaratan Kesehatan</li>
<li>SNI 19-7119.3-2005 regarding Air Quality - Ambient Air - Part 3: Method of sampling and measurement of suspended particulate using High Volume Air Sampler</li>
<li>USEPA Compendium Method IO-2.1 for Sampling of Ambient Air for PM<sub>10</sub> and PM<sub>2.5</sub></li>
</ol>
</div>
<div class="footer clearfix">
<p>Report Issue Date: June 20, 2024</p>
<p>This report is only valid for the conditions during measurement and may not be reproduced partially without written approval from the laboratory.</p>
<div class="signature">
<p>Analyst</p>
<div class="signature-line"></div>
<p>Lisa Anggraini</p>
<p>Environmental Analyst</p>
</div>
<div class="signature">
<p>Verified by</p>
<div class="signature-line"></div>
<p>Rudi Hartono</p>
<p>Testing Supervisor</p>
</div>
<div class="signature">
<p>Approved by</p>
<div class="signature-line"></div>
<p>Dr. Siti Rahayu</p>
<p>Laboratory Manager</p>
</div>
</div>
<div style="text-align: center; margin-top: 50px; font-size: 10px;">
<p>*END OF REPORT*</p>
<p>Page 1 of 1</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,302 @@
-- Master Data for Work Climate Temperature Measurement System
-- Based on Ministry of Health Regulation No. 2 Year 2023
-- Master Regulations Table
CREATE TABLE master_regulations (
regulation_id INT PRIMARY KEY AUTO_INCREMENT,
regulation_code VARCHAR(50) NOT NULL,
regulation_name VARCHAR(200) NOT NULL,
issuing_authority VARCHAR(100) NOT NULL,
regulation_type VARCHAR(50),
issue_date DATE,
effective_date DATE,
description TEXT,
file_path VARCHAR(255),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Master Climate Parameters Table
CREATE TABLE master_climate_parameters (
parameter_id INT PRIMARY KEY AUTO_INCREMENT,
parameter_code VARCHAR(50) NOT NULL,
parameter_name VARCHAR(100) NOT NULL,
parameter_group VARCHAR(50), -- Physical, Chemical, Biological
unit VARCHAR(20),
analysis_method VARCHAR(100),
description TEXT,
price DECIMAL(12, 2),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Master Threshold Limit Values (TLV) Table
CREATE TABLE master_threshold_values (
threshold_id INT PRIMARY KEY AUTO_INCREMENT,
regulation_id INT,
parameter_id INT,
room_type VARCHAR(100) NOT NULL,
min_value DECIMAL(8, 2),
max_value DECIMAL(8, 2),
unit VARCHAR(20),
description TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (regulation_id) REFERENCES master_regulations(regulation_id),
FOREIGN KEY (parameter_id) REFERENCES master_climate_parameters(parameter_id)
);
-- Master Clients Table
CREATE TABLE master_clients (
client_id INT PRIMARY KEY AUTO_INCREMENT,
client_code VARCHAR(50) NOT NULL,
client_name VARCHAR(200) NOT NULL,
address TEXT,
city VARCHAR(100),
province VARCHAR(100),
postal_code VARCHAR(20),
phone_number VARCHAR(50),
email VARCHAR(100),
contact_person VARCHAR(100),
contact_position VARCHAR(100),
business_field VARCHAR(100),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Master Personnel Table (Sampling Officers, Analysts, etc.)
CREATE TABLE master_personnel (
personnel_id INT PRIMARY KEY AUTO_INCREMENT,
employee_id VARCHAR(50) NOT NULL,
name VARCHAR(100) NOT NULL,
position VARCHAR(100),
department VARCHAR(100),
email VARCHAR(100),
phone_number VARCHAR(50),
certifications TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Master Measurement Equipment Table
CREATE TABLE master_equipment (
equipment_id INT PRIMARY KEY AUTO_INCREMENT,
equipment_code VARCHAR(50) NOT NULL,
equipment_name VARCHAR(100) NOT NULL,
brand VARCHAR(100),
model VARCHAR(100),
serial_number VARCHAR(100),
calibration_date DATE,
next_calibration_date DATE,
parameter_id INT,
specifications TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (parameter_id) REFERENCES master_climate_parameters(parameter_id)
);
-- Master Sampling Locations Table
CREATE TABLE master_sampling_locations (
location_id INT PRIMARY KEY AUTO_INCREMENT,
client_id INT,
location_name VARCHAR(200) NOT NULL,
address TEXT,
latitude DECIMAL(10, 8),
longitude DECIMAL(11, 8),
room_type VARCHAR(100),
description TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (client_id) REFERENCES master_clients(client_id)
);
-- Measurement Requests Table (Request Form)
CREATE TABLE measurement_requests (
request_id INT PRIMARY KEY AUTO_INCREMENT,
request_number VARCHAR(50) NOT NULL,
client_id INT,
request_date DATE,
planned_sampling_date DATE,
contact_person VARCHAR(100),
status VARCHAR(50), -- draft, submitted, approved, scheduled, completed, canceled
notes TEXT,
created_by INT,
approved_by INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (client_id) REFERENCES master_clients(client_id),
FOREIGN KEY (created_by) REFERENCES master_personnel(personnel_id),
FOREIGN KEY (approved_by) REFERENCES master_personnel(personnel_id)
);
-- Measurement Request Details Table
CREATE TABLE measurement_request_details (
detail_id INT PRIMARY KEY AUTO_INCREMENT,
request_id INT,
parameter_id INT,
location_id INT,
points_count INT DEFAULT 1,
unit_price DECIMAL(12, 2),
subtotal DECIMAL(12, 2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (request_id) REFERENCES measurement_requests(request_id),
FOREIGN KEY (parameter_id) REFERENCES master_climate_parameters(parameter_id),
FOREIGN KEY (location_id) REFERENCES master_sampling_locations(location_id)
);
-- Measurement Schedules Table
CREATE TABLE measurement_schedules (
schedule_id INT PRIMARY KEY AUTO_INCREMENT,
schedule_number VARCHAR(50) NOT NULL,
request_id INT,
measurement_date DATE,
officer_id INT,
status VARCHAR(50), -- scheduled, completed, rescheduled, canceled
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (request_id) REFERENCES measurement_requests(request_id),
FOREIGN KEY (officer_id) REFERENCES master_personnel(personnel_id)
);
-- Test Reports Table
CREATE TABLE test_reports (
report_id INT PRIMARY KEY AUTO_INCREMENT,
report_number VARCHAR(50) NOT NULL,
request_id INT,
schedule_id INT,
measurement_date DATE,
issue_date DATE,
client_id INT,
officer_id INT,
verified_by INT,
approved_by INT,
status VARCHAR(50), -- draft, verification, approved, published, revised
page_count INT DEFAULT 1,
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (request_id) REFERENCES measurement_requests(request_id),
FOREIGN KEY (schedule_id) REFERENCES measurement_schedules(schedule_id),
FOREIGN KEY (client_id) REFERENCES master_clients(client_id),
FOREIGN KEY (officer_id) REFERENCES master_personnel(personnel_id),
FOREIGN KEY (verified_by) REFERENCES master_personnel(personnel_id),
FOREIGN KEY (approved_by) REFERENCES master_personnel(personnel_id)
);
-- Temperature Measurement Results Table
CREATE TABLE temperature_measurement_results (
result_id INT PRIMARY KEY AUTO_INCREMENT,
report_id INT,
location_id INT,
sample_code VARCHAR(50) NOT NULL,
measurement_time_start TIME,
measurement_time_end TIME,
parameter_id INT,
measurement_value DECIMAL(8, 2),
unit VARCHAR(20),
method VARCHAR(100),
threshold_id INT,
notes TEXT,
equipment_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (report_id) REFERENCES test_reports(report_id),
FOREIGN KEY (location_id) REFERENCES master_sampling_locations(location_id),
FOREIGN KEY (parameter_id) REFERENCES master_climate_parameters(parameter_id),
FOREIGN KEY (threshold_id) REFERENCES master_threshold_values(threshold_id),
FOREIGN KEY (equipment_id) REFERENCES master_equipment(equipment_id)
);
-- ================================
-- SAMPLE DATA INSERTION
-- ================================
-- Insert Regulations
INSERT INTO master_regulations (regulation_id, regulation_code, regulation_name, issuing_authority, regulation_type, issue_date, effective_date, description, file_path, is_active) VALUES
(1, 'PMK-02-2023', 'Ministry of Health Regulation No. 2 Year 2023', 'Ministry of Health of Indonesia', 'Ministerial Regulation', '2023-01-20', '2023-02-01', 'Regulation on Environmental Health Quality Standards and Health Requirements', '/documents/regulations/PMK_02_2023.pdf', TRUE),
(2, 'PERMENAKER-05-2018', 'Ministry of Manpower Regulation No. 5 Year 2018', 'Ministry of Manpower of Indonesia', 'Ministerial Regulation', '2018-04-25', '2018-05-10', 'Regulation on Occupational Safety and Health for the Work Environment', '/documents/regulations/PERMENAKER_05_2018.pdf', TRUE);
-- Insert Climate Parameters
INSERT INTO master_climate_parameters (parameter_id, parameter_code, parameter_name, parameter_group, unit, analysis_method, description, price, is_active) VALUES
(1, 'TEMP', 'Temperature', 'Physical', '°C', 'SNI 7062: 2019', 'Work climate parameter for room temperature measurement', 75000.00, TRUE),
(2, 'HUMID', 'Humidity', 'Physical', '%RH', 'SNI 7062: 2019', 'Work climate parameter for relative humidity measurement', 75000.00, TRUE),
(3, 'WBGT', 'Wet Bulb Globe Temperature', 'Physical', '°C', 'SNI 7062: 2019', 'Work climate parameter for indoor/outdoor WBGT measurement', 100000.00, TRUE),
(4, 'AIRVEL', 'Air Velocity', 'Physical', 'm/s', 'SNI 7062: 2019', 'Work climate parameter for air velocity measurement', 75000.00, TRUE);
-- Insert Threshold Values for Temperature
INSERT INTO master_threshold_values (threshold_id, regulation_id, parameter_id, room_type, min_value, max_value, unit, description, is_active) VALUES
(1, 1, 1, 'Administration', 20.00, 25.00, '°C', 'Administration and office work area', TRUE),
(2, 1, 1, 'Special Room', 18.00, 24.00, '°C', 'Server room, laboratory, etc.', TRUE),
(3, 1, 1, 'Production', 23.00, 26.00, '°C', 'Production area', TRUE),
(4, 1, 1, 'Common Area', 22.00, 28.00, '°C', 'Common area, canteen, lobby', TRUE),
(5, 1, 1, 'Restroom', 22.00, 28.00, '°C', 'Bathroom, toilet', TRUE),
(6, 1, 1, 'Storage', 16.00, 30.00, '°C', 'Storage room, warehouse', TRUE);
-- Insert Clients
INSERT INTO master_clients (client_id, client_code, client_name, address, city, province, postal_code, phone_number, email, contact_person, contact_position, business_field, is_active) VALUES
(1, 'CLT-001', 'PT. Indonesia Manufacturing Industry', 'Jl. Industry Raya No. 123', 'Jakarta', 'DKI Jakarta', '12950', '021-5551234', 'contact@manufacturingindonesia.com', 'Budi Santoso', 'HSE Manager', 'Manufacturing', TRUE),
(2, 'CLT-002', 'PT. Digital Technology Nusantara', 'Jl. Gatot Subroto Kav. 52-53', 'Jakarta', 'DKI Jakarta', '12710', '021-5552345', 'hrd@dtn.co.id', 'Siti Rahma', 'HR Director', 'Information Technology', TRUE),
(3, 'CLT-003', 'City Public Hospital', 'Jl. Health No. 45', 'Bandung', 'West Java', '40112', '022-7654321', 'info@cityhospital.go.id', 'Dr. Ahmad Hidayat', 'Director', 'Healthcare', TRUE);
-- Insert Personnel
INSERT INTO master_personnel (personnel_id, employee_id, name, position, department, email, phone_number, certifications, is_active) VALUES
(1, 'EMP-001', 'Hendra Wijaya', 'Testing Supervisor', 'Laboratory', 'hendra@lab-env.co.id', '081234567890', 'Work Environment Sampling Certification', TRUE),
(2, 'EMP-002', 'Ratna Dewi', 'Senior Analyst', 'Laboratory', 'ratna@lab-env.co.id', '081234567891', 'Laboratory Analyst Certification, General OSH Certification', TRUE),
(3, 'EMP-003', 'Deni Hermawan', 'Sampling Officer', 'Laboratory', 'deni@lab-env.co.id', '081234567892', 'Test Sample Collection Certification', TRUE),
(4, 'EMP-004', 'Farida Nurhasanah', 'Laboratory Manager', 'Laboratory', 'farida@lab-env.co.id', '081234567893', 'Quality Manager Certification, OSH Certification', TRUE);
-- Insert Measurement Equipment
INSERT INTO master_equipment (equipment_id, equipment_code, equipment_name, brand, model, serial_number, calibration_date, next_calibration_date, parameter_id, specifications, is_active) VALUES
(1, 'EQP-TH001', 'Thermohygrometer', 'Lutron', 'PHB-318', 'LT12345678', '2023-11-10', '2024-05-10', 1, 'Temperature range: -20°C to 60°C, accuracy ±0.8°C', TRUE),
(2, 'EQP-TH002', 'Thermohygrometer', 'Extech', 'RHT50', 'EX87654321', '2023-10-15', '2024-04-15', 1, 'Temperature range: -30°C to 70°C, accuracy ±0.5°C', TRUE),
(3, 'EQP-WBGT001', 'WBGT Meter', 'Lutron', 'WBGT-2010SD', 'LW12348765', '2023-11-05', '2024-05-05', 3, 'WBGT range: 15°C to 59°C, accuracy ±0.8°C', TRUE),
(4, 'EQP-ANM001', 'Anemometer', 'Lutron', 'AM-4214SD', 'LA23456789', '2023-09-20', '2024-03-20', 4, 'Air velocity range: 0.2 m/s to 35 m/s, accuracy ±2%', TRUE);
-- Insert Sampling Locations for PT. Indonesia Manufacturing Industry
INSERT INTO master_sampling_locations (location_id, client_id, location_name, address, room_type, description, is_active) VALUES
(1, 1, 'Main Meeting Room', 'Floor 2, Main Building', 'Administration', 'Meeting room with 20 person capacity', TRUE),
(2, 1, 'HR Work Area', 'Floor 2, Main Building', 'Administration', 'HR staff work area', TRUE),
(3, 1, 'Server Room', 'Floor 1, Main Building', 'Special Room', 'Server room with special cooling', TRUE),
(4, 1, 'Production Line A', 'Floor 1, Production Building', 'Production', 'Main production area line A', TRUE),
(5, 1, 'Canteen Area', 'Floor 1, Support Building', 'Common Area', 'Employee canteen with 100 person capacity', TRUE);
-- ================================
-- TRANSACTION DATA EXAMPLE
-- ================================
-- Measurement Request Example
INSERT INTO measurement_requests (request_id, request_number, client_id, request_date, planned_sampling_date, contact_person, status, notes, created_by, approved_by) VALUES
(1, 'REQ/2024/04/001', 1, '2024-04-05', '2024-04-25', 'Budi Santoso', 'approved', 'Quarterly routine measurement for work climate parameters', 3, 4);
-- Request Details
INSERT INTO measurement_request_details (detail_id, request_id, parameter_id, location_id, points_count, unit_price, subtotal) VALUES
(1, 1, 1, 1, 1, 75000.00, 75000.00),
(2, 1, 1, 2, 1, 75000.00, 75000.00),
(3, 1, 1, 3, 1, 75000.00, 75000.00),
(4, 1, 1, 4, 1, 75000.00, 75000.00),
(5, 1, 1, 5, 1, 75000.00, 75000.00);
-- Measurement Schedule
INSERT INTO measurement_schedules (schedule_id, schedule_number, request_id, measurement_date, officer_id, status, notes) VALUES
(1, 'SCH/2024/04/001', 1, '2024-04-25', 3, 'completed', 'Measurement conducted during normal operating hours');
-- Test Report
INSERT INTO test_reports (report_id, report_number, request_id, schedule_id, measurement_date, issue_date, client_id, officer_id, verified_by, approved_by, status, page_count, notes) VALUES
(1, 'LHU/TEMP/04/2024/001', 1, 1, '2024-04-25', '2024-04-28', 1, 3, 2, 4, 'published', 2, 'Measurement results show all parameters within normal limits');
-- Temperature Measurement Results
INSERT INTO temperature_measurement_results (result_id, report_id, location_id, sample_code, measurement_time_start, measurement_time_end, parameter_id, measurement_value, unit, method, threshold_id, notes, equipment_id) VALUES
(1, 1, 1, 'C2504090001', '09:00:00', '09:15:00', 1, 21.00, '°C', 'SNI 7062: 2019', 1, NULL, 1),
(2, 1, 2, 'C2504090002', '09:30:00', '09:45:00', 1, 22.00, '°C', 'SNI 7062: 2019', 1, NULL, 1),
(3, 1, 3, 'C2504090003', '10:00:00', '10:15:00', 1, 19.00, '°C', 'SNI 7062: 2019', 2, NULL, 1),
(4, 1, 4, 'C2504090004', '10:30:00', '10:45:00', 1, 26.00, '°C', 'SNI 7062: 2019', 3, NULL, 1),
(5, 1, 5, 'C2504090005', '11:00:00', '11:15:00', 1, 24.00, '°C', 'SNI 7062: 2019', 4, NULL, 1);