module.exports = Self => { Self.remoteMethodCtx('replaceItem', { description: 'Replace item from sale', accessType: 'WRITE', accepts: [{ arg: 'saleFk', type: 'number', required: true, }, { arg: 'substitutionFk', type: 'number', required: true }, { arg: 'quantity', type: 'number', required: true } ], returns: { type: 'object', root: true }, http: { path: `/replaceItem`, verb: 'POST' } }); Self.replaceItem = async(ctx, saleFk, substitutionFk, quantity, options) => { const myOptions = {userId: ctx.req.accessToken.userId}; let tx; const $t = ctx.req.__; const models = Self.app.models; // const {_saleFk, _substitutionFk, _quantity} = ctx.args; if (typeof options == 'object') Object.assign(myOptions, options); if (!myOptions.transaction) { tx = await Self.beginTransaction({}); myOptions.transaction = tx; } try { const _replaceItem = { sql: 'CALL sale_replaceItem(?,?,?)', query: [saleFk, substitutionFk, quantity] }; const resultReplaceItem = await Self.rawSql(_replaceItem.sql, _replaceItem.query, myOptions); const _salesPerson = { sql: 'SELECT vn.client_getSalesPersonByTicket(?)', query: [saleFk.ticket.id] }; const salesPerson = await Self.rawSql(_salesPerson.query, _salesPerson.sql, myOptions); const message = $t('negativeReplaced', { oldItemId: itemFk, oldItemUrl: `${url}item/${itemFk}/summary`, newItemId: substitutionFk, newItemUrl: `${url}item/${substitutionFk}/summary`, ticketId: ticketFk, ticketUrl: `${url}ticket/${ticketFk}/sale`, }); await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message); return resultReplaceItem; } catch (e) { if (tx) await tx.rollback(); throw e; } }; };