Ejemplo: Asignar el registro de trabajo de Jira al tiempo de Targetprocess

Transforma el registro de trabajo de Jira en una entidad de tiempo de Targetprocess. Cuando Worlkog cambia, elimina todos los registros de tiempo de la entidad de destino y crea uno nuevo con el tiempo empleado/restante de Jira.

Transformación de Jira a Targetprocess:

if (!args.value.changed) {
    return
}
const proxySvc = context.getService('workSharing/v2')
const tpApi = context.getService('targetprocess/api/v2')
const proxy = proxySvc.getProxy(args.targetTool)
const timeResponse = await tpApi.queryAsync('time', {
    where: ___PROTECTED_1___
})
const tpEntityId = parseInt(args.targetEntity.sourceId)
const entityResponse = await tpApi.getByIdAsync(args.targetEntity.entityType, tpEntityId, {
    select: '{{owner.id,owner.kind} as owner, project}'
})
const { owner, project } = entityResponse
if (project) {
    const timeRecordOwnerId = owner && owner.kind.toLowerCase() === 'user' ? owner.id : 1 // set any default user id which will be used as time records onwer here
    const deleteCommands = timeResponse.map(tr => ({
        name: 'DeleteResource',
        target: {
            Id: tr.id,
            ResourceType: 'Time'
        }
    }))
    // developer
    const role = {
        id: 1
    }
    const createCommand = {
        name: 'createResource',
        resource: {
            resourceType: 'Time',
            assignable: { id: tpEntityId },
            project: { id: project.id },
            user: { id: timeRecordOwnerId },
            description: 'Created by ILI integration',
            spent: args.value.changed.timeSpentSeconds / 3600,
            remain: args.value.changed.remainingEstimateSeconds / 3600,
            role
        }
    }
    const batchCommand = {
        name: 'batch',
        commands: [...deleteCommands, createCommand]
    }
    await proxy.postAsync('/api/commands/v1/execute', {body: batchCommand})
}

Versión en la nube:


if (!args.value.changed) {
    return
}
const proxySvc = context.getService('workSharing/v2')
const tpApi = context.getService('targetprocess/api/v2')
const proxy = proxySvc.getProxy(args.targetTool)
const timeResponse = await tpApi.queryAsync('time', {
    where: ___PROTECTED_2___
})
const tpEntityId = parseInt(args.targetEntity.sourceId)
const entityResponse = await tpApi.getByIdAsync(args.targetEntity.entityType, tpEntityId, {
    select: '{{owner.id,owner.kind} as owner, project}'
})
const { owner, project } = entityResponse
if (project) {
    const timeRecordOwnerId = owner && owner.kind.toLowerCase() === 'user' ? owner.id : 1 // set any default user id which will be used as time records onwer here
    const deleteCommands = timeResponse.map(tr => ({
        name: 'DeleteResource',
        target: {
            Id: tr.id,
            ResourceType: 'Time'
        }
    }))
    // developer
    const role = {
        id: 1
    }

const timeSpentSeconds = args.value.changed.timeSpentSeconds ?? 0
const timeremainingEstimateSeconds = args.value.changed.remainingEstimateSeconds ?? 0

    const createCommand = {
        name: 'createResource',
        resource: {
            resourceType: 'Time',
            assignable: { id: tpEntityId },
            project: { id: project.id },
            user: { id: timeRecordOwnerId },
            description: 'Created by ILI integration',
            spent: timeSpentSeconds / 3600,
            remain: timeremainingEstimateSeconds / 3600,
            role
        }
    }
    const batchCommand = {
        name: 'batch',
        commands: [...deleteCommands, createCommand]
    }
    await proxy.postAsync('/api/commands/v1/execute', {body: batchCommand}).catch(e=> {
        console.log(e);
    })
}

Más ejemplos en GitHub la biblioteca de ejemplos de mapeos y enrutamientos JS.