fix(core): update

This commit is contained in:
2020-08-25 11:57:03 +00:00
parent 406178d6d0
commit 08c78bae05
5 changed files with 166 additions and 29 deletions

View File

@@ -4,10 +4,11 @@ import { PayPalTransaction } from './paypal.classes.transaction';
export interface IPayPalOptions {
clientId: string;
clientSecret: string;
accountOwner: string;
}
export class PayPalAccount {
public apiBaseUrl: string = 'https://api.paypal.com'
public apiBaseUrl: string = 'https://api.paypal.com';
public options: IPayPalOptions;
private apiToken: string;
@@ -17,14 +18,104 @@ export class PayPalAccount {
this.options = optionsArg;
}
public async getTransactionsFromTo (fromTimeMillisArg: number, toTimeMillisArg: number) {
let returnTransactions: PayPalTransaction[] = [];
public async getTransactionsFromTo(fromTimeMillisArg: number, toTimeMillisArg: number) {
let allTransactions: PayPalTransaction[] = [];
// lets note the time from one month before. We need that for accurate transactions pools.
const monthBeforeStartMillis =
fromTimeMillisArg - plugins.smarttime.getMilliSecondsFromUnits({ days: 30 });
do {
const transactions = await PayPalTransaction.getTransactionFor30days(this, fromTimeMillisArg);
returnTransactions = returnTransactions.concat(transactions);
fromTimeMillisArg = fromTimeMillisArg + plugins.smarttime.getMilliSecondsFromUnits({days: 30});
allTransactions = allTransactions.concat(transactions);
fromTimeMillisArg =
fromTimeMillisArg + plugins.smarttime.getMilliSecondsFromUnits({ days: 30 });
} while (fromTimeMillisArg < toTimeMillisArg);
return returnTransactions;
const invoiceIds: string[] = [];
const transactionPools: PayPalTransaction[][] = [];
// lets get all invoiceids
allTransactions.forEach((transactionArg) => {
const invoiceId = transactionArg.data.originApiObject.transaction_info.invoice_id;
if (!invoiceIds.includes(invoiceId)) {
invoiceIds.push(invoiceId);
}
});
// lets get all transactions per invoiceId
invoiceIds.forEach((invoiceIdArg) => {
const transactionPool: PayPalTransaction[] = [];
allTransactions.forEach((transactionArg) => {
if (transactionArg.data.originApiObject.transaction_info.invoice_id === invoiceIdArg) {
transactionPool.push(transactionArg);
}
});
transactionPools.push(transactionPool);
});
const previousMonthTransactions = await PayPalTransaction.getTransactionFor30days(
this,
monthBeforeStartMillis
);
transactionPools.forEach((transactionPoolArg) => {
const poolInvoiceId = transactionPoolArg[0].data.originApiObject.transaction_info.invoice_id;
previousMonthTransactions.forEach((transactionArg) => {
if (transactionArg.data.originApiObject.transaction_info.invoice_id === poolInvoiceId) {
transactionPoolArg.push(transactionArg);
}
});
});
let finalTransactions: PayPalTransaction[] = [];
// lets process all transactionPool
transactionPools.forEach((transactionPoolArg) => {
// lets detect foreign transactions
let hasForeignTransactions = false;
transactionPoolArg.forEach((transactionArg) => {
if (transactionArg.data.currency !== 'EUR') {
hasForeignTransactions = true;
}
});
if (hasForeignTransactions && transactionPoolArg.length < 4) {
console.log(
`Pool with invoiceId ${transactionPoolArg[0].data.originApiObject.transaction_info.invoice_id} is not completed yet. Omminiting ${transactionPoolArg.length} transactions as a result.`
);
return;
}
if (hasForeignTransactions && transactionPoolArg.length === 4) {
const negativeNativeTransaction = transactionPoolArg.find(transactionArg => {
return transactionArg.data.amount < 0 && transactionArg.data.currency === 'EUR';
});
const negativeForeignTransaction = transactionPoolArg.find(transactionArg => {
return transactionArg.data.amount < 0 && transactionArg.data.currency !== 'EUR';
});
const positiveNativeTransaction = transactionPoolArg.find(transactionArg => {
return transactionArg.data.amount > 0 && transactionArg.data.currency === 'EUR';
});
const positiveForeignTransaction = transactionPoolArg.find(transactionArg => {
return transactionArg.data.amount > 0 && transactionArg.data.currency !== 'EUR';
});
negativeNativeTransaction.data.name = negativeForeignTransaction.data.name;
negativeNativeTransaction.data.description = negativeForeignTransaction.data.description;
positiveNativeTransaction.data.name = this.options.accountOwner;
positiveNativeTransaction.data.description = 'account balance transfer';
transactionPoolArg = transactionPoolArg.filter(transactionArg => transactionArg.data.currency === 'EUR');
}
if (!hasForeignTransactions && transactionPoolArg.length === 2) {
const positiveNativeTransaction = transactionPoolArg.find(transactionArg => {
return transactionArg.data.amount > 0 && transactionArg.data.currency === 'EUR';
});
positiveNativeTransaction.data.name = this.options.accountOwner;
positiveNativeTransaction.data.description = 'account balance transfer';
}
// pool is ready
finalTransactions = finalTransactions.concat(transactionPoolArg);
});
return finalTransactions;
}
public async request(methodArg: 'GET' | 'POST', routeArg: string, payloadArg: any) {