fix(web): clarify act context and operational map
DH V2 CI / API · typecheck, tests, build (push) Successful in 36s
Production dependency audit / API · production dependencies (push) Successful in 8s
Production dependency audit / WEB · production dependencies (push) Successful in 9s
DH V2 CI / WEB · typecheck, build (push) Successful in 1m37s
DH V2 CI / Docker / migrations / production images (push) Successful in 1m52s
DH V2 CI / Promote verified main to deploy (push) Successful in 4s
Android CI / RC / Android · lint, tests, debug APK, release compile (push) Successful in 4m11s
DH V2 CI / API · typecheck, tests, build (push) Successful in 36s
Production dependency audit / API · production dependencies (push) Successful in 8s
Production dependency audit / WEB · production dependencies (push) Successful in 9s
DH V2 CI / WEB · typecheck, build (push) Successful in 1m37s
DH V2 CI / Docker / migrations / production images (push) Successful in 1m52s
DH V2 CI / Promote verified main to deploy (push) Successful in 4s
Android CI / RC / Android · lint, tests, debug APK, release compile (push) Successful in 4m11s
This commit is contained in:
@@ -63,3 +63,25 @@ export class MapAssetsController {
|
||||
return this.geometries.map(query);
|
||||
}
|
||||
}
|
||||
|
||||
@Controller('map/context')
|
||||
export class MapOperationalContextController {
|
||||
constructor(private readonly geometries: AssetGeometriesService) {}
|
||||
|
||||
@Get()
|
||||
@RequirePermissions('assets.read')
|
||||
map() {
|
||||
return this.geometries.mapOperationalContext();
|
||||
}
|
||||
}
|
||||
|
||||
@Controller('map/documents')
|
||||
export class MapDocumentsController {
|
||||
constructor(private readonly geometries: AssetGeometriesService) {}
|
||||
|
||||
@Get()
|
||||
@RequirePermissions('assets.read', 'inspection_acts.read', 'inspection_findings.read')
|
||||
map() {
|
||||
return this.geometries.mapDocuments();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -230,6 +230,8 @@ export class AssetGeometriesService {
|
||||
geometry: row.geometry,
|
||||
properties: {
|
||||
id: row.id,
|
||||
entityId: row.id,
|
||||
entityKind: 'ASSET',
|
||||
code: row.code,
|
||||
name: row.name,
|
||||
typeId: row.typeId,
|
||||
@@ -242,12 +244,230 @@ export class AssetGeometriesService {
|
||||
accuracyM: row.accuracyM == null ? null : Number(row.accuracyM),
|
||||
capturedAt: row.capturedAt,
|
||||
updatedAt: row.updatedAt,
|
||||
href: `/inventarios/${row.id}`,
|
||||
contextLine: row.parentName ? `Depende de ${row.parentName}` : null,
|
||||
},
|
||||
})),
|
||||
meta: { count: visible.length, truncated },
|
||||
};
|
||||
}
|
||||
|
||||
async mapOperationalContext() {
|
||||
const rows = (await this.dataSource.query(`
|
||||
WITH RECURSIVE y_tree AS (
|
||||
SELECT y.id AS yacimiento_id, y.id AS asset_id
|
||||
FROM assets y
|
||||
INNER JOIN asset_types y_type ON y_type.id=y.asset_type_id
|
||||
WHERE lower(y_type.code)='yacimiento'
|
||||
AND y_type.is_active=true
|
||||
AND y.information_status<>'INACTIVE'
|
||||
UNION ALL
|
||||
SELECT tree.yacimiento_id, child.id
|
||||
FROM y_tree tree
|
||||
INNER JOIN assets child ON child.parent_id=tree.asset_id
|
||||
WHERE child.information_status<>'INACTIVE'
|
||||
), y_loc AS (
|
||||
SELECT tree.yacimiento_id,
|
||||
ST_Centroid(ST_Collect(geometry.geometry)) AS geometry,
|
||||
MAX(geometry.updated_at) AS updated_at,
|
||||
COUNT(*)::integer AS source_geometries
|
||||
FROM y_tree tree
|
||||
INNER JOIN asset_geometries geometry ON geometry.asset_id=tree.asset_id
|
||||
GROUP BY tree.yacimiento_id
|
||||
), base AS (
|
||||
SELECT
|
||||
y.id AS yacimiento_id,y.code AS yacimiento_code,y.name AS yacimiento_name,
|
||||
y.information_status AS yacimiento_status,
|
||||
area.id AS area_id,area.code AS area_code,area.name AS area_name,
|
||||
department.id AS department_id,department.code AS department_code,department.name AS department_name,
|
||||
company.id AS company_id,company.code AS company_code,COALESCE(profile.legal_name,company.name) AS company_name,
|
||||
loc.geometry,loc.updated_at,loc.source_geometries
|
||||
FROM y_loc loc
|
||||
INNER JOIN assets y ON y.id=loc.yacimiento_id
|
||||
LEFT JOIN assets area ON area.id=y.parent_id
|
||||
LEFT JOIN assets department ON department.id=area.parent_id
|
||||
LEFT JOIN assets company ON company.id=y.operator_company_id
|
||||
LEFT JOIN organization_profiles profile ON profile.asset_id=company.id
|
||||
)
|
||||
SELECT
|
||||
'YACIMIENTO:'||base.yacimiento_id::text AS "featureId",
|
||||
base.yacimiento_id AS "entityId",'YACIMIENTO'::text AS "entityKind",
|
||||
ST_AsGeoJSON(base.geometry)::jsonb AS geometry,
|
||||
base.yacimiento_code AS code,base.yacimiento_name AS name,
|
||||
'Yacimiento'::text AS "typeName",base.yacimiento_status::text AS "informationStatus",
|
||||
'POINT'::text AS "geometryType",base.updated_at AS "updatedAt",
|
||||
'/inventarios/'||base.yacimiento_id::text AS href,
|
||||
concat_ws(' · ',base.department_name,base.area_name,base.company_name) AS "contextLine",
|
||||
base.department_name AS "departmentName",base.area_name AS "areaName",
|
||||
base.yacimiento_name AS "yacimientoName",base.company_name AS "companyName",
|
||||
base.source_geometries AS "sourceGeometries"
|
||||
FROM base
|
||||
UNION ALL
|
||||
SELECT
|
||||
'COMPANY:'||base.company_id::text||':'||base.yacimiento_id::text AS "featureId",
|
||||
base.company_id AS "entityId",'COMPANY'::text AS "entityKind",
|
||||
ST_AsGeoJSON(base.geometry)::jsonb AS geometry,
|
||||
base.company_code AS code,base.company_name AS name,
|
||||
'Empresa operadora'::text AS "typeName",'ACTIVE'::text AS "informationStatus",
|
||||
'POINT'::text AS "geometryType",base.updated_at AS "updatedAt",
|
||||
'/inventarios/'||base.company_id::text AS href,
|
||||
concat_ws(' · ','Yacimiento '||base.yacimiento_name,'Área '||base.area_name,base.department_name) AS "contextLine",
|
||||
base.department_name AS "departmentName",base.area_name AS "areaName",
|
||||
base.yacimiento_name AS "yacimientoName",base.company_name AS "companyName",
|
||||
base.source_geometries AS "sourceGeometries"
|
||||
FROM base
|
||||
WHERE base.company_id IS NOT NULL
|
||||
ORDER BY "entityKind","name","code"
|
||||
`)) as Array<Record<string, unknown>>;
|
||||
return {
|
||||
type: 'FeatureCollection' as const,
|
||||
features: rows.map((row) => ({
|
||||
type: 'Feature' as const,
|
||||
id: row.featureId,
|
||||
geometry: row.geometry,
|
||||
properties: {
|
||||
id: row.featureId,
|
||||
entityId: row.entityId,
|
||||
entityKind: row.entityKind,
|
||||
code: row.code,
|
||||
name: row.name,
|
||||
typeName: row.typeName,
|
||||
informationStatus: row.informationStatus,
|
||||
geometryType: row.geometryType,
|
||||
updatedAt: row.updatedAt,
|
||||
href: row.href,
|
||||
contextLine: row.contextLine,
|
||||
departmentName: row.departmentName,
|
||||
areaName: row.areaName,
|
||||
yacimientoName: row.yacimientoName,
|
||||
companyName: row.companyName,
|
||||
sourceGeometries: row.sourceGeometries,
|
||||
},
|
||||
})),
|
||||
meta: { count: rows.length, truncated: false },
|
||||
};
|
||||
}
|
||||
|
||||
async mapDocuments() {
|
||||
const rows = (await this.dataSource.query(`
|
||||
WITH RECURSIVE y_tree AS (
|
||||
SELECT y.id AS yacimiento_id, y.id AS asset_id
|
||||
FROM assets y
|
||||
INNER JOIN asset_types y_type ON y_type.id=y.asset_type_id
|
||||
WHERE lower(y_type.code)='yacimiento'
|
||||
AND y_type.is_active=true
|
||||
AND y.information_status<>'INACTIVE'
|
||||
UNION ALL
|
||||
SELECT tree.yacimiento_id, child.id
|
||||
FROM y_tree tree
|
||||
INNER JOIN assets child ON child.parent_id=tree.asset_id
|
||||
WHERE child.information_status<>'INACTIVE'
|
||||
), y_loc AS (
|
||||
SELECT tree.yacimiento_id,
|
||||
ST_Centroid(ST_Collect(geometry.geometry)) AS geometry,
|
||||
MAX(geometry.updated_at) AS updated_at
|
||||
FROM y_tree tree
|
||||
INNER JOIN asset_geometries geometry ON geometry.asset_id=tree.asset_id
|
||||
GROUP BY tree.yacimiento_id
|
||||
), finding_rows AS (
|
||||
SELECT
|
||||
finding.id,finding.code,finding.title,finding.status,finding.asset_id,
|
||||
act.id AS act_id,act.code AS act_code,act.occurred_at,
|
||||
visit.id AS visit_id,visit.code AS visit_code,
|
||||
target.code AS asset_code,target.name AS asset_name,
|
||||
target_geometry.geometry AS target_geometry,
|
||||
tree.yacimiento_id,
|
||||
y.name AS yacimiento_name,area.name AS area_name,department.name AS department_name,
|
||||
COALESCE(profile.legal_name,company.name) AS company_name,
|
||||
loc.geometry AS fallback_geometry,COALESCE(target_geometry.updated_at,loc.updated_at) AS updated_at
|
||||
FROM inspection_findings finding
|
||||
INNER JOIN inspection_acts act ON act.id=finding.act_id
|
||||
INNER JOIN inspection_visits visit ON visit.id=act.visit_id
|
||||
INNER JOIN assets target ON target.id=finding.asset_id
|
||||
LEFT JOIN asset_geometries target_geometry ON target_geometry.asset_id=target.id
|
||||
LEFT JOIN y_tree tree ON tree.asset_id=target.id
|
||||
LEFT JOIN assets y ON y.id=tree.yacimiento_id
|
||||
LEFT JOIN assets area ON area.id=y.parent_id
|
||||
LEFT JOIN assets department ON department.id=area.parent_id
|
||||
LEFT JOIN assets company ON company.id=y.operator_company_id
|
||||
LEFT JOIN organization_profiles profile ON profile.asset_id=company.id
|
||||
LEFT JOIN y_loc loc ON loc.yacimiento_id=tree.yacimiento_id
|
||||
WHERE finding.status<>'VOIDED'
|
||||
), act_yacimiento AS (
|
||||
SELECT act.id AS act_id,
|
||||
COALESCE(
|
||||
CASE WHEN lower(COALESCE(scope_type.code,''))='yacimiento' THEN scope.id END,
|
||||
(SELECT fr.yacimiento_id FROM finding_rows fr WHERE fr.act_id=act.id AND fr.yacimiento_id IS NOT NULL ORDER BY fr.id LIMIT 1)
|
||||
) AS yacimiento_id
|
||||
FROM inspection_acts act
|
||||
INNER JOIN inspection_visits visit ON visit.id=act.visit_id
|
||||
LEFT JOIN assets scope ON scope.id=visit.scope_asset_id
|
||||
LEFT JOIN asset_types scope_type ON scope_type.id=scope.asset_type_id
|
||||
WHERE act.status<>'CANCELLED'
|
||||
)
|
||||
SELECT
|
||||
'FINDING:'||finding.id::text AS "featureId",finding.id AS "entityId",'FINDING'::text AS "entityKind",
|
||||
ST_AsGeoJSON(ST_Centroid(COALESCE(finding.target_geometry,finding.fallback_geometry)))::jsonb AS geometry,
|
||||
finding.code,finding.title AS name,'Hallazgo'::text AS "typeName",finding.status::text AS "informationStatus",
|
||||
'POINT'::text AS "geometryType",finding.updated_at AS "updatedAt",
|
||||
'/hallazgos/'||finding.id::text AS href,
|
||||
concat_ws(' · ',finding.act_code,finding.asset_name,finding.yacimiento_name,finding.company_name) AS "contextLine",
|
||||
finding.department_name AS "departmentName",finding.area_name AS "areaName",
|
||||
finding.yacimiento_name AS "yacimientoName",finding.company_name AS "companyName",
|
||||
finding.act_code AS "actCode",finding.asset_name AS "assetName"
|
||||
FROM finding_rows finding
|
||||
WHERE COALESCE(finding.target_geometry,finding.fallback_geometry) IS NOT NULL
|
||||
UNION ALL
|
||||
SELECT
|
||||
'ACT:'||act.id::text AS "featureId",act.id AS "entityId",'ACT'::text AS "entityKind",
|
||||
ST_AsGeoJSON(loc.geometry)::jsonb AS geometry,
|
||||
act.code,act.title AS name,'Acta'::text AS "typeName",act.status::text AS "informationStatus",
|
||||
'POINT'::text AS "geometryType",COALESCE(loc.updated_at,act.updated_at) AS "updatedAt",
|
||||
'/inspecciones/actas/'||act.id::text AS href,
|
||||
concat_ws(' · ',y.name,area.name,COALESCE(profile.legal_name,company.name)) AS "contextLine",
|
||||
department.name AS "departmentName",area.name AS "areaName",y.name AS "yacimientoName",
|
||||
COALESCE(profile.legal_name,company.name) AS "companyName",act.code AS "actCode",NULL::text AS "assetName"
|
||||
FROM inspection_acts act
|
||||
INNER JOIN act_yacimiento ay ON ay.act_id=act.id
|
||||
INNER JOIN y_loc loc ON loc.yacimiento_id=ay.yacimiento_id
|
||||
INNER JOIN assets y ON y.id=ay.yacimiento_id
|
||||
LEFT JOIN assets area ON area.id=y.parent_id
|
||||
LEFT JOIN assets department ON department.id=area.parent_id
|
||||
LEFT JOIN assets company ON company.id=y.operator_company_id
|
||||
LEFT JOIN organization_profiles profile ON profile.asset_id=company.id
|
||||
WHERE act.status<>'CANCELLED'
|
||||
ORDER BY "entityKind","code"
|
||||
`)) as Array<Record<string, unknown>>;
|
||||
return {
|
||||
type: 'FeatureCollection' as const,
|
||||
features: rows.map((row) => ({
|
||||
type: 'Feature' as const,
|
||||
id: row.featureId,
|
||||
geometry: row.geometry,
|
||||
properties: {
|
||||
id: row.featureId,
|
||||
entityId: row.entityId,
|
||||
entityKind: row.entityKind,
|
||||
code: row.code,
|
||||
name: row.name,
|
||||
typeName: row.typeName,
|
||||
informationStatus: row.informationStatus,
|
||||
geometryType: row.geometryType,
|
||||
updatedAt: row.updatedAt,
|
||||
href: row.href,
|
||||
contextLine: row.contextLine,
|
||||
departmentName: row.departmentName,
|
||||
areaName: row.areaName,
|
||||
yacimientoName: row.yacimientoName,
|
||||
companyName: row.companyName,
|
||||
actCode: row.actCode,
|
||||
assetName: row.assetName,
|
||||
},
|
||||
})),
|
||||
meta: { count: rows.length, truncated: false },
|
||||
};
|
||||
}
|
||||
|
||||
private async requireAsset(
|
||||
manager: EntityManager,
|
||||
id: string,
|
||||
|
||||
@@ -7,6 +7,8 @@ import { AssetsService } from './assets.service';
|
||||
import {
|
||||
AssetGeometriesController,
|
||||
MapAssetsController,
|
||||
MapDocumentsController,
|
||||
MapOperationalContextController,
|
||||
} from './asset-geometries.controller';
|
||||
import { AssetGeometriesService } from './asset-geometries.service';
|
||||
import { AssetHistoryController } from './asset-history.controller';
|
||||
@@ -50,6 +52,8 @@ import { InventoryBrowserService } from './inventory-browser.service';
|
||||
FieldInventoryMergeController,
|
||||
AssetGeometriesController,
|
||||
MapAssetsController,
|
||||
MapOperationalContextController,
|
||||
MapDocumentsController,
|
||||
AssetHistoryController,
|
||||
AssetMediaController,
|
||||
AssetProvenanceController,
|
||||
|
||||
@@ -59,9 +59,22 @@ interface ActReportSummary {
|
||||
code: string;
|
||||
status: string;
|
||||
pdfStatus: string;
|
||||
wordStatus: string;
|
||||
gedoIfIdentifier: string | null;
|
||||
gedoOfficializedAt: Date | null;
|
||||
generatedAt: Date;
|
||||
}
|
||||
|
||||
interface ActTerritorialContext {
|
||||
department: ActContextAsset | null;
|
||||
area: ActContextAsset | null;
|
||||
yacimiento: ActContextAsset | null;
|
||||
company: ActContextAsset | null;
|
||||
installations: ActContextAsset[];
|
||||
subinstallations: ActContextAsset[];
|
||||
legacyAreaScope: boolean;
|
||||
}
|
||||
|
||||
export interface InspectionActListItem {
|
||||
id: string;
|
||||
visitId: string;
|
||||
@@ -94,6 +107,7 @@ export interface InspectionActListItem {
|
||||
findingCount: number;
|
||||
companies: ActContextAsset[];
|
||||
areas: ActContextAsset[];
|
||||
context: ActTerritorialContext;
|
||||
report: ActReportSummary | null;
|
||||
createdBy: ActPerson | null;
|
||||
updatedBy: ActPerson | null;
|
||||
@@ -547,11 +561,23 @@ export class InspectionActsService {
|
||||
COALESCE(finding_count.total, 0)::integer AS "findingCount",
|
||||
COALESCE(context.companies, '[]'::jsonb) AS companies,
|
||||
COALESCE(context.areas, '[]'::jsonb) AS areas,
|
||||
JSONB_BUILD_OBJECT(
|
||||
'department', context.department,
|
||||
'area', context.area,
|
||||
'yacimiento', context.yacimiento,
|
||||
'company', context.company,
|
||||
'installations', COALESCE(context.installations, '[]'::jsonb),
|
||||
'subinstallations', COALESCE(context.subinstallations, '[]'::jsonb),
|
||||
'legacyAreaScope', context.legacy_area_scope
|
||||
) AS context,
|
||||
CASE WHEN report.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id', report.id,
|
||||
'code', report.code,
|
||||
'status', report.status,
|
||||
'pdfStatus', report.pdf_status,
|
||||
'wordStatus', report.word_status,
|
||||
'gedoIfIdentifier', report.gedo_if_identifier,
|
||||
'gedoOfficializedAt', report.gedo_officialized_at,
|
||||
'generatedAt', report.generated_at
|
||||
) END AS report,
|
||||
CASE WHEN creator.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
@@ -580,10 +606,64 @@ export class InspectionActsService {
|
||||
) END AS companies,
|
||||
CASE WHEN area.id IS NULL THEN '[]'::jsonb ELSE JSONB_BUILD_ARRAY(
|
||||
JSONB_BUILD_OBJECT('id',area.id,'code',area.code,'name',area.name)
|
||||
) END AS areas
|
||||
) END AS areas,
|
||||
CASE WHEN department.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id',department.id,'code',department.code,'name',department.name
|
||||
) END AS department,
|
||||
CASE WHEN area.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id',area.id,'code',area.code,'name',area.name
|
||||
) END AS area,
|
||||
CASE WHEN yacimiento.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id',yacimiento.id,'code',yacimiento.code,'name',yacimiento.name
|
||||
) END AS yacimiento,
|
||||
CASE WHEN company.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id',company.id,'code',company.code,'name',company.name
|
||||
) END AS company,
|
||||
COALESCE(affected.installations, '[]'::jsonb) AS installations,
|
||||
COALESCE(affected.subinstallations, '[]'::jsonb) AS subinstallations,
|
||||
(lower(COALESCE(scope_type.code,''))='area') AS legacy_area_scope
|
||||
FROM inspection_visits context_visit
|
||||
LEFT JOIN assets company ON company.id=context_visit.operator_company_id
|
||||
LEFT JOIN assets area ON area.id=context_visit.operational_area_id
|
||||
LEFT JOIN assets department ON department.id=area.parent_id
|
||||
LEFT JOIN assets scope_asset ON scope_asset.id=context_visit.scope_asset_id
|
||||
LEFT JOIN asset_types scope_type ON scope_type.id=scope_asset.asset_type_id
|
||||
LEFT JOIN assets yacimiento ON yacimiento.id=CASE
|
||||
WHEN lower(COALESCE(scope_type.code,''))='yacimiento' THEN scope_asset.id
|
||||
ELSE NULL
|
||||
END
|
||||
LEFT JOIN LATERAL (
|
||||
SELECT
|
||||
COALESCE((
|
||||
SELECT JSONB_AGG(JSONB_BUILD_OBJECT('id',x.id,'code',x.code,'name',x.name) ORDER BY x.name,x.code)
|
||||
FROM (
|
||||
SELECT DISTINCT installation.id, installation.code, installation.name
|
||||
FROM inspection_findings finding_context
|
||||
INNER JOIN assets finding_asset ON finding_asset.id=finding_context.asset_id
|
||||
INNER JOIN asset_types finding_type ON finding_type.id=finding_asset.asset_type_id
|
||||
LEFT JOIN assets installation ON installation.id=CASE
|
||||
WHEN lower(finding_type.code)='instalacion' THEN finding_asset.id
|
||||
WHEN lower(finding_type.code)='subinstalacion' THEN finding_asset.parent_id
|
||||
ELSE NULL
|
||||
END
|
||||
WHERE finding_context.act_id=act.id
|
||||
AND finding_context.status<>'VOIDED'
|
||||
AND installation.id IS NOT NULL
|
||||
) x
|
||||
), '[]'::jsonb) AS installations,
|
||||
COALESCE((
|
||||
SELECT JSONB_AGG(JSONB_BUILD_OBJECT('id',x.id,'code',x.code,'name',x.name) ORDER BY x.name,x.code)
|
||||
FROM (
|
||||
SELECT DISTINCT finding_asset.id, finding_asset.code, finding_asset.name
|
||||
FROM inspection_findings finding_context
|
||||
INNER JOIN assets finding_asset ON finding_asset.id=finding_context.asset_id
|
||||
INNER JOIN asset_types finding_type ON finding_type.id=finding_asset.asset_type_id
|
||||
WHERE finding_context.act_id=act.id
|
||||
AND finding_context.status<>'VOIDED'
|
||||
AND lower(finding_type.code)='subinstalacion'
|
||||
) x
|
||||
), '[]'::jsonb) AS subinstallations
|
||||
) affected ON true
|
||||
WHERE context_visit.id=act.visit_id
|
||||
) context ON true
|
||||
LEFT JOIN LATERAL (
|
||||
|
||||
@@ -41,9 +41,18 @@ interface FindingAssetView {
|
||||
code: string;
|
||||
name: string;
|
||||
commonName: string | null;
|
||||
typeCode: string;
|
||||
typeName: string;
|
||||
operatorCompany: FindingContextView | null;
|
||||
operationalArea: FindingContextView | null;
|
||||
hierarchy: {
|
||||
department: FindingContextView | null;
|
||||
area: FindingContextView | null;
|
||||
yacimiento: FindingContextView | null;
|
||||
installation: FindingContextView | null;
|
||||
subinstallation: FindingContextView | null;
|
||||
company: FindingContextView | null;
|
||||
};
|
||||
}
|
||||
|
||||
type FindingCatalogView = {
|
||||
@@ -809,13 +818,34 @@ export class InspectionFindingsService {
|
||||
'code', asset.code,
|
||||
'name', asset.name,
|
||||
'commonName', asset.common_name,
|
||||
'typeCode', asset_type.code,
|
||||
'typeName', asset_type.name,
|
||||
'operatorCompany', CASE WHEN company.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id', company.id, 'code', company.code, 'name', company.name
|
||||
) END,
|
||||
'operationalArea', CASE WHEN area.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id', area.id, 'code', area.code, 'name', area.name
|
||||
) END
|
||||
) END,
|
||||
'hierarchy', JSONB_BUILD_OBJECT(
|
||||
'department', CASE WHEN department.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id',department.id,'code',department.code,'name',department.name
|
||||
) END,
|
||||
'area', CASE WHEN area.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id',area.id,'code',area.code,'name',area.name
|
||||
) END,
|
||||
'yacimiento', CASE WHEN yacimiento.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id',yacimiento.id,'code',yacimiento.code,'name',yacimiento.name
|
||||
) END,
|
||||
'installation', CASE WHEN installation.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id',installation.id,'code',installation.code,'name',installation.name
|
||||
) END,
|
||||
'subinstallation', CASE WHEN subinstallation.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id',subinstallation.id,'code',subinstallation.code,'name',subinstallation.name
|
||||
) END,
|
||||
'company', CASE WHEN company.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id',company.id,'code',company.code,'name',company.name
|
||||
) END
|
||||
)
|
||||
) AS asset,
|
||||
CASE WHEN catalog.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT(
|
||||
'id', catalog.id,
|
||||
@@ -861,6 +891,24 @@ export class InspectionFindingsService {
|
||||
INNER JOIN asset_types asset_type ON asset_type.id = asset.asset_type_id
|
||||
LEFT JOIN assets company ON company.id = asset.operator_company_id
|
||||
LEFT JOIN assets area ON area.id = asset.operational_area_id
|
||||
LEFT JOIN assets department ON department.id = area.parent_id
|
||||
LEFT JOIN assets parent_asset ON parent_asset.id = asset.parent_id
|
||||
LEFT JOIN assets grandparent_asset ON grandparent_asset.id = parent_asset.parent_id
|
||||
LEFT JOIN assets yacimiento ON yacimiento.id = CASE
|
||||
WHEN lower(asset_type.code)='yacimiento' THEN asset.id
|
||||
WHEN lower(asset_type.code)='instalacion' THEN parent_asset.id
|
||||
WHEN lower(asset_type.code)='subinstalacion' THEN grandparent_asset.id
|
||||
ELSE NULL
|
||||
END
|
||||
LEFT JOIN assets installation ON installation.id = CASE
|
||||
WHEN lower(asset_type.code)='instalacion' THEN asset.id
|
||||
WHEN lower(asset_type.code)='subinstalacion' THEN parent_asset.id
|
||||
ELSE NULL
|
||||
END
|
||||
LEFT JOIN assets subinstallation ON subinstallation.id = CASE
|
||||
WHEN lower(asset_type.code)='subinstalacion' THEN asset.id
|
||||
ELSE NULL
|
||||
END
|
||||
LEFT JOIN finding_catalog_items catalog ON catalog.id = finding.catalog_item_id
|
||||
LEFT JOIN finding_categories category ON category.id = catalog.category_id
|
||||
LEFT JOIN LATERAL (
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
export const API_VERSION = '0.29.0-14';
|
||||
export const API_PHASE = 'F6.14';
|
||||
export const API_VERSION = '0.29.0-15';
|
||||
export const API_PHASE = 'F6.15';
|
||||
|
||||
Reference in New Issue
Block a user