shutro-erp 0.3.0 → 0.3.2

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 (137) hide show
  1. package/README.md +58 -58
  2. package/dist/account_portal/.kosh/bindings.js +1 -1
  3. package/dist/account_portal/.kosh/schema.d.ts +31 -1
  4. package/dist/account_portal/index.js +3 -2
  5. package/dist/accounting/.kosh/bindings.js +1 -1
  6. package/dist/accounting/.kosh/schema.d.ts +31 -1
  7. package/dist/accounting/index.js +4 -0
  8. package/dist/assistant/routes.js +1 -1
  9. package/dist/automation/engine.js +1 -1
  10. package/dist/automation/web/messages.js +2 -2
  11. package/dist/cli/apps.d.ts +1 -1
  12. package/dist/cli/apps.js +14 -14
  13. package/dist/cli/bin.js +3 -0
  14. package/dist/cli/index.js +11 -11
  15. package/dist/cli/init.d.ts +1 -1
  16. package/dist/cli/init.js +60 -36
  17. package/dist/cli/launch.js +10 -7
  18. package/dist/cli/project.d.ts +7 -7
  19. package/dist/cli/project.js +25 -25
  20. package/dist/cli/prompt.js +2 -2
  21. package/dist/cli/templates.d.ts +3 -3
  22. package/dist/cli/templates.js +33 -28
  23. package/dist/cli/ui.d.ts +1 -8
  24. package/dist/cli/ui.js +36 -12
  25. package/dist/contacts/.kosh/bindings.js +1 -1
  26. package/dist/contacts/.kosh/schema.d.ts +31 -1
  27. package/dist/integrations/inbound.d.ts +36 -0
  28. package/dist/integrations/inbound.js +171 -0
  29. package/dist/integrations/index.d.ts +18 -0
  30. package/dist/integrations/index.js +400 -0
  31. package/dist/integrations/models.d.ts +6 -0
  32. package/dist/integrations/models.js +119 -0
  33. package/dist/integrations/web/DeliveryTools.d.ts +4 -0
  34. package/dist/integrations/web/DeliveryTools.js +15 -0
  35. package/dist/integrations/web/EndpointTools.d.ts +7 -0
  36. package/dist/integrations/web/EndpointTools.js +25 -0
  37. package/dist/integrations/web/InboundTools.d.ts +4 -0
  38. package/dist/integrations/web/InboundTools.js +15 -0
  39. package/dist/integrations/web/WebhookTools.d.ts +7 -0
  40. package/dist/integrations/web/WebhookTools.js +25 -0
  41. package/dist/integrations/web/index.d.ts +16 -0
  42. package/dist/integrations/web/index.js +27 -0
  43. package/dist/integrations/web/messages.d.ts +2 -0
  44. package/dist/integrations/web/messages.js +53 -0
  45. package/dist/integrations/webhooks.d.ts +63 -0
  46. package/dist/integrations/webhooks.js +217 -0
  47. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  48. package/dist/l10n_bd/.kosh/schema.d.ts +31 -1
  49. package/dist/l10n_in/.kosh/bindings.js +1 -1
  50. package/dist/l10n_in/.kosh/schema.d.ts +31 -1
  51. package/dist/l10n_in/einvoice.js +1 -1
  52. package/dist/l10n_in/web/messages.js +2 -2
  53. package/dist/mail/index.js +2 -2
  54. package/dist/modules-sdk/index.d.ts +1 -1
  55. package/dist/modules-sdk/loader.js +2 -2
  56. package/dist/modules-sdk/manifest.d.ts +48 -0
  57. package/dist/notify/messages.js +3 -3
  58. package/dist/notify/routes.js +1 -1
  59. package/dist/notify/web/messages.js +1 -1
  60. package/dist/payment/.kosh/bindings.d.ts +22 -0
  61. package/dist/payment/.kosh/bindings.js +15 -0
  62. package/dist/payment/.kosh/schema.d.ts +1553 -0
  63. package/dist/payment/index.d.ts +34 -0
  64. package/dist/payment/index.js +375 -0
  65. package/dist/payment/module.d.ts +6853 -0
  66. package/dist/payment/module.js +74 -0
  67. package/dist/payment/providers.d.ts +64 -0
  68. package/dist/payment/providers.js +77 -0
  69. package/dist/payment/settle.d.ts +11 -0
  70. package/dist/payment/settle.js +59 -0
  71. package/dist/payment/sslcommerz.d.ts +12 -0
  72. package/dist/payment/sslcommerz.js +185 -0
  73. package/dist/portal/.kosh/bindings.js +1 -1
  74. package/dist/portal/.kosh/schema.d.ts +31 -1
  75. package/dist/portal/routes-documents.js +5 -0
  76. package/dist/product/.kosh/bindings.js +1 -1
  77. package/dist/product/.kosh/schema.d.ts +31 -1
  78. package/dist/project/.kosh/bindings.js +1 -1
  79. package/dist/project/.kosh/schema.d.ts +31 -1
  80. package/dist/project_portal/.kosh/bindings.js +1 -1
  81. package/dist/project_portal/.kosh/schema.d.ts +31 -1
  82. package/dist/purchase/.kosh/bindings.js +1 -1
  83. package/dist/purchase/.kosh/schema.d.ts +31 -1
  84. package/dist/purchase_account/.kosh/bindings.js +1 -1
  85. package/dist/purchase_account/.kosh/schema.d.ts +31 -1
  86. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  87. package/dist/purchase_portal/.kosh/schema.d.ts +31 -1
  88. package/dist/sale_account/.kosh/bindings.js +1 -1
  89. package/dist/sale_account/.kosh/schema.d.ts +31 -1
  90. package/dist/sale_portal/.kosh/bindings.js +1 -1
  91. package/dist/sale_portal/.kosh/schema.d.ts +31 -1
  92. package/dist/sale_project/.kosh/bindings.js +1 -1
  93. package/dist/sale_project/.kosh/schema.d.ts +31 -1
  94. package/dist/sales/.kosh/bindings.js +1 -1
  95. package/dist/sales/.kosh/schema.d.ts +31 -1
  96. package/dist/sales/index.js +2 -0
  97. package/dist/server/api/client.js +1 -1
  98. package/dist/server/api/openapi.js +17 -1
  99. package/dist/server/api/rest.d.ts +6 -1
  100. package/dist/server/api/rest.js +11 -0
  101. package/dist/server/apps.js +5 -5
  102. package/dist/server/auth/api-keys.d.ts +13 -0
  103. package/dist/server/auth/api-keys.js +65 -0
  104. package/dist/server/auth/base.js +24 -0
  105. package/dist/server/auth/crypto.js +1 -1
  106. package/dist/server/auth/scopes.d.ts +12 -0
  107. package/dist/server/auth/scopes.js +51 -0
  108. package/dist/server/auth/service.d.ts +57 -1
  109. package/dist/server/auth/service.js +229 -5
  110. package/dist/server/demo.d.ts +1 -1
  111. package/dist/server/demo.js +1 -1
  112. package/dist/server/env-names.d.ts +2 -0
  113. package/dist/server/env-names.js +16 -0
  114. package/dist/server/host.js +5 -1
  115. package/dist/server/identity.d.ts +7 -0
  116. package/dist/server/index.d.ts +2 -1
  117. package/dist/server/index.js +2 -1
  118. package/dist/server/registry.js +1 -1
  119. package/dist/server/server.d.ts +5 -0
  120. package/dist/server/server.js +45 -5
  121. package/dist/settings/routes.js +1 -1
  122. package/dist/settings/web/ApiKeysPage.d.ts +8 -0
  123. package/dist/settings/web/ApiKeysPage.js +70 -0
  124. package/dist/settings/web/index.d.ts +1 -0
  125. package/dist/settings/web/index.js +4 -0
  126. package/dist/settings/web/messages.js +62 -0
  127. package/dist/storage/routes.js +1 -1
  128. package/dist/studio/build.js +1 -1
  129. package/dist/studio/generate.js +4 -4
  130. package/dist/studio/module.js +5 -5
  131. package/dist/studio/web/messages.js +2 -2
  132. package/dist/ui/app.js +26 -3
  133. package/dist/ui/i18n/messages.js +2 -2
  134. package/dist/ui/pwa/worker.js +2 -2
  135. package/dist/ui/registry.d.ts +15 -0
  136. package/dist/ui/registry.js +20 -0
  137. package/package.json +15 -3
@@ -1,10 +1,11 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 1aabc867063cb52e
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 8538c294f98318cd
2
2
  // Schema view of module `project` (RFC 0002 §7.7): the models it owns or depends on, with the extensions it can see.
3
3
  import type { F } from '../../server/orm.js';
4
4
 
5
5
  /** Model name → model type (RFC 0002 §7.7). */
6
6
  export interface SchemaView {
7
7
  readonly 'audit.event': AuditEvent;
8
+ readonly 'auth.api_key': AuthApiKey;
8
9
  readonly 'auth.credential': AuthCredential;
9
10
  readonly 'auth.session': AuthSession;
10
11
  readonly 'auth.user_grant': AuthUserGrant;
@@ -54,6 +55,34 @@ export interface AuditEvent {
54
55
  export interface AuditEventMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'audit.event'> {
55
56
  }
56
57
 
58
+ /** `auth.api_key` (owner: base). */
59
+ export interface AuthApiKey {
60
+ readonly name: 'auth.api_key';
61
+ readonly fields: {
62
+ readonly id: F.Id<'auth.api_key'>;
63
+ readonly createdAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
64
+ readonly updatedAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
65
+ readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
66
+ readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
67
+ readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
68
+ readonly name: F.Char<{ readonly required: true }>;
69
+ readonly user: F.Many2one<'res.users', { readonly required: true }>;
70
+ readonly tokenHash: F.Char<{ readonly required: true }>;
71
+ readonly prefix: F.Char<{ readonly required: true }>;
72
+ readonly scopes: F.Text<{ readonly required: true }>;
73
+ readonly expiresAt: F.Datetime<{ readonly required: true }>;
74
+ readonly lastUsedAt: F.Datetime;
75
+ readonly lastUsedIp: F.Char;
76
+ readonly revoked: F.Bool<{ readonly required: true; readonly default: true }>;
77
+ readonly issuedBy: F.Many2one<'res.users'>;
78
+ };
79
+ readonly methods: AuthApiKeyMethods;
80
+ }
81
+
82
+ /** Methods of `auth.api_key`: declared ones and transitions. */
83
+ export interface AuthApiKeyMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'auth.api_key'> {
84
+ }
85
+
57
86
  /** `auth.credential` (owner: base). */
58
87
  export interface AuthCredential {
59
88
  readonly name: 'auth.credential';
@@ -560,6 +589,7 @@ export interface ResUsers {
560
589
  readonly companies: F.Many2many<'res.company', { readonly required: true }>;
561
590
  readonly lang: F.Char<{ readonly default: true }>;
562
591
  readonly tz: F.Char<{ readonly default: true }>;
592
+ readonly isService: F.Bool<{ readonly required: true; readonly default: true }>;
563
593
  };
564
594
  readonly methods: ResUsersMethods;
565
595
  }
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: b801d3f400fa92ad
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 0440c5ae846a11ac
2
2
  // Bindings of module `project_portal`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';
@@ -1,10 +1,11 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: b801d3f400fa92ad
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 0440c5ae846a11ac
2
2
  // Schema view of module `project_portal` (RFC 0002 §7.7): the models it owns or depends on, with the extensions it can see.
3
3
  import type { F } from '../../server/orm.js';
4
4
 
5
5
  /** Model name → model type (RFC 0002 §7.7). */
6
6
  export interface SchemaView {
7
7
  readonly 'audit.event': AuditEvent;
8
+ readonly 'auth.api_key': AuthApiKey;
8
9
  readonly 'auth.credential': AuthCredential;
9
10
  readonly 'auth.session': AuthSession;
10
11
  readonly 'auth.user_grant': AuthUserGrant;
@@ -57,6 +58,34 @@ export interface AuditEvent {
57
58
  export interface AuditEventMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'audit.event'> {
58
59
  }
59
60
 
61
+ /** `auth.api_key` (owner: base). */
62
+ export interface AuthApiKey {
63
+ readonly name: 'auth.api_key';
64
+ readonly fields: {
65
+ readonly id: F.Id<'auth.api_key'>;
66
+ readonly createdAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
67
+ readonly updatedAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
68
+ readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
69
+ readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
70
+ readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
71
+ readonly name: F.Char<{ readonly required: true }>;
72
+ readonly user: F.Many2one<'res.users', { readonly required: true }>;
73
+ readonly tokenHash: F.Char<{ readonly required: true }>;
74
+ readonly prefix: F.Char<{ readonly required: true }>;
75
+ readonly scopes: F.Text<{ readonly required: true }>;
76
+ readonly expiresAt: F.Datetime<{ readonly required: true }>;
77
+ readonly lastUsedAt: F.Datetime;
78
+ readonly lastUsedIp: F.Char;
79
+ readonly revoked: F.Bool<{ readonly required: true; readonly default: true }>;
80
+ readonly issuedBy: F.Many2one<'res.users'>;
81
+ };
82
+ readonly methods: AuthApiKeyMethods;
83
+ }
84
+
85
+ /** Methods of `auth.api_key`: declared ones and transitions. */
86
+ export interface AuthApiKeyMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'auth.api_key'> {
87
+ }
88
+
60
89
  /** `auth.credential` (owner: base). */
61
90
  export interface AuthCredential {
62
91
  readonly name: 'auth.credential';
@@ -636,6 +665,7 @@ export interface ResUsers {
636
665
  readonly companies: F.Many2many<'res.company', { readonly required: true }>;
637
666
  readonly lang: F.Char<{ readonly default: true }>;
638
667
  readonly tz: F.Char<{ readonly default: true }>;
668
+ readonly isService: F.Bool<{ readonly required: true; readonly default: true }>;
639
669
  readonly portalPartner: F.Many2one<'res.partner'>; // portal
640
670
  };
641
671
  readonly methods: ResUsersMethods;
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: d7f70059c723acf9
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: c5ae4567ecbd3b97
2
2
  // Bindings of module `purchase`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: d7f70059c723acf9
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: c5ae4567ecbd3b97
2
2
  // Schema view of module `purchase` (RFC 0002 §7.7): the models it owns or depends on, with the extensions it can see.
3
3
  import type { F } from '../../server/orm.js';
4
4
 
@@ -9,6 +9,7 @@ export interface SchemaView {
9
9
  readonly 'approval.policy': ApprovalPolicy;
10
10
  readonly 'approval.request': ApprovalRequest;
11
11
  readonly 'audit.event': AuditEvent;
12
+ readonly 'auth.api_key': AuthApiKey;
12
13
  readonly 'auth.credential': AuthCredential;
13
14
  readonly 'auth.session': AuthSession;
14
15
  readonly 'auth.user_grant': AuthUserGrant;
@@ -167,6 +168,34 @@ export interface AuditEvent {
167
168
  export interface AuditEventMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'audit.event'> {
168
169
  }
169
170
 
171
+ /** `auth.api_key` (owner: base). */
172
+ export interface AuthApiKey {
173
+ readonly name: 'auth.api_key';
174
+ readonly fields: {
175
+ readonly id: F.Id<'auth.api_key'>;
176
+ readonly createdAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
177
+ readonly updatedAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
178
+ readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
179
+ readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
180
+ readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
181
+ readonly name: F.Char<{ readonly required: true }>;
182
+ readonly user: F.Many2one<'res.users', { readonly required: true }>;
183
+ readonly tokenHash: F.Char<{ readonly required: true }>;
184
+ readonly prefix: F.Char<{ readonly required: true }>;
185
+ readonly scopes: F.Text<{ readonly required: true }>;
186
+ readonly expiresAt: F.Datetime<{ readonly required: true }>;
187
+ readonly lastUsedAt: F.Datetime;
188
+ readonly lastUsedIp: F.Char;
189
+ readonly revoked: F.Bool<{ readonly required: true; readonly default: true }>;
190
+ readonly issuedBy: F.Many2one<'res.users'>;
191
+ };
192
+ readonly methods: AuthApiKeyMethods;
193
+ }
194
+
195
+ /** Methods of `auth.api_key`: declared ones and transitions. */
196
+ export interface AuthApiKeyMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'auth.api_key'> {
197
+ }
198
+
170
199
  /** `auth.credential` (owner: base). */
171
200
  export interface AuthCredential {
172
201
  readonly name: 'auth.credential';
@@ -688,6 +717,7 @@ export interface ResUsers {
688
717
  readonly companies: F.Many2many<'res.company', { readonly required: true }>;
689
718
  readonly lang: F.Char<{ readonly default: true }>;
690
719
  readonly tz: F.Char<{ readonly default: true }>;
720
+ readonly isService: F.Bool<{ readonly required: true; readonly default: true }>;
691
721
  };
692
722
  readonly methods: ResUsersMethods;
693
723
  }
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 3208f1c12068264a
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 81a33d0265524052
2
2
  // Bindings of module `purchase_account`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 3208f1c12068264a
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 81a33d0265524052
2
2
  // Schema view of module `purchase_account` (RFC 0002 §7.7): the models it owns or depends on, with the extensions it can see.
3
3
  import type { F } from '../../server/orm.js';
4
4
 
@@ -22,6 +22,7 @@ export interface SchemaView {
22
22
  readonly 'approval.policy': ApprovalPolicy;
23
23
  readonly 'approval.request': ApprovalRequest;
24
24
  readonly 'audit.event': AuditEvent;
25
+ readonly 'auth.api_key': AuthApiKey;
25
26
  readonly 'auth.credential': AuthCredential;
26
27
  readonly 'auth.session': AuthSession;
27
28
  readonly 'auth.user_grant': AuthUserGrant;
@@ -582,6 +583,34 @@ export interface AuditEvent {
582
583
  export interface AuditEventMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'audit.event'> {
583
584
  }
584
585
 
586
+ /** `auth.api_key` (owner: base). */
587
+ export interface AuthApiKey {
588
+ readonly name: 'auth.api_key';
589
+ readonly fields: {
590
+ readonly id: F.Id<'auth.api_key'>;
591
+ readonly createdAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
592
+ readonly updatedAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
593
+ readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
594
+ readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
595
+ readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
596
+ readonly name: F.Char<{ readonly required: true }>;
597
+ readonly user: F.Many2one<'res.users', { readonly required: true }>;
598
+ readonly tokenHash: F.Char<{ readonly required: true }>;
599
+ readonly prefix: F.Char<{ readonly required: true }>;
600
+ readonly scopes: F.Text<{ readonly required: true }>;
601
+ readonly expiresAt: F.Datetime<{ readonly required: true }>;
602
+ readonly lastUsedAt: F.Datetime;
603
+ readonly lastUsedIp: F.Char;
604
+ readonly revoked: F.Bool<{ readonly required: true; readonly default: true }>;
605
+ readonly issuedBy: F.Many2one<'res.users'>;
606
+ };
607
+ readonly methods: AuthApiKeyMethods;
608
+ }
609
+
610
+ /** Methods of `auth.api_key`: declared ones and transitions. */
611
+ export interface AuthApiKeyMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'auth.api_key'> {
612
+ }
613
+
585
614
  /** `auth.credential` (owner: base). */
586
615
  export interface AuthCredential {
587
616
  readonly name: 'auth.credential';
@@ -1293,6 +1322,7 @@ export interface ResUsers {
1293
1322
  readonly companies: F.Many2many<'res.company', { readonly required: true }>;
1294
1323
  readonly lang: F.Char<{ readonly default: true }>;
1295
1324
  readonly tz: F.Char<{ readonly default: true }>;
1325
+ readonly isService: F.Bool<{ readonly required: true; readonly default: true }>;
1296
1326
  };
1297
1327
  readonly methods: ResUsersMethods;
1298
1328
  }
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 722b2450c4211d64
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 64da9b36804c7c1a
2
2
  // Bindings of module `purchase_portal`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 722b2450c4211d64
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 64da9b36804c7c1a
2
2
  // Schema view of module `purchase_portal` (RFC 0002 §7.7): the models it owns or depends on, with the extensions it can see.
3
3
  import type { F } from '../../server/orm.js';
4
4
 
@@ -9,6 +9,7 @@ export interface SchemaView {
9
9
  readonly 'approval.policy': ApprovalPolicy;
10
10
  readonly 'approval.request': ApprovalRequest;
11
11
  readonly 'audit.event': AuditEvent;
12
+ readonly 'auth.api_key': AuthApiKey;
12
13
  readonly 'auth.credential': AuthCredential;
13
14
  readonly 'auth.session': AuthSession;
14
15
  readonly 'auth.user_grant': AuthUserGrant;
@@ -170,6 +171,34 @@ export interface AuditEvent {
170
171
  export interface AuditEventMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'audit.event'> {
171
172
  }
172
173
 
174
+ /** `auth.api_key` (owner: base). */
175
+ export interface AuthApiKey {
176
+ readonly name: 'auth.api_key';
177
+ readonly fields: {
178
+ readonly id: F.Id<'auth.api_key'>;
179
+ readonly createdAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
180
+ readonly updatedAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
181
+ readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
182
+ readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
183
+ readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
184
+ readonly name: F.Char<{ readonly required: true }>;
185
+ readonly user: F.Many2one<'res.users', { readonly required: true }>;
186
+ readonly tokenHash: F.Char<{ readonly required: true }>;
187
+ readonly prefix: F.Char<{ readonly required: true }>;
188
+ readonly scopes: F.Text<{ readonly required: true }>;
189
+ readonly expiresAt: F.Datetime<{ readonly required: true }>;
190
+ readonly lastUsedAt: F.Datetime;
191
+ readonly lastUsedIp: F.Char;
192
+ readonly revoked: F.Bool<{ readonly required: true; readonly default: true }>;
193
+ readonly issuedBy: F.Many2one<'res.users'>;
194
+ };
195
+ readonly methods: AuthApiKeyMethods;
196
+ }
197
+
198
+ /** Methods of `auth.api_key`: declared ones and transitions. */
199
+ export interface AuthApiKeyMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'auth.api_key'> {
200
+ }
201
+
173
202
  /** `auth.credential` (owner: base). */
174
203
  export interface AuthCredential {
175
204
  readonly name: 'auth.credential';
@@ -764,6 +793,7 @@ export interface ResUsers {
764
793
  readonly companies: F.Many2many<'res.company', { readonly required: true }>;
765
794
  readonly lang: F.Char<{ readonly default: true }>;
766
795
  readonly tz: F.Char<{ readonly default: true }>;
796
+ readonly isService: F.Bool<{ readonly required: true; readonly default: true }>;
767
797
  readonly portalPartner: F.Many2one<'res.partner'>; // portal
768
798
  };
769
799
  readonly methods: ResUsersMethods;
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: dbbbc1f6d027934e
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: e1b93f7adda98b39
2
2
  // Bindings of module `sale_account`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: dbbbc1f6d027934e
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: e1b93f7adda98b39
2
2
  // Schema view of module `sale_account` (RFC 0002 §7.7): the models it owns or depends on, with the extensions it can see.
3
3
  import type { F } from '../../server/orm.js';
4
4
 
@@ -22,6 +22,7 @@ export interface SchemaView {
22
22
  readonly 'approval.policy': ApprovalPolicy;
23
23
  readonly 'approval.request': ApprovalRequest;
24
24
  readonly 'audit.event': AuditEvent;
25
+ readonly 'auth.api_key': AuthApiKey;
25
26
  readonly 'auth.credential': AuthCredential;
26
27
  readonly 'auth.session': AuthSession;
27
28
  readonly 'auth.user_grant': AuthUserGrant;
@@ -582,6 +583,34 @@ export interface AuditEvent {
582
583
  export interface AuditEventMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'audit.event'> {
583
584
  }
584
585
 
586
+ /** `auth.api_key` (owner: base). */
587
+ export interface AuthApiKey {
588
+ readonly name: 'auth.api_key';
589
+ readonly fields: {
590
+ readonly id: F.Id<'auth.api_key'>;
591
+ readonly createdAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
592
+ readonly updatedAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
593
+ readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
594
+ readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
595
+ readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
596
+ readonly name: F.Char<{ readonly required: true }>;
597
+ readonly user: F.Many2one<'res.users', { readonly required: true }>;
598
+ readonly tokenHash: F.Char<{ readonly required: true }>;
599
+ readonly prefix: F.Char<{ readonly required: true }>;
600
+ readonly scopes: F.Text<{ readonly required: true }>;
601
+ readonly expiresAt: F.Datetime<{ readonly required: true }>;
602
+ readonly lastUsedAt: F.Datetime;
603
+ readonly lastUsedIp: F.Char;
604
+ readonly revoked: F.Bool<{ readonly required: true; readonly default: true }>;
605
+ readonly issuedBy: F.Many2one<'res.users'>;
606
+ };
607
+ readonly methods: AuthApiKeyMethods;
608
+ }
609
+
610
+ /** Methods of `auth.api_key`: declared ones and transitions. */
611
+ export interface AuthApiKeyMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'auth.api_key'> {
612
+ }
613
+
585
614
  /** `auth.credential` (owner: base). */
586
615
  export interface AuthCredential {
587
616
  readonly name: 'auth.credential';
@@ -1219,6 +1248,7 @@ export interface ResUsers {
1219
1248
  readonly companies: F.Many2many<'res.company', { readonly required: true }>;
1220
1249
  readonly lang: F.Char<{ readonly default: true }>;
1221
1250
  readonly tz: F.Char<{ readonly default: true }>;
1251
+ readonly isService: F.Bool<{ readonly required: true; readonly default: true }>;
1222
1252
  };
1223
1253
  readonly methods: ResUsersMethods;
1224
1254
  }
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 94aad39e31b4d644
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 5a5c7561d67ef3cf
2
2
  // Bindings of module `sale_portal`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 94aad39e31b4d644
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 5a5c7561d67ef3cf
2
2
  // Schema view of module `sale_portal` (RFC 0002 §7.7): the models it owns or depends on, with the extensions it can see.
3
3
  import type { F } from '../../server/orm.js';
4
4
 
@@ -6,6 +6,7 @@ import type { F } from '../../server/orm.js';
6
6
  export interface SchemaView {
7
7
  readonly 'account.tax': AccountTax;
8
8
  readonly 'audit.event': AuditEvent;
9
+ readonly 'auth.api_key': AuthApiKey;
9
10
  readonly 'auth.credential': AuthCredential;
10
11
  readonly 'auth.session': AuthSession;
11
12
  readonly 'auth.user_grant': AuthUserGrant;
@@ -87,6 +88,34 @@ export interface AuditEvent {
87
88
  export interface AuditEventMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'audit.event'> {
88
89
  }
89
90
 
91
+ /** `auth.api_key` (owner: base). */
92
+ export interface AuthApiKey {
93
+ readonly name: 'auth.api_key';
94
+ readonly fields: {
95
+ readonly id: F.Id<'auth.api_key'>;
96
+ readonly createdAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
97
+ readonly updatedAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
98
+ readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
99
+ readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
100
+ readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
101
+ readonly name: F.Char<{ readonly required: true }>;
102
+ readonly user: F.Many2one<'res.users', { readonly required: true }>;
103
+ readonly tokenHash: F.Char<{ readonly required: true }>;
104
+ readonly prefix: F.Char<{ readonly required: true }>;
105
+ readonly scopes: F.Text<{ readonly required: true }>;
106
+ readonly expiresAt: F.Datetime<{ readonly required: true }>;
107
+ readonly lastUsedAt: F.Datetime;
108
+ readonly lastUsedIp: F.Char;
109
+ readonly revoked: F.Bool<{ readonly required: true; readonly default: true }>;
110
+ readonly issuedBy: F.Many2one<'res.users'>;
111
+ };
112
+ readonly methods: AuthApiKeyMethods;
113
+ }
114
+
115
+ /** Methods of `auth.api_key`: declared ones and transitions. */
116
+ export interface AuthApiKeyMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'auth.api_key'> {
117
+ }
118
+
90
119
  /** `auth.credential` (owner: base). */
91
120
  export interface AuthCredential {
92
121
  readonly name: 'auth.credential';
@@ -610,6 +639,7 @@ export interface ResUsers {
610
639
  readonly companies: F.Many2many<'res.company', { readonly required: true }>;
611
640
  readonly lang: F.Char<{ readonly default: true }>;
612
641
  readonly tz: F.Char<{ readonly default: true }>;
642
+ readonly isService: F.Bool<{ readonly required: true; readonly default: true }>;
613
643
  readonly portalPartner: F.Many2one<'res.partner'>; // portal
614
644
  };
615
645
  readonly methods: ResUsersMethods;
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 66e39244c2b28050
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 698d6a45d2c40df8
2
2
  // Bindings of module `sale_project`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 66e39244c2b28050
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 698d6a45d2c40df8
2
2
  // Schema view of module `sale_project` (RFC 0002 §7.7): the models it owns or depends on, with the extensions it can see.
3
3
  import type { F } from '../../server/orm.js';
4
4
 
@@ -6,6 +6,7 @@ import type { F } from '../../server/orm.js';
6
6
  export interface SchemaView {
7
7
  readonly 'account.tax': AccountTax;
8
8
  readonly 'audit.event': AuditEvent;
9
+ readonly 'auth.api_key': AuthApiKey;
9
10
  readonly 'auth.credential': AuthCredential;
10
11
  readonly 'auth.session': AuthSession;
11
12
  readonly 'auth.user_grant': AuthUserGrant;
@@ -88,6 +89,34 @@ export interface AuditEvent {
88
89
  export interface AuditEventMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'audit.event'> {
89
90
  }
90
91
 
92
+ /** `auth.api_key` (owner: base). */
93
+ export interface AuthApiKey {
94
+ readonly name: 'auth.api_key';
95
+ readonly fields: {
96
+ readonly id: F.Id<'auth.api_key'>;
97
+ readonly createdAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
98
+ readonly updatedAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
99
+ readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
100
+ readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
101
+ readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
102
+ readonly name: F.Char<{ readonly required: true }>;
103
+ readonly user: F.Many2one<'res.users', { readonly required: true }>;
104
+ readonly tokenHash: F.Char<{ readonly required: true }>;
105
+ readonly prefix: F.Char<{ readonly required: true }>;
106
+ readonly scopes: F.Text<{ readonly required: true }>;
107
+ readonly expiresAt: F.Datetime<{ readonly required: true }>;
108
+ readonly lastUsedAt: F.Datetime;
109
+ readonly lastUsedIp: F.Char;
110
+ readonly revoked: F.Bool<{ readonly required: true; readonly default: true }>;
111
+ readonly issuedBy: F.Many2one<'res.users'>;
112
+ };
113
+ readonly methods: AuthApiKeyMethods;
114
+ }
115
+
116
+ /** Methods of `auth.api_key`: declared ones and transitions. */
117
+ export interface AuthApiKeyMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'auth.api_key'> {
118
+ }
119
+
91
120
  /** `auth.credential` (owner: base). */
92
121
  export interface AuthCredential {
93
122
  readonly name: 'auth.credential';
@@ -653,6 +682,7 @@ export interface ResUsers {
653
682
  readonly companies: F.Many2many<'res.company', { readonly required: true }>;
654
683
  readonly lang: F.Char<{ readonly default: true }>;
655
684
  readonly tz: F.Char<{ readonly default: true }>;
685
+ readonly isService: F.Bool<{ readonly required: true; readonly default: true }>;
656
686
  };
657
687
  readonly methods: ResUsersMethods;
658
688
  }
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 531f9724f4925363
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: b513566045fc25a0
2
2
  // Bindings of module `sales`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 531f9724f4925363
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: b513566045fc25a0
2
2
  // Schema view of module `sales` (RFC 0002 §7.7): the models it owns or depends on, with the extensions it can see.
3
3
  import type { F } from '../../server/orm.js';
4
4
 
@@ -6,6 +6,7 @@ import type { F } from '../../server/orm.js';
6
6
  export interface SchemaView {
7
7
  readonly 'account.tax': AccountTax;
8
8
  readonly 'audit.event': AuditEvent;
9
+ readonly 'auth.api_key': AuthApiKey;
9
10
  readonly 'auth.credential': AuthCredential;
10
11
  readonly 'auth.session': AuthSession;
11
12
  readonly 'auth.user_grant': AuthUserGrant;
@@ -84,6 +85,34 @@ export interface AuditEvent {
84
85
  export interface AuditEventMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'audit.event'> {
85
86
  }
86
87
 
88
+ /** `auth.api_key` (owner: base). */
89
+ export interface AuthApiKey {
90
+ readonly name: 'auth.api_key';
91
+ readonly fields: {
92
+ readonly id: F.Id<'auth.api_key'>;
93
+ readonly createdAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
94
+ readonly updatedAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
95
+ readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
96
+ readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
97
+ readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
98
+ readonly name: F.Char<{ readonly required: true }>;
99
+ readonly user: F.Many2one<'res.users', { readonly required: true }>;
100
+ readonly tokenHash: F.Char<{ readonly required: true }>;
101
+ readonly prefix: F.Char<{ readonly required: true }>;
102
+ readonly scopes: F.Text<{ readonly required: true }>;
103
+ readonly expiresAt: F.Datetime<{ readonly required: true }>;
104
+ readonly lastUsedAt: F.Datetime;
105
+ readonly lastUsedIp: F.Char;
106
+ readonly revoked: F.Bool<{ readonly required: true; readonly default: true }>;
107
+ readonly issuedBy: F.Many2one<'res.users'>;
108
+ };
109
+ readonly methods: AuthApiKeyMethods;
110
+ }
111
+
112
+ /** Methods of `auth.api_key`: declared ones and transitions. */
113
+ export interface AuthApiKeyMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'auth.api_key'> {
114
+ }
115
+
87
116
  /** `auth.credential` (owner: base). */
88
117
  export interface AuthCredential {
89
118
  readonly name: 'auth.credential';
@@ -534,6 +563,7 @@ export interface ResUsers {
534
563
  readonly companies: F.Many2many<'res.company', { readonly required: true }>;
535
564
  readonly lang: F.Char<{ readonly default: true }>;
536
565
  readonly tz: F.Char<{ readonly default: true }>;
566
+ readonly isService: F.Bool<{ readonly required: true; readonly default: true }>;
537
567
  };
538
568
  readonly methods: ResUsersMethods;
539
569
  }
@@ -17,6 +17,8 @@ export const sales = defineModule({
17
17
  kosh: '^0.1.0',
18
18
  hooks: { demo: salesDemo },
19
19
  depends: [contacts, product, messaging],
20
+ // What webhooks may subscribe to besides record changes (RFC 0017 §5.3).
21
+ events: [{ topic: 'sale.order.confirmed', model: 'sale.order', label: 'Sales order confirmed' }],
20
22
  app: {
21
23
  code: 'sales',
22
24
  label: 'Sales',
@@ -93,7 +93,7 @@ export function generateClient(document) {
93
93
  const schemas = asSchema(asSchema(document['components'])['schemas']);
94
94
  const models = modelsOf(asSchema(document['paths']));
95
95
  const out = [];
96
- out.push(`// Generated by \`kosh generate client\` from ${JSON.stringify(String(info['title'] ?? 'Kosh API'))} ${String(info['version'] ?? '')}. Do not edit: regenerate.`, '', '// ------------------------------------------------------------------------------------------------- schemas', '');
96
+ out.push(`// Generated by \`shutro-erp generate client\` from ${JSON.stringify(String(info['title'] ?? 'Shutro ERP API'))} ${String(info['version'] ?? '')}. Do not edit: regenerate.`, '', '// ------------------------------------------------------------------------------------------------- schemas', '');
97
97
  for (const name of Object.keys(schemas).sort()) {
98
98
  const schema = asSchema(schemas[name]);
99
99
  const body = typeOf(schema);
@@ -282,7 +282,23 @@ export function openApiDocument(models, info) {
282
282
  openapi: '3.1.0',
283
283
  info,
284
284
  paths: Object.assign({}, ...list.map(modelPaths)),
285
+ // A session (sign-in) or an API key (RFC 0017 §5.1); cookie sessions also send X-CSRF-Token on changes.
286
+ security: [{ session: [] }, { apiKey: [] }, { cookie: [] }],
285
287
  components: {
288
+ securitySchemes: {
289
+ session: {
290
+ type: 'http',
291
+ scheme: 'bearer',
292
+ description: 'A session token from POST /api/v1/auth/login.',
293
+ },
294
+ apiKey: {
295
+ type: 'apiKey',
296
+ in: 'header',
297
+ name: 'X-Api-Key',
298
+ description: 'An API key (sk_…; also accepted as Authorization: Bearer). Its scopes — *, read:<app>, write:<app> — narrow the user’s rights.',
299
+ },
300
+ cookie: { type: 'apiKey', in: 'cookie', name: 'kosh_session' },
301
+ },
286
302
  schemas: {
287
303
  Problem: {
288
304
  type: 'object',
@@ -344,5 +360,5 @@ export function openApiDocument(models, info) {
344
360
  */
345
361
  export function openApiOf(modules) {
346
362
  const models = publicApiModels(buildKoshRegistry(modules));
347
- return openApiDocument(models.values(), { title: 'Kosh API', version: KOSH_VERSION });
363
+ return openApiDocument(models.values(), { title: 'Shutro ERP API', version: KOSH_VERSION });
348
364
  }
@@ -17,8 +17,13 @@
17
17
  * - `GET /api/v1/openapi.json` the OpenAPI 3.1 document
18
18
  */
19
19
  import type { FastifyInstance } from 'fastify';
20
- import type { Driver } from '../orm.js';
20
+ import type { Driver, Env } from '../orm.js';
21
21
  import { type ApiModel } from './metadata.js';
22
+ /**
23
+ * A record as `GET /api/v1/models/<model>/<id>` returns it to `env`'s user (their readable default fields), or null
24
+ * when they cannot see it: what webhooks send (RFC 0017 §5.3).
25
+ */
26
+ export declare function readApiRecord(env: Env, model: ApiModel, id: number): Promise<Record<string, unknown> | null>;
22
27
  /** Registers the generated routes for `models`. */
23
28
  export declare function registerRestApi(app: FastifyInstance, options: {
24
29
  readonly models: ReadonlyMap<string, ApiModel>;