Companies: a status — legal state (active, in administration, acquired, dissolved) and a dated hiring signal (hiring, freeze, laying off) #941

Closed
opened 2026-10-16 15:36:11 +00:00 by tiagoagueda · 0 comments
Owner

A company has no status. Somebody looking for work wants to see at a glance whether a company is active, hiring right now, has frozen hiring, is laying people off, has been acquired, or no longer exists. They also want to see when that was last known, and from where.

What exists today

  • No status field. Company (src/postulo/jobs/models.py:517) holds a name, a kind, a parent company, the website and careers address, the email, industries and a logo.
  • Only listings have a state. Listings do (ListingState: new, shortlisted, discarded, applied, closed), and so do applications, but companies don't.
  • Companies are shared records (#896). One company row can be seen by several people, while notes and listing statuses are per reader. A status therefore has to be either a fact about the company, shared, or a person's own reading. The two are different, and the design below keeps them apart.

What would change

Two things that are easy to conflate, kept apart.

A fact, shared with everybody who can see the company:

  • Active (default)
  • In administration / insolvency
  • Acquired or merged into: with a link to the company it became part of, when that company is recorded.
  • Dissolved / closed: with the date, where known.

How it is set:

  • By hand, with the date it became true and, optionally, where it was learnt (an address).

  • Filled in from the outside on request, where a source says so:

    • the company register lookup (#935): registers report "dissolved", "in liquidation" and so on;
    • Wikidata, already looked up for names and place (#673): dissolved, abolished or demolished date (P576), replaced by (P1366), owned by (P127).

    It is never changed silently. The person confirms, as with the other lookups.

2. Hiring signal: what the company is doing now

This changes over time and is dated:

  • Hiring
  • Hiring freeze
  • Laying off / restructuring
  • Unknown (default)

How it is set:

  • Each entry has a date and an optional source (a news article, a post). An entry older than a set age (for example 90 days) is shown as as of , so an old "hiring" does not read as current.
  • Postulo can suggest "Hiring" when the company has open listings recorded (not closed, closing date not passed). It is a suggestion, shown as derived ("3 open listings"), not stored as if somebody had said it.
  • History. Previous entries are kept as a short history on the company page, so "laid off 200 in March, hiring again in June" stays readable.

Where it shows

  • Company page: a badge next to the name (legal state when not Active, plus the hiring signal) and the history.
  • Companies table and map: a column or marker style, and a filter (hiring, exclude dissolved).
  • Listings and applications:
    • a quiet warning when the company is dissolved, in administration, or laying off ("This company was dissolved on …");
    • capturing or adding a listing for a dissolved company asks for confirmation.
  • API, export, import, vCard: the fields travel with the company (#934's parity applies).

Design questions to decide

  • Who may change a shared fact. Who may set the legal state of a company shared with others: the owner only, or anyone who can edit it? See the #896 rules.
  • Whether a reader can add their own signal. Can each reader keep a private hiring signal ("I heard they freeze"), or is the signal shared like the legal state? Proposed: legal state shared, hiring signal shared with an author and a date on each entry.
  • Which wording. Use neutral, factual labels. "Laying off" is a fact with a date and a source, not an opinion of the company.
  • New text. New labels go through the catalogues (Weblate).

#896 (shared records), #673 (Wikidata lookup), #935 (register lookup), #934 (same fields across export, API and vCard), #897 (sector and industry).

A company has no status. Somebody looking for work wants to see at a glance whether a company is active, hiring right now, has frozen hiring, is laying people off, has been acquired, or no longer exists. They also want to see when that was last known, and from where. ## What exists today - **No status field.** `Company` (`src/postulo/jobs/models.py:517`) holds a name, a kind, a `parent` company, the website and careers address, the email, industries and a logo. - **Only listings have a state.** Listings do (`ListingState`: new, shortlisted, discarded, applied, closed), and so do applications, but companies don't. - **Companies are shared records (#896).** One company row can be seen by several people, while notes and listing statuses are per reader. A status therefore has to be either a fact about the company, shared, or a person's own reading. The two are different, and the design below keeps them apart. ## What would change Two things that are easy to conflate, kept apart. ### 1. Legal state: what the company *is* A fact, shared with everybody who can see the company: - **Active** (default) - **In administration / insolvency** - **Acquired or merged into**: with a link to the company it became part of, when that company is recorded. - **Dissolved / closed**: with the date, where known. How it is set: - **By hand**, with the date it became true and, optionally, where it was learnt (an address). - **Filled in from the outside on request**, where a source says so: - the company register lookup (#935): registers report "dissolved", "in liquidation" and so on; - Wikidata, already looked up for names and place (#673): *dissolved, abolished or demolished date* (P576), *replaced by* (P1366), *owned by* (P127). It is never changed silently. The person confirms, as with the other lookups. ### 2. Hiring signal: what the company is *doing now* This changes over time and is dated: - **Hiring** - **Hiring freeze** - **Laying off / restructuring** - **Unknown** (default) How it is set: - **Each entry has a date and an optional source** (a news article, a post). An entry older than a set age (for example 90 days) is shown as *as of <date>*, so an old "hiring" does not read as current. - **Postulo can suggest "Hiring"** when the company has open listings recorded (not closed, closing date not passed). It is a suggestion, shown as derived ("3 open listings"), not stored as if somebody had said it. - **History.** Previous entries are kept as a short history on the company page, so "laid off 200 in March, hiring again in June" stays readable. ### Where it shows - **Company page:** a badge next to the name (legal state when not *Active*, plus the hiring signal) and the history. - **Companies table and map:** a column or marker style, and a filter (*hiring*, *exclude dissolved*). - **Listings and applications:** - a quiet warning when the company is dissolved, in administration, or laying off (*"This company was dissolved on …"*); - capturing or adding a listing for a dissolved company asks for confirmation. - **API, export, import, vCard:** the fields travel with the company (#934's parity applies). ### Design questions to decide - **Who may change a shared fact.** Who may set the legal state of a company shared with others: the owner only, or anyone who can edit it? See the #896 rules. - **Whether a reader can add their own signal.** Can each reader keep a private hiring signal ("I heard they freeze"), or is the signal shared like the legal state? Proposed: legal state shared, hiring signal shared with an author and a date on each entry. - **Which wording.** Use neutral, factual labels. "Laying off" is a fact with a date and a source, not an opinion of the company. - **New text.** New labels go through the catalogues (Weblate). ## Related #896 (shared records), #673 (Wikidata lookup), #935 (register lookup), #934 (same fields across export, API and vCard), #897 (sector and industry).
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#941
No description provided.