Back to rules

CCPA Correction Request SLA Compliance

freshnesshigh

Validates that consumer data correction requests are resolved within the statutory SLA. Under CPRA, businesses must respond to correction requests within 45 calendar days of receipt, with a possible 45-day extension if reasonably necessary. This rule checks the gap between request_date and resolution_date.

v1.0.0by dqhub539 downloads5 (20)
ccpacorrectionprivacycompliancecpraslaconsumer-rights
Try This Rule

Parameters

column_namestringrequired

The column containing email addresses

thresholdfloatdefault: 0.99

Minimum fraction of valid emails (0.0 to 1.0)

Compliance Mapping

CCPACal. Civ. Code 1798.106 — Right to Correction

VCDPAVa. Code 59.1-577(A)(4) — Right to Correct

CPRACal. Civ. Code 1798.106(c) — Response Timing

CPAC.R.S. 6-1-1306(1)(a)(IV) — Right to Correct

Install

soda
checks for {{table_name}}:
  - invalid_percent({{column_name}}) < {{(1 - threshold) * 100}}:
      valid regex: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
dbt
{% test valid_email(model, column_name) %}
select {{ column_name }}
from {{ model }}
where {{ column_name }} not regexp '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'
{% endtest %}
sql
SELECT COUNT(*) as total,
  SUM(CASE WHEN {{column_name}} REGEXP
    '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'
    THEN 1 ELSE 0 END) as valid
FROM {{table_name}}
Great Expectations
{
  "expectation_type": "expect_column_values_to_match_regex",
  "kwargs": {
    "column": "{{column_name}}",
    "regex": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
    "mostly": {{threshold}}
  }
}
spark
from pyspark.sql.functions import col
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
invalid = df.filter(~col("{{column_name}}").rlike(pattern)).count()

Test Data

Passing Examples

idvalue
1alice@example.com
2bob.smith@company.co.uk
3charlie+tag@domain.org

Failing Examples

idvalue
1not-an-email
2@missing-local.com
3spaces in@email.com

CLI

Terminal
npx dqhub install ccpa-correction-request-sla --format soda --table YOUR_TABLE
npx dqhub install ccpa-correction-request-sla --format dbt --model YOUR_MODEL
npx dqhub install ccpa-correction-request-sla --format sql --dialect snowflake