feat(appliance): initial release of MERICA standalone appliance v1.0.0

This commit is contained in:
2026-10-21 17:16:46 +07:00
commit 851be0cda7
144 changed files with 31135 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
version: 2
models:
- name: silver_permits_enriched
description: dbt Model silver_permits_enriched auto-registered with Shift-Left quality
assertions
config:
contract:
enforced: true
columns:
- name: company_name
data_type: character varying(255)
- name: dbt_validated_at
data_type: timestamp with time zone
- name: issued_date
data_type: date
- name: permit_id
tests:
- unique
- not_null
data_type: character varying(50)
- name: permit_number
tests:
- unique
data_type: character varying(50)
- name: permit_type
data_type: character varying(50)
- name: status
tests:
- not_null
data_type: character varying(50)
- name: updated_at
tests:
- not_null
data_type: timestamp with time zone
@@ -0,0 +1,31 @@
-- dbt Silver Cleansed CEMS Telemetry Enriched with Master Sources
SELECT
t.log_id,
t.telemetry_timestamp,
t.source_id,
s.facility_name,
s.industry_sector,
s.chimney_code,
s.region_zone,
t.so2_mg_nm3,
s.max_so2_limit_mg_nm3,
t.nox_mg_nm3,
s.max_nox_limit_mg_nm3,
t.pm_dust_mg_nm3,
s.max_pm_limit_mg_nm3,
t.co_mg_nm3,
t.flue_gas_flow_m3_s,
t.flue_temp_celsius,
ROUND((t.so2_mg_nm3 * t.flue_gas_flow_m3_s * 3600.0) / 1000000.0, 3) AS so2_mass_rate_kg_h,
ROUND((t.nox_mg_nm3 * t.flue_gas_flow_m3_s * 3600.0) / 1000000.0, 3) AS nox_mass_rate_kg_h,
ROUND((t.pm_dust_mg_nm3 * t.flue_gas_flow_m3_s * 3600.0) / 1000000.0, 3) AS pm_mass_rate_kg_h,
CASE
WHEN t.so2_mg_nm3 > s.max_so2_limit_mg_nm3 OR t.nox_mg_nm3 > s.max_nox_limit_mg_nm3 OR t.pm_dust_mg_nm3 > s.max_pm_limit_mg_nm3
THEN 'EXCEEDING_LIMIT'
ELSE 'COMPLIANT'
END AS compliance_status,
t.sensor_status
FROM {{ ref('bronze_raw_cems_telemetry_logs') }} t
JOIN {{ ref('bronze_ref_emission_sources') }} s
ON t.source_id = s.source_id
WHERE t.sensor_status = 'VALID'
@@ -0,0 +1,38 @@
{{ config(
materialized='incremental',
unique_key='permit_id',
schema='silver'
) }}
WITH cdc_raw AS (
SELECT
CAST(permit_id AS VARCHAR) AS permit_id,
TRIM(applicant_name) AS applicant_name,
LOWER(permit_type) AS permit_type,
CAST(status AS VARCHAR) AS permit_status,
CAST(issued_date AS TIMESTAMP) AS issued_date,
CAST(updated_at AS TIMESTAMP) AS updated_at,
_sling_op,
CAST(_sling_ts AS TIMESTAMP) AS _sling_ts,
ROW_NUMBER() OVER (
PARTITION BY permit_id
ORDER BY _sling_ts DESC
) AS row_num
FROM {{ source('bronze_lakehouse', 'environmental_permits_cdc') }}
{% if is_incremental() %}
WHERE _sling_ts > (SELECT MAX(_sling_ts) FROM {{ this }})
{% endif %}
)
SELECT
permit_id,
applicant_name,
permit_type,
permit_status,
issued_date,
updated_at,
_sling_ts,
CURRENT_TIMESTAMP AS ingested_at_silver
FROM cdc_raw
WHERE row_num = 1
AND _sling_op != 'D' -- Buang record yang di-DELETE
@@ -0,0 +1,22 @@
{{ config(
materialized='table',
schema='silver'
) }}
WITH raw_sheets AS (
SELECT
TRIM(CAST(lokasi_tps AS VARCHAR)) AS lokasi_tps,
TRIM(CAST(kecamatan AS VARCHAR)) AS kecamatan,
CAST(volume_sampah_m3 AS NUMERIC(10,2)) AS volume_sampah_m3,
CAST(tanggal_laporan AS DATE) AS tanggal_laporan
FROM {{ source('bronze_lakehouse', 'gws_waste_reports') }}
WHERE lokasi_tps IS NOT NULL AND lokasi_tps != ''
)
SELECT
lokasi_tps,
kecamatan,
volume_sampah_m3,
tanggal_laporan,
CURRENT_TIMESTAMP AS ingested_at_silver
FROM raw_sheets
@@ -0,0 +1,12 @@
-- dbt Silver Cleansed Environmental Permits
SELECT
permit_id,
permit_number,
company_name,
permit_type,
status,
issued_date,
updated_at,
CURRENT_TIMESTAMP AS dbt_validated_at
FROM {{ ref('bronze_environmental_permits') }}
WHERE status != 'REVISED'
@@ -0,0 +1,17 @@
{{ config(
materialized='table',
schema='silver'
) }}
WITH raw_json AS (
SELECT json_payload FROM {{ source('bronze_lakehouse', 'spku_api_raw') }}
)
SELECT
(json_payload->>'stasiun_id')::VARCHAR AS stasiun_id,
(json_payload->>'nama_stasiun')::VARCHAR AS nama_stasiun,
(json_payload->>'pm25')::NUMERIC(8,2) AS pm25_value,
(json_payload->>'pm10')::NUMERIC(8,2) AS pm10_value,
(json_payload->>'recorded_at')::TIMESTAMP AS recorded_at,
CURRENT_TIMESTAMP AS ingested_at_silver
FROM raw_json
@@ -0,0 +1,27 @@
-- dbt Silver Cleansed Manifest Orders Enriched with Master Facilities
SELECT
o.order_id,
o.manifest_code,
o.order_date,
o.generator_company,
o.waste_category,
o.volume_ton,
o.tariff_per_ton,
o.transport_fee,
ROUND((o.volume_ton * o.tariff_per_ton) + o.transport_fee, 2) AS total_order_amount,
o.order_status,
f.facility_id,
f.facility_name,
f.region_zone,
f.facility_type,
f.compliance_rating,
f.facility_status,
CASE
WHEN f.facility_status = 'ACTIVE' AND o.volume_ton <= f.max_daily_capacity_ton THEN 'COMPLIANT'
WHEN f.facility_status != 'ACTIVE' THEN 'UNLICENSED_FACILITY_WARNING'
ELSE 'CAPACITY_EXCEEDED_WARNING'
END AS environmental_compliance_status
FROM {{ ref('bronze_waste_orders') }} o
LEFT JOIN {{ ref('bronze_ref_facilities') }} f
ON o.facility_id = f.facility_id
WHERE o.order_status != 'CANCELLED'
@@ -0,0 +1,10 @@
-- dbt Silver Model: stg_spku_realtime
{{ config(materialized='table', schema='silver') }}
SELECT
stasiun_id,
LOWER(TRIM(nama_stasiun)) AS nama_stasiun_clean,
CAST(ispu_val AS FLOAT) AS ispu_value,
created_at
FROM {{ source('bronze', 'spku_api_raw') }}
WHERE ispu_val IS NOT NULL