fix(api): derive planning operators from Yacimientos

This commit is contained in:
2026-09-11 01:06:36 -03:00
parent 718e08be13
commit 99f068b416
@@ -67,27 +67,34 @@ export class InspectionPlanningHierarchyService {
at?: string, at?: string,
): Promise<{ data: InspectionPlanningHierarchyItem[] }> { ): Promise<{ data: InspectionPlanningHierarchyItem[] }> {
await this.requireType(areaId, 'area', 'El Área seleccionada no es válida'); await this.requireType(areaId, 'area', 'El Área seleccionada no es válida');
const effectiveAt = at ? new Date(at) : new Date(); if (at) {
if (!Number.isFinite(effectiveAt.getTime())) { const effectiveAt = new Date(at);
throw new BadRequestException({ if (!Number.isFinite(effectiveAt.getTime())) {
code: 'INSPECTION_PLANNING_DATE_INVALID', throw new BadRequestException({
message: 'La fecha de planificación no es válida', code: 'INSPECTION_PLANNING_DATE_INVALID',
}); message: 'La fecha de planificación no es válida',
});
}
} }
// Modelo autoritativo: la Empresa pertenece al Yacimiento. Para mantener el
// selector de planificación por Área, se proyectan las Empresas de todos los
// Yacimientos activos que pertenecen a esa Área.
const data = await this.dataSource.query(` const data = await this.dataSource.query(`
SELECT DISTINCT company.id, company.code, company.name SELECT DISTINCT company.id, company.code, COALESCE(profile.legal_name,company.name) AS name
FROM area_company_relations relation FROM assets yacimiento
INNER JOIN assets company ON company.id=relation.company_id INNER JOIN asset_types yacimiento_type ON yacimiento_type.id=yacimiento.asset_type_id
INNER JOIN asset_types type ON type.id=company.asset_type_id INNER JOIN assets company ON company.id=yacimiento.operator_company_id
WHERE relation.area_id=$1::uuid INNER JOIN asset_types company_type ON company_type.id=company.asset_type_id
AND relation.relation_role='OPERATOR' LEFT JOIN organization_profiles profile ON profile.asset_id=company.id
AND relation.valid_from <= $2::timestamptz WHERE yacimiento.parent_id=$1::uuid
AND (relation.valid_until IS NULL OR relation.valid_until > $2::timestamptz) AND lower(yacimiento_type.code)='yacimiento'
AND type.operational_role='COMPANY' AND yacimiento_type.is_active=true
AND type.is_active=true AND yacimiento.information_status<>'INACTIVE'
AND company_type.operational_role='COMPANY'
AND company_type.is_active=true
AND company.information_status<>'INACTIVE' AND company.information_status<>'INACTIVE'
ORDER BY company.name, company.code ORDER BY name, company.code
`, [areaId, effectiveAt]) as InspectionPlanningHierarchyItem[]; `, [areaId]) as InspectionPlanningHierarchyItem[];
return { data }; return { data };
} }