-
-
{{ inOrderGood.good.name }}
-
{{ inOrderGood.good.sku }}
+
+
![]()
+
+
+
+
+
+
+ {{ inOrderGood.good.name }}
+
+
+ ({{ inOrderGood.good.sku }})
+
+
+
+ {{ inOrderGood.quantity }} {{ enumTranslator(inOrderGood.good.unit_type) }}
+
+
+ @if (!inOrderGood.discount_amount) {
+
+ } @else {
+
+
+
+
+ }
-
diff --git a/src/app/domains/pos/modules/landing/components/order/order-card-template.component.ts b/src/app/domains/pos/modules/landing/components/order/order-card-template.component.ts
index 36a12d9..32bae4f 100644
--- a/src/app/domains/pos/modules/landing/components/order/order-card-template.component.ts
+++ b/src/app/domains/pos/modules/landing/components/order/order-card-template.component.ts
@@ -1,3 +1,5 @@
+import { PriceMaskDirective } from '@/shared/directives';
+import { enumTranslator } from '@/utils';
import { Component, inject, Input, signal } from '@angular/core';
import { ButtonDirective } from 'primeng/button';
import images from 'src/assets/images';
@@ -8,7 +10,7 @@ import { PayloadFormDialogComponent } from '../payload-form.component';
@Component({
selector: 'pos-order-card-template',
templateUrl: './order-card-template.component.html',
- imports: [ButtonDirective, PayloadFormDialogComponent],
+ imports: [ButtonDirective, PayloadFormDialogComponent, PriceMaskDirective],
})
export class OrderCardTemplateComponent {
@Input({ required: true }) inOrderGood!: IPosInOrderGood;
@@ -18,6 +20,7 @@ export class OrderCardTemplateComponent {
visible = signal(false);
placeholderImage = images.placeholders.default;
+ enumTranslator = (key: string) => enumTranslator(key);
removeGoodFromOrder() {
this.store.removeFromInOrderGoods(this.inOrderGood.id);
diff --git a/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.html b/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.html
index b4bfca5..1aad815 100644
--- a/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.html
+++ b/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.html
@@ -7,6 +7,8 @@
[percentageControl]="form.controls.payload.controls.wages_percentage"
[amountControl]="form.controls.payload.controls.wages_amount"
[baseAmount]="unitWithQuantity()"
+ [minAmount]="0"
+ [maxAmount]="unitWithQuantity()"
name="wages"
label="اجرت"
/>
@@ -14,6 +16,8 @@
[percentageControl]="form.controls.payload.controls.commission_percentage"
[amountControl]="form.controls.payload.controls.commission_amount"
[baseAmount]="unitWithQuantity()"
+ [minAmount]="0"
+ [maxAmount]="unitWithQuantity()"
name="commission"
label="حقالعمل"
/>
@@ -21,6 +25,8 @@
[percentageControl]="form.controls.payload.controls.profit_percentage"
[amountControl]="form.controls.payload.controls.profit_amount"
[baseAmount]="totalAmountBeforeProfit()"
+ [minAmount]="0"
+ [maxAmount]="totalAmountBeforeProfit()"
name="profit"
label="سود"
/>
@@ -29,6 +35,8 @@
[percentageControl]="form.controls.discount_percentage"
[amountControl]="form.controls.discount_amount"
[baseAmount]="baseTotalAmount()"
+ [minAmount]="0"
+ [maxAmount]="baseTotalAmount()"
name="discount"
label="تخفیف"
/>
diff --git a/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.ts b/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.ts
index e3eecb6..8baaa88 100644
--- a/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.ts
+++ b/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.ts
@@ -4,7 +4,7 @@ import { InputComponent } from '@/shared/components';
import { AmountPercentageInputComponent } from '@/shared/components/amountPercentageInput/amount-percentage-input.component';
import { TGoldKarat } from '@/shared/localEnum/constants/goldKarat';
import { formatWithCurrency } from '@/utils';
-import { Component, computed, EventEmitter, Output } from '@angular/core';
+import { Component, EventEmitter, Output, signal } from '@angular/core';
import { ReactiveFormsModule, Validators } from '@angular/forms';
import { Button } from 'primeng/button';
import { IGoldPayload, IPosOrderItem } from '../../../models';
@@ -29,30 +29,54 @@ export class PosGoldPayloadFormComponent extends AbstractForm<
@Output() onSubmitForm = new EventEmitter
();
@Output() onChangeTotalAmount = new EventEmitter();
+ unitWithQuantity = signal(0);
+ totalAmountBeforeProfit = signal(0);
+ baseTotalAmount = signal(0);
+ taxAmount = signal(0);
+ totalAmount = signal(0);
+
private readonly initialForm = () => {
const form = this.fb.group({
- unit_price: [this.initialValues?.unit_price || 200_000_000, [Validators.required]],
- quantity: [this.initialValues?.quantity || 2, [Validators.required]],
+ unit_price: [this.initialValues?.unit_price || 0, [Validators.required]],
+ quantity: [this.initialValues?.quantity || 0, [Validators.required]],
discount_amount: [this.initialValues?.discount || 0],
- discount_percentage: [this.initialValues?.discount || 0],
+ discount_percentage: [0, [Validators.max(100), Validators.min(0)]],
payload: this.fb.group({
commission_amount: [this.initialValues?.payload?.commission || 0, [Validators.required]],
- commission_percentage: [
- this.initialValues?.payload?.commission || 10,
- [Validators.required],
- ],
+ commission_percentage: [0, [Validators.required, Validators.max(100), Validators.min(0)]],
wages_amount: [this.initialValues?.payload?.wages || 0, [Validators.required]],
- wages_percentage: [this.initialValues?.payload?.wages || 10, [Validators.required]],
+ wages_percentage: [0, [Validators.required, Validators.max(100), Validators.min(0)]],
profit_amount: [this.initialValues?.payload?.profit || 0, [Validators.required]],
- profit_percentage: [this.initialValues?.payload?.profit || 10, [Validators.required]],
+ profit_percentage: [0, [Validators.required, Validators.max(100), Validators.min(0)]],
karat: [this.initialValues?.payload?.karat || '', [Validators.required]],
}),
});
+ form.valueChanges.subscribe((value) => {
+ this.updateCalculateAmount(value as any);
+ });
+
+ form.setValue({
+ unit_price: 200_000_000,
+ quantity: 2,
+ discount_amount: 0,
+ discount_percentage: 0,
+ payload: {
+ commission_amount: 0,
+ commission_percentage: 10,
+ wages_amount: 0,
+ wages_percentage: 10,
+ profit_amount: 0,
+ profit_percentage: 10,
+ karat: '18',
+ },
+ });
+
return form;
};
form = this.initialForm();
+
override submitForm(payload: IPosOrderItem) {
this.onSubmit.emit({
...payload,
@@ -68,36 +92,28 @@ export class PosGoldPayloadFormComponent extends AbstractForm<
});
}
- unitWithQuantity = computed(
- () => (this.form.value.unit_price ?? 0) * (this.form.value.quantity ?? 0),
- );
+ updateCalculateAmount(payload: Partial>) {
+ const commissionAmount = Number(payload.payload?.commission_amount ?? '0');
+ const wageAmount = Number(payload.payload?.wages ?? '0');
+ const discountAmount = Number(payload.discount_amount ?? '0');
+ const profitAmount = Number(payload.payload?.profit_amount ?? '0');
+ const unitPrice = Number(payload.unit_price ?? '0');
+ const quantity = Number(payload.quantity ?? '0');
- totalAmountBeforeProfit = computed(() => {
- const commissionAmount = Number(this.form.value.payload?.commission_amount ?? '0');
- const wageAmount = Number(this.form.value.payload?.wages_amount ?? '0');
- return this.unitWithQuantity() + wageAmount + commissionAmount;
- });
+ const unitWithQuantity = unitPrice * quantity;
+ const totalAmountBeforeProfit = unitWithQuantity + wageAmount + commissionAmount;
+ const baseTotalAmount = totalAmountBeforeProfit + profitAmount;
+ const taxAmount = (profitAmount + commissionAmount + wageAmount - discountAmount) * 0.1;
+ const totalAmount = baseTotalAmount - discountAmount + taxAmount;
- baseTotalAmount = computed(() => {
- const commissionAmount = Number(this.form.value.payload?.commission_amount ?? '0');
- const wageAmount = Number(this.form.value.payload?.wages_amount ?? '0');
- const profitAmount = Number(this.form.value.payload?.profit_amount ?? '0');
+ this.unitWithQuantity.set(unitWithQuantity);
+ this.totalAmountBeforeProfit.set(totalAmountBeforeProfit);
+ this.baseTotalAmount.set(baseTotalAmount);
+ this.taxAmount.set(taxAmount);
+ this.totalAmount.set(totalAmount);
- return this.unitWithQuantity() + profitAmount + commissionAmount + wageAmount;
- });
-
- taxAmount = computed(() => {
- const commissionAmount = Number(this.form.value.payload?.commission_amount ?? '0');
- const wageAmount = Number(this.form.value.payload?.wages_amount ?? '0');
- const profitAmount = Number(this.form.value.payload?.profit_amount ?? '0');
- const discountAmount = Number(this.form.value.discount_amount ?? '0');
- return (profitAmount + commissionAmount + wageAmount - discountAmount) * 0.1;
- });
-
- totalAmount = computed(() => {
- const discountAmount = Number(this.form.value.discount_amount ?? '0');
- return this.baseTotalAmount() - discountAmount + this.taxAmount();
- });
+ this.onChangeTotalAmount.emit(totalAmount);
+ }
toAmountFormat(amount: number) {
if (!amount) {
diff --git a/src/app/domains/pos/modules/landing/components/payloads/standard/form.component.html b/src/app/domains/pos/modules/landing/components/payloads/standard/form.component.html
index cb1e84e..cf1c5e8 100644
--- a/src/app/domains/pos/modules/landing/components/payloads/standard/form.component.html
+++ b/src/app/domains/pos/modules/landing/components/payloads/standard/form.component.html
@@ -9,15 +9,16 @@
[min]="0"
/>
-
+
,
@@ -23,7 +30,8 @@ export class PosStandardPayloadFormComponent extends AbstractForm<
const form = this.fb.group({
unit_price: [this.initialValues?.unit_price || 0, [Validators.required]],
quantity: [this.initialValues?.quantity || 0, [Validators.required]],
- discount: [this.initialValues?.discount || ''],
+ discount_amount: [this.initialValues?.discount || 0, [Validators.min(0)]],
+ discount_percentage: [0, [Validators.min(0), Validators.max(100)]],
});
form.valueChanges.subscribe((value) => {
@@ -60,7 +68,7 @@ export class PosStandardPayloadFormComponent extends AbstractForm<
updateCalculateAmount(value: Partial>) {
const baseTotalAmount = (value.unit_price ?? 0) * (value.quantity ?? 0);
- const discountAmount = (baseTotalAmount * Number(value.discount || '0')) / 100;
+ const discountAmount = Number(value.discount_amount ?? '0');
const baseTotalAmountWithoutTax = baseTotalAmount - discountAmount;
const taxAmount = baseTotalAmountWithoutTax * 0.1;
diff --git a/src/app/domains/pos/modules/landing/models/types.ts b/src/app/domains/pos/modules/landing/models/types.ts
index 6bf2b50..b0008ec 100644
--- a/src/app/domains/pos/modules/landing/models/types.ts
+++ b/src/app/domains/pos/modules/landing/models/types.ts
@@ -11,6 +11,7 @@ export interface IPosOrderItem {
good_id?: string;
service_id?: string;
notes?: string;
+ image_url?: string;
payload: T;
base_total_amount: number;
diff --git a/src/app/domains/pos/modules/landing/store/main.store.ts b/src/app/domains/pos/modules/landing/store/main.store.ts
index 0bf3db7..b9c997f 100644
--- a/src/app/domains/pos/modules/landing/store/main.store.ts
+++ b/src/app/domains/pos/modules/landing/store/main.store.ts
@@ -233,19 +233,22 @@ export class PosLandingStore {
}),
map((_res) => {
- // this.setState({
- // inOrderGoods: [],
- // customerDetails: {
- // type: CustomerType.UNKNOWN,
- // },
- // invoiceDate: nowJalali(JALALI_DATE_FORMATS.NUMERIC),
- // payments: {
- // cash: 0,
- // set_off: 0,
- // terminal: 0,
- // },
- // orderNote: '',
- // });
+ if (_res) {
+ this.setState({
+ inOrderGoods: [],
+ customerDetails: {
+ type: CustomerType.UNKNOWN,
+ },
+ invoiceDate: nowJalali(JALALI_DATE_FORMATS.NUMERIC),
+ payments: {
+ cash: 0,
+ set_off: 0,
+ terminal: 0,
+ },
+ orderNote: '',
+ });
+ }
+
return _res;
}),
);
diff --git a/src/app/domains/superAdmin/modules/consumers/views/single.component.ts b/src/app/domains/superAdmin/modules/consumers/views/single.component.ts
index b0ff717..2760d17 100644
--- a/src/app/domains/superAdmin/modules/consumers/views/single.component.ts
+++ b/src/app/domains/superAdmin/modules/consumers/views/single.component.ts
@@ -1,7 +1,7 @@
import { BreadcrumbService } from '@/core/services';
import { AppCardComponent, KeyValueComponent } from '@/shared/components';
import { JalaliDateDirective } from '@/shared/directives';
-import { licenseStatus } from '@/shared/localEnum/constants/licenseStatus';
+import { getLicenseStatus } from '@/utils';
import { Component, computed, effect, inject, signal } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Button } from 'primeng/button';
@@ -38,19 +38,9 @@ export class ConsumerComponent {
readonly loading = computed(() => this.store.loading());
readonly consumer = computed(() => this.store.entity());
readonly license = computed(() => this.store.entity()?.license_info);
- readonly licenseStatus = computed(() => {
- console.log(this.store.entity()?.license_info?.expires_at);
-
- if (!this.store.entity()?.license_info?.expires_at) {
- return null;
- }
- if (
- new Date().getTime() > new Date(this.store.entity()?.license_info?.expires_at || '').getTime()
- ) {
- return licenseStatus.EXPIRED;
- }
- return licenseStatus.ACTIVE;
- });
+ readonly licenseStatus = computed(() =>
+ getLicenseStatus(this.store.entity()?.license_info?.expires_at),
+ );
constructor() {
effect(() => {
diff --git a/src/app/domains/superAdmin/modules/guilds/components/goods/form.component.html b/src/app/domains/superAdmin/modules/guilds/components/goods/form.component.html
index 79f3957..5208e21 100644
--- a/src/app/domains/superAdmin/modules/guilds/components/goods/form.component.html
+++ b/src/app/domains/superAdmin/modules/guilds/components/goods/form.component.html
@@ -1,5 +1,6 @@