A kind of company for the public employment service — France Travail, IEFP, Jobcentre Plus — dealt with throughout a search and not an employer #202

Closed
opened 2026-09-13 08:32:43 +00:00 by tiagoagueda · 0 comments
Owner

The change

A special kind of company for the public employment service a job seeker is
registered with — France Travail in France, the Bundesagentur für Arbeit in Germany, IEFP
in Portugal, SEPE in Spain, Jobcentre Plus in the United Kingdom, Intreo in Ireland, UWV
in the Netherlands, Forem, VDAB and Actiris in Belgium, and so on. It is a place somebody
deals with throughout a search — an adviser, appointments, a monthly declaration, a
report to hand over, listings taken from its board — and it is not an employer.

What Postulo has today

A Company (jobs/models.py:118) is "an employer, as recorded by one applicant": a
name, a parent (#138), industries, identifiers, a website and a careers page, a location,
notes, a logo. There is no kind. Everything a person records an organisation for is an
employer, and an employment office can only be recorded as one — which then counts it
where employers are counted: in the companies table's postings and applications, in the
report's tallies by industry, in companies I have applied to.

The office is already everywhere else in the product, unnamed:

  • The report (#56, applications/reports.py:3) exists for it — "the row an
    employment office reads" — and since #162 is filed as a document handed to it. The
    wiki (Reports.md:112) names IEFP, France Travail and the Agentur für Arbeit and says
    the report has no template per country; a company of this kind is where that office
    would get a name, on the PDF and in the file.
  • Industries carry NACE codes because that is what "an employment office that thinks
    in NACE" reads (jobs/industries.py:40).
  • Application.Channel (applications/models.py:82-88) has company website, job
    board, email, referral, recruiter, event, other
    — and no employment service, so an
    application made through France Travail's board is a job board like any other, and
    the report cannot say how many the office's own listings produced, which is the number
    the office asks first.
  • The Europass reader notes that anybody who applied "through a national employment
    service" has a Europass file (plugins/europass/reader.py:3), and the board recipes
    under plugins/builtin/boards/ list Arbeitsagentur and EURES as boards worth a recipe
    (#176), unwritten for want of a saved page.
  • An adviser is a contact, and an appointment with one is neither an interview
    (InterviewKind: phone screen, video, on site, panel, assessment) nor a reminder
    exactly.

What a fix has to settle

  • A kind on Company: employer (the default, and what every existing row is) and
    employment_service; whether a recruitment agency is a third kind now or later is
    worth deciding at the same time, since the same argument — dealt with, not applied to —
    applies to it. A column with a default, so the migration invents nothing.
  • The known services, by country. A small registry — country, name, website — so
    that adding one is a choice rather than a typing exercise, offered on the company form
    when the kind is chosen, with the person's own name winning where they typed one. It
    is also what lets a fresh instance in France propose France Travail rather than a
    blank. Which country: the profile's language is a poor proxy (a Belgian reads French),
    so the registry lists by country and the person picks.
  • What the kind changes, and what it does not. An office is not counted as an
    employer: left out of companies applied to, of the industry tallies, of the
    suggestions that read employers. It is listed on the companies page, with its kind
    visible and filterable (CompaniesTable gains a choice column, #173 made that
    cheap). Its contacts and postal addresses and links work exactly as any company's.
  • Application.Channel.EMPLOYMENT_SERVICE — through the employment service — so
    the report can say how many applications came from the office's own listings, which
    is a stored value in a TextChoices and travels through the export.
  • The report addressed to it. Where the person has a company of this kind, the report
    page and the PDF can carry its name (for France Travail) and the adviser, if there is
    one; where they have none, nothing changes. The wiki's line about no template per
    country stands.
  • Appointments and declarations — the monthly actualisation in France, the
    fortnightly signing-on in the UK — are a cadence the office imposes and Postulo could
    remind about. Worth naming here and doing separately: a reminder with a repeat is its
    own issue.
  • Export and import. COMPANY_FIELDS in core/export.py gains kind, the format
    moves to 16 and the importer reads an archive without it as employer.
  • Tests and the wiki. tests/test_tables.py for the new column and filter,
    test_export.py for the format, test_reports.py for the exclusion; Tracking
    applications
    for the kind and Reports for the addressee.

Not in this issue: any per-office template, any connection to an office's own systems,
or anything that sends the report anywhere.

## The change A special kind of company for the **public employment service** a job seeker is registered with — France Travail in France, the Bundesagentur für Arbeit in Germany, IEFP in Portugal, SEPE in Spain, Jobcentre Plus in the United Kingdom, Intreo in Ireland, UWV in the Netherlands, Forem, VDAB and Actiris in Belgium, and so on. It is a place somebody deals with throughout a search — an adviser, appointments, a monthly declaration, a report to hand over, listings taken from its board — and it is not an employer. ## What Postulo has today A `Company` (`jobs/models.py:118`) is "an employer, as recorded by one applicant": a name, a parent (#138), industries, identifiers, a website and a careers page, a location, notes, a logo. There is no kind. Everything a person records an organisation for is an employer, and an employment office can only be recorded as one — which then counts it where employers are counted: in the companies table's postings and applications, in the report's tallies by industry, in *companies I have applied to*. The office is already everywhere else in the product, unnamed: - The **report** (#56, `applications/reports.py:3`) exists for it — "the row an employment office reads" — and since #162 is filed as a document handed to it. The wiki (`Reports.md:112`) names IEFP, France Travail and the Agentur für Arbeit and says the report has no template per country; a company of this kind is where that office would get a name, on the PDF and in the file. - **Industries** carry NACE codes because that is what "an employment office that thinks in NACE" reads (`jobs/industries.py:40`). - **`Application.Channel`** (`applications/models.py:82-88`) has *company website, job board, email, referral, recruiter, event, other* — and no *employment service*, so an application made through France Travail's board is a *job board* like any other, and the report cannot say how many the office's own listings produced, which is the number the office asks first. - The **Europass reader** notes that anybody who applied "through a national employment service" has a Europass file (`plugins/europass/reader.py:3`), and the board recipes under `plugins/builtin/boards/` list Arbeitsagentur and EURES as boards worth a recipe (#176), unwritten for want of a saved page. - An **adviser** is a contact, and an **appointment** with one is neither an interview (`InterviewKind`: phone screen, video, on site, panel, assessment) nor a reminder exactly. ## What a fix has to settle - **A kind on `Company`**: `employer` (the default, and what every existing row is) and `employment_service`; whether a *recruitment agency* is a third kind now or later is worth deciding at the same time, since the same argument — dealt with, not applied to — applies to it. A column with a default, so the migration invents nothing. - **The known services, by country.** A small registry — country, name, website — so that adding one is a choice rather than a typing exercise, offered on the company form when the kind is chosen, with the person's own name winning where they typed one. It is also what lets a fresh instance in France propose *France Travail* rather than a blank. Which country: the profile's language is a poor proxy (a Belgian reads French), so the registry lists by country and the person picks. - **What the kind changes, and what it does not.** An office is not counted as an employer: left out of *companies applied to*, of the industry tallies, of the suggestions that read employers. It *is* listed on the companies page, with its kind visible and filterable (`CompaniesTable` gains a `choice` column, #173 made that cheap). Its contacts and postal addresses and links work exactly as any company's. - **`Application.Channel.EMPLOYMENT_SERVICE`** — *through the employment service* — so the report can say how many applications came from the office's own listings, which is a stored value in a `TextChoices` and travels through the export. - **The report addressed to it.** Where the person has a company of this kind, the report page and the PDF can carry its name (*for France Travail*) and the adviser, if there is one; where they have none, nothing changes. The wiki's line about no template per country stands. - **Appointments and declarations** — the monthly *actualisation* in France, the fortnightly signing-on in the UK — are a cadence the office imposes and Postulo could remind about. Worth naming here and doing separately: a reminder with a repeat is its own issue. - **Export and import.** `COMPANY_FIELDS` in `core/export.py` gains `kind`, the format moves to 16 and the importer reads an archive without it as *employer*. - **Tests and the wiki.** `tests/test_tables.py` for the new column and filter, `test_export.py` for the format, `test_reports.py` for the exclusion; *Tracking applications* for the kind and *Reports* for the addressee. Not in this issue: any per-office template, any connection to an office's own systems, or anything that sends the report anywhere.
tiagoagueda added this to the 0.3.0 milestone 2026-09-13 08:32:43 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Postulo/postulo#202
No description provided.