import { inputText } from '../../lib/input-text.ts'; import type { ReactNode } from 'react'; export type Lot = { code: string; description: string; quantities: string }; export type Attachment = { resource_id: number; public: boolean; purpose: string; title?: string; available?: boolean; }; export type Draft = { [key: string]: string | number | boolean | null | Lot[] | Attachment[]; }; export type Payload = Draft & { opportunity?: { title: string; url: string } | null; }; export type Publication = { id: string; version: number; act: string; payload: Payload; published_at: string; reason: string; }; export const states: Record = { open: 'Aberto', extended: 'Prorrogado', deadline_ended: 'Prazo de propostas terminado', cancelled: 'Cancelado', results: 'Resultados publicados', }; export const acts: Record = { initial: 'Anúncio inicial', clarification: 'Esclarecimento', correction: 'Rectificação', extension: 'Prorrogação', award: 'Resultado / adjudicação', cancellation: 'Cancelamento', other: 'Outro acto', }; export const labels: Record = { reference: 'Referência', object: 'Objecto', responsible_unit: 'Unidade responsável / UGEA quando aplicável', modality: 'Modalidade', object_kind: 'Natureza do objecto', quantities: 'Quantidades essenciais', financier: 'Financiador', instrument: 'Instrumento aplicável', edition: 'Edição aplicável', rule_source: 'Fonte das regras', financing_agreement: 'Acordo de financiamento', eligibility: 'Elegibilidade', requirements: 'Requisitos de participação', proposal_validity: 'Validade da proposta', guarantee_status: 'Aplicabilidade de garantias', guarantees: 'Garantias documentadas', delivery_channel: 'Canal de entrega', delivery_address: 'Endereço / instruções para apresentar proposta', delivery_url: 'Plataforma de entrega', public_contact: 'Contacto público autorizado', dissemination: 'Meios de divulgação exigidos / adoptados e comprovativos', origin_url: 'Anúncio de origem', origin_published_at: 'Publicação de origem — referência do prazo', clarifications_at: 'Limite para esclarecimentos', deadline: 'Entrega de propostas', opening_at: 'Abertura (quando aplicável)', timezone: 'Fuso horário do procedimento', minimum_days: 'Prazo mínimo documentado (dias)', minimum_source: 'Fonte / citação do prazo mínimo', minimum_edition: 'Edição da regra de prazo', minimum_modality: 'Modalidade da regra de prazo', minimum_day_basis: 'Base de contagem do prazo', minimum_calendar_source: 'Fonte do calendário de dias úteis', minimum_working_days: 'Dias de trabalho (1=segunda, 7=domingo)', minimum_holidays: 'Feriados e exclusões documentados', result: 'Acto ou resultado documentado', }; export const control = 'w-full rounded border border-slate-400 bg-background p-2 text-foreground'; export function Field({ label, children, }: { label: string; children: ReactNode; }) { return ( ); } export function NoticeContent({ p }: { p: Payload }) { const links = ['rule_source', 'origin_url', 'delivery_url']; const names: Record = { works: 'Obras', goods: 'Bens', services: 'Serviços', mixed: 'Misto', other: 'Outro', required: 'Exigidas', not_required: 'Não exigidas', unknown: 'Por determinar', calendar: 'Dias corridos', business: 'Dias úteis', }; return (

{inputText(p.title ?? '')}

Entidade:{' '} {inputText(p.organization_name ?? 'Por indicar')}

Regime:{' '} {( { state: 'Contratação pública do Estado', external: 'Financiamento externo', private: 'Concurso privado', other: 'Outro regime documentado', } as Record )[inputText(p.regime)] ?? 'Por indicar'}

Objecto e como participar

{inputText(p.object ?? '')}

Entrega:{' '} {inputText(p.deadline ?? 'Por indicar').replace('T', ' ')} ·{' '} {inputText(p.timezone ?? '')}
{inputText(p.delivery_channel ?? '')} ·{' '} {inputText(p.delivery_address ?? '')}

Sector: {inputText(p.sector_name ?? 'Por indicar')} · Localização: {inputText(p.territory_name ?? 'Por indicar')}

{p.project_name && (

Projecto relacionado: {inputText(p.project_name)}. Esta relação não confirma execução ou contratação.

)} {p.opportunity && ( Oportunidade relacionada: {p.opportunity.title} )}
{p.deadline_previous && (

Prorrogação: prazo anterior{' '} {inputText(p.deadline_previous).replace('T', ' ')} ( {inputText(p.timezone_previous)}) → novo prazo{' '} {inputText(p.deadline).replace('T', ' ')} ( {inputText(p.timezone)} ).

)}
{Object.entries(labels) .filter( ([key]) => p[key] !== null && p[key] !== undefined && p[key] !== '', ) .map(([key, label]) => (
{label}
{links.includes(key) ? ( {inputText(p[key])} ) : ( ( names[inputText(p[key])] ?? inputText(p[key]) ).replace(/^(\d{4}-\d{2}-\d{2})T/, '$1 ') )}
))}

Lotes

{((p.lots ?? []) as Lot[]).length ? (
    {(p.lots as Lot[]).map((lot, i) => (
  • {lot.code} — {lot.description} ·{' '} {lot.quantities}
  • ))}
) : (

Sem lotes indicados.

)}

Documentos do concurso

{!((p.attachments as Attachment[]) ?? []).length && (

Sem anexos públicos neste acto. Consulte o canal e o anúncio de origem.

)}

O InvesteMoz divulga este acto e não recebe propostas nesta secção. Apresente a proposta no canal indicado nos documentos. Esta divulgação não substitui os meios oficiais exigidos, não comprova envio à UFSA ou ao financiador e não equivale à execução do investimento.

); }