feat: refactor form components and improve invoice printing logic; enhance checkbox functionality and loading state management
This commit is contained in:
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user