feat: update app version and build details in ngsw-config.json

fix: add baseZIndex to p-toast component in app.component.ts

feat: enhance pagination support in saleInvoices list component

refactor: modify saleInvoices service to accept pagination query

feat: update API routes for saleInvoices to support pagination

fix: adjust layout for consumer accounts in partner module

style: improve layout for consumer business activities in partner module

fix: update license info display in dashboard component

fix: ensure price info card displays default values for discount and tax

refactor: clean up gold payload form component

fix: adjust root component layout for mobile view

refactor: unify consumer account list configuration across modules

chore: remove deprecated partner consumer account list config

chore: remove deprecated superAdmin consumer account list config

feat: add new consumer account list configuration

style: add summary list styling in customize.scss

chore: switch API base URL for TIS environment
This commit is contained in:
2026-05-16 14:49:22 +03:30
parent 4f76056ac0
commit 8c98e53427
29 changed files with 219 additions and 172 deletions
@@ -4,7 +4,11 @@
emptyPlaceholderTitle="فاکتوری یافت نشد"
[items]="items()"
[loading]="loading()"
[perPage]="responseMetaData()?.perPage"
[currentPage]="responseMetaData()?.page"
[totalRecords]="responseMetaData()?.totalRecords || items().length"
[showDetails]="true"
(onDetails)="toSinglePage($event)"
(onRefresh)="refresh()"
(onChangePage)="changePage($event)"
/>
@@ -1,9 +1,11 @@
// import { CatalogRoleTagComponent } from '@/shared/catalog/roles';
import { Maybe } from '@/core';
import { AbstractList } from '@/shared/abstractClasses/abstract-list';
import {
IColumn,
PageDataListComponent,
} from '@/shared/components/pageDataList/page-data-list.component';
import { IPaginatedQuery } from '@/core/models/service.model';
import { saleInvoiceListConfig } from '@/shared/constants/list-configs';
import { Component, inject, Input } from '@angular/core';
import { Router } from '@angular/router';
@@ -16,7 +18,10 @@ import { ConsumerSaleInvoicesService } from '../services/main.service';
templateUrl: './list.component.html',
imports: [PageDataListComponent],
})
export class ConsumerSaleInvoiceListComponent extends AbstractList<IConsumerSaleInvoicesResponse> {
export class ConsumerSaleInvoiceListComponent extends AbstractList<
IConsumerSaleInvoicesResponse,
IPaginatedQuery
> {
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = saleInvoiceListConfig.columns;
@@ -27,8 +32,8 @@ export class ConsumerSaleInvoiceListComponent extends AbstractList<IConsumerSale
this.columns = this.header;
}
override getDataRequest() {
return this.service.getAll();
override getDataRequest(payload: Maybe<IPaginatedQuery>) {
return this.service.getAll(payload || undefined);
}
toSinglePage(item: IConsumerSaleInvoicesResponse) {
@@ -1,6 +1,15 @@
import { IPaginatedQuery } from '@/core/models/service.model';
const baseUrl = () => `/api/v1/consumer/sale-invoices`;
export const CONSUMER_SALE_INVOICES_API_ROUTES = {
list: () => baseUrl(),
list: (paginationQuery?: IPaginatedQuery) => {
if (!paginationQuery) return baseUrl();
const params = new URLSearchParams();
if (paginationQuery.page) params.set('page', String(paginationQuery.page));
if (paginationQuery.pageSize) params.set('perPage', String(paginationQuery.pageSize));
const query = params.toString();
return query ? `${baseUrl()}?${query}` : baseUrl();
},
single: (id: string) => `${baseUrl()}/${id}`,
};
@@ -1,4 +1,4 @@
import { IPaginatedResponse } from '@/core/models/service.model';
import { IPaginatedQuery, IPaginatedResponse } from '@/core/models/service.model';
import { ISaleInvoiceFullRawResponse, ISaleInvoiceFullResponse } from '@/domains/consumer/models';
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
@@ -12,9 +12,9 @@ export class ConsumerSaleInvoicesService {
private apiRoutes = CONSUMER_SALE_INVOICES_API_ROUTES;
getAll(): Observable<IPaginatedResponse<IConsumerSaleInvoicesResponse>> {
getAll(paginationQuery?: IPaginatedQuery): Observable<IPaginatedResponse<IConsumerSaleInvoicesResponse>> {
return this.http.get<IPaginatedResponse<IConsumerSaleInvoicesRawResponse>>(
this.apiRoutes.list(),
this.apiRoutes.list(paginationQuery),
);
}
getSingle(invoiceId: string): Observable<ISaleInvoiceFullResponse> {
@@ -4,7 +4,7 @@ import {
IColumn,
PageDataListComponent,
} from '@/shared/components/pageDataList/page-data-list.component';
import { partnerConsumerAccountListConfig } from '@/shared/constants/list-configs';
import { consumerAccountListConfig } from '@/shared/constants/list-configs';
import { Component, inject, Input } from '@angular/core';
import { IConsumerAccountResponse } from '../../models';
import { PartnerConsumerAccountsService } from '../../services/accounts.service';
@@ -18,7 +18,7 @@ import { ConsumerAccountFormComponent } from './form.component';
export class ConsumerAccountListComponent extends AbstractList<IConsumerAccountResponse> {
@Input({ required: true }) consumerId!: string;
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = partnerConsumerAccountListConfig.columns;
@Input() header: IColumn[] = consumerAccountListConfig.columns;
private readonly service = inject(PartnerConsumerAccountsService);
override setColumns(): void {
@@ -16,8 +16,12 @@
</div>
</app-card-data>
<partner-consumer-businessActivities-list [consumerId]="consumerId()" />
<partner-consumer-account-list [consumerId]="consumerId()" />
<div class="summaryList">
<partner-consumer-businessActivities-list [consumerId]="consumerId()" />
</div>
<div class="summaryList">
<partner-consumer-account-list [consumerId]="consumerId()" />
</div>
<partner-consumer-form
[(visible)]="editMode"
@@ -1,7 +1,7 @@
<p-card class="border border-surface-border bg-surface-card rounded-2xl p-4 text-text-color">
<div class="w-full flex items-center justify-between gap-1">
<span class="text-xl font-semibold">وضعیت {{ title }}</span>
<p-badge [value]="`تعداد کل: ${total}`" severity="secondary" size="large"></p-badge>
<p-badge [value]="`تعداد کل: ${total}`" severity="secondary" size="large" class="shrink-0"></p-badge>
</div>
<hr class="mb-6!" />
<div class="grid grid-cols-3 gap-2">
@@ -8,6 +8,7 @@ import { MenuItem } from 'primeng/api';
import { Button, ButtonDirective } from 'primeng/button';
import { Card } from 'primeng/card';
import { Menu } from 'primeng/menu';
import { finalize } from 'rxjs';
import images from 'src/assets/images';
import { PosInfoStore, PosProfileStore } from '../../store';
import { DeviceInfoStore } from '../../store/device.store';
@@ -85,19 +86,22 @@ export class PosPagesLayoutComponent {
homeRouteLink = '/pos';
async getData() {
// await this.layoutService.changeFullPageLoading(true);
// await this.posProfileStore.getData().subscribe({
// next: () => {
// this.posInfoStore
// .getData()
// .pipe(
// finalize(() => {
// this.layoutService.changeFullPageLoading(false);
// }),
// )
// .subscribe();
// },
// });
if (!this.posInfo() || !this.posProfile()) {
await this.layoutService.changeFullPageLoading(true);
await this.layoutService.changeFullPageLoading(true);
await this.posProfileStore.getData().subscribe({
next: () => {
this.posInfoStore
.getData()
.pipe(
finalize(() => {
this.layoutService.changeFullPageLoading(false);
}),
)
.subscribe();
},
});
}
}
toggleMenu() {
@@ -15,11 +15,11 @@
</div>
<div class="flex justify-between items-center">
<span>تخفیف</span>
<span [appPriceMask]="priceInfo().discountAmount"></span>
<span [appPriceMask]="priceInfo().discountAmount || 0"></span>
</div>
<div class="flex justify-between items-center">
<span>مالیات</span>
<span [appPriceMask]="priceInfo().taxAmount"></span>
<span [appPriceMask]="priceInfo().taxAmount || 0"></span>
</div>
<hr />
<div class="flex justify-between items-center font-bold text-lg">
@@ -31,16 +31,16 @@ export class PosGoldPayloadFormComponent extends AbstractForm<
IPosOrderItem<IGoldPayload>,
IPosOrderItem<IGoldPayload>
> {
override defaultValues: Partial<IPosOrderItem<IGoldPayload>> = {
unit_price: 200_000_000,
quantity: 2,
payload: {
commission: 10_000,
wages: 10_000,
profit: 10_000,
karat: '18' as TGoldKarat,
} as any,
};
// override defaultValues: Partial<IPosOrderItem<IGoldPayload>> = {
// unit_price: 200_000_000,
// quantity: 2,
// payload: {
// commission: 10_000,
// wages: 10_000,
// profit: 10_000,
// karat: '18' as TGoldKarat,
// } as any,
// };
@Output() onSubmitForm = new EventEmitter<IGoldPayload>();
@Output() onChangeTotalAmount = new EventEmitter<number>();
@@ -19,9 +19,9 @@
type="button"
pButton
class="sticky! bottom-0 inset-x-0 w-full right-0 z-1200 border-t border-surface-border bg-surface-0 px-4 py-3 shadow-[0_-4px_16px_rgba(0,0,0,0.08)] md:hidden! rounded-b-none!"
[style.paddingBottom]="'calc(0.75rem + {{env(safe-area-inset-bottom)}})'"
(click)="openInvoiceBottomSheet()"
>
<!-- [style.paddingBottom]="'calc(0.75rem + {{env(safe-area-inset-bottom)}})'" -->
<div class="mx-auto flex w-full max-w-3xl items-center justify-between">
<div class="flex flex-col items-start gap-1">
<span class="text-base">مبلغ کل فاکتور</span>
@@ -4,7 +4,7 @@ import {
IColumn,
PageDataListComponent,
} from '@/shared/components/pageDataList/page-data-list.component';
import { superAdminConsumerAccountListConfig } from '@/shared/constants/list-configs';
import { consumerAccountListConfig } from '@/shared/constants/list-configs';
import { Component, inject, Input } from '@angular/core';
import { IConsumerAccountResponse } from '../../models';
import { AdminConsumerAccountsService } from '../../services/accounts.service';
@@ -18,7 +18,7 @@ import { ConsumerAccountFormComponent } from './form.component';
export class ConsumerAccountListComponent extends AbstractList<IConsumerAccountResponse> {
@Input({ required: true }) consumerId!: string;
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = superAdminConsumerAccountListConfig.columns;
@Input() header: IColumn[] = consumerAccountListConfig.columns;
private readonly service = inject(AdminConsumerAccountsService);
override setColumns(): void {
@@ -1,12 +1,14 @@
import ISummary from '@/core/models/summary';
export interface IBusinessActivityRawResponse {
id: string;
name: string;
economic_code: string;
fiscal_id: string;
partner_token: string;
guild: ISummary;
id: string;
created_at: string;
license_info: LicenseInfo;
}
export interface IBusinessActivityResponse extends IBusinessActivityRawResponse {}
@@ -17,3 +19,10 @@ export interface IBusinessActivityRequest {
partner_token: string;
guild_id: string;
}
interface LicenseInfo {
id: string;
starts_at: string;
expires_at: string;
accounts_limit: number;
}
@@ -3,7 +3,10 @@
<div class="flex flex-col gap-4">
<div class="listKeyValue">
<app-key-value label="عنوان" [value]="businessActivity()?.name" />
<app-key-value label="کد اقتصادی" [value]="businessActivity()?.economic_code" />
<app-key-value label="صنف" [value]="businessActivity()?.guild?.name" />
<app-key-value label="تاریخ انقضا مجوز" [value]="businessActivity()?.license_info?.expires_at" type="date" />
<app-key-value label="تعداد کاربران مجاز" [value]="businessActivity()?.license_info?.accounts_limit" />
</div>
</div>
</app-card-data>
@@ -4,21 +4,24 @@
<div class="flex flex-col gap-4">
<div class="listKeyValue">
<app-key-value label="نام مشتری" [value]="consumer()?.name" />
<app-key-value label="وضعیت" [value]="consumer()?.status?.translate" />
<app-key-value label="نوع مشتری" [value]="consumer()?.type?.translate" />
@if (consumer()?.type?.value === "LEGAL") {
<app-key-value label="شناسه ملی" [value]="consumer()?.legal?.registration_code" />
} @else {
<app-key-value label="شماره موبایل" [value]="consumer()?.individual?.mobile_number" />
<app-key-value label="کد ملی" [value]="consumer()?.individual?.national_code" />
}
<app-key-value label="وضعیت" [value]="consumer()?.status?.value === 'ACTIVE'" type="active" />
</div>
</div>
</app-card-data>
<superAdmin-consumer-account-list [consumerId]="consumerId()" />
<superAdmin-consumer-businessActivities-list [consumerId]="consumerId()" />
<div class="summaryList">
<superAdmin-consumer-businessActivities-list [consumerId]="consumerId()" />
</div>
<div class="summaryList">
<superAdmin-consumer-account-list [consumerId]="consumerId()" />
</div>
<superAdmin-consumer-form
[(visible)]="editMode"