summaryrefslogtreecommitdiff
path: root/src/services/transfers.service.ts
blob: d83584422482958f8b1d18f76d229cd9c83c64fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { Application } from '@feathersjs/express';
import { HookContext } from '@feathersjs/feathers';
import service from 'feathers-mongoose';
import { populate, alterItems, stashBefore, getItems } from 'feathers-hooks-common';
import Model from '../models/transfer/transfer.model';
import formatDate from '../hooks/formatDate';

const transfers = service({ Model });

const populateSchema = {
  include: [
    {
      service: 'contractors',
      nameAs: 'contractor',
      parentField: 'contractorId',
      childField: '_id'
    }
  ]
};

const addFields = (item: any) => {
  const { operation, contractor, amount } = item;
  const op = operation === 'in' ? 'приход' : 'расход';
  const name = `Платёж: ${op} ${amount}р от ${contractor.name}`;
  return { ...item, name };
};

const applyTransfer = async (context: HookContext): Promise<HookContext> => {
  const { contractorId, amount, operation } = getItems(context);

  // If amount is not supplied, do nothing
  if (!amount) return context;

  const inc = amount - (context.params.before?.amount || 0);
  const sign = (operation === 'in' ? -1 : 1) * (context.method === 'remove' ? -1 : 1);

  if (inc) await context.app.service('contractors').patch(contractorId, {
    $inc: {
      debt: inc * sign
    }
  });
  return context;
};

export default (app: Application): void => {
  app.use('/transfers', transfers);

  app.service('transfers').hooks({
    after: {
      all: [
        populate({ schema: populateSchema }),
        alterItems(addFields),
        formatDate(),
      ],
      create: applyTransfer,
      remove: applyTransfer,
    },
    before: {
      patch: [stashBefore(), applyTransfer],
      update: [stashBefore(), applyTransfer],
    }
  })
};