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; if (typeof options == 'object') Object.assign(myOptions, options); if (!myOptions.transaction) { tx = await Self.beginTransaction({}); myOptions.transaction = tx; } try { const replaceItemQuery = { sql: 'CALL sale_replaceItem(?,?,?)', query: [saleFk, substitutionFk, quantity] }; const resultReplaceItem = await Self.rawSql(replaceItemQuery.sql, replaceItemQuery.query, myOptions); const sale = await models.Sale.findById(saleFk, { fields: ['id', 'ticketFk', 'itemFk', 'quantity', 'price'], include: [ { relation: 'ticket', scope: { fields: ['id'] }, }, { relation: 'item', scope: { fields: ['id', 'name', 'longName'] } } ] }, myOptions); const salesPersonQuery = { sql: 'SELECT vn.client_getSalesPersonByTicket(?)', query: [sale.ticketFk] }; const salesPerson = await Self.rawSql(salesPersonQuery.sql, salesPersonQuery.query, myOptions); if (tx) await tx.commit(); const url = await models.Url.getUrl(); const substitution = await models.Item.findById(substitutionFk, { fields: ['id', 'name', 'longName'] }, myOptions); const message = $t('negativeReplaced', { oldItemId: sale.itemFk, oldItem: sale.item().longName, oldItemUrl: `${url}item/${sale.itemFk}/summary`, newItemId: substitution.id, newItem: substitution.longName, newItemUrl: `${url}item/${substitution.id}/summary`, ticketId: sale.ticketFk, ticketUrl: `${url}ticket/${sale.ticketFk}/sale` }); await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message); return resultReplaceItem; } catch (e) { if (tx) await tx.rollback(); throw e; } }; };