summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreug-vs <eug-vs@keemail.me>2021-03-19 23:57:18 +0300
committereug-vs <eug-vs@keemail.me>2021-03-19 23:57:18 +0300
commitad530510a4aba72f3074f1a7dec82cc9018db7b4 (patch)
tree5f684dce9eee4b67f18f20864bc26d83a3a4a075
parent3109e25f2cabb85bbccf4ba509e112e49f5c0120 (diff)
downloadcommercel-api-ad530510a4aba72f3074f1a7dec82cc9018db7b4.tar.gz
feat: add Transfers service
-rw-r--r--src/models/transfer/transfer.model.ts4
-rw-r--r--src/models/transfer/transfer.schema.ts29
-rw-r--r--src/services/index.ts2
-rw-r--r--src/services/tranfers.service.ts81
-rw-r--r--src/services/waybills.service.ts63
5 files changed, 122 insertions, 57 deletions
diff --git a/src/models/transfer/transfer.model.ts b/src/models/transfer/transfer.model.ts
new file mode 100644
index 0000000..29f5b0d
--- /dev/null
+++ b/src/models/transfer/transfer.model.ts
@@ -0,0 +1,4 @@
+import { Model, model } from 'mongoose';
+import { TransferSchema, transferSchema } from './transfer.schema';
+
+export default model<TransferSchema, Model<TransferSchema>>('Transfer', transferSchema);
diff --git a/src/models/transfer/transfer.schema.ts b/src/models/transfer/transfer.schema.ts
new file mode 100644
index 0000000..ebdb6ab
--- /dev/null
+++ b/src/models/transfer/transfer.schema.ts
@@ -0,0 +1,29 @@
+import { Document, Schema, Types } from 'mongoose';
+
+export interface TransferSchema extends Document {
+ date: string;
+ operation: 'in' | 'out';
+ contractorId: string;
+ amount: number;
+}
+
+
+export const transferSchema = new Schema({
+ date: {
+ type: Date,
+ required: true,
+ },
+ operation: {
+ type: String,
+ required: true,
+ },
+ contractorId: {
+ type: Types.ObjectId,
+ required: true,
+ },
+ amount: {
+ type: Number,
+ required: true,
+ },
+}, { timestamps: true });
+
diff --git a/src/services/index.ts b/src/services/index.ts
index dd1591c..120b98a 100644
--- a/src/services/index.ts
+++ b/src/services/index.ts
@@ -2,12 +2,14 @@ import { Application } from '@feathersjs/express';
import Products from './products.service';
import Contractors from './contractors.service';
import Waybills from './waybills.service';
+import Tranfers from './tranfers.service';
import Spreadsheets from './spreadsheets.service';
export default (app: Application): void => {
app.configure(Products);
app.configure(Contractors);
app.configure(Waybills);
+ app.configure(Tranfers);
app.configure(Spreadsheets);
app.get('/ping', (req, res) => res.send('pong'));
diff --git a/src/services/tranfers.service.ts b/src/services/tranfers.service.ts
new file mode 100644
index 0000000..e36e4f9
--- /dev/null
+++ b/src/services/tranfers.service.ts
@@ -0,0 +1,81 @@
+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 moment from 'moment';
+import Model from '../models/waybill/waybill.model';
+import { WaybillSchema } from '../models/waybill/waybill.schema';
+
+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<HookContext> => {
+ 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}`;
+ const formattedDate = moment(date).format('YYYY-MM-DD');
+ return { ...item, name, total, date: formattedDate };
+};
+
+export default (app: Application): void => {
+ app.use('/waybills', waybills);
+
+ app.service('waybills').hooks({
+ after: {
+ all: [
+ populate({ schema: populateSchema }),
+ alterItems(addFields)
+ ],
+ },
+ before: {
+ patch: reflectStatus,
+ },
+ })
+};
+
diff --git a/src/services/waybills.service.ts b/src/services/waybills.service.ts
index e36e4f9..02ab2de 100644
--- a/src/services/waybills.service.ts
+++ b/src/services/waybills.service.ts
@@ -1,14 +1,9 @@
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 moment from 'moment';
-import Model from '../models/waybill/waybill.model';
-import { WaybillSchema } from '../models/waybill/waybill.schema';
+import { populate } from 'feathers-hooks-common';
+import Model from '../models/transfer/transfer.model';
-const waybills = service({ Model });
+const transfers = service({ Model });
const populateSchema = {
include: [
@@ -17,65 +12,19 @@ const populateSchema = {
nameAs: 'contractor',
parentField: 'contractorId',
childField: '_id'
- },
- {
- service: 'products',
- nameAs: 'product',
- parentField: 'productId',
- childField: '_id'
- },
+ }
]
};
-const reflectStatus = async (context: HookContext): Promise<HookContext> => {
- 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}`;
- const formattedDate = moment(date).format('YYYY-MM-DD');
- return { ...item, name, total, date: formattedDate };
-};
-
export default (app: Application): void => {
- app.use('/waybills', waybills);
+ app.use('/transfers', transfers);
- app.service('waybills').hooks({
+ app.service('transfers').hooks({
after: {
all: [
populate({ schema: populateSchema }),
- alterItems(addFields)
],
},
- before: {
- patch: reflectStatus,
- },
})
};