Files
old-crm-integration/services/officeRnD/fees.js

111 lines
4.0 KiB
JavaScript
Raw Normal View History

2019-07-25 06:53:32 +02:00
'use strict';
const moment = require('moment-timezone');
const { API } = require('../../helpers/api');
2019-09-05 14:52:10 +02:00
const { officeRnDAPIErrors, DEFAULT_DATE_FORMAT, UNPAID_FEE_STATUS, CUSTOM_FEES_PREFIXES } = require('../../constants/constants');
2019-07-25 06:53:32 +02:00
const deleteFeesFromORD = (dateRange, memberIds) => {
return new Promise((resolve, reject) => {
const startDate = moment.utc(dateRange.startDate, DEFAULT_DATE_FORMAT).startOf('day');
const endDate = moment.utc(dateRange.endDate, DEFAULT_DATE_FORMAT).endOf('day');
2019-08-27 13:55:01 +02:00
const asyncDataFetch = [API.get('fees'), API.get('plans')];
2019-09-05 14:52:10 +02:00
const feesToSkip = [];
2019-09-04 18:32:32 +02:00
2019-08-27 13:55:01 +02:00
Promise.all(asyncDataFetch)
.then((responses) => {
const feesResponse = responses[0];
const plansResponse = responses[1];
const fetchedFees = feesResponse.data ? feesResponse.data : [];
const fetchedPlans = plansResponse.data ? plansResponse.data : [];
const manualFeeNames = [];
fetchedPlans.forEach((plan) => {
const { name } = plan;
if (name && name.length > 0){
manualFeeNames.push(name);
}
});
2019-07-25 06:53:32 +02:00
const memberIdsMap = {};
memberIds.forEach((memberId) => {
memberIdsMap[memberId] = true;
});
const filterByMemberIds = memberIds.length > 0;
const feeIdsToRemove = [];
2019-07-25 06:53:32 +02:00
fetchedFees.forEach((fee) => {
2019-08-27 13:55:01 +02:00
const { member, date, invoice, name } = fee;
2019-08-22 06:02:29 +02:00
const { status } = invoice;
2019-07-25 06:53:32 +02:00
const feeId = fee['_id'];
const isDateInDateRange = startDate.isSameOrBefore(date) && endDate.isSameOrAfter(date);
2019-09-05 14:52:10 +02:00
let manuallyAddedFee = false;
if (manualFeeNames.indexOf(name) === -1){
if (name && name[0] && CUSTOM_FEES_PREFIXES.indexOf(name[0]) !== -1){
manuallyAddedFee = true;
}
}else{
manuallyAddedFee = true;
}
const memberFeesShouldBeDeleted = filterByMemberIds ? memberIdsMap[member] : true;
if (memberFeesShouldBeDeleted && isDateInDateRange && (status === UNPAID_FEE_STATUS) && !manuallyAddedFee) {
feeIdsToRemove.push(feeId);
2019-09-04 18:32:32 +02:00
}else{
2019-09-05 14:52:10 +02:00
feesToSkip.push(fee);
2019-07-25 06:53:32 +02:00
}
});
API.delete('fees', { data: feeIdsToRemove })
2019-07-25 06:53:32 +02:00
.then(() => {
2019-09-05 14:52:10 +02:00
resolve(feesToSkip);
2019-07-25 06:53:32 +02:00
})
.catch((error) => {
console.log('error : ', error);
2019-07-25 06:53:32 +02:00
reject(error);
});
})
.catch((error) => {
console.log(error);
2019-08-27 13:55:01 +02:00
reject(`${officeRnDAPIErrors.FAILED_TO_FETCH_FEES} or ${officeRnDAPIErrors.FAILED_TO_FETCH_PLANS}`);
2019-07-25 06:53:32 +02:00
});
});
};
2019-09-04 18:32:32 +02:00
const addFeesToORD = (allFees, invoicedFees) => {
2019-07-25 06:53:32 +02:00
return new Promise((resolve, reject) => {
2019-09-04 18:32:32 +02:00
const isFeeNonInvoiced = (fee) => {
const { name: feeName, member: feeMember, team: feeTeam, office: feeOffice } = fee;
const invoicedFeeObject = invoicedFees.find((invoicedFee) => {
const { name, member, team, office } = invoicedFee;
return (name === feeName && member === feeMember && team === feeTeam && office === feeOffice );
});
return !invoicedFeeObject;
};
const nonInvoicedFees = allFees.filter(isFeeNonInvoiced);
API.post('/fees', nonInvoicedFees)
2019-07-25 06:53:32 +02:00
.catch((error) => {
console.log('==== ERROR ====');
console.log(error);
});
2019-09-04 18:32:32 +02:00
resolve(nonInvoicedFees.length);
2019-07-25 06:53:32 +02:00
});
};
module.exports = {
deleteFeesFromORD,
addFeesToORD
};