diff --git a/src/app/domains/consumer/constants/components/pos/pos.ts b/src/app/domains/consumer/constants/components/pos/pos.ts index 20e7585..db85e94 100644 --- a/src/app/domains/consumer/constants/components/pos/pos.ts +++ b/src/app/domains/consumer/constants/components/pos/pos.ts @@ -5,7 +5,7 @@ import { IPosInitialValues } from './pos.model'; export const columns: IColumn[] = [ // { field: 'id', header: 'شناسه', type: 'id' }, { field: 'name', header: 'عنوان' }, - { field: 'serial', header: 'شماره سریال' }, + { field: 'serial_number', header: 'شماره سریال' }, { field: 'pos_type', header: 'نوع دستگاه' }, { field: 'device', header: 'دستگاه', type: 'nested', nestedOption: { path: 'device.name' } }, { @@ -14,7 +14,7 @@ export const columns: IColumn[] = [ type: 'nested', nestedOption: { path: 'provider.name' }, }, - { field: 'status', header: 'وضعیت' }, + { field: 'account', header: 'کاربر', type: 'nested', nestedOption: { path: 'account.username' } }, { field: 'created_at', header: 'تاریخ ایجاد', diff --git a/src/app/domains/consumer/modules/accounts/models/io.d.ts b/src/app/domains/consumer/modules/accounts/models/io.d.ts index 06ff6de..a43d10e 100644 --- a/src/app/domains/consumer/modules/accounts/models/io.d.ts +++ b/src/app/domains/consumer/modules/accounts/models/io.d.ts @@ -3,6 +3,7 @@ export interface IAccountRawResponse { role: string; created_at: string; account: Account; + pos: PosComplex; } export interface IAccountResponse extends IAccountRawResponse {} @@ -18,3 +19,9 @@ interface Account { username: string; status: string; } + +interface PosComplex { + name: string; + branch_code: string; + business_activity: { name: string }; +} diff --git a/src/app/domains/consumer/modules/accounts/views/list.component.html b/src/app/domains/consumer/modules/accounts/views/list.component.html index e41a2a1..f7429d0 100644 --- a/src/app/domains/consumer/modules/accounts/views/list.component.html +++ b/src/app/domains/consumer/modules/accounts/views/list.component.html @@ -3,9 +3,7 @@ [columns]="columns" emptyPlaceholderTitle="حساب‌ کاربری‌ای یافت نشد" [items]="items()" - [showDetails]="true" [loading]="loading()" - (onDetails)="toSinglePage($event)" /> @if (selectedItemForEdit()) { diff --git a/src/app/domains/consumer/modules/accounts/views/list.component.ts b/src/app/domains/consumer/modules/accounts/views/list.component.ts index 62a5254..0dfd199 100644 --- a/src/app/domains/consumer/modules/accounts/views/list.component.ts +++ b/src/app/domains/consumer/modules/accounts/views/list.component.ts @@ -26,12 +26,12 @@ export class ConsumerAccountsComponent extends AbstractList { type: 'nested', nestedOption: { path: 'account.username' }, }, - { field: 'role', header: 'نقش' }, { - field: 'status', - header: 'وضعیت', - type: 'nested', - nestedOption: { path: 'account.status' }, + field: 'pos', + header: 'پایانه', + customDataModel(item) { + return `${item.pos.name} - ${item.pos.complex.name} - ${item.pos.complex.business_activity.name}`; + }, }, { field: 'created_at', diff --git a/src/app/domains/consumer/modules/accounts/views/single.component.html b/src/app/domains/consumer/modules/accounts/views/single.component.html index a023a5c..f08663e 100644 --- a/src/app/domains/consumer/modules/accounts/views/single.component.html +++ b/src/app/domains/consumer/modules/accounts/views/single.component.html @@ -3,11 +3,9 @@
- -
- + diff --git a/src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.ts b/src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.ts index fb7778a..17330be 100644 --- a/src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.ts +++ b/src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.ts @@ -20,7 +20,7 @@ export class ConsumerComplexFormComponent extends AbstractFormDialog< private readonly service = inject(ConsumerComplexesService); @Input({ required: true }) businessActivityId!: string; - @Input({ required: true }) complexId!: string; + @Input() complexId!: string; initForm = () => { return this.fb.group({ @@ -33,7 +33,7 @@ export class ConsumerComplexFormComponent extends AbstractFormDialog< form = this.initForm(); get preparedTitle() { - return `ویرایش شعبه ${this.initialValues?.name}`; + return `${this.editMode ? 'ویرایش' : 'ایجاد'} شعبه`; } override ngOnChanges(): void { @@ -42,6 +42,9 @@ export class ConsumerComplexFormComponent extends AbstractFormDialog< submitForm() { const formValue = this.form.value as IComplexRequest; - return this.service.update(this.businessActivityId, this.complexId, formValue); + if (this.editMode) { + return this.service.update(this.businessActivityId, this.complexId, formValue); + } + return this.service.create(this.businessActivityId, formValue); } } diff --git a/src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.html b/src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.html index 1b1cee9..91b1d51 100644 --- a/src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.html +++ b/src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.html @@ -1,11 +1,16 @@ diff --git a/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.html b/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.html index c4d25d4..9079cb9 100644 --- a/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.html +++ b/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.html @@ -8,6 +8,55 @@ >
+ + + + @if (!editMode) { + اطلاعات ورود + + + + + + رمز باید حداقل ۸ کاراکتر بوده و شامل حداقل یک حرف بزرگ، یک حرف کوچک، یک عدد و یک کاراکتر ویژه باشد. + + + + + + + } + + @if (form.controls.pos_type.value === "PSP") { + + + + } + diff --git a/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.ts b/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.ts index d882069..ad7e283 100644 --- a/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.ts +++ b/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.ts @@ -1,18 +1,35 @@ // import { CatalogRolesComponent } from '@/shared/catalog/roles'; -import { CONSUMER_COMPONENTS_CONST } from '@/domains/consumer/constants'; +import { MustMatch } from '@/core/validators'; import { AbstractFormDialog } from '@/shared/abstractClasses'; +import { EnumSelectComponent } from '@/shared/apiEnum/select.component'; +import { CatalogProviderSelectComponent } from '@/shared/catalog'; +import { CatalogDeviceSelectComponent } from '@/shared/catalog/devices'; import { InputComponent } from '@/shared/components'; import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { UikitFieldComponent } from '@/uikit'; import { Component, inject, Input } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; +import { ReactiveFormsModule, Validators } from '@angular/forms'; import { Dialog } from 'primeng/dialog'; +import { Divider } from 'primeng/divider'; +import { Password } from 'primeng/password'; import { IPosRequest, IPosResponse } from '../../models'; import { ConsumerPosesService } from '../../services/poses.service'; @Component({ selector: 'consumer-pos-form', templateUrl: './form.component.html', - imports: [ReactiveFormsModule, Dialog, InputComponent, FormFooterActionsComponent], + imports: [ + ReactiveFormsModule, + Dialog, + InputComponent, + FormFooterActionsComponent, + CatalogDeviceSelectComponent, + CatalogProviderSelectComponent, + EnumSelectComponent, + UikitFieldComponent, + Password, + Divider, + ], }) export class ConsumerPosFormComponent extends AbstractFormDialog { private readonly service = inject(ConsumerPosesService); @@ -21,14 +38,84 @@ export class ConsumerPosFormComponent extends AbstractFormDialog { + const form = this.fb.group({ + name: [this.initialValues?.name || '', [Validators.required]], + pos_type: [this.initialValues?.pos_type || '', [Validators.required]], + serial_number: [this.initialValues?.serial_number || ''], + device_id: [this.initialValues?.device?.id || ''], + provider_id: [this.initialValues?.provider?.id || ''], + username: [''], + password: [''], + confirmPassword: [''], + }); + + form.controls.pos_type.valueChanges.subscribe((value) => { + if (value === 'PSP') { + form.controls.serial_number.setValidators([Validators.required]); + form.controls.device_id.setValidators([Validators.required]); + form.controls.provider_id.setValidators([Validators.required]); + form.controls.serial_number.enable({ emitEvent: false }); + form.controls.device_id.enable({ emitEvent: false }); + form.controls.provider_id.enable({ emitEvent: false }); + } else { + form.controls.serial_number.clearValidators(); + form.controls.device_id.clearValidators(); + form.controls.provider_id.clearValidators(); + form.controls.serial_number.reset(''); + form.controls.device_id.reset(''); + form.controls.provider_id.reset(''); + form.controls.serial_number.disable({ emitEvent: false }); + form.controls.device_id.disable({ emitEvent: false }); + form.controls.provider_id.disable({ emitEvent: false }); + } + + form.controls.serial_number.updateValueAndValidity({ emitEvent: false }); + form.controls.device_id.updateValueAndValidity({ emitEvent: false }); + form.controls.provider_id.updateValueAndValidity({ emitEvent: false }); + }); + form.controls.pos_type.updateValueAndValidity({ emitEvent: true }); + + if (this.editMode) { + // @ts-ignore + form.removeControl('username'); + // @ts-ignore + form.removeControl('password'); + // @ts-ignore + form.removeControl('confirmPassword'); + form.removeValidators([MustMatch('password', 'confirmPassword')]); + } else { + form.addControl( + 'username', + this.fb.control('', { + nonNullable: true, + validators: [Validators.required], + }), + ); + form.addControl( + 'password', + this.fb.control('', { + nonNullable: true, + validators: [Validators.required], + }), + ); + form.addControl( + 'confirmPassword', + this.fb.control('', { + nonNullable: true, + validators: [Validators.required], + }), + ); + form.addValidators([MustMatch('password', 'confirmPassword')]); + } + + return form; + }; form = this.initForm(); get preparedTitle() { - return `ویرایش پایانه فروش ${this.initialValues?.name}`; + return `${this.editMode ? 'ویرایش' : 'ایجاد'} پایانه فروش`; } override ngOnChanges(): void { @@ -36,7 +123,11 @@ export class ConsumerPosFormComponent extends AbstractFormDialog diff --git a/src/app/domains/consumer/modules/businessActivities/models/io.d.ts b/src/app/domains/consumer/modules/businessActivities/models/io.d.ts index 2d12b53..b60d201 100644 --- a/src/app/domains/consumer/modules/businessActivities/models/io.d.ts +++ b/src/app/domains/consumer/modules/businessActivities/models/io.d.ts @@ -20,4 +20,5 @@ interface LicenseInfo { starts_at: string; expires_at: string; accounts_limit: number; + allocated_account_count: number; } diff --git a/src/app/domains/consumer/modules/businessActivities/models/poses_io.d.ts b/src/app/domains/consumer/modules/businessActivities/models/poses_io.d.ts index 17d9029..f44b807 100644 --- a/src/app/domains/consumer/modules/businessActivities/models/poses_io.d.ts +++ b/src/app/domains/consumer/modules/businessActivities/models/poses_io.d.ts @@ -3,7 +3,7 @@ import ISummary from '@/core/models/summary'; export interface IPosRawResponse { id: string; name: string; - serial: string; + serial_number: string; model?: string; status: string; pos_type: string; @@ -15,4 +15,10 @@ export interface IPosResponse extends IPosRawResponse {} export interface IPosRequest { name: string; + serial_number: string; + pos_type: string; + device_id?: string; + provider_id?: string; + username?: string; + password?: string; } diff --git a/src/app/domains/consumer/modules/businessActivities/services/complexes.service.ts b/src/app/domains/consumer/modules/businessActivities/services/complexes.service.ts index 4a36beb..53e98f8 100644 --- a/src/app/domains/consumer/modules/businessActivities/services/complexes.service.ts +++ b/src/app/domains/consumer/modules/businessActivities/services/complexes.service.ts @@ -20,6 +20,10 @@ export class ConsumerComplexesService { return this.http.get(this.apiRoutes.single(businessActivityId, complexId)); } + create(businessActivityId: string, data: IComplexRequest): Observable { + return this.http.post(this.apiRoutes.list(businessActivityId), data); + } + update( businessActivityId: string, complexId: string, diff --git a/src/app/domains/consumer/modules/businessActivities/services/poses.service.ts b/src/app/domains/consumer/modules/businessActivities/services/poses.service.ts index 5a5e24f..179bb17 100644 --- a/src/app/domains/consumer/modules/businessActivities/services/poses.service.ts +++ b/src/app/domains/consumer/modules/businessActivities/services/poses.service.ts @@ -29,6 +29,17 @@ export class ConsumerPosesService { ); } + create( + businessActivityId: string, + complexId: string, + data: IPosRequest, + ): Observable { + return this.http.post( + this.apiRoutes.list(businessActivityId, complexId), + data, + ); + } + update( businessActivityId: string, complexId: string, diff --git a/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.html b/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.html index 1b0b105..afa99fb 100644 --- a/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.html +++ b/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.html @@ -6,8 +6,8 @@
- + diff --git a/src/app/domains/consumer/modules/businessActivities/views/single.component.html b/src/app/domains/consumer/modules/businessActivities/views/single.component.html index acc7272..bd7dcd6 100644 --- a/src/app/domains/consumer/modules/businessActivities/views/single.component.html +++ b/src/app/domains/consumer/modules/businessActivities/views/single.component.html @@ -7,6 +7,12 @@
+ اطلاعات لایسنس +
+ + + +
diff --git a/src/app/domains/consumer/modules/businessActivities/views/single.component.ts b/src/app/domains/consumer/modules/businessActivities/views/single.component.ts index b854b71..67988e7 100644 --- a/src/app/domains/consumer/modules/businessActivities/views/single.component.ts +++ b/src/app/domains/consumer/modules/businessActivities/views/single.component.ts @@ -2,6 +2,7 @@ import { BreadcrumbService } from '@/core/services'; import { AppCardComponent, KeyValueComponent } from '@/shared/components'; import { Component, computed, effect, inject, signal } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; +import { Divider } from 'primeng/divider'; import { ConsumerComplexListComponent } from '../components/complexes/list.component'; import { ConsumerBusinessActivityFormComponent } from '../components/form.component'; import { BusinessActivityStore } from '../store/businessActivity.store'; @@ -14,6 +15,7 @@ import { BusinessActivityStore } from '../store/businessActivity.store'; KeyValueComponent, ConsumerBusinessActivityFormComponent, ConsumerComplexListComponent, + Divider, ], }) export class ConsumerBusinessActivityComponent { diff --git a/src/app/domains/consumer/modules/poses/components/list.component.ts b/src/app/domains/consumer/modules/poses/components/list.component.ts index 6b06009..a19d978 100644 --- a/src/app/domains/consumer/modules/poses/components/list.component.ts +++ b/src/app/domains/consumer/modules/poses/components/list.component.ts @@ -33,7 +33,7 @@ export class ConsumerPosListComponent extends AbstractList { override setColumns(): void { this.columns = [ ...this.header.filter((header) => - ['name', 'status', 'pos_type'].includes(header.field as string), + ['name', 'account', 'pos_type', 'status'].includes(header.field as string), ), { field: 'complex.business_activity', diff --git a/src/app/domains/consumer/modules/poses/models/io.d.ts b/src/app/domains/consumer/modules/poses/models/io.d.ts index 17d9029..50f079a 100644 --- a/src/app/domains/consumer/modules/poses/models/io.d.ts +++ b/src/app/domains/consumer/modules/poses/models/io.d.ts @@ -3,7 +3,7 @@ import ISummary from '@/core/models/summary'; export interface IPosRawResponse { id: string; name: string; - serial: string; + serial_number: string; model?: string; status: string; pos_type: string; diff --git a/src/app/domains/consumer/modules/poses/views/single.component.html b/src/app/domains/consumer/modules/poses/views/single.component.html index eaaad85..bc3d5f6 100644 --- a/src/app/domains/consumer/modules/poses/views/single.component.html +++ b/src/app/domains/consumer/modules/poses/views/single.component.html @@ -6,8 +6,8 @@
- + diff --git a/src/app/domains/partner/modules/consumers/components/poses/form.component.html b/src/app/domains/partner/modules/consumers/components/poses/form.component.html index f36b21d..9ee84ce 100644 --- a/src/app/domains/partner/modules/consumers/components/poses/form.component.html +++ b/src/app/domains/partner/modules/consumers/components/poses/form.component.html @@ -8,10 +8,39 @@ >
- + + @if (!editMode) { + + + + + + + + + } + @if (form.controls.pos_type.value === "PSP") { - + } diff --git a/src/app/domains/partner/modules/consumers/components/poses/form.component.ts b/src/app/domains/partner/modules/consumers/components/poses/form.component.ts index 5b06fe4..ad1ad08 100644 --- a/src/app/domains/partner/modules/consumers/components/poses/form.component.ts +++ b/src/app/domains/partner/modules/consumers/components/poses/form.component.ts @@ -1,13 +1,16 @@ // import { CatalogRolesComponent } from '@/shared/catalog/roles'; +import { MustMatch } from '@/core/validators'; import { AbstractFormDialog } from '@/shared/abstractClasses'; import { EnumSelectComponent } from '@/shared/apiEnum/select.component'; import { CatalogProviderSelectComponent } from '@/shared/catalog'; import { CatalogDeviceSelectComponent } from '@/shared/catalog/devices'; import { InputComponent } from '@/shared/components'; import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { UikitFieldComponent } from '@/uikit'; import { Component, inject, Input } from '@angular/core'; import { ReactiveFormsModule, Validators } from '@angular/forms'; import { Dialog } from 'primeng/dialog'; +import { Password } from 'primeng/password'; import { IPosRequest, IPosResponse } from '../../models'; import { PartnerPosesService } from '../../services/poses.service'; @@ -22,6 +25,8 @@ import { PartnerPosesService } from '../../services/poses.service'; CatalogDeviceSelectComponent, CatalogProviderSelectComponent, EnumSelectComponent, + UikitFieldComponent, + Password, ], }) export class ConsumerPosFormComponent extends AbstractFormDialog { @@ -35,44 +40,74 @@ export class ConsumerPosFormComponent extends AbstractFormDialog { const form = this.fb.group({ name: [this.initialValues?.name || '', [Validators.required]], - serial: [this.initialValues?.serial || '', [Validators.required]], - // model: [this.initialValues?.model || '', [Validators.required]], pos_type: [this.initialValues?.pos_type || '', [Validators.required]], + serial_number: [this.initialValues?.serial_number || ''], device_id: [this.initialValues?.device?.id || ''], provider_id: [this.initialValues?.provider?.id || ''], + username: [''], + password: [''], + confirmPassword: [''], }); + form.controls.pos_type.valueChanges.subscribe((value) => { if (value === 'PSP') { - form.addControl( - 'serial', - this.fb.control(this.initialValues?.serial ?? '', { - nonNullable: true, - validators: [Validators.required], - }), - ); - form.addControl( - 'device_id', - this.fb.control(this.initialValues?.device?.id ?? '', { - nonNullable: true, - validators: [Validators.required], - }), - ); - form.addControl( - 'provider_id', - this.fb.control(this.initialValues?.provider?.id ?? '', { - nonNullable: true, - validators: [Validators.required], - }), - ); + form.controls.serial_number.setValidators([Validators.required]); + form.controls.device_id.setValidators([Validators.required]); + form.controls.provider_id.setValidators([Validators.required]); + form.controls.serial_number.enable({ emitEvent: false }); + form.controls.device_id.enable({ emitEvent: false }); + form.controls.provider_id.enable({ emitEvent: false }); } else { - // @ts-ignore - form.removeControl('serial'); - // @ts-ignore - form.removeControl('device_id'); - // @ts-ignore - form.removeControl('provider_id'); + form.controls.serial_number.clearValidators(); + form.controls.device_id.clearValidators(); + form.controls.provider_id.clearValidators(); + form.controls.serial_number.reset(''); + form.controls.device_id.reset(''); + form.controls.provider_id.reset(''); + form.controls.serial_number.disable({ emitEvent: false }); + form.controls.device_id.disable({ emitEvent: false }); + form.controls.provider_id.disable({ emitEvent: false }); } + + form.controls.serial_number.updateValueAndValidity({ emitEvent: false }); + form.controls.device_id.updateValueAndValidity({ emitEvent: false }); + form.controls.provider_id.updateValueAndValidity({ emitEvent: false }); }); + form.controls.pos_type.updateValueAndValidity({ emitEvent: true }); + + if (this.editMode) { + // @ts-ignore + form.removeControl('username'); + // @ts-ignore + form.removeControl('password'); + // @ts-ignore + form.removeControl('confirmPassword'); + form.removeValidators([MustMatch('password', 'confirmPassword')]); + } else { + form.addControl( + 'username', + this.fb.control('', { + nonNullable: true, + validators: [Validators.required], + }), + ); + form.addControl( + 'password', + this.fb.control('', { + nonNullable: true, + validators: [Validators.required], + }), + ); + form.addControl( + 'confirmPassword', + this.fb.control('', { + nonNullable: true, + validators: [Validators.required], + }), + ); + form.addValidators([MustMatch('password', 'confirmPassword')]); + } + return form; }; @@ -87,10 +122,11 @@ export class ConsumerPosFormComponent extends AbstractFormDialog - + @if (form.controls.pos_type.value === "PSP") { diff --git a/src/app/domains/superAdmin/modules/consumers/components/poses/form.component.ts b/src/app/domains/superAdmin/modules/consumers/components/poses/form.component.ts index be7ccb0..de4ed4f 100644 --- a/src/app/domains/superAdmin/modules/consumers/components/poses/form.component.ts +++ b/src/app/domains/superAdmin/modules/consumers/components/poses/form.component.ts @@ -35,7 +35,7 @@ export class ConsumerPosFormComponent extends AbstractFormDialog { const form = this.fb.group({ name: [this.initialValues?.name || '', [Validators.required]], - serial: [this.initialValues?.serial || '', [Validators.required]], + serial_number: [this.initialValues?.serial_number || '', [Validators.required]], // model: [this.initialValues?.model || '', [Validators.required]], pos_type: [this.initialValues?.pos_type || '', [Validators.required]], device_id: [this.initialValues?.device?.id || ''], diff --git a/src/app/domains/superAdmin/modules/consumers/models/poses_io.d.ts b/src/app/domains/superAdmin/modules/consumers/models/poses_io.d.ts index 1c76cae..15cc427 100644 --- a/src/app/domains/superAdmin/modules/consumers/models/poses_io.d.ts +++ b/src/app/domains/superAdmin/modules/consumers/models/poses_io.d.ts @@ -3,7 +3,7 @@ import ISummary from '@/core/models/summary'; export interface IPosRawResponse { id: string; name: string; - serial: string; + serial_number: string; model?: string; status: string; pos_type: string; @@ -15,7 +15,7 @@ export interface IPosResponse extends IPosRawResponse {} export interface IPosRequest { name: string; - serial: string; + serial_number: string; model?: string; status: string; pos_type: string;