fix(inventory): allow multiple companies per Area
This commit is contained in:
@@ -142,27 +142,8 @@ export class AssetOperationalRelationsService {
|
|||||||
if (!document) throw new BadRequestException({ code: 'SOURCE_DOCUMENT_NOT_FOUND', message: 'El documento fuente no existe' });
|
if (!document) throw new BadRequestException({ code: 'SOURCE_DOCUMENT_NOT_FOUND', message: 'El documento fuente no existe' });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dto.relationRole === AreaOrganizationRole.OPERATOR) {
|
// F7: un Área puede estar explotada por varias Empresas simultáneamente.
|
||||||
const [currentOperator] = (await manager.query(`
|
// La unicidad válida es Área + Empresa + rol activo; no existe una única Operadora por Área.
|
||||||
SELECT relation.id,company.name AS "companyName"
|
|
||||||
FROM area_company_relations relation
|
|
||||||
JOIN assets company ON company.id=relation.company_id
|
|
||||||
WHERE relation.area_id=$1
|
|
||||||
AND relation.relation_role='OPERATOR'
|
|
||||||
AND relation.valid_until IS NULL
|
|
||||||
AND relation.company_id<>$2
|
|
||||||
ORDER BY relation.valid_from DESC
|
|
||||||
LIMIT 1
|
|
||||||
FOR UPDATE OF relation
|
|
||||||
`,[dto.areaId,dto.companyId])) as Array<{id:string;companyName:string}>;
|
|
||||||
if (currentOperator) {
|
|
||||||
throw new ConflictException({
|
|
||||||
code:'AREA_ACTIVE_OPERATOR_MUST_END_FIRST',
|
|
||||||
message:`El Área ya tiene una Operadora vigente (${currentOperator.companyName}). Finalizá esa relación antes de registrar la nueva Operadora.`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const [row] = (await manager.query(`
|
const [row] = (await manager.query(`
|
||||||
INSERT INTO area_company_relations (
|
INSERT INTO area_company_relations (
|
||||||
area_id, company_id, relation_role, participation_percent, legal_instrument, source_document_id, start_reason, created_by
|
area_id, company_id, relation_role, participation_percent, legal_instrument, source_document_id, start_reason, created_by
|
||||||
@@ -170,9 +151,6 @@ export class AssetOperationalRelationsService {
|
|||||||
RETURNING id
|
RETURNING id
|
||||||
`, [dto.areaId, dto.companyId, dto.relationRole, dto.participationPercent ?? null, dto.legalInstrument ?? null, dto.sourceDocumentId ?? null, dto.reason, principal.userId])) as Array<{ id: string }>;
|
`, [dto.areaId, dto.companyId, dto.relationRole, dto.participationPercent ?? null, dto.legalInstrument ?? null, dto.sourceDocumentId ?? null, dto.reason, principal.userId])) as Array<{ id: string }>;
|
||||||
|
|
||||||
// F5/F6: changing the Area operator is a temporal relation event only.
|
|
||||||
// Existing Inventory keeps its creation/historical operator snapshot and
|
|
||||||
// physical hierarchy unchanged. Runtime ownership must resolve this row.
|
|
||||||
const created = await this.loadRelation(manager, row.id);
|
const created = await this.loadRelation(manager, row.id);
|
||||||
await this.audit.record({
|
await this.audit.record({
|
||||||
...administrationAuditContext(principal, request),
|
...administrationAuditContext(principal, request),
|
||||||
@@ -181,7 +159,7 @@ export class AssetOperationalRelationsService {
|
|||||||
entityId: row.id,
|
entityId: row.id,
|
||||||
afterData: this.auditView(created),
|
afterData: this.auditView(created),
|
||||||
metadata: dto.relationRole === AreaOrganizationRole.OPERATOR
|
metadata: dto.relationRole === AreaOrganizationRole.OPERATOR
|
||||||
? { inventoryHierarchyChanged:false, operatorSnapshotPreserved:true }
|
? { inventoryHierarchyChanged:false, multipleAreaOperatorsAllowed:true }
|
||||||
: undefined,
|
: undefined,
|
||||||
}, manager);
|
}, manager);
|
||||||
return created;
|
return created;
|
||||||
@@ -212,8 +190,6 @@ export class AssetOperationalRelationsService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// F5/F6: physical Inventory belongs to Area/Yacimiento hierarchy, not to Company.
|
|
||||||
// Ending an operator relation never moves, rewrites or blocks existing Inventory.
|
|
||||||
await manager.query(`
|
await manager.query(`
|
||||||
UPDATE area_company_relations
|
UPDATE area_company_relations
|
||||||
SET valid_until = CURRENT_TIMESTAMP,
|
SET valid_until = CURRENT_TIMESTAMP,
|
||||||
|
|||||||
Reference in New Issue
Block a user