feat: add stock keeping units list component and related services

feat: implement checkbox component with label and hint support

feat: create sale invoice full response model for invoice details

feat: add single view component for displaying sale invoice details

feat: define various list configurations for account, business activity, and consumer management

feat: establish list configurations for managing devices, goods, and licenses

feat: create list configurations for managing partners and their accounts

feat: implement user management list configuration
This commit is contained in:
2026-05-12 19:58:53 +03:30
parent fecdf4a06b
commit 561aca32d3
104 changed files with 1611 additions and 678 deletions
@@ -5,6 +5,7 @@ import {
IChangePasswordSubmitPayload,
} from '@/shared/components';
import { PageDataListComponent } from '@/shared/components/pageDataList/page-data-list.component';
import { partnerAccountListConfig } from '@/shared/constants/list-configs';
import { Component, inject, signal } from '@angular/core';
import { Router } from '@angular/router';
import { finalize } from 'rxjs';
@@ -23,27 +24,7 @@ export class PartnerAccountsComponent extends AbstractList<IAccountResponse> {
passwordSubmitLoading = signal(false);
override setColumns(): void {
this.columns = [
// { field: 'id', header: 'شناسه', type: 'id' },
{
field: 'username',
header: 'نام کاربری',
type: 'nested',
nestedOption: { path: 'account.username' },
},
{ field: 'role', header: 'نقش' },
{
field: 'status',
header: 'وضعیت',
type: 'nested',
nestedOption: { path: 'account.status' },
},
{
field: 'created_at',
header: 'تاریخ ایجاد',
type: 'date',
},
];
this.columns = partnerAccountListConfig.columns;
}
override getDataRequest() {
@@ -4,6 +4,7 @@ import {
IColumn,
PageDataListComponent,
} from '@/shared/components/pageDataList/page-data-list.component';
import { partnerConsumerAccountListConfig } from '@/shared/constants/list-configs';
import { Component, inject, Input } from '@angular/core';
import { IConsumerAccountResponse } from '../../models';
import { PartnerConsumerAccountsService } from '../../services/accounts.service';
@@ -17,37 +18,7 @@ import { ConsumerAccountFormComponent } from './form.component';
export class ConsumerAccountListComponent extends AbstractList<IConsumerAccountResponse> {
@Input({ required: true }) consumerId!: string;
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = [
{
field: 'account',
header: 'نام کاربری',
type: 'nested',
nestedOption: { path: 'account.username' },
},
{ field: 'role', header: 'نوع حساب', type: 'nested', nestedOption: { path: 'role.translate' } },
{
field: 'pos',
header: 'پایانه‌',
customDataModel(item: IConsumerAccountResponse) {
if (item.pos) {
return `${item.pos.name} (${item.pos.complex.name} - ${item.pos.complex.business_activity.name})`;
}
return '-';
},
},
{
field: 'status',
header: 'وضعیت',
type: 'nested',
nestedOption: { path: 'account.status.translate' },
variant: 'tag',
},
// {
// field: 'created_at',
// header: 'تاریخ ایجاد',
// type: 'date',
// },
];
@Input() header: IColumn[] = partnerConsumerAccountListConfig.columns;
private readonly service = inject(PartnerConsumerAccountsService);
override setColumns(): void {
@@ -4,6 +4,7 @@ import {
IColumn,
PageDataListComponent,
} from '@/shared/components/pageDataList/page-data-list.component';
import { businessActivityListConfig } from '@/shared/constants/list-configs';
import { Component, inject, Input, signal } from '@angular/core';
import { Router } from '@angular/router';
import { partnerConsumerBusinessActivitiesNamedRoutes } from '../../constants/routes/businessActivities';
@@ -24,28 +25,7 @@ import { ConsumerBusinessActivitiesFormDialogComponent } from './form-dialog.com
export class ConsumerBusinessActivitiesComponent extends AbstractList<IBusinessActivityResponse> {
@Input({ required: true }) consumerId!: string;
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = [
{ field: 'name', header: 'عنوان' },
{ field: 'guild', header: 'صنف', type: 'nested', nestedOption: { path: 'guild.name' } },
{ field: 'economic_code', header: 'کد اقتصادی' },
{
field: 'license_info',
header: 'محدودیت کاربر',
customDataModel(item) {
const licenseInfo = (item as IBusinessActivityResponse).license_info;
if (!licenseInfo) {
return 'بدون مجوز';
}
return `${licenseInfo.accounts_limit} کاربر`;
},
},
{
field: 'license_info',
header: 'انقضا مجوز',
type: 'nested',
nestedOption: { path: 'license_info.expires_at', type: 'date' },
},
];
@Input() header: IColumn[] = businessActivityListConfig.columns;
private readonly service = inject(PartnerConsumerBusinessActivitiesService);
private readonly router = inject(Router);
@@ -4,6 +4,7 @@ import {
IColumn,
PageDataListComponent,
} from '@/shared/components/pageDataList/page-data-list.component';
import { complexListConfig } from '@/shared/constants/list-configs';
import { Component, inject, Input, signal } from '@angular/core';
import { Router } from '@angular/router';
import { partnerConsumerComplexesNamedRoutes } from '../../constants/routes/complexes';
@@ -25,17 +26,7 @@ export class ConsumerComplexesComponent extends AbstractList<IComplexResponse> {
@Input() consumerId!: string;
@Input() businessId!: string;
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = [
// { field: 'id', header: 'شناسه', type: 'id' },
{ field: 'name', header: 'عنوان' },
{ field: 'branch_code', header: 'کد شعبه' },
{ field: 'pos_count', header: 'تعداد پایانه‌ها' },
{
field: 'created_at',
header: 'تاریخ ایجاد',
type: 'date',
},
];
@Input() header: IColumn[] = complexListConfig.columns;
private readonly service = inject(PartnerComplexesService);
private readonly router = inject(Router);
@@ -4,6 +4,7 @@ import {
IColumn,
PageDataListComponent,
} from '@/shared/components/pageDataList/page-data-list.component';
import { posListConfig } from '@/shared/constants/list-configs';
import { Component, inject, Input } from '@angular/core';
import { Router } from '@angular/router';
import { partnerConsumerPosesNamedRoutes } from '../../constants/routes/poses';
@@ -21,31 +22,7 @@ export class ConsumerPosesComponent extends AbstractList<IPosResponse> {
@Input({ required: true }) businessId!: string;
@Input({ required: true }) complexId!: string;
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = [
// { field: 'id', header: 'شناسه', type: 'id' },
{ field: 'name', header: 'عنوان' },
// { field: 'serial_number', header: 'شماره سریال' },
// { field: 'device', header: 'دستگاه', type: 'nested', nestedOption: { path: 'device.name' } },
{ field: 'pos_type', header: 'نوع پایانه' },
{
field: 'account',
header: 'کاربر',
type: 'nested',
nestedOption: { path: 'account.username' },
},
// {
// field: 'provider',
// header: 'ارایه‌دهنده',
// type: 'nested',
// nestedOption: { path: 'provider.name' },
// },
// { field: 'status', header: 'وضعیت' },
// {
// field: 'created_at',
// header: 'تاریخ ایجاد',
// type: 'date',
// },
];
@Input() header: IColumn[] = posListConfig.columns;
private readonly service = inject(PartnerPosesService);
private readonly router = inject(Router);
@@ -1,6 +1,7 @@
// import { CatalogRoleTagComponent } from '@/shared/catalog/roles';
import { AbstractList } from '@/shared/abstractClasses/abstract-list';
import { PageDataListComponent } from '@/shared/components/pageDataList/page-data-list.component';
import { consumerListConfig } from '@/shared/constants/list-configs';
import { Component, inject, signal } from '@angular/core';
import { Router } from '@angular/router';
import { CreateConsumerWrapperComponent } from '../components/createConsumerWrapper/create-consumer-wrapper.component';
@@ -20,17 +21,7 @@ export class ConsumersComponent extends AbstractList<IPartnerConsumerResponse> {
visibleCreateForm = signal(false);
override setColumns(): void {
this.columns = [
{ field: 'name', header: 'نام' },
{ field: 'type', header: 'نوع', type: 'nested', nestedOption: { path: 'type.translate' } },
{ field: 'business_counts', header: 'تعداد فعالیت‌ اقتصادی فعال' },
{
field: 'created_at',
header: 'تاریخ ایجاد',
type: 'date',
},
];
this.columns = consumerListConfig.columns;
}
override getDataRequest() {
@@ -4,6 +4,7 @@ import {
IColumn,
PageDataListComponent,
} from '@/shared/components/pageDataList/page-data-list.component';
import { partnerCustomerListConfig } from '@/shared/constants/list-configs';
import { Component, inject, Input } from '@angular/core';
import { Router } from '@angular/router';
import { partnerCustomersNamedRoutes } from '../constants';
@@ -17,19 +18,7 @@ import { CustomersService } from '../services/main.service';
})
export class PartnerCustomerListComponent extends AbstractList<ICustomerResponse> {
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = [
// { field: 'id', header: 'شناسه', type: 'id' },
{
field: 'first_name',
header: 'عنوان',
},
{
field: 'created_at',
header: 'تاریخ ایجاد',
type: 'date',
},
];
@Input() header: IColumn[] = partnerCustomerListConfig.columns;
private readonly service = inject(CustomersService);
private readonly router = inject(Router);