mirror of
https://github.com/valitydev/dashboard.git
synced 2024-11-06 02:25:23 +00:00
Bump swag payments (#189)
This commit is contained in:
parent
872dc7a008
commit
4f8cfd3076
8
package-lock.json
generated
8
package-lock.json
generated
@ -26,7 +26,7 @@
|
||||
"@vality/swag-api-keys-v2": "0.1.2-321124b.0",
|
||||
"@vality/swag-claim-management": "0.1.1-b5248eb.0",
|
||||
"@vality/swag-organizations": "1.0.1-e863566.0",
|
||||
"@vality/swag-payments": "0.1.3-5760b7e.0",
|
||||
"@vality/swag-payments": "0.1.3-44bac58.0",
|
||||
"@vality/swag-url-shortener": "0.1.1-9659896.0",
|
||||
"@vality/swag-wallet": "0.1.3-54f56db.0",
|
||||
"angular-file": "^3.0.1",
|
||||
@ -7212,9 +7212,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@vality/swag-payments": {
|
||||
"version": "0.1.3-5760b7e.0",
|
||||
"resolved": "https://registry.npmjs.org/@vality/swag-payments/-/swag-payments-0.1.3-5760b7e.0.tgz",
|
||||
"integrity": "sha512-DqCP2Z3k7JVM9Ik+3fPCzPkYwQ8uQmuKHxmTr5s5zr6DSiiQ3KWzPfeWI1FZ1yqcScrbiWNCLKtZOM2XmrPyCg==",
|
||||
"version": "0.1.3-44bac58.0",
|
||||
"resolved": "https://registry.npmjs.org/@vality/swag-payments/-/swag-payments-0.1.3-44bac58.0.tgz",
|
||||
"integrity": "sha512-F1yf1Dt1q04+z7PzqQ8BNWCFG5rWnF4Yfb/BEa/1efBBg7L6tnD2//dnOpgQyaHA777eRpqC5byGmKsnoMJm9w==",
|
||||
"dependencies": {
|
||||
"tslib": "^2.3.0"
|
||||
},
|
||||
|
@ -43,7 +43,7 @@
|
||||
"@vality/swag-api-keys-v2": "0.1.2-321124b.0",
|
||||
"@vality/swag-claim-management": "0.1.1-b5248eb.0",
|
||||
"@vality/swag-organizations": "1.0.1-e863566.0",
|
||||
"@vality/swag-payments": "0.1.3-5760b7e.0",
|
||||
"@vality/swag-payments": "0.1.3-44bac58.0",
|
||||
"@vality/swag-url-shortener": "0.1.1-9659896.0",
|
||||
"@vality/swag-wallet": "0.1.3-54f56db.0",
|
||||
"angular-file": "^3.0.1",
|
||||
|
@ -9,7 +9,6 @@ export * from './countries.service';
|
||||
export * from './shops.service';
|
||||
export * from './webhooks.service';
|
||||
export * from './payments.service';
|
||||
export * from './payouts.service';
|
||||
export * from './invoices.service';
|
||||
export * from './contracts.service';
|
||||
export * from './payments-dictionary.service';
|
||||
|
@ -1,22 +0,0 @@
|
||||
import { Injectable, Injector } from '@angular/core';
|
||||
import { PayoutsService as ApiPayoutsService } from '@vality/swag-payments';
|
||||
|
||||
import { PartyIdExtension, PartyIdPatchMethodService } from '@dsh/app/api/utils/extensions';
|
||||
|
||||
import { createApi } from '../utils';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class PayoutsService extends createApi(ApiPayoutsService, [PartyIdExtension]) {
|
||||
constructor(
|
||||
injector: Injector,
|
||||
private partyIdPatchMethodService: PartyIdPatchMethodService,
|
||||
) {
|
||||
super(injector);
|
||||
this.createPayout = partyIdPatchMethodService.patch(
|
||||
this.createPayout,
|
||||
(params, partyId) => (params.payoutParams.partyID = partyId),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
<div
|
||||
*transloco="let t; scope: 'payment-section'; read: 'paymentSection.payouts.createPayoutReport'"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="32px"
|
||||
>
|
||||
<div class="dsh-headline">{{ t('title') }}</div>
|
||||
<ng-container *ngIf="reportCreated$ | async; else elseBlock">
|
||||
<div class="dsh-body-1">{{ t('descriptionStep2') }}</div>
|
||||
</ng-container>
|
||||
<ng-template #elseBlock
|
||||
><div class="dsh-body-1">{{ t('descriptionStep1') }}</div></ng-template
|
||||
>
|
||||
<div
|
||||
fxLayout="row"
|
||||
fxLayout.xs="column"
|
||||
fxLayoutAlign="space-between stretch"
|
||||
fxLayoutGap="24px"
|
||||
fxLayoutGap.xs="16px"
|
||||
>
|
||||
<button
|
||||
[disabled]="isLoading$ | async"
|
||||
color="warn"
|
||||
dsh-text-button
|
||||
fxFlex="160px"
|
||||
fxFlex.xs="none"
|
||||
(click)="cancel()"
|
||||
>
|
||||
{{ t('cancel') }}
|
||||
</button>
|
||||
<button
|
||||
*ngIf="!(reportCreated$ | async)"
|
||||
[disabled]="isLoading$ | async"
|
||||
color="accent"
|
||||
dsh-button
|
||||
fxFlex="160px"
|
||||
fxFlex.xs="none"
|
||||
(click)="create()"
|
||||
>
|
||||
{{ t('create') }}
|
||||
</button>
|
||||
<button
|
||||
*ngIf="reportCreated$ | async"
|
||||
color="accent"
|
||||
dsh-button
|
||||
fxFlex.xs="none"
|
||||
(click)="toReports()"
|
||||
>
|
||||
{{ t('toReports') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
@ -1,53 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, Inject, OnInit } from '@angular/core';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { Router } from '@angular/router';
|
||||
import { TranslocoService } from '@ngneat/transloco';
|
||||
import { NotifyLogService } from '@vality/ng-core';
|
||||
import { Payout } from '@vality/swag-anapi-v2';
|
||||
|
||||
import { CreatePayoutReportDialogService } from './create-payout-report-dialog.service';
|
||||
|
||||
@Component({
|
||||
templateUrl: 'create-payout-report-dialog.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
providers: [CreatePayoutReportDialogService],
|
||||
})
|
||||
export class CreatePayoutReportDialogComponent implements OnInit {
|
||||
isLoading$ = this.createPayoutReportDialogService.isLoading$;
|
||||
reportCreated$ = this.createPayoutReportDialogService.reportCreated$;
|
||||
|
||||
constructor(
|
||||
private dialogRef: MatDialogRef<CreatePayoutReportDialogComponent>,
|
||||
private router: Router,
|
||||
private createPayoutReportDialogService: CreatePayoutReportDialogService,
|
||||
private transloco: TranslocoService,
|
||||
private log: NotifyLogService,
|
||||
@Inject(MAT_DIALOG_DATA) private data: { payout: Payout },
|
||||
) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.createPayoutReportDialogService.errorOccurred$.subscribe((err) =>
|
||||
this.log.error(
|
||||
err,
|
||||
this.transloco.selectTranslate(
|
||||
'payouts.errors.createReportError',
|
||||
null,
|
||||
'payment-section',
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
create() {
|
||||
this.createPayoutReportDialogService.create(this.data.payout);
|
||||
}
|
||||
|
||||
toReports() {
|
||||
void this.router.navigate([...this.router.url.split('/').slice(0, -1), 'reports']);
|
||||
this.dialogRef.close();
|
||||
}
|
||||
|
||||
cancel() {
|
||||
this.dialogRef.close();
|
||||
}
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Payout } from '@vality/swag-anapi-v2';
|
||||
import { BehaviorSubject, of, Subject } from 'rxjs';
|
||||
import { catchError, filter, switchMap, tap } from 'rxjs/operators';
|
||||
|
||||
import { ReportsService } from '@dsh/app/api/anapi';
|
||||
|
||||
@Injectable()
|
||||
export class CreatePayoutReportDialogService {
|
||||
private create$: Subject<Payout> = new Subject();
|
||||
private loading$ = new BehaviorSubject(false);
|
||||
private created$ = new BehaviorSubject(false);
|
||||
private error$ = new Subject<void>();
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/member-ordering
|
||||
isLoading$ = this.loading$.asObservable();
|
||||
// eslint-disable-next-line @typescript-eslint/member-ordering
|
||||
errorOccurred$ = this.error$.asObservable();
|
||||
// eslint-disable-next-line @typescript-eslint/member-ordering
|
||||
reportCreated$ = this.created$.asObservable();
|
||||
|
||||
constructor(private reportsService: ReportsService) {
|
||||
this.create$
|
||||
.pipe(
|
||||
tap(() => {
|
||||
this.loading$.next(true);
|
||||
this.created$.next(false);
|
||||
}),
|
||||
switchMap((payout) =>
|
||||
this.reportsService
|
||||
.createReport({
|
||||
// TODO: fix
|
||||
fromTime: payout.createdAt,
|
||||
toTime: payout.createdAt,
|
||||
reportType: 'paymentRegistry',
|
||||
})
|
||||
.pipe(
|
||||
catchError((e) => {
|
||||
console.error(e);
|
||||
this.loading$.next(false);
|
||||
this.error$.next();
|
||||
return of('error');
|
||||
}),
|
||||
),
|
||||
),
|
||||
filter((result) => result !== 'error'),
|
||||
)
|
||||
.subscribe(() => {
|
||||
this.loading$.next(false);
|
||||
this.created$.next(true);
|
||||
});
|
||||
}
|
||||
|
||||
create(payout: Payout) {
|
||||
this.create$.next(payout);
|
||||
}
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatDialogModule } from '@angular/material/dialog';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
||||
import { TranslocoModule } from '@ngneat/transloco';
|
||||
import { FlexLayoutModule } from 'ng-flex-layout';
|
||||
|
||||
import { ButtonModule } from '@dsh/components/buttons';
|
||||
|
||||
import { CreatePayoutReportDialogComponent } from './create-payout-report-dialog.component';
|
||||
import { CreatePayoutReportService } from './create-payout-report.service';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
TranslocoModule,
|
||||
MatSnackBarModule,
|
||||
MatDialogModule,
|
||||
FlexLayoutModule,
|
||||
ButtonModule,
|
||||
MatInputModule,
|
||||
],
|
||||
declarations: [CreatePayoutReportDialogComponent],
|
||||
providers: [CreatePayoutReportService],
|
||||
})
|
||||
export class CreatePayoutReportModule {}
|
@ -1,40 +0,0 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { Payout } from '@vality/swag-anapi-v2';
|
||||
import { Subject } from 'rxjs';
|
||||
import { switchMap, takeUntil } from 'rxjs/operators';
|
||||
|
||||
import { CreatePayoutReportDialogComponent } from './create-payout-report-dialog.component';
|
||||
|
||||
@Injectable()
|
||||
export class CreatePayoutReportService {
|
||||
private destroy$: Subject<void> = new Subject();
|
||||
private createPayoutReport$: Subject<Payout> = new Subject();
|
||||
|
||||
constructor(private dialog: MatDialog) {}
|
||||
|
||||
createPayoutReport(payout: Payout) {
|
||||
this.createPayoutReport$.next(payout);
|
||||
}
|
||||
|
||||
init() {
|
||||
this.createPayoutReport$
|
||||
.pipe(
|
||||
takeUntil(this.destroy$),
|
||||
switchMap((payout) =>
|
||||
this.dialog
|
||||
.open(CreatePayoutReportDialogComponent, {
|
||||
data: {
|
||||
payout,
|
||||
},
|
||||
})
|
||||
.afterClosed(),
|
||||
),
|
||||
)
|
||||
.subscribe();
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.destroy$.next();
|
||||
}
|
||||
}
|
@ -1,2 +0,0 @@
|
||||
export * from './create-payout-report.module';
|
||||
export * from './create-payout-report.service';
|
@ -1,81 +0,0 @@
|
||||
<ng-container *transloco="let p; scope: 'payment-section'; read: 'paymentSection.payouts.payouts'">
|
||||
<dsh-base-dialog [title]="p('title')" (cancel)="cancel()">
|
||||
<div [formGroup]="form" fxLayout="column" fxLayoutGap="32px">
|
||||
<div fxLayout="column" fxLayoutGap="20px">
|
||||
<mat-form-field fxFill>
|
||||
<mat-label>{{ p('shop') }}</mat-label>
|
||||
<mat-select
|
||||
formControlName="shopID"
|
||||
required
|
||||
(selectionChange)="onShopSelectionChange($event.value)"
|
||||
>
|
||||
<mat-option>
|
||||
{{ p('any') }}
|
||||
</mat-option>
|
||||
<mat-option
|
||||
*ngFor="let shopInfo of shopsInfo$ | async"
|
||||
[value]="shopInfo.shopID"
|
||||
>
|
||||
{{ shopInfo.name }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<ng-container *ngIf="hasSelectedShop">
|
||||
<ng-container *ngIf="!(isPayoutToolsLoading$ | async); else loading">
|
||||
<ng-container *ngIf="hasPayoutTools$ | async; else noPayoutTools">
|
||||
<mat-form-field fxFill>
|
||||
<mat-label>{{ p('payoutTool') }}</mat-label>
|
||||
<mat-select formControlName="payoutToolID">
|
||||
<mat-option
|
||||
*ngFor="let payoutTool of payoutTools$ | async"
|
||||
[value]="payoutTool.id"
|
||||
(onSelectionChange)="
|
||||
onPayoutToolSelectionChange(payoutTool.currency)
|
||||
"
|
||||
>
|
||||
{{
|
||||
payoutTool.details.detailsType
|
||||
| payoutToolDetailsType
|
||||
| async
|
||||
}}: {{ payoutTool.details.walletID }} ({{
|
||||
payoutTool.currency
|
||||
}})
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field fxFill>
|
||||
<mat-label>{{ p('amount') }}</mat-label>
|
||||
<dsh-format-input
|
||||
format="amount"
|
||||
formControlName="amount"
|
||||
required
|
||||
></dsh-format-input>
|
||||
</mat-form-field>
|
||||
</ng-container>
|
||||
<ng-template #noPayoutTools>
|
||||
<div class="mat-body-1" fxFlexFill fxLayoutAlign="center">
|
||||
{{ p('noPayoutTools') }}
|
||||
</div>
|
||||
</ng-template>
|
||||
</ng-container>
|
||||
<ng-template #loading>
|
||||
<div>
|
||||
<dsh-spinner></dsh-spinner>
|
||||
</div>
|
||||
</ng-template>
|
||||
</ng-container>
|
||||
</div>
|
||||
</div>
|
||||
<ng-container dshBaseDialogActions>
|
||||
<button
|
||||
[disabled]="form.invalid || !(hasPayoutTools$ | async)"
|
||||
color="accent"
|
||||
dsh-button
|
||||
fxFlex.gt-sm="160px"
|
||||
(click)="create(form.value)"
|
||||
>
|
||||
{{ p('createPayout') }}
|
||||
</button>
|
||||
</ng-container>
|
||||
</dsh-base-dialog>
|
||||
</ng-container>
|
@ -1,90 +0,0 @@
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
import { UntypedFormBuilder, Validators } from '@angular/forms';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { TranslocoService } from '@ngneat/transloco';
|
||||
import { NotifyLogService } from '@vality/ng-core';
|
||||
import { of } from 'rxjs';
|
||||
|
||||
import { ShopsDataService } from '@dsh/app/shared';
|
||||
import { amountValidator } from '@dsh/components/form-controls';
|
||||
|
||||
import { filterShopsByRealm, mapToShopInfo } from '../../operations/operators';
|
||||
|
||||
import { CreatePayoutDialogService } from './create-payout-dialog.service';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-create-payout-dialog',
|
||||
templateUrl: 'create-payout-dialog.component.html',
|
||||
providers: [CreatePayoutDialogService],
|
||||
})
|
||||
export class CreatePayoutDialogComponent implements OnInit {
|
||||
form = this.fb.group({
|
||||
shopID: null,
|
||||
});
|
||||
|
||||
hasSelectedShop = false;
|
||||
|
||||
currentPayoutToolCurrency: string;
|
||||
|
||||
shopsInfo$ = of(this.data.realm).pipe(
|
||||
filterShopsByRealm(this.shopsDataService.shops$),
|
||||
mapToShopInfo,
|
||||
);
|
||||
|
||||
isPayoutToolsLoading$ = this.createPayoutDialogService.isLoading$;
|
||||
payoutTools$ = this.createPayoutDialogService.payoutTools$;
|
||||
hasPayoutTools$ = this.createPayoutDialogService.hasPayoutTools$;
|
||||
|
||||
constructor(
|
||||
private dialogRef: MatDialogRef<CreatePayoutDialogComponent>,
|
||||
private fb: UntypedFormBuilder,
|
||||
private createPayoutDialogService: CreatePayoutDialogService,
|
||||
private log: NotifyLogService,
|
||||
private transloco: TranslocoService,
|
||||
private shopsDataService: ShopsDataService,
|
||||
@Inject(MAT_DIALOG_DATA) private data: { realm: string },
|
||||
) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.createPayoutDialogService.payoutCreated$.subscribe(() =>
|
||||
this.dialogRef.close('created'),
|
||||
);
|
||||
this.createPayoutDialogService.errorOccurred$.subscribe((err) =>
|
||||
this.log.error(
|
||||
err,
|
||||
this.transloco.selectTranslate(
|
||||
'payouts.errors.createError',
|
||||
null,
|
||||
'payment-section',
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
cancel() {
|
||||
this.dialogRef.close();
|
||||
}
|
||||
|
||||
create(formValue: { shopID: string; payoutToolID: string; amount: number }) {
|
||||
this.createPayoutDialogService.createPayout(formValue);
|
||||
}
|
||||
|
||||
onShopSelectionChange(shopID: string) {
|
||||
this.hasSelectedShop = !!shopID;
|
||||
if (this.hasSelectedShop) {
|
||||
this.createPayoutDialogService.changeShopID(shopID);
|
||||
this.form.addControl('payoutToolID', this.fb.control('', [Validators.required]));
|
||||
this.form.addControl(
|
||||
'amount',
|
||||
this.fb.control('', [Validators.required, amountValidator, Validators.min(1)]),
|
||||
);
|
||||
} else {
|
||||
this.form.removeControl('payoutToolID');
|
||||
this.form.removeControl('amount');
|
||||
}
|
||||
}
|
||||
|
||||
onPayoutToolSelectionChange(payoutToolCurrency: string) {
|
||||
this.currentPayoutToolCurrency = payoutToolCurrency;
|
||||
}
|
||||
}
|
@ -1,92 +0,0 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { BehaviorSubject, forkJoin, merge, of, Subject } from 'rxjs';
|
||||
import { catchError, filter, map, shareReplay, switchMap, take, tap } from 'rxjs/operators';
|
||||
|
||||
import { PayoutsService } from '@dsh/app/api/payments';
|
||||
import { ShopsDataService } from '@dsh/app/shared';
|
||||
|
||||
import { toPayoutParams } from './to-payout-params';
|
||||
|
||||
@Injectable()
|
||||
export class CreatePayoutDialogService {
|
||||
private currentShopID$ = new Subject<string>();
|
||||
|
||||
private create$ = new Subject<{ shopID: string; payoutToolID: string; amount: number }>();
|
||||
private loading$ = new BehaviorSubject(false);
|
||||
private error$ = new Subject<void>();
|
||||
private created$ = new Subject();
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/member-ordering
|
||||
isLoading$ = this.loading$.asObservable();
|
||||
// eslint-disable-next-line @typescript-eslint/member-ordering
|
||||
errorOccurred$ = this.error$.asObservable();
|
||||
// eslint-disable-next-line @typescript-eslint/member-ordering
|
||||
payoutCreated$ = this.created$.asObservable();
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/member-ordering
|
||||
payoutTools$ = this.currentShopID$.pipe(
|
||||
switchMap((shopID) =>
|
||||
this.shopsDataService.shops$.pipe(
|
||||
map((shops) => shops.find(({ id }) => id === shopID)),
|
||||
),
|
||||
),
|
||||
switchMap(({ contractID }) => this.payoutsService.getPayoutToolsForParty({ contractID })),
|
||||
map((tools) =>
|
||||
tools.filter((tool) => tool.details.detailsType === 'PayoutToolDetailsWalletInfo'),
|
||||
),
|
||||
shareReplay(1),
|
||||
);
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/member-ordering
|
||||
hasPayoutTools$ = this.payoutTools$.pipe(
|
||||
map((tools) => !!tools.length),
|
||||
shareReplay(1),
|
||||
);
|
||||
|
||||
constructor(
|
||||
private shopsDataService: ShopsDataService,
|
||||
private payoutsService: PayoutsService,
|
||||
) {
|
||||
merge(this.payoutTools$, this.hasPayoutTools$).subscribe();
|
||||
this.create$
|
||||
.pipe(
|
||||
tap(() => {
|
||||
this.loading$.next(true);
|
||||
this.created$.next(false);
|
||||
}),
|
||||
switchMap((params) =>
|
||||
forkJoin([
|
||||
of(params),
|
||||
this.shopsDataService.shops$.pipe(
|
||||
take(1),
|
||||
map((shops) => shops.find(({ id }) => id === params.shopID)?.currency),
|
||||
),
|
||||
]),
|
||||
),
|
||||
map(([params, currency]) => toPayoutParams(params, currency)),
|
||||
switchMap((payoutParams) =>
|
||||
this.payoutsService.createPayout({ payoutParams }).pipe(
|
||||
catchError((e) => {
|
||||
console.error(e);
|
||||
this.loading$.next(false);
|
||||
this.error$.next();
|
||||
return of('error');
|
||||
}),
|
||||
),
|
||||
),
|
||||
filter((result) => result !== 'error'),
|
||||
)
|
||||
.subscribe(() => {
|
||||
this.loading$.next(false);
|
||||
this.created$.next(true);
|
||||
});
|
||||
}
|
||||
|
||||
changeShopID(id: string) {
|
||||
this.currentShopID$.next(id);
|
||||
}
|
||||
|
||||
createPayout(formValue: { shopID: string; payoutToolID: string; amount: number }) {
|
||||
this.create$.next(formValue);
|
||||
}
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { ReactiveFormsModule } from '@angular/forms';
|
||||
import { MatDialogModule } from '@angular/material/dialog';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
||||
import { TranslocoModule } from '@ngneat/transloco';
|
||||
import { FlexLayoutModule } from 'ng-flex-layout';
|
||||
|
||||
import { BaseDialogModule } from '@dsh/app/shared/components/dialog/base-dialog';
|
||||
import { ApiModelTypesModule } from '@dsh/app/shared/pipes';
|
||||
import { ButtonModule } from '@dsh/components/buttons';
|
||||
import { FormatInputModule } from '@dsh/components/form-controls';
|
||||
import { SpinnerModule } from '@dsh/components/indicators';
|
||||
|
||||
import { CreatePayoutDialogComponent } from './create-payout-dialog.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
TranslocoModule,
|
||||
MatSnackBarModule,
|
||||
MatDialogModule,
|
||||
FlexLayoutModule,
|
||||
ButtonModule,
|
||||
MatInputModule,
|
||||
ReactiveFormsModule,
|
||||
MatSelectModule,
|
||||
SpinnerModule,
|
||||
FormatInputModule,
|
||||
ApiModelTypesModule,
|
||||
BaseDialogModule,
|
||||
],
|
||||
declarations: [CreatePayoutDialogComponent],
|
||||
})
|
||||
export class CreatePayoutModule {}
|
@ -1 +0,0 @@
|
||||
export * from './create-payout.module';
|
@ -1,16 +0,0 @@
|
||||
import { toMinor } from '@vality/ng-core';
|
||||
import { PayoutParams } from '@vality/swag-payments';
|
||||
import { v4 as uuid } from 'uuid';
|
||||
|
||||
export const toPayoutParams = (
|
||||
{ shopID, payoutToolID, amount }: { shopID: string; payoutToolID: string; amount: number },
|
||||
currency: string,
|
||||
): PayoutParams => {
|
||||
return {
|
||||
id: uuid(),
|
||||
shopID,
|
||||
payoutToolID,
|
||||
amount: toMinor(amount, currency),
|
||||
currency,
|
||||
};
|
||||
};
|
@ -1,34 +0,0 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Payout } from '@vality/swag-anapi-v2';
|
||||
import { Observable } from 'rxjs';
|
||||
import { shareReplay } from 'rxjs/operators';
|
||||
|
||||
import { SearchService } from '@dsh/app/api/anapi';
|
||||
import { mapToTimestamp } from '@dsh/app/custom-operators';
|
||||
import { PartialFetcher } from '@dsh/app/shared';
|
||||
|
||||
import { SearchParams } from './types/search-params';
|
||||
|
||||
@Injectable()
|
||||
export class FetchPayoutsService extends PartialFetcher<Payout, SearchParams> {
|
||||
isLoading$: Observable<boolean> = this.doAction$.pipe(shareReplay(1));
|
||||
lastUpdated$: Observable<string> = this.searchResult$.pipe(mapToTimestamp, shareReplay(1));
|
||||
|
||||
constructor(private searchService: SearchService) {
|
||||
super();
|
||||
}
|
||||
|
||||
protected fetch(
|
||||
{ fromTime, toTime, realm, ...restParams }: SearchParams,
|
||||
continuationToken: string,
|
||||
) {
|
||||
return this.searchService.searchPayouts({
|
||||
...restParams,
|
||||
fromTime,
|
||||
toTime,
|
||||
limit: 10,
|
||||
paymentInstitutionRealm: realm,
|
||||
continuationToken,
|
||||
});
|
||||
}
|
||||
}
|
@ -1,2 +0,0 @@
|
||||
export * from './payouts.module';
|
||||
export * from './payouts.component';
|
@ -1 +0,0 @@
|
||||
export * from './payouts-details.module';
|
@ -1 +0,0 @@
|
||||
export * from './payout-actions.component';
|
@ -1,12 +0,0 @@
|
||||
<div
|
||||
*transloco="let t; scope: 'payment-section'; read: 'paymentSection.payouts.panel'"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="24px"
|
||||
>
|
||||
<div class="dsh-title">{{ t('actions') }}</div>
|
||||
<div>
|
||||
<button color="accent" dsh-text-button (click)="createReport.emit()">
|
||||
{{ t('createReport') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
@ -1,10 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, EventEmitter, Output } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-payout-actions',
|
||||
templateUrl: 'payout-actions.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class PayoutActionsComponent {
|
||||
@Output() createReport: EventEmitter<void> = new EventEmitter<void>();
|
||||
}
|
@ -1 +0,0 @@
|
||||
export * from './payout-main-info.component';
|
@ -1,13 +0,0 @@
|
||||
<div
|
||||
*transloco="let p; scope: 'payment-section'; read: 'paymentSection.payouts.panel'"
|
||||
gdColumns="1fr"
|
||||
gdColumns.gt-sm="1fr 1fr 1fr"
|
||||
gdGap="24px"
|
||||
>
|
||||
<div class="dsh-headline">
|
||||
{{ payout?.amount | amountCurrency: payout?.currency }}
|
||||
</div>
|
||||
<dsh-details-item [title]="p('shop')" gdRow="2fr">
|
||||
{{ payout?.shopID | shopDetails }}
|
||||
</dsh-details-item>
|
||||
</div>
|
@ -1,11 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
||||
import { Payout } from '@vality/swag-anapi-v2';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-payout-main-info',
|
||||
templateUrl: 'payout-main-info.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class PayoutMainInfoComponent {
|
||||
@Input() payout: Payout;
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
<div fxLayout="column" fxLayoutGap="24px">
|
||||
<dsh-payout-main-info [payout]="payout"></dsh-payout-main-info>
|
||||
<mat-divider></mat-divider>
|
||||
<div class="dsh-title">
|
||||
{{ payout?.payoutToolDetails?.detailsType | payoutToolDetailsType | async }}
|
||||
</div>
|
||||
<dsh-payout-tool-details
|
||||
[payoutToolDetails]="payout?.payoutToolDetails"
|
||||
></dsh-payout-tool-details>
|
||||
<!-- TODO fix create report fromTime toTime-->
|
||||
<!-- <mat-divider></mat-divider>-->
|
||||
<!-- <dsh-payout-actions (createReport)="createReport()"></dsh-payout-actions>-->
|
||||
</div>
|
@ -1,16 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
||||
import { Payout } from '@vality/swag-anapi-v2';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-payouts-details',
|
||||
templateUrl: 'payouts-details.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class PayoutsDetailsComponent {
|
||||
@Input() payout: Payout;
|
||||
@Output() createPayoutReport: EventEmitter<Payout> = new EventEmitter<Payout>();
|
||||
|
||||
createReport(): void {
|
||||
this.createPayoutReport.emit(this.payout);
|
||||
}
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
||||
import { TranslocoModule } from '@ngneat/transloco';
|
||||
import { FlexLayoutModule } from 'ng-flex-layout';
|
||||
|
||||
import { PayoutToolDetailsModule } from '@dsh/app/shared/components';
|
||||
import {
|
||||
ApiModelRefsModule,
|
||||
ApiModelTypesModule,
|
||||
AmountCurrencyModule,
|
||||
} from '@dsh/app/shared/pipes';
|
||||
import { ButtonModule } from '@dsh/components/buttons';
|
||||
import { IndicatorsModule } from '@dsh/components/indicators';
|
||||
import { LayoutModule } from '@dsh/components/layout';
|
||||
|
||||
import { CreatePayoutReportModule } from '../create-payout-report';
|
||||
|
||||
import { PayoutActionsComponent } from './payout-actions';
|
||||
import { PayoutMainInfoComponent } from './payout-main-info';
|
||||
import { PayoutsDetailsComponent } from './payouts-details.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
TranslocoModule,
|
||||
LayoutModule,
|
||||
ButtonModule,
|
||||
FlexLayoutModule,
|
||||
CommonModule,
|
||||
MatSnackBarModule,
|
||||
MatDividerModule,
|
||||
IndicatorsModule,
|
||||
ApiModelRefsModule,
|
||||
|
||||
CreatePayoutReportModule,
|
||||
PayoutToolDetailsModule,
|
||||
ApiModelTypesModule,
|
||||
AmountCurrencyModule,
|
||||
],
|
||||
declarations: [PayoutsDetailsComponent, PayoutActionsComponent, PayoutMainInfoComponent],
|
||||
exports: [PayoutsDetailsComponent],
|
||||
})
|
||||
export class PayoutsDetailsModule {}
|
@ -1,27 +0,0 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { Payout } from '@vality/swag-anapi-v2';
|
||||
import { Observable } from 'rxjs';
|
||||
|
||||
import { ExpandedIdManager } from '@dsh/app/shared/services';
|
||||
|
||||
import { FetchPayoutsService } from './fetch-payouts.service';
|
||||
|
||||
@Injectable()
|
||||
export class PayoutsExpandedIdManager extends ExpandedIdManager<Payout> {
|
||||
constructor(
|
||||
protected route: ActivatedRoute,
|
||||
protected router: Router,
|
||||
private fetchPayoutsService: FetchPayoutsService,
|
||||
) {
|
||||
super(route, router);
|
||||
}
|
||||
|
||||
protected fragmentNotFound(): void {
|
||||
this.fetchPayoutsService.fetchMore();
|
||||
}
|
||||
|
||||
protected get dataSet$(): Observable<Payout[]> {
|
||||
return this.fetchPayoutsService.searchResult$;
|
||||
}
|
||||
}
|
@ -1,2 +0,0 @@
|
||||
export * from './payouts-list.component';
|
||||
export * from './payouts-list.module';
|
@ -1 +0,0 @@
|
||||
export * from './payout-row-header.component';
|
@ -1,12 +0,0 @@
|
||||
<dsh-row
|
||||
*transloco="let t; scope: 'payment-section'; read: 'paymentSection.payouts.headerRow'"
|
||||
gdAlignColumns="center center"
|
||||
gdColumns="repeat(2, 1fr)"
|
||||
gdColumns.gt-sm="repeat(4, 1fr)"
|
||||
gdGap="24px"
|
||||
>
|
||||
<dsh-row-header-label>{{ t('createdAt') }}</dsh-row-header-label>
|
||||
<dsh-row-header-label>{{ t('amount') }}</dsh-row-header-label>
|
||||
<dsh-row-header-label fxHide.lt-md>{{ t('payoutTool') }}</dsh-row-header-label>
|
||||
<dsh-row-header-label fxHide.lt-md> {{ t('shop') }} </dsh-row-header-label>
|
||||
</dsh-row>
|
@ -1,8 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-payout-row-header',
|
||||
templateUrl: 'payout-row-header.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class PayoutRowHeaderComponent {}
|
@ -1 +0,0 @@
|
||||
export * from './payout-row.component';
|
@ -1,19 +0,0 @@
|
||||
<dsh-row
|
||||
gdAlignColumns="center center"
|
||||
gdColumns="repeat(2, 1fr)"
|
||||
gdColumns.gt-sm="repeat(4, 1fr)"
|
||||
gdGap="24px"
|
||||
>
|
||||
<dsh-row-label>
|
||||
{{ payout.createdAt | date: 'dd MMMM yyyy, HH:mm' }}
|
||||
</dsh-row-label>
|
||||
<dsh-row-label fxHide.lt-md>
|
||||
{{ payout.amount | amountCurrency: payout.currency }}
|
||||
</dsh-row-label>
|
||||
<dsh-row-label>{{
|
||||
payout?.payoutToolDetails?.detailsType | payoutToolDetailsType | async
|
||||
}}</dsh-row-label>
|
||||
<dsh-row-label fxHide.lt-md>
|
||||
{{ payout.shopID | shopDetails }}
|
||||
</dsh-row-label>
|
||||
</dsh-row>
|
@ -1,11 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
||||
import { Payout } from '@vality/swag-anapi-v2';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-payout-row',
|
||||
templateUrl: 'payout-row.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class PayoutRowComponent {
|
||||
@Input() payout: Payout;
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
<div fxLayout="column" fxLayoutGap="16px">
|
||||
<dsh-last-updated [lastUpdated]="lastUpdated" (update)="refreshData.emit()"></dsh-last-updated>
|
||||
<dsh-payout-row-header></dsh-payout-row-header>
|
||||
<dsh-accordion
|
||||
[expanded]="expandedId"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="16px"
|
||||
(expandedChange)="expandedIdChange.emit($event)"
|
||||
>
|
||||
<dsh-accordion-item #accordionItem *ngFor="let payout of payouts">
|
||||
<dsh-payout-row [payout]="payout"></dsh-payout-row>
|
||||
<dsh-accordion-item-content>
|
||||
<dsh-card fxLayout="column" fxLayoutGap="32px">
|
||||
<dsh-accordion-item-content-header
|
||||
*transloco="
|
||||
let t;
|
||||
scope: 'payment-section';
|
||||
read: 'paymentSection.payouts.panel'
|
||||
"
|
||||
(collapse)="accordionItem.collapse($event)"
|
||||
>{{ t('payoutID', { num: payout.id }) }}</dsh-accordion-item-content-header
|
||||
>
|
||||
<dsh-payouts-details
|
||||
[payout]="payout"
|
||||
(createPayoutReport)="createPayoutReport($event)"
|
||||
></dsh-payouts-details>
|
||||
</dsh-card>
|
||||
</dsh-accordion-item-content>
|
||||
</dsh-accordion-item>
|
||||
</dsh-accordion>
|
||||
</div>
|
@ -1,30 +0,0 @@
|
||||
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';
|
||||
import { Payout } from '@vality/swag-anapi-v2';
|
||||
|
||||
import { CreatePayoutReportService } from '../create-payout-report';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-payouts-list',
|
||||
templateUrl: 'payouts-list.component.html',
|
||||
})
|
||||
export class PayoutsListComponent implements OnInit, OnDestroy {
|
||||
@Input() payouts: Payout[];
|
||||
@Input() expandedId: number;
|
||||
@Input() lastUpdated: string;
|
||||
@Output() expandedIdChange: EventEmitter<number> = new EventEmitter();
|
||||
@Output() refreshData: EventEmitter<void> = new EventEmitter();
|
||||
|
||||
constructor(private createPayoutReportService: CreatePayoutReportService) {}
|
||||
|
||||
createPayoutReport(payout: Payout) {
|
||||
this.createPayoutReportService.createPayoutReport(payout);
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.createPayoutReportService.init();
|
||||
}
|
||||
|
||||
ngOnDestroy(): void {
|
||||
this.createPayoutReportService.destroy();
|
||||
}
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
||||
import { TranslocoModule } from '@ngneat/transloco';
|
||||
import { FlexLayoutModule } from 'ng-flex-layout';
|
||||
|
||||
import {
|
||||
ApiModelRefsModule,
|
||||
ApiModelTypesModule,
|
||||
AmountCurrencyModule,
|
||||
} from '@dsh/app/shared/pipes';
|
||||
import { IndicatorsModule } from '@dsh/components/indicators';
|
||||
import { LayoutModule } from '@dsh/components/layout';
|
||||
|
||||
import { PayoutsDetailsModule } from '../payouts-details';
|
||||
|
||||
import { PayoutRowComponent } from './payout-row';
|
||||
import { PayoutRowHeaderComponent } from './payout-row-header';
|
||||
import { PayoutsListComponent } from './payouts-list.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
TranslocoModule,
|
||||
MatSnackBarModule,
|
||||
LayoutModule,
|
||||
FlexLayoutModule,
|
||||
CommonModule,
|
||||
IndicatorsModule,
|
||||
PayoutsDetailsModule,
|
||||
|
||||
ApiModelTypesModule,
|
||||
ApiModelRefsModule,
|
||||
AmountCurrencyModule,
|
||||
],
|
||||
declarations: [PayoutsListComponent, PayoutRowHeaderComponent, PayoutRowComponent],
|
||||
exports: [PayoutsListComponent],
|
||||
})
|
||||
export class PayoutsListModule {}
|
@ -1,17 +0,0 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule, Routes } from '@angular/router';
|
||||
|
||||
import { PayoutsComponent } from './payouts.component';
|
||||
|
||||
const ROUTES: Routes = [
|
||||
{
|
||||
path: '',
|
||||
component: PayoutsComponent,
|
||||
},
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
imports: [RouterModule.forChild(ROUTES)],
|
||||
exports: [RouterModule],
|
||||
})
|
||||
export class PayoutsRoutingModule {}
|
@ -1 +0,0 @@
|
||||
export * from './payouts-search-filters.module';
|
@ -1,8 +0,0 @@
|
||||
<dsh-filters-group [formGroup]="form">
|
||||
<dsh-date-range-filter
|
||||
[default]="defaultDateRange"
|
||||
[maxDate]="defaultDateRange.end"
|
||||
formControlName="dateRange"
|
||||
></dsh-date-range-filter>
|
||||
<dsh-shops-filter [shops]="shops" formControlName="shopIDs"></dsh-shops-filter>
|
||||
</dsh-filters-group>
|
@ -1,56 +0,0 @@
|
||||
import {
|
||||
ChangeDetectionStrategy,
|
||||
Component,
|
||||
EventEmitter,
|
||||
Input,
|
||||
OnChanges,
|
||||
OnInit,
|
||||
Output,
|
||||
} from '@angular/core';
|
||||
import { FormBuilder } from '@angular/forms';
|
||||
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
|
||||
import { ComponentChanges } from '@vality/ng-core';
|
||||
import { Shop } from '@vality/swag-payments';
|
||||
|
||||
import {
|
||||
createDateRangeWithPreset,
|
||||
DateRangeWithPreset,
|
||||
Preset,
|
||||
} from '@dsh/components/date-range-filter';
|
||||
import { getFormValueChanges } from '@dsh/utils';
|
||||
|
||||
import { SearchParams } from '../types/search-params';
|
||||
|
||||
export interface Filters {
|
||||
shopIDs: Shop['id'][];
|
||||
dateRange: DateRangeWithPreset;
|
||||
}
|
||||
|
||||
@UntilDestroy()
|
||||
@Component({
|
||||
selector: 'dsh-payouts-search-filters',
|
||||
templateUrl: 'payouts-search-filters.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class PayoutsSearchFiltersComponent implements OnInit, OnChanges {
|
||||
@Input() initParams: SearchParams;
|
||||
@Input() shops: Shop[];
|
||||
@Output() searchParamsChanges = new EventEmitter<Filters>();
|
||||
|
||||
defaultDateRange = createDateRangeWithPreset(Preset.Last90days);
|
||||
form = this.fb.group<Filters>({ shopIDs: null, dateRange: this.defaultDateRange });
|
||||
|
||||
constructor(private fb: FormBuilder) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
getFormValueChanges(this.form)
|
||||
.pipe(untilDestroyed(this))
|
||||
.subscribe((filters) => this.searchParamsChanges.next(filters as unknown as Filters));
|
||||
}
|
||||
|
||||
ngOnChanges({ initParams }: ComponentChanges<PayoutsSearchFiltersComponent>): void {
|
||||
if (initParams?.firstChange && initParams.currentValue) {
|
||||
this.form.patchValue(initParams.currentValue as unknown);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { ReactiveFormsModule } from '@angular/forms';
|
||||
import { FlexLayoutModule } from 'ng-flex-layout';
|
||||
|
||||
import { ShopsFilterModule } from '@dsh/app/shared/components/filters/shops-filter';
|
||||
import { DateRangeFilterModule } from '@dsh/components/date-range-filter';
|
||||
import { FiltersGroupModule } from '@dsh/components/filters-group';
|
||||
|
||||
import { PayoutsSearchFiltersComponent } from './payouts-search-filters.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
FlexLayoutModule,
|
||||
ShopsFilterModule,
|
||||
ReactiveFormsModule,
|
||||
FiltersGroupModule,
|
||||
DateRangeFilterModule,
|
||||
],
|
||||
exports: [PayoutsSearchFiltersComponent],
|
||||
declarations: [PayoutsSearchFiltersComponent],
|
||||
})
|
||||
export class PayoutsSearchFiltersModule {}
|
@ -1,42 +0,0 @@
|
||||
<div
|
||||
*transloco="let t; scope: 'payment-section'; read: 'paymentSection.payouts'"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="32px"
|
||||
>
|
||||
<div
|
||||
gdAlignColumns="center center"
|
||||
gdAlignRows="space-between start"
|
||||
gdColumns="1fr"
|
||||
gdColumns.gt-sm="repeat(2, auto)"
|
||||
gdGap="32px"
|
||||
>
|
||||
<button color="accent" dsh-button (click)="createPayout()">
|
||||
{{ t('payouts.createPayout') }}
|
||||
</button>
|
||||
<dsh-payouts-search-filters
|
||||
[initParams]="params$ | async"
|
||||
[shops]="shops$ | async"
|
||||
gdRow.gt-sm="1"
|
||||
(searchParamsChanges)="searchParamsChanges($event)"
|
||||
></dsh-payouts-search-filters>
|
||||
</div>
|
||||
<div fxLayout="column" fxLayoutGap="16px">
|
||||
<dsh-payouts-list
|
||||
[expandedId]="expandedId$ | async"
|
||||
[lastUpdated]="lastUpdated$ | async"
|
||||
[payouts]="payouts$ | async"
|
||||
(expandedIdChange)="expandedIdChange($event)"
|
||||
(refreshData)="refresh()"
|
||||
></dsh-payouts-list>
|
||||
<dsh-show-more-panel
|
||||
*ngIf="hasMore$ | async"
|
||||
[isLoading]="isLoading$ | async"
|
||||
(showMore)="fetchMore()"
|
||||
></dsh-show-more-panel>
|
||||
</div>
|
||||
<dsh-empty-search-result
|
||||
*ngIf="!(fetchErrors$ | async) && (payouts$ | async)?.length === 0"
|
||||
></dsh-empty-search-result>
|
||||
<dsh-spinner *ngIf="isLoading$ | async" fxLayoutAlign="center"></dsh-spinner>
|
||||
</div>
|
||||
<dsh-scroll-up></dsh-scroll-up>
|
@ -1,109 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { TranslocoService } from '@ngneat/transloco';
|
||||
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
|
||||
import { NotifyLogService, QueryParamsService } from '@vality/ng-core';
|
||||
import { Subject } from 'rxjs';
|
||||
import { filter, first, switchMap, switchMapTo } from 'rxjs/operators';
|
||||
|
||||
import { RealmMixService, PaymentInstitutionRealmService, RealmShopsService } from '../services';
|
||||
|
||||
import { CreatePayoutDialogComponent } from './create-payout/create-payout-dialog.component';
|
||||
import { FetchPayoutsService } from './fetch-payouts.service';
|
||||
import { PayoutsExpandedIdManager } from './payouts-expanded-id-manager.service';
|
||||
import { Filters } from './payouts-search-filters/payouts-search-filters.component';
|
||||
import { SearchParams } from './types/search-params';
|
||||
|
||||
@UntilDestroy()
|
||||
@Component({
|
||||
selector: 'dsh-payouts',
|
||||
templateUrl: 'payouts.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
providers: [FetchPayoutsService, PayoutsExpandedIdManager, RealmMixService],
|
||||
})
|
||||
export class PayoutsComponent implements OnInit {
|
||||
payouts$ = this.fetchPayoutsService.searchResult$;
|
||||
isLoading$ = this.fetchPayoutsService.isLoading$;
|
||||
hasMore$ = this.fetchPayoutsService.hasMore$;
|
||||
lastUpdated$ = this.fetchPayoutsService.lastUpdated$;
|
||||
expandedId$ = this.payoutsExpandedIdManager.expandedId$;
|
||||
params$ = this.qp.params$;
|
||||
fetchErrors$ = this.fetchPayoutsService.errors$;
|
||||
shops$ = this.realmShopsService.shops$;
|
||||
|
||||
private createPayout$ = new Subject<void>();
|
||||
|
||||
constructor(
|
||||
private fetchPayoutsService: FetchPayoutsService,
|
||||
private payoutsExpandedIdManager: PayoutsExpandedIdManager,
|
||||
private log: NotifyLogService,
|
||||
private transloco: TranslocoService,
|
||||
private realmService: PaymentInstitutionRealmService,
|
||||
private qp: QueryParamsService<Filters>,
|
||||
private dialog: MatDialog,
|
||||
private realmShopsService: RealmShopsService,
|
||||
private realmMixService: RealmMixService<SearchParams>,
|
||||
) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.fetchPayoutsService.errors$
|
||||
.pipe(untilDestroyed(this))
|
||||
.subscribe((err) =>
|
||||
this.log.error(
|
||||
err,
|
||||
this.transloco.selectTranslate('shared.httpError', null, 'components'),
|
||||
),
|
||||
);
|
||||
this.realmMixService.mixedValue$
|
||||
.pipe(untilDestroyed(this))
|
||||
.subscribe((v) => this.fetchPayoutsService.search(v));
|
||||
this.createPayout$
|
||||
.pipe(
|
||||
switchMapTo(this.realmService.realm$.pipe(first())),
|
||||
switchMap((realm) =>
|
||||
this.dialog
|
||||
.open(CreatePayoutDialogComponent, { data: { realm } })
|
||||
.afterClosed()
|
||||
.pipe(filter((r) => r === 'created')),
|
||||
),
|
||||
untilDestroyed(this),
|
||||
)
|
||||
.subscribe(() => {
|
||||
this.log.success(
|
||||
this.transloco.selectTranslate(
|
||||
'payouts.payouts.created',
|
||||
null,
|
||||
'payment-section',
|
||||
),
|
||||
);
|
||||
this.refresh();
|
||||
});
|
||||
}
|
||||
|
||||
createPayout(): void {
|
||||
this.createPayout$.next();
|
||||
}
|
||||
|
||||
searchParamsChanges(p: Filters): void {
|
||||
void this.qp.set(p);
|
||||
const { dateRange, ...otherParams } = p;
|
||||
this.realmMixService.mix({
|
||||
fromTime: dateRange.start.clone().utc().format(),
|
||||
toTime: dateRange.end.clone().utc().format(),
|
||||
realm: null,
|
||||
...otherParams,
|
||||
});
|
||||
}
|
||||
|
||||
expandedIdChange(id: number): void {
|
||||
this.payoutsExpandedIdManager.expandedIdChange(id);
|
||||
}
|
||||
|
||||
fetchMore(): void {
|
||||
this.fetchPayoutsService.fetchMore();
|
||||
}
|
||||
|
||||
refresh(): void {
|
||||
this.fetchPayoutsService.refresh();
|
||||
}
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { MatCommonModule, MatOptionModule } from '@angular/material/core';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { TranslocoModule } from '@ngneat/transloco';
|
||||
import { FlexLayoutModule } from 'ng-flex-layout';
|
||||
|
||||
import { ApiModelTypesModule } from '@dsh/app/shared/pipes';
|
||||
import { ButtonModule } from '@dsh/components/buttons';
|
||||
import { DateRangeFilterModule } from '@dsh/components/date-range-filter';
|
||||
import { EmptySearchResultModule } from '@dsh/components/empty-search-result';
|
||||
import { FormatInputModule } from '@dsh/components/form-controls';
|
||||
import { SpinnerModule } from '@dsh/components/indicators';
|
||||
import { LayoutModule } from '@dsh/components/layout';
|
||||
import { ScrollUpModule } from '@dsh/components/navigation';
|
||||
import { ShowMorePanelModule } from '@dsh/components/show-more-panel';
|
||||
|
||||
import { CreatePayoutModule } from './create-payout';
|
||||
import { PayoutsListModule } from './payouts-list';
|
||||
import { PayoutsRoutingModule } from './payouts-routing.module';
|
||||
import { PayoutsSearchFiltersModule } from './payouts-search-filters';
|
||||
import { PayoutsComponent } from './payouts.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
PayoutsRoutingModule,
|
||||
MatCommonModule,
|
||||
FlexLayoutModule,
|
||||
ButtonModule,
|
||||
TranslocoModule,
|
||||
ReactiveFormsModule,
|
||||
FormsModule,
|
||||
LayoutModule,
|
||||
MatFormFieldModule,
|
||||
MatOptionModule,
|
||||
CommonModule,
|
||||
MatSelectModule,
|
||||
MatInputModule,
|
||||
SpinnerModule,
|
||||
ScrollUpModule,
|
||||
ShowMorePanelModule,
|
||||
FormatInputModule,
|
||||
ApiModelTypesModule,
|
||||
PayoutsSearchFiltersModule,
|
||||
PayoutsListModule,
|
||||
EmptySearchResultModule,
|
||||
CreatePayoutModule,
|
||||
DateRangeFilterModule,
|
||||
],
|
||||
declarations: [PayoutsComponent],
|
||||
exports: [PayoutsComponent],
|
||||
})
|
||||
export class PayoutsModule {}
|
@ -1,10 +0,0 @@
|
||||
import { PaymentInstitution } from '@vality/swag-payments';
|
||||
|
||||
import RealmEnum = PaymentInstitution.RealmEnum;
|
||||
|
||||
export interface SearchParams {
|
||||
fromTime: string;
|
||||
toTime: string;
|
||||
realm: RealmEnum;
|
||||
shopIDs?: string[];
|
||||
}
|
@ -1,89 +0,0 @@
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
import { PayoutTool } from '@vality/swag-payments';
|
||||
import { cold } from 'jasmine-marbles';
|
||||
import { of } from 'rxjs';
|
||||
import { map, take } from 'rxjs/operators';
|
||||
import { instance, mock, when } from 'ts-mockito';
|
||||
|
||||
import { PayoutsService } from '@dsh/app/api/payouts';
|
||||
|
||||
import { ShopPayoutToolDetailsService } from './shop-payout-tool-details.service';
|
||||
|
||||
describe('ShopPayoutToolDetailsService', () => {
|
||||
let service: ShopPayoutToolDetailsService;
|
||||
let mockPayoutsService: PayoutsService;
|
||||
|
||||
beforeEach(() => {
|
||||
mockPayoutsService = mock(PayoutsService);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
providers: [
|
||||
ShopPayoutToolDetailsService,
|
||||
{
|
||||
provide: PayoutsService,
|
||||
useFactory: () => instance(mockPayoutsService),
|
||||
},
|
||||
],
|
||||
});
|
||||
service = TestBed.inject(ShopPayoutToolDetailsService);
|
||||
});
|
||||
|
||||
it('should be created', () => {
|
||||
expect(service).toBeTruthy();
|
||||
});
|
||||
|
||||
describe('getContract', () => {
|
||||
it('should tick contract value if contracts came with no errors', () => {
|
||||
// can't test it with cold/hot marbles cause it's an subject
|
||||
service.shopPayoutTool$.pipe(take(1)).subscribe((data: PayoutTool) => {
|
||||
expect(data).toEqual({
|
||||
currency: 'USD',
|
||||
details: {
|
||||
detailsType: 'any',
|
||||
},
|
||||
id: 'my_id',
|
||||
});
|
||||
});
|
||||
|
||||
when(mockPayoutsService.getPayoutToolByID('contract_id', 'payout_tool_id')).thenReturn(
|
||||
of({
|
||||
currency: 'USD',
|
||||
details: {
|
||||
detailsType: 'any',
|
||||
},
|
||||
id: 'my_id',
|
||||
}),
|
||||
);
|
||||
|
||||
service.requestPayoutTool({
|
||||
contractID: 'contract_id',
|
||||
payoutToolID: 'payout_tool_id',
|
||||
});
|
||||
|
||||
expect().nothing();
|
||||
});
|
||||
|
||||
it('should tick errors value if contracts came with errors', () => {
|
||||
when(mockPayoutsService.getPayoutToolByID('contract_id', 'payout_tool_id')).thenReturn(
|
||||
of(null).pipe(
|
||||
map(() => {
|
||||
throw new Error(`[TEST_ERROR]: Error in observable`);
|
||||
}),
|
||||
),
|
||||
);
|
||||
|
||||
service.requestPayoutTool({
|
||||
contractID: 'contract_id',
|
||||
payoutToolID: 'payout_tool_id',
|
||||
});
|
||||
|
||||
expect(service.errorOccurred$).toBeObservable(
|
||||
cold('a', {
|
||||
a: true,
|
||||
}),
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
@ -1,60 +0,0 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
|
||||
import { PayoutTool } from '@vality/swag-payments';
|
||||
import { BehaviorSubject, defer, Observable, of, ReplaySubject, Subject } from 'rxjs';
|
||||
import { catchError, distinctUntilChanged, filter, switchMap, tap } from 'rxjs/operators';
|
||||
|
||||
import { PayoutsService } from '@dsh/app/api/payments';
|
||||
|
||||
import { PayoutToolParams } from '../../shops-list/shop-details/types/payout-tool-params';
|
||||
|
||||
@UntilDestroy()
|
||||
@Injectable()
|
||||
export class ShopPayoutToolDetailsService {
|
||||
shopPayoutTool$: Observable<PayoutTool>;
|
||||
errorOccurred$: Observable<boolean>;
|
||||
isLoading$ = defer(() => this._isLoading$.asObservable());
|
||||
|
||||
private getPayoutTool$ = new Subject<PayoutToolParams>();
|
||||
private error$ = new BehaviorSubject<boolean>(false);
|
||||
private payoutTool$ = new ReplaySubject<PayoutTool>(1);
|
||||
private _isLoading$ = new BehaviorSubject<boolean>(false);
|
||||
|
||||
constructor(private payoutsService: PayoutsService) {
|
||||
this.shopPayoutTool$ = this.payoutTool$.asObservable();
|
||||
this.errorOccurred$ = this.error$.asObservable();
|
||||
|
||||
this.getPayoutTool$
|
||||
.pipe(
|
||||
tap(() => this.error$.next(false)),
|
||||
distinctUntilChanged(),
|
||||
tap(() => this._isLoading$.next(true)),
|
||||
switchMap((payoutToolParams) =>
|
||||
payoutToolParams
|
||||
? this.payoutsService
|
||||
.getPayoutToolByIDForParty({
|
||||
contractID: payoutToolParams.contractID,
|
||||
payoutToolID: payoutToolParams.payoutToolID,
|
||||
})
|
||||
.pipe(
|
||||
catchError((e) => {
|
||||
console.error(e);
|
||||
this.error$.next(true);
|
||||
return of('error');
|
||||
}),
|
||||
)
|
||||
: of(null),
|
||||
),
|
||||
tap(() => this._isLoading$.next(false)),
|
||||
filter((result) => result !== 'error'),
|
||||
untilDestroyed(this),
|
||||
)
|
||||
.subscribe((payoutTool: PayoutTool) => {
|
||||
this.payoutTool$.next(payoutTool);
|
||||
});
|
||||
}
|
||||
|
||||
requestPayoutTool(params: PayoutToolParams): void {
|
||||
this.getPayoutTool$.next(params);
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
<div
|
||||
*transloco="let t; scope: 'payment-section'; read: 'paymentSection.shops.shopPayoutTool'"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="24px"
|
||||
>
|
||||
<div class="dsh-title">{{ t('title') }}</div>
|
||||
<dsh-payout-tool
|
||||
*ngIf="payoutTool$ | async as payoutTool"
|
||||
[payoutTool]="payoutTool"
|
||||
></dsh-payout-tool>
|
||||
<div *ngIf="errorOccurred$ | async" class="dsh-body-1">{{ t('error') }}</div>
|
||||
</div>
|
@ -1,78 +0,0 @@
|
||||
import { ChangeDetectionStrategy } from '@angular/core';
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { deepEqual, instance, mock, verify, when } from 'ts-mockito';
|
||||
|
||||
import { getTranslocoModule } from '@dsh/app/shared/tests/get-transloco-module';
|
||||
|
||||
import { ShopPayoutToolDetailsService } from '../../../../services/shop-payout-tool-details/shop-payout-tool-details.service';
|
||||
|
||||
import { ShopPayoutToolDetailsComponent } from './shop-payout-tool-details.component';
|
||||
|
||||
describe('ShopPayoutToolDetailsComponent', () => {
|
||||
let component: ShopPayoutToolDetailsComponent;
|
||||
let fixture: ComponentFixture<ShopPayoutToolDetailsComponent>;
|
||||
let mockPayoutsService: ShopPayoutToolDetailsService;
|
||||
|
||||
beforeEach(() => {
|
||||
mockPayoutsService = mock(ShopPayoutToolDetailsService);
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
imports: [getTranslocoModule()],
|
||||
declarations: [ShopPayoutToolDetailsComponent],
|
||||
providers: [
|
||||
{
|
||||
provide: ShopPayoutToolDetailsService,
|
||||
useFactory: () => instance(mockPayoutsService),
|
||||
},
|
||||
],
|
||||
})
|
||||
.overrideComponent(ShopPayoutToolDetailsComponent, {
|
||||
set: {
|
||||
providers: [],
|
||||
changeDetection: ChangeDetectionStrategy.Default,
|
||||
},
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(ShopPayoutToolDetailsComponent);
|
||||
component = fixture.componentInstance;
|
||||
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
|
||||
describe('contractID', () => {
|
||||
it('should call getContract on id change', () => {
|
||||
when(
|
||||
mockPayoutsService.requestPayoutTool(
|
||||
deepEqual({
|
||||
contractID: 'my_contract_id',
|
||||
payoutToolID: 'my_payout_tool_id',
|
||||
}),
|
||||
),
|
||||
).thenReturn();
|
||||
|
||||
component.payoutToolParams = {
|
||||
contractID: 'my_contract_id',
|
||||
payoutToolID: 'my_payout_tool_id',
|
||||
};
|
||||
|
||||
verify(
|
||||
mockPayoutsService.requestPayoutTool(
|
||||
deepEqual({
|
||||
contractID: 'my_contract_id',
|
||||
payoutToolID: 'my_payout_tool_id',
|
||||
}),
|
||||
),
|
||||
).once();
|
||||
expect().nothing();
|
||||
});
|
||||
});
|
||||
});
|
@ -1,22 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
||||
|
||||
import { ShopPayoutToolDetailsService } from '../../../../services/shop-payout-tool-details/shop-payout-tool-details.service';
|
||||
import { PayoutToolParams } from '../../types/payout-tool-params';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-shop-payout-tool-details',
|
||||
templateUrl: 'shop-payout-tool-details.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
providers: [ShopPayoutToolDetailsService],
|
||||
})
|
||||
export class ShopPayoutToolDetailsComponent {
|
||||
@Input()
|
||||
set payoutToolParams(p: PayoutToolParams) {
|
||||
this.shopPayoutToolDetailsService.requestPayoutTool(p);
|
||||
}
|
||||
|
||||
payoutTool$ = this.shopPayoutToolDetailsService.shopPayoutTool$;
|
||||
errorOccurred$ = this.shopPayoutToolDetailsService.errorOccurred$;
|
||||
|
||||
constructor(private shopPayoutToolDetailsService: ShopPayoutToolDetailsService) {}
|
||||
}
|
@ -4,10 +4,6 @@
|
||||
<dsh-shop-id [id]="shop.id"></dsh-shop-id>
|
||||
<mat-divider></mat-divider>
|
||||
<dsh-shop-contract-details [contractID]="shop.contractID"></dsh-shop-contract-details>
|
||||
<mat-divider></mat-divider>
|
||||
<dsh-shop-payout-tool-details
|
||||
[payoutToolParams]="{ contractID: shop.contractID, payoutToolID: shop.payoutToolID }"
|
||||
></dsh-shop-payout-tool-details>
|
||||
<ng-container *ngIf="!shop.isBlocked">
|
||||
<mat-divider></mat-divider>
|
||||
<dsh-shop-actions [shop]="shop" (updateData)="requestUpdateData()"></dsh-shop-actions>
|
||||
|
@ -1,142 +0,0 @@
|
||||
import { ClipboardModule } from '@angular/cdk/clipboard';
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { MatDialogModule } from '@angular/material/dialog';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
||||
import { TranslocoTestingModule } from '@ngneat/transloco';
|
||||
import { FlexLayoutModule } from 'ng-flex-layout';
|
||||
import { of } from 'rxjs';
|
||||
import { instance, mock, when } from 'ts-mockito';
|
||||
|
||||
import { CategoriesModule } from '@dsh/app/api/categories';
|
||||
import { ContractsModule } from '@dsh/app/api/contracts';
|
||||
import { ContractDetailsModule, PayoutToolModule } from '@dsh/app/shared/components';
|
||||
import { ShopContractDetailsService } from '@dsh/app/shared/services/shop-contract-details';
|
||||
import { ButtonModule } from '@dsh/components/buttons';
|
||||
import { DetailsItemModule } from '@dsh/components/layout';
|
||||
|
||||
import { ShopPayoutToolDetailsService } from '../../services/shop-payout-tool-details/shop-payout-tool-details.service';
|
||||
import { generateMockShopItem } from '../../tests/generate-shop-item';
|
||||
import { ShopBalanceModule } from '../shop-balance';
|
||||
|
||||
import { ShopActionsComponent } from './components/shop-actions/shop-actions.component';
|
||||
import { ShopContractDetailsComponent } from './components/shop-contract-details/shop-contract-details.component';
|
||||
import { ShopIdComponent } from './components/shop-id/shop-id.component';
|
||||
import { ShopInfoComponent } from './components/shop-info/shop-info.component';
|
||||
import { ShopPayoutToolDetailsComponent } from './components/shop-payout-tool-details/shop-payout-tool-details.component';
|
||||
import { CategoryService } from './services/category/category.service';
|
||||
import { ShopActionsService } from './services/shop-actions/shop-actions.service';
|
||||
import { ShopDetailsComponent } from './shop-details.component';
|
||||
import { ShopActionResult } from './types/shop-action-result';
|
||||
|
||||
describe('ShopDetailsComponent', () => {
|
||||
let component: ShopDetailsComponent;
|
||||
let fixture: ComponentFixture<ShopDetailsComponent>;
|
||||
let mockCategoryService: CategoryService;
|
||||
let mockContractsService: ShopContractDetailsService;
|
||||
let mockPayoutsService: ShopPayoutToolDetailsService;
|
||||
let mockActionsService: ShopActionsService;
|
||||
|
||||
beforeEach(() => {
|
||||
mockCategoryService = mock(CategoryService);
|
||||
mockContractsService = mock(ShopContractDetailsService);
|
||||
mockPayoutsService = mock(ShopPayoutToolDetailsService);
|
||||
mockActionsService = mock(ShopActionsService);
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
imports: [
|
||||
FlexLayoutModule,
|
||||
ButtonModule,
|
||||
TranslocoTestingModule.withLangs({
|
||||
en: {},
|
||||
}),
|
||||
MatDividerModule,
|
||||
DetailsItemModule,
|
||||
ClipboardModule,
|
||||
ContractDetailsModule,
|
||||
PayoutToolModule,
|
||||
ShopBalanceModule,
|
||||
CategoriesModule,
|
||||
ContractsModule,
|
||||
MatSnackBarModule,
|
||||
MatDialogModule,
|
||||
],
|
||||
declarations: [
|
||||
ShopDetailsComponent,
|
||||
ShopContractDetailsComponent,
|
||||
ShopPayoutToolDetailsComponent,
|
||||
ShopActionsComponent,
|
||||
ShopIdComponent,
|
||||
ShopInfoComponent,
|
||||
],
|
||||
providers: [
|
||||
{
|
||||
provide: CategoryService,
|
||||
useFactory: () => instance(mockCategoryService),
|
||||
},
|
||||
{
|
||||
provide: ShopContractDetailsService,
|
||||
useFactory: () => instance(mockContractsService),
|
||||
},
|
||||
{
|
||||
provide: ShopPayoutToolDetailsService,
|
||||
useFactory: () => instance(mockPayoutsService),
|
||||
},
|
||||
{
|
||||
provide: ShopActionsService,
|
||||
useValue: mockActionsService,
|
||||
},
|
||||
],
|
||||
})
|
||||
.overrideComponent(ShopActionsComponent, {
|
||||
set: {
|
||||
providers: [],
|
||||
},
|
||||
})
|
||||
.overrideComponent(ShopContractDetailsComponent, {
|
||||
set: {
|
||||
providers: [],
|
||||
},
|
||||
})
|
||||
.overrideComponent(ShopPayoutToolDetailsComponent, {
|
||||
set: {
|
||||
providers: [],
|
||||
},
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
when(mockCategoryService.category$).thenReturn(of(undefined));
|
||||
when(mockContractsService.shopContract$).thenReturn(of(null));
|
||||
when(mockContractsService.errorOccurred$).thenReturn(of(false));
|
||||
when(mockPayoutsService.shopPayoutTool$).thenReturn(of(null));
|
||||
when(mockPayoutsService.errorOccurred$).thenReturn(of(false));
|
||||
when(mockActionsService.suspend).thenReturn(() => of(ShopActionResult.Success));
|
||||
when(mockActionsService.activate).thenReturn(() => of(ShopActionResult.Success));
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(ShopDetailsComponent);
|
||||
component = fixture.componentInstance;
|
||||
|
||||
component.shop = generateMockShopItem(1);
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
|
||||
describe('requestUpdateData', () => {
|
||||
it('should emit updateData', () => {
|
||||
const spyOnUpdateData = spyOn(component.updateData, 'emit').and.callThrough();
|
||||
|
||||
component.requestUpdateData();
|
||||
|
||||
expect(spyOnUpdateData).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
});
|
@ -7,7 +7,7 @@ import { MatSnackBarModule } from '@angular/material/snack-bar';
|
||||
import { TranslocoModule } from '@ngneat/transloco';
|
||||
import { FlexLayoutModule } from 'ng-flex-layout';
|
||||
|
||||
import { ContractDetailsModule, PayoutToolModule } from '@dsh/app/shared/components';
|
||||
import { ContractDetailsModule } from '@dsh/app/shared/components';
|
||||
import { ShopContractDetailsModule } from '@dsh/app/shared/services/shop-contract-details';
|
||||
import { ButtonModule } from '@dsh/components/buttons';
|
||||
import { DetailsItemModule } from '@dsh/components/layout';
|
||||
@ -18,7 +18,6 @@ import { ShopActionsComponent } from './components/shop-actions/shop-actions.com
|
||||
import { ShopContractDetailsComponent } from './components/shop-contract-details/shop-contract-details.component';
|
||||
import { ShopIdComponent } from './components/shop-id/shop-id.component';
|
||||
import { ShopInfoComponent } from './components/shop-info/shop-info.component';
|
||||
import { ShopPayoutToolDetailsComponent } from './components/shop-payout-tool-details/shop-payout-tool-details.component';
|
||||
import { CategoryService } from './services/category/category.service';
|
||||
import { ShopDetailsComponent } from './shop-details.component';
|
||||
|
||||
@ -32,7 +31,6 @@ import { ShopDetailsComponent } from './shop-details.component';
|
||||
DetailsItemModule,
|
||||
ClipboardModule,
|
||||
ContractDetailsModule,
|
||||
PayoutToolModule,
|
||||
ShopBalanceModule,
|
||||
MatSnackBarModule,
|
||||
MatDialogModule,
|
||||
@ -41,7 +39,6 @@ import { ShopDetailsComponent } from './shop-details.component';
|
||||
declarations: [
|
||||
ShopDetailsComponent,
|
||||
ShopContractDetailsComponent,
|
||||
ShopPayoutToolDetailsComponent,
|
||||
ShopActionsComponent,
|
||||
ShopIdComponent,
|
||||
ShopInfoComponent,
|
||||
|
@ -5,7 +5,6 @@ export enum NavbarRouterLink {
|
||||
Shops = 'shops',
|
||||
Analytics = 'analytics',
|
||||
Operations = 'operations',
|
||||
Payouts = 'payouts',
|
||||
Reports = 'reports',
|
||||
Integrations = 'integrations',
|
||||
}
|
||||
@ -24,7 +23,7 @@ export const toNavbarItemConfig = ({
|
||||
operations,
|
||||
reports,
|
||||
}: Record<
|
||||
'shops' | 'analytics' | 'integrations' | 'operations' | 'payouts' | 'reports',
|
||||
'shops' | 'analytics' | 'integrations' | 'operations' | 'reports',
|
||||
string
|
||||
>): NavbarItemConfig[] => [
|
||||
{
|
||||
@ -49,12 +48,6 @@ export const toNavbarItemConfig = ({
|
||||
RoleAccessName.ViewRefunds,
|
||||
],
|
||||
},
|
||||
// {
|
||||
// routerLink: NavbarRouterLink.Payouts,
|
||||
// icon: BootstrapIconName.ArrowRightCircle,
|
||||
// label: payouts,
|
||||
// roles: [RoleAccessName.ViewPayouts],
|
||||
// },
|
||||
{
|
||||
routerLink: NavbarRouterLink.Reports,
|
||||
icon: BootstrapIconName.FileText,
|
||||
|
@ -1,8 +1,6 @@
|
||||
export * from './contract-details';
|
||||
export * from './contractor-details';
|
||||
export * from './bank-account-details';
|
||||
export * from './payout-tool-details';
|
||||
export * from './payout-tool';
|
||||
export * from './webhook-api-key';
|
||||
export * from './refund-details';
|
||||
export * from './invoice-details';
|
||||
|
@ -1,2 +0,0 @@
|
||||
export * from './payout-tool-details.module';
|
||||
export * from './payout-tool-details.component';
|
@ -1 +0,0 @@
|
||||
export * from './international-bank-account.component';
|
@ -1,63 +0,0 @@
|
||||
<div
|
||||
*transloco="
|
||||
let t;
|
||||
scope: 'components';
|
||||
read: 'components.apiModelDetails.payoutToolDetails.internationalBankAccount'
|
||||
"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="24px"
|
||||
>
|
||||
<dsh-details-item *ngIf="internationalBankAccount?.number" [title]="t('number')">
|
||||
{{ internationalBankAccount?.number }}
|
||||
</dsh-details-item>
|
||||
<dsh-details-item *ngIf="internationalBankAccount?.iban" [title]="t('iban')">
|
||||
{{ internationalBankAccount?.iban }}
|
||||
</dsh-details-item>
|
||||
<ng-container *ngIf="internationalBankAccount?.bankDetails as bankDetails">
|
||||
<ng-container
|
||||
*transloco="
|
||||
let d;
|
||||
scope: 'components';
|
||||
read: 'components.apiModelDetails.payoutToolDetails.internationalBankAccount.bankDetails'
|
||||
"
|
||||
gdColumns="1fr"
|
||||
gdColumns.gt-sm="1fr 1fr 1fr"
|
||||
gdGap="24px"
|
||||
>
|
||||
<dsh-details-item *ngIf="bankDetails?.name" [title]="d('name')">
|
||||
{{ bankDetails?.name }}
|
||||
</dsh-details-item>
|
||||
<dsh-details-item *ngIf="bankDetails?.bic" [title]="d('bic')">
|
||||
{{ bankDetails?.bic }}
|
||||
</dsh-details-item>
|
||||
<dsh-details-item *ngIf="bankDetails?.abartn" [title]="d('abartn')">
|
||||
{{ bankDetails?.abartn }}
|
||||
</dsh-details-item>
|
||||
<dsh-details-item
|
||||
*ngIf="bankDetails?.address"
|
||||
[title]="d('address')"
|
||||
gdColumn.gt-sm="1/-1"
|
||||
>
|
||||
{{ bankDetails?.address }}
|
||||
</dsh-details-item>
|
||||
<dsh-details-item
|
||||
*ngIf="bankDetails?.countryCode"
|
||||
[title]="d('countryCode')"
|
||||
gdColumn.gt-sm="1/-1"
|
||||
>
|
||||
{{ bankDetails?.countryCode }}
|
||||
</dsh-details-item>
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
<div
|
||||
*ngIf="internationalBankAccount?.correspondentBankAccount"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="24px"
|
||||
>
|
||||
<mat-divider></mat-divider>
|
||||
<div class="mat-h2">{{ t('correspondentBankAccount') }}</div>
|
||||
<dsh-international-bank-account
|
||||
[internationalBankAccount]="internationalBankAccount?.correspondentBankAccount"
|
||||
></dsh-international-bank-account>
|
||||
</div>
|
||||
</div>
|
@ -1,11 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
||||
import { InternationalCorrespondentBankAccount } from '@vality/swag-payments';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-international-bank-account',
|
||||
templateUrl: 'international-bank-account.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class InternationalBankAccountComponent {
|
||||
@Input() internationalBankAccount: InternationalCorrespondentBankAccount;
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
<dsh-bank-account-details
|
||||
*ngIf="payoutToolDetails?.detailsType === 'PayoutToolDetailsBankAccount'"
|
||||
[bankAccount]="payoutToolDetails"
|
||||
></dsh-bank-account-details>
|
||||
<dsh-international-bank-account
|
||||
*ngIf="payoutToolDetails?.detailsType === 'PayoutToolDetailsInternationalBankAccount'"
|
||||
[internationalBankAccount]="payoutToolDetails"
|
||||
></dsh-international-bank-account>
|
||||
<dsh-wallet
|
||||
*ngIf="payoutToolDetails?.detailsType === 'PayoutToolDetailsWalletInfo'"
|
||||
[wallet]="payoutToolDetails"
|
||||
></dsh-wallet>
|
@ -1,11 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
||||
import { PayoutToolDetails } from '@vality/swag-payments';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-payout-tool-details',
|
||||
templateUrl: 'payout-tool-details.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class PayoutToolDetailsComponent {
|
||||
@Input() payoutToolDetails: PayoutToolDetails;
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { TranslocoModule } from '@ngneat/transloco';
|
||||
import { FlexLayoutModule } from 'ng-flex-layout';
|
||||
|
||||
import { LayoutModule } from '@dsh/components/layout';
|
||||
|
||||
import { ApiModelRefsModule } from '../../../pipes';
|
||||
import { BankAccountDetailsModule } from '../bank-account-details';
|
||||
|
||||
import { InternationalBankAccountComponent } from './international-bank-account';
|
||||
import { PayoutToolDetailsComponent } from './payout-tool-details.component';
|
||||
import { WalletComponent } from './wallet';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
FlexLayoutModule,
|
||||
TranslocoModule,
|
||||
CommonModule,
|
||||
LayoutModule,
|
||||
BankAccountDetailsModule,
|
||||
MatDividerModule,
|
||||
ApiModelRefsModule,
|
||||
RouterModule,
|
||||
],
|
||||
declarations: [PayoutToolDetailsComponent, InternationalBankAccountComponent, WalletComponent],
|
||||
exports: [PayoutToolDetailsComponent],
|
||||
})
|
||||
export class PayoutToolDetailsModule {}
|
@ -1 +0,0 @@
|
||||
export * from './wallet.component';
|
@ -1,15 +0,0 @@
|
||||
<div
|
||||
*transloco="
|
||||
let t;
|
||||
scope: 'components';
|
||||
read: 'components.apiModelDetails.payoutToolDetails.wallet'
|
||||
"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="24px"
|
||||
>
|
||||
<dsh-details-item [title]="t('walletName')">
|
||||
<dsh-link-label (click)="goToWalletDetails(wallet?.walletID)">{{
|
||||
wallet?.walletID | walletDetails
|
||||
}}</dsh-link-label>
|
||||
</dsh-details-item>
|
||||
</div>
|
@ -1,18 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
import { PayoutToolDetailsWalletInfo } from '@vality/swag-payments';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-wallet',
|
||||
templateUrl: 'wallet.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class WalletComponent {
|
||||
@Input() wallet: PayoutToolDetailsWalletInfo;
|
||||
|
||||
constructor(private router: Router) {}
|
||||
|
||||
goToWalletDetails(walletID: string): void {
|
||||
void this.router.navigate(['wallet-section', 'wallets', walletID]);
|
||||
}
|
||||
}
|
@ -1,2 +0,0 @@
|
||||
export * from './payout-tool.module';
|
||||
export * from './payout-tool.component';
|
@ -1,10 +0,0 @@
|
||||
<div
|
||||
*transloco="let t; scope: 'components'; read: 'components.apiModelDetails.payoutTool'"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="24px"
|
||||
>
|
||||
<dsh-details-item [title]="t('currency')">
|
||||
{{ payoutTool?.currency }}
|
||||
</dsh-details-item>
|
||||
<dsh-payout-tool-details [payoutToolDetails]="payoutTool?.details"></dsh-payout-tool-details>
|
||||
</div>
|
@ -1,11 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
||||
import { PayoutTool } from '@vality/swag-payments';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-payout-tool',
|
||||
templateUrl: 'payout-tool.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class PayoutToolComponent {
|
||||
@Input() payoutTool: PayoutTool;
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { TranslocoModule } from '@ngneat/transloco';
|
||||
import { FlexLayoutModule } from 'ng-flex-layout';
|
||||
|
||||
import { LayoutModule } from '@dsh/components/layout';
|
||||
|
||||
import { BankAccountDetailsModule } from '../bank-account-details';
|
||||
import { PayoutToolDetailsModule } from '../payout-tool-details';
|
||||
|
||||
import { PayoutToolComponent } from './payout-tool.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
FlexLayoutModule,
|
||||
TranslocoModule,
|
||||
CommonModule,
|
||||
LayoutModule,
|
||||
BankAccountDetailsModule,
|
||||
MatDividerModule,
|
||||
PayoutToolDetailsModule,
|
||||
],
|
||||
declarations: [PayoutToolComponent],
|
||||
exports: [PayoutToolComponent],
|
||||
})
|
||||
export class PayoutToolModule {}
|
@ -1,22 +0,0 @@
|
||||
<div
|
||||
*transloco="let t; scope: 'components'; read: 'components.internationalBankAccountForm'"
|
||||
[formGroup]="control"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="24px"
|
||||
>
|
||||
<div fxLayout="column" fxLayoutGap="16px">
|
||||
<dsh-payout-tool-form formControlName="payoutTool"></dsh-payout-tool-form>
|
||||
<dsh-currency-autocomplete-field
|
||||
formControlName="currency"
|
||||
></dsh-currency-autocomplete-field>
|
||||
</div>
|
||||
<mat-checkbox
|
||||
[checked]="control.controls.correspondentPayoutTool.enabled"
|
||||
(change)="toggleCorrespondentPayoutTool()"
|
||||
>{{ t('correspondentAccount') }}</mat-checkbox
|
||||
>
|
||||
<dsh-payout-tool-form
|
||||
*ngIf="control.controls.correspondentPayoutTool.enabled"
|
||||
formControlName="correspondentPayoutTool"
|
||||
></dsh-payout-tool-form>
|
||||
</div>
|
@ -1,40 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
||||
import { FormBuilder, FormGroup } from '@angular/forms';
|
||||
import { createControlProviders, FormGroupSuperclass } from '@vality/ng-core';
|
||||
|
||||
import { PayoutToolForm } from '../payout-tool-form/types/payout-tool-form';
|
||||
|
||||
export interface InternationalBankAccountForm {
|
||||
payoutTool: PayoutToolForm;
|
||||
currency: string;
|
||||
correspondentPayoutTool?: PayoutToolForm;
|
||||
}
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-international-bank-account-form',
|
||||
templateUrl: 'international-bank-account-form.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
providers: createControlProviders(() => InternationalBankAccountFormComponent),
|
||||
})
|
||||
export class InternationalBankAccountFormComponent extends FormGroupSuperclass<
|
||||
Partial<InternationalBankAccountForm>
|
||||
> {
|
||||
control = this.fb.group({
|
||||
payoutTool: null,
|
||||
currency: null,
|
||||
correspondentPayoutTool: { value: null, disabled: true },
|
||||
}) as FormGroup;
|
||||
|
||||
constructor(private fb: FormBuilder) {
|
||||
super();
|
||||
}
|
||||
|
||||
toggleCorrespondentPayoutTool(): void {
|
||||
const { correspondentPayoutTool } = this.control.controls;
|
||||
if (correspondentPayoutTool.disabled) {
|
||||
correspondentPayoutTool.enable();
|
||||
} else {
|
||||
correspondentPayoutTool.disable();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
<form
|
||||
*transloco="let t; scope: 'components'; read: 'components.payoutToolForm'"
|
||||
[formGroup]="control"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="16px"
|
||||
>
|
||||
<mat-form-field>
|
||||
<mat-label>{{ t('accountNumber') }}</mat-label>
|
||||
<input aria-label="accountNumber" formControlName="number" matInput />
|
||||
</mat-form-field>
|
||||
|
||||
<div class="dsh-body-1">{{ t('description') }}</div>
|
||||
|
||||
<mat-form-field>
|
||||
<mat-label>{{ t('iban') }}</mat-label>
|
||||
<input aria-label="iban" formControlName="iban" matInput />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field>
|
||||
<mat-label>{{ t('bic') }}</mat-label>
|
||||
<input aria-label="bic" formControlName="bic" matInput />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field>
|
||||
<mat-label>{{ t('abaRtn') }}</mat-label>
|
||||
<input aria-label="abaRtn" formControlName="abaRtn" matInput />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field>
|
||||
<mat-label>{{ t('bankName') }}</mat-label>
|
||||
<input aria-label="bankName" formControlName="name" matInput />
|
||||
</mat-form-field>
|
||||
|
||||
<dsh-country-autocomplete-field
|
||||
[label]="t('bankCountry')"
|
||||
formControlName="country"
|
||||
required
|
||||
></dsh-country-autocomplete-field>
|
||||
|
||||
<mat-form-field>
|
||||
<mat-label>{{ t('bankAddress') }}</mat-label>
|
||||
<input aria-label="bankAddress" formControlName="address" matInput />
|
||||
</mat-form-field>
|
||||
</form>
|
@ -1,31 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
||||
import { Validators, FormBuilder } from '@angular/forms';
|
||||
import { createControlProviders, FormGroupSuperclass } from '@vality/ng-core';
|
||||
|
||||
import { PayoutToolForm } from './types/payout-tool-form';
|
||||
import { payoutToolFormValidator } from './utils/payout-tool-form-validator';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-payout-tool-form',
|
||||
templateUrl: 'payout-tool-form.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
providers: createControlProviders(() => PayoutToolFormComponent),
|
||||
})
|
||||
export class PayoutToolFormComponent extends FormGroupSuperclass<Partial<PayoutToolForm>> {
|
||||
control = this.fb.group(
|
||||
{
|
||||
number: ['', [Validators.pattern(/^[0-9A-Z]{8,40}$/)]],
|
||||
iban: ['', [Validators.pattern(/^[A-Z0-9]{14,35}$/)]],
|
||||
bic: ['', [Validators.pattern(/^([A-Z0-9]{8}|[A-Z0-9]{11})$/)]],
|
||||
abaRtn: ['', [Validators.pattern(/^[0-9]{9}$/)]],
|
||||
name: ['', [Validators.maxLength(100)]],
|
||||
country: [null],
|
||||
address: ['', [Validators.maxLength(1000)]],
|
||||
},
|
||||
{ validators: payoutToolFormValidator },
|
||||
);
|
||||
|
||||
constructor(private fb: FormBuilder) {
|
||||
super();
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
export interface PayoutToolForm {
|
||||
number: string;
|
||||
iban: string;
|
||||
abaRtn: string;
|
||||
address: string;
|
||||
bic: string;
|
||||
name: string;
|
||||
country: string;
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
import { ValidatorFn } from '@angular/forms';
|
||||
import { FormGroupByValue } from '@vality/ng-core';
|
||||
import isEmpty from 'lodash-es/isEmpty';
|
||||
|
||||
import { PayoutToolForm } from '../types/payout-tool-form';
|
||||
|
||||
// bic | iban | abaRtn | country & address & name should be provided;
|
||||
export const payoutToolFormValidator: ValidatorFn = (
|
||||
form: FormGroupByValue<PayoutToolForm>,
|
||||
): { error: boolean } | null => {
|
||||
const { bic, iban, abaRtn, country, address, name } = form.controls;
|
||||
|
||||
const isValidNumbers = [
|
||||
!isEmpty(bic.value) && bic.valid,
|
||||
!isEmpty(iban.value) && iban.valid,
|
||||
!isEmpty(abaRtn.value) && abaRtn.valid,
|
||||
].some(Boolean);
|
||||
|
||||
const isValidGeo = [
|
||||
!isEmpty(country.value) && country.valid,
|
||||
!isEmpty(address.value) && address.valid,
|
||||
!isEmpty(name.value) && name.valid,
|
||||
].every(Boolean);
|
||||
|
||||
return isValidNumbers || isValidGeo ? null : { error: true };
|
||||
};
|
@ -28,20 +28,4 @@
|
||||
[label]="t('paymentInstitution')"
|
||||
formControlName="paymentInstitution"
|
||||
></dsh-payment-institution-field>
|
||||
|
||||
<mat-divider></mat-divider>
|
||||
|
||||
<h2 class="dsh-title">{{ t('payoutToolTitle') }}</h2>
|
||||
|
||||
<dsh-created-existing-switch [form]="control.controls.bankAccount" formGroupName="bankAccount">
|
||||
<dsh-international-bank-account-form
|
||||
*dshCreatedCase
|
||||
formControlName="created"
|
||||
></dsh-international-bank-account-form>
|
||||
<dsh-existing-bank-account
|
||||
*dshExistingCase
|
||||
bankAccountType="PayoutToolDetailsInternationalBankAccount"
|
||||
formControlName="existing"
|
||||
></dsh-existing-bank-account>
|
||||
</dsh-created-existing-switch>
|
||||
</form>
|
||||
|
@ -18,7 +18,6 @@ export class ShopFormComponent extends FormGroupSuperclass<
|
||||
shopDetails: null,
|
||||
orgDetails: createTypeUnionDefaultForm(),
|
||||
paymentInstitution: null,
|
||||
bankAccount: createTypeUnionDefaultForm(),
|
||||
}) as FormGroup;
|
||||
|
||||
constructor(private fb: FormBuilder) {
|
||||
|
@ -1,161 +0,0 @@
|
||||
import { Component, Input } from '@angular/core';
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { FormGroup } from '@angular/forms';
|
||||
import { MatDialogModule } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Router } from '@angular/router';
|
||||
import { TranslocoService } from '@ngneat/transloco';
|
||||
import { Claim } from '@vality/swag-claim-management';
|
||||
import { FlexLayoutModule } from 'ng-flex-layout';
|
||||
import { of } from 'rxjs';
|
||||
import { switchMap } from 'rxjs/operators';
|
||||
import { deepEqual, instance, mock, verify, when } from 'ts-mockito';
|
||||
|
||||
import { getTranslocoModule } from '@dsh/app/shared/tests/get-transloco-module';
|
||||
import { ButtonModule } from '@dsh/components/buttons';
|
||||
|
||||
import { CreateInternationalShopEntityComponent } from './create-international-shop-entity.component';
|
||||
import { CreateInternationalShopEntityService } from './services/create-international-shop-entity/create-international-shop-entity.service';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-shop-form',
|
||||
template: '',
|
||||
})
|
||||
class MockShopFormComponent {
|
||||
@Input() form: FormGroup;
|
||||
}
|
||||
|
||||
describe('CreateInternationalShopEntityComponent', () => {
|
||||
let fixture: ComponentFixture<CreateInternationalShopEntityComponent>;
|
||||
let component: CreateInternationalShopEntityComponent;
|
||||
let mockCreateInternationalShopEntityService: CreateInternationalShopEntityService;
|
||||
let mockTranslocoService: TranslocoService;
|
||||
let mockMatSnackBar: MatSnackBar;
|
||||
let mockRouter: Router;
|
||||
|
||||
beforeEach(() => {
|
||||
mockCreateInternationalShopEntityService = mock(CreateInternationalShopEntityService);
|
||||
mockTranslocoService = mock(TranslocoService);
|
||||
mockMatSnackBar = mock(MatSnackBar);
|
||||
mockRouter = mock(Router);
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
imports: [getTranslocoModule(), MatDialogModule, ButtonModule, FlexLayoutModule],
|
||||
declarations: [CreateInternationalShopEntityComponent, MockShopFormComponent],
|
||||
providers: [
|
||||
{
|
||||
provide: CreateInternationalShopEntityService,
|
||||
useFactory: () => instance(mockCreateInternationalShopEntityService),
|
||||
},
|
||||
{
|
||||
provide: mockTranslocoService,
|
||||
useFactory: () => instance(TranslocoService),
|
||||
},
|
||||
{
|
||||
provide: MatSnackBar,
|
||||
useFactory: () => instance(mockMatSnackBar),
|
||||
},
|
||||
{
|
||||
provide: Router,
|
||||
useFactory: () => instance(mockRouter),
|
||||
},
|
||||
],
|
||||
}).compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(CreateInternationalShopEntityComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
|
||||
describe('createShop', () => {
|
||||
const claim: Claim = {
|
||||
id: 100500,
|
||||
status: 'active',
|
||||
changeset: [],
|
||||
revision: 5,
|
||||
createdAt: new Date(),
|
||||
};
|
||||
|
||||
it('should call create shop with form value', () => {
|
||||
when(
|
||||
mockCreateInternationalShopEntityService.createShop(
|
||||
deepEqual(component.form.value),
|
||||
),
|
||||
).thenReturn(of(claim));
|
||||
|
||||
component.createShop();
|
||||
|
||||
verify(
|
||||
mockCreateInternationalShopEntityService.createShop(
|
||||
deepEqual(component.form.value),
|
||||
),
|
||||
).once();
|
||||
expect().nothing();
|
||||
});
|
||||
|
||||
it('should emit send on success', () => {
|
||||
const spyOnSend = spyOn(component.send, 'emit').and.callThrough();
|
||||
|
||||
when(
|
||||
mockCreateInternationalShopEntityService.createShop(
|
||||
deepEqual(component.form.value),
|
||||
),
|
||||
).thenReturn(of(claim));
|
||||
|
||||
component.createShop();
|
||||
|
||||
expect(spyOnSend).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('should navigate to claim with claim id', () => {
|
||||
when(
|
||||
mockCreateInternationalShopEntityService.createShop(
|
||||
deepEqual(component.form.value),
|
||||
),
|
||||
).thenReturn(of(claim));
|
||||
when(
|
||||
mockRouter.navigate(deepEqual(['claim-section', 'claims', claim.id])),
|
||||
).thenReturn();
|
||||
|
||||
component.createShop();
|
||||
|
||||
verify(mockRouter.navigate(deepEqual(['claim-section', 'claims', claim.id]))).once();
|
||||
expect().nothing();
|
||||
});
|
||||
|
||||
it('should show error snack bar if error happened', () => {
|
||||
const error = new Error('Test error');
|
||||
when(mockCreateInternationalShopEntityService.createShop).thenReturn(() =>
|
||||
of(claim).pipe(
|
||||
switchMap(() => {
|
||||
throw error;
|
||||
}),
|
||||
),
|
||||
);
|
||||
when(mockMatSnackBar.open('Что-то пошло не так', 'OK')).thenReturn();
|
||||
|
||||
component.createShop();
|
||||
|
||||
verify(mockMatSnackBar.open('Что-то пошло не так', 'OK')).once();
|
||||
expect().nothing();
|
||||
});
|
||||
});
|
||||
|
||||
describe('cancelCreation', () => {
|
||||
it('should emit cancel', () => {
|
||||
const spyOnCancel = spyOn(component.cancel, 'emit').and.callThrough();
|
||||
|
||||
component.cancelCreation();
|
||||
|
||||
expect(spyOnCancel).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
});
|
@ -1,6 +1,5 @@
|
||||
import { ChangeDetectionStrategy, Component, EventEmitter, Output } from '@angular/core';
|
||||
import { FormControl } from '@angular/forms';
|
||||
import { Router } from '@angular/router';
|
||||
import { TranslocoService } from '@ngneat/transloco';
|
||||
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
|
||||
import { progressTo, NotifyLogService } from '@vality/ng-core';
|
||||
@ -27,7 +26,6 @@ export class CreateInternationalShopEntityComponent {
|
||||
private createShopInternationalLegalEntityService: CreateInternationalShopEntityService,
|
||||
private transloco: TranslocoService,
|
||||
private log: NotifyLogService,
|
||||
private router: Router,
|
||||
) {}
|
||||
|
||||
createShop(): void {
|
||||
|
@ -15,10 +15,8 @@ import { CategoryAutocompleteFieldModule } from '@dsh/app/shared/components/inpu
|
||||
import { CountryAutocompleteFieldModule } from '@dsh/app/shared/components/inputs/country-autocomplete-field';
|
||||
import { PaymentInstitutionFieldModule } from '@dsh/app/shared/components/inputs/payment-institution-field';
|
||||
import { ShopFieldModule } from '@dsh/app/shared/components/inputs/shop-field';
|
||||
import { InternationalBankAccountFormComponent } from '@dsh/app/shared/components/shop-creation/create-international-shop-entity/components/international-bank-account-form/international-bank-account-form.component';
|
||||
import { NewContractorFormComponent } from '@dsh/app/shared/components/shop-creation/create-international-shop-entity/components/new-contractor-form/new-contractor-form.component';
|
||||
import { CreatedExistingSwitchModule } from '@dsh/app/shared/components/shop-creation/created-existing-switch/created-existing-switch.module';
|
||||
import { ExistingBankAccountModule } from '@dsh/app/shared/components/shop-creation/existing-bank-account/existing-bank-account.module';
|
||||
import { ExistingContractFormModule } from '@dsh/app/shared/components/shop-creation/existing-contract-form/existing-contract-form.module';
|
||||
import { ShopDetailsFormModule } from '@dsh/app/shared/components/shop-creation/shop-details-form';
|
||||
import { CountryCodesModule } from '@dsh/app/shared/services';
|
||||
@ -26,7 +24,6 @@ import { ButtonModule } from '@dsh/components/buttons';
|
||||
|
||||
import { CurrencyAutocompleteFieldModule } from '../../inputs/currency-autocomplete-field';
|
||||
|
||||
import { PayoutToolFormComponent } from './components/payout-tool-form/payout-tool-form.component';
|
||||
import { ShopFormComponent } from './components/shop-form/shop-form.component';
|
||||
import { CreateInternationalShopEntityComponent } from './create-international-shop-entity.component';
|
||||
import { CreateInternationalShopEntityService } from './services/create-international-shop-entity/create-international-shop-entity.service';
|
||||
@ -54,15 +51,12 @@ import { CreateInternationalShopEntityService } from './services/create-internat
|
||||
ContractorDetailsModule,
|
||||
ErrorMessageModule,
|
||||
ExistingContractFormModule,
|
||||
ExistingBankAccountModule,
|
||||
CurrencyAutocompleteFieldModule,
|
||||
],
|
||||
declarations: [
|
||||
CreateInternationalShopEntityComponent,
|
||||
PayoutToolFormComponent,
|
||||
ShopFormComponent,
|
||||
NewContractorFormComponent,
|
||||
InternationalBankAccountFormComponent,
|
||||
],
|
||||
exports: [CreateInternationalShopEntityComponent],
|
||||
providers: [CreateInternationalShopEntityService],
|
||||
|
@ -10,17 +10,11 @@ import {
|
||||
createInternationalLegalEntityModification,
|
||||
createShopCreationModification,
|
||||
makeShopLocation,
|
||||
createInternationalContractPayoutToolModification,
|
||||
} from '@dsh/app/api/claim-management';
|
||||
import { IdGeneratorService } from '@dsh/app/shared/services/id-generator';
|
||||
|
||||
import { InternationalShopEntityFormValue } from '../../types/international-shop-entity-form-value';
|
||||
|
||||
import {
|
||||
payoutToolDetailsInternationalBankAccountToInternationalBankAccount,
|
||||
payoutToolFormToInternationalBankAccount,
|
||||
} from './utils';
|
||||
|
||||
@Injectable()
|
||||
export class CreateInternationalShopEntityService {
|
||||
constructor(
|
||||
@ -47,7 +41,6 @@ export class CreateInternationalShopEntityService {
|
||||
shopDetails,
|
||||
orgDetails: { created: newContractor, existing: contract },
|
||||
paymentInstitution,
|
||||
bankAccount: { created: newBankAccount, existing: payoutTool },
|
||||
}: InternationalShopEntityFormValue): Modification[] {
|
||||
const contractorID = this.idGenerator.uuid();
|
||||
const contractID = this.idGenerator.uuid();
|
||||
@ -80,30 +73,6 @@ export class CreateInternationalShopEntityService {
|
||||
contractorID,
|
||||
paymentInstitution: { id: paymentInstitution?.id ?? 1 },
|
||||
}),
|
||||
createInternationalContractPayoutToolModification(
|
||||
contractID,
|
||||
payoutToolID,
|
||||
newBankAccount ? newBankAccount.currency : payoutTool.currency,
|
||||
newBankAccount
|
||||
? {
|
||||
...payoutToolFormToInternationalBankAccount(newBankAccount.payoutTool),
|
||||
correspondentAccount: newBankAccount.correspondentPayoutTool
|
||||
? payoutToolFormToInternationalBankAccount(
|
||||
newBankAccount.correspondentPayoutTool,
|
||||
)
|
||||
: null,
|
||||
}
|
||||
: {
|
||||
...payoutToolDetailsInternationalBankAccountToInternationalBankAccount(
|
||||
payoutTool.details,
|
||||
),
|
||||
correspondentAccount: payoutTool.details.correspondentBankAccount
|
||||
? payoutToolDetailsInternationalBankAccountToInternationalBankAccount(
|
||||
payoutTool.details.correspondentBankAccount,
|
||||
)
|
||||
: null,
|
||||
},
|
||||
),
|
||||
createShopCreationModification(shopID, {
|
||||
category: {
|
||||
categoryID: shopDetails.category?.categoryID ?? 1,
|
||||
|
@ -1,2 +0,0 @@
|
||||
export * from './payout-tool-details-international-bank-account-to-international-bank-account';
|
||||
export * from './payout-tool-form-to-international-bank-account';
|
@ -1,19 +0,0 @@
|
||||
import { InternationalBankAccount } from '@vality/swag-claim-management';
|
||||
import { PayoutToolDetailsInternationalBankAccount } from '@vality/swag-payments';
|
||||
|
||||
export function payoutToolDetailsInternationalBankAccountToInternationalBankAccount(
|
||||
form: Omit<PayoutToolDetailsInternationalBankAccount, 'detailsType'>,
|
||||
): Required<Pick<InternationalBankAccount, 'iban' | 'number' | 'bank'>> {
|
||||
const { bankDetails } = form;
|
||||
return {
|
||||
iban: form.iban,
|
||||
number: form.number,
|
||||
bank: {
|
||||
abaRtn: bankDetails?.abartn,
|
||||
address: bankDetails?.address,
|
||||
bic: bankDetails?.bic,
|
||||
name: bankDetails?.name,
|
||||
country: bankDetails?.countryCode,
|
||||
},
|
||||
};
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
import { InternationalBankAccount } from '@vality/swag-claim-management';
|
||||
|
||||
import { PayoutToolForm } from '../../../components/payout-tool-form/types/payout-tool-form';
|
||||
|
||||
export function payoutToolFormToInternationalBankAccount(
|
||||
form: PayoutToolForm,
|
||||
): Required<Pick<InternationalBankAccount, 'iban' | 'number' | 'bank'>> {
|
||||
return {
|
||||
iban: form.iban,
|
||||
number: form.number,
|
||||
bank: {
|
||||
abaRtn: form.abaRtn,
|
||||
address: form.address,
|
||||
bic: form.bic,
|
||||
name: form.name,
|
||||
country: form.country,
|
||||
},
|
||||
};
|
||||
}
|
@ -1,19 +1,13 @@
|
||||
import { PaymentInstitution } from '@vality/swag-payments';
|
||||
|
||||
import { TypeUnion } from '@dsh/app/shared/components/shop-creation/created-existing-switch/created-existing-switch.component';
|
||||
import { ExistingBankAccountForm } from '@dsh/app/shared/components/shop-creation/existing-bank-account/existing-bank-account.component';
|
||||
import { ShopDetailsForm } from '@dsh/app/shared/components/shop-creation/shop-details-form/shop-details-form.component';
|
||||
|
||||
import { ExistingContractForm } from '../../existing-contract-form/existing-contract-form.component';
|
||||
import { InternationalBankAccountForm } from '../components/international-bank-account-form/international-bank-account-form.component';
|
||||
import { NewContractorForm } from '../components/new-contractor-form/new-contractor-form.component';
|
||||
|
||||
export interface InternationalShopEntityFormValue {
|
||||
shopDetails: ShopDetailsForm;
|
||||
orgDetails: TypeUnion<NewContractorForm, ExistingContractForm<'InternationalLegalEntity'>>;
|
||||
paymentInstitution: PaymentInstitution;
|
||||
bankAccount: TypeUnion<
|
||||
InternationalBankAccountForm,
|
||||
ExistingBankAccountForm<'PayoutToolDetailsInternationalBankAccount'>
|
||||
>;
|
||||
}
|
||||
|
@ -1,78 +0,0 @@
|
||||
<div [formGroup]="control" fxLayout="column" fxLayoutGap="24px">
|
||||
<div
|
||||
*transloco="let p; scope: 'components'; read: 'components.newContractorForm'"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="16px"
|
||||
>
|
||||
<mat-form-field>
|
||||
<mat-label>{{ p('form.registeredName') }}</mat-label>
|
||||
<input
|
||||
autocomplete="off"
|
||||
formControlName="registeredName"
|
||||
matInput
|
||||
required
|
||||
type="text"
|
||||
/>
|
||||
</mat-form-field>
|
||||
<mat-form-field>
|
||||
<mat-label>{{ p('form.inn') }}</mat-label>
|
||||
<dsh-format-input
|
||||
format="individualOrLegalEntityInn"
|
||||
formControlName="inn"
|
||||
required
|
||||
></dsh-format-input>
|
||||
</mat-form-field>
|
||||
<mat-form-field>
|
||||
<mat-label>{{ p('form.registeredNumber') }}</mat-label>
|
||||
<dsh-format-input
|
||||
format="ogrn"
|
||||
formControlName="registeredNumber"
|
||||
required
|
||||
></dsh-format-input>
|
||||
</mat-form-field>
|
||||
<mat-form-field>
|
||||
<mat-label>{{ p('form.actualAddress') }}</mat-label>
|
||||
<input
|
||||
autocomplete="off"
|
||||
formControlName="actualAddress"
|
||||
matInput
|
||||
required
|
||||
type="text"
|
||||
/>
|
||||
</mat-form-field>
|
||||
<mat-form-field>
|
||||
<mat-label>{{ p('form.representativePosition') }}</mat-label>
|
||||
<input
|
||||
autocomplete="off"
|
||||
formControlName="representativePosition"
|
||||
matInput
|
||||
required
|
||||
type="text"
|
||||
/>
|
||||
</mat-form-field>
|
||||
<mat-form-field>
|
||||
<mat-label>{{ p('form.representativeFullName') }}</mat-label>
|
||||
<input
|
||||
autocomplete="off"
|
||||
formControlName="representativeFullName"
|
||||
matInput
|
||||
required
|
||||
type="text"
|
||||
/>
|
||||
</mat-form-field>
|
||||
<mat-form-field>
|
||||
<mat-label>{{ p('form.representativeDocument') }}</mat-label>
|
||||
<input
|
||||
autocomplete="off"
|
||||
formControlName="representativeDocument"
|
||||
matInput
|
||||
required
|
||||
type="text"
|
||||
/>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<mat-divider></mat-divider>
|
||||
|
||||
<dsh-russian-bank-account-form formControlName="bankAccount"></dsh-russian-bank-account-form>
|
||||
</div>
|
@ -1,40 +0,0 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { FormBuilder } from '@angular/forms';
|
||||
import { UntilDestroy } from '@ngneat/until-destroy';
|
||||
import { FormGroupSuperclass, createControlProviders } from '@vality/ng-core';
|
||||
|
||||
import { RussianBankAccountForm } from '../russian-bank-account-form/types/bank-account-form-data';
|
||||
|
||||
export interface NewContractorForm {
|
||||
registeredName: string;
|
||||
inn: string;
|
||||
registeredNumber: string;
|
||||
actualAddress: string;
|
||||
representativePosition: string;
|
||||
representativeFullName: string;
|
||||
representativeDocument: string;
|
||||
bankAccount: RussianBankAccountForm;
|
||||
}
|
||||
|
||||
@UntilDestroy()
|
||||
@Component({
|
||||
selector: 'dsh-new-contractor-form',
|
||||
templateUrl: 'new-contractor-form.component.html',
|
||||
providers: createControlProviders(() => NewContractorFormComponent),
|
||||
})
|
||||
export class NewContractorFormComponent extends FormGroupSuperclass<Partial<NewContractorForm>> {
|
||||
control = this.fb.group<NewContractorForm>({
|
||||
registeredName: null,
|
||||
inn: null,
|
||||
registeredNumber: null,
|
||||
actualAddress: null,
|
||||
representativePosition: null,
|
||||
representativeFullName: null,
|
||||
representativeDocument: null,
|
||||
bankAccount: null,
|
||||
});
|
||||
|
||||
constructor(private fb: FormBuilder) {
|
||||
super();
|
||||
}
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
<div
|
||||
*transloco="let p; scope: 'components'; read: 'components.orgDetailsForm'"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="24px"
|
||||
>
|
||||
<h2 class="dsh-title">{{ p('title') }}</h2>
|
||||
|
||||
<dsh-created-existing-switch [form]="control" [formGroup]="control">
|
||||
<dsh-new-contractor-form
|
||||
*dshCreatedCase
|
||||
formControlName="created"
|
||||
></dsh-new-contractor-form>
|
||||
<dsh-existing-contract-form
|
||||
*dshExistingCase
|
||||
entityType="RussianLegalEntity"
|
||||
formControlName="existing"
|
||||
></dsh-existing-contract-form>
|
||||
</dsh-created-existing-switch>
|
||||
</div>
|
@ -1,30 +0,0 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { UntilDestroy } from '@ngneat/until-destroy';
|
||||
import { createControlProviders, FormGroupSuperclass } from '@vality/ng-core';
|
||||
|
||||
import {
|
||||
createTypeUnionDefaultForm,
|
||||
TypeUnion,
|
||||
} from '@dsh/app/shared/components/shop-creation/created-existing-switch/created-existing-switch.component';
|
||||
|
||||
import { ExistingContractForm } from '../../../existing-contract-form/existing-contract-form.component';
|
||||
|
||||
import { NewContractorForm } from './../new-contractor-form/new-contractor-form.component';
|
||||
|
||||
export type OrgDetailsForm = TypeUnion<
|
||||
NewContractorForm,
|
||||
ExistingContractForm<'RussianLegalEntity'>
|
||||
>;
|
||||
|
||||
@UntilDestroy()
|
||||
@Component({
|
||||
selector: 'dsh-org-details-form',
|
||||
templateUrl: 'org-details-form.component.html',
|
||||
providers: createControlProviders(() => OrgDetailsFormComponent),
|
||||
})
|
||||
export class OrgDetailsFormComponent extends FormGroupSuperclass<Partial<OrgDetailsForm>> {
|
||||
control = createTypeUnionDefaultForm<
|
||||
NewContractorForm,
|
||||
ExistingContractForm<'RussianLegalEntity'>
|
||||
>();
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
<div
|
||||
*transloco="let p; scope: 'components'; read: 'components.russianBankAccountForm'"
|
||||
[formGroup]="control"
|
||||
fxLayout="column"
|
||||
fxLayoutGap="16px"
|
||||
>
|
||||
<div gdColumns="1fr" gdColumns.gt-sm="1fr 1fr" gdGap="24px">
|
||||
<mat-form-field gdColumn="1/-1">
|
||||
<mat-label>{{ p('name') }}</mat-label>
|
||||
<input aria-label="bankName" formControlName="bankName" matInput required />
|
||||
</mat-form-field>
|
||||
<mat-form-field>
|
||||
<mat-label>{{ p('bik') }}</mat-label>
|
||||
<dsh-format-input format="bik" formControlName="bankBik" required></dsh-format-input>
|
||||
</mat-form-field>
|
||||
<mat-form-field>
|
||||
<mat-label>{{ p('postAccount') }}</mat-label>
|
||||
<dsh-format-input
|
||||
format="bankPostAccount"
|
||||
formControlName="bankPostAccount"
|
||||
required
|
||||
></dsh-format-input>
|
||||
</mat-form-field>
|
||||
<mat-form-field gdColumn="1/-1">
|
||||
<mat-label>{{ p('account') }}</mat-label>
|
||||
<dsh-format-input
|
||||
format="bankAccount"
|
||||
formControlName="account"
|
||||
required
|
||||
></dsh-format-input>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
@ -1,26 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
||||
import { FormBuilder } from '@angular/forms';
|
||||
import { createControlProviders, FormGroupSuperclass } from '@vality/ng-core';
|
||||
|
||||
import { RussianBankAccountForm } from './types/bank-account-form-data';
|
||||
|
||||
@Component({
|
||||
selector: 'dsh-russian-bank-account-form',
|
||||
templateUrl: 'russian-bank-account-form.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
providers: createControlProviders(() => RussianBankAccountFormComponent),
|
||||
})
|
||||
export class RussianBankAccountFormComponent extends FormGroupSuperclass<
|
||||
Partial<RussianBankAccountForm>
|
||||
> {
|
||||
control = this.fb.group<RussianBankAccountForm>({
|
||||
account: null,
|
||||
bankName: null,
|
||||
bankPostAccount: null,
|
||||
bankBik: null,
|
||||
});
|
||||
|
||||
constructor(private fb: FormBuilder) {
|
||||
super();
|
||||
}
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
export interface RussianBankAccountForm {
|
||||
bankName: string;
|
||||
bankBik: string;
|
||||
bankPostAccount: string;
|
||||
account: string;
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
<div [formGroup]="control" fxLayout="column" fxLayoutGap="24px">
|
||||
<dsh-shop-details-form formControlName="shopDetails"></dsh-shop-details-form>
|
||||
<mat-divider></mat-divider>
|
||||
<dsh-payment-institution-field
|
||||
formControlName="paymentInstitution"
|
||||
></dsh-payment-institution-field>
|
||||
<mat-divider></mat-divider>
|
||||
<dsh-org-details-form formControlName="orgDetails"></dsh-org-details-form>
|
||||
<mat-divider></mat-divider>
|
||||
|
||||
<ng-container *transloco="let p; scope: 'components'; read: 'components.shopForm'">
|
||||
<div fxLayout="column" fxLayoutGap="16px">
|
||||
<h2 class="dsh-title">{{ p('title') }}</h2>
|
||||
<div class="dsh-body-1">{{ p('description') }}</div>
|
||||
</div>
|
||||
<dsh-created-existing-switch
|
||||
[form]="control.controls.bankAccount"
|
||||
formGroupName="bankAccount"
|
||||
>
|
||||
<div *dshCreatedCase fxLayout="column" fxLayoutGap="16px">
|
||||
<dsh-russian-bank-account-form
|
||||
formControlName="created"
|
||||
></dsh-russian-bank-account-form>
|
||||
<dsh-currency-autocomplete-field
|
||||
[formControl]="control.controls.currency"
|
||||
></dsh-currency-autocomplete-field>
|
||||
</div>
|
||||
<dsh-existing-bank-account
|
||||
*dshExistingCase
|
||||
bankAccountType="PayoutToolDetailsBankAccount"
|
||||
formControlName="existing"
|
||||
></dsh-existing-bank-account>
|
||||
</dsh-created-existing-switch>
|
||||
</ng-container>
|
||||
</div>
|
@ -1,28 +0,0 @@
|
||||
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
||||
import { FormGroup, FormBuilder } from '@angular/forms';
|
||||
import { UntilDestroy } from '@ngneat/until-destroy';
|
||||
import { createControlProviders, FormGroupSuperclass } from '@vality/ng-core';
|
||||
|
||||
import { createTypeUnionDefaultForm } from '../../../created-existing-switch/created-existing-switch.component';
|
||||
import { RussianShopForm } from '../../types/russian-shop-entity';
|
||||
|
||||
@UntilDestroy()
|
||||
@Component({
|
||||
selector: 'dsh-shop-form',
|
||||
templateUrl: 'shop-form.component.html',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
providers: createControlProviders(() => ShopFormComponent),
|
||||
})
|
||||
export class ShopFormComponent extends FormGroupSuperclass<Partial<RussianShopForm>> {
|
||||
control = this.fb.group({
|
||||
shopDetails: null,
|
||||
orgDetails: null,
|
||||
bankAccount: createTypeUnionDefaultForm(),
|
||||
paymentInstitution: null,
|
||||
currency: null,
|
||||
}) as FormGroup;
|
||||
|
||||
constructor(private fb: FormBuilder) {
|
||||
super();
|
||||
}
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
<dsh-base-dialog
|
||||
*transloco="let t; scope: 'components'; read: 'components.createRussianShopEntity'"
|
||||
[title]="t('title')"
|
||||
(cancel)="cancelCreation()"
|
||||
>
|
||||
<dsh-shop-form [formControl]="form"> </dsh-shop-form>
|
||||
<div dshBaseDialogActions fxLayout fxLayoutAlign="stretch" fxLayoutAlign.gt-sm="end">
|
||||
<button
|
||||
[disabled]="form.invalid"
|
||||
color="accent"
|
||||
dsh-button
|
||||
fxFlex
|
||||
fxFlex.gt-sm="none"
|
||||
(click)="createShop()"
|
||||
>
|
||||
{{ t('send') }}
|
||||
</button>
|
||||
</div>
|
||||
</dsh-base-dialog>
|
@ -1,3 +0,0 @@
|
||||
mat-dialog-actions {
|
||||
padding-bottom: 24px;
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
import { ChangeDetectionStrategy, Component, EventEmitter, Output } from '@angular/core';
|
||||
import { FormControl } from '@angular/forms';
|
||||
import { Router } from '@angular/router';
|
||||
import { TranslocoService } from '@ngneat/transloco';
|
||||
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
|
||||
import { NotifyLogService } from '@vality/ng-core';
|
||||
|
||||
import { CreateRussianShopEntityService } from './services/create-russian-shop-entity/create-russian-shop-entity.service';
|
||||
|
||||
@UntilDestroy()
|
||||
@Component({
|
||||
selector: 'dsh-create-russian-shop-entity',
|
||||
templateUrl: 'create-russian-shop-entity.component.html',
|
||||
styleUrls: ['create-russian-shop-entity.component.scss'],
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
providers: [CreateRussianShopEntityService],
|
||||
})
|
||||
export class CreateRussianShopEntityComponent {
|
||||
@Output() cancel = new EventEmitter<void>();
|
||||
@Output() send = new EventEmitter<void>();
|
||||
|
||||
form = new FormControl();
|
||||
|
||||
constructor(
|
||||
private createShopRussianLegalEntityService: CreateRussianShopEntityService,
|
||||
private transloco: TranslocoService,
|
||||
private log: NotifyLogService,
|
||||
private router: Router,
|
||||
) {}
|
||||
|
||||
cancelCreation(): void {
|
||||
this.cancel.emit();
|
||||
}
|
||||
|
||||
createShop(): void {
|
||||
this.createShopRussianLegalEntityService
|
||||
.createShop(this.form.value)
|
||||
.pipe(untilDestroyed(this))
|
||||
.subscribe({
|
||||
next: () => {
|
||||
this.send.emit();
|
||||
// TODO: Claims page disabled
|
||||
// void this.router.navigate(['claim-section', 'claims', id]);
|
||||
},
|
||||
error: (err) => {
|
||||
this.log.error(
|
||||
err,
|
||||
this.transloco.selectTranslate('shared.commonError', null, 'components'),
|
||||
);
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user