web/storagenode: current month held amount for all satellites
Change-Id: I716a2695e5da19bfbec55d03e96bde0d2faa5ced
This commit is contained in:
parent
6e1ff78cdd
commit
32e1f16b48
@ -80,7 +80,7 @@
|
||||
<p class="estimation-table-container__info-area__text">{{ grossTotal | centsToDollars }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="estimation-table-container__held-area" v-if="!isCurrentPeriod || isSatelliteSelected">
|
||||
<div class="estimation-table-container__held-area">
|
||||
<p class="estimation-table-container__held-area__text">Held back</p>
|
||||
<p class="estimation-table-container__held-area__text">-{{ held | centsToDollars }}</p>
|
||||
</div>
|
||||
@ -210,7 +210,7 @@ export default class EstimationArea extends Vue {
|
||||
*/
|
||||
public get totalPayout(): number {
|
||||
if (this.isCurrentPeriod) {
|
||||
return this.isSatelliteSelected ? this.grossTotal - this.held : this.grossTotal;
|
||||
return this.grossTotal - this.held;
|
||||
}
|
||||
|
||||
return this.heldInfo.paid;
|
||||
@ -333,10 +333,12 @@ export default class EstimationArea extends Vue {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns current month held amount based on currend day of month.
|
||||
* Returns current month held amount based on current day of month.
|
||||
*/
|
||||
private currentMonthHeld(): number {
|
||||
return this.grossTotal * this.$store.state.payoutModule.heldPercentage / 100;
|
||||
return this.isSatelliteSelected ?
|
||||
this.grossTotal * this.$store.state.payoutModule.heldPercentage / 100 :
|
||||
this.$store.state.payoutModule.estimation.currentMonth.held;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
@ -2,6 +2,7 @@
|
||||
// See LICENSE for copying information.
|
||||
|
||||
import {
|
||||
EstimatedPayout,
|
||||
HeldHistory,
|
||||
HeldInfo,
|
||||
PaymentInfoParameters,
|
||||
@ -20,6 +21,7 @@ export const PAYOUT_MUTATIONS = {
|
||||
SET_TOTAL: 'SET_TOTAL',
|
||||
SET_HELD_PERCENT: 'SET_HELD_PERCENT',
|
||||
SET_HELD_HISTORY: 'SET_HELD_HISTORY',
|
||||
SET_ESTIMATION: 'SET_ESTIMATION',
|
||||
SET_PERIODS: 'SET_PERIODS',
|
||||
};
|
||||
|
||||
@ -28,6 +30,7 @@ export const PAYOUT_ACTIONS = {
|
||||
SET_PERIODS_RANGE: 'SET_PERIODS_RANGE',
|
||||
GET_TOTAL: 'GET_TOTAL',
|
||||
GET_HELD_HISTORY: 'GET_HELD_HISTORY',
|
||||
GET_ESTIMATION: 'GET_ESTIMATION',
|
||||
GET_PERIODS: 'GET_PERIODS',
|
||||
};
|
||||
|
||||
@ -61,6 +64,9 @@ export function makePayoutModule(api: PayoutApi) {
|
||||
[PAYOUT_MUTATIONS.SET_HELD_HISTORY](state: PayoutState, heldHistory: HeldHistory): void {
|
||||
state.heldHistory = heldHistory;
|
||||
},
|
||||
[PAYOUT_MUTATIONS.SET_ESTIMATION](state: PayoutState, estimatedInfo: EstimatedPayout): void {
|
||||
state.estimation = estimatedInfo;
|
||||
},
|
||||
[PAYOUT_MUTATIONS.SET_PERIODS](state: PayoutState, periods: PayoutPeriod[]): void {
|
||||
state.payoutPeriods = periods;
|
||||
},
|
||||
@ -121,6 +127,11 @@ export function makePayoutModule(api: PayoutApi) {
|
||||
|
||||
commit(PAYOUT_MUTATIONS.SET_PERIODS, periods);
|
||||
},
|
||||
[PAYOUT_ACTIONS.GET_ESTIMATION]: async function ({commit}: any): Promise<void> {
|
||||
const estimatedInfo = await api.getEstimatedInfo();
|
||||
|
||||
commit(PAYOUT_MUTATIONS.SET_ESTIMATION, estimatedInfo);
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
@ -95,6 +95,7 @@ export class PayoutState {
|
||||
public heldPercentage: number = 0,
|
||||
public payoutPeriods: PayoutPeriod[] = [],
|
||||
public heldHistory: HeldHistory = new HeldHistory(),
|
||||
public estimation: EstimatedPayout = new EstimatedPayout(),
|
||||
) {}
|
||||
}
|
||||
|
||||
@ -131,6 +132,12 @@ export interface PayoutApi {
|
||||
* @throws Error
|
||||
*/
|
||||
getHeldHistory(): Promise<HeldHistory>;
|
||||
|
||||
/**
|
||||
* Fetch estimated payout information.
|
||||
* @throws Error
|
||||
*/
|
||||
getEstimatedInfo(): Promise<EstimatedPayout>;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -156,3 +163,30 @@ export class HeldHistoryMonthlyBreakdownItem {
|
||||
public fourthPeriod: number = 0,
|
||||
) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* Contains estimated payout information for current and last periods.
|
||||
*/
|
||||
export class EstimatedPayout {
|
||||
public constructor(
|
||||
public currentMonth: PreviousMonthEstimatedPayout = new PreviousMonthEstimatedPayout(),
|
||||
public previousMonth: PreviousMonthEstimatedPayout = new PreviousMonthEstimatedPayout(),
|
||||
) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* Contains last month estimated payout information.
|
||||
*/
|
||||
export class PreviousMonthEstimatedPayout {
|
||||
public constructor(
|
||||
public egressBandwidth: number = 0,
|
||||
public egressBandwidthPayout: number = 0,
|
||||
public egressRepairAudit: number = 0,
|
||||
public egressRepairAuditPayout: number = 0,
|
||||
public diskSpace: number = 0,
|
||||
public diskSpacePayout: number = 0,
|
||||
public heldRate: number = 0,
|
||||
public payout: number = 0,
|
||||
public held: number = 0,
|
||||
) {}
|
||||
}
|
||||
|
@ -85,6 +85,12 @@ export default class PayoutArea extends Vue {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
try {
|
||||
await this.$store.dispatch(PAYOUT_ACTIONS.GET_ESTIMATION);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
try {
|
||||
await this.$store.dispatch(PAYOUT_ACTIONS.GET_TOTAL);
|
||||
} catch (error) {
|
||||
|
@ -2,11 +2,13 @@
|
||||
// See LICENSE for copying information.
|
||||
|
||||
import {
|
||||
EstimatedPayout,
|
||||
HeldHistory,
|
||||
HeldHistoryMonthlyBreakdownItem,
|
||||
HeldInfo,
|
||||
PaymentInfoParameters,
|
||||
PayoutApi,
|
||||
PreviousMonthEstimatedPayout,
|
||||
PayoutPeriod,
|
||||
TotalPayoutInfo,
|
||||
} from '@/app/types/payout';
|
||||
@ -166,6 +168,47 @@ export class PayoutHttpApi implements PayoutApi {
|
||||
return new HeldHistory(monthlyBreakdown);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch estimated payout information.
|
||||
*
|
||||
* @returns estimated payout information
|
||||
* @throws Error
|
||||
*/
|
||||
public async getEstimatedInfo(): Promise<EstimatedPayout> {
|
||||
const response = await this.client.get('/api/sno/estimated-payout/');
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error('can not get estimated payout information');
|
||||
}
|
||||
|
||||
const data: any = await response.json() || [];
|
||||
|
||||
return new EstimatedPayout(
|
||||
new PreviousMonthEstimatedPayout(
|
||||
data.currentMonth.egressBandwidth,
|
||||
data.currentMonth.egressBandwidthPayout,
|
||||
data.currentMonth.egressRepairAudit,
|
||||
data.currentMonth.egressRepairAuditPayout,
|
||||
data.currentMonth.diskSpace,
|
||||
data.currentMonth.diskSpacePayout,
|
||||
data.currentMonth.heldRate,
|
||||
data.currentMonth.payout,
|
||||
data.currentMonth.held,
|
||||
),
|
||||
new PreviousMonthEstimatedPayout(
|
||||
data.previousMonth.egressBandwidth,
|
||||
data.previousMonth.egressBandwidthPayout,
|
||||
data.previousMonth.egressRepairAudit,
|
||||
data.previousMonth.egressRepairAuditPayout,
|
||||
data.previousMonth.diskSpace,
|
||||
data.previousMonth.diskSpacePayout,
|
||||
data.previousMonth.heldRate,
|
||||
data.previousMonth.payout,
|
||||
data.previousMonth.held,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch total payout information depends on month.
|
||||
*
|
||||
|
@ -6,11 +6,13 @@ import Vuex from 'vuex';
|
||||
import { makeNodeModule } from '@/app/store/modules/node';
|
||||
import { makePayoutModule, PAYOUT_ACTIONS, PAYOUT_MUTATIONS } from '@/app/store/modules/payout';
|
||||
import {
|
||||
EstimatedPayout,
|
||||
HeldHistory,
|
||||
HeldHistoryMonthlyBreakdownItem,
|
||||
HeldInfo,
|
||||
PayoutInfoRange,
|
||||
PayoutPeriod,
|
||||
PreviousMonthEstimatedPayout,
|
||||
TotalPayoutInfo,
|
||||
} from '@/app/types/payout';
|
||||
import { getHeldPercentage, getMonthsBeforeNow } from '@/app/utils/payout';
|
||||
@ -90,6 +92,38 @@ describe('mutations', (): void => {
|
||||
expect(state.payoutModule.heldHistory.monthlyBreakdown[1].satelliteName).toBe(testHeldHistory.monthlyBreakdown[1].satelliteName);
|
||||
});
|
||||
|
||||
it('sets estimated payout information', (): void => {
|
||||
const estimatedPayout = new EstimatedPayout(
|
||||
new PreviousMonthEstimatedPayout(
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9,
|
||||
),
|
||||
new PreviousMonthEstimatedPayout(
|
||||
10,
|
||||
11,
|
||||
12,
|
||||
13,
|
||||
14,
|
||||
15,
|
||||
16,
|
||||
17,
|
||||
18,
|
||||
),
|
||||
);
|
||||
|
||||
store.commit(PAYOUT_MUTATIONS.SET_ESTIMATION, estimatedPayout);
|
||||
|
||||
expect(state.payoutModule.estimation.currentMonth.payout).toBe(8);
|
||||
expect(state.payoutModule.estimation.previousMonth.heldRate).toBe(16);
|
||||
});
|
||||
|
||||
it('sets available periods', (): void => {
|
||||
const firstExpectedPeriod = '2020-04';
|
||||
const secondExpectedPeriod = '1999-11';
|
||||
@ -243,6 +277,52 @@ describe('actions', () => {
|
||||
expect(state.payoutModule.heldHistory.monthlyBreakdown[1].satelliteName).toBe('name2');
|
||||
}
|
||||
});
|
||||
|
||||
it('get estimated payout information throws an error when api call fails', async (): Promise<void> => {
|
||||
jest.spyOn(payoutApi, 'getEstimatedInfo').mockImplementation(() => { throw new Error(); });
|
||||
|
||||
try {
|
||||
await store.dispatch(PAYOUT_ACTIONS.GET_ESTIMATION);
|
||||
expect(true).toBe(false);
|
||||
} catch (error) {
|
||||
expect(state.payoutModule.estimation.currentMonth.held).toBe(9);
|
||||
expect(state.payoutModule.estimation.previousMonth.diskSpace).toBe(14);
|
||||
}
|
||||
});
|
||||
|
||||
it('success get estimated payout information', async (): Promise<void> => {
|
||||
jest.spyOn(payoutApi, 'getEstimatedInfo').mockReturnValue(
|
||||
Promise.resolve(new EstimatedPayout(
|
||||
new PreviousMonthEstimatedPayout(
|
||||
1,
|
||||
2,
|
||||
300,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9,
|
||||
),
|
||||
new PreviousMonthEstimatedPayout(
|
||||
10,
|
||||
11,
|
||||
12,
|
||||
13,
|
||||
700,
|
||||
15,
|
||||
16,
|
||||
17,
|
||||
18,
|
||||
),
|
||||
)),
|
||||
);
|
||||
|
||||
await store.dispatch(PAYOUT_ACTIONS.GET_ESTIMATION);
|
||||
|
||||
expect(state.payoutModule.estimation.currentMonth.egressRepairAudit).toBe(300);
|
||||
expect(state.payoutModule.estimation.previousMonth.diskSpace).toBe(700);
|
||||
});
|
||||
});
|
||||
|
||||
describe('utils functions', (): void => {
|
||||
|
Loading…
Reference in New Issue
Block a user