Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/subdomains/generic/kyc/entities/kyc-file.entity.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Config } from 'src/config/config';
import { IEntity } from 'src/shared/models/entity';
import { UserData } from 'src/subdomains/generic/user/models/user-data/user-data.entity';
import { Column, Entity, ManyToOne, OneToMany } from 'typeorm';
Expand Down Expand Up @@ -33,4 +34,10 @@ export class KycFile extends IEntity {

@OneToMany(() => KycLog, (l) => l.file)
logs?: KycLog[];

// --- ENTITY METHODS --- //

get url(): string {
return `${Config.frontend.services}/file/${this.uid}?show`;
}
}
5 changes: 3 additions & 2 deletions src/subdomains/generic/kyc/services/kyc-file.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ export class KycFileService {
});
}

async getUserDataKycFiles(userDataId: number): Promise<KycFile[]> {
return this.kycFileRepository.findCached(`userData-${userDataId}`, {
async getUserDataKycFiles(userDataId: number, relations: FindOptionsRelations<KycFile> = {}): Promise<KycFile[]> {
return this.kycFileRepository.findCached(`userData-${userDataId}-${JSON.stringify(relations)}`, {
where: { userData: { id: userDataId } },
relations,
loadEagerRelations: false,
});
}
Expand Down
16 changes: 15 additions & 1 deletion src/subdomains/generic/support/dto/onboarding-pdf.dto.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,24 @@
import { IsString, IsOptional } from 'class-validator';
import { IsOptional, IsString } from 'class-validator';
import { FileSubType } from '../../kyc/dto/kyc-file.dto';

export enum ComplianceDecision {
ACCEPTED = 'Akzeptiert',
REJECTED = 'Abgelehnt',
}

export const OnboardingDocSubTypes = [
FileSubType.GWG_FILE_COVER,
FileSubType.IDENT_REPORT,
FileSubType.IDENTIFICATION_FORM,
FileSubType.CUSTOMER_PROFILE,
FileSubType.RISK_PROFILE,
FileSubType.FORM_A,
FileSubType.FORM_K,
FileSubType.DFX_NAME_CHECK,
FileSubType.PERSONAL_NAME_CHECK,
FileSubType.BUSINESS_NAME_CHECK,
];

export class GenerateOnboardingPdfDto {
@IsString()
finalDecision: string;
Expand Down
27 changes: 11 additions & 16 deletions src/subdomains/generic/support/support-pdf.service.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { Injectable } from '@nestjs/common';
import PDFDocument from 'pdfkit';
import { IpLog } from 'src/shared/models/ip-log/ip-log.entity';
import { PdfUtil } from 'src/shared/utils/pdf.util';
import { Util } from 'src/shared/utils/util';
import { IpLog } from 'src/shared/models/ip-log/ip-log.entity';
import { Transaction } from 'src/subdomains/supporting/payment/entities/transaction.entity';
import { KycFile } from '../kyc/entities/kyc-file.entity';
import { KycStep } from '../kyc/entities/kyc-step.entity';
import { KycStepName } from '../kyc/enums/kyc-step-name.enum';
import { ReviewStatus } from '../kyc/enums/review-status.enum';
import { UserData } from '../user/models/user-data/user-data.entity';
import { ComplianceDecision, GenerateOnboardingPdfDto } from './dto/onboarding-pdf.dto';
import { ComplianceDecision, GenerateOnboardingPdfDto, OnboardingDocSubTypes } from './dto/onboarding-pdf.dto';
import { TransactionSupportInfo } from './dto/user-data-support.dto';

@Injectable()
Expand Down Expand Up @@ -259,7 +261,7 @@ export class SupportPdfService {

createOnboardingPdf(
userData: UserData,
kycFiles: { name: string; type: string; subType?: string }[],
kycFiles: KycFile[],
kycSteps: KycStep[],
dto: GenerateOnboardingPdfDto,
): Promise<string> {
Expand Down Expand Up @@ -379,19 +381,12 @@ export class SupportPdfService {

// Documents Section
this.drawOnboardingSectionHeader(pdf, 'Dokumente', marginX);
const documentTypes = [
'Deckblatt',
'Identifikationsdokument',
'Formular A',
'Formular K',
'Name Checks',
'Handelsregister',
'Vollmacht',
'Aktienbuch',
];
for (const docType of documentTypes) {
const file = kycFiles.find((f) => f.name.toLowerCase().includes(docType.toLowerCase()));
this.drawOnboardingField(pdf, docType, file?.name ?? 'nicht vorhanden', marginX, width);

for (const docType of OnboardingDocSubTypes) {
const file = kycFiles.find(
(f) => f.subType === docType && (!f.kycStep || f.kycStep.status === ReviewStatus.COMPLETED),
);
this.drawOnboardingField(pdf, docType, file?.url ?? 'nicht vorhanden', marginX, width);
}
pdf.moveDown(1);

Expand Down
70 changes: 35 additions & 35 deletions src/subdomains/generic/support/support.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,29 @@ import { BadRequestException, Inject, Injectable, NotFoundException, forwardRef
import { isIP } from 'class-validator';
import * as IbanTools from 'ibantools';
import { Config } from 'src/config/config';
import { SettingService } from 'src/shared/models/setting/setting.service';
import { addressExplorerUrl, txExplorerUrl } from 'src/integration/blockchain/shared/util/blockchain.util';
import { UserRole } from 'src/shared/auth/user-role.enum';
import { IpLog } from 'src/shared/models/ip-log/ip-log.entity';
import { IpLogService } from 'src/shared/models/ip-log/ip-log.service';
import { SettingService } from 'src/shared/models/setting/setting.service';
import { AmountType, Util } from 'src/shared/utils/util';
import { CheckStatus } from 'src/subdomains/core/aml/enums/check-status.enum';
import { AmlReason, NotRefundableAmlReasons } from 'src/subdomains/core/aml/enums/aml-reason.enum';
import { CheckStatus } from 'src/subdomains/core/aml/enums/check-status.enum';
import { BuyCrypto } from 'src/subdomains/core/buy-crypto/process/entities/buy-crypto.entity';
import { BuyFiat } from 'src/subdomains/core/sell-crypto/process/buy-fiat.entity';
import { BuyCryptoService } from 'src/subdomains/core/buy-crypto/process/services/buy-crypto.service';
import { Buy } from 'src/subdomains/core/buy-crypto/routes/buy/buy.entity';
import { BuyService } from 'src/subdomains/core/buy-crypto/routes/buy/buy.service';
import { Swap } from 'src/subdomains/core/buy-crypto/routes/swap/swap.entity';
import { SwapService } from 'src/subdomains/core/buy-crypto/routes/swap/swap.service';
import { RefundDataDto } from 'src/subdomains/core/history/dto/refund-data.dto';
import { ChargebackRefundDto } from 'src/subdomains/core/history/dto/transaction-refund.dto';
import { CardBankName } from 'src/subdomains/supporting/bank/bank/dto/bank.dto';
import { RefReward } from 'src/subdomains/core/referral/reward/ref-reward.entity';
import { RefRewardService } from 'src/subdomains/core/referral/reward/services/ref-reward.service';
import { BuyFiat } from 'src/subdomains/core/sell-crypto/process/buy-fiat.entity';
import { BuyFiatService } from 'src/subdomains/core/sell-crypto/process/services/buy-fiat.service';
import { Sell } from 'src/subdomains/core/sell-crypto/route/sell.entity';
import { SellService } from 'src/subdomains/core/sell-crypto/route/sell.service';
import { Swap } from 'src/subdomains/core/buy-crypto/routes/swap/swap.entity';
import { RefReward } from 'src/subdomains/core/referral/reward/ref-reward.entity';
import { RefRewardService } from 'src/subdomains/core/referral/reward/services/ref-reward.service';
import { Notification } from 'src/subdomains/supporting/notification/entities/notification.entity';
import { NotificationService } from 'src/subdomains/supporting/notification/services/notification.service';
import { BankTxReturnService } from 'src/subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.service';
import { Recall } from 'src/subdomains/supporting/recall/recall.entity';
import { RecallService } from 'src/subdomains/supporting/recall/recall.service';
import {
BankTx,
BankTxComplianceSearchableTypes,
Expand All @@ -35,26 +33,27 @@ import {
} from 'src/subdomains/supporting/bank-tx/bank-tx/entities/bank-tx.entity';
import { BankTxService } from 'src/subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service';
import { BankService } from 'src/subdomains/supporting/bank/bank/bank.service';
import { CardBankName } from 'src/subdomains/supporting/bank/bank/dto/bank.dto';
import { VirtualIban } from 'src/subdomains/supporting/bank/virtual-iban/virtual-iban.entity';
import { VirtualIbanService } from 'src/subdomains/supporting/bank/virtual-iban/virtual-iban.service';
import { Notification } from 'src/subdomains/supporting/notification/entities/notification.entity';
import { NotificationService } from 'src/subdomains/supporting/notification/services/notification.service';
import { CryptoInput } from 'src/subdomains/supporting/payin/entities/crypto-input.entity';
import { PayInService } from 'src/subdomains/supporting/payin/services/payin.service';
import { Transaction } from 'src/subdomains/supporting/payment/entities/transaction.entity';
import { IpLog } from 'src/shared/models/ip-log/ip-log.entity';
import { IpLogService } from 'src/shared/models/ip-log/ip-log.service';
import { addressExplorerUrl, txExplorerUrl } from 'src/integration/blockchain/shared/util/blockchain.util';
import { CryptoInput } from 'src/subdomains/supporting/payin/entities/crypto-input.entity';
import { SupportIssue } from 'src/subdomains/supporting/support-issue/entities/support-issue.entity';
import { SupportIssueService } from 'src/subdomains/supporting/support-issue/services/support-issue.service';
import { TransactionHelper } from 'src/subdomains/supporting/payment/services/transaction-helper';
import { TransactionService } from 'src/subdomains/supporting/payment/services/transaction.service';
import { Recall } from 'src/subdomains/supporting/recall/recall.entity';
import { RecallService } from 'src/subdomains/supporting/recall/recall.service';
import { SupportIssue } from 'src/subdomains/supporting/support-issue/entities/support-issue.entity';
import { SupportIssueService } from 'src/subdomains/supporting/support-issue/services/support-issue.service';
import { FileSubType, FileType } from '../kyc/dto/kyc-file.dto';
import { KycFile } from '../kyc/entities/kyc-file.entity';
import { KycLog } from '../kyc/entities/kyc-log.entity';
import { KycStep } from '../kyc/entities/kyc-step.entity';
import { ContentType } from '../kyc/enums/content-type.enum';
import { KycStepName } from '../kyc/enums/kyc-step-name.enum';
import { ReviewStatus } from '../kyc/enums/review-status.enum';
import { FileSubType, FileType } from '../kyc/dto/kyc-file.dto';
import { ContentType } from '../kyc/enums/content-type.enum';
import { SupportPdfService } from './support-pdf.service';
import { KycDocumentService } from '../kyc/services/integration/kyc-document.service';
import { KycFileService } from '../kyc/services/kyc-file.service';
import { KycLogService } from '../kyc/services/kyc-log.service';
Expand All @@ -75,42 +74,43 @@ import {
BankDataSupportInfo,
BankTxSupportInfo,
BuySupportInfo,
CallQueue,
CallQueueItem,
CallQueueSummaryEntry,
ComplianceSearchType,
CryptoInputSupportInfo,
IpLogSupportInfo,
SupportIssueSupportInfo,
ComplianceSearchType,
KycFileListEntry,
KycFileYearlyStats,
KycLogSupportInfo,
KycStepSupportInfo,
NotificationSupportInfo,
OnboardingStatus,
PendingOnboardingInfo,
PendingReviewItem,
PendingReviewSummaryEntry,
PendingReviewType,
RecallSupportInfo,
RecommendationEntry,
RecommendationGraph,
RecommendationGraphEdge,
RecommendationGraphNode,
RecommendationUserInfo,
SellSupportInfo,
SwapSupportInfo,
VirtualIbanSupportInfo,
RefRewardSupportInfo,
NotificationSupportInfo,
SellSupportInfo,
SupportIssueSupportInfo,
SupportPermissions,
SwapSupportInfo,
TransactionListEntry,
TransactionSupportInfo,
CallQueue,
CallQueueItem,
CallQueueSummaryEntry,
OnboardingStatus,
PendingOnboardingInfo,
PendingReviewItem,
PendingReviewSummaryEntry,
PendingReviewType,
UserDataSupportInfo,
UserDataSupportInfoDetails,
UserDataSupportInfoResult,
UserDataSupportQuery,
UserSupportInfo,
VirtualIbanSupportInfo,
} from './dto/user-data-support.dto';
import { SupportPdfService } from './support-pdf.service';
import { toUserDataDetailDto } from './user-data-detail.mapper';

interface UserDataComplianceSearchTypePair {
Expand Down Expand Up @@ -196,7 +196,7 @@ export class SupportService {

// Load KycFiles and KycSteps
const [kycFiles, kycSteps] = await Promise.all([
this.kycFileService.getUserDataKycFiles(userDataId),
this.kycFileService.getUserDataKycFiles(userDataId, { kycStep: true }),
this.kycService.getStepsByUserData(userDataId),
]);

Expand Down
Loading