
Contract Validation Rules
contract_rules.RdA dataset containing validation rules for contract and wage bill data quality checks.
These rules are designed to be used with the validate package to
assess the quality and consistency of contract records in HRMIS data.
Format
A tibble with 17 rows and 5 variables:
- rule
Character. The validation rule expression as a string that can be parsed by
validate::validator().- name
Character. Unique identifier for the rule (e.g., "contract_ref_date_valid").
- description
Character. Detailed explanation of what the rule checks. This description appears in validation summaries.
- label
Character. Short 2-3 word label for the rule, useful for plotting and quick reference.
- required_vars
Character. Comma-separated list of minimum required variables for the rule to be evaluated. At minimum: contract_id, personnel_id, gross_salary_lcu, base_salary_lcu, and allowance_lcu.
Details
The contract validation rules check:
Column existence (contract_id, ref_date, gross_salary_lcu, base_salary_lcu, allowance_lcu)
Contract ID uniqueness (contract_id + ref_date combination is unique)
Personnel assignment uniqueness (contract_id + personnel_id + ref_date combination is unique)
Reference date validity
Working hours reasonableness (1-168 hours per week)
Contract status consistency (start_date <= ref_date)
Wage bill composition (gross = base + allowance)
Wage bill hierarchy (net <= gross, base <= gross)
Positive salary values (gross, base, net >= 1)
Allowance validity (non-negative or missing)
These rules can be programmatically converted to validate::validator() objects
for use in data quality pipelines.
Examples
# View all contract validation rules
contract_rules
#> # A tibble: 16 × 4
#> rule name description label
#> <chr> <chr> <chr> <chr>
#> 1 is_unique(contract_id, ref_date) cont… combinatio… Uniq…
#> 2 is_unique(contract_id, personnel_id, ref_date) cont… combinatio… Uniq…
#> 3 ref_date >= as.Date('1900-01-01') & ref_date <= Sys.… cont… ref_date i… Vali…
#> 4 whours >= 0 & whours <= 168 cont… working ho… Reas…
#> 5 start_date <= ref_date cont… employment… Vali…
#> 6 gross_salary_lcu >= base_salary_lcu + allowance_lcu wage… gross sala… Gros…
#> 7 net_salary_lcu <= gross_salary_lcu wage… net salary… Net …
#> 8 gross_salary_lcu >= 0 wage… gross sala… Posi…
#> 9 base_salary_lcu >= 0 wage… base salar… Posi…
#> 10 net_salary_lcu >= 0 wage… net salary… Posi…
#> 11 base_salary_lcu <= gross_salary_lcu wage… base salar… Base…
#> 12 allowance_lcu >= 1 | is.na(allowance_lcu) wage… allowance … Vali…
#> 13 in_range(gross_salary_lcu, min = quantile(gross_sala… wage… gross sala… Gros…
#> 14 in_range(net_salary_lcu, min = quantile(net_salary_l… wage… net salary… Net …
#> 15 in_range(base_salary_lcu, min = quantile(base_salary… wage… base salar… Base…
#> 16 in_range(allowance_lcu, min = quantile(allowance_lcu… wage… allowance … Allo…
# Filter to wage bill rules
contract_rules[grepl("wagebill", contract_rules$name), ]
#> # A tibble: 11 × 4
#> rule name description label
#> <chr> <chr> <chr> <chr>
#> 1 gross_salary_lcu >= base_salary_lcu + allowance_lcu wage… gross sala… Gros…
#> 2 net_salary_lcu <= gross_salary_lcu wage… net salary… Net …
#> 3 gross_salary_lcu >= 0 wage… gross sala… Posi…
#> 4 base_salary_lcu >= 0 wage… base salar… Posi…
#> 5 net_salary_lcu >= 0 wage… net salary… Posi…
#> 6 base_salary_lcu <= gross_salary_lcu wage… base salar… Base…
#> 7 allowance_lcu >= 1 | is.na(allowance_lcu) wage… allowance … Vali…
#> 8 in_range(gross_salary_lcu, min = quantile(gross_sala… wage… gross sala… Gros…
#> 9 in_range(net_salary_lcu, min = quantile(net_salary_l… wage… net salary… Net …
#> 10 in_range(base_salary_lcu, min = quantile(base_salary… wage… base salar… Base…
#> 11 in_range(allowance_lcu, min = quantile(allowance_lcu… wage… allowance … Allo…