F3.1 WEB: agregar contrato de merge cronológico
This commit is contained in:
@@ -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',
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user