@accounter/server
Version:
87 lines (81 loc) • 3.73 kB
text/typescript
import type { Injector } from 'graphql-modules';
import { BusinessTripAttendeesProvider } from '@modules/business-trips/providers/business-trips-attendees.provider.js';
import { getChargeType } from '@modules/charges/helpers/charge-type.js';
import type { IGetChargesByIdsResult } from '@modules/charges/types.js';
import { UnbalancedBusinessesProvider } from '../providers/unbalanced-businesses.provider.js';
import { generateLedgerRecordsForBusinessTrip } from '../resolvers/ledger-generation/business-trip-ledger-generation.resolver.js';
import { generateLedgerRecordsForCommonCharge } from '../resolvers/ledger-generation/common-ledger-generation.resolver.js';
import { generateLedgerRecordsForConversion } from '../resolvers/ledger-generation/conversion-ledger-generation.resolver.js';
import { generateLedgerRecordsForDividend } from '../resolvers/ledger-generation/dividend-ledger-generation.resolver.js';
import { generateLedgerRecordsForInternalTransfer } from '../resolvers/ledger-generation/internal-transfer-ledger-generation.resolver.js';
import { generateLedgerRecordsForMonthlyVat } from '../resolvers/ledger-generation/monthly-vat-ledger-generation.resolver.js';
import { generateLedgerRecordsForSalary } from '../resolvers/ledger-generation/salary-ledger-generation.resolver.js';
export function ledgerGenerationByCharge(charge: IGetChargesByIdsResult) {
const chargeType = getChargeType(charge);
switch (chargeType) {
case 'CommonCharge':
return generateLedgerRecordsForCommonCharge;
case 'ConversionCharge':
return generateLedgerRecordsForConversion;
case 'SalaryCharge':
return generateLedgerRecordsForSalary;
case 'InternalTransferCharge':
return generateLedgerRecordsForInternalTransfer;
case 'DividendCharge':
return generateLedgerRecordsForDividend;
case 'BusinessTripCharge':
return generateLedgerRecordsForBusinessTrip;
case 'MonthlyVatCharge':
return generateLedgerRecordsForMonthlyVat;
default:
throw new Error(`Unknown charge type: ${chargeType}`);
}
}
export async function ledgerUnbalancedBusinessesByCharge(
charge: IGetChargesByIdsResult,
injector: Injector,
): Promise<Set<string> | undefined> {
const chargeType = getChargeType(charge);
switch (chargeType) {
case 'CommonCharge': {
const unbalancedBusinesses = await injector
.get(UnbalancedBusinessesProvider)
.getChargeUnbalancedBusinessesByChargeIds.load(charge.id);
const allowedUnbalancedBusinesses = new Set(
unbalancedBusinesses.map(({ business_id }) => business_id),
);
return allowedUnbalancedBusinesses;
}
case 'ConversionCharge':
return undefined;
case 'SalaryCharge': {
const unbalancedBusinesses = await injector
.get(UnbalancedBusinessesProvider)
.getChargeUnbalancedBusinessesByChargeIds.load(charge.id);
const allowedUnbalancedBusinesses = new Set(
unbalancedBusinesses.map(({ business_id }) => business_id),
);
return allowedUnbalancedBusinesses;
}
case 'InternalTransferCharge':
return undefined;
case 'DividendCharge':
///////////
// TODO //
//////////
return undefined;
case 'BusinessTripCharge': {
const businessTripAttendees = await injector
.get(BusinessTripAttendeesProvider)
.getBusinessTripsAttendeesByChargeIdLoader.load(charge.id);
const allowedUnbalancedBusinesses = new Set(
businessTripAttendees.map(attendee => attendee.id),
);
return allowedUnbalancedBusinesses;
}
case 'MonthlyVatCharge':
return undefined;
default:
throw new Error(`Unknown charge type: ${chargeType}`);
}
}