-- ============================================================ -- HMM carrier assignments using existing access-group tables. -- -- Existing tables: -- HMM_HR_EMPLOYEES -- HMM_ACCESS_GROUPS -- HMM_ACCESS_GROUP_MEMBERS -- -- No new assignment table is created. -- Korean values are reconstructed from UTF-8 base64 so SQLcl -- cannot corrupt the literals. -- Redmine: #730 -- ============================================================ WHENEVER SQLERROR EXIT SQL.SQLCODE SET DEFINE OFF SET FEEDBACK ON SET SERVEROUTPUT ON MERGE INTO hmm_access_groups dst USING ( SELECT base.max_group_id + carrier.seq_no AS group_id, 'CARRIER_' || carrier.carrier_code AS group_code, carrier.carrier_code || ' ' || utl_i18n.raw_to_char( utl_encode.base64_decode( utl_raw.cast_to_raw('7ISg7IKsIOuLtOuLuSDqt7jro7k=') ), 'AL32UTF8' ) AS group_name, utl_i18n.raw_to_char( utl_encode.base64_decode( utl_raw.cast_to_raw( '642w66qo7JqpIOyEoOyCrCDsoJHqt7wg67CPIOuLtOuLueyekCDqt7jro7k=' ) ), 'AL32UTF8' ) || ' (' || carrier.carrier_code || ')' AS description FROM ( SELECT 1 seq_no, 'C001' carrier_code FROM dual UNION ALL SELECT 2, 'C002' FROM dual UNION ALL SELECT 3, 'C003' FROM dual UNION ALL SELECT 4, 'C004' FROM dual UNION ALL SELECT 5, 'C005' FROM dual UNION ALL SELECT 6, 'C006' FROM dual UNION ALL SELECT 7, 'C007' FROM dual UNION ALL SELECT 8, 'C008' FROM dual ) carrier CROSS JOIN ( SELECT NVL(MAX(group_id), 0) max_group_id FROM hmm_access_groups ) base ) src ON (dst.group_code = src.group_code) WHEN MATCHED THEN UPDATE SET dst.group_name = src.group_name, dst.description = src.description, dst.active_yn = 'Y', dst.updated_at = SYSTIMESTAMP WHEN NOT MATCHED THEN INSERT ( group_id, group_code, group_name, description, active_yn, created_at, updated_at ) VALUES ( src.group_id, src.group_code, src.group_name, src.description, 'Y', SYSTIMESTAMP, SYSTIMESTAMP ); MERGE INTO hmm_access_group_members dst USING ( SELECT access_group.group_id, employee.employee_id FROM ( SELECT 'E1002' employee_code, 'CARRIER_C001' group_code FROM dual UNION ALL SELECT 'E1002', 'CARRIER_C002' FROM dual UNION ALL SELECT 'E1003', 'CARRIER_C003' FROM dual UNION ALL SELECT 'E1004', 'CARRIER_C004' FROM dual UNION ALL SELECT 'E1005', 'CARRIER_C005' FROM dual UNION ALL SELECT 'E1006', 'CARRIER_C006' FROM dual UNION ALL SELECT 'E1006', 'CARRIER_C007' FROM dual UNION ALL SELECT 'E1007', 'CARRIER_C008' FROM dual ) assignment JOIN hmm_hr_employees employee ON employee.employee_code = assignment.employee_code AND employee.employment_status = 'ACTIVE' JOIN hmm_access_groups access_group ON access_group.group_code = assignment.group_code AND access_group.active_yn = 'Y' ) src ON ( dst.group_id = src.group_id AND dst.employee_id = src.employee_id ) WHEN NOT MATCHED THEN INSERT ( group_id, employee_id, created_at ) VALUES ( src.group_id, src.employee_id, SYSTIMESTAMP ); CREATE OR REPLACE VIEW hmm_carrier_assignments_v AS SELECT employee.employee_id, employee.employee_code, employee.full_name AS employee_name, employee.job_title, employee.team_id, employee.manager_employee_id, manager.employee_code AS manager_employee_code, manager.full_name AS manager_name, SUBSTR(access_group.group_code, LENGTH('CARRIER_') + 1) AS carrier_code, access_group.group_code, access_group.group_name FROM hmm_access_group_members membership JOIN hmm_access_groups access_group ON access_group.group_id = membership.group_id AND access_group.active_yn = 'Y' JOIN hmm_hr_employees employee ON employee.employee_id = membership.employee_id AND employee.employment_status = 'ACTIVE' LEFT JOIN hmm_hr_employees manager ON manager.employee_id = employee.manager_employee_id WHERE access_group.group_code LIKE 'CARRIER_C%'; COMMENT ON TABLE hmm_carrier_assignments_v IS 'ADB employee-to-carrier assignments from HMM_HR_EMPLOYEES, HMM_ACCESS_GROUPS, and HMM_ACCESS_GROUP_MEMBERS. Join relationship: HMM_CARRIER_ASSIGNMENTS_V.CARRIER_CODE joins HMM_RDS_CARRIERS_V.CARRIER_CODE, HMM_RDS_CARRIER_PERF_V.CARRIER_CODE, and HMM_RDS_CARRIER_LATEST_V.CARRIER_CODE.'; COMMENT ON COLUMN hmm_carrier_assignments_v.EMPLOYEE_CODE IS 'HMM employee code sourced from HMM_HR_EMPLOYEES.EMPLOYEE_CODE. Example: E1002.'; COMMENT ON COLUMN hmm_carrier_assignments_v.MANAGER_EMPLOYEE_CODE IS 'Direct manager employee code sourced from HMM_HR_EMPLOYEES. Use E1001 to identify the HMM demo manager team.'; COMMENT ON COLUMN hmm_carrier_assignments_v.CARRIER_CODE IS 'Join Key and Foreign Key to HMM_RDS_CARRIERS_V(CARRIER_CODE), HMM_RDS_CARRIER_PERF_V(CARRIER_CODE), and HMM_RDS_CARRIER_LATEST_V(CARRIER_CODE).'; COMMENT ON COLUMN hmm_carrier_assignments_v.GROUP_CODE IS 'Existing access-group code in the form CARRIER_C001.'; COMMIT; DECLARE v_group_count PLS_INTEGER; v_member_count PLS_INTEGER; v_assignment_count PLS_INTEGER; v_federated_count PLS_INTEGER; BEGIN SELECT COUNT(*) INTO v_group_count FROM hmm_access_groups WHERE group_code BETWEEN 'CARRIER_C001' AND 'CARRIER_C008' AND active_yn = 'Y'; SELECT COUNT(*) INTO v_member_count FROM hmm_access_group_members membership JOIN hmm_access_groups access_group ON access_group.group_id = membership.group_id WHERE access_group.group_code BETWEEN 'CARRIER_C001' AND 'CARRIER_C008'; SELECT COUNT(*) INTO v_assignment_count FROM hmm_carrier_assignments_v; SELECT COUNT(*) INTO v_federated_count FROM hmm_carrier_assignments_v assignment JOIN hmm_rds_carrier_latest_v performance ON performance.carrier_code = assignment.carrier_code; IF v_group_count != 8 OR v_member_count != 8 OR v_assignment_count != 8 OR v_federated_count != 8 THEN RAISE_APPLICATION_ERROR( -20081, 'Expected group/member/assignment/federated counts 8/8/8/8; found ' || v_group_count || '/' || v_member_count || '/' || v_assignment_count || '/' || v_federated_count ); END IF; END; / SELECT assignment.employee_code, assignment.employee_name, assignment.manager_employee_code, assignment.carrier_code, performance.carrier_name, performance.performance_month, performance.revenue_usd, performance.risk_level FROM hmm_carrier_assignments_v assignment JOIN hmm_rds_carrier_latest_v performance ON performance.carrier_code = assignment.carrier_code ORDER BY assignment.employee_code, assignment.carrier_code;