Files
0pt/lib/services.ts
adminandClaude Opus 4.8 125b2e1bbe feat(i18n): localize data-layer labels (lib/data + lib/services) — English base complete
All display labels in MARKETS/ENTITY_TYPES/FIELDS/ENRICHMENTS/FREQUENCIES/DELIVERY_FORMATS + SERVICES/FLOW_LABEL are now {en,sv} with stable IDs/values (pricing logic, EntityType/Frequency unions, config keys unchanged). Added entityLabel()/FREQUENCY_LABEL/FORMAT_LABEL. Updated all render sites (configurator, tjanster, beskriv, katalog/[id]) to resolve via useT(). Also fixed 2 pre-existing tsc nits (auth BufferSource cast, orders-store sql.json param type). tsc 0, build green. 0pt is now fully English-by-default with SV toggle.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 11:47:42 +02:00

48 lines
5.8 KiB
TypeScript

// The 0pt service catalog. Every sellable service maps to one of the three flows
// (docs/01): catalog product, custom job, subscription. Categories are tags within
// those flows — not separate machinery.
//
// i18n: id/flow stay stable (keys); display fields are localized { en, sv } and
// resolved with useT() at the render site.
import type { Loc } from "@/lib/data";
export type Flow = "catalog" | "custom" | "subscription";
export interface Service {
id: string;
name: Loc;
tagline: Loc; // terse, confident
covers: Loc; // one line of scope
flow: Flow;
deliverable: Loc;
mult: number; // price multiplier vs a base dataset job
}
export const SERVICES: Service[] = [
{ id: "data", name: { en: "Data delivery", sv: "Dataleverans" }, tagline: { en: "Ready-made or bespoke.", sv: "Färdig eller skräddarsydd." }, covers: { en: "Companies, decision-makers, vehicles, financials — per field, with provenance.", sv: "Bolag, beslutsfattare, fordon, finansiellt — per fält med härkomst." }, flow: "custom", deliverable: { en: "CSV · Parquet · JSON · API", sv: "CSV · Parquet · JSON · API" }, mult: 1.0 },
{ id: "scraping", name: { en: "Web scraping", sv: "Webbskrapning" }, tagline: { en: "Legally collected.", sv: "Lagligt insamlat." }, covers: { en: "Official APIs and clearly public pages. Never behind a login.", sv: "Officiella API:er och tydligt publika sidor. Aldrig bakom inloggning." }, flow: "custom", deliverable: { en: "Structured dataset + source per field", sv: "Strukturerat dataset + källa per fält" }, mult: 1.1 },
{ id: "mapping", name: { en: "Mapping & matching", sv: "Mappning & matchning" }, tagline: { en: "Your data against the world.", sv: "Era data mot världen." }, covers: { en: "Link your records to org. no./LEI and external keys. Cross-border.", sv: "Koppla era poster mot orgnr/LEI och externa nycklar. Cross-border." }, flow: "custom", deliverable: { en: "Matched file + match confidence", sv: "Matchad fil + matchningskonfidens" }, mult: 1.2 },
{ id: "normalization", name: { en: "Normalization", sv: "Normalisering" }, tagline: { en: "Cleaned. Standardized.", sv: "Städat. Standardiserat." }, covers: { en: "Format, duplicates, validation (email/phone), unified taxonomy.", sv: "Format, dubbletter, validering (e-post/telefon), enhetlig taxonomi." }, flow: "custom", deliverable: { en: "Clean data model + quality report", sv: "Ren datamodell + kvalitetsrapport" }, mult: 1.1 },
{ id: "consolidation", name: { en: "Consolidation → CRM/ERP", sv: "Konsolidering → CRM/ERP" }, tagline: { en: "One truth. The right system.", sv: "En sanning. Rätt system." }, covers: { en: "Merge admin data and push to HubSpot, Salesforce, Dynamics, Pipedrive, FiveCRM.", sv: "Slå ihop admindata och pusha till HubSpot, Salesforce, Dynamics, Pipedrive, FiveCRM." }, flow: "custom", deliverable: { en: "Consolidated data + push/sync", sv: "Konsoliderad data + push/sync" }, mult: 1.4 },
{ id: "documents", name: { en: "Documents & OCR", sv: "Dokument & OCR" }, tagline: { en: "Pixels to records.", sv: "Pixlar till poster." }, covers: { en: "PDFs, images, scanned official documents → structured fields.", sv: "PDF, bilder, scannade myndighetsdokument → strukturerade fält." }, flow: "custom", deliverable: { en: "Structured dataset from documents", sv: "Strukturerat dataset från dokument" }, mult: 1.3 },
{ id: "enrichment", name: { en: "Enrichment", sv: "Berikning" }, tagline: { en: "Fill the gaps.", sv: "Fyll luckorna." }, covers: { en: "Contacts, firmographics, financials, buying signals — with a lawful basis.", sv: "Kontakter, firmografik, finansiellt, köpsignaler — med laglig grund." }, flow: "subscription", deliverable: { en: "Enriched file or ongoing feed", sv: "Berikad fil eller löpande flöde" }, mult: 1.2 },
{ id: "icp", name: { en: "ICP & leads", sv: "ICP & leads" }, tagline: { en: "The right audience.", sv: "Rätt målgrupp." }, covers: { en: "Target lists with decision-makers, provenance per contact.", sv: "Målgruppslistor med beslutsfattare, härkomst per kontakt." }, flow: "catalog", deliverable: { en: "Lead list + export to CRM", sv: "Lead-lista + export till CRM" }, mult: 1.2 },
{ id: "ml", name: { en: "ML jobs", sv: "ML-jobb" }, tagline: { en: "Models on your data.", sv: "Modeller på er data." }, covers: { en: "Scoring, matching, forecasting, clustering — trained on your + our data.", sv: "Scoring, matchning, prognos, klustring — tränat på era + våra data." }, flow: "custom", deliverable: { en: "Model + predictions + API", sv: "Modell + prediktioner + API" }, mult: 1.8 },
{ id: "bi", name: { en: "BI & market analysis", sv: "BI & marknadsanalys" }, tagline: { en: "Decisions, not just numbers.", sv: "Beslut, inte bara siffror." }, covers: { en: "Dashboards, market overviews, competitor and coverage analysis.", sv: "Dashboards, marknadsöversikter, konkurrent- och täckningsanalys." }, flow: "custom", deliverable: { en: "Metabase dashboard + report", sv: "Metabase-dashboard + rapport" }, mult: 1.5 },
{ id: "feeds", name: { en: "Feeds & monitoring", sv: "Flöden & övervakning" }, tagline: { en: "Always fresh.", sv: "Alltid färskt." }, covers: { en: "Recurring delivery, freshness monitoring, webhook on change.", sv: "Återkommande leverans, freshness-bevakning, webhook vid förändring." }, flow: "subscription", deliverable: { en: "Webhook/feed + alerts", sv: "Webhook/feed + larm" }, mult: 1.3 },
];
export const FLOW_LABEL: Record<Flow, Loc> = {
catalog: { en: "Catalog", sv: "Katalog" },
custom: { en: "Bespoke", sv: "Skräddarsytt" },
subscription: { en: "Feed", sv: "Flöde" },
};
// CRM/ERP destinations for the consolidation/push services.
export const DESTINATIONS_CRM = ["HubSpot", "Salesforce", "Microsoft Dynamics", "Pipedrive", "FiveCRM", "Google Sheets", "CSV / API"];
export function serviceById(id: string): Service | undefined {
return SERVICES.find((s) => s.id === id);
}