Announcements and calls
Public information published by government users
Announcements and calls are the public-facing publishing records. An announcement shares information; a Call for Technology invites relevant capability submissions. Neither model stores source-selection decisions or procurement-sensitive content. Announcement files are stored in a separate attachment model, and calls move through a release lifecycle before they become public.
Announcement
| Column | Prisma type | Required? | Default | Meaning |
|---|---|---|---|---|
id | String | Yes | cuid() | Announcement identifier. |
title | String | Yes | None | Public headline. |
body | String | Yes | None | Public message. |
authorId | String | Yes | None | Government publisher. |
published | Boolean | Yes | true | Publication flag used by public feeds. |
createdAt | DateTime | Yes | now() | Publication/creation time. |
The author relation identifies the government user who published it, and attachments is the reverse relation for files added after publication. The portal feed filters to published records and orders newest first.
CallForTechnology
| Column | Prisma type | Required? | Default | Meaning |
|---|---|---|---|---|
id | String | Yes | cuid() | Call identifier. |
title | String | Yes | None | Public call title. |
description | String | Yes | None | What the government team wants to learn. |
techTags | String | Yes | "" | Lowercase matching vocabulary. |
status | CallStatus | Yes | OPEN | Whether submissions may reference it. |
releasesAt | DateTime? | No | NULL | Scheduled release time for a pending call. |
closesAt | DateTime? | No | NULL | Optional closing date. |
createdAt | DateTime | Yes | now() | Creation time. |
closedAt | DateTime? | No | NULL | Time of the latest close transition, when applicable. |
updateCount | Int | Yes | 0 | Number of lifecycle status changes. |
submissions is the reverse relation for submissions that reference the call.
AnnouncementAttachment
| Column | Prisma type | Required? | Default | Meaning |
|---|---|---|---|---|
id | String | Yes | cuid() | Attachment identifier. |
announcementId | String | Yes | None | Announcement containing the attachment. |
announcement | Announcement | Yes | None | Relation to the containing announcement. |
fileName | String | Yes | None | Original filename shown to users. |
contentType | String | Yes | None | Validated media type. |
sizeBytes | Int | Yes | None | File size in bytes. |
data | Bytes | Yes | None | File bytes stored in the database. |
uploadedById | String | Yes | None | Government user who uploaded the file. |
uploadedBy | User | Yes | None | Relation to the uploading government user. |
createdAt | DateTime | Yes | now() | Upload time. |
The announcement relation cascades when an announcement is deleted. The uploader relation identifies the government account that added the file.
PresetTag
| Column | Prisma type | Required? | Default | Meaning |
|---|---|---|---|---|
id | String | Yes | cuid() | Preset identifier. |
label | String | Yes | None | Unique normalized label shown as a tag chip. |
createdById | String | Yes | None | System Admin who created the preset. |
createdBy | User | Yes | None | Relation to the System Admin who created it. |
createdAt | DateTime | Yes | now() | Creation time. |
The createdBy relation records the System Admin who added the preset. Presets guide tag entry but do not constrain the free-text values stored on records.
CallStatus enum
| Value | Meaning |
|---|---|
OPEN | Visible as an open call and eligible for new references. |
CLOSED | No longer open for new submissions. |
DRAFT | Government-only working copy that has not been released. |
PENDING | Government-only call scheduled with a future releasesAt; it is treated as open after that time. |
Publication behavior
Government publishing routes validate title and body lengths, normalize call tags, create an audit event, and notify industry users subject to their notification settings when an announcement is published or a call becomes publicly open. Draft and pending calls are government-only. A pending call becomes visible to industry when its releasesAt time passes through query-time release handling, without a scheduled notification.
Dates and closure
closesAt is optional, and the call helper also treats a past closing date as closed even if the stored enum still says OPEN. This prevents a stale status value from keeping a time-bounded call open. A government PATCH can explicitly set CLOSED.
Announcements use a Boolean published rather than a separate publication event model. The current create route creates published records, and announcement attachments can be uploaded after that publication. The portal exposes attachment filenames and sizes to everyone, but only signed-in users can download the bytes.
Calls and announcements remain text records with tags and deadlines; announcement files belong to AnnouncementAttachment, while submission files use their own storage model.
