+ @if (invoice.referenced_by) {
+
+ این صورتحساب، مرجع صورتحساب شمارهی
+
+ {{ invoice.referenced_by.invoice_number }}
+
+ میباشد.
+
+ }
+ @if (invoice.reference_invoice) {
+
+ صورتحساب مرجع به شمارهی
+
+ {{ invoice.reference_invoice.invoice_number }}
+
+ میباشد.
+
+ }
+
@@ -41,7 +60,7 @@
- @if (invoice.consumer_account?.account?.username) {
+ @if (invoice.consumer_account.account.username) {
}
diff --git a/src/app/shared/components/invoices/sale-invoice-single-info-card.component.ts b/src/app/shared/components/invoices/sale-invoice-single-info-card.component.ts
index ff6cdeb..dccacd0 100644
--- a/src/app/shared/components/invoices/sale-invoice-single-info-card.component.ts
+++ b/src/app/shared/components/invoices/sale-invoice-single-info-card.component.ts
@@ -5,9 +5,11 @@ import {
} from '@/shared/catalog';
import { CatalogInvoiceSettlementTypeTagComponent } from '@/shared/catalog/invoiceSettlementType';
import { PriceMaskDirective } from '@/shared/directives';
-import { Component, Input } from '@angular/core';
+import { Component, computed, inject, Input } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
import { Card } from 'primeng/card';
import { Divider } from 'primeng/divider';
+import { Message } from 'primeng/message';
import { KeyValueComponent } from '../key-value.component/key-value.component';
import { IColumn, PageDataListComponent } from '../pageDataList/page-data-list.component';
import { ISaleInvoiceFullResponse } from './sale-invoice-full-response.model';
@@ -26,6 +28,7 @@ export type TSaleInvoiceSingleViewVariant = 'full' | 'customer' | 'pos';
CatalogInvoiceSettlementTypeTagComponent,
PageDataListComponent,
PriceMaskDirective,
+ Message,
],
})
export class SaleInvoiceSingleInfoCardComponent {
@@ -33,6 +36,8 @@ export class SaleInvoiceSingleInfoCardComponent {
@Input() invoice!: Maybe
;
@Input() variant: TSaleInvoiceSingleViewVariant = 'full';
+ private readonly route = inject(ActivatedRoute);
+
columns: IColumn[] = [
{
field: 'name',
@@ -101,4 +106,35 @@ export class SaleInvoiceSingleInfoCardComponent {
type: 'price',
},
];
+
+ referenceInvoiceRoute = computed(() => {
+ const referenceInvoiceId = this.invoice?.reference_invoice?.id;
+ const pagePath = this.route.pathFromRoot
+ .flatMap((route) => route.snapshot.url.map((segment) => segment.path))
+ .join('/');
+
+ if (!pagePath || !referenceInvoiceId) {
+ return pagePath;
+ }
+
+ const pathParts = pagePath.split('/').filter(Boolean);
+ pathParts[pathParts.length - 1] = referenceInvoiceId;
+
+ return `/${pathParts.join('/')}`;
+ });
+ referenceByInvoiceRoute = computed(() => {
+ const referenceInvoiceId = this.invoice?.referenced_by?.id;
+ const pagePath = this.route.pathFromRoot
+ .flatMap((route) => route.snapshot.url.map((segment) => segment.path))
+ .join('/');
+
+ if (!pagePath || !referenceInvoiceId) {
+ return pagePath;
+ }
+
+ const pathParts = pagePath.split('/').filter(Boolean);
+ pathParts[pathParts.length - 1] = referenceInvoiceId;
+
+ return `/${pathParts.join('/')}`;
+ });
}
diff --git a/src/app/shared/components/invoices/sale-invoice-single-view.component.html b/src/app/shared/components/invoices/sale-invoice-single-view.component.html
index 2159363..ac20984 100644
--- a/src/app/shared/components/invoices/sale-invoice-single-view.component.html
+++ b/src/app/shared/components/invoices/sale-invoice-single-view.component.html
@@ -7,7 +7,7 @@
- @if (!isApplication) {
+ @if (!isApplication && canDoActionOnInvoice()) {
@@ -18,7 +18,7 @@
- @if (isApplication && moreActionMenuItems().length) {
+ @if (isApplication && moreActionMenuItems().length && canDoActionOnInvoice()) {
@for (action of moreActionMenuItems(); track action.label || $index) {
@@ -35,39 +35,44 @@
}
-
-
-
-
-
-
-
-
-
- برای امکان دسترسی به صورتحساب به صورت آنلاین، کد QR را اسکن کنید.
-
-
-
-
-
-
-
- @if (showCorrectionPaymentDialog()) {
-
+ @if (canDoActionOnInvoice()) {
+
+
+
+
+
+
+ @if (showCorrectionPaymentDialog()) {
+
+ }
}
}
+
+
+
+
+ برای امکان دسترسی به صورتحساب به صورت آنلاین، کد QR را اسکن کنید.
+
+
+
+
+
+
diff --git a/src/app/shared/components/invoices/sale-invoice-single-view.component.ts b/src/app/shared/components/invoices/sale-invoice-single-view.component.ts
index 6ceec44..ed6ba97 100644
--- a/src/app/shared/components/invoices/sale-invoice-single-view.component.ts
+++ b/src/app/shared/components/invoices/sale-invoice-single-view.component.ts
@@ -3,8 +3,11 @@ import { NativeBridgeService } from '@/core/services';
import { NavigationService } from '@/core/services/navigation.service';
import { ToastService } from '@/core/services/toast.service';
import { PosConfigPrintService } from '@/domains/pos/modules/configs/components/print/services/main.service';
-import { IPosReturnFromSaleRequest } from '@/domains/pos/modules/saleInvoices/models/returnFromSale';
-import { IPayment, IPosOrderItem } from '@/domains/pos/modules/shop/models';
+import {
+ IPosReturnFromSaleItem,
+ IPosReturnFromSaleRequest,
+} from '@/domains/pos/modules/saleInvoices/models/returnFromSale';
+import { IPayment } from '@/domains/pos/modules/shop/models';
import { PosInfoStore } from '@/domains/pos/store';
import { TspProviderResponseStatus } from '@/shared/catalog';
import { SharedLightBottomsheetComponent } from '@/shared/components';
@@ -88,6 +91,8 @@ export class SharedSaleInvoiceSingleViewComponent {
@Input() sendToTspLoading: boolean = false;
@Input() resendToTspLoading: boolean = false;
@Input() inquiryLoading: boolean = false;
+ @Input() correctionLoading: boolean = false;
+ @Input() returnFromSaleLoading: boolean = false;
@Input() beforeCorrectionSubmit?: (data: ICorrectionRequest) => Promise
| boolean;
@Output() onRefresh = new EventEmitter();
@@ -115,6 +120,10 @@ export class SharedSaleInvoiceSingleViewComponent {
return '';
});
+ canDoActionOnInvoice = computed(() => {
+ return !this.invoice?.referenced_by;
+ });
+
showErrors = () => {};
inquiry = () => {
this.onInquiry.emit();
@@ -319,45 +328,35 @@ export class SharedSaleInvoiceSingleViewComponent {
this.pendingCorrectionSubmitResolver = null;
}
+ cancelCorrection() {
+ this.showCorrectionForm.set(false);
+ this.cancelCorrectionPayment();
+ }
+ cancelReturn() {
+ this.showReturnFromSaleForm.set(false);
+ }
+
private mapReturnFromSaleRequest(event: ReturnFromSaleFormValue): IPosReturnFromSaleRequest {
const invoiceItems = this.invoice?.items || [];
const itemMap = new Map(invoiceItems.map((item) => [item.id, item]));
- const items: IPosOrderItem[] = (event.items || [])
+ const items: IPosReturnFromSaleItem[] = (event.items || [])
.map((item) => {
const source = itemMap.get(item.id);
if (!source) return null;
const quantity = Number(item.quantity || 0);
- const unit_price = Number(source.unit_price || 0);
- const discount_amount = Number(source.discount_amount || 0);
- const base_total_amount = unit_price * quantity;
- const total_amount = Number(source.total_amount || 0);
- const tax_amount = Number(source.tax_amount || 0);
return {
good_id: source.good_id,
- service_id: source.service_id || undefined,
quantity,
- unit_price,
- discount_amount,
- base_total_amount,
- total_amount,
- tax_amount,
- measure_unit: source.good_snapshot.measure_unit,
- payload: source.payload as any,
- notes: source.notes,
- image_url: source.good_snapshot.image_url,
- } as IPosOrderItem;
+ };
})
- .filter((item): item is IPosOrderItem => !!item);
+ .filter((item): item is IPosReturnFromSaleItem => !!item);
return {
invoice_date: this.invoice?.invoice_date || '',
items,
- total_amount: items.reduce((sum, item) => sum + Number(item.total_amount || 0), 0),
- discount_amount: items.reduce((sum, item) => sum + Number(item.discount_amount || 0), 0),
- tax_amount: items.reduce((sum, item) => sum + Number(item.tax_amount || 0), 0),
};
}
diff --git a/src/assets/customize.scss b/src/assets/customize.scss
index 62ba38b..4ccaaf7 100644
--- a/src/assets/customize.scss
+++ b/src/assets/customize.scss
@@ -16,3 +16,6 @@
@apply w-full;
}
}
+.p-component.p-overlay.ng-star-inserted {
+ max-width: 100%;
+}
diff --git a/src/assets/images/favicon.ico b/src/assets/images/favicon.ico
new file mode 100644
index 0000000..f1e7fc0
Binary files /dev/null and b/src/assets/images/favicon.ico differ
diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png
index b038004..2015066 100644
Binary files a/src/assets/images/logo.png and b/src/assets/images/logo.png differ
diff --git a/src/assets/layout/_core.scss b/src/assets/layout/_core.scss
index f0cd43a..3c2ce94 100644
--- a/src/assets/layout/_core.scss
+++ b/src/assets/layout/_core.scss
@@ -9,13 +9,13 @@ body {
line-height: 1.2;
}
-html.application-pos,
-body.application-pos {
- width: 100%;
- max-width: 600px;
- margin-left: auto;
- margin-right: auto;
-}
+// html.application-pos,
+// body.application-pos {
+// width: 100%;
+// max-width: 600px;
+// margin-left: auto;
+// margin-right: auto;
+// }
body.application-pos {
overflow-x: hidden;
diff --git a/src/environments/environment.tis.ts b/src/environments/environment.tis.ts
index 612d694..f1e2553 100644
--- a/src/environments/environment.tis.ts
+++ b/src/environments/environment.tis.ts
@@ -1,10 +1,10 @@
// TIS tenant environment configuration
export const environment = {
production: true,
- apiBaseUrl: 'https://psp-api.shift-am.ir',
+ // apiBaseUrl: 'https://psp-api.shift-am.ir',
// apiBaseUrl: 'http://192.168.128.73:5002',
// apiBaseUrl: 'http://192.168.0.162:5002',
- // apiBaseUrl: 'http://localhost:5002',
+ apiBaseUrl: 'http://localhost:5002',
host: 'localhost',
port: 5000,
enableLogging: false,
diff --git a/src/tenants/default/app.routes.ts b/src/tenants/default/app.routes.ts
index dbe888e..49e75f4 100644
--- a/src/tenants/default/app.routes.ts
+++ b/src/tenants/default/app.routes.ts
@@ -15,7 +15,10 @@ export const appRoutes: Routes = [
CONSUMER_ROUTES,
PROVIDER_ROUTES,
PARTNER_ROUTES,
- ...POS_ROUTES.children!,
+ {
+ path: 'pos',
+ children: [...POS_ROUTES.children!],
+ },
],
},