Page tree


This document provides an overview of the two main Google Cloud Platform (GCP) services leveraged in this project: BigQuery and Dataplex. These services work together to enable efficient data storage, processing, and quality monitoring.

  • BigQuery is GCP's fully managed, serverless data warehouse designed for fast SQL-based analysis on large datasets. It is used to store, organize, and process data ingested from various source systems. BigQuery serves as the central data repository for this project.
  • Dataplex is GCP's intelligent data fabric solution, which allows for unified data management, governance, and quality control across distributed data. In this project, Dataplex is responsible for the execution of data quality rules, ensuring the consistency and reliability of data processed and stored in BigQuery.

Project Hierarchy

The project structure within GCP has been organized to ensure clear separation between domains and environments, while supporting an efficient data ingestion and data quality validation process.

Domain-specific Projects

For each domain within the Data Quality Monitoring Tool (DQMT), a dedicated GCP project exists for every environment:

  • Development (dev)

  • Testing (test)

  • Pre-Production (ppd)

  • Production (prod)

Each project serves as the location where:

  • The data is ingested from source systems.
  • The initial views used for data processing and quality checks are created.

Domain Projects List

Domain\Environment

Development

Testing

Pre-Production

Production

Human Resourcesprj-data-dm-hr-devprj-data-dm-hr-testprj-data-dm-hr-ppdprj-data-dm-hr-prod
Structure & Sharedprj-data-dm-structure-devprj-data-dm-structure-testprj-data-dm-structure-ppdprj-data-dm-structure-prod
Financeprj-data-dm-finance-devprj-data-dm-finance-testprj-data-dm-finance-ppdprj-data-dm-finance-prod
Marketingprj-data-dm-marketing-devprj-data-dm-marketing-testprj-data-dm-marketing-ppdprj-data-dm-marketing-prod
Procurementprj-data-dm-procurement-devprj-data-dm-procurement-testprj-data-dm-procurement-ppdprj-data-dm-procurement-prod

Data Quality & Final Views Projects

In addition to the domain-specific projects, a separate set of projects is used to:

  • Import the final views generated by the domain projects.

  • Define and execute data quality rules through Dataplex.

Environment

Project

Developmentprj-data-dq-selfservice-dev
Testingprj-data-dq-selfservice-test
Pre-Productionprj-data-dq-selfservice-ppd
Productionprj-data-dq-selfservice-prod

Project Support Teams

The successful implementation and maintenance of the DQMT solution is supported by a dedicated team, each contributing with specialized skills across different areas of the project:

Name

Role

Scope

Ahmed ElsayedData ArchitectArchitecture and design of data pipelines and models
Maria João PimentaData EngineerData ingestion, transformation, and automation
Ram AtirajyamData EngineerData ingestion, transformation, and automation
Ibrahim ManseyVisualization EngineerData visualization and dashboard development
Mohamed HazemVisualization EngineerData visualization and dashboard development
Rawan ShehabFunctional AnalystBusiness analysis and functional requirements

Project Access and Service Accounts

Google Groups

The following Google Groups have access to the DQMT GCP projects, organized by role:

Group

Purpose

Email

Data Architects GroupAccess for Data Architectsgcp-da-prj-data-dq-selfservice-nonprod@solvay.com
Data Engineers GroupAccess for Data Engineersgcp-de-prj-data-dq-selfservice-nonprod@solvay.com
Data Analysts / Business AnalystsNo specific group
Data Developers GroupAccess for Data Developersgcp-dv-prj-data-dq-selfservice@solvay.com

Note: No new Google Groups were specifically created for this project.


Service Accounts

The following Service Accounts are used within the DQMT project for process automation and integration:

BigQuery

Projects, Datasets, Tables and Views

Domain Projects

Projects

View

Source Tables/Views

prj-data-dm-hr-[env]DS_prj_dqkpi.V_BusinessUnitODS.ODS_SFC_0000_F001_F_W_FOBusinessUnit
DS_prj_dqkpi.V_CcHrFinODS.ODS_SFC_0000_F001_F_W_FOCostCenter
ODS.ODS_BWH_0000_F001_F_W_BW_QRY_C_COSTCTR_0001
DS_prj_dqkpi.V_CompanyODS.ODS_SFC_0000_F001_F_W_FOCompany
DS_prj_dqkpi.V_CostCenterODS.ODS_SFC_0000_F001_F_W_FOCostCenter
DS_prj_dqkpi.V_EmpBusinessDS_prj_dqkpi.V_EmpJob
DS_prj_dqkpi.V_BusinessUnit
DS_prj_dqkpi.V_EmpCompensationODS.ODS_SFC_0000_F001_F_W_EmpCompensation
DS_prj_dqkpi.V_PickListValueV2
DS_prj_dqkpi.V_EmpCompensationJobDS_prj_dqkpi.V_EmpCompensation
DS_prj_dqkpi.V_EmpJob
DS_prj_dqkpi.V_EmpJobDS_prj_dqkpi.V_PickListValueV2
DS_prj_dqkpi.V_FOLocation
DS_prj_dqkpi.V_EmpJobCoded
DS_prj_dqkpi.V_EmpJobCodedODS.ODS_SFC_0000_F001_F_D_EmpJob
DS_prj_dqkpi.V_EmpJob_CCDS_prj_dqkpi.V_EmpJob
DS_prj_dqkpi.V_CostCenter 
DS_prj_dqkpi.V_EmpJob_CompensationGroupSumCalcODS.ODS_SFC_0000_F001_F_W_empCompensationGroupSumCalculatedNav
DS_prj_dqkpi.V_EmpJob
DS_prj_dqkpi.V_EmpJob_LocGroupDS_prj_dqkpi.V_EmpJob
DS_prj_dqkpi.V_LocationGroup
DS_prj_dqkpi.V_EmpJob_LocationDS_prj_dqkpi.V_EmpJob
DS_prj_dqkpi.V_FOLocation
DS_prj_dqkpi.V_FOLocationODS.ODS_SFC_0000_F001_F_W_FOLocation
DS_prj_dqkpi.V_LocationGroupODS.ODS_SFC_0000_F001_F_W_FOLocationGroup
DS_prj_dqkpi.V_PickListValueV2ODS.ODS_SFC_0000_F001_F_W_PickListValueV2
DS_prj_dqkpi.V_Position

ODS.ODS_SFC_0000_F001_F_W_Position
DS_prj_dqkpi.V_FOLocation

DS_prj_dqkpi.V_PositionJobInfo

DS_prj_dqkpi.V_EmpJob
DS_prj_dqkpi.V_Position

prj-data-dm-structure-[env]
DS_prj_sls_dataquality_kpi.V_PF1

ODS.ODS_SPF_0000_F001_F_W_T001W
ODS.ODS_SPF_0000_F001_F_W_T001K

DS_prj_sls_dataquality_kpi.V_PF1_MVKE_T001W_TVKOT_T001K
ODS.ODS_SPF_0000_F001_F_W_MVKE
ODS.ODS_SPF_0000_F001_F_W_T001W
ODS.ODS_SPF_0000_F001_F_W_TVKOT
DS_prj_sls_dataquality_kpi.V_PF1_MVKE_T001W_TVKOT_T001K_U
DS_prj_sls_dataquality_kpi.V_PF1_MVKE_T001W_TVKOT_T001K
DS_prj_sls_dataquality_kpi.V_WP1
ODS.ODS_SPW_0000_F001_F_W_T001W
ODS.ODS_SPW_0000_F001_F_W_T001K
DS_prj_sls_dataquality_kpi.V_WP1_MVKE_T001W_TVKOT_T001K
ODS.ODS_SPW_0000_F001_F_W_MVKE
ODS.ODS_SPW_0000_F001_F_W_T001W
ODS.ODS_SPW_0000_F001_F_W_TVKOT
DS_prj_sls_dataquality_kpi.V_WP1_MVKE_T001W_TVKOT_T001K_UDS_prj_sls_dataquality_kpi.V_WP1_MVKE_T001W_TVKOT_T001K
prj-data-dm-finance-[env]DS_prj_sls_dataquality_kpi.V_COSTCTR_0001

ODS.ODS_BWH_0000_F001_F_W_BW_QRY_C_COSTCTR_0001

prj-data-dm-marketing-[env]
DS_prj_sls_dataquality_kpi.V_PF1_KNA1

ODS.ODS_SPF_0000_F001_F_W_KNA1

DS_prj_sls_dataquality_kpi.V_WP1_KNA1

ODS.ODS_SPW_0000_F001_F_W_KNA1

prj-data-dm-procurement-[env]

DS_sls_dataquality_kpi.V_PF1_MARC

ODS.ODS_SPF_0000_F001_F_W_MARC
STG.log_tables

DS_sls_dataquality_kpi.V_WP1_MARC

ODS.ODS_SPW_0000_F001_F_W_MARC
STG.log_tables

[env] is one of the following: dev, test, ppd, prod

Selfservice Project

Project

Table/View

Source Tables/Views
prj-data-dm-selfservice-[env]

DM.DIM_date

-

DM.DIM_domain

-

DM.DIM_kpi_dimension

-

DM.DIM_quality_rule

-

DM.Dataplex_quality

-

DM.FACT_data_quality

-

DM.FACT_failed_records

-

DPL.V_DIM_DATE

prj-data-dm-selfservice-[env].DM.DIM_date

DPL.V_DIM_DOMAIN

prj-data-dm-selfservice-[env].DM.DIM_domain

DPL.V_DIM_KPI_DIMENSION

prj-data-dm-selfservice-[env].DM.DIM_kpi_dimension

DPL.V_FACT_QUALITY

prj-data-dm-selfservice-[env].DM.FACT_data_quality
prj-data-dm-selfservice-[env].DM.FACT_failed_records

DPL.V_RULE_QUALITY

prj-data-dm-selfservice-[env].DM.DIM_quality_rule
prj-data-dm-selfservice-[env].DM.DIM_domain

prj-data-dm-selfservice-[env].DM.DIM_kpi_dimension

DataOcean_dataquality_kpi.V_ActiveEmployeeInActiveLegalEntity

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpJob
prj-data-dm-hr-[env].DS_prj_dqkpi.V_Company

DataOcean_dataquality_kpi.V_COSTCTR_0001

prj-data-dm-finance-[env].DS_prj_sls_dataquality_kpi.V_COSTCTR_0001

DataOcean_dataquality_kpi.V_COSTCTR_0001_ProfitCenter

prj-data-dm-finance-[env].DS_prj_sls_dataquality_kpi.V_COSTCTR_0001

DataOcean_dataquality_kpi.V_EmpBusiness

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpBusiness

DataOcean_dataquality_kpi.V_EmpCompensationJob

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpCompensationJob

DataOcean_dataquality_kpi.V_EmpJob_CC

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpJob_CC

DataOcean_dataquality_kpi.V_EmpJob_Cadres

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpJob

DataOcean_dataquality_kpi.V_EmpJob_Compensation_AIS

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpJob_CompensationGroupSumCalc

DataOcean_dataquality_kpi.V_EmpJob_Compensation_AIS_ANSG

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpJob_CompensationGroupSumCalc

DataOcean_dataquality_kpi.V_EmpJob_Compensation_ANSG

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpJob_CompensationGroupSumCalc

DataOcean_dataquality_kpi.V_EmpJob_External_Pay

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpJob

DataOcean_dataquality_kpi.V_EmpJob_External_Position

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpJob

DataOcean_dataquality_kpi.V_EmpJob_LocGroup

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpJob_LocGroup

DataOcean_dataquality_kpi.V_EmpJob_Location

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpJob_Location

DataOcean_dataquality_kpi.V_EmpJob_Supervisor

prj-data-dm-hr-[env].DS_prj_dqkpi.V_EmpJob

DataOcean_dataquality_kpi.V_FOLocation

prj-data-dm-hr-[env].DS_prj_dqkpi.V_FOLocation

DataOcean_dataquality_kpi.V_PF1

prj-data-dm-structure-[env].DS_prj_sls_dataquality_kpi.V_PF1

DataOcean_dataquality_kpi.V_PF1_KNA1

prj-data-dm-marketing-[env].DS_prj_sls_dataquality_kpi.V_PF1_KNA1

DataOcean_dataquality_kpi.V_PF1_MARC

prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_proc_PF1_MARC

prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1

DataOcean_dataquality_kpi.V_PF1_MVKE_T001W_TVKOT_T001K_U

prj-data-dm-structure-[env].DS_prj_sls_dataquality_kpi.V_PF1_MVKE_T001W_TVKOT_T001K_U

DataOcean_dataquality_kpi.V_PositionJobInfo

prj-data-dm-hr-[env].DS_prj_dqkpi.V_PositionJobInfo

DataOcean_dataquality_kpi.V_PositionJobInfo_BU

prj-data-dm-hr-[env].DS_prj_dqkpi.V_PositionJobInfo

DataOcean_dataquality_kpi.V_PositionJobInfo_CC

prj-data-dm-hr-[env].DS_prj_dqkpi.V_PositionJobInfo

DataOcean_dataquality_kpi.V_WP1

prj-data-dm-structure-[env].DS_prj_sls_dataquality_kpi.V_WP1

DataOcean_dataquality_kpi.V_WP1_KNA1

prj-data-dm-marketing-[env].DS_prj_sls_dataquality_kpi.V_WP1_KNA1

DataOcean_dataquality_kpi.V_WP1_MARC

prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_proc_WP1_MARC
prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1

DataOcean_dataquality_kpi.V_WP1_MVKE_T001W_TVKOT_T001K_U

prj-data-dm-structure-[env].DS_prj_sls_dataquality_kpi.V_WP1_MVKE_T001W_TVKOT_T001K_U

DataOcean_dataquality_kpi.V_proc_PF1_MARC

prj-data-dm-procurement-[env].DS_sls_dataquality_kpi.V_PF1_MAR

DataOcean_dataquality_kpi.V_proc_WP1_MARC

prj-data-dm-procurement-[env].DS_sls_dataquality_kpi.V_WP1_MARC

[env] is one of the following: dev, test, ppd, prod

Routines

ProjectRoutine

Output

prj-data-dm-selfservice-[env]DM.insert_DIM_Domain

Populates the Data Model Dimension Table DM.DIM_domain

DM.insert_DIM_kpi_dimension

Populates the Data Model Dimension Table DM.DIM_kpi_dimension

DM.RT_DPtoDMmapping_Datespecific

Populates the Data Model Fact Tables:
DM.DIM_date
DM.DIM_quality_rule
DM.FACT_data_quality
DM.FACT_failed_records

[env] is one of the following: dev, test, ppd, prod

Dataplex

Data Profile Scan

Data Profile ScanScanned Table
V_COSTCTR_0001-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001
V_COSTCTR_0001_PROFITCENTER-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001_ProfitCenter
V_EMPBUSINESS-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpBusiness
V_POSITIONJOBINFO_BU-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PositionJobInfo_BU
V_EMPJOB_COMPENSATION_AIS-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Compensation_AIS
V_EMPJOB_COMPENSATION_ANSG-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Compensation_ANSG
V_EMPCOMPENSATIONJOB-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpCompensationJob
V_EMPJOB_CADRES-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Cadres
V_EMPJOB_CC-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_CC
V_POSITIONJOBINFO_CC-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PositionJobInfo_CC
V_EMPJOB_EXTERNAL_PAY-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_External_Pay
V_EMPJOB_EXTERNAL_POSITION-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_External_Position
V_POSITIONJOBINFO-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PositionJobInfo
V_EMPJOB_COMPENSATION_AIS_ANSG-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Compensation_AIS_ANSG
V_ACTIVEEMPLOYEEINACTIVELEGALENTITY-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_ActiveEmployeeInActiveLegalEntity
V_EMPJOB_LOCGROUP-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_LocGroup
V_EMPJOB_LOCATION-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Location
V_EMPJOB_SUPERVISOR-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Supervisor
V_PF1_KNA1-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1_KNA1
V_WP1_KNA1-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1_KNA1
V_PF1_MARC-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1_MARC
V_WP1_MARC-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1_MARC
V_PF1_MVKE_T001W_TVKOT_T001K_U-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1_MVKE_T001W_TVKOT_T001K_U
V_WP1_MVKE_T001W_TVKOT_T001K_U-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1_MVKE_T001W_TVKOT_T001K_U
V_PF1-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1
V_WP1-SCANprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1

[env] is one of the following: dev, test, ppd, prod

Data Quality Scans

Data Quality ScanRuleDomainKPI DimensionScanned TableScanned ColumnFailed Records Query
Accuracy of assigning "Inactive" Cost centers to the EDISCXX nodefin-accuracy-inactive-cc-ediscxx-nodeFinanceConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001ZCBSLevel4NameSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001`
WHERE NOT (ZCBSLevel4Name != "DISCONTINUED" AND ZCBSLevel4Name != "");
Active CCs to L4 in the ZCBS hierarchyfin-active-cc-l4-zcbs-hierarchyFinanceConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001ZCBSLevel4CodeSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001`
WHERE NOT (ZCBSLevel4Code != '#' OR PARSE_DATE('%d.%m.%Y', CreationDate) > (CURRENT_DATE() - INTERVAL 3 DAY));
All cost centers are assigned to a BSAfin-all-cc-assigned-bsaFinanceConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001BSANameSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001`
WHERE NOT (BSAName != "#" OR PARSE_DATE('%d.%m.%Y', CreationDate) > (CURRENT_DATE() - INTERVAL 3 DAY));
All cost centers are assigned to an active GBU Clusterfin-cc-active-gbu-clusterFinanceConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001ClusterCodeSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001`
WHERE NOT (ClusterCode != "OUT" AND ClusterCode != " ");
Cost Centers with Profit Centersfin-cc-profitcentersFinanceConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001_ProfitCenterProfitCenterNameSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001_ProfitCenter`
WHERE NOT (ProfitCenterName != "Not assigned" AND ProfitCenterName NOT LIKE "%/Not assigned");
SRM7 responsible codificationfin-srm7-responsible-codificationFinanceConformity prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001PositionCodeSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_COSTCTR_0001`
WHERE NOT ((LENGTH(PositionCode) = 8 AND PositionCode LIKE '500%'));
Business Unit is activehr-business-unit-is-activeHuman ResourcesConformity prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpBusinessBusinessUnitStatusSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpBusiness`
WHERE EmployeeStatus IN ('Active', 'Active Leave', 'Dormant')
AND NOT(BusinessUnitStatus='A');
Business Unit is the same at Position and Job Infohr-business-unit-same-position-job-infoHuman ResourcesConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PositionJobInfo_BUBusinessUnitEntityGroupingSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PositionJobInfo_BU`
WHERE EmployeeStatus IN ('Active', 'Active Leave', 'Inactive Leave', 'Dormant')
AND NOT(BusinessUnitEntityGrouping=BusinessUnit);
Cadres have annual indicative salaryhr-cadres-have-annual-indicative-salaryHuman ResourcesCompletenessprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Compensation_AISAnnualIndicativeSalarySELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Compensation_AIS`
WHERE EmployeeStatus IN ('Active', 'Active Leave')
AND WorkforceCategory IN ('Cadre', 'Sales Cadre')
AND NOT (AnnualIndicativeSalary IS NOT NULL);
Cadres have Annual Salary (9ANS)hr-cadres-have-annual-salary-9ANSHuman ResourcesCompletenessprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Compensation_ANSGAnnualSalary9ANSGGlobalSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Compensation_ANSG`
WHERE EmployeeStatus IN ('Active', 'Active Leave')
AND WorkforceCategory IN ('Cadre', 'Sales Cadre')
AND NOT (AnnualSalary9ANSGGlobal IS NOT NULL);
Cadres should always have a bonus plan assignedhr-cadres-have-bonus-plan-assignedHuman ResourcesCompletenessprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpCompensationJobBonusPlanSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpCompensationJob`
WHERE EmployeeStatus IN ('Active', 'Active Leave')
AND WorkforceCategory IN ('Cadre', 'Sales Cadre')
AND NOT (BonusPlan IS NOT NULL);
Cadres have Pay grade between S15 and S18hr-cadres-have-pay-grade-between-s15-and-s18Human ResourcesConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_CadresPayGradeSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Cadres`
WHERE EmployeeStatus IN ('Active', 'Active Leave', 'Inactive Leave', 'Dormant')
AND EmploymentType IN ('M0', 'M1', 'M3', 'M4', 'M5', 'MM', 'MR', 'MS', 'MT', 'NI', 'V1', 'VL', 'VT', 'UA')
AND NOT (PayGrade IN ('S15', 'S16', 'S17', 'S18'));
Cadres have Pay grade between S19 and S22hr-cadres-have-pay-grade-between-s19-and-s22Human ResourcesConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_CadresPayGradeSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Cadres`
WHERE EmployeeStatus IN ('Active', 'Active Leave', 'Inactive Leave', 'Dormant')
AND EmploymentType IN ('N0', 'N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'NM', 'NR', 'NS', 'NT', 'V1', 'VL', 'VT', 'UA')
AND NOT (PayGrade IN ('S19', 'S20', 'S21', 'S22'));
Cadres have Pay grade between S23 and S27hr-cadres-have-pay-grade-between-s23-and-s27Human ResourcesConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_CadresPayGradeSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Cadres`
WHERE EmployeeStatus IN ('Active', 'Active Leave', 'Inactive Leave', 'Dormant')
AND EmploymentType IN ('O0', 'O1', 'O2', 'O3', 'O4', 'OS', 'P0', 'P3', 'P4', 'Q0', 'Q4', 'QB', 'QC', 'V1', 'VL', 'VT', 'ZB', 'UA')
AND NOT(PayGrade IN ('S23', 'S24a', 'S24b', 'S25a', 'S25b', 'S26a', 'S26b', 'S27'));
Cost Centre is activehr-costcenter-is-activeHuman ResourcesConformity prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_CCStatusSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_CC`
WHERE EmployeeStatus IN ('Active', 'Active Leave', 'Inactive Leave', 'Dormant')
AND NOT(Status = 'A');
Cost Center is the same at Position and Job Infohr-costcenter-same-position-jobinfoHuman ResourcesConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PositionJobInfo_CCCostCenterSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PositionJobInfo_CC`
WHERE EmployeeStatus IN ('Active', 'Active Leave', 'Inactive Leave', 'Dormant')
AND NOT(CostCenter=CostCenterPosition);
External workforce have Pay Grade "Not applicable"hr-external-workforce-paygrade-naHuman ResourcesAccuracyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_External_PayPayGradeSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_External_Pay`
WHERE EmployeeStatus IN ('Active', 'Active Leave')
AND WorkforceCategory IN ('Trainees & Apprentices', 'Contractor')
AND NOT(PayGrade = 'N/A');
External workforce have Position Grade "Not applicable"hr-external-workforce-postion-grade-naHuman ResourcesAccuracyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_External_PositionPositionGradeSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_External_Position`
WHERE EmployeeStatus IN ('Active', 'Active Leave')
AND WorkforceCategory IN ('Trainees & Apprentices', 'Contractor')
AND NOT(PositionGrade='N/A');
Incumbents Position is activehr-incumbent-position-is-activeHuman ResourcesConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PositionJobInfoPositionStatusSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PositionJobInfo`
WHERE EmployeeStatus IN ('Active', 'Active Leave', 'Inactive Leave', 'Dormant')
AND NOT(PositionStatus='A');
Indicative Salary amount is the same as the Annual Salary (9ans)hr-indicative-salary-amount-same-annual-salaryHuman ResourcesConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Compensation_AIS_ANSGAnnualIndicativeSalarySELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Compensation_AIS_ANSG`
WHERE EmployeeStatus IN ('Active', 'Active Leave')
AND WorkforceCategory IN ('Cadre', 'Sales Cadre')
AND NOT(ABS(CAST(AnnualSalary9ANSGGlobal AS FLOAT64) - CAST(AnnualIndicativeSalary AS FLOAT64)) < 2);
Legal Entity is activehr-legal-entity-is-activeHuman ResourcesConformity prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_ActiveEmployeeInActiveLegalEntityCompanyStatusSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_ActiveEmployeeInActiveLegalEntity`
WHERE EmployeeStatus IN ('Active', 'Active Leave', 'Inactive Leave', 'Dormant')
AND NOT(CompanyStatus <> 'I' OR CompanyStatus IS NULL);
Location Group (site) is activehr-location-group-is-activeHuman ResourcesConformity prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_LocGroupStatusSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_LocGroup`
WHERE EmployeeStatus IN ('Active', 'Active Leave', 'Inactive Leave', 'Dormant')
AND NOT(Status = 'A');
Location (PA/PSA) is activehr-location-is-activeHuman ResourcesConformity prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_LocationStatusSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Location`
WHERE EmployeeStatus IN ('Active', 'Active Leave', 'Inactive Leave', 'Dormant')
AND WorkforceCategory NOT IN ('Contractor', 'Trainees & Apprentices')
AND NOT(Status <>'I' OR Status IS NULL);
Sales Cadre have SIP Bonus Planhr-sales-cadre-have-sip-bonus-planHuman ResourcesAccuracyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpCompensationJobBonusPlanSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpCompensationJob`
WHERE EmployeeStatus IN ('Active', 'Active Leave')
AND WorkforceCategory IN ('Sales Cadre')
AND NOT (BonusPlan = 'SIP');
Supervisor is assignedhr-supervisor-is-assignedHuman ResourcesCompletenessprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_SupervisorSupervisorIdSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_EmpJob_Supervisor`
WHERE EmployeeStatus IN ('Active', 'Active Leave')
AND NOT(SupervisorId <> 'NO_MANAGER');
Duplicate customer PF1mrk-kna1-unq-rcc-duplicateusers-pf1Marketing & SalesUniquenessprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1_KNA1dupcusdataSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1_KNA1`
WHERE LOEVM != 'X'
AND dupcusdata IN (
    SELECT dupcusdata FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1_KNA1`
    WHERE LOEVM != 'X'
    GROUP BY dupcusdata HAVING COUNT(dupcusdata) > 1
);
Duplicate customer WP1mrk-kna1-unq-rcc-duplicateusers-wp1Marketing & SalesUniquenessprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1_KNA1dupcusdataSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1_KNA1`
WHERE LOEVM != 'X'
AND dupcusdata IN (
  SELECT dupcusdata FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1_KNA1`
  GROUP BY dupcusdata HAVING COUNT(dupcusdata) > 1
);
PF1 No active material codes connected to obsolete plantssr-activemat-obsoleteplant-pf1Structures & SharedConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1_MARCPlantNameSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1_MARC`
WHERE MaterialStatus=""
AND NOT (PlantName NOT LIKE '%*D*');
WP1 No active material codes connected to obsolete plantssr-activemat-obsoleteplant-wp1Structures & SharedConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1_MARCPlantNameSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1_MARC`
WHERE MaterialStatus=""
AND NOT (PlantName NOT LIKE 'ZZZ%');
PF1 No active materials linked to obsolete sales orgssr-activemat-obsoletesales-pf1Structures & SharedConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1_MVKE_T001W_TVKOT_T001K_USalesOrgNameSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1_MVKE_T001W_TVKOT_T001K_U`
WHERE NOT(SalesOrgName NOT LIKE '%*D*');
WP1 No active materials linked to obsolete sales orgssr-activemat-obsoletesales-wp1Structures & SharedConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1_MVKE_T001W_TVKOT_T001K_USalesOrgNameSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1_MVKE_T001W_TVKOT_T001K_U`
WHERE NOT(SalesOrgName NOT LIKE 'ZZZ%');
PF1 No active plants linked to obsolete companiesssr-activeplants-obsoletecompanies-pf1Structures & SharedConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1CompanyNameSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_PF1`
WHERE PlantName NOT LIKE '%*D*'
AND NOT (CompanyName NOT LIKE '%*D*');
WP1 No active plants linked to obsolete companiesssr-activeplants-obsoletecompanies-wp1Structures & SharedConsistencyprj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1CompanyNameSELECT * FROM `prj-data-dq-selfservice-[env].DataOcean_dataquality_kpi.V_WP1`
WHERE PlantName NOT LIKE 'ZZZ%'
AND NOT (CompanyName NOT LIKE '%*D*');

[env] is one of the following: dev, test, ppd, prod