module.exports = Self => { Self.remoteMethodCtx('addFromBuy', { description: 'Modify a field of a buy or creates a new one with default values', accessType: 'WRITE', accepts: [{ arg: 'id', type: 'number', required: true, description: 'The entry id', http: {source: 'path'} }, { arg: 'item', type: 'number', required: true, description: 'The item id', }, { arg: 'printedStickers', type: 'number', required: true, description: 'The field to modify', }], returns: { type: 'object', root: true }, http: { path: `/:id/addFromBuy`, verb: 'POST' } }); Self.addFromBuy = async(ctx, options) => { const args = ctx.args; const models = Self.app.models; const userId = ctx.req.accessToken.userId; const myOptions = {userId}; let tx; if (typeof options == 'object') Object.assign(myOptions, options); if (!myOptions.transaction) { tx = await Self.beginTransaction({}); myOptions.transaction = tx; } try { let buy = await models.Buy.findOne({where: {entryFk: args.id, itemFk: args.item}}, myOptions); if (buy) await buy.updateAttribute('printedStickers', args.printedStickers, myOptions); else { const userConfig = await models.UserConfig.findById(userId, {fields: ['warehouseFk']}, myOptions); await Self.rawSql( 'CALL vn.buyUltimate(?,?)', [userConfig.warehouseFk, null], myOptions ); let buyUltimate = await Self.rawSql( `SELECT buyFk FROM tmp.buyUltimate WHERE itemFk = ?`, [args.item], myOptions ); buyUltimate = await models.Buy.findById(buyUltimate[0].buyFk, null, myOptions); buy = await models.Buy.create({ entryFk: args.id, itemFk: args.item, quantity: 0, dispatched: buyUltimate.dispatched, buyingValue: buyUltimate.buyingValue, freightValue: buyUltimate.freightValue, isIgnored: buyUltimate.isIgnored, stickers: buyUltimate.stickers, packing: buyUltimate.packing, grouping: buyUltimate.grouping, groupingMode: buyUltimate.groupingMode, containerFk: buyUltimate.containerFk, comissionValue: buyUltimate.comissionValue, packageValue: buyUltimate.packageValue, location: buyUltimate.location, packagingFk: buyUltimate.packagingFk, price1: buyUltimate.price1, price2: buyUltimate.price2, price3: buyUltimate.price3, minPrice: buyUltimate.minPrice, workerFk: buyUltimate.workerFk, isChecked: buyUltimate.isChecked, isPickedOff: buyUltimate.isPickedOff, created: buyUltimate.created, ektFk: buyUltimate.ektFk, weight: buyUltimate.weight, deliveryFk: buyUltimate.deliveryFk, itemOriginalFk: buyUltimate.itemOriginalFk }, myOptions); if (buy) await buy.updateAttribute('printedStickers', args.printedStickers, myOptions); } if (tx) await tx.commit(); return buy; } catch (e) { if (tx) await tx.rollback(); throw e; } }; };