feat: refactor form components and improve invoice printing logic; enhance checkbox functionality and loading state management

This commit is contained in:
2026-05-17 10:59:15 +03:30
parent 73df354f9b
commit b2a7fa7f70
9 changed files with 302 additions and 116 deletions
@@ -22,7 +22,73 @@ export interface ISaleInvoiceFullResponse extends ISaleInvoiceFullRawResponse {}
interface Item {
id: string;
good: ISummary;
good_id: string;
service_id: null;
quantity: string;
measure_unit_code: string;
measure_unit_text: string;
sku_code: string;
unit_price: string;
discount: string;
total_amount: string;
notes?: string;
payload: Payload;
good_snapshot: Goodsnapshot;
good: GoodSummary;
}
interface GoodSummary {
name: string;
barcode?: string;
image_url?: string;
category: Category;
}
interface Category {
id: string;
name: string;
description?: string;
image_url?: string;
is_default_guild_good: boolean;
guild_id: string;
created_at: string;
updated_at: string;
}
interface Goodsnapshot {
good: Good;
}
interface Good {
id: string;
sku: Sku;
name: string;
barcode?: string;
category: ISummary;
image_url: string;
local_sku?: string;
measure_unit: MeasureUnit;
pricing_model: string;
base_sale_price: string;
}
interface MeasureUnit {
id: string;
code: string;
name: string;
}
interface Sku {
id: string;
VAT: string;
code: string;
name: string;
}
interface Payload {
karat: string;
wages: number;
profit: number;
commission: number;
}
interface Payment {
@@ -9,7 +9,7 @@
<button
pButton
type="button"
label="چاپ کن"
label="چاپ"
icon="pi pi-print"
outlined
size="small"
@@ -1,6 +1,7 @@
import { Maybe } from '@/core';
import { NativeBridgeService } from '@/core/services';
import { ToastService } from '@/core/services/toast.service';
import { PosConfigPrintService } from '@/domains/pos/modules/configs/components/print/services/main.service';
import { PosInfoStore } from '@/domains/pos/store';
import { CatalogTaxProviderStatusTagComponent } from '@/shared/catalog';
import { AppCardComponent, KeyValueComponent } from '@/shared/components';
@@ -12,6 +13,7 @@ import {
} from '@/shared/components/pageDataList/page-data-list.component';
import { PriceMaskDirective } from '@/shared/directives';
import { UikitEmptyStateComponent } from '@/uikit';
import { formatWithCurrency } from '@/utils';
import {
Component,
computed,
@@ -49,6 +51,8 @@ export class SharedSaleInvoiceSingleViewComponent {
private readonly nativeBridge = inject(NativeBridgeService);
private readonly posInfoStore = inject(PosInfoStore);
private readonly toastService = inject(ToastService);
//TODO: below service Must be transform from pos to shared.
private readonly service = inject(PosConfigPrintService);
@Input({ required: true }) loading!: boolean;
@Input() invoice!: Maybe<ISaleInvoiceFullResponse>;
@@ -67,84 +71,171 @@ export class SharedSaleInvoiceSingleViewComponent {
return '';
});
printInvoice = () => {
preparePrint = async () => {
if (this.invoice) {
const mustPrintConfig = await this.service.get();
const defaultPrintItems = [
{
title: 'اطلاعات صورت‌حساب',
items: [
{
label: 'شماره منحصر به فرد مالیاتی',
value: 'this.invoice',
show: true,
},
{
label: 'شماره صورت‌حساب',
value: this.invoice.code,
show: true,
},
{
label: 'موضوع صورت‌حساب',
value: 'this.invoice',
show: mustPrintConfig.invoice_template ?? true,
},
{
label: 'نوع صورت‌حساب',
value: 'this.invoice',
show: mustPrintConfig.invoice_template,
},
{
label: 'تاریخ و ساعت',
value: this.invoice.invoice_date,
show: true,
},
{
label: 'وضعیت صورت‌حساب مالیاتی',
value: this.invoice.status.translate,
show: mustPrintConfig.show_payment_info ?? true,
},
].filter((item) => item.show),
},
{
title: `اطلاعات فروشنده`,
items: [
{
label: 'عنوان فروشگاه',
value: this.invoice.pos.complex.business_activity.name,
show: mustPrintConfig.business_name,
},
{
label: 'عنوان شعبه',
value: this.invoice.pos.complex.name,
show: mustPrintConfig.complex_name,
},
{
label: 'عنوان پایانه‌ فروش',
value: this.invoice.pos.name,
show: mustPrintConfig.pos_name,
},
{
label: 'شماره اقتصادی',
value: 'this.invoice.pos.complex.business_activity.economic_code',
show: mustPrintConfig.economic_code,
},
].filter((item) => item.show),
},
{
title: `اطلاعات خریدار`,
items: [
{
label: 'نام خریدار',
value:
(this.invoice.customer
? this.invoice.customer.type === 'LEGAL'
? this.invoice.customer.legal?.company_name
: `${this.invoice.customer.individual?.first_name} ${this.invoice.customer.individual?.last_name}`
: this.invoice.unknown_customer?.name) || '-',
show: mustPrintConfig.customer_name,
},
{
label: 'شماره اقتصادی',
value:
(this.invoice.customer
? this.invoice.customer.type === 'LEGAL'
? this.invoice.customer.legal?.economic_code
: this.invoice.customer.individual?.economic_code || '-'
: '-') || '-',
show: mustPrintConfig.customer_economic_code,
},
].filter((item) => item.show),
},
].filter((item) => item.items.length);
if (mustPrintConfig.show_items) {
for (let item of this.invoice.items) {
defaultPrintItems.push({
title: 'جزییات صورت‌حساب',
items: [
{
label: 'شرح',
value: item.good.name,
show: mustPrintConfig.items?.name,
},
{
label: 'شناسه کالا / خدمت',
value: item.sku_code,
show: mustPrintConfig.items?.sku,
},
{
label: 'تعداد / مقدار',
value: `${item.quantity} ${item.measure_unit_text}`,
show: mustPrintConfig.items?.quantity,
},
{
label: 'قیمت واحد',
value: formatWithCurrency(item.unit_price),
show: mustPrintConfig.items?.base_amount,
},
{
label: 'اجرت',
value: formatWithCurrency(item.payload.wages),
show:
mustPrintConfig.items?.wage && item.good_snapshot.good.pricing_model === 'GOLD',
},
{
label: 'سود',
value: formatWithCurrency(item.payload.wages),
show:
mustPrintConfig.items?.profit && item.good_snapshot.good.pricing_model === 'GOLD',
},
{
label: 'حق‌العمل',
value: formatWithCurrency(item.payload.commission),
show:
mustPrintConfig.items?.commission &&
item.good_snapshot.good.pricing_model === 'GOLD',
},
{
label: 'مالیات بر ارزش افزوده',
value: 'item.good.tax',
show: mustPrintConfig.items?.tax,
},
{
label: 'تخفیف',
value: formatWithCurrency(item.discount),
show: mustPrintConfig.items?.discount,
},
{
label: 'مبلغ کل',
value: formatWithCurrency(item.total_amount),
show: mustPrintConfig.items?.total_amount,
},
],
});
}
}
return defaultPrintItems;
}
return null;
};
printInvoice = async () => {
try {
if (this.invoice) {
this.nativeBridge.print([
{
title: 'اطلاعات صورت‌حساب',
items: [
{
label: 'شماره منحصر به فرد مالیاتی',
value: 'this.invoice',
},
{
label: 'شماره صورت‌حساب',
value: this.invoice.code,
},
{
label: 'موضوع صورت‌حساب',
value: 'this.invoice',
},
{
label: 'نوع صورت‌حساب',
value: 'this.invoice',
},
{
label: 'تاریخ و ساعت',
value: this.invoice.invoice_date,
},
{
label: 'وضعیت صورت‌حساب مالیاتی',
value: this.invoice.status.translate,
},
],
},
{
title: `اطلاعات فروشنده`,
items: [
{
label: 'عنوان فروشگاه',
value: this.invoice.pos.complex.business_activity.name,
},
{
label: 'عنوان شعبه',
value: this.invoice.pos.complex.name,
},
{
label: 'عنوان پایانه‌ فروش',
value: this.invoice.pos.name,
},
{
label: 'شماره اقتصادی',
value: 'this.invoice.pos.complex.business_activity.economic_code',
},
],
},
{
title: `اطلاعات خریدار`,
items: [
{
label: 'نام خریدار',
value:
(this.invoice.customer
? this.invoice.customer.type === 'LEGAL'
? this.invoice.customer.legal?.company_name
: `${this.invoice.customer.individual?.first_name} ${this.invoice.customer.individual?.last_name}`
: this.invoice.unknown_customer?.name) || '-',
},
{
label: 'شماره اقتصادی',
value:
(this.invoice.customer
? this.invoice.customer.type === 'LEGAL'
? this.invoice.customer.legal?.economic_code
: this.invoice.customer.individual?.economic_code || '-'
: '-') || '-',
},
],
},
]);
const printItems = await this.preparePrint();
if (printItems) {
this.nativeBridge.print(printItems);
}
} catch (error) {
return this.toastService.error({