---
# System prepended metadata

title: Sanity check

---

# Sanity check

Computation Trigger: 
- On population data change
- On analysis parameters change


```json
SanityCheck {
 "name": "Short description"
 "population_filter": "EXIT_REASON",
 "number_of_failed_individual": 2, // Depends on the filter used, fo example, on exit reason, you only check the total of individuals who failed sanity on thes filter
 "number_of_checked_individual": 9, // Depends on the filter used, a sup-population (as above)
 "ratio_failed": 0.22, // Float to display as percentage
 "fail_in_value": 200.00, // Float to display the total pension amount 
 "ratio_failed_in_value": 0.27, // Float to display as percentage weighted by pension amount
 "approver_id": 1, // Foreign key to user that can be NULL
 "status": "Approved|Failed|Success",
 "description": "Total Pension of dependant is zero",
 "suggestion": "Remove Record", // What to do on fail, how can we fix this
 "analysis_id": analysis_1, // Foreign key to Analysis
 "comment": "Text explaining why something was approved"
}
```

:warning: The Mortality table does not hold the gender, the sanity check on individual mortality table gender needs an update.
 
Intermediate table
```json
SanityCheckIndividual {
 "sanity_check_id": sanity_check_1, // foreign key to sanity chek
 "individual_id": individual_1, // foreign key to individual who failed the sanity check
}
```

# Processing report

```json
ProcessingReportItem {
 "row_number": 123, // row in the original file onwhich the data is
 "ref": "def345", // value of ref field on the row
 "unique_id": "345", // value of unique_id field on the row
 "level": "WARNING", // WARNING = data was dropped, INFO = data was kept but is weird
 "field": "Gender", // Field that has wrong data format
 "message": "Expected 'M' or 'F', received 'U'." // What is wrong with the data
 "analysis_id": analysis_1 // Foreign key to Analysis
}
```

# Architecture design

## Procedural
Hence the data processing is done, we launch the sanitization

**Pros:**
- We are certain to adress all sanitization
- The overall data processing is ready hence the sanitization is done
- Aggregation on premise

**Cons:**
- We have a shared data between the processing subdomain and the sanitization subprocess
- We have to process all the population individuals and iterate over it (increases the time of execution of the all process)
- We have to make sure that any error in the sanitization process won't stop the overall process


## Event Driven way
**:warning: This design is interesting if we want to have a sinitization at data processing level.:warning:**

Each time an individual is processed we emit an event `IndividualProcessed` on a bus of our own.

**Pros:**
- Separation of concern
- Isolation
- Transparency
- No shared data (population is not needed)
- No need to iterate on population individuals
- Easy mental model

**Cons:**
- The event consumer cannot be executed on the main thread. Doc [here](https://doc.rust-lang.org/book/ch16-01-threads.html)
- The sanitization will be ready at a term (not really a cons, but something we have to keep in mind) 
- We have to implement the event bus
- Aggregation on demand?

## Decision
We choose the procedural design as it is more accurate for our current needs.