This tutorial turns the two-page Checklist for New Application for Single Permit into a working Identità flow.
The checklist contains 15 numbered items. We will not create 15 unconditional Steps. Some items are application facts from NIDMS, some accept alternative documents, and some apply only to a particular job or accommodation type.
By the end, the flow will:
- collect the documents needed for every new Single Permit application;
- ask simple routing questions for conditional documents;
- enforce the checklist's document rules;
- compare important facts across the application pack; and
- show the correct manifest before a run is processed.
Warning
This tutorial models the supplied checklist. If Identità publishes a newer checklist or changes a policy, update the catalogue, rules, and tutorial before using the flow for live applications.
1. Translate the checklist before opening the builder¶
First decide what each checklist item means inside the program.
| Checklist item | Model it as |
|---|---|
| 01 Residence Application Form | Core Step and source for the NIDMS Profile Variables that can be derived from the form. |
| 02 Passport (Full Copy) | Core Passport Step plus full-copy and eight-month-validity rules. |
| 03 Work Contract | Core Work Contract Step plus signatures, wage, duration, sports endorsement, and vehicle-detail rules. |
| 04 Position Description | Core Position Description Step plus signatures and cross-checks against the contract. |
| 05 Proof of Advertisement | Core Proof of Advertisement Step plus channel, publication-date, duration, and submission-window rules. |
| 06 Declaration of Suitability | Core Declaration of Suitability Step. |
| 07 Health Screening | Conditional Health Screening Approval Step. |
| 08 Property Lease or Purchase Agreement | One core Accommodation Evidence Step that accepts the correct accommodation document for the applicant. |
| 09 Housing Authority Approval | Conditional Step for rented accommodation. |
| 10 Lease Professional Attestation | A separate conditional Step for rented accommodation. |
| 11 Health Insurance Policy | Core Health Insurance Step plus cover and duration rules. |
| 12 Driving Licence | Conditional Step when the applicant will operate a vehicle. |
| 13 Pre-Departure Course | Conditional Step controlled by whether the course is required for this application. |
| 14 Additional Documents | Separate conditional Steps for food handling, security, electricians, nursing/midwifery, and tourism/hospitality. |
| 15 Other Documents | Do not make this an always-required catch-all Step. Add a known requirement when Identità requests a specific extra document. |
Why the Residence Application Form is different¶
For this flow, the Residence Application Form is a real core Step. Its extracted values feed derived Profile Variables. Cross-document checks use those resolved Profile Variables as the NIDMS side of the comparison instead of reading the form fields directly.
The important facts include:
nidms_given_names
nidms_surname
nidms_passport_number
nidms_address_in_malta
nidms_employment_start_date
nidms_employment_end_date
Not every routing fact appears on the form. Keep those values as defined
Profile Variables and set them when the run is created. For example,
application_type, submitter_type, employer_kind, and hiring_route
remain set values. Do not change them to derived values without a real source
field.
The NIDMS identity tutorial explains how the two kinds of Profile Variable work together.
2. Check the document catalogue¶
Before creating the flow, open the document catalogue in Admin and confirm that every requirement and accepted document type exists.
Most of the required catalogue already exists:
- Travel Document;
- Work Contract;
- Position Description;
- Proof of Advertisement;
- Declaration of Suitability;
- Health Screening Approval;
- property lease, accommodation declaration, and keeper's declaration;
- Housing Authority Approval;
- Professional Lease Attestation;
- Health Insurance;
- Driving Licence;
- Pre-Departure Course Certificate;
- Food Handling Certificate;
- Security Licence and Tag;
- Electrician Licence;
- Nursing/Midwifery Certificate; and
- Tourism and Hospitality Skills Pass.
Catalogue support used by this flow¶
The Identità catalogue includes the checklist-specific additions below. Check that they are present before activating a manually created flow:
| Catalogue feature | Why it exists |
|---|---|
| Applicant property purchase | Property Purchase Agreement is separate from Proof of Purchase (non-EU landlord), which proves an accommodation provider's ownership. |
| Lease attestation | Lease Professional Attestation is a separate requirement. A rented application needs the lease and the attestation, not one or the other. |
| Position Description signatures | applicant_signature and employer_signature are separate Signature fields. |
| Advertisement channels | advertising_channels stores every channel; its validator uses the canonical Jobsplus, EURES, local, and other values. |
| Vehicle details in contract | Work Contract fields store the vehicle type, sitting-passenger capacity, driver capacity, and wheelchair-user capacity. |
Also confirm that the main Accommodation Evidence requirement accepts:
- Property Lease Agreement;
- Property Purchase Agreement;
- Keeper's Declaration for a hotel or guest house; and
- Declaration of Accommodation for free accommodation.
The Lease Professional Attestation must remain a separate requirement.
Note
A Step points to a requirement, and a requirement lists the document types that may satisfy it. Alternatives belong inside one requirement. Documents that must both be supplied need separate Steps.
3. Create the empty flow¶
- Open Flows.
- Select New Flow.
- Enter
New Single Permit Checklistas the name. - Enter
Documents and checks for a new Single Permit applicationas the description. - Clear Active while the flow is being built.
- Select Create.
The empty builder contains Steps, Profile Variables, Cross-Document Checks, and Manifest Preview.
4. Add the routing Profile Variables¶
Profile Variables answer the questions that decide which conditional Steps belong in one applicant's manifest.
Create these variables with manual only as the source:
| Label | Name | Type | Choices or meaning |
|---|---|---|---|
| Accommodation type | accommodation_kind |
Choice | rented, owned, hotel, hosted_free |
| Health screening required | health_screening_required |
Yes / No | Whether IDCU screening approval applies. |
| Sports employment | sports_employment |
Yes / No | Whether the sports-association endorsement rule applies. |
| Operates an LPTV | operates_lptv |
Yes / No | Requires a Malta or EU driving licence. |
| Operates another vehicle | operates_other_vehicle |
Yes / No | Requires the appropriate country-of-origin driving licence. |
| Pre-departure course required | pre_departure_course_required |
Yes / No | Whether the course certificate is required for this applicant. |
| Food handling role | food_handling_role |
Yes / No | Requires a food-handling certificate. |
| Security officer role | security_officer_role |
Yes / No | Requires both the security tag and police licence evidence. |
| Electrician role | electrician_role |
Yes / No | Requires the Maltese electrician licence. |
| Nursing or midwifery role | nursing_midwifery_role |
Yes / No | Requires the Maltese council certificate. |
| Tourism or hospitality role | tourism_hospitality_role |
Yes / No | Requires full Skills Pass certification. |
For Accommodation type, enter these choices:
rented | Rented property
owned | Applicant-owned property
hotel | Hotel or guest house
hosted_free | Free accommodation
Use separate Yes/No variables for the occupations. One applicant can need more than one extra document. For example, a catering job in hospitality may need both a Food Handling Certificate and a Skills Pass.
To add each variable:
- Select Add Variable.
- enter the Label and Name exactly as shown;
- choose Choice or Yes / No;
- leave document auto-derivation empty;
- add a short description; and
- select Add variable.
The officer sets these answers on the run's Application tab. An integration can populate them earlier when NIDMS and occupation routing are connected.
5. Add the always-needed Steps¶
Add these Steps first. Keep Core step selected, leave Required when empty, and use Send back when a required document is missing.
| Order | Bundle | Document requirement | Reviewer notes |
|---|---|---|---|
| 10 | Identity | Identità: Passport | Full copy, including blank pages; original must be presented at biometrics. |
| 20 | Employment | Identità: Work Contract | Must include wage and duration and be signed by applicant and employer. |
| 30 | Employment | Identità: Position Description | Must be completed and signed by applicant and employer; details must correspond with the contract. |
| 40 | Employment | Identità: Proof of Advertisement | Jobsplus and EURES; full publication date; at least 3 weeks within the 2 months before application. |
| 50 | Employment | Identità: Declaration of Suitability | Must be fully completed and signed by the employer. |
| 70 | Health | Identità: Health Insurance | Issued policy, not a quote; EUR 100,000 minimum; outpatient and hospital cover; covers the first year. |
| 80 | Accommodation | Identità: Accommodation Document | Applicant must appear as lessee, purchaser, guest, or accommodated person as applicable. |
Add the Passport Step like this:
- Select Add Step.
- choose Identità: Passport;
- enter order
10; - enter bundle
Identity; - keep Core step selected;
- choose Send back for a missing document;
- leave both conditions empty;
- enter the reviewer note from the table; and
- select Add step.
Repeat the same pattern for the other core rows.
6. Add conditional health and accommodation Steps¶
Conditional Steps should have Core step cleared. Their condition decides whether they belong in the manifest.
Health Screening Approval¶
| Option | Value |
|---|---|
| Order | 60 |
| Bundle | Health |
| Requirement | Identità: Health Screening Approval |
| Required when | Health screening required is yes |
| Missing action | Send back |
The checklist refers to the IDCU requirements. Set
health_screening_required from the applicable health-screening policy. If
the approval is required for every application handled by this flow, make the
Step core and remove the variable.
Housing Authority Approval¶
| Option | Value |
|---|---|
| Order | 90 |
| Bundle | Accommodation |
| Requirement | Identità: Housing Authority Approval |
| Required when | Accommodation type is rented |
| Missing action | Send back |
Lease Professional Attestation¶
| Option | Value |
|---|---|
| Order | 100 |
| Bundle | Accommodation |
| Requirement | Lease Professional Attestation |
| Required when | Accommodation type is rented |
| Depends on | Identità: Accommodation Document |
| Missing action | Send back |
The attestation must be signed by the landlord and completed and officially stamped by the lawyer, notary, or legal procurator.
7. Add the vehicle and occupation Steps¶
Add these with Core step cleared:
| Order | Requirement | Required when |
|---|---|---|
| 110 | Identità: Driving Licence | ANY: Operates an LPTV is yes; Operates another vehicle is yes |
| 120 | Identità: Pre-Departure Course Certificate | Pre-departure course required is yes |
| 130 | Identità: Food Handling Certificate | Food handling role is yes |
| 140 | Identità: Security Licence & Tag | Security officer role is yes |
| 150 | Identità: Electrician Licence B | Electrician role is yes |
| 160 | Identità: Nursing/Midwifery Certificate | Nursing or midwifery role is yes |
| 170 | Identità: Skills Pass | Tourism or hospitality role is yes |
Use bundle Occupation-specific evidence for all of them.
For the Driving Licence Step:
- add the first condition, Operates an LPTV is yes;
- add the second condition, Operates another vehicle is yes; and
- choose ANY of rather than ALL of.
The applicant needs a licence when either driving route applies.
The supplied checklist does not explicitly limit the Pre-Departure Course to
one occupation. The separate pre_departure_course_required variable avoids
hard-coding an assumption. If the governing policy later says that every new
application needs it, make the Step core.
8. Add document validation rules¶
Steps answer which document is needed. Validation rules answer whether the received document meets the checklist.
The flow builder does not currently expose a form for creating
FlowValidationRule records. Add these through the validated flow seed or
Django Admin. The supplied flow importer validates the rule structure before
it updates a tenant.
Add at least these rules:
| Document | Rule | Operator and evidence | Failure action |
|---|---|---|---|
| Passport | Full passport copy | equals: full_copy_complete = true |
Send back |
| Passport | More than 8 months validity | minimum_date_offset_months: expiry_date, 8 months |
Send back |
| Work Contract | Applicant signature present | required: applicant_signature |
Send back |
| Work Contract | Employer signature present | required: employer_signature |
Send back |
| Work Contract | Wage present | required: gross_salary |
Send back |
| Work Contract | Employment duration present | Require commencement_date; review contract_end_date or open-ended wording |
Send back |
| Work Contract | Sports endorsement | Conditional on sports_employment is yes; equals: sports_association_endorsed = true |
Send back |
| Work Contract | Wage complies with current DIER rules | external_review: gross_salary, salary_frequency |
Flag to officer |
| Position Description | Applicant signature present | required: applicant_signature |
Send back |
| Position Description | Employer signature present | required: employer_signature |
Send back |
| Proof of Advertisement | Full publication date present | required: publication_date |
Send back |
| Proof of Advertisement | Published within previous 2 months | date_within_application_window: publication_date, 2 months |
Send back |
| Proof of Advertisement | Advert ran for at least 3 weeks | minimum_number: advertised_duration_days >= 21 |
Send back |
| Proof of Advertisement | Jobsplus and EURES both present | external_review until the rule engine supports a contains-all operator |
Send back |
| Declaration of Suitability | Employer signature present | required: employer_signature |
Send back |
| Health Screening | IDCU approval | equals: is_from_idcu = true; review approval_outcome |
Send back |
| Health Insurance | Hospitalisation covered | equals: hospitalisation_covered = true |
Send back |
| Health Insurance | Outpatient treatment covered | equals: outpatient_covered = true |
Send back |
| Health Insurance | At least EUR 100,000 | minimum_number: coverage_limit >= 100000 |
Send back |
| Health Insurance | At least 12 months | minimum_period_months: coverage start/end, 12 months |
Send back |
| Driving Licence | Not expired | minimum_date_offset_months: expiry_date, 0 months |
Send back |
| Driving Licence | Correct issuing authority for route | external_review: issuing_country, vehicle_categories |
Flag to officer |
| Skills Pass | QR verification is valid | Review verification_code.valid from SkillsPassQRCode |
Send back |
Do not put policy thresholds such as EUR 100,000 into the general money field type. Store the truthful amount and let a named business rule fail. See How validation works.
9. Add the important cross-document checks¶
Now compare the facts that should tell the same story across the application pack.
Create these checks:
| Key | Name | Match type | Suggested field sets |
|---|---|---|---|
SP01 |
Applicant name | Fuzzy | Passport given_names + surname; Work Contract full_name; Position Description applicant name when added; Declaration of Suitability full_name; Health Insurance full_name; role certificates full_name |
SP02 |
Passport number | Exact | Passport passport_number; Work Contract passport_number; Declaration of Suitability applicant_document_number |
SP03 |
Employer name | Fuzzy | Work Contract employer_name; Position Description employer_name; Proof of Advertisement employer_name; Declaration of Suitability employer_name |
SP04 |
Job title | Fuzzy | Work Contract job_title; Position Description job_title; Proof of Advertisement job_titles; Declaration of Suitability job_title |
SP05 |
Wage | Exact | Work Contract gross_salary + salary_frequency; Position Description gross_salary + salary_frequency |
SP06 |
Applicant signature | Signature | Work Contract applicant_signature; Position Description applicant_signature |
SP07 |
Employer signature | Signature | Work Contract employer_signature; Position Description employer_signature; Declaration of Suitability employer_signature |
SP08 |
Accommodation address | Fuzzy | Accommodation document property_address; Housing Authority Approval property_address; Lease Attestation property_address |
SP09 |
Applicant is accommodation holder | Fuzzy | Passport name; lease lessees, purchase agreement purchasers, accommodation declaration full_name, or keeper declaration full_name |
SP10 |
Insured person | Fuzzy | Passport name; Health Insurance full_name |
SP11 |
Licence or certificate holder | Fuzzy | Passport name; applicable Driving Licence, Food Handling, Security, Electrician, Nursing, Pre-Departure, or Skills Pass holder name |
SP12 |
Skills Pass role | Fuzzy | Skills Pass job_family; Work Contract and Position Description job_title |
Use Block severity and Send back when a mismatch means the submitted pack must be corrected. Use Flag and Flag to officer for signatures, external records, or wording that needs judgement.
The Proof of Advertisement job_titles field is a list. The fuzzy check
compares each advertised job separately and passes when one candidate matches
the proposed role. See
Standardise difficult cross-checks
and the match-type reference.
Add the NIDMS profile comparisons¶
Add a Profile variables field set to the applicable checks:
- NIDMS applicant name against Passport and employment documents;
- NIDMS passport number against the Passport;
- NIDMS Malta address against the accommodation pack; and
- NIDMS intended employment dates against insurance and accommodation coverage.
Choose the derived nidms_* variables as the reference source. The run first
extracts the Residence Application Form, resolves those Profile Variables,
and then compares the uploaded evidence with the resolved NIDMS profile.
10. Add reviewer notes from the checklist¶
Reviewer notes keep instructions visible beside each run requirement. Include:
- every uploaded original must be presented at the biometrics appointment;
- the passport copy must include blank pages;
- sports contracts need the association endorsement;
- vehicle-operating contracts must state the vehicle and capacities;
- the Position Description must correspond with the contract;
- accommodation evidence must name the applicant;
- a lease must show start and end dates;
- a hotel requires the Keeper's Declaration;
- free accommodation requires the Declaration of Accommodation;
- the lease attestation needs the landlord signature and professional stamp;
- an insurance quote is not a policy; and
- role-specific licences and certificates must belong to the applicant.
Notes explain what to review. Use validation rules and cross-checks for findings that must appear in Checks and affect the recommendation.
11. Test the Manifest Preview¶
Do not activate the flow until the preview produces the right list for several profiles.
Scenario A: ordinary office role in rented accommodation¶
accommodation_kind = rented
health_screening_required = yes
all occupation flags = no
pre_departure_course_required = no
Expected conditional documents:
- Health Screening Approval;
- Housing Authority Approval; and
- Lease Professional Attestation.
No driving or occupation-specific certificate should appear.
Scenario B: hospitality catering role in a hotel¶
accommodation_kind = hotel
health_screening_required = yes
food_handling_role = yes
tourism_hospitality_role = yes
pre_departure_course_required = yes
Expected accommodation document:
- Keeper's Declaration through the Accommodation Evidence requirement.
Expected extras:
- Food Handling Certificate;
- Full Skills Pass;
- Pre-Departure Course Certificate; and
- Health Screening Approval.
Housing Authority Approval and Lease Professional Attestation must be Not required.
Scenario C: LPTV driver with free accommodation¶
accommodation_kind = hosted_free
operates_lptv = yes
operates_other_vehicle = no
Expected extras:
- Driving Licence; and
- Declaration of Accommodation through the Accommodation Evidence requirement.
If both driving variables are unanswered, the Driving Licence Step should be Undecided, not silently Not required.
12. Run one complete test application¶
After the previews are correct:
- edit the flow and select Active;
- create a test run with a non-production reference;
- fill every routing Profile Variable;
- upload one file for every required Step;
- wait for Automated review to finish;
- check Requirements for missing and Received-with-issues documents;
- check Documents for extraction validation errors;
- check Checks for document-rule and cross-document results;
- correct one extracted value and confirm that dependent results rerun;
- replace one document and confirm that stale overrides are cleared when the computed result changes; and
- download the vetting report and confirm that the checklist findings and SOP references are understandable.
Use the Run Detail reference while testing.
Finished-flow checklist¶
The flow is ready only when:
- every supplied-checklist requirement has a clear Step, condition, rule, or documented NIDMS source;
- alternatives are grouped into one requirement and documents needed together use separate Steps;
- every conditional Step has a Profile Variable and tested manifest scenario;
- each document type exposes the fields needed by its rules and cross-checks;
- factual field types do not contain policy thresholds;
- named SOP rules appear under Document checks;
- cross-document checks use the correct Exact, Fuzzy, Range, Signature, or External match type;
- Residence Application Form values are routed through derived NIDMS Profile Variables before cross-checking;
- a complete test run reaches Ready for decision; and
- the generated report explains both the evidence and the recommendation.