@open-mercato/core 0.4.8-develop-d16e2f51dc → 0.4.8-develop-4b58cde65d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/generated/entities/sales_return/index.js +31 -0
  2. package/dist/generated/entities/sales_return/index.js.map +7 -0
  3. package/dist/generated/entities/sales_return_line/index.js +29 -0
  4. package/dist/generated/entities/sales_return_line/index.js.map +7 -0
  5. package/dist/generated/entities.ids.generated.js +2 -0
  6. package/dist/generated/entities.ids.generated.js.map +2 -2
  7. package/dist/generated/entity-fields-registry.js +4 -0
  8. package/dist/generated/entity-fields-registry.js.map +2 -2
  9. package/dist/modules/sales/acl.js +2 -0
  10. package/dist/modules/sales/acl.js.map +2 -2
  11. package/dist/modules/sales/api/document-history/route.js +20 -2
  12. package/dist/modules/sales/api/document-history/route.js.map +2 -2
  13. package/dist/modules/sales/api/documents/factory.js +34 -0
  14. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  15. package/dist/modules/sales/api/returns/[id]/route.js +147 -0
  16. package/dist/modules/sales/api/returns/[id]/route.js.map +7 -0
  17. package/dist/modules/sales/api/returns/route.js +158 -0
  18. package/dist/modules/sales/api/returns/route.js.map +7 -0
  19. package/dist/modules/sales/backend/sales/documents/[id]/page.js +20 -1
  20. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  21. package/dist/modules/sales/commands/index.js +1 -0
  22. package/dist/modules/sales/commands/index.js.map +2 -2
  23. package/dist/modules/sales/commands/returns.js +467 -0
  24. package/dist/modules/sales/commands/returns.js.map +7 -0
  25. package/dist/modules/sales/components/documents/ReturnDialog.js +176 -0
  26. package/dist/modules/sales/components/documents/ReturnDialog.js.map +7 -0
  27. package/dist/modules/sales/components/documents/ReturnsSection.js +188 -0
  28. package/dist/modules/sales/components/documents/ReturnsSection.js.map +7 -0
  29. package/dist/modules/sales/data/entities.js +115 -1
  30. package/dist/modules/sales/data/entities.js.map +2 -2
  31. package/dist/modules/sales/data/validators.js +13 -0
  32. package/dist/modules/sales/data/validators.js.map +2 -2
  33. package/dist/modules/sales/events.js +4 -0
  34. package/dist/modules/sales/events.js.map +2 -2
  35. package/dist/modules/sales/lib/calculations.js +7 -0
  36. package/dist/modules/sales/lib/calculations.js.map +2 -2
  37. package/dist/modules/sales/lib/dictionaries.js +1 -0
  38. package/dist/modules/sales/lib/dictionaries.js.map +2 -2
  39. package/dist/modules/sales/lib/documentNumberTokens.js +2 -0
  40. package/dist/modules/sales/lib/documentNumberTokens.js.map +2 -2
  41. package/dist/modules/sales/lib/historyHelpers.js +15 -7
  42. package/dist/modules/sales/lib/historyHelpers.js.map +2 -2
  43. package/dist/modules/sales/lib/makeSalesLineRoute.js +42 -37
  44. package/dist/modules/sales/lib/makeSalesLineRoute.js.map +2 -2
  45. package/dist/modules/sales/migrations/Migration20260309073310.js +23 -0
  46. package/dist/modules/sales/migrations/Migration20260309073310.js.map +7 -0
  47. package/dist/modules/sales/services/salesDocumentNumberGenerator.js +8 -6
  48. package/dist/modules/sales/services/salesDocumentNumberGenerator.js.map +2 -2
  49. package/dist/modules/sales/setup.js +1 -1
  50. package/dist/modules/sales/setup.js.map +2 -2
  51. package/dist/modules/sales/widgets/injection/document-history/widget.client.js +25 -16
  52. package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
  53. package/generated/entities/sales_return/index.ts +14 -0
  54. package/generated/entities/sales_return_line/index.ts +13 -0
  55. package/generated/entities.ids.generated.ts +2 -0
  56. package/generated/entity-fields-registry.ts +4 -0
  57. package/package.json +3 -3
  58. package/src/modules/sales/AGENTS.md +1 -0
  59. package/src/modules/sales/acl.ts +2 -0
  60. package/src/modules/sales/api/document-history/route.ts +25 -1
  61. package/src/modules/sales/api/documents/factory.ts +35 -0
  62. package/src/modules/sales/api/returns/[id]/route.ts +156 -0
  63. package/src/modules/sales/api/returns/route.ts +171 -0
  64. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +18 -0
  65. package/src/modules/sales/commands/index.ts +1 -0
  66. package/src/modules/sales/commands/returns.ts +540 -0
  67. package/src/modules/sales/components/documents/ReturnDialog.tsx +216 -0
  68. package/src/modules/sales/components/documents/ReturnsSection.tsx +270 -0
  69. package/src/modules/sales/data/entities.ts +99 -3
  70. package/src/modules/sales/data/validators.ts +16 -0
  71. package/src/modules/sales/events.ts +5 -0
  72. package/src/modules/sales/i18n/de.json +32 -0
  73. package/src/modules/sales/i18n/en.json +32 -0
  74. package/src/modules/sales/i18n/es.json +32 -0
  75. package/src/modules/sales/i18n/pl.json +32 -0
  76. package/src/modules/sales/lib/calculations.ts +9 -0
  77. package/src/modules/sales/lib/dictionaries.ts +1 -0
  78. package/src/modules/sales/lib/documentNumberTokens.ts +2 -1
  79. package/src/modules/sales/lib/historyHelpers.ts +20 -9
  80. package/src/modules/sales/lib/makeSalesLineRoute.ts +42 -37
  81. package/src/modules/sales/migrations/.snapshot-open-mercato.json +398 -0
  82. package/src/modules/sales/migrations/Migration20260309073310.ts +26 -0
  83. package/src/modules/sales/services/salesDocumentNumberGenerator.ts +15 -4
  84. package/src/modules/sales/setup.ts +1 -1
  85. package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +26 -17
@@ -3526,6 +3526,198 @@
3526
3526
  },
3527
3527
  "nativeEnums": {}
3528
3528
  },
3529
+ {
3530
+ "columns": {
3531
+ "id": {
3532
+ "name": "id",
3533
+ "type": "uuid",
3534
+ "unsigned": false,
3535
+ "autoincrement": false,
3536
+ "primary": false,
3537
+ "nullable": false,
3538
+ "default": "gen_random_uuid()",
3539
+ "mappedType": "uuid"
3540
+ },
3541
+ "order_id": {
3542
+ "name": "order_id",
3543
+ "type": "uuid",
3544
+ "unsigned": false,
3545
+ "autoincrement": false,
3546
+ "primary": false,
3547
+ "nullable": false,
3548
+ "mappedType": "uuid"
3549
+ },
3550
+ "organization_id": {
3551
+ "name": "organization_id",
3552
+ "type": "uuid",
3553
+ "unsigned": false,
3554
+ "autoincrement": false,
3555
+ "primary": false,
3556
+ "nullable": false,
3557
+ "mappedType": "uuid"
3558
+ },
3559
+ "tenant_id": {
3560
+ "name": "tenant_id",
3561
+ "type": "uuid",
3562
+ "unsigned": false,
3563
+ "autoincrement": false,
3564
+ "primary": false,
3565
+ "nullable": false,
3566
+ "mappedType": "uuid"
3567
+ },
3568
+ "return_number": {
3569
+ "name": "return_number",
3570
+ "type": "text",
3571
+ "unsigned": false,
3572
+ "autoincrement": false,
3573
+ "primary": false,
3574
+ "nullable": false,
3575
+ "mappedType": "text"
3576
+ },
3577
+ "status_entry_id": {
3578
+ "name": "status_entry_id",
3579
+ "type": "uuid",
3580
+ "unsigned": false,
3581
+ "autoincrement": false,
3582
+ "primary": false,
3583
+ "nullable": true,
3584
+ "mappedType": "uuid"
3585
+ },
3586
+ "status": {
3587
+ "name": "status",
3588
+ "type": "text",
3589
+ "unsigned": false,
3590
+ "autoincrement": false,
3591
+ "primary": false,
3592
+ "nullable": true,
3593
+ "mappedType": "text"
3594
+ },
3595
+ "reason": {
3596
+ "name": "reason",
3597
+ "type": "text",
3598
+ "unsigned": false,
3599
+ "autoincrement": false,
3600
+ "primary": false,
3601
+ "nullable": true,
3602
+ "mappedType": "text"
3603
+ },
3604
+ "notes": {
3605
+ "name": "notes",
3606
+ "type": "text",
3607
+ "unsigned": false,
3608
+ "autoincrement": false,
3609
+ "primary": false,
3610
+ "nullable": true,
3611
+ "mappedType": "text"
3612
+ },
3613
+ "returned_at": {
3614
+ "name": "returned_at",
3615
+ "type": "timestamptz",
3616
+ "unsigned": false,
3617
+ "autoincrement": false,
3618
+ "primary": false,
3619
+ "nullable": true,
3620
+ "length": 6,
3621
+ "mappedType": "datetime"
3622
+ },
3623
+ "created_at": {
3624
+ "name": "created_at",
3625
+ "type": "timestamptz",
3626
+ "unsigned": false,
3627
+ "autoincrement": false,
3628
+ "primary": false,
3629
+ "nullable": false,
3630
+ "length": 6,
3631
+ "mappedType": "datetime"
3632
+ },
3633
+ "updated_at": {
3634
+ "name": "updated_at",
3635
+ "type": "timestamptz",
3636
+ "unsigned": false,
3637
+ "autoincrement": false,
3638
+ "primary": false,
3639
+ "nullable": false,
3640
+ "length": 6,
3641
+ "mappedType": "datetime"
3642
+ },
3643
+ "deleted_at": {
3644
+ "name": "deleted_at",
3645
+ "type": "timestamptz",
3646
+ "unsigned": false,
3647
+ "autoincrement": false,
3648
+ "primary": false,
3649
+ "nullable": true,
3650
+ "length": 6,
3651
+ "mappedType": "datetime"
3652
+ }
3653
+ },
3654
+ "name": "sales_returns",
3655
+ "schema": "public",
3656
+ "indexes": [
3657
+ {
3658
+ "keyName": "sales_returns_status_idx",
3659
+ "columnNames": [
3660
+ "organization_id",
3661
+ "tenant_id",
3662
+ "status"
3663
+ ],
3664
+ "composite": true,
3665
+ "constraint": false,
3666
+ "primary": false,
3667
+ "unique": false
3668
+ },
3669
+ {
3670
+ "keyName": "sales_returns_scope_idx",
3671
+ "columnNames": [
3672
+ "order_id",
3673
+ "organization_id",
3674
+ "tenant_id"
3675
+ ],
3676
+ "composite": true,
3677
+ "constraint": false,
3678
+ "primary": false,
3679
+ "unique": false
3680
+ },
3681
+ {
3682
+ "keyName": "sales_returns_number_unique",
3683
+ "columnNames": [
3684
+ "organization_id",
3685
+ "tenant_id",
3686
+ "return_number"
3687
+ ],
3688
+ "composite": true,
3689
+ "constraint": true,
3690
+ "primary": false,
3691
+ "unique": true
3692
+ },
3693
+ {
3694
+ "keyName": "sales_returns_pkey",
3695
+ "columnNames": [
3696
+ "id"
3697
+ ],
3698
+ "composite": false,
3699
+ "constraint": true,
3700
+ "primary": true,
3701
+ "unique": true
3702
+ }
3703
+ ],
3704
+ "checks": [],
3705
+ "foreignKeys": {
3706
+ "sales_returns_order_id_foreign": {
3707
+ "constraintName": "sales_returns_order_id_foreign",
3708
+ "columnNames": [
3709
+ "order_id"
3710
+ ],
3711
+ "localTableName": "public.sales_returns",
3712
+ "referencedColumnNames": [
3713
+ "id"
3714
+ ],
3715
+ "referencedTableName": "public.sales_orders",
3716
+ "updateRule": "cascade"
3717
+ }
3718
+ },
3719
+ "nativeEnums": {}
3720
+ },
3529
3721
  {
3530
3722
  "columns": {
3531
3723
  "id": {
@@ -4388,6 +4580,212 @@
4388
4580
  },
4389
4581
  "nativeEnums": {}
4390
4582
  },
4583
+ {
4584
+ "columns": {
4585
+ "id": {
4586
+ "name": "id",
4587
+ "type": "uuid",
4588
+ "unsigned": false,
4589
+ "autoincrement": false,
4590
+ "primary": false,
4591
+ "nullable": false,
4592
+ "default": "gen_random_uuid()",
4593
+ "mappedType": "uuid"
4594
+ },
4595
+ "return_id": {
4596
+ "name": "return_id",
4597
+ "type": "uuid",
4598
+ "unsigned": false,
4599
+ "autoincrement": false,
4600
+ "primary": false,
4601
+ "nullable": false,
4602
+ "mappedType": "uuid"
4603
+ },
4604
+ "order_line_id": {
4605
+ "name": "order_line_id",
4606
+ "type": "uuid",
4607
+ "unsigned": false,
4608
+ "autoincrement": false,
4609
+ "primary": false,
4610
+ "nullable": false,
4611
+ "mappedType": "uuid"
4612
+ },
4613
+ "organization_id": {
4614
+ "name": "organization_id",
4615
+ "type": "uuid",
4616
+ "unsigned": false,
4617
+ "autoincrement": false,
4618
+ "primary": false,
4619
+ "nullable": false,
4620
+ "mappedType": "uuid"
4621
+ },
4622
+ "tenant_id": {
4623
+ "name": "tenant_id",
4624
+ "type": "uuid",
4625
+ "unsigned": false,
4626
+ "autoincrement": false,
4627
+ "primary": false,
4628
+ "nullable": false,
4629
+ "mappedType": "uuid"
4630
+ },
4631
+ "quantity_returned": {
4632
+ "name": "quantity_returned",
4633
+ "type": "numeric(18,4)",
4634
+ "unsigned": false,
4635
+ "autoincrement": false,
4636
+ "primary": false,
4637
+ "nullable": false,
4638
+ "precision": 18,
4639
+ "scale": 4,
4640
+ "default": "'0'",
4641
+ "mappedType": "decimal"
4642
+ },
4643
+ "unit_price_net": {
4644
+ "name": "unit_price_net",
4645
+ "type": "numeric(18,4)",
4646
+ "unsigned": false,
4647
+ "autoincrement": false,
4648
+ "primary": false,
4649
+ "nullable": false,
4650
+ "precision": 18,
4651
+ "scale": 4,
4652
+ "default": "'0'",
4653
+ "mappedType": "decimal"
4654
+ },
4655
+ "unit_price_gross": {
4656
+ "name": "unit_price_gross",
4657
+ "type": "numeric(18,4)",
4658
+ "unsigned": false,
4659
+ "autoincrement": false,
4660
+ "primary": false,
4661
+ "nullable": false,
4662
+ "precision": 18,
4663
+ "scale": 4,
4664
+ "default": "'0'",
4665
+ "mappedType": "decimal"
4666
+ },
4667
+ "total_net_amount": {
4668
+ "name": "total_net_amount",
4669
+ "type": "numeric(18,4)",
4670
+ "unsigned": false,
4671
+ "autoincrement": false,
4672
+ "primary": false,
4673
+ "nullable": false,
4674
+ "precision": 18,
4675
+ "scale": 4,
4676
+ "default": "'0'",
4677
+ "mappedType": "decimal"
4678
+ },
4679
+ "total_gross_amount": {
4680
+ "name": "total_gross_amount",
4681
+ "type": "numeric(18,4)",
4682
+ "unsigned": false,
4683
+ "autoincrement": false,
4684
+ "primary": false,
4685
+ "nullable": false,
4686
+ "precision": 18,
4687
+ "scale": 4,
4688
+ "default": "'0'",
4689
+ "mappedType": "decimal"
4690
+ },
4691
+ "created_at": {
4692
+ "name": "created_at",
4693
+ "type": "timestamptz",
4694
+ "unsigned": false,
4695
+ "autoincrement": false,
4696
+ "primary": false,
4697
+ "nullable": false,
4698
+ "length": 6,
4699
+ "mappedType": "datetime"
4700
+ },
4701
+ "updated_at": {
4702
+ "name": "updated_at",
4703
+ "type": "timestamptz",
4704
+ "unsigned": false,
4705
+ "autoincrement": false,
4706
+ "primary": false,
4707
+ "nullable": false,
4708
+ "length": 6,
4709
+ "mappedType": "datetime"
4710
+ },
4711
+ "deleted_at": {
4712
+ "name": "deleted_at",
4713
+ "type": "timestamptz",
4714
+ "unsigned": false,
4715
+ "autoincrement": false,
4716
+ "primary": false,
4717
+ "nullable": true,
4718
+ "length": 6,
4719
+ "mappedType": "datetime"
4720
+ }
4721
+ },
4722
+ "name": "sales_return_lines",
4723
+ "schema": "public",
4724
+ "indexes": [
4725
+ {
4726
+ "keyName": "sales_return_lines_order_line_idx",
4727
+ "columnNames": [
4728
+ "order_line_id",
4729
+ "organization_id",
4730
+ "tenant_id"
4731
+ ],
4732
+ "composite": true,
4733
+ "constraint": false,
4734
+ "primary": false,
4735
+ "unique": false
4736
+ },
4737
+ {
4738
+ "keyName": "sales_return_lines_return_idx",
4739
+ "columnNames": [
4740
+ "return_id",
4741
+ "organization_id",
4742
+ "tenant_id"
4743
+ ],
4744
+ "composite": true,
4745
+ "constraint": false,
4746
+ "primary": false,
4747
+ "unique": false
4748
+ },
4749
+ {
4750
+ "keyName": "sales_return_lines_pkey",
4751
+ "columnNames": [
4752
+ "id"
4753
+ ],
4754
+ "composite": false,
4755
+ "constraint": true,
4756
+ "primary": true,
4757
+ "unique": true
4758
+ }
4759
+ ],
4760
+ "checks": [],
4761
+ "foreignKeys": {
4762
+ "sales_return_lines_return_id_foreign": {
4763
+ "constraintName": "sales_return_lines_return_id_foreign",
4764
+ "columnNames": [
4765
+ "return_id"
4766
+ ],
4767
+ "localTableName": "public.sales_return_lines",
4768
+ "referencedColumnNames": [
4769
+ "id"
4770
+ ],
4771
+ "referencedTableName": "public.sales_returns",
4772
+ "updateRule": "cascade"
4773
+ },
4774
+ "sales_return_lines_order_line_id_foreign": {
4775
+ "constraintName": "sales_return_lines_order_line_id_foreign",
4776
+ "columnNames": [
4777
+ "order_line_id"
4778
+ ],
4779
+ "localTableName": "public.sales_return_lines",
4780
+ "referencedColumnNames": [
4781
+ "id"
4782
+ ],
4783
+ "referencedTableName": "public.sales_order_lines",
4784
+ "updateRule": "cascade"
4785
+ }
4786
+ },
4787
+ "nativeEnums": {}
4788
+ },
4391
4789
  {
4392
4790
  "columns": {
4393
4791
  "id": {
@@ -0,0 +1,26 @@
1
+ import { Migration } from '@mikro-orm/migrations';
2
+
3
+ export class Migration20260309073310 extends Migration {
4
+
5
+ override async up(): Promise<void> {
6
+ this.addSql(`create table "sales_returns" ("id" uuid not null default gen_random_uuid(), "order_id" uuid not null, "organization_id" uuid not null, "tenant_id" uuid not null, "return_number" text not null, "status_entry_id" uuid null, "status" text null, "reason" text null, "notes" text null, "returned_at" timestamptz null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "sales_returns_pkey" primary key ("id"));`);
7
+ this.addSql(`create index "sales_returns_status_idx" on "sales_returns" ("organization_id", "tenant_id", "status");`);
8
+ this.addSql(`create index "sales_returns_scope_idx" on "sales_returns" ("order_id", "organization_id", "tenant_id");`);
9
+ this.addSql(`alter table "sales_returns" add constraint "sales_returns_number_unique" unique ("organization_id", "tenant_id", "return_number");`);
10
+
11
+ this.addSql(`create table "sales_return_lines" ("id" uuid not null default gen_random_uuid(), "return_id" uuid not null, "order_line_id" uuid not null, "organization_id" uuid not null, "tenant_id" uuid not null, "quantity_returned" numeric(18,4) not null default '0', "unit_price_net" numeric(18,4) not null default '0', "unit_price_gross" numeric(18,4) not null default '0', "total_net_amount" numeric(18,4) not null default '0', "total_gross_amount" numeric(18,4) not null default '0', "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "sales_return_lines_pkey" primary key ("id"));`);
12
+ this.addSql(`create index "sales_return_lines_order_line_idx" on "sales_return_lines" ("order_line_id", "organization_id", "tenant_id");`);
13
+ this.addSql(`create index "sales_return_lines_return_idx" on "sales_return_lines" ("return_id", "organization_id", "tenant_id");`);
14
+
15
+ this.addSql(`alter table "sales_returns" add constraint "sales_returns_order_id_foreign" foreign key ("order_id") references "sales_orders" ("id") on update cascade;`);
16
+
17
+ this.addSql(`alter table "sales_return_lines" add constraint "sales_return_lines_return_id_foreign" foreign key ("return_id") references "sales_returns" ("id") on update cascade;`);
18
+ this.addSql(`alter table "sales_return_lines" add constraint "sales_return_lines_order_line_id_foreign" foreign key ("order_line_id") references "sales_order_lines" ("id") on update cascade;`);
19
+ }
20
+
21
+ override async down(): Promise<void> {
22
+ this.addSql(`drop table if exists "sales_return_lines" cascade;`);
23
+ this.addSql(`drop table if exists "sales_returns" cascade;`);
24
+ }
25
+
26
+ }
@@ -4,6 +4,7 @@ import { SalesDocumentSequence, SalesSettings } from '../data/entities'
4
4
  import {
5
5
  DEFAULT_ORDER_NUMBER_FORMAT,
6
6
  DEFAULT_QUOTE_NUMBER_FORMAT,
7
+ DEFAULT_RETURN_NUMBER_FORMAT,
7
8
  type SalesDocumentNumberKind,
8
9
  } from '../lib/documentNumberTokens'
9
10
 
@@ -25,6 +26,7 @@ type SettingsSnapshot = {
25
26
  type SequenceSnapshot = {
26
27
  order: number
27
28
  quote: number
29
+ return: number
28
30
  }
29
31
 
30
32
  const MAX_SEQUENCE = 1_000_000_000
@@ -68,11 +70,12 @@ export class SalesDocumentNumberGenerator {
68
70
  }
69
71
 
70
72
  async peekSequences(scope: Scope): Promise<SequenceSnapshot> {
71
- const [order, quote] = await Promise.all([
73
+ const [order, quote, salesReturn] = await Promise.all([
72
74
  this.peekNextSequence('order', scope),
73
75
  this.peekNextSequence('quote', scope),
76
+ this.peekNextSequence('return', scope),
74
77
  ])
75
- return { order, quote }
78
+ return { order, quote, return: salesReturn }
76
79
  }
77
80
 
78
81
  async setNextSequence(kind: SalesDocumentNumberKind, scope: Scope, nextValue: number): Promise<void> {
@@ -93,7 +96,11 @@ export class SalesDocumentNumberGenerator {
93
96
  const settings = await this.getSettings(params)
94
97
  const format =
95
98
  params.format?.trim() ||
96
- (params.kind === 'order' ? settings.orderNumberFormat : settings.quoteNumberFormat)
99
+ (params.kind === 'order'
100
+ ? settings.orderNumberFormat
101
+ : params.kind === 'quote'
102
+ ? settings.quoteNumberFormat
103
+ : DEFAULT_RETURN_NUMBER_FORMAT)
97
104
  const sequence = await this.claimSequence(params.kind, params)
98
105
  const number = this.formatNumber(format, {
99
106
  kind: params.kind,
@@ -138,7 +145,11 @@ export class SalesDocumentNumberGenerator {
138
145
  ): string {
139
146
  const source =
140
147
  template?.trim() ||
141
- (context.kind === 'order' ? DEFAULT_ORDER_NUMBER_FORMAT : DEFAULT_QUOTE_NUMBER_FORMAT)
148
+ (context.kind === 'order'
149
+ ? DEFAULT_ORDER_NUMBER_FORMAT
150
+ : context.kind === 'quote'
151
+ ? DEFAULT_QUOTE_NUMBER_FORMAT
152
+ : DEFAULT_RETURN_NUMBER_FORMAT)
142
153
  const now = context.date
143
154
  return source.replace(/\{([a-zA-Z]+)(?::([^}]+))?\}/g, (match, rawToken, rawArg) => {
144
155
  const token = rawToken.toLowerCase()
@@ -67,7 +67,7 @@ export const setup: ModuleSetupConfig = {
67
67
  )
68
68
  }
69
69
 
70
- for (const kind of ['order', 'quote'] as const) {
70
+ for (const kind of ['order', 'quote', 'return'] as const) {
71
71
  const seq = await em.findOne(SalesDocumentSequence, {
72
72
  tenantId,
73
73
  organizationId,
@@ -258,24 +258,33 @@ export const DocumentHistoryWidget: React.FC<InjectionWidgetComponentProps<unkno
258
258
  const [filter, setFilter] = React.useState<FilterKind>('all')
259
259
 
260
260
  React.useEffect(() => {
261
- apiCall<{ items?: unknown[] }>('/api/sales/order-statuses?pageSize=100')
262
- .then((res) => {
263
- if (res.ok && Array.isArray(res.result?.items)) {
264
- const map: Record<string, StatusOption> = {}
265
- for (const item of res.result.items) {
266
- if (!item || typeof item !== 'object') continue
267
- const d = item as Record<string, unknown>
268
- const value = typeof d.value === 'string' ? d.value : null
269
- if (!value) continue
270
- map[value] = {
271
- value,
272
- label: typeof d.label === 'string' && d.label.length ? d.label : value,
273
- color: typeof d.color === 'string' && d.color.length ? d.color : null,
274
- icon: typeof d.icon === 'string' && d.icon.length ? d.icon : null,
275
- }
276
- }
277
- setStatusMap(map)
261
+ const urls = [
262
+ '/api/sales/order-statuses?pageSize=100',
263
+ '/api/sales/shipment-statuses?pageSize=100',
264
+ '/api/sales/payment-statuses?pageSize=100',
265
+ ]
266
+ const map: Record<string, StatusOption> = {}
267
+ const merge = (items: unknown[]) => {
268
+ if (!Array.isArray(items)) return
269
+ for (const item of items) {
270
+ if (!item || typeof item !== 'object') continue
271
+ const d = item as Record<string, unknown>
272
+ const value = typeof d.value === 'string' ? d.value : null
273
+ if (!value) continue
274
+ map[value] = {
275
+ value,
276
+ label: typeof d.label === 'string' && d.label.length ? d.label : value,
277
+ color: typeof d.color === 'string' && d.color.length ? d.color : null,
278
+ icon: typeof d.icon === 'string' && d.icon.length ? d.icon : null,
279
+ }
280
+ }
281
+ }
282
+ Promise.all(urls.map((url) => apiCall<{ items?: unknown[] }>(url)))
283
+ .then((responses) => {
284
+ for (const res of responses) {
285
+ if (res.ok && Array.isArray(res.result?.items)) merge(res.result.items)
278
286
  }
287
+ setStatusMap(map)
279
288
  })
280
289
  .catch(() => {})
281
290
  }, [])