F3.1 WEB: agregar contrato de merge cronológico

This commit is contained in:
2026-09-07 14:22:28 -03:00
parent dafb57d706
commit 636431f936
+86
View File
@@ -0,0 +1,86 @@
import { apiRequest, listAssets } from './api';
import type { AssetDetail, AssetListItem } from './api';
export interface InventoryMergeAlias {
id: string;
code: string;
name: string;
reason: string;
mergedAt: string;
depth: number;
}
export interface InventoryMergeStatus {
requested: {
id: string;
code: string;
name: string;
typeCode: string;
};
isMerged: boolean;
canonical: {
id: string;
code: string;
name: string;
typeCode: string;
};
chain: Array<{
id: string;
sourceAssetId: string;
canonicalAssetId: string;
reason: string;
mergedAt: string;
mergedBy: string | null;
source: string;
}>;
aliases: InventoryMergeAlias[];
}
export interface InventoryMergeResult {
merge: {
id: string;
sourceAssetId: string;
canonicalAssetId: string;
reason: string;
mergedAt: string;
};
source: { id: string; code: string; name: string };
canonical: { id: string; code: string; name: string };
sourceVersionNumber: number;
reparentedChildIds: string[];
historyPolicy: 'HISTORICAL_REFERENCES_PRESERVED';
}
export function getInventoryMergeStatus(assetId: string) {
return apiRequest<InventoryMergeStatus>(`/assets/${assetId}/merge-status`);
}
export function mergeInventoryAsset(
sourceAssetId: string,
canonicalAssetId: string,
reason: string,
) {
return apiRequest<InventoryMergeResult>(`/assets/${sourceAssetId}/merge`, {
method: 'POST',
body: JSON.stringify({ canonicalAssetId, reason }),
});
}
export async function searchInventoryMergeCandidates(
source: AssetDetail,
search = '',
): Promise<AssetListItem[]> {
if (!source.parent?.id || !source.operationalArea?.id || !source.operatorCompany?.id) return [];
const page = await listAssets({
page: 1,
pageSize: 80,
search: search.trim() || undefined,
typeId: source.type.id,
parentId: source.parent.id,
operationalAreaId: source.operationalArea.id,
operatorCompanyId: source.operatorCompany.id,
});
return page.data.filter((candidate) =>
candidate.id !== source.id && candidate.informationStatus !== 'INACTIVE',
);
}