feat(purchases): implement purchase receipt functionality with form and receipt template

- Added `ProductPurchaseComponent` to handle product purchases.
- Created `PurchaseReceiptTemplateComponent` for displaying purchase receipt details.
- Developed `PurchaseFormComponent` for managing purchase form inputs and submission.
- Introduced `ProductChargeRowFormComponent` and `ProductChargeRowFormFieldsComponent` for handling product charge rows in the form.
- Implemented `PurchaseReceiptProductRowComponent` for displaying individual product rows in the receipt.
- Established API routes for purchase operations in `apiRoutes`.
- Integrated suppliers and inventories selection components.
- Added utility functions for converting prices to Persian alphabet.
- Created a utility for generating full names from name parts.
- Enhanced form validation and submission handling in the purchase form.
- Updated styles and templates for improved UI/UX.
This commit is contained in:
2025-12-09 20:17:00 +03:30
parent abf53bac03
commit 50bc9a4632
77 changed files with 1807 additions and 18834 deletions
+23
View File
@@ -0,0 +1,23 @@
import { Maybe } from '@/core';
import { IProductResponse } from '@/modules/products/models';
import { FormArray, FormControl, FormGroup } from '@angular/forms';
export * from './io';
export interface IPurchaseItemFormGroup extends FormGroup<{
product: FormControl<IProductResponse | null>;
count: FormControl<number>;
fee: FormControl<number>;
description: FormControl<string>;
total: FormControl<number>;
}> {}
export interface IPurchaseFormGroup extends FormGroup<{
code: FormControl<string>;
isSettled: FormControl<boolean>;
buyAt: FormControl<string>;
description: FormControl<Maybe<string>>;
products: FormArray<IPurchaseItemFormGroup>;
inventoryId: FormControl<number>;
supplierId: FormControl<number>;
}> {}
+57
View File
@@ -0,0 +1,57 @@
import { Maybe } from '@/core';
export interface IPurchaseRawResponse {
id: number;
totalAmount: number;
inventoryId: number;
supplierId: number;
code: string;
items: IPurchaseItemResponse[];
createdAt: string;
updatedAt: string;
deletedAt?: string;
}
export interface IPurchaseResponse extends IPurchaseRawResponse {}
export interface IPurchaseItemRawResponse {
id: number;
count: number;
fee: number;
total: number;
productId: number;
}
export interface IPurchaseRequest {
totalAmount: number;
inventoryId: number;
supplierId: number;
code?: string;
description?: string;
items: IPurchaseItemRequest[];
}
export interface IPurchaseItemRequest {
productId: number;
count: number;
fee: number;
total: number;
}
export interface IPurchaseForm {
inventory: Maybe<IInventoryResponse>;
supplier: Maybe<ISupplierResponse>;
code: string;
isSettled: boolean;
buyAt: Date | string;
description: string;
totalAmount: number;
products: IPurchaseItemForm[];
}
export interface IPurchaseItemForm {
product: Maybe<IProductResponse>;
count: number;
fee: number;
total: number;
description?: string;
}