Files
psp_panel/src/app/shared/components/posPayment/standard-form.component.ts
T

93 lines
3.3 KiB
TypeScript
Raw Normal View History

import ISummary from '@/core/models/summary';
import { greaterThanValidator } from '@/core/validators';
2026-03-29 18:07:10 +03:30
import { AbstractForm } from '@/shared/abstractClasses';
2026-05-31 10:34:43 +03:30
import {
AmountPercentageInputComponent,
CalculatedAmountCardComponent,
InputComponent,
} from '@/shared/components';
import { IStandardPayload } from '@/shared/models';
2026-03-29 18:07:10 +03:30
import { Component, computed, EventEmitter, Input, Output, signal } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
2026-03-29 18:07:10 +03:30
import { ReactiveFormsModule, Validators } from '@angular/forms';
import { ButtonDirective } from 'primeng/button';
2026-05-31 10:34:43 +03:30
import { IPosOrderItem } from '../../../domains/pos/modules/shop/models';
import { PriceInputComponent } from '../input/price-input.component';
2026-03-29 18:07:10 +03:30
@Component({
2026-05-31 10:34:43 +03:30
selector: 'shared-standard-payload-form',
templateUrl: './standard-form.component.html',
imports: [
ReactiveFormsModule,
InputComponent,
AmountPercentageInputComponent,
ButtonDirective,
2026-05-31 10:34:43 +03:30
CalculatedAmountCardComponent,
PriceInputComponent,
],
2026-03-29 18:07:10 +03:30
})
2026-05-31 10:34:43 +03:30
export class SharedStandardPayloadFormComponent extends AbstractForm<
2026-03-29 18:07:10 +03:30
IPosOrderItem<IStandardPayload>,
IPosOrderItem<IStandardPayload>
> {
@Input({ required: true }) measureUnit!: ISummary;
@Input({ required: true }) vatPercentage!: number;
2026-05-31 10:34:43 +03:30
@Input() isRapidInvoice: boolean = false;
@Input() ctaText: string = '';
2026-03-29 18:07:10 +03:30
@Output() onChangeTotalAmount = new EventEmitter<number>();
private readonly initialForm = () => {
const form = this.fb.group({
unit_price: [
this.initialValues?.unit_price || 0,
[Validators.required, greaterThanValidator(0)],
],
quantity: [this.initialValues?.quantity || 0, [Validators.required, greaterThanValidator(0)]],
discount_amount: [this.initialValues?.discount_amount || 0, [Validators.min(0)]],
discount_percentage: [0, [Validators.min(0), Validators.max(100)]],
2026-03-29 18:07:10 +03:30
});
form.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => {
2026-03-29 18:07:10 +03:30
this.updateCalculateAmount(value as Partial<IPosOrderItem<IStandardPayload>>);
});
return form;
};
form = this.initialForm();
override submitForm(payload: IPosOrderItem<IStandardPayload>) {
this.onSubmit.emit({
...payload,
total_amount: this.totalAmount(),
discount_amount: this.discountAmount(),
tax_amount: this.taxAmount(),
base_total_amount: this.baseTotalAmount(),
});
}
baseTotalAmount = signal<number>(0);
totalAmount = signal<number>(0);
discountAmount = signal<number>(0);
taxAmount = signal<number>(0);
preparedCTAText = computed(() =>
2026-05-31 10:34:43 +03:30
this.ctaText || this.editMode
? 'اعمال ویرایش'
: this.isRapidInvoice
? 'ثبت و پرداخت'
: 'افزودن به لیست خرید'
);
2026-03-29 18:07:10 +03:30
updateCalculateAmount(value: Partial<IPosOrderItem<IStandardPayload>>) {
const baseTotalAmount = (value.unit_price ?? 0) * (value.quantity ?? 0);
const discountAmount = Number(value.discount_amount ?? '0');
2026-03-29 18:07:10 +03:30
const baseTotalAmountWithoutTax = baseTotalAmount - discountAmount;
const taxAmount = baseTotalAmountWithoutTax * this.vatPercentage;
2026-03-29 18:07:10 +03:30
this.baseTotalAmount.set(baseTotalAmount);
this.discountAmount.set(discountAmount);
this.taxAmount.set(taxAmount);
this.totalAmount.set(baseTotalAmountWithoutTax + taxAmount);
}
}