import { Application } from '@feathersjs/express'; import { HookContext } from '@feathersjs/feathers'; import service from 'feathers-mongoose'; import { populate, alterItems } from 'feathers-hooks-common'; import Bluebird from 'bluebird'; import _ from 'lodash'; import Model from '../models/waybill/waybill.model'; import { WaybillSchema } from '../models/waybill/waybill.schema'; import formatDate from '../hooks/formatDate'; const waybills = service({ Model }); const populateSchema = { include: [ { service: 'contractors', nameAs: 'contractor', parentField: 'contractorId', childField: '_id' }, { service: 'products', nameAs: 'product', parentField: 'productId', childField: '_id' }, ] }; const reflectStatus = async (context: HookContext): Promise => { const { status } = context.data; if (['cancelled', 'executed'].includes(status) && context.id) { const waybill: WaybillSchema = await context.service.get(context.id); const signMultiplier = (waybill.operation === 'in' ? 1 : -1) * (status === 'cancelled' ? -1 : 1); const total = waybill.records.reduce((sum, record) => sum + record.price * record.quantity, 0); await Bluebird.map(waybill.records, record => { return context.app.service('products').patch(record.productId, { $inc: { quantity: record.quantity * signMultiplier } }); }); await context.app.service('contractors').patch(waybill.contractorId, { $inc: { debt: total * signMultiplier * (-1) } }); } return context; }; const addFields = (item: WaybillSchema) => { const { operation, records, date } = item; const total = item.records.reduce((sum, record) => sum + record.price * record.quantity, 0); const op = operation === 'in' ? 'приход' : 'расход'; const name = `Накладная: ${op} $${total}`; return { ...item, name, total }; }; export default (app: Application): void => { app.use('/waybills', waybills); app.service('waybills').hooks({ after: { all: [ populate({ schema: populateSchema }), alterItems(addFields), formatDate(), ], }, before: { patch: reflectStatus, }, }) };