Files
ArchiTools/src/modules/parcel-sync/services/eterra-layers.ts
T
AI Assistant 7cdea66fa2 feat: add parcel-sync module (eTerra ANCPI integration with PostGIS)
- 31 eTerra layer catalog (terenuri, cladiri, documentatii, administrativ)
- Incremental sync engine (OBJECTID comparison, only downloads new features)
- PostGIS-ready Prisma schema (GisFeature, GisSyncRun, GisUat models)
- 7 API routes (/api/eterra/login, count, sync, features, layers/summary, progress, sync-status)
- Full UI with 3 tabs (Sincronizare, Parcele, Istoric)
- Env var auth (ETERRA_USERNAME / ETERRA_PASSWORD)
- Real-time sync progress tracking with polling
2026-03-06 00:36:29 +02:00

287 lines
6.7 KiB
TypeScript

/**
* eTerra layer catalog — all known layers grouped by category.
*/
import type { LayerConfig } from "./eterra-client";
export type LayerCategory =
| "terenuri"
| "documentatii"
| "cladiri"
| "administrativ";
export type LayerCatalogItem = LayerConfig & {
label: string;
category: LayerCategory;
};
export const LAYER_CATEGORY_LABELS: Record<LayerCategory, string> = {
terenuri: "Terenuri",
documentatii: "Documentații",
cladiri: "Clădiri",
administrativ: "Administrativ",
};
export const LAYER_CATALOG: LayerCatalogItem[] = [
// ── Terenuri ──
{
id: "TERENURI_ACTIVE",
name: "TERENURI_ACTIVE",
label: "Terenuri active",
category: "terenuri",
endpoint: "aut",
whereTemplate: "{{adminField}}={{siruta}} AND IS_ACTIVE=1",
},
{
id: "TERENURI_NEINREGISTRATE",
name: "TERENURI_NEINREGISTRATE",
label: "Terenuri neînregistrate",
category: "terenuri",
endpoint: "aut",
},
{
id: "TERENURI_IN_LUCRU",
name: "TERENURI_IN_LUCRU",
label: "Terenuri în lucru",
category: "terenuri",
endpoint: "aut",
},
{
id: "TERENURI_RECEPTIONATE",
name: "TERENURI_RECEPTIONATE",
label: "Terenuri recepționate",
category: "terenuri",
endpoint: "aut",
},
{
id: "TERENURI_RESPINSE",
name: "TERENURI_RESPINSE",
label: "Terenuri respinse",
category: "terenuri",
endpoint: "aut",
},
{
id: "TERENURI_PE_CERERE",
name: "TERENURI_PE_CERERE",
label: "Terenuri pe cerere",
category: "terenuri",
endpoint: "aut",
},
{
id: "CADGEN_LAND_ACTIVE",
name: "CADGEN_LAND_ACTIVE",
label: "Cadgen land active",
category: "terenuri",
endpoint: "aut",
},
// ── Clădiri ──
{
id: "CLADIRI_ACTIVE",
name: "CLADIRI_ACTIVE",
label: "Clădiri active",
category: "cladiri",
endpoint: "aut",
},
{
id: "CLADIRI_RECEPTIONATE",
name: "CLADIRI_RECEPTIONATE",
label: "Clădiri recepționate",
category: "cladiri",
endpoint: "aut",
},
{
id: "CLADIRI_RESPINSE",
name: "CLADIRI_RESPINSE",
label: "Clădiri respinse",
category: "cladiri",
endpoint: "aut",
},
{
id: "CLADIRI_PE_CERERE",
name: "CLADIRI_PE_CERERE",
label: "Clădiri pe cerere",
category: "cladiri",
endpoint: "aut",
},
{
id: "CLADIRI_IN_LUCRU",
name: "CLADIRI_IN_LUCRU",
label: "Clădiri în lucru",
category: "cladiri",
endpoint: "aut",
},
{
id: "CLADIRI_NEINREGISTRATE",
name: "CLADIRI_NEINREGISTRATE",
label: "Clădiri neînregistrate",
category: "cladiri",
endpoint: "aut",
},
{
id: "CADGEN_BUILDING_ACTIVE",
name: "CADGEN_BUILDING_ACTIVE",
label: "Cadgen building active",
category: "cladiri",
endpoint: "aut",
},
// ── Documentații ──
{
id: "EXPERTIZA_CLADIRI_ACTIVE_DYNAMIC",
name: "EXPERTIZA_CLADIRI_ACTIVE_DYNAMIC",
label: "Expertiză clădiri active",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "EXPERTIZA_CLADIRI_INACTIVE_DYNAMIC",
name: "EXPERTIZA_CLADIRI_INACTIVE_DYNAMIC",
label: "Expertiză clădiri inactive",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "EXPERTIZA_TERENURI_ACTIVE_DYNAMIC",
name: "EXPERTIZA_TERENURI_ACTIVE_DYNAMIC",
label: "Expertiză terenuri active",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "EXPERTIZA_TERENURI_INACTIVE_DYNAMIC",
name: "EXPERTIZA_TERENURI_INACTIVE_DYNAMIC",
label: "Expertiză terenuri inactive",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "EXPERTIZA_JUDICIARA_ADMISE_DYNAMIC",
name: "EXPERTIZA_JUDICIARA_ADMISE_DYNAMIC",
label: "Expertiză judiciară admise",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "EXPERTIZA_JUDICIARA_RESPINSE_DYNAMIC",
name: "EXPERTIZA_JUDICIARA_RESPINSE_DYNAMIC",
label: "Expertiză judiciară respinse",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "EXPERTIZA_JUDICIARA_NEINREGISTRATE_DYNAMIC",
name: "EXPERTIZA_JUDICIARA_NEINREGISTRATE_DYNAMIC",
label: "Expertiză judiciară neînreg.",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "ZONE_INTERES_ACTIVE_DYNAMIC",
name: "ZONE_INTERES_ACTIVE_DYNAMIC",
label: "Zone interes active",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "ZONE_INTERES_INACTIVE_DYNAMIC",
name: "ZONE_INTERES_INACTIVE_DYNAMIC",
label: "Zone interes inactive",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "ZONE_INTERES_PROPUSE_DYNAMIC",
name: "ZONE_INTERES_PROPUSE_DYNAMIC",
label: "Zone interes propuse",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "RECEPTII_TEHNICE_ADMISE_DYNAMIC",
name: "RECEPTII_TEHNICE_ADMISE_DYNAMIC",
label: "Recepții tehnice admise",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "RECEPTII_TEHNICE_RESPINSE_DYNAMIC",
name: "RECEPTII_TEHNICE_RESPINSE_DYNAMIC",
label: "Recepții tehnice respinse",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "RECEPTII_TEHNICE_NEINREGISTRATE_DYNAMIC",
name: "RECEPTII_TEHNICE_NEINREGISTRATE_DYNAMIC",
label: "Recepții tehnice neînreg.",
category: "documentatii",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
// ── Administrativ ──
{
id: "LIMITE_UAT",
name: "LIMITE_UAT",
label: "Limite UAT",
category: "administrativ",
endpoint: "all",
},
{
id: "LIMITE_INTRAV_DYNAMIC",
name: "LIMITE_INTRAV_DYNAMIC",
label: "Limite intravilan",
category: "administrativ",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "SPECIAL_AREAS_ACTIVE_DYNAMIC",
name: "SPECIAL_AREAS_ACTIVE_DYNAMIC",
label: "Arii speciale active",
category: "administrativ",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
{
id: "SPECIAL_AREAS_INACTIVE_DYNAMIC",
name: "SPECIAL_AREAS_INACTIVE_DYNAMIC",
label: "Arii speciale inactive",
category: "administrativ",
endpoint: "aut",
spatialFilter: true,
subLayerId: 0,
},
];
export const findLayerById = (id?: string) =>
LAYER_CATALOG.find((l) => l.id === id);