feat: implement stock keeping unit management form and list components

- Added StockKeepingUnitFormComponent for creating and editing stock keeping units.
- Introduced StockKeepingUnitsComponent for listing stock keeping units with pagination.
- Integrated form fields for code, name, VAT, and SKU type in the stock keeping unit form.
- Created API routes for stock keeping units with CRUD operations.
- Updated input components to handle numeric and price types with Persian/Arabic digit normalization.
- Enhanced key-value component to support tag display instead of badge.
- Adjusted layout styles for sidebar menu.
- Added AGENT.md for repository-specific coding guidelines and practices.
- Implemented good management form with file upload and category selection.
This commit is contained in:
2026-05-06 22:01:20 +03:30
parent 54d00e19ae
commit b2a1eb8e5b
87 changed files with 882 additions and 434 deletions
@@ -24,7 +24,7 @@ export class PartnerAccountsComponent extends AbstractList<IAccountResponse> {
override setColumns(): void {
this.columns = [
{ field: 'id', header: 'شناسه', type: 'id' },
// { field: 'id', header: 'شناسه', type: 'id' },
{
field: 'username',
header: 'نام کاربری',
@@ -3,6 +3,7 @@
[columns]="columns"
emptyPlaceholderTitle="حساب کاربری‌ای یافت نشد."
[items]="items()"
[showIndex]="false"
[loading]="loading()"
(onRefresh)="refresh()"
>
@@ -18,7 +18,6 @@ export class ConsumerAccountListComponent extends AbstractList<IConsumerAccountR
@Input({ required: true }) consumerId!: string;
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = [
{ field: 'id', header: 'شناسه', type: 'id' },
{
field: 'account',
header: 'نام کاربری',
@@ -41,6 +40,7 @@ export class ConsumerAccountListComponent extends AbstractList<IConsumerAccountR
header: 'وضعیت',
type: 'nested',
nestedOption: { path: 'account.status.translate' },
variant: 'tag',
},
// {
// field: 'created_at',
@@ -19,6 +19,7 @@
@case (1) {
<partner-consumer-businessActivities-form-content
[consumerId]="consumerId"
[visible]="visible"
(onSubmit)="onBusinessActivitySubmit($event)"
(onClose)="close()"
/>
@@ -11,6 +11,7 @@
[businessActivityId]="businessActivityId"
[initialValues]="initialValues"
[editMode]="editMode"
[visible]="visible"
(onSubmit)="onFormSubmit($event)"
(onClose)="close()"
/>
@@ -38,6 +38,7 @@ export class ConsumerBusinessActivitiesFormComponent extends AbstractForm<
@Input({ required: true }) consumerId!: string;
@Input() businessActivityId!: string;
@Input({ required: true }) visible!: boolean;
initForm = () => {
const form = this.fb.group({
@@ -26,7 +26,7 @@ export class ConsumerComplexesComponent extends AbstractList<IComplexResponse> {
@Input() businessId!: string;
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = [
{ field: 'id', header: 'شناسه', type: 'id' },
// { field: 'id', header: 'شناسه', type: 'id' },
{ field: 'name', header: 'عنوان' },
{ field: 'branch_code', header: 'کد شعبه' },
{ field: 'pos_count', header: 'تعداد پایانه‌ها' },
@@ -22,7 +22,7 @@ export class ConsumerPosesComponent extends AbstractList<IPosResponse> {
@Input({ required: true }) complexId!: string;
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = [
{ field: 'id', header: 'شناسه', type: 'id' },
// { field: 'id', header: 'شناسه', type: 'id' },
{ field: 'name', header: 'عنوان' },
// { field: 'serial_number', header: 'شماره سریال' },
// { field: 'device', header: 'دستگاه', type: 'nested', nestedOption: { path: 'device.name' } },
@@ -11,7 +11,7 @@
<app-key-value label="شماره موبایل" [value]="consumer()?.individual?.mobile_number" />
<app-key-value label="کد ملی" [value]="consumer()?.individual?.national_code" />
}
<app-key-value label="وضعیت" [value]="consumer()?.status?.translate" />
<app-key-value label="وضعیت" [value]="consumer()?.status?.value === 'ACTIVE'" type="active" />
</div>
</div>
</app-card-data>
@@ -18,7 +18,7 @@ import { CustomersService } from '../services/main.service';
export class PartnerCustomerListComponent extends AbstractList<ICustomerResponse> {
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = [
{ field: 'id', header: 'شناسه', type: 'id' },
// { field: 'id', header: 'شناسه', type: 'id' },
{
field: 'first_name',
@@ -15,7 +15,7 @@ export class PartnerLicenseListComponent extends AbstractList<ILicenseResponse>
override setColumns(): void {
this.columns = [
{ field: 'id', header: 'شناسه', type: 'id' },
// { field: 'id', header: 'شناسه', type: 'id' },
{
field: 'business_activity',
header: 'عنوان مشتری',