tin-spa 20.1.2 → 20.2.0

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.
@@ -19,7 +19,7 @@ import { RouterModule, Router } from '@angular/router';
19
19
  import * as i2$1 from '@abacritt/angularx-social-login';
20
20
  import { SocialLoginModule } from '@abacritt/angularx-social-login';
21
21
  import * as i1$1 from '@angular/common/http';
22
- import { HttpHeaders, HttpResponse, HttpClient, HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
22
+ import { HttpHeaders, HttpResponse, HttpClientModule, HTTP_INTERCEPTORS, HttpClient } from '@angular/common/http';
23
23
  import * as i1$3 from '@angular/cdk/layout';
24
24
  import * as i9 from '@angular/material/autocomplete';
25
25
  import { MatAutocompleteModule } from '@angular/material/autocomplete';
@@ -208,103 +208,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
208
208
  }]
209
209
  }], ctorParameters: () => [] });
210
210
 
211
- var RoleAccess;
212
- (function (RoleAccess) {
213
- RoleAccess[RoleAccess["None"] = 0] = "None";
214
- RoleAccess[RoleAccess["View"] = 1] = "View";
215
- RoleAccess[RoleAccess["Edit"] = 2] = "Edit";
216
- RoleAccess[RoleAccess["Create"] = 3] = "Create";
217
- RoleAccess[RoleAccess["Full"] = 4] = "Full";
218
- })(RoleAccess || (RoleAccess = {}));
219
- // Added: Inventory movement type enum
220
- var MovementType;
221
- (function (MovementType) {
222
- MovementType[MovementType["In"] = 0] = "In";
223
- MovementType[MovementType["Out"] = 1] = "Out";
224
- })(MovementType || (MovementType = {}));
225
- var DetailsSource;
226
- (function (DetailsSource) {
227
- DetailsSource[DetailsSource["Row"] = 0] = "Row";
228
- DetailsSource[DetailsSource["Url"] = 1] = "Url";
229
- })(DetailsSource || (DetailsSource = {}));
230
- class dialogOptions {
231
- }
232
- class DetailsDialogConfig {
233
- }
234
- class Action {
235
- }
236
- class SearchConfig {
237
- }
238
- class SecurityConfig {
239
- }
240
- class AlertMessage {
241
- }
242
- class AlertConfig {
243
- }
244
- class NotesConfig {
245
- }
246
- class FormConfig {
247
- }
248
- class TileConfig {
249
- }
250
- class Step {
251
- }
252
- class StepConfig {
253
- }
254
- class TableConfig {
255
- }
256
- class PageConfig {
257
- }
258
- //---Base---
259
- class ApiResponse {
260
- }
261
- class Constants {
262
- static { this.AUTH_USER = 'a'; }
263
- static { this.AUTH_NAME = 'b'; }
264
- static { this.AUTH_ROLES = 'c'; }
265
- static { this.AUTH_TOKEN = 'd'; }
266
- static { this.AUTH_TOKEN_EXPIRE = 'e'; }
267
- static { this.AUTH_TENANT_NAME = 'f'; }
268
- }
269
- class ListDialogConfig {
270
- }
271
- class CapItem {
272
- constructor() {
273
- this.name = "";
274
- this.display = "New Cap Item";
275
- this.enabled = false;
276
- this.type = "";
277
- this.newLine = false;
278
- this.showMenu = true;
279
- this.ignoreSubsDisplay = false;
280
- this.link = "";
281
- this.icon = "navigate_next";
282
- this.color = "black";
283
- this.isBool = false;
284
- }
285
- }
286
- class AppConfig {
287
- constructor() {
288
- this.appName = "App Name";
289
- this.logo = "";
290
- this.logoSize = "normal";
291
- this.ADAuth = true;
292
- this.localAuth = true;
293
- this.googleAuth = false;
294
- this.microsoftAuth = false;
295
- this.microsoftAuthMessage = "Sign in with Microsoft";
296
- this.selfService = false;
297
- this.multitenant = false;
298
- this.navigation = 'top';
299
- this.progressLine = false;
300
- this.loginStyle = 'default';
301
- this.termsUrl = "https://yoursite.com/terms";
302
- this.privacyUrl = "https://yoursite.com/privacy";
303
- this.siteUrl = "https://yoursite.com";
304
- this.navWidth = '200px';
305
- }
306
- }
307
-
308
211
  class Core {
309
212
  static deepClone(obj) {
310
213
  if (obj === null || typeof obj !== 'object') {
@@ -872,7 +775,6 @@ class DetailsDialogProcessor {
872
775
  }
873
776
  }
874
777
 
875
- // Added: Invoice status enum for invoice management
876
778
  var InvoiceStatus;
877
779
  (function (InvoiceStatus) {
878
780
  InvoiceStatus[InvoiceStatus["Draft"] = 0] = "Draft";
@@ -880,6 +782,30 @@ var InvoiceStatus;
880
782
  InvoiceStatus[InvoiceStatus["Paid"] = 2] = "Paid";
881
783
  InvoiceStatus[InvoiceStatus["Discarded"] = 3] = "Discarded";
882
784
  })(InvoiceStatus || (InvoiceStatus = {}));
785
+ // Inventory receipt status tracking enum - mirrors backend
786
+ var InventoryReceiptStatus;
787
+ (function (InventoryReceiptStatus) {
788
+ InventoryReceiptStatus[InventoryReceiptStatus["Draft"] = 0] = "Draft";
789
+ InventoryReceiptStatus[InventoryReceiptStatus["Receiving"] = 1] = "Receiving";
790
+ InventoryReceiptStatus[InventoryReceiptStatus["Completed"] = 2] = "Completed";
791
+ })(InventoryReceiptStatus || (InventoryReceiptStatus = {}));
792
+ // Unit of measure enum - mirrors backend
793
+ var UnitOfMeasure;
794
+ (function (UnitOfMeasure) {
795
+ UnitOfMeasure[UnitOfMeasure["Piece"] = 0] = "Piece";
796
+ UnitOfMeasure[UnitOfMeasure["Box"] = 1] = "Box";
797
+ UnitOfMeasure[UnitOfMeasure["Case"] = 2] = "Case";
798
+ UnitOfMeasure[UnitOfMeasure["Carton"] = 3] = "Carton";
799
+ UnitOfMeasure[UnitOfMeasure["Pallet"] = 4] = "Pallet";
800
+ UnitOfMeasure[UnitOfMeasure["Kilogram"] = 5] = "Kilogram";
801
+ UnitOfMeasure[UnitOfMeasure["Gram"] = 6] = "Gram";
802
+ UnitOfMeasure[UnitOfMeasure["Litre"] = 7] = "Litre";
803
+ UnitOfMeasure[UnitOfMeasure["Millilitre"] = 8] = "Millilitre";
804
+ UnitOfMeasure[UnitOfMeasure["Meter"] = 9] = "Meter";
805
+ UnitOfMeasure[UnitOfMeasure["Pack"] = 10] = "Pack";
806
+ UnitOfMeasure[UnitOfMeasure["Set"] = 11] = "Set";
807
+ UnitOfMeasure[UnitOfMeasure["Dozen"] = 12] = "Dozen";
808
+ })(UnitOfMeasure || (UnitOfMeasure = {}));
883
809
  class loginConfig {
884
810
  constructor() {
885
811
  this.appName = "";
@@ -1059,6 +985,102 @@ var LogLevel;
1059
985
  LogLevel[LogLevel["Off"] = 6] = "Off";
1060
986
  })(LogLevel || (LogLevel = {}));
1061
987
 
988
+ var RoleAccess;
989
+ (function (RoleAccess) {
990
+ RoleAccess[RoleAccess["None"] = 0] = "None";
991
+ RoleAccess[RoleAccess["View"] = 1] = "View";
992
+ RoleAccess[RoleAccess["Edit"] = 2] = "Edit";
993
+ RoleAccess[RoleAccess["Create"] = 3] = "Create";
994
+ RoleAccess[RoleAccess["Full"] = 4] = "Full";
995
+ })(RoleAccess || (RoleAccess = {}));
996
+ var MovementType;
997
+ (function (MovementType) {
998
+ MovementType[MovementType["In"] = 0] = "In";
999
+ MovementType[MovementType["Out"] = 1] = "Out";
1000
+ })(MovementType || (MovementType = {}));
1001
+ var DetailsSource;
1002
+ (function (DetailsSource) {
1003
+ DetailsSource[DetailsSource["Row"] = 0] = "Row";
1004
+ DetailsSource[DetailsSource["Url"] = 1] = "Url";
1005
+ })(DetailsSource || (DetailsSource = {}));
1006
+ class dialogOptions {
1007
+ }
1008
+ class DetailsDialogConfig {
1009
+ }
1010
+ class Action {
1011
+ }
1012
+ class SearchConfig {
1013
+ }
1014
+ class SecurityConfig {
1015
+ }
1016
+ class AlertMessage {
1017
+ }
1018
+ class AlertConfig {
1019
+ }
1020
+ class NotesConfig {
1021
+ }
1022
+ class FormConfig {
1023
+ }
1024
+ class TileConfig {
1025
+ }
1026
+ class Step {
1027
+ }
1028
+ class StepConfig {
1029
+ }
1030
+ class TableConfig {
1031
+ }
1032
+ class PageConfig {
1033
+ }
1034
+ //---Base---
1035
+ class ApiResponse {
1036
+ }
1037
+ class Constants {
1038
+ static { this.AUTH_USER = 'a'; }
1039
+ static { this.AUTH_NAME = 'b'; }
1040
+ static { this.AUTH_ROLES = 'c'; }
1041
+ static { this.AUTH_TOKEN = 'd'; }
1042
+ static { this.AUTH_TOKEN_EXPIRE = 'e'; }
1043
+ static { this.AUTH_TENANT_NAME = 'f'; }
1044
+ }
1045
+ class ListDialogConfig {
1046
+ }
1047
+ class CapItem {
1048
+ constructor() {
1049
+ this.name = "";
1050
+ this.display = "New Cap Item";
1051
+ this.enabled = false;
1052
+ this.type = "";
1053
+ this.newLine = false;
1054
+ this.showMenu = true;
1055
+ this.ignoreSubsDisplay = false;
1056
+ this.link = "";
1057
+ this.icon = "navigate_next";
1058
+ this.color = "black";
1059
+ this.isBool = false;
1060
+ }
1061
+ }
1062
+ class AppConfig {
1063
+ constructor() {
1064
+ this.appName = "App Name";
1065
+ this.logo = "";
1066
+ this.logoSize = "normal";
1067
+ this.ADAuth = true;
1068
+ this.localAuth = true;
1069
+ this.googleAuth = false;
1070
+ this.microsoftAuth = false;
1071
+ this.microsoftAuthMessage = "Sign in with Microsoft";
1072
+ this.selfService = false;
1073
+ this.multitenant = false;
1074
+ this.navigation = 'top';
1075
+ this.progressLine = false;
1076
+ this.loginStyle = 'default';
1077
+ this.termsUrl = "https://yoursite.com/terms";
1078
+ this.privacyUrl = "https://yoursite.com/privacy";
1079
+ this.siteUrl = "https://yoursite.com";
1080
+ this.navWidth = '200px';
1081
+ }
1082
+ }
1083
+
1062
1084
  class HttpService {
1063
1085
  constructor(httpClient, router) {
1064
1086
  this.httpClient = httpClient;
@@ -1409,9 +1431,9 @@ class DataServiceLib {
1409
1431
  this.capPlans = new CapItem;
1410
1432
  this.capGeneral = new CapItem;
1411
1433
  this.capCustomers = new CapItem;
1412
- this.capCategories = new CapItem; // Added: Categories CapItem
1413
- this.capSubCategories = new CapItem; // Added: SubCategories CapItem
1414
- this.capBrands = new CapItem; // Added: Brands CapItem
1434
+ this.capCategories = new CapItem;
1435
+ this.capSubCategories = new CapItem;
1436
+ this.capBrands = new CapItem;
1415
1437
  this.capSuppliers = new CapItem;
1416
1438
  this.capTasks = new CapItem;
1417
1439
  this.capHR = new CapItem;
@@ -1437,10 +1459,13 @@ class DataServiceLib {
1437
1459
  this.capLoanPayments = new CapItem;
1438
1460
  this.capInventory = new CapItem;
1439
1461
  this.capInventoryDashboard = new CapItem;
1462
+ this.capInventoryStock = new CapItem; // Changed: Added new cap item for inventory stock view
1440
1463
  this.capProducts = new CapItem;
1441
1464
  this.capInventoryItems = new CapItem;
1465
+ this.capPurchaseOrders = new CapItem;
1442
1466
  this.capInventoryReceipts = new CapItem;
1443
1467
  this.capSalesOrders = new CapItem;
1468
+ this.capSales = new CapItem;
1444
1469
  this.capRequisitions = new CapItem;
1445
1470
  this.capInventoryAdjustments = new CapItem;
1446
1471
  this.capInventoryReturns = new CapItem;
@@ -2006,15 +2031,15 @@ class DataServiceLib {
2006
2031
  this.capCustomers.display = "Customers";
2007
2032
  this.capCustomers.link = "home/admin/customers";
2008
2033
  this.capCustomers.icon = "group";
2009
- this.capCategories.name = "cap13"; // Added: Categories initialization
2034
+ this.capCategories.name = "cap13";
2010
2035
  this.capCategories.display = "Categories";
2011
2036
  this.capCategories.link = "home/admin/categories";
2012
2037
  this.capCategories.icon = "category";
2013
- this.capSubCategories.name = "cap103"; // Added: SubCategories initialization
2038
+ this.capSubCategories.name = "cap103";
2014
2039
  this.capSubCategories.display = "Sub Categories";
2015
2040
  this.capSubCategories.link = "home/admin/subcategories";
2016
2041
  this.capSubCategories.icon = "category";
2017
- this.capBrands.name = "cap14"; // Added: Brands initialization
2042
+ this.capBrands.name = "cap14";
2018
2043
  this.capBrands.display = "Brands";
2019
2044
  this.capBrands.link = "home/admin/brands";
2020
2045
  this.capBrands.icon = "loyalty";
@@ -2111,11 +2136,15 @@ class DataServiceLib {
2111
2136
  this.capInventory.name = "cap34";
2112
2137
  this.capInventory.display = "Inventory";
2113
2138
  this.capInventory.icon = "inventory";
2114
- this.capInventory.capSubItems = [this.capInventoryDashboard, this.capProducts, this.capInventoryItems, this.capInventoryReceipts, this.capSalesOrders, this.capRequisitions, this.capInventoryAdjustments, this.capInventoryReturns, this.capRequisitionReturns, this.capInventoryTransactions];
2139
+ this.capInventory.capSubItems = [this.capInventoryDashboard, this.capInventoryStock, this.capProducts, this.capInventoryItems, this.capPurchaseOrders, this.capInventoryReceipts, this.capSalesOrders, this.capSales, this.capRequisitions, this.capInventoryAdjustments, this.capInventoryReturns, this.capRequisitionReturns, this.capInventoryTransactions]; // Changed: Added capInventoryStock to sub items
2115
2140
  this.capInventoryDashboard.name = "cap35";
2116
2141
  this.capInventoryDashboard.display = "Dashboard";
2117
2142
  this.capInventoryDashboard.link = "home/admin/inventory-dashboard";
2118
2143
  this.capInventoryDashboard.icon = "dashboard";
2144
+ this.capInventoryStock.name = "cap51"; // Changed: Added inventory stock cap item configuration
2145
+ this.capInventoryStock.display = "Inventory Stock";
2146
+ this.capInventoryStock.link = "home/admin/inventory-stock";
2147
+ this.capInventoryStock.icon = "widgets";
2119
2148
  this.capProducts.name = "cap36";
2120
2149
  this.capProducts.display = "Products";
2121
2150
  this.capProducts.link = "home/admin/inventory-products";
@@ -2124,6 +2153,10 @@ class DataServiceLib {
2124
2153
  this.capInventoryItems.display = "Inventory Items";
2125
2154
  this.capInventoryItems.link = "home/admin/inventory-items";
2126
2155
  this.capInventoryItems.icon = "inventory_2";
2156
+ this.capPurchaseOrders.name = "cap47";
2157
+ this.capPurchaseOrders.display = "Purchase Orders";
2158
+ this.capPurchaseOrders.link = "home/admin/purchase-orders";
2159
+ this.capPurchaseOrders.icon = "shopping_bag";
2127
2160
  this.capInventoryReceipts.name = "cap38";
2128
2161
  this.capInventoryReceipts.display = "Receipts";
2129
2162
  this.capInventoryReceipts.link = "home/admin/inventory-receipts";
@@ -2132,6 +2165,10 @@ class DataServiceLib {
2132
2165
  this.capSalesOrders.display = "Sales Orders";
2133
2166
  this.capSalesOrders.link = "home/admin/inventory-sales-orders";
2134
2167
  this.capSalesOrders.icon = "shopping_cart";
2168
+ this.capSales.name = "cap50";
2169
+ this.capSales.display = "Sales";
2170
+ this.capSales.link = "home/admin/inventory-sales";
2171
+ this.capSales.icon = "point_of_sale";
2135
2172
  this.capRequisitions.name = "cap40";
2136
2173
  this.capRequisitions.display = "Requisitions";
2137
2174
  this.capRequisitions.link = "home/admin/inventory-requisitions";
@@ -2487,9 +2524,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
2487
2524
  }], ctorParameters: () => [{ type: i5.MatDialog }, { type: i1$3.BreakpointObserver }] });
2488
2525
 
2489
2526
  class AccountingService {
2490
- // Changed: Moved from declaration to assignment
2491
2527
  constructor() {
2492
2528
  this.dataService = inject(DataServiceLib);
2529
+ //--------------------------Accounts Base-------------------------
2530
+ this.accountFormConfig = {
2531
+ security: { allow: [this.dataService.capAccounts] },
2532
+ title: 'Financial Account',
2533
+ includeAudit: true,
2534
+ fields: [
2535
+ { name: 'name', type: 'text', required: true },
2536
+ { name: 'type', type: 'select', required: true, loadAction: { url: 'accounts/list/accountTypes' } },
2537
+ { name: 'balanceDisplay', alias: 'Balance', type: 'label', readonly: true, hideOnCreate: true },
2538
+ ],
2539
+ loadAction: { url: 'accounts/id' },
2540
+ heroField: 'accountID',
2541
+ };
2542
+ this.accountCreateButton = { name: 'create', display: 'Create', dialog: true, action: { url: 'accounts?action=create', method: 'post' } };
2543
+ this.finAccounEditButton = { name: 'edit', dialog: true, action: { url: 'accounts?action=edit', method: 'post' } };
2544
+ this.accountBaseDetailsConfig = {
2545
+ formConfig: this.accountFormConfig,
2546
+ tableConfigs: [],
2547
+ heroField: 'accountID',
2548
+ buttons: [this.accountCreateButton, this.finAccounEditButton]
2549
+ };
2493
2550
  //--------------------------Invoices-------------------------
2494
2551
  // Invoice form configuration with customer and status fields
2495
2552
  this.invoiceFormConfig = {
@@ -2668,10 +2725,12 @@ class AccountingService {
2668
2725
  loadAction: { url: 'accounts/list/accountTypes' }
2669
2726
  },
2670
2727
  { name: 'defaultDebitAccountID', type: 'select', alias: 'Default Debit Account', nullable: true, masterField: 'debitAccountType', masterOptionValue: 'type',
2671
- loadAction: { url: 'accounts/list/x' }, detailsConfig: this.accountDetailsConfig
2728
+ loadAction: { url: 'accounts/list/x' },
2729
+ detailsConfig: this.accountBaseDetailsConfig
2672
2730
  },
2673
2731
  { name: 'defaultCreditAccountID', type: 'select', alias: 'Default Credit Account', nullable: true, masterField: 'creditAccountType', masterOptionValue: 'type',
2674
- loadAction: { url: 'accounts/list/x' }, detailsConfig: this.accountDetailsConfig
2732
+ loadAction: { url: 'accounts/list/x' },
2733
+ detailsConfig: this.accountBaseDetailsConfig
2675
2734
  },
2676
2735
  ],
2677
2736
  loadAction: { url: 'transactiontypes/id' },
@@ -2718,11 +2777,13 @@ class AccountingService {
2718
2777
  { name: 'date', type: 'date', required: true },
2719
2778
  { name: 'debitAccountID', type: 'select', alias: 'Debit Account', required: true, readonlyCondition: x => x.transactionID,
2720
2779
  masterField: 'transactionTypeID', masterValueField: 'debitAccountType', masterDefaultValueField: 'defaultDebitAccountID', masterOptionValue: 'type',
2721
- loadAction: { url: 'accounts/list/x' }, detailsConfig: this.accountDetailsConfig
2780
+ loadAction: { url: 'accounts/list/x' },
2781
+ detailsConfig: this.accountBaseDetailsConfig
2722
2782
  },
2723
2783
  { name: 'creditAccountID', type: 'select', alias: 'Credit Account', required: true, readonlyCondition: x => x.transactionID,
2724
2784
  masterField: 'transactionTypeID', masterValueField: 'creditAccountType', masterDefaultValueField: 'defaultCreditAccountID', masterOptionValue: 'type',
2725
- loadAction: { url: 'accounts/list/x' }, detailsConfig: this.accountDetailsConfig
2785
+ loadAction: { url: 'accounts/list/x' },
2786
+ detailsConfig: this.accountBaseDetailsConfig
2726
2787
  },
2727
2788
  { name: 'description', type: 'text', required: true, span: true },
2728
2789
  { name: 'amount', type: 'label', format: 'money', required: true, hideOnCreate: true, readonly: true },
@@ -2731,14 +2792,12 @@ class AccountingService {
2731
2792
  { name: 'reversalOfTransactionID', type: 'label', alias: 'Reversal Of Transaction', hideOnCreate: true, hiddenCondition: x => !x.isReversal },
2732
2793
  ],
2733
2794
  };
2734
- // Added: Edit button with condition
2735
2795
  this.transactionEditButton = {
2736
2796
  name: 'edit',
2737
2797
  dialog: true,
2738
2798
  action: { url: 'transactions?action=edit', method: 'post' },
2739
2799
  visible: x => x.canEdit && !x.isReversal
2740
2800
  };
2741
- // Added: Void button with confirmation
2742
2801
  this.transactionVoidButton = {
2743
2802
  name: 'void',
2744
2803
  display: 'Void',
@@ -2776,20 +2835,18 @@ class AccountingService {
2776
2835
  loadAction: { url: 'accounts/transactions/x' }, loadCriteria: 'transactions', loadIDField: 'accountID'
2777
2836
  };
2778
2837
  //--------------------------Accounts-------------------------
2779
- this.accountFormConfig = {
2780
- security: { allow: [this.dataService.capAccounts] },
2781
- title: 'Financial Account',
2782
- includeAudit: true,
2783
- fields: [
2784
- { name: 'name', type: 'text', required: true },
2785
- { name: 'type', type: 'select', required: true, loadAction: { url: 'accounts/list/accountTypes' } },
2786
- { name: 'balanceDisplay', alias: 'Balance', type: 'label', readonly: true, hideOnCreate: true },
2787
- ],
2788
- loadAction: { url: 'accounts/id' },
2789
- heroField: 'accountID',
2838
+ this.accountDetailsConfig = {
2839
+ ...this.accountBaseDetailsConfig,
2840
+ tableConfigs: [
2841
+ { ...this.accountTransactionsTableConfig },
2842
+ {
2843
+ ...this.transactionTypesTableConfig,
2844
+ tabTitle: 'Transaction Types',
2845
+ buttons: [],
2846
+ loadAction: { url: 'transactionTypes/account/x' }, loadCriteria: 'account', loadIDField: 'accountID'
2847
+ },
2848
+ ]
2790
2849
  };
2791
- this.accountCreateButton = { name: 'create', display: 'Create', dialog: true, action: { url: 'accounts?action=create', method: 'post' } };
2792
- this.finAccounEditButton = { name: 'edit', dialog: true, action: { url: 'accounts?action=edit', method: 'post' } };
2793
2850
  this.accountsTableConfig = {
2794
2851
  showFilter: true,
2795
2852
  minColumns: ['name', 'type', 'balance'],
@@ -2808,20 +2865,6 @@ class AccountingService {
2808
2865
  loadAction: { url: 'accounts/all/x' },
2809
2866
  formConfig: this.accountFormConfig
2810
2867
  };
2811
- this.accountDetailsConfig = {
2812
- formConfig: this.accountFormConfig,
2813
- tableConfigs: [
2814
- { ...this.accountTransactionsTableConfig },
2815
- {
2816
- ...this.transactionTypesTableConfig,
2817
- tabTitle: 'Transaction Types',
2818
- buttons: [],
2819
- loadAction: { url: 'transactionTypes/account/x' }, loadCriteria: 'account', loadIDField: 'accountID'
2820
- },
2821
- ],
2822
- heroField: 'accountID',
2823
- buttons: [this.accountCreateButton, this.finAccounEditButton]
2824
- };
2825
2868
  }
2826
2869
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AccountingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2827
2870
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AccountingService, providedIn: 'root' }); }
@@ -2831,7 +2874,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
2831
2874
  args: [{
2832
2875
  providedIn: 'root'
2833
2876
  }]
2834
- }], ctorParameters: () => [] });
2877
+ }] });
2835
2878
 
2836
2879
  class LoansService {
2837
2880
  constructor() {
@@ -2863,7 +2906,6 @@ class LoansService {
2863
2906
  { name: 'interestMethodName', alias: 'Interest Method' },
2864
2907
  { name: 'minAmount', type: 'money', alias: 'Min Amount' },
2865
2908
  { name: 'maxAmount', type: 'money', alias: 'Max Amount' },
2866
- // Changed: Display min/max interest rates instead of default rate
2867
2909
  { name: 'minInterestRate', alias: 'Min Rate (%)' },
2868
2910
  { name: 'maxInterestRate', alias: 'Max Rate (%)' },
2869
2911
  { name: 'minTermMonths', alias: 'Min Term' },
@@ -2928,22 +2970,22 @@ class LoansService {
2928
2970
  formConfig: {
2929
2971
  title: 'Loan Details',
2930
2972
  fields: [
2931
- { name: 'customerName', type: 'text', alias: 'Customer' }, // Added: type is required in Field interface
2932
- { name: 'productName', type: 'text', alias: 'Product' }, // Added: type is required in Field interface
2973
+ { name: 'customerName', type: 'text', alias: 'Customer' },
2974
+ { name: 'productName', type: 'text', alias: 'Product' },
2933
2975
  { name: 'principalAmount', type: 'money', alias: 'Principal Amount' },
2934
2976
  { name: 'interestRate', type: 'number', alias: 'Annual Interest Rate (%)', required: true, min: 0, max: 100 },
2935
2977
  { name: 'monthlyInterestRate', type: 'number', alias: 'Monthly Interest Rate (%)', required: true, min: 0, max: 100 },
2936
- { name: 'termMonths', type: 'number', alias: 'Term (Months)' }, // Added: type is required in Field interface
2978
+ { name: 'termMonths', type: 'number', alias: 'Term (Months)' },
2937
2979
  { name: 'disbursementDate', type: 'date', alias: 'Disbursement Date' },
2938
2980
  { name: 'maturityDate', type: 'date', alias: 'Maturity Date' },
2939
- { name: 'statusName', type: 'text', alias: 'Status' }, // Added: type is required in Field interface
2981
+ { name: 'statusName', type: 'text', alias: 'Status' },
2940
2982
  { name: 'totalAmountDue', type: 'money', alias: 'Total Amount Due' },
2941
2983
  { name: 'totalPaidAmount', type: 'money', alias: 'Total Paid' },
2942
2984
  { name: 'outstandingBalance', type: 'money', alias: 'Outstanding Balance' },
2943
2985
  { name: 'totalInterest', type: 'money', alias: 'Total Interest' },
2944
- { name: 'scheduleCount', type: 'number', alias: 'Total Installments' }, // Added: type is required in Field interface
2945
- { name: 'paymentCount', type: 'number', alias: 'Payments Made' }, // Added: type is required in Field interface
2946
- { name: 'overdueCount', type: 'number', alias: 'Overdue Installments' }, // Added: type is required in Field interface
2986
+ { name: 'scheduleCount', type: 'number', alias: 'Total Installments' },
2987
+ { name: 'paymentCount', type: 'number', alias: 'Payments Made' },
2988
+ { name: 'overdueCount', type: 'number', alias: 'Overdue Installments' },
2947
2989
  ],
2948
2990
  loadAction: { url: 'loans/id' }
2949
2991
  },
@@ -2951,13 +2993,13 @@ class LoansService {
2951
2993
  tableConfigs: [
2952
2994
  {
2953
2995
  ...this.loanScheduleTableConfig,
2954
- tabTitle: 'Payment Schedule', // Changed: Added tab title
2996
+ tabTitle: 'Payment Schedule',
2955
2997
  loadAction: { url: 'loanschedules/loan/x' },
2956
2998
  loadCriteria: 'loan',
2957
2999
  loadIDField: 'loanID'
2958
3000
  },
2959
3001
  {
2960
- tabTitle: 'Payment History', // Changed: Added tab title for payments
3002
+ tabTitle: 'Payment History',
2961
3003
  showFilter: true,
2962
3004
  columns: [
2963
3005
  { name: 'paymentDate', type: 'date', alias: 'Date' },
@@ -3201,7 +3243,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
3201
3243
 
3202
3244
  // Service to centralize all inventory-related table and form configurations
3203
3245
  class InventoryService {
3204
- // Changed: Moved initialization to constructor to avoid circular references
3205
3246
  constructor() {
3206
3247
  this.dataService = inject(DataServiceLib);
3207
3248
  this.generalService = inject(GeneralService);
@@ -3209,23 +3250,24 @@ class InventoryService {
3209
3250
  this.productFormConfig = {
3210
3251
  security: { allow: [this.dataService.capProducts] },
3211
3252
  title: 'Product',
3253
+ fixedTitle: true, // Changed: Use fixedTitle to avoid title duplication
3212
3254
  multiColumn: true,
3213
3255
  includeAudit: true,
3214
3256
  fields: [
3215
3257
  { name: 'productInfo', type: 'section', alias: 'Product Information' },
3216
- { name: 'name', type: 'text', required: true, alias: 'Product Name', section: 'productInfo' },
3217
- { name: 'sku', type: 'text', required: true, alias: 'SKU', section: 'productInfo' },
3218
- { name: 'description', type: 'text', alias: 'Description', span: true, section: 'productInfo' },
3258
+ { name: 'name', type: 'text', required: true, alias: 'Product Name', section: 'productInfo', infoMessage: 'The unique name of the product' },
3259
+ { name: 'sku', type: 'text', alias: 'SKU', section: 'productInfo', infoMessage: 'Stock Keeping Unit for inventory tracking (optional)' }, // Changed: Removed required flag
3260
+ { name: 'description', type: 'text', alias: 'Description', span: true, section: 'productInfo', infoMessage: 'Detailed description of the product' },
3219
3261
  { name: 'categoryInfo', type: 'section', alias: 'Categorization' },
3220
- { name: 'categoryID', type: 'select', alias: 'Category', section: 'categoryInfo', loadAction: { url: 'categories/list/x' }, detailsConfig: this.generalService.categoryDetailsConfig },
3221
- { name: 'subCategoryID', type: 'select', alias: 'Sub Category', section: 'categoryInfo', loadAction: { url: 'subcategories/list/x' }, detailsConfig: this.generalService.subCategoryDetailsConfig },
3222
- { name: 'brandID', type: 'select', alias: 'Brand', section: 'categoryInfo', loadAction: { url: 'brands/list/x' }, detailsConfig: this.generalService.brandDetailsConfig },
3262
+ { name: 'categoryID', type: 'select', alias: 'Category', nullable: true, section: 'categoryInfo', loadAction: { url: 'categories/list/x' }, detailsConfig: this.generalService.categoryDetailsConfig, infoMessage: 'The main product category' }, // Changed: Added nullable flag
3263
+ { name: 'subCategoryID', type: 'select', alias: 'Sub Category', section: 'categoryInfo', loadAction: { url: 'subcategories/list/x' }, detailsConfig: this.generalService.subCategoryDetailsConfig, infoMessage: 'More specific product classification' },
3264
+ { name: 'brandID', type: 'select', alias: 'Brand', nullable: true, section: 'categoryInfo', loadAction: { url: 'brands/list/x' }, detailsConfig: this.generalService.brandDetailsConfig, infoMessage: 'Product brand or manufacturer' }, // Changed: Added nullable flag
3223
3265
  { name: 'inventoryInfo', type: 'section', alias: 'Inventory Settings' },
3224
- { name: 'isSerialized', type: 'checkbox', alias: 'Serialized Product', section: 'inventoryInfo' },
3225
- { name: 'baseUnit', type: 'select', required: true, alias: 'Base Unit', section: 'inventoryInfo', loadAction: { url: 'products/list/base-unit' } },
3226
- { name: 'minimumInventoryLevel', type: 'number', required: true, alias: 'Minimum Inventory Level', section: 'inventoryInfo' },
3266
+ { name: 'isSerialized', type: 'checkbox', alias: 'Serialized Product', span: true, section: 'inventoryInfo', infoMessage: 'Track individual items by serial number' }, // Changed: Added span to cross two columns
3267
+ { name: 'baseUnit', type: 'select', required: true, alias: 'Base Unit', section: 'inventoryInfo', loadAction: { url: 'products/list/base-unit' }, defaultFirstValue: true, infoMessage: 'Unit of measure for inventory tracking' }, // Changed: Added defaultFirstValue flag
3268
+ { name: 'minimumInventoryLevel', type: 'number', required: true, alias: 'Minimum Inventory Level', section: 'inventoryInfo', infoMessage: 'Alert threshold for low stock' },
3227
3269
  { name: 'pricingInfo', type: 'section', alias: 'Pricing' },
3228
- { name: 'sellingPrice', type: 'money', required: true, alias: 'Selling Price', section: 'pricingInfo' }
3270
+ { name: 'sellingPrice', type: 'money', required: true, alias: 'Selling Price', section: 'pricingInfo', infoMessage: 'Default selling price per unit' }
3229
3271
  ],
3230
3272
  loadAction: { url: 'products/id' },
3231
3273
  heroField: 'productID'
@@ -3233,30 +3275,24 @@ class InventoryService {
3233
3275
  this.productCreateButton = { name: 'create', display: 'Create Product', dialog: true, action: { url: 'products?action=create', method: 'post' } };
3234
3276
  this.productEditButton = { name: 'edit', dialog: true, action: { url: 'products?action=edit', method: 'post' } };
3235
3277
  this.productDeleteButton = { name: 'delete', dialog: true, action: { url: 'products?action=delete', method: 'post' } };
3236
- this.productLowInventoryButton = { name: 'low-inventory', display: 'Low Inventory', icon: { name: 'warning', color: 'orange' }, action: { url: 'products/low-inventory/x', method: 'get' } };
3237
3278
  this.productsTableConfig = {
3238
3279
  showFilter: true,
3239
3280
  flatButtons: true,
3240
- minColumns: ['name', 'sku', 'currentInventoryLevel'],
3281
+ minColumns: ['name', 'sku', 'categoryName'],
3241
3282
  columns: [
3242
3283
  { name: 'name', type: 'text', alias: 'Product Name' },
3243
3284
  { name: 'sku', type: 'text', alias: 'SKU' },
3244
3285
  { name: 'categoryName', type: 'text', alias: 'Category' },
3245
3286
  { name: 'brandName', type: 'text', alias: 'Brand' },
3246
- { name: 'isSerialized', type: 'checkbox', alias: 'Serialized' },
3247
- { name: 'baseUnit', type: 'text', alias: 'Unit' },
3248
- { name: 'currentInventoryLevel', type: 'number', alias: 'Current Stock' },
3287
+ { name: 'currentInventoryLevel', type: 'number', alias: 'Current Stock', icon: { name: 'warning', color: 'orange', condition: (x) => x.isLowInventory } }, // Changed: Removed separate columns, added low stock icon to current stock
3249
3288
  { name: 'minimumInventoryLevel', type: 'number', alias: 'Min Stock' },
3250
- { name: 'isLowInventory', type: 'checkbox', alias: 'Low Stock', icon: { name: 'warning', color: 'orange' } },
3251
- { name: 'sellingPrice', type: 'money', alias: 'Price' },
3252
- { name: 'currentAverageCost', type: 'money', alias: 'Avg Cost' }
3253
- ],
3289
+ { name: 'sellingPrice', type: 'money', alias: 'Price' }
3290
+ ], // Changed: Removed isSerialized, baseUnit, currentAverageCost, isLowInventory columns
3254
3291
  buttons: [
3255
3292
  this.productCreateButton,
3256
3293
  { name: 'view', dialog: true, detailsConfig: this.productDetailsConfig },
3257
3294
  this.productEditButton,
3258
3295
  this.productDeleteButton,
3259
- this.productLowInventoryButton
3260
3296
  ],
3261
3297
  loadAction: { url: 'products/all/x' },
3262
3298
  formConfig: this.productFormConfig
@@ -3264,6 +3300,7 @@ class InventoryService {
3264
3300
  //--------------------------Requisitions-------------------------
3265
3301
  this.requisitionItemFormConfig = {
3266
3302
  title: 'Requisition Item',
3303
+ fixedTitle: true, // Changed: Use fixedTitle to avoid duplication with 'Add Item' button
3267
3304
  fields: [
3268
3305
  { name: 'productID', type: 'select', alias: 'Product', required: true, loadAction: { url: 'products/list/x' }, detailsConfig: this.productDetailsConfig },
3269
3306
  { name: 'requestedQuantity', type: 'number', alias: 'Requested Qty', required: true },
@@ -3277,7 +3314,7 @@ class InventoryService {
3277
3314
  showFilter: false,
3278
3315
  elevation: 'none',
3279
3316
  flatButtons: true,
3280
- // showInModes: ['edit'], // Changed: Only show tab in edit mode, not during creation
3317
+ // showInModes: ['edit'],
3281
3318
  columns: [
3282
3319
  { name: 'productName', type: 'text', alias: 'Product' },
3283
3320
  { name: 'requestedQuantity', type: 'number', alias: 'Requested Qty' },
@@ -3295,6 +3332,7 @@ class InventoryService {
3295
3332
  this.requisitionFormConfig = {
3296
3333
  security: { allow: [this.dataService.capRequisitions] },
3297
3334
  title: 'Requisition',
3335
+ fixedTitle: true, // Changed: Use fixedTitle to avoid duplication with 'New Requisition' button
3298
3336
  multiColumn: true,
3299
3337
  includeAudit: true,
3300
3338
  fields: [
@@ -3313,14 +3351,14 @@ class InventoryService {
3313
3351
  heroField: 'requisitionID'
3314
3352
  };
3315
3353
  this.requisitionEditButton = { name: 'edit', dialog: true, action: { url: 'requisitions?action=edit', method: 'post' } };
3316
- this.requisitionSubmitButton = { name: 'submit', display: 'Submit Requisition', icon: { name: 'send', color: 'primary' }, action: { url: 'requisitions?action=submit', method: 'post', successMessage: 'Requisition Submitted' }, confirm: { message: 'Submit this requisition for approval?' }, visible: (row) => row.status === 0 }; // Changed: Added submit button for edit mode only
3354
+ this.requisitionSubmitButton = { name: 'submit', display: 'Submit Requisition', icon: { name: 'send', color: 'primary' }, action: { url: 'requisitions?action=submit', method: 'post', successMessage: 'Requisition Submitted' }, confirm: { message: 'Submit this requisition for approval?' }, visible: (row) => row.status === 0 };
3317
3355
  this.requisitionIssueButton = { name: 'issue', display: 'Issue Items', icon: { name: 'check', color: 'green' }, inDialog: true, action: { url: 'requisitions?action=issue', method: 'post', successMessage: 'Items Issued' }, confirm: { message: 'Issue items for this requisition?' }, visible: (row) => row.pendingApproval === false && row.status === 0 };
3318
3356
  this.requisitionCancelButton = { name: 'cancel', display: 'Cancel Request', icon: { name: 'close', color: 'red' }, inDialog: true, action: { url: 'requisitions?action=cancel', method: 'post', successMessage: 'Requisition Cancelled' }, confirm: { message: 'Cancel this requisition?' }, visible: (row) => row.status === 0 };
3319
3357
  this.requisitionDetailsConfig = {
3320
3358
  formConfig: this.requisitionFormConfig,
3321
3359
  tableConfigs: [this.requisitionItemsTableConfig],
3322
3360
  heroField: 'requisitionID',
3323
- buttons: [this.requisitionEditButton, this.requisitionSubmitButton, this.requisitionIssueButton, this.requisitionCancelButton] // Changed: Added submit button
3361
+ buttons: [this.requisitionEditButton, this.requisitionSubmitButton, this.requisitionIssueButton, this.requisitionCancelButton]
3324
3362
  };
3325
3363
  this.requisitionViewButton = { name: 'view', dialog: true, detailsConfig: this.requisitionDetailsConfig };
3326
3364
  this.requisitionsTableConfig = {
@@ -3348,15 +3386,151 @@ class InventoryService {
3348
3386
  loadAction: { url: 'requisitions/all/x' },
3349
3387
  formConfig: this.requisitionFormConfig
3350
3388
  };
3351
- //--------------------------Inventory Receipts-------------------------
3352
- this.inventoryReceiptItemFormConfig = {
3353
- title: 'Receipt Item',
3389
+ //--------------------------Purchase Orders-------------------------
3390
+ // Payment type options (used across forms)
3391
+ this.paymentTypeOptions = [
3392
+ { value: 0, name: 'Cash' },
3393
+ { value: 1, name: 'Bank' },
3394
+ { value: 2, name: 'Credit' }
3395
+ ];
3396
+ // PO Item form configuration
3397
+ this.purchaseOrderItemFormConfig = {
3398
+ title: 'PO Item',
3399
+ fixedTitle: true, // Changed: Use fixedTitle to avoid title duplication with button name
3354
3400
  fields: [
3355
- { name: 'productID', type: 'select', alias: 'Product', required: true, loadAction: { url: 'products/list/x' }, detailsConfig: this.productDetailsConfig },
3356
- { name: 'quantity', type: 'number', alias: 'Quantity', required: true },
3357
- { name: 'unitCost', type: 'money', alias: 'Unit Cost', required: true },
3358
- { name: 'lineTotal', type: 'money', alias: 'Line Total', readonly: true },
3359
- { name: 'serialNumbers', type: 'text', alias: 'Serial Numbers (comma-separated)' }
3401
+ { name: 'productID', type: 'select', alias: 'Product', required: true, loadAction: { url: 'products/list/x' }, detailsConfig: this.productDetailsConfig }, // Changed: Added detailsConfig to enable dialog link
3402
+ { name: 'orderedQuantity', type: 'number', alias: 'Quantity', required: true },
3403
+ { name: 'estimatedUnitCost', type: 'money', alias: 'Est. Unit Cost', required: true },
3404
+ { name: 'lineTotal', type: 'money', alias: 'Line Total', readonly: true, hideOnCreate: true } // Changed: Hide line total on create
3405
+ ],
3406
+ loadAction: { url: 'purchaseorderitems/id' }
3407
+ };
3408
+ // PO Items table - shows ordered vs received quantities
3409
+ this.purchaseOrderItemsTableConfig = {
3410
+ tabTitle: 'Items',
3411
+ showFilter: false,
3412
+ elevation: 'none',
3413
+ flatButtons: true,
3414
+ columns: [
3415
+ { name: 'productName', type: 'text', alias: 'Product' },
3416
+ { name: 'orderedQuantity', type: 'number', alias: 'Ordered' },
3417
+ { name: 'receivedQuantity', type: 'number', alias: 'Received' },
3418
+ { name: 'remainingQuantity', type: 'number', alias: 'Remaining' },
3419
+ { name: 'estimatedUnitCost', type: 'money', alias: 'Est. Cost' },
3420
+ { name: 'lineTotal', type: 'money', alias: 'Line Total' },
3421
+ { name: 'isFullyReceived', type: 'checkbox', alias: 'Complete', icon: { name: 'check_circle', color: 'green' } }
3422
+ ],
3423
+ buttons: [
3424
+ { name: 'create', display: 'Add Item', dialog: true, action: { url: 'purchaseorderitems?action=create', method: 'post' } },
3425
+ { name: 'edit', dialog: true, action: { url: 'purchaseorderitems?action=edit', method: 'post' } },
3426
+ { name: 'delete', dialog: true, action: { url: 'purchaseorderitems?action=delete', method: 'post' } }
3427
+ ],
3428
+ loadAction: { url: 'purchaseorderitems/x/x' },
3429
+ loadCriteria: 'po',
3430
+ loadIDField: 'purchaseOrderID',
3431
+ formConfig: this.purchaseOrderItemFormConfig
3432
+ };
3433
+ // PO form configuration
3434
+ this.purchaseOrderFormConfig = {
3435
+ security: { allow: [this.dataService.capInventoryReceipts] },
3436
+ title: 'Purchase Order',
3437
+ fixedTitle: true, // Changed: Use fixedTitle to avoid title duplication
3438
+ multiColumn: true,
3439
+ includeAudit: true,
3440
+ fields: [
3441
+ { name: 'poInfo', type: 'section', alias: 'Purchase Order Information' },
3442
+ { name: 'poNumber', type: 'text', alias: 'PO Number', readonly: true, hideOnCreate: true, section: 'poInfo' }, // Changed: Hide PO number on create
3443
+ { name: 'supplierID', type: 'select', required: true, alias: 'Supplier', section: 'poInfo', loadAction: { url: 'suppliers/list/x' }, detailsConfig: this.dataService.supplierDetailsConfig },
3444
+ { name: 'orderDate', type: 'date', required: true, alias: 'Order Date', section: 'poInfo' },
3445
+ { name: 'expectedDeliveryDate', type: 'date', alias: 'Expected Delivery', section: 'poInfo' },
3446
+ { name: 'totals', type: 'section', alias: 'Totals', hideOnCreate: true, collapsed: true }, // Changed: Hide totals section on create and collapse by default
3447
+ { name: 'totalAmount', type: 'money', alias: 'Total Amount', readonly: true, section: 'totals' },
3448
+ { name: 'totalReceivedAmount', type: 'money', alias: 'Received Amount', readonly: true, section: 'totals' },
3449
+ { name: 'remainingAmount', type: 'money', alias: 'Remaining', readonly: true, section: 'totals' },
3450
+ { name: 'additionalInfo', type: 'section', alias: 'Additional Information', collapsed: true },
3451
+ { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'additionalInfo' }
3452
+ ], // Changed: Removed statusName field completely
3453
+ loadAction: { url: 'purchaseorders/id' },
3454
+ heroField: 'purchaseOrderID'
3455
+ };
3456
+ // Special form for receiving goods from PO
3457
+ this.receiveGoodsFormConfig = {
3458
+ title: 'Receive Goods',
3459
+ multiColumn: true,
3460
+ fields: [
3461
+ { name: 'purchaseOrderID', type: 'number', alias: 'PO ID', readonly: true, hidden: true },
3462
+ { name: 'poNumber', type: 'text', alias: 'PO Number', readonly: true },
3463
+ { name: 'supplierID', type: 'number', alias: 'Supplier ID', readonly: true, hidden: true },
3464
+ { name: 'supplierName', type: 'text', alias: 'Supplier', readonly: true },
3465
+ { name: 'receiptDate', type: 'date', required: true, alias: 'Receipt Date' },
3466
+ { name: 'paymentType', type: 'select', required: true, alias: 'Payment Type', options: this.paymentTypeOptions },
3467
+ { name: 'supplierInvoiceNumber', type: 'text', alias: 'Supplier Invoice #' },
3468
+ { name: 'notes', type: 'text', alias: 'Notes', span: true }
3469
+ ]
3470
+ };
3471
+ // Details config for receive goods dialog
3472
+ this.receiveGoodsDetailsConfig = {
3473
+ formConfig: this.receiveGoodsFormConfig,
3474
+ buttons: []
3475
+ };
3476
+ // PO action buttons
3477
+ this.purchaseOrderEditButton = { name: 'edit', dialog: true, action: { url: 'purchaseorders?action=edit', method: 'post' } };
3478
+ this.purchaseOrderConfirmButton = { name: 'confirm', display: 'Confirm PO', inDialog: true, icon: { name: 'check_circle', color: 'blue' }, action: { url: 'purchaseorders?action=confirm', method: 'post', successMessage: 'PO Confirmed' }, confirm: { message: 'Confirm this purchase order? Items will be locked.' }, visible: (po) => po.statusName === 'Draft' };
3479
+ this.purchaseOrderCancelButton = { name: 'cancel', display: 'Cancel PO', inDialog: true, icon: { name: 'cancel', color: 'red' }, action: { url: 'purchaseorders?action=cancel', method: 'post', successMessage: 'PO Cancelled' }, confirm: { message: 'Cancel this purchase order?' }, visible: (po) => po.statusName !== 'FullyReceived' && po.statusName !== 'PartiallyReceived' };
3480
+ // Receive goods button - creates receipt linked to PO
3481
+ this.purchaseOrderReceiveButton = {
3482
+ name: 'receive',
3483
+ display: 'Receive Goods',
3484
+ inDialog: true,
3485
+ icon: { name: 'inventory_2', color: 'green' },
3486
+ dialog: true,
3487
+ detailsConfig: this.receiveGoodsDetailsConfig,
3488
+ action: { url: 'inventoryreceipts?action=create', method: 'post' },
3489
+ visible: (po) => po.statusName === 'Confirmed' || po.statusName === 'PartiallyReceived'
3490
+ };
3491
+ // PO details configuration
3492
+ this.purchaseOrderDetailsConfig = {
3493
+ formConfig: this.purchaseOrderFormConfig,
3494
+ tableConfigs: [this.purchaseOrderItemsTableConfig],
3495
+ heroField: 'purchaseOrderID',
3496
+ buttons: [this.purchaseOrderEditButton, this.purchaseOrderConfirmButton, this.purchaseOrderReceiveButton, this.purchaseOrderCancelButton]
3497
+ };
3498
+ this.purchaseOrderViewButton = { name: 'view', dialog: true, detailsConfig: this.purchaseOrderDetailsConfig };
3499
+ // PO table configuration
3500
+ this.purchaseOrdersTableConfig = {
3501
+ showFilter: true,
3502
+ flatButtons: true,
3503
+ minColumns: ['poNumber', 'supplierName', 'orderDate'],
3504
+ columns: [
3505
+ { name: 'poNumber', type: 'text', alias: 'PO #' },
3506
+ { name: 'supplierName', type: 'text', alias: 'Supplier' },
3507
+ { name: 'orderDate', type: 'date', alias: 'Order Date' },
3508
+ { name: 'expectedDeliveryDate', type: 'date', alias: 'Expected Delivery' },
3509
+ { name: 'totalAmount', type: 'money', alias: 'Total' },
3510
+ { name: 'totalReceivedAmount', type: 'money', alias: 'Received' },
3511
+ { name: 'remainingAmount', type: 'money', alias: 'Remaining' },
3512
+ { name: 'statusName', type: 'chip', alias: 'Status', colors: [{ name: '#E0E0E0', condition: x => x.statusName == 'Draft' }, { name: '#BBDEFB', condition: x => x.statusName == 'Confirmed' }, { name: '#FFE0B2', condition: x => x.statusName == 'PartiallyReceived' }, { name: '#C8E6C9', condition: x => x.statusName == 'FullyReceived' }, { name: '#FFCDD2', condition: x => x.statusName == 'Cancelled' }] } // Changed: Use lighter material colors for better readability
3513
+ ],
3514
+ buttons: [
3515
+ { name: 'create', display: 'New Purchase Order', dialog: true, action: { url: 'purchaseorders?action=create', method: 'post' }, onSuccessButton: this.purchaseOrderViewButton },
3516
+ { name: 'view', dialog: true, detailsConfig: this.purchaseOrderDetailsConfig },
3517
+ { name: 'delete', dialog: true, action: { url: 'purchaseorders?action=delete', method: 'post' } }
3518
+ ],
3519
+ loadAction: { url: 'purchaseorders/all/x' },
3520
+ formConfig: this.purchaseOrderFormConfig
3521
+ };
3522
+ //--------------------------Inventory Receipts (Updated)-------------------------
3523
+ this.inventoryReceiptItemFormConfig = {
3524
+ title: 'Receipt Item',
3525
+ fixedTitle: true, // Changed: Use fixedTitle to avoid duplication with 'Add Item' button
3526
+ fields: [
3527
+ { name: 'productID', type: 'select', alias: 'Product', required: true, span: true,
3528
+ loadAction: { url: 'products/list/x' },
3529
+ detailsConfig: this.productDetailsConfig, infoMessage: 'Product being received' // Changed: Added info message
3530
+ },
3531
+ { name: 'quantity', type: 'number', alias: 'Quantity', required: true, infoMessage: 'Number of units received' }, // Changed: Added info message
3532
+ { name: 'unitCost', type: 'money', alias: 'Unit Cost', required: true, infoMessage: 'Cost per unit' }, // Changed: Added info message
3533
+ { name: 'serialNumbers', type: 'text', alias: 'Serial Numbers (comma-separated)', infoMessage: 'Comma-separated list of serial numbers for tracked items' }
3360
3534
  ],
3361
3535
  loadAction: { url: 'inventoryreceiptitems/id' }
3362
3536
  };
@@ -3365,14 +3539,14 @@ class InventoryService {
3365
3539
  showFilter: false,
3366
3540
  elevation: 'none',
3367
3541
  flatButtons: true,
3368
- // showInModes: ['edit'], // Changed: Only show tab in edit mode, not during creation
3542
+ // showInModes: ['edit'],
3369
3543
  columns: [
3370
3544
  { name: 'productName', type: 'text', alias: 'Product' },
3371
3545
  { name: 'quantity', type: 'number', alias: 'Quantity' },
3546
+ { name: 'unitName', type: 'text', alias: 'Unit' }, // Changed: Added unit column to display unit of measure from product
3372
3547
  { name: 'unitCost', type: 'money', alias: 'Unit Cost' },
3373
- { name: 'lineTotal', type: 'money', alias: 'Line Total' },
3374
- { name: 'serialNumbers', type: 'text', alias: 'Serial Numbers' }
3375
- ],
3548
+ { name: 'lineTotal', type: 'money', alias: 'Line Total' }
3549
+ ], // Changed: Removed serialNumbers column
3376
3550
  buttons: [
3377
3551
  { name: 'create', display: 'Add Item', dialog: true, action: { url: 'inventoryreceiptitems?action=create', method: 'post' } },
3378
3552
  { name: 'edit', dialog: true, action: { url: 'inventoryreceiptitems?action=edit', method: 'post' } },
@@ -3384,54 +3558,83 @@ class InventoryService {
3384
3558
  this.inventoryReceiptFormConfig = {
3385
3559
  security: { allow: [this.dataService.capInventoryReceipts] },
3386
3560
  title: 'Inventory Receipt',
3561
+ fixedTitle: true,
3387
3562
  multiColumn: true,
3388
3563
  includeAudit: true,
3389
3564
  fields: [
3390
3565
  { name: 'receiptInfo', type: 'section', alias: 'Receipt Information' },
3391
- { name: 'receiptNumber', type: 'text', alias: 'Receipt Number', readonly: true, section: 'receiptInfo' },
3392
- { name: 'supplierID', type: 'select', required: true, alias: 'Supplier', section: 'receiptInfo', loadAction: { url: 'suppliers/list/x' }, detailsConfig: this.dataService.supplierDetailsConfig },
3393
- { name: 'receiptDate', type: 'date', required: true, alias: 'Receipt Date', section: 'receiptInfo' },
3394
- { name: 'supplierInvoiceNumber', type: 'text', alias: 'Supplier Invoice #', section: 'receiptInfo' },
3395
- { name: 'totals', type: 'section', alias: 'Totals' },
3396
- { name: 'totalAmount', type: 'money', alias: 'Total Amount', readonly: true, section: 'totals' },
3566
+ { name: 'receiptNumber', type: 'text', alias: 'Receipt Number', readonly: true, hideOnCreate: true, section: 'receiptInfo', infoMessage: 'Auto-generated unique receipt identifier' }, // Changed: Added info message
3567
+ { name: 'poNumber', type: 'text', alias: 'PO Number', hideOnCreate: true, section: 'receiptInfo', hiddenCondition: (row) => !row.purchaseOrderID, infoMessage: 'Linked purchase order if receiving against a PO' }, // Changed: Hide PO number if no PO linked, added info message
3568
+ { name: 'supplierID', type: 'select', required: true, alias: 'Supplier', section: 'receiptInfo',
3569
+ loadAction: { url: 'suppliers/list/x' }, detailsConfig: this.dataService.supplierDetailsConfig, infoMessage: 'Supplier providing the goods' // Changed: Added info message
3570
+ },
3571
+ { name: 'receiptDate', type: 'date', required: true, alias: 'Receipt Date', section: 'receiptInfo', infoMessage: 'Date goods were received' }, // Changed: Added info message
3572
+ { name: 'paymentType', type: 'select', required: true, alias: 'Payment Type', section: 'receiptInfo', options: this.paymentTypeOptions, defaultFirstValue: true, infoMessage: 'Payment method used for this purchase' }, // Changed: Default payment type to Cash (value: 0), added info message
3573
+ { name: 'supplierInvoiceNumber', type: 'text', alias: 'Supplier Invoice #', section: 'receiptInfo', infoMessage: 'Invoice number from supplier' }, // Changed: Added info message
3574
+ { name: 'totals', type: 'section', alias: 'Totals', hideOnCreate: true, collapsed: true }, // Changed: Hide totals section on create, collapse when shown on edit
3575
+ { name: 'totalAmount', type: 'money', alias: 'Total Amount', readonly: true, section: 'totals', infoMessage: 'Total value of all items' }, // Changed: Added info message
3397
3576
  { name: 'additionalInfo', type: 'section', alias: 'Additional Information', collapsed: true },
3398
- { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'additionalInfo' }
3577
+ { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'additionalInfo', infoMessage: 'Additional notes about this receipt' }
3399
3578
  ],
3400
3579
  loadAction: { url: 'inventoryreceipts/id' },
3401
3580
  heroField: 'inventoryReceiptID'
3402
3581
  };
3403
- this.inventoryReceiptEditButton = { name: 'edit', dialog: true, action: { url: 'inventoryreceipts?action=edit', method: 'post' } };
3404
- this.inventoryReceiptProcessButton = { name: 'process', display: 'Process Receipt', inDialog: true, icon: { name: 'check_circle', color: 'green' }, action: { url: 'inventoryreceipts?action=process', method: 'post', successMessage: 'Receipt Processed' }, confirm: { message: 'Process this receipt? Inventory will be updated.' } }; // Changed: Added process button for edit mode only
3582
+ this.inventoryReceiptEditButton = { name: 'edit', dialog: true, action: { url: 'inventoryreceipts?action=edit', method: 'post' }, visible: (x) => x.status !== InventoryReceiptStatus.Completed }; // Changed: Use status enum instead of statusName
3583
+ this.inventoryReceiptCompleteButton = { name: 'complete', display: 'Complete Receipt', inDialog: true, // Changed: Updated display text and action name
3584
+ icon: { name: 'check_circle', color: 'green' },
3585
+ action: { url: 'inventoryreceipts?action=complete', method: 'post', successMessage: 'Receipt Completed' }, // Changed: Updated endpoint and message
3586
+ confirm: { message: 'Complete this receipt? Inventory will be updated and receipt will become read-only.' }, // Changed: Updated confirmation message
3587
+ visible: (x) => x.status !== InventoryReceiptStatus.Completed // Changed: Use status enum instead of statusName
3588
+ };
3589
+ this.inventoryReceiptStepConfig = {
3590
+ valueField: 'status', // Changed: Use status instead of statusName
3591
+ sticky: true,
3592
+ steps: [
3593
+ { name: 'Draft', value: InventoryReceiptStatus.Draft, icon: 'article' }, // Changed: Use enum value
3594
+ { name: 'Receiving', value: InventoryReceiptStatus.Receiving, icon: 'inventory_2' }, // Changed: Use enum value
3595
+ { name: 'Completed', value: InventoryReceiptStatus.Completed, icon: 'check_circle' } // Changed: Use enum value
3596
+ ]
3597
+ };
3405
3598
  this.inventoryReceiptDetailsConfig = {
3406
3599
  formConfig: this.inventoryReceiptFormConfig,
3407
3600
  tableConfigs: [this.inventoryReceiptItemsTableConfig],
3408
3601
  heroField: 'inventoryReceiptID',
3409
- buttons: [this.inventoryReceiptEditButton, this.inventoryReceiptProcessButton] // Changed: Added process button
3602
+ stepConfig: this.inventoryReceiptStepConfig, // Changed: Added step config
3603
+ buttons: [this.inventoryReceiptEditButton, this.inventoryReceiptCompleteButton] // Changed: Updated button reference
3410
3604
  };
3411
3605
  this.inventoryReceiptViewButton = { name: 'view', dialog: true, detailsConfig: this.inventoryReceiptDetailsConfig };
3606
+ this.inventoryQuickPurchaseButton = { name: 'create', display: 'Quick Purchase', dialog: true, action: { url: 'inventoryreceipts?action=create', method: 'post' }, onSuccessButton: this.inventoryReceiptViewButton };
3412
3607
  this.inventoryReceiptsTableConfig = {
3413
3608
  showFilter: true,
3414
3609
  flatButtons: true,
3415
3610
  minColumns: ['receiptNumber', 'supplierName', 'receiptDate'],
3416
3611
  columns: [
3417
- { name: 'receiptNumber', type: 'text', alias: 'Receipt #' },
3612
+ { name: 'receiptNumber', type: 'text', alias: 'Receipt #', icon: { name: 'hourglass_empty', color: 'orange', condition: (x) => x.pendingApproval, tip: 'Pending Approval' } },
3418
3613
  { name: 'supplierName', type: 'text', alias: 'Supplier' },
3419
3614
  { name: 'receiptDate', type: 'date', alias: 'Date' },
3420
- { name: 'supplierInvoiceNumber', type: 'text', alias: 'Invoice #' },
3421
- { name: 'totalAmount', type: 'money', alias: 'Total' },
3422
- { name: 'pendingApproval', type: 'checkbox', alias: 'Pending' }
3615
+ { name: 'status', type: 'icon', alias: 'Status', detailsConfig: this.inventoryReceiptDetailsConfig, // Changed: Use status instead of statusName
3616
+ icons: [
3617
+ { name: 'article', color: '#9E9E9E', condition: (x) => x.status === InventoryReceiptStatus.Draft, tip: 'Draft' }, // Changed: Use status enum
3618
+ { name: 'inventory_2', color: '#2196F3', condition: (x) => x.status === InventoryReceiptStatus.Receiving, tip: 'Receiving' }, // Changed: Use status enum
3619
+ { name: 'check_circle', color: '#4CAF50', condition: (x) => x.status === InventoryReceiptStatus.Completed, tip: 'Completed' } // Changed: Use status enum
3620
+ ]
3621
+ },
3622
+ { name: 'paymentTypeName', type: 'text', alias: 'Payment' },
3623
+ { name: 'totalAmount', type: 'money', alias: 'Total Value' }
3423
3624
  ],
3424
3625
  buttons: [
3425
- { name: 'create', display: 'New Receipt', dialog: true, action: { url: 'inventoryreceipts?action=create', method: 'post' }, onSuccessButton: this.inventoryReceiptViewButton },
3426
- { name: 'edit', dialog: true, detailsConfig: this.inventoryReceiptDetailsConfig },
3427
- { name: 'delete', dialog: true, action: { url: 'inventoryreceipts?action=delete', method: 'post' } }
3626
+ { name: 'view', icon: { name: 'launch' }, dialog: true, detailsConfig: this.inventoryReceiptDetailsConfig },
3627
+ this.inventoryQuickPurchaseButton,
3628
+ { name: 'edit', dialog: true, detailsConfig: this.inventoryReceiptDetailsConfig, visible: (x) => x.status !== InventoryReceiptStatus.Completed }, // Changed: Use status enum instead of statusName
3629
+ { name: 'delete', dialog: true, action: { url: 'inventoryreceipts?action=delete', method: 'post' }, visible: (x) => x.status !== InventoryReceiptStatus.Completed } // Changed: Use status enum instead of statusName
3428
3630
  ],
3429
- loadAction: { url: 'inventoryreceipts/all/x' },
3631
+ loadAction: { url: 'inventoryreceipts/all/x?order=desc' },
3430
3632
  formConfig: this.inventoryReceiptFormConfig
3431
3633
  };
3432
3634
  //--------------------------Sales Orders-------------------------
3433
3635
  this.salesOrderItemFormConfig = {
3434
3636
  title: 'Sales Order Item',
3637
+ fixedTitle: true, // Changed: Use fixedTitle to avoid duplication with 'Add Item' button
3435
3638
  fields: [
3436
3639
  { name: 'productID', type: 'select', alias: 'Product', required: true, loadAction: { url: 'products/list/x' }, detailsConfig: this.productDetailsConfig },
3437
3640
  { name: 'quantity', type: 'number', alias: 'Quantity', required: true },
@@ -3447,7 +3650,7 @@ class InventoryService {
3447
3650
  showFilter: false,
3448
3651
  elevation: 'none',
3449
3652
  flatButtons: true,
3450
- // showInModes: ['edit'], // Changed: Only show tab in edit mode, not during creation
3653
+ // showInModes: ['edit'],
3451
3654
  columns: [
3452
3655
  { name: 'productName', type: 'text', alias: 'Product' },
3453
3656
  { name: 'quantity', type: 'number', alias: 'Quantity' },
@@ -3479,6 +3682,9 @@ class InventoryService {
3479
3682
  { name: 'quickProcess', type: 'section', alias: 'Quick Processing' },
3480
3683
  { name: 'quickDelivery', type: 'checkbox', alias: 'Quick Delivery (Skip to Delivered)', section: 'quickProcess' },
3481
3684
  { name: 'deliveredDate', type: 'date', alias: 'Delivery Date', section: 'quickProcess' },
3685
+ { name: 'paymentInfo', type: 'section', alias: 'Payment (For Delivery)' },
3686
+ { name: 'paymentMethod', type: 'select', alias: 'Payment Method', section: 'paymentInfo', options: [{ name: 'Cash', value: 0 }, { name: 'Bank Transfer', value: 1 }, { name: 'Mobile Money', value: 2 }, { name: 'Card', value: 3 }, { name: 'Credit', value: 4 }] },
3687
+ { name: 'paymentReference', type: 'text', alias: 'Payment Reference', section: 'paymentInfo' },
3482
3688
  { name: 'status', type: 'select', alias: 'Status', readonly: true, loadAction: { url: 'salesorders/list/status' } },
3483
3689
  { name: 'totals', type: 'section', alias: 'Totals' },
3484
3690
  { name: 'subTotal', type: 'money', alias: 'Sub Total', readonly: true, section: 'totals' },
@@ -3553,19 +3759,60 @@ class InventoryService {
3553
3759
  minColumns: ['productName', 'serialNumber', 'quantity'],
3554
3760
  columns: [
3555
3761
  { name: 'productName', type: 'text', alias: 'Product' },
3556
- { name: 'serialNumber', type: 'text', alias: 'Serial Number' },
3762
+ { name: 'serialNumber', type: 'text', alias: 'Serial Number' }, // Changed: Backend should return N/A for non-serialized products
3557
3763
  { name: 'quantity', type: 'number', alias: 'Quantity' },
3558
3764
  { name: 'unitCost', type: 'money', alias: 'Unit Cost' },
3559
3765
  { name: 'totalValue', type: 'money', alias: 'Total Value' },
3560
- { name: 'status', type: 'text', alias: 'Status' },
3766
+ { name: 'statusName', type: 'text', alias: 'Status' }, // Changed: Use statusName instead of status to show status name
3561
3767
  { name: 'receivedDate', type: 'date', alias: 'Received Date' }
3562
3768
  ],
3563
3769
  buttons: [
3770
+ // this.inventoryQuickPurchaseButton,
3564
3771
  { name: 'view', dialog: true, detailsConfig: this.inventoryItemDetailsConfig }
3565
3772
  ],
3566
3773
  loadAction: { url: 'inventoryitems/all/x' },
3567
3774
  formConfig: this.inventoryItemFormConfig
3568
3775
  };
3776
+ //--------------------------Inventory Stock (Grouped by Product)-------------------------
3777
+ // Changed: Reuse existing inventoryItemsTableConfig with product criteria filter
3778
+ this.inventoryStockItemsTableConfig = {
3779
+ ...this.inventoryItemsTableConfig,
3780
+ tabTitle: 'Stock Items',
3781
+ showFilter: false,
3782
+ elevation: 'none',
3783
+ flatButtons: true,
3784
+ buttons: [],
3785
+ loadAction: { url: 'inventoryitems/stock/x' }, loadCriteria: 'product', loadIDField: 'productID'
3786
+ };
3787
+ // Changed: Reuse product form config, filter to show only Product Information section fields
3788
+ this.inventoryStockProductFormConfig = {
3789
+ ...this.productFormConfig,
3790
+ security: { allow: [this.dataService.capInventoryStock] },
3791
+ fields: this.productFormConfig.fields.filter(f => f.section === 'productInfo' || f.name === 'productInfo').map(f => ({ ...f, readonly: true })),
3792
+ loadAction: { url: 'products/id' }
3793
+ };
3794
+ // Changed: Details config reuses simplified product form and inventory items table
3795
+ this.inventoryStockDetailsConfig = {
3796
+ formConfig: this.inventoryStockProductFormConfig,
3797
+ tableConfigs: [this.inventoryStockItemsTableConfig],
3798
+ heroField: 'productID',
3799
+ buttons: []
3800
+ };
3801
+ // Changed: Table config for inventory stock grouped by product
3802
+ this.inventoryStockTableConfig = {
3803
+ showFilter: true,
3804
+ flatButtons: true,
3805
+ minColumns: ['productName', 'totalQuantity'],
3806
+ columns: [
3807
+ { name: 'productName', type: 'button', alias: 'Product', detailsConfig: this.inventoryStockDetailsConfig },
3808
+ { name: 'totalQuantity', type: 'number', alias: 'Total Stock', icon: { name: 'warning', color: 'orange', condition: (x) => x.isLowInventory } }
3809
+ ],
3810
+ buttons: [
3811
+ { name: 'view', dialog: true, detailsConfig: this.inventoryStockDetailsConfig }
3812
+ ],
3813
+ loadAction: { url: 'inventoryitems/stock/all' },
3814
+ formConfig: this.productFormConfig
3815
+ };
3569
3816
  //--------------------------Inventory Adjustments-------------------------
3570
3817
  this.inventoryAdjustmentFormConfig = {
3571
3818
  security: { allow: [this.dataService.capInventoryAdjustments] },
@@ -3630,14 +3877,14 @@ class InventoryService {
3630
3877
  this.inventoryTransactionsTableConfig = {
3631
3878
  showFilter: true,
3632
3879
  flatButtons: true,
3633
- minColumns: ['productName', 'transactionType', 'quantity'],
3880
+ minColumns: ['productName', 'transactionTypeName', 'quantity'],
3634
3881
  columns: [
3882
+ { name: 'transactionDate', type: 'date', alias: 'Date' },
3883
+ { name: 'transactionTypeName', type: 'text', alias: 'Type' },
3635
3884
  { name: 'productName', type: 'text', alias: 'Product' },
3636
- { name: 'transactionType', type: 'text', alias: 'Type' },
3637
3885
  { name: 'quantity', type: 'number', alias: 'Quantity' },
3638
3886
  { name: 'unitCost', type: 'money', alias: 'Unit Cost' },
3639
3887
  { name: 'totalValue', type: 'money', alias: 'Total Value' },
3640
- { name: 'transactionDate', type: 'date', alias: 'Date' },
3641
3888
  { name: 'referenceType', type: 'text', alias: 'Reference' }
3642
3889
  ],
3643
3890
  buttons: [
@@ -3646,7 +3893,107 @@ class InventoryService {
3646
3893
  loadAction: { url: 'inventorytransactions/all/x' },
3647
3894
  formConfig: this.inventoryTransactionFormConfig
3648
3895
  };
3649
- // Changed: Assign productDetailsConfig in constructor
3896
+ //--------------------------Sale Items-------------------------
3897
+ this.saleItemFormConfig = {
3898
+ security: { allow: [this.dataService.capSales] },
3899
+ title: 'Sale Item',
3900
+ fixedTitle: true, // Changed: Use fixedTitle to avoid duplication with 'Add Item' button
3901
+ fields: [
3902
+ { name: 'productID', type: 'select', required: true, alias: 'Product', span: true, loadAction: { url: 'products/list/x' } }, // Changed: Added span to make field full width
3903
+ { name: 'quantity', type: 'number', required: true, alias: 'Quantity' },
3904
+ { name: 'unitPrice', type: 'money', required: true, alias: 'Unit Price' },
3905
+ { name: 'discount', type: 'money', alias: 'Discount' },
3906
+ { name: 'inventoryItemID', type: 'select', alias: 'Serial Number', loadAction: { url: 'inventoryitems/list/serialized' } } // Changed: Filter to only show serialized items; lineTotal field removed
3907
+ ],
3908
+ loadAction: { url: 'saleitems/id' }
3909
+ };
3910
+ this.saleItemsTableConfig = {
3911
+ tabTitle: 'Items',
3912
+ showFilter: false,
3913
+ elevation: 'none',
3914
+ flatButtons: true,
3915
+ columns: [
3916
+ { name: 'productName', type: 'text', alias: 'Product' },
3917
+ { name: 'quantity', type: 'number', alias: 'Quantity' },
3918
+ { name: 'unitPrice', type: 'money', alias: 'Unit Price' },
3919
+ { name: 'discount', type: 'money', alias: 'Discount' },
3920
+ { name: 'lineTotal', type: 'money', alias: 'Line Total' },
3921
+ { name: 'serialNumber', type: 'text', alias: 'Serial Number' }
3922
+ ],
3923
+ buttons: [
3924
+ { name: 'create', display: 'Add Item', dialog: true, action: { url: 'saleitems?action=create', method: 'post' } },
3925
+ { name: 'edit', dialog: true, action: { url: 'saleitems?action=edit', method: 'post' } },
3926
+ { name: 'delete', dialog: true, action: { url: 'saleitems?action=delete', method: 'post' } }
3927
+ ],
3928
+ loadAction: { url: 'saleitems/x/x' }, loadCriteria: 'sale', loadIDField: 'saleID',
3929
+ formConfig: this.saleItemFormConfig
3930
+ };
3931
+ //--------------------------Sales-------------------------
3932
+ this.saleFormConfig = {
3933
+ security: { allow: [this.dataService.capSales] },
3934
+ title: 'Sale',
3935
+ fixedTitle: true, // Changed: Use fixedTitle to avoid duplication with 'New Sale' button
3936
+ multiColumn: true,
3937
+ includeAudit: true,
3938
+ fields: [
3939
+ { name: 'saleInfo', type: 'section', alias: 'Sale Information' },
3940
+ { name: 'saleNumber', type: 'text', alias: 'Sale #', readonly: true, section: 'saleInfo', hideOnCreate: true, infoMessage: 'Unique identifier for this sale' },
3941
+ { name: 'saleType', type: 'select', required: true, alias: 'Sale Type', section: 'saleInfo', options: [{ name: 'Quick Sale', value: 0 }, { name: 'From Order', value: 1 }], defaultFirstValue: true, infoMessage: 'Select if this is a quick sale or created from an order' },
3942
+ { name: 'customerID', type: 'select', alias: 'Customer', section: 'saleInfo', loadAction: { url: 'customers/list/x' }, detailsConfig: this.dataService.customerDetailsConfig, infoMessage: 'Select an existing customer or leave blank for walk-in' },
3943
+ { name: 'customerName', type: 'text', alias: 'Walk-in Customer Name', section: 'saleInfo', hiddenCondition: x => x.customerID != null, infoMessage: 'Name of walk-in customer (shown when no customer is selected)' },
3944
+ { name: 'saleDate', type: 'date', required: true, alias: 'Sale Date', section: 'saleInfo', infoMessage: 'Date when the sale was completed' },
3945
+ { name: 'paymentInfo', type: 'section', alias: 'Payment Information' },
3946
+ { name: 'paymentMethod', type: 'select', required: true, alias: 'Payment Method', section: 'paymentInfo', options: [{ name: 'Cash', value: 0 }, { name: 'Bank Transfer', value: 1 }, { name: 'Mobile Money', value: 2 }, { name: 'Card', value: 3 }, { name: 'Credit', value: 4 }], defaultFirstValue: true, infoMessage: 'Method of payment used for this sale' },
3947
+ { name: 'paymentReference', type: 'text', alias: 'Payment Reference', section: 'paymentInfo', infoMessage: 'Transaction reference number or payment receipt' },
3948
+ { name: 'paymentStatus', type: 'select', alias: 'Payment Status', readonly: true, section: 'paymentInfo', loadAction: { url: 'sales/list/payment-status' }, hideOnCreate: true, infoMessage: 'Current payment status of the sale' },
3949
+ { name: 'totals', type: 'section', alias: 'Totals', collapsed: true, hideOnCreate: true },
3950
+ { name: 'subTotal', type: 'money', alias: 'Sub Total', readonly: true, section: 'totals', infoMessage: 'Total before tax and discounts' },
3951
+ { name: 'taxAmount', type: 'money', alias: 'Tax Amount', section: 'totals', infoMessage: 'Tax amount applied to the sale' },
3952
+ { name: 'discount', type: 'money', alias: 'Discount', section: 'totals', infoMessage: 'Discount amount applied to the sale' },
3953
+ { name: 'totalAmount', type: 'money', alias: 'Total Amount', readonly: true, section: 'totals', infoMessage: 'Final amount after tax and discounts' },
3954
+ { name: 'additionalInfo', type: 'section', alias: 'Additional Information', collapsed: true },
3955
+ { name: 'notes', type: 'text', alias: 'Notes', span: true, section: 'additionalInfo', infoMessage: 'Additional notes or comments about this sale' }
3956
+ ],
3957
+ loadAction: { url: 'sales/id' },
3958
+ heroField: 'saleID'
3959
+ };
3960
+ // Details dialog config for sale with complete button (only visible if not yet paid)
3961
+ this.saleDetailsConfig = {
3962
+ formConfig: this.saleFormConfig,
3963
+ tableConfigs: [this.saleItemsTableConfig],
3964
+ heroField: 'saleID',
3965
+ buttons: [
3966
+ { name: 'complete', display: 'Complete Sale', color: 'primary', inDialog: true,
3967
+ action: { url: 'sales?action=complete', method: 'post' },
3968
+ confirm: { message: 'Complete this sale? This will reduce inventory and create accounting entries.' },
3969
+ visible: x => x.paymentStatus !== 1
3970
+ }
3971
+ ]
3972
+ };
3973
+ this.saleViewButton = { name: 'view', dialog: true, detailsConfig: this.saleDetailsConfig };
3974
+ this.saleCreateButton = { name: 'create', display: 'New Sale', dialog: true,
3975
+ action: { url: 'sales?action=create', method: 'post' },
3976
+ onSuccessButton: this.saleViewButton
3977
+ };
3978
+ this.salesTableConfig = {
3979
+ showFilter: true,
3980
+ flatButtons: true,
3981
+ minColumns: ['saleNumber', 'displayCustomerName', 'totalAmount'],
3982
+ columns: [
3983
+ { name: 'saleNumber', type: 'text', alias: 'Sale #' },
3984
+ { name: 'saleTypeName', type: 'chip', alias: 'Type', colors: [{ name: '#4CAF50', condition: x => x.saleType === 0 }, { name: '#2196F3', condition: x => x.saleType === 1 }] },
3985
+ { name: 'displayCustomerName', type: 'text', alias: 'Customer' },
3986
+ { name: 'saleDate', type: 'date', alias: 'Date' },
3987
+ { name: 'paymentMethodName', type: 'text', alias: 'Payment Method' },
3988
+ { name: 'paymentStatusName', type: 'chip', alias: 'Payment Status', colors: [{ name: '#F44336', condition: x => x.paymentStatus === 0 }, { name: '#4CAF50', condition: x => x.paymentStatus === 1 }, { name: '#FF9800', condition: x => x.paymentStatus === 2 }] },
3989
+ { name: 'totalAmount', type: 'money', alias: 'Total' }
3990
+ ],
3991
+ buttons: [
3992
+ this.saleViewButton, this.saleCreateButton
3993
+ ],
3994
+ loadAction: { url: 'sales/all/x' },
3995
+ formConfig: this.saleFormConfig
3996
+ };
3650
3997
  this.productDetailsConfig = {
3651
3998
  formConfig: this.productFormConfig,
3652
3999
  heroField: 'productID',
@@ -11001,14 +11348,17 @@ class TenantsComponent {
11001
11348
  tableConfig: this.tenantsTableConfig
11002
11349
  };
11003
11350
  }
11004
- ngOnInit() {
11005
- }
11006
11351
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TenantsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11007
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: TenantsComponent, isStandalone: false, selector: "spa-tenants", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [".title{margin-top:1em;font-size:larger;font-weight:300}\n"], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11352
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: TenantsComponent, isStandalone: true, selector: "spa-tenants", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11008
11353
  }
11009
11354
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TenantsComponent, decorators: [{
11010
11355
  type: Component,
11011
- args: [{ selector: 'spa-tenants', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [".title{margin-top:1em;font-size:larger;font-weight:300}\n"] }]
11356
+ args: [{
11357
+ selector: 'spa-tenants',
11358
+ standalone: true,
11359
+ imports: [TinSpaModule],
11360
+ template: '<spa-page [config]="pageConfig"></spa-page>'
11361
+ }]
11012
11362
  }] });
11013
11363
 
11014
11364
  class BugComponent {
@@ -11057,14 +11407,17 @@ class MembershipComponent {
11057
11407
  tableConfig: this.membersTableConfig
11058
11408
  };
11059
11409
  }
11060
- ngOnInit() {
11061
- }
11062
11410
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MembershipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11063
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: MembershipComponent, isStandalone: false, selector: "spa-membership", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11411
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: MembershipComponent, isStandalone: true, selector: "spa-membership", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11064
11412
  }
11065
11413
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MembershipComponent, decorators: [{
11066
11414
  type: Component,
11067
- args: [{ selector: 'spa-membership', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
11415
+ args: [{
11416
+ selector: 'spa-membership',
11417
+ standalone: true,
11418
+ imports: [TinSpaModule],
11419
+ template: '<spa-page [config]="pageConfig"></spa-page>'
11420
+ }]
11068
11421
  }] });
11069
11422
 
11070
11423
  class PlansComponent {
@@ -11101,14 +11454,17 @@ class PlansComponent {
11101
11454
  tableConfig: this.plansTableConfig
11102
11455
  };
11103
11456
  }
11104
- ngOnInit() {
11105
- }
11106
11457
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PlansComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11107
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: PlansComponent, isStandalone: false, selector: "spa-plans", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11458
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: PlansComponent, isStandalone: true, selector: "spa-plans", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11108
11459
  }
11109
11460
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PlansComponent, decorators: [{
11110
11461
  type: Component,
11111
- args: [{ selector: 'spa-plans', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
11462
+ args: [{
11463
+ selector: 'spa-plans',
11464
+ standalone: true,
11465
+ imports: [TinSpaModule],
11466
+ template: '<spa-page [config]="pageConfig"></spa-page>'
11467
+ }]
11112
11468
  }] });
11113
11469
 
11114
11470
  class CustomersComponent {
@@ -11120,15 +11476,17 @@ class CustomersComponent {
11120
11476
  tableConfig: this.dataService.customersTableConfig
11121
11477
  };
11122
11478
  }
11123
- ngOnInit() {
11124
- // this.loadTenants();
11125
- }
11126
11479
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CustomersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11127
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: CustomersComponent, isStandalone: false, selector: "spa-customers", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11480
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: CustomersComponent, isStandalone: true, selector: "spa-customers", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11128
11481
  }
11129
11482
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CustomersComponent, decorators: [{
11130
11483
  type: Component,
11131
- args: [{ selector: 'spa-customers', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
11484
+ args: [{
11485
+ selector: 'spa-customers',
11486
+ standalone: true,
11487
+ imports: [TinSpaModule],
11488
+ template: '<spa-page [config]="pageConfig"></spa-page>'
11489
+ }]
11132
11490
  }] });
11133
11491
 
11134
11492
  class SuppliersComponent {
@@ -11141,14 +11499,17 @@ class SuppliersComponent {
11141
11499
  tableConfig: this.dataService.suppliersTableConfig
11142
11500
  };
11143
11501
  }
11144
- ngOnInit() {
11145
- }
11146
11502
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SuppliersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11147
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SuppliersComponent, isStandalone: false, selector: "spa-suppliers", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11503
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SuppliersComponent, isStandalone: true, selector: "spa-suppliers", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11148
11504
  }
11149
11505
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SuppliersComponent, decorators: [{
11150
11506
  type: Component,
11151
- args: [{ selector: 'spa-suppliers', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n\r\n" }]
11507
+ args: [{
11508
+ selector: 'spa-suppliers',
11509
+ standalone: true,
11510
+ imports: [TinSpaModule],
11511
+ template: '<spa-page [config]="pageConfig"></spa-page>'
11512
+ }]
11152
11513
  }] });
11153
11514
 
11154
11515
  class ListDialogComponent {
@@ -11294,14 +11655,17 @@ class DepartmentsComponent {
11294
11655
  tableConfig: this.dataService.departmentTableConfig
11295
11656
  };
11296
11657
  }
11297
- ngOnInit() {
11298
- }
11299
11658
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: DepartmentsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11300
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: DepartmentsComponent, isStandalone: false, selector: "spa-departments", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11659
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: DepartmentsComponent, isStandalone: true, selector: "spa-departments", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11301
11660
  }
11302
11661
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: DepartmentsComponent, decorators: [{
11303
11662
  type: Component,
11304
- args: [{ selector: 'spa-departments', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
11663
+ args: [{
11664
+ selector: 'spa-departments',
11665
+ standalone: true,
11666
+ imports: [TinSpaModule],
11667
+ template: '<spa-page [config]="pageConfig"></spa-page>'
11668
+ }]
11305
11669
  }] });
11306
11670
 
11307
11671
  class EmployeesComponent {
@@ -11313,14 +11677,17 @@ class EmployeesComponent {
11313
11677
  tableConfig: this.dataService.employeesTableConfig
11314
11678
  };
11315
11679
  }
11316
- ngOnInit() {
11317
- }
11318
11680
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: EmployeesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11319
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: EmployeesComponent, isStandalone: false, selector: "spa-employees", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11681
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: EmployeesComponent, isStandalone: true, selector: "spa-employees", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11320
11682
  }
11321
11683
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: EmployeesComponent, decorators: [{
11322
11684
  type: Component,
11323
- args: [{ selector: 'spa-employees', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
11685
+ args: [{
11686
+ selector: 'spa-employees',
11687
+ standalone: true,
11688
+ imports: [TinSpaModule],
11689
+ template: '<spa-page [config]="pageConfig"></spa-page>'
11690
+ }]
11324
11691
  }] });
11325
11692
 
11326
11693
  class PositionsComponent {
@@ -11332,15 +11699,17 @@ class PositionsComponent {
11332
11699
  tableConfig: this.dataService.positionsTableConfig
11333
11700
  };
11334
11701
  }
11335
- ngOnInit() {
11336
- // this.dataService.loadPositionMeta();
11337
- }
11338
11702
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PositionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11339
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: PositionsComponent, isStandalone: false, selector: "spa-positions", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11703
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: PositionsComponent, isStandalone: true, selector: "spa-positions", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11340
11704
  }
11341
11705
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PositionsComponent, decorators: [{
11342
11706
  type: Component,
11343
- args: [{ selector: 'spa-positions', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
11707
+ args: [{
11708
+ selector: 'spa-positions',
11709
+ standalone: true,
11710
+ imports: [TinSpaModule],
11711
+ template: '<spa-page [config]="pageConfig"></spa-page>'
11712
+ }]
11344
11713
  }] });
11345
11714
 
11346
11715
  class GradesComponent {
@@ -11839,14 +12208,17 @@ class AppModelsComponent {
11839
12208
  tableConfig: this.appModelTableConfig
11840
12209
  };
11841
12210
  }
11842
- ngOnInit() {
11843
- }
11844
12211
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AppModelsComponent, deps: [{ token: DataServiceLib }], target: i0.ɵɵFactoryTarget.Component }); }
11845
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: AppModelsComponent, isStandalone: false, selector: "spa-app-models", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
12212
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: AppModelsComponent, isStandalone: true, selector: "spa-app-models", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
11846
12213
  }
11847
12214
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AppModelsComponent, decorators: [{
11848
12215
  type: Component,
11849
- args: [{ selector: 'spa-app-models', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
12216
+ args: [{
12217
+ selector: 'spa-app-models',
12218
+ standalone: true,
12219
+ imports: [TinSpaModule],
12220
+ template: '<spa-page [config]="pageConfig"></spa-page>'
12221
+ }]
11850
12222
  }], ctorParameters: () => [{ type: DataServiceLib }] });
11851
12223
 
11852
12224
  class NotificationsConfigComponent {
@@ -12027,215 +12399,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
12027
12399
  type: Input
12028
12400
  }] } });
12029
12401
 
12030
- // Migrated from Shift src/app/home/default/fin-accounts/fin-accounts.component.ts
12031
- class AccountsComponent {
12032
- constructor(dataServiceLib, accountingService) {
12033
- this.dataServiceLib = dataServiceLib;
12034
- this.accountingService = accountingService;
12035
- this.accountTileConfig = {
12036
- tiles: [
12037
- { name: 'totalAssets', alias: 'Total Assets', color: '#2196F3', info: 'Total value of all asset accounts' },
12038
- { name: 'totalLiabilities', alias: 'Total Liabilities', color: '#F44336', info: 'Total value of all liability accounts' },
12039
- { name: 'totalRevenue', alias: 'Revenue', color: '#9C27B0', info: 'Total revenue from all sources' },
12040
- { name: 'totalExpense', alias: 'Expenses', color: '#FF9800', info: 'Total expenses across all accounts' },
12041
- { name: 'totalEquity', alias: 'Total Equity', color: '#4CAF50', info: 'Total value of all equity accounts' },
12042
- ]
12402
+ class LoanProductsComponent {
12403
+ constructor() {
12404
+ this.loansService = inject(LoansService);
12405
+ this.pageConfig = {
12406
+ title: 'Loan Products',
12407
+ tableConfig: this.loansService.loanProductTableConfig
12043
12408
  };
12044
- // Configure tabs with separate load and count actions for lazy loading
12045
- this.accountTabConfigs = [
12046
- {
12047
- ...this.accountingService.accountsTableConfig,
12048
- tabTitle: 'Assets',
12049
- loadAction: { url: 'accounts/type/asset' },
12050
- countAction: { url: 'accounts/count/asset' }
12051
- },
12052
- {
12053
- ...this.accountingService.accountsTableConfig,
12054
- tabTitle: 'Liabilities',
12055
- loadAction: { url: 'accounts/type/liability' },
12056
- countAction: { url: 'accounts/count/liability' }
12057
- },
12058
- {
12059
- ...this.accountingService.accountsTableConfig,
12060
- tabTitle: 'Income',
12061
- loadAction: { url: 'accounts/type/income' },
12062
- countAction: { url: 'accounts/count/income' }
12063
- },
12064
- {
12065
- ...this.accountingService.accountsTableConfig,
12066
- tabTitle: 'Expenses',
12067
- loadAction: { url: 'accounts/type/expense' },
12068
- countAction: { url: 'accounts/count/expense' }
12069
- },
12070
- {
12071
- ...this.accountingService.accountsTableConfig,
12072
- tabTitle: 'Equity',
12073
- loadAction: { url: 'accounts/type/equity' },
12074
- countAction: { url: 'accounts/count/equity' }
12075
- },
12076
- {
12077
- ...this.accountingService.accountsTableConfig,
12078
- tabTitle: 'Aggregate',
12079
- loadAction: { url: 'accounts/type/aggregate' },
12080
- countAction: { url: 'accounts/count/aggregate' },
12081
- buttons: [...this.accountingService.accountsTableConfig.buttons.filter(x => x.name == 'view')]
12082
- }
12083
- ];
12084
- }
12085
- ngOnInit() {
12086
- this.loadSummaryData();
12087
- }
12088
- loadSummaryData() {
12089
- this.dataServiceLib.CallApi({ url: 'accounts/summary/x' }, '').subscribe((apiResponse) => {
12090
- if (apiResponse.success) {
12091
- this.summaryData = apiResponse.data;
12092
- }
12093
- });
12094
12409
  }
12095
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AccountsComponent, deps: [{ token: DataServiceLib }, { token: AccountingService }], target: i0.ɵɵFactoryTarget.Component }); }
12096
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: AccountsComponent, isStandalone: false, selector: "spa-accounts", ngImport: i0, template: "<!-- Migrated from Shift src/app/home/default/fin-accounts/fin-accounts.component.html -->\r\n<h4>Accounts</h4>\r\n<hr>\r\n\r\n<!-- Summary Tiles -->\r\n<div *ngIf=\"summaryData\" class=\"mt-3 mb-3\">\r\n <spa-tiles [config]=\"accountTileConfig\" [data]=\"summaryData\"></spa-tiles>\r\n</div>\r\n\r\n<!-- Account Type Tabs with lazy loading -->\r\n<spa-tabs [tableConfigs]=\"accountTabConfigs\"></spa-tabs>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TilesComponent, selector: "spa-tiles", inputs: ["config", "lastSearch", "data", "reload"], outputs: ["tileActionSelected", "tileClick", "tileUnClick"] }, { kind: "component", type: TabsComponent, selector: "spa-tabs", inputs: ["tableConfigs"] }] }); }
12410
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LoanProductsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12411
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: LoanProductsComponent, isStandalone: true, selector: "spa-loan-products", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
12097
12412
  }
12098
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AccountsComponent, decorators: [{
12413
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LoanProductsComponent, decorators: [{
12099
12414
  type: Component,
12100
- args: [{ selector: 'spa-accounts', standalone: false, template: "<!-- Migrated from Shift src/app/home/default/fin-accounts/fin-accounts.component.html -->\r\n<h4>Accounts</h4>\r\n<hr>\r\n\r\n<!-- Summary Tiles -->\r\n<div *ngIf=\"summaryData\" class=\"mt-3 mb-3\">\r\n <spa-tiles [config]=\"accountTileConfig\" [data]=\"summaryData\"></spa-tiles>\r\n</div>\r\n\r\n<!-- Account Type Tabs with lazy loading -->\r\n<spa-tabs [tableConfigs]=\"accountTabConfigs\"></spa-tabs>\r\n" }]
12101
- }], ctorParameters: () => [{ type: DataServiceLib }, { type: AccountingService }] });
12415
+ args: [{
12416
+ selector: 'spa-loan-products',
12417
+ standalone: true,
12418
+ imports: [TinSpaModule],
12419
+ template: '<spa-page [config]="pageConfig"></spa-page>'
12420
+ }]
12421
+ }] });
12102
12422
 
12103
- // Migrated from Shift src/app/home/default/fin-transaction-types/fin-transaction-types.component.ts
12104
- class TransactionTypesComponent {
12423
+ class LoansComponent {
12105
12424
  constructor() {
12106
- this.accountingService = inject(AccountingService);
12107
- this.pageConfig = {
12108
- title: 'Transaction Types',
12109
- tableConfig: this.accountingService.transactionTypesTableConfig
12110
- };
12111
- }
12112
- ngOnInit() {
12113
- }
12114
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TransactionTypesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12115
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: TransactionTypesComponent, isStandalone: false, selector: "spa-transaction-types", ngImport: i0, template: "<!-- Migrated from Shift src/app/home/default/fin-transaction-types/fin-transaction-types.component.html -->\r\n<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
12116
- }
12117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TransactionTypesComponent, decorators: [{
12118
- type: Component,
12119
- args: [{ selector: 'spa-transaction-types', standalone: false, template: "<!-- Migrated from Shift src/app/home/default/fin-transaction-types/fin-transaction-types.component.html -->\r\n<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
12120
- }] });
12121
-
12122
- // Migrated from Shift src/app/home/default/fin-transactions/fin-transactions.component.ts
12123
- class TransactionsComponent {
12124
- constructor() {
12125
- this.accountingService = inject(AccountingService);
12126
- this.pageConfig = {
12127
- title: 'Transactions',
12128
- tableConfig: this.accountingService.transactionsTableConfig
12129
- };
12130
- }
12131
- ngOnInit() {
12132
- }
12133
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TransactionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12134
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: TransactionsComponent, isStandalone: false, selector: "spa-transactions", ngImport: i0, template: "<!-- Migrated from Shift src/app/home/default/fin-transactions/fin-transactions.component.html -->\r\n<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
12135
- }
12136
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TransactionsComponent, decorators: [{
12137
- type: Component,
12138
- args: [{ selector: 'spa-transactions', standalone: false, template: "<!-- Migrated from Shift src/app/home/default/fin-transactions/fin-transactions.component.html -->\r\n<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
12139
- }] });
12140
-
12141
- // Invoice management component for tin-spa library
12142
- class InvoicesComponent {
12143
- constructor() {
12144
- this.accountingService = inject(AccountingService);
12145
- this.httpService = inject(HttpService);
12146
- this.http = inject(HttpClient);
12147
- this.messageService = inject(MessageService);
12148
- this.pageConfig = {
12149
- title: 'Invoices',
12150
- tableConfig: this.accountingService.invoicesTableConfig
12151
- };
12152
- }
12153
- ngOnInit() {
12154
- }
12155
- // Handle action click events from the table
12156
- actionClicked(event) {
12157
- if (event.name === 'pdf') {
12158
- this.messageService.confirm(`Download Invoice ?`).subscribe((result) => {
12159
- if (result == "yes") {
12160
- this.download(event.data);
12161
- }
12162
- });
12163
- }
12164
- }
12165
- // Download invoice as PDF
12166
- download(invoice) {
12167
- this.http.post(`${this.httpService.apiUrl}invoices/pdf?action=x`, invoice, { responseType: 'blob' })
12168
- .subscribe((response) => {
12169
- const blob = new Blob([response], { type: 'application/pdf' });
12170
- const url = window.URL.createObjectURL(blob);
12171
- const link = document.createElement('a');
12172
- link.href = url;
12173
- link.download = `Invoice_${invoice.invoiceID}.pdf`;
12174
- link.click();
12175
- window.URL.revokeObjectURL(url);
12176
- });
12177
- }
12178
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: InvoicesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12179
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: InvoicesComponent, isStandalone: false, selector: "spa-invoices", ngImport: i0, template: "<!-- Invoice management page -->\r\n<h4>Invoices</h4>\r\n<hr>\r\n<div class=\"mt-3\" style=\"font-size: 14px;\">\r\n <spa-table [config]=\"accountingService.invoicesTableConfig\" (actionClick)=\"actionClicked($event)\"></spa-table>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "component", type: TableComponent, selector: "spa-table", inputs: ["data", "tileData", "config", "reload", "activeTab", "inTab"], outputs: ["dataLoad", "actionSuccess", "refreshClick", "searchClick", "createClick", "actionClick", "inputChange", "actionResponse"] }] }); }
12180
- }
12181
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: InvoicesComponent, decorators: [{
12182
- type: Component,
12183
- args: [{ selector: 'spa-invoices', standalone: false, template: "<!-- Invoice management page -->\r\n<h4>Invoices</h4>\r\n<hr>\r\n<div class=\"mt-3\" style=\"font-size: 14px;\">\r\n <spa-table [config]=\"accountingService.invoicesTableConfig\" (actionClick)=\"actionClicked($event)\"></spa-table>\r\n</div>\r\n" }]
12184
- }] });
12185
-
12186
- // Outstanding invoices component for tin-spa library
12187
- class OutstandingInvoicesComponent {
12188
- constructor() {
12189
- this.accountingService = inject(AccountingService);
12190
- this.pageConfig = {
12191
- title: 'Outstanding Invoices',
12192
- tableConfig: this.accountingService.outstandingInvoicesTableConfig
12193
- };
12194
- }
12195
- ngOnInit() {
12196
- }
12197
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: OutstandingInvoicesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12198
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: OutstandingInvoicesComponent, isStandalone: false, selector: "spa-outstanding-invoices", ngImport: i0, template: "<!-- Outstanding invoices page -->\r\n<h4>Outstanding Invoices</h4>\r\n<hr>\r\n\r\n<div class=\"mt-3\" style=\"font-size: 14px;\">\r\n <spa-table [config]=\"accountingService.outstandingInvoicesTableConfig\"></spa-table>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "component", type: TableComponent, selector: "spa-table", inputs: ["data", "tileData", "config", "reload", "activeTab", "inTab"], outputs: ["dataLoad", "actionSuccess", "refreshClick", "searchClick", "createClick", "actionClick", "inputChange", "actionResponse"] }] }); }
12199
- }
12200
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: OutstandingInvoicesComponent, decorators: [{
12201
- type: Component,
12202
- args: [{ selector: 'spa-outstanding-invoices', standalone: false, template: "<!-- Outstanding invoices page -->\r\n<h4>Outstanding Invoices</h4>\r\n<hr>\r\n\r\n<div class=\"mt-3\" style=\"font-size: 14px;\">\r\n <spa-table [config]=\"accountingService.outstandingInvoicesTableConfig\"></spa-table>\r\n</div>\r\n" }]
12203
- }] });
12204
-
12205
- class LoanProductsComponent {
12206
- constructor() {
12207
- this.loansService = inject(LoansService);
12208
- this.pageConfig = {
12209
- title: 'Loan Products',
12210
- tableConfig: this.loansService.loanProductTableConfig
12211
- };
12212
- }
12213
- ngOnInit() {
12214
- }
12215
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LoanProductsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12216
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: LoanProductsComponent, isStandalone: false, selector: "spa-loan-products", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
12217
- }
12218
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LoanProductsComponent, decorators: [{
12219
- type: Component,
12220
- args: [{ selector: 'spa-loan-products', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
12221
- }] });
12222
-
12223
- class LoansComponent {
12224
- constructor() {
12225
- this.loansService = inject(LoansService);
12425
+ this.loansService = inject(LoansService);
12226
12426
  this.pageConfig = {
12227
12427
  title: 'Loans',
12228
12428
  tableConfig: this.loansService.loanTableConfig
12229
12429
  };
12230
12430
  }
12231
- ngOnInit() {
12232
- }
12233
12431
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LoansComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12234
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: LoansComponent, isStandalone: false, selector: "spa-loans", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
12432
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: LoansComponent, isStandalone: true, selector: "spa-loans", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
12235
12433
  }
12236
12434
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LoansComponent, decorators: [{
12237
12435
  type: Component,
12238
- args: [{ selector: 'spa-loans', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
12436
+ args: [{
12437
+ selector: 'spa-loans',
12438
+ standalone: true,
12439
+ imports: [TinSpaModule],
12440
+ template: '<spa-page [config]="pageConfig"></spa-page>'
12441
+ }]
12239
12442
  }] });
12240
12443
 
12241
12444
  class LoanPaymentsComponent {
@@ -12246,14 +12449,17 @@ class LoanPaymentsComponent {
12246
12449
  tableConfig: this.loansService.loanPaymentTableConfig
12247
12450
  };
12248
12451
  }
12249
- ngOnInit() {
12250
- }
12251
12452
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LoanPaymentsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12252
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: LoanPaymentsComponent, isStandalone: false, selector: "spa-loan-payments", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
12453
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: LoanPaymentsComponent, isStandalone: true, selector: "spa-loan-payments", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
12253
12454
  }
12254
12455
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LoanPaymentsComponent, decorators: [{
12255
12456
  type: Component,
12256
- args: [{ selector: 'spa-loan-payments', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
12457
+ args: [{
12458
+ selector: 'spa-loan-payments',
12459
+ standalone: true,
12460
+ imports: [TinSpaModule],
12461
+ template: '<spa-page [config]="pageConfig"></spa-page>'
12462
+ }]
12257
12463
  }] });
12258
12464
 
12259
12465
  class TinSpaModule {
@@ -12261,20 +12467,20 @@ class TinSpaModule {
12261
12467
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: TinSpaModule, declarations: [TinSpaComponent, TextComponent, CheckComponent, DateComponent, DatetimeComponent, LabelComponent, SelectComponent,
12262
12468
  ActivityComponent, FilterComponent, messageDialog, MoneyComponent, OptionComponent, TilesComponent, StepsComponent,
12263
12469
  AttachComponent, ChipsComponent, LoaderComponent, NavMenuComponent, TableComponent, TableInternalComponent, DetailsDialog, DetailsDialogInternal, FormComponent, CamelToWordsPipe, NumberComponent, SearchComponent, ViewerComponent, viewerDialog,
12264
- TenantSettingsComponent, TenantsComponent, BugComponent, MembershipComponent, PlansComponent, CustomersComponent,
12265
- SuppliersComponent,
12470
+ TenantSettingsComponent, BugComponent,
12266
12471
  ListDialogComponent, TasksComponent,
12267
- DepartmentsComponent, EmployeesComponent, PositionsComponent, GradesComponent, WelcomeComponent, NotificationsComponent, InvitationsTableComponent,
12472
+ GradesComponent, WelcomeComponent, NotificationsComponent, InvitationsTableComponent,
12268
12473
  TableHeaderComponent, TableRowComponent, TableActionComponent,
12269
12474
  AlertComponent, EmailComponent, PageComponent, SelectCommonComponent, SelectInternalComponent, SuffixComponent, SelectContextDirective, SelectLiteComponent,
12270
12475
  TableLiteComponent, DetailsDialogLite, ApprovalsComponent, ApprovalsConfigComponent, MultiTextComponent,
12271
- MultiSelectComponent, SelectBitwiseComponent, AppModelsComponent, NotificationsConfigComponent,
12272
- HtmlComponent, NotesComponent, CapsulesComponent, CardsComponent, TabsComponent, StatusesComponent, GroupsComponent, TitleActionsComponent,
12273
- AccountsComponent, TransactionTypesComponent, TransactionsComponent, InvoicesComponent, OutstandingInvoicesComponent,
12274
- LoanProductsComponent, LoansComponent, LoanPaymentsComponent], imports: [SpaMatModule,
12476
+ MultiSelectComponent, SelectBitwiseComponent, NotificationsConfigComponent,
12477
+ HtmlComponent, NotesComponent, CapsulesComponent, CardsComponent, TabsComponent, StatusesComponent, GroupsComponent, TitleActionsComponent], imports: [SpaMatModule,
12275
12478
  HttpClientModule,
12276
12479
  CurrencyInputModule,
12277
- NgxDocViewerModule], exports: [TinSpaComponent,
12480
+ NgxDocViewerModule,
12481
+ TenantsComponent, MembershipComponent, PlansComponent, CustomersComponent,
12482
+ SuppliersComponent, DepartmentsComponent, EmployeesComponent, PositionsComponent,
12483
+ AppModelsComponent, LoanProductsComponent, LoansComponent, LoanPaymentsComponent], exports: [TinSpaComponent,
12278
12484
  SpaMatModule,
12279
12485
  AlertComponent,
12280
12486
  TextComponent,
@@ -12304,16 +12510,15 @@ class TinSpaModule {
12304
12510
  ViewerComponent,
12305
12511
  viewerDialog,
12306
12512
  ListDialogComponent,
12307
- CustomersComponent,
12308
- SuppliersComponent,
12309
12513
  ListDialogComponent, TasksComponent,
12310
- DepartmentsComponent, EmployeesComponent, PositionsComponent, GradesComponent,
12514
+ GradesComponent,
12311
12515
  WelcomeComponent, EmailComponent, PageComponent,
12312
12516
  HtmlComponent,
12313
12517
  NotesComponent,
12314
12518
  CapsulesComponent, TabsComponent, StatusesComponent, GroupsComponent, TitleActionsComponent,
12315
- AccountsComponent, TransactionTypesComponent, TransactionsComponent, InvoicesComponent, OutstandingInvoicesComponent,
12316
- LoanProductsComponent, LoansComponent, LoanPaymentsComponent] }); }
12519
+ TenantsComponent, MembershipComponent, PlansComponent, CustomersComponent,
12520
+ SuppliersComponent, DepartmentsComponent, EmployeesComponent, PositionsComponent,
12521
+ AppModelsComponent, LoanProductsComponent, LoansComponent, LoanPaymentsComponent] }); }
12317
12522
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TinSpaModule, providers: [
12318
12523
  { provide: HTTP_INTERCEPTORS, useClass: LoaderInterceptor, multi: true },
12319
12524
  { provide: LocationStrategy, useClass: HashLocationStrategy },
@@ -12324,7 +12529,10 @@ class TinSpaModule {
12324
12529
  ], imports: [SpaMatModule,
12325
12530
  HttpClientModule,
12326
12531
  CurrencyInputModule,
12327
- NgxDocViewerModule, SpaMatModule] }); }
12532
+ NgxDocViewerModule,
12533
+ TenantsComponent, MembershipComponent, PlansComponent, CustomersComponent,
12534
+ SuppliersComponent, DepartmentsComponent, EmployeesComponent, PositionsComponent,
12535
+ AppModelsComponent, LoanProductsComponent, LoansComponent, LoanPaymentsComponent, SpaMatModule] }); }
12328
12536
  }
12329
12537
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TinSpaModule, decorators: [{
12330
12538
  type: NgModule,
@@ -12333,23 +12541,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
12333
12541
  TinSpaComponent, TextComponent, CheckComponent, DateComponent, DatetimeComponent, LabelComponent, SelectComponent,
12334
12542
  ActivityComponent, FilterComponent, messageDialog, MoneyComponent, OptionComponent, TilesComponent, StepsComponent,
12335
12543
  AttachComponent, ChipsComponent, LoaderComponent, NavMenuComponent, TableComponent, TableInternalComponent, DetailsDialog, DetailsDialogInternal, FormComponent, CamelToWordsPipe, NumberComponent, SearchComponent, ViewerComponent, viewerDialog,
12336
- TenantSettingsComponent, TenantsComponent, BugComponent, MembershipComponent, PlansComponent, CustomersComponent,
12337
- SuppliersComponent,
12544
+ TenantSettingsComponent, BugComponent,
12338
12545
  ListDialogComponent, TasksComponent,
12339
- DepartmentsComponent, EmployeesComponent, PositionsComponent, GradesComponent, WelcomeComponent, NotificationsComponent, InvitationsTableComponent,
12546
+ GradesComponent, WelcomeComponent, NotificationsComponent, InvitationsTableComponent,
12340
12547
  TableHeaderComponent, TableRowComponent, TableActionComponent,
12341
12548
  AlertComponent, EmailComponent, PageComponent, SelectCommonComponent, SelectInternalComponent, SuffixComponent, SelectContextDirective, SelectLiteComponent,
12342
12549
  TableLiteComponent, DetailsDialogLite, ApprovalsComponent, ApprovalsConfigComponent, MultiTextComponent,
12343
- MultiSelectComponent, SelectBitwiseComponent, AppModelsComponent, NotificationsConfigComponent,
12344
- HtmlComponent, NotesComponent, CapsulesComponent, CardsComponent, TabsComponent, StatusesComponent, GroupsComponent, TitleActionsComponent,
12345
- AccountsComponent, TransactionTypesComponent, TransactionsComponent, InvoicesComponent, OutstandingInvoicesComponent,
12346
- LoanProductsComponent, LoansComponent, LoanPaymentsComponent
12550
+ MultiSelectComponent, SelectBitwiseComponent, NotificationsConfigComponent,
12551
+ HtmlComponent, NotesComponent, CapsulesComponent, CardsComponent, TabsComponent, StatusesComponent, GroupsComponent, TitleActionsComponent
12347
12552
  ],
12348
12553
  imports: [
12349
12554
  SpaMatModule,
12350
12555
  HttpClientModule,
12351
12556
  CurrencyInputModule,
12352
12557
  NgxDocViewerModule,
12558
+ TenantsComponent, MembershipComponent, PlansComponent, CustomersComponent,
12559
+ SuppliersComponent, DepartmentsComponent, EmployeesComponent, PositionsComponent,
12560
+ AppModelsComponent, LoanProductsComponent, LoansComponent, LoanPaymentsComponent
12353
12561
  ],
12354
12562
  exports: [
12355
12563
  TinSpaComponent,
@@ -12382,16 +12590,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
12382
12590
  ViewerComponent,
12383
12591
  viewerDialog,
12384
12592
  ListDialogComponent,
12385
- CustomersComponent,
12386
- SuppliersComponent,
12387
12593
  ListDialogComponent, TasksComponent,
12388
- DepartmentsComponent, EmployeesComponent, PositionsComponent, GradesComponent,
12594
+ GradesComponent,
12389
12595
  WelcomeComponent, EmailComponent, PageComponent,
12390
12596
  HtmlComponent,
12391
12597
  NotesComponent,
12392
12598
  CapsulesComponent, TabsComponent, StatusesComponent, GroupsComponent, TitleActionsComponent,
12393
- AccountsComponent, TransactionTypesComponent, TransactionsComponent, InvoicesComponent, OutstandingInvoicesComponent,
12394
- LoanProductsComponent, LoansComponent, LoanPaymentsComponent
12599
+ TenantsComponent, MembershipComponent, PlansComponent, CustomersComponent,
12600
+ SuppliersComponent, DepartmentsComponent, EmployeesComponent, PositionsComponent,
12601
+ AppModelsComponent, LoanProductsComponent, LoansComponent, LoanPaymentsComponent
12395
12602
  ],
12396
12603
  providers: [
12397
12604
  { provide: HTTP_INTERCEPTORS, useClass: LoaderInterceptor, multi: true },
@@ -13395,11 +13602,16 @@ class CategoriesComponent {
13395
13602
  };
13396
13603
  }
13397
13604
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CategoriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13398
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: CategoriesComponent, isStandalone: false, selector: "spa-categories", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
13605
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: CategoriesComponent, isStandalone: true, selector: "spa-categories", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
13399
13606
  }
13400
13607
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CategoriesComponent, decorators: [{
13401
13608
  type: Component,
13402
- args: [{ selector: 'spa-categories', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
13609
+ args: [{
13610
+ selector: 'spa-categories',
13611
+ standalone: true,
13612
+ imports: [TinSpaModule],
13613
+ template: '<spa-page [config]="pageConfig"></spa-page>'
13614
+ }]
13403
13615
  }] });
13404
13616
 
13405
13617
  class SubCategoriesComponent {
@@ -13411,11 +13623,16 @@ class SubCategoriesComponent {
13411
13623
  };
13412
13624
  }
13413
13625
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SubCategoriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13414
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SubCategoriesComponent, isStandalone: false, selector: "spa-subcategories", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
13626
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SubCategoriesComponent, isStandalone: true, selector: "spa-subcategories", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
13415
13627
  }
13416
13628
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SubCategoriesComponent, decorators: [{
13417
13629
  type: Component,
13418
- args: [{ selector: 'spa-subcategories', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
13630
+ args: [{
13631
+ selector: 'spa-subcategories',
13632
+ standalone: true,
13633
+ imports: [TinSpaModule],
13634
+ template: '<spa-page [config]="pageConfig"></spa-page>'
13635
+ }]
13419
13636
  }] });
13420
13637
 
13421
13638
  class BrandsComponent {
@@ -13427,11 +13644,16 @@ class BrandsComponent {
13427
13644
  };
13428
13645
  }
13429
13646
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: BrandsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13430
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: BrandsComponent, isStandalone: false, selector: "spa-brands", ngImport: i0, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n", styles: [""], dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
13647
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: BrandsComponent, isStandalone: true, selector: "spa-brands", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
13431
13648
  }
13432
13649
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: BrandsComponent, decorators: [{
13433
13650
  type: Component,
13434
- args: [{ selector: 'spa-brands', standalone: false, template: "<spa-page [config]=\"pageConfig\"></spa-page>\r\n" }]
13651
+ args: [{
13652
+ selector: 'spa-brands',
13653
+ standalone: true,
13654
+ imports: [TinSpaModule],
13655
+ template: '<spa-page [config]="pageConfig"></spa-page>'
13656
+ }]
13435
13657
  }] });
13436
13658
 
13437
13659
  class SpaAdminModule {
@@ -13441,13 +13663,13 @@ class SpaAdminModule {
13441
13663
  addRoleDialog,
13442
13664
  CreateAccountComponent,
13443
13665
  LogsComponent,
13444
- SettingsComponent,
13445
- CategoriesComponent,
13446
- SubCategoriesComponent,
13447
- BrandsComponent], imports: [i2$2.ReactiveFormsModule, CommonModule,
13666
+ SettingsComponent], imports: [i2$2.ReactiveFormsModule, CommonModule,
13448
13667
  FormsModule,
13449
13668
  ReactiveFormsModule,
13450
- TinSpaModule], exports: [CommonModule,
13669
+ TinSpaModule,
13670
+ CategoriesComponent,
13671
+ SubCategoriesComponent,
13672
+ BrandsComponent], exports: [CommonModule,
13451
13673
  FormsModule,
13452
13674
  TinSpaModule,
13453
13675
  UsersComponent,
@@ -13463,7 +13685,10 @@ class SpaAdminModule {
13463
13685
  CommonModule,
13464
13686
  FormsModule,
13465
13687
  ReactiveFormsModule,
13466
- TinSpaModule, CommonModule,
13688
+ TinSpaModule,
13689
+ CategoriesComponent,
13690
+ SubCategoriesComponent,
13691
+ BrandsComponent, CommonModule,
13467
13692
  FormsModule,
13468
13693
  TinSpaModule] }); }
13469
13694
  }
@@ -13476,17 +13701,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
13476
13701
  addRoleDialog,
13477
13702
  CreateAccountComponent,
13478
13703
  LogsComponent,
13479
- SettingsComponent,
13480
- CategoriesComponent,
13481
- SubCategoriesComponent,
13482
- BrandsComponent
13704
+ SettingsComponent
13483
13705
  ],
13484
13706
  imports: [
13485
13707
  ReactiveFormsModule.withConfig({ warnOnNgModelWithFormControl: "never" }),
13486
13708
  CommonModule,
13487
13709
  FormsModule,
13488
13710
  ReactiveFormsModule,
13489
- TinSpaModule
13711
+ TinSpaModule,
13712
+ CategoriesComponent,
13713
+ SubCategoriesComponent,
13714
+ BrandsComponent
13490
13715
  ],
13491
13716
  exports: [
13492
13717
  CommonModule,
@@ -13546,6 +13771,223 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
13546
13771
  }]
13547
13772
  }] });
13548
13773
 
13774
+ // Migrated from Shift src/app/home/default/fin-accounts/fin-accounts.component.ts
13775
+ class AccountsComponent {
13776
+ constructor(dataServiceLib, accountingService) {
13777
+ this.dataServiceLib = dataServiceLib;
13778
+ this.accountingService = accountingService;
13779
+ this.accountTileConfig = {
13780
+ tiles: [
13781
+ { name: 'totalAssets', alias: 'Total Assets', color: '#2196F3', info: 'Total value of all asset accounts' },
13782
+ { name: 'totalLiabilities', alias: 'Total Liabilities', color: '#F44336', info: 'Total value of all liability accounts' },
13783
+ { name: 'totalRevenue', alias: 'Revenue', color: '#9C27B0', info: 'Total revenue from all sources' },
13784
+ { name: 'totalExpense', alias: 'Expenses', color: '#FF9800', info: 'Total expenses across all accounts' },
13785
+ { name: 'totalEquity', alias: 'Total Equity', color: '#4CAF50', info: 'Total value of all equity accounts' },
13786
+ ]
13787
+ };
13788
+ this.accountTabConfigs = [
13789
+ {
13790
+ ...this.accountingService.accountsTableConfig,
13791
+ tabTitle: 'Assets',
13792
+ loadAction: { url: 'accounts/type/asset' },
13793
+ countAction: { url: 'accounts/count/asset' }
13794
+ },
13795
+ {
13796
+ ...this.accountingService.accountsTableConfig,
13797
+ tabTitle: 'Liabilities',
13798
+ loadAction: { url: 'accounts/type/liability' },
13799
+ countAction: { url: 'accounts/count/liability' }
13800
+ },
13801
+ {
13802
+ ...this.accountingService.accountsTableConfig,
13803
+ tabTitle: 'Income',
13804
+ loadAction: { url: 'accounts/type/income' },
13805
+ countAction: { url: 'accounts/count/income' }
13806
+ },
13807
+ {
13808
+ ...this.accountingService.accountsTableConfig,
13809
+ tabTitle: 'Expenses',
13810
+ loadAction: { url: 'accounts/type/expense' },
13811
+ countAction: { url: 'accounts/count/expense' }
13812
+ },
13813
+ {
13814
+ ...this.accountingService.accountsTableConfig,
13815
+ tabTitle: 'Equity',
13816
+ loadAction: { url: 'accounts/type/equity' },
13817
+ countAction: { url: 'accounts/count/equity' }
13818
+ },
13819
+ {
13820
+ ...this.accountingService.accountsTableConfig,
13821
+ tabTitle: 'Aggregate',
13822
+ loadAction: { url: 'accounts/type/aggregate' },
13823
+ countAction: { url: 'accounts/count/aggregate' },
13824
+ buttons: [...this.accountingService.accountsTableConfig.buttons.filter(x => x.name == 'view')]
13825
+ }
13826
+ ];
13827
+ }
13828
+ ngOnInit() {
13829
+ this.loadSummaryData();
13830
+ }
13831
+ loadSummaryData() {
13832
+ this.dataServiceLib.CallApi({ url: 'accounts/summary/x' }, '').subscribe((apiResponse) => {
13833
+ if (apiResponse.success) {
13834
+ this.summaryData = apiResponse.data;
13835
+ }
13836
+ });
13837
+ }
13838
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AccountsComponent, deps: [{ token: DataServiceLib }, { token: AccountingService }], target: i0.ɵɵFactoryTarget.Component }); }
13839
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: AccountsComponent, isStandalone: true, selector: "spa-accounts", ngImport: i0, template: `
13840
+ <h4>Accounts</h4>
13841
+ <hr>
13842
+
13843
+ <div *ngIf="summaryData" class="mt-3 mb-3">
13844
+ <spa-tiles [config]="accountTileConfig" [data]="summaryData"></spa-tiles>
13845
+ </div>
13846
+
13847
+ <spa-tabs [tableConfigs]="accountTabConfigs"></spa-tabs>
13848
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TilesComponent, selector: "spa-tiles", inputs: ["config", "lastSearch", "data", "reload"], outputs: ["tileActionSelected", "tileClick", "tileUnClick"] }, { kind: "component", type: TabsComponent, selector: "spa-tabs", inputs: ["tableConfigs"] }] }); }
13849
+ }
13850
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AccountsComponent, decorators: [{
13851
+ type: Component,
13852
+ args: [{
13853
+ selector: 'spa-accounts',
13854
+ template: `
13855
+ <h4>Accounts</h4>
13856
+ <hr>
13857
+
13858
+ <div *ngIf="summaryData" class="mt-3 mb-3">
13859
+ <spa-tiles [config]="accountTileConfig" [data]="summaryData"></spa-tiles>
13860
+ </div>
13861
+
13862
+ <spa-tabs [tableConfigs]="accountTabConfigs"></spa-tabs>
13863
+ `,
13864
+ standalone: true,
13865
+ imports: [TinSpaModule],
13866
+ }]
13867
+ }], ctorParameters: () => [{ type: DataServiceLib }, { type: AccountingService }] });
13868
+
13869
+ // Migrated from Shift src/app/home/default/fin-transaction-types/fin-transaction-types.component.ts
13870
+ class TransactionTypesComponent {
13871
+ constructor() {
13872
+ this.accountingService = inject(AccountingService);
13873
+ this.pageConfig = {
13874
+ title: 'Transaction Types',
13875
+ tableConfig: this.accountingService.transactionTypesTableConfig
13876
+ };
13877
+ }
13878
+ ngOnInit() {
13879
+ }
13880
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TransactionTypesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13881
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: TransactionTypesComponent, isStandalone: true, selector: "spa-transaction-types", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
13882
+ }
13883
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TransactionTypesComponent, decorators: [{
13884
+ type: Component,
13885
+ args: [{
13886
+ selector: 'spa-transaction-types',
13887
+ template: '<spa-page [config]="pageConfig"></spa-page>',
13888
+ standalone: true,
13889
+ imports: [TinSpaModule],
13890
+ }]
13891
+ }] });
13892
+
13893
+ // Migrated from Shift src/app/home/default/fin-transactions/fin-transactions.component.ts
13894
+ class TransactionsComponent {
13895
+ constructor() {
13896
+ this.accountingService = inject(AccountingService);
13897
+ this.pageConfig = {
13898
+ title: 'Transactions',
13899
+ tableConfig: this.accountingService.transactionsTableConfig
13900
+ };
13901
+ }
13902
+ ngOnInit() {
13903
+ }
13904
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TransactionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13905
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: TransactionsComponent, isStandalone: true, selector: "spa-transactions", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
13906
+ }
13907
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TransactionsComponent, decorators: [{
13908
+ type: Component,
13909
+ args: [{
13910
+ selector: 'spa-transactions',
13911
+ template: '<spa-page [config]="pageConfig"></spa-page>',
13912
+ standalone: true,
13913
+ imports: [TinSpaModule],
13914
+ }]
13915
+ }] });
13916
+
13917
+ // Invoice management component for tin-spa library
13918
+ class InvoicesComponent {
13919
+ constructor() {
13920
+ this.accountingService = inject(AccountingService);
13921
+ this.httpService = inject(HttpService);
13922
+ this.http = inject(HttpClient);
13923
+ this.messageService = inject(MessageService);
13924
+ this.pageConfig = {
13925
+ title: 'Invoices',
13926
+ tableConfig: this.accountingService.invoicesTableConfig
13927
+ };
13928
+ }
13929
+ ngOnInit() {
13930
+ }
13931
+ // Handle action click events from the table
13932
+ actionClicked(event) {
13933
+ if (event.name === 'pdf') {
13934
+ this.messageService.confirm(`Download Invoice ?`).subscribe((result) => {
13935
+ if (result == "yes") {
13936
+ this.download(event.data);
13937
+ }
13938
+ });
13939
+ }
13940
+ }
13941
+ // Download invoice as PDF
13942
+ download(invoice) {
13943
+ this.http.post(`${this.httpService.apiUrl}invoices/pdf?action=x`, invoice, { responseType: 'blob' })
13944
+ .subscribe((response) => {
13945
+ const blob = new Blob([response], { type: 'application/pdf' });
13946
+ const url = window.URL.createObjectURL(blob);
13947
+ const link = document.createElement('a');
13948
+ link.href = url;
13949
+ link.download = `Invoice_${invoice.invoiceID}.pdf`;
13950
+ link.click();
13951
+ window.URL.revokeObjectURL(url);
13952
+ });
13953
+ }
13954
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: InvoicesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13955
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: InvoicesComponent, isStandalone: true, selector: "spa-invoices", ngImport: i0, template: '<spa-page [config]="pageConfig" (actionClick)="actionClicked($event)"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
13956
+ }
13957
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: InvoicesComponent, decorators: [{
13958
+ type: Component,
13959
+ args: [{
13960
+ selector: 'spa-invoices',
13961
+ template: '<spa-page [config]="pageConfig" (actionClick)="actionClicked($event)"></spa-page>',
13962
+ standalone: true,
13963
+ imports: [TinSpaModule],
13964
+ }]
13965
+ }] });
13966
+
13967
+ // Outstanding invoices component for tin-spa library
13968
+ class OutstandingInvoicesComponent {
13969
+ constructor() {
13970
+ this.accountingService = inject(AccountingService);
13971
+ this.pageConfig = {
13972
+ title: 'Outstanding Invoices',
13973
+ tableConfig: this.accountingService.outstandingInvoicesTableConfig
13974
+ };
13975
+ }
13976
+ ngOnInit() {
13977
+ }
13978
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: OutstandingInvoicesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13979
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: OutstandingInvoicesComponent, isStandalone: true, selector: "spa-outstanding-invoices", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
13980
+ }
13981
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: OutstandingInvoicesComponent, decorators: [{
13982
+ type: Component,
13983
+ args: [{
13984
+ selector: 'spa-outstanding-invoices',
13985
+ template: '<spa-page [config]="pageConfig"></spa-page>',
13986
+ standalone: true,
13987
+ imports: [TinSpaModule],
13988
+ }]
13989
+ }] });
13990
+
13549
13991
  // Component now uses centralized inventory service for configurations
13550
13992
  class ProductsComponent {
13551
13993
  constructor() {
@@ -13592,6 +14034,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
13592
14034
  }]
13593
14035
  }] });
13594
14036
 
14037
+ class PurchaseOrdersComponent {
14038
+ constructor() {
14039
+ this.inventoryService = inject(InventoryService);
14040
+ this.pageConfig = {
14041
+ title: 'Purchase Orders',
14042
+ tableConfig: this.inventoryService.purchaseOrdersTableConfig
14043
+ };
14044
+ }
14045
+ ngOnInit() { }
14046
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PurchaseOrdersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14047
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: PurchaseOrdersComponent, isStandalone: true, selector: "spa-purchase-orders", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
14048
+ }
14049
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PurchaseOrdersComponent, decorators: [{
14050
+ type: Component,
14051
+ args: [{
14052
+ selector: 'spa-purchase-orders',
14053
+ template: '<spa-page [config]="pageConfig"></spa-page>',
14054
+ standalone: true,
14055
+ imports: [TinSpaModule],
14056
+ }]
14057
+ }] });
14058
+
13595
14059
  // Component now uses centralized inventory service for configurations
13596
14060
  class InventoryReceiptsComponent {
13597
14061
  constructor() {
@@ -13661,6 +14125,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
13661
14125
  }]
13662
14126
  }] });
13663
14127
 
14128
+ class SalesComponent {
14129
+ constructor() {
14130
+ this.inventoryService = inject(InventoryService);
14131
+ this.config = {
14132
+ title: 'Sales',
14133
+ tableConfig: this.inventoryService.salesTableConfig
14134
+ };
14135
+ }
14136
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SalesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14137
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SalesComponent, isStandalone: true, selector: "app-sales", ngImport: i0, template: '<spa-page [config]="config"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
14138
+ }
14139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SalesComponent, decorators: [{
14140
+ type: Component,
14141
+ args: [{
14142
+ selector: 'app-sales',
14143
+ template: '<spa-page [config]="config"></spa-page>',
14144
+ standalone: true,
14145
+ imports: [TinSpaModule]
14146
+ }]
14147
+ }] });
14148
+
13664
14149
  // Component now uses centralized inventory service for configurations
13665
14150
  class InventoryAdjustmentsComponent {
13666
14151
  constructor() {
@@ -13800,6 +14285,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
13800
14285
  }]
13801
14286
  }], ctorParameters: () => [] });
13802
14287
 
14288
+ // Component to display inventory stock grouped by product
14289
+ class InventoryStockComponent {
14290
+ constructor() {
14291
+ this.inventoryService = inject(InventoryService);
14292
+ this.pageConfig = {
14293
+ title: 'Inventory Stock',
14294
+ tableConfig: this.inventoryService.inventoryStockTableConfig
14295
+ };
14296
+ }
14297
+ ngOnInit() { }
14298
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: InventoryStockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14299
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: InventoryStockComponent, isStandalone: true, selector: "spa-inventory-stock", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
14300
+ }
14301
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: InventoryStockComponent, decorators: [{
14302
+ type: Component,
14303
+ args: [{
14304
+ selector: 'spa-inventory-stock',
14305
+ template: '<spa-page [config]="pageConfig"></spa-page>',
14306
+ standalone: true,
14307
+ imports: [TinSpaModule],
14308
+ }]
14309
+ }] });
14310
+
13803
14311
  const routes$1 = [
13804
14312
  { path: "users", component: UsersComponent },
13805
14313
  { path: "roles", component: RolesComponent },
@@ -13837,14 +14345,17 @@ const routes$1 = [
13837
14345
  { path: "loans-payments", component: LoanPaymentsComponent },
13838
14346
  { path: "inventory-products", component: ProductsComponent },
13839
14347
  { path: "inventory-items", component: InventoryItemsComponent },
14348
+ { path: "purchase-orders", component: PurchaseOrdersComponent },
13840
14349
  { path: "inventory-receipts", component: InventoryReceiptsComponent },
13841
14350
  { path: "inventory-requisitions", component: RequisitionsComponent },
13842
14351
  { path: "inventory-sales-orders", component: SalesOrdersComponent },
14352
+ { path: "inventory-sales", component: SalesComponent },
13843
14353
  { path: "inventory-adjustments", component: InventoryAdjustmentsComponent },
13844
14354
  { path: "inventory-returns", component: InventoryReturnsComponent },
13845
14355
  { path: "inventory-requisition-returns", component: RequisitionReturnsComponent },
13846
14356
  { path: "inventory-transactions", component: InventoryTransactionsComponent },
13847
- { path: "inventory-dashboard", component: InventoryDashboardComponent }
14357
+ { path: "inventory-dashboard", component: InventoryDashboardComponent },
14358
+ { path: "inventory-stock", component: InventoryStockComponent } // Changed: Added inventory stock route
13848
14359
  ];
13849
14360
  class AdminRoutingModule {
13850
14361
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AdminRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -13927,5 +14438,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
13927
14438
  * Generated bundle index. Do not edit.
13928
14439
  */
13929
14440
 
13930
- export { Account, AccountsComponent as AccountingAccountsComponent, InvoicesComponent as AccountingInvoicesComponent, OutstandingInvoicesComponent as AccountingOutstandingInvoicesComponent, AccountingService, TransactionTypesComponent as AccountingTransactionTypesComponent, TransactionsComponent as AccountingTransactionsComponent, Action, ActivityComponent, AdminModule, AlertComponent, AlertConfig, AlertMessage, ApiResponse, AppConfig, AttachComponent, AuthService, BrandsComponent, CapItem, CapsulesComponent, CategoriesComponent, ChangePasswordComponent, ChangeUserPassword, CheckComponent, ChipsComponent, Constants, Core, CreateAccountComponent, CustomersComponent, DataServiceLib, DateComponent, DatetimeComponent, DepartmentsComponent, DetailsDialog, DetailsDialogConfig, DetailsDialogProcessor, DetailsSource, DialogService, EmailComponent, EmployeesComponent, ExportService, FilterComponent, FormComponent, FormConfig, GeneralService, GradesComponent, GroupsComponent, HtmlComponent, HttpService, IndexModule, InventoryService, InvoiceStatus, LabelComponent, ListDialogComponent, ListDialogConfig, LoaderComponent, LoaderService, LoanPaymentsComponent, LoanProductsComponent, LoansComponent, LoansService, LogLevel, LogService, LoginComponent, LogsComponent, MessageService, MoneyComponent, MovementType, MultiSelectComponent, MultiTextComponent, NavMenuComponent, NotesComponent, NotesConfig, NumberComponent, OptionComponent, PageComponent, PageConfig, PositionsComponent, Profile, ProfileComponent, RecoverAccountComponent, Register, Role, RoleAccess, RolesComponent, SearchComponent, SearchConfig, SecurityConfig, SelectBitwiseComponent, SelectComponent, SettingsComponent, SignupComponent, SpaAdminModule, SpaIndexModule, SpaMatModule, SpaUserModule, StatusesComponent, Step, StepConfig, StepsComponent, StorageService, SubCategoriesComponent, SuppliersComponent, TableComponent, TableConfig, TabsComponent, TasksComponent, TextComponent, TileConfig, TilesComponent, TinSpaComponent, TinSpaModule, TinSpaService, TitleActionsComponent, User, UserModule, UsersComponent, ViewerComponent, WelcomeComponent, addRoleDialog, authGuard, dialogOptions, loginConfig, messageDialog, viewerDialog };
14441
+ export { Account, AccountsComponent as AccountingAccountsComponent, InvoicesComponent as AccountingInvoicesComponent, OutstandingInvoicesComponent as AccountingOutstandingInvoicesComponent, AccountingService, TransactionTypesComponent as AccountingTransactionTypesComponent, TransactionsComponent as AccountingTransactionsComponent, Action, ActivityComponent, AdminModule, AlertComponent, AlertConfig, AlertMessage, ApiResponse, AppConfig, AppModelsComponent, AttachComponent, AuthService, BrandsComponent, CapItem, CapsulesComponent, CategoriesComponent, ChangePasswordComponent, ChangeUserPassword, CheckComponent, ChipsComponent, Constants, Core, CreateAccountComponent, CustomersComponent, DataServiceLib, DateComponent, DatetimeComponent, DepartmentsComponent, DetailsDialog, DetailsDialogConfig, DetailsDialogProcessor, DetailsSource, DialogService, EmailComponent, EmployeesComponent, ExportService, FilterComponent, FormComponent, FormConfig, GeneralService, GradesComponent, GroupsComponent, HtmlComponent, HttpService, IndexModule, InventoryReceiptStatus, InventoryService, InvoiceStatus, LabelComponent, ListDialogComponent, ListDialogConfig, LoaderComponent, LoaderService, LoanPaymentsComponent, LoanProductsComponent, LoansComponent, LoansService, LogLevel, LogService, LoginComponent, LogsComponent, MembershipComponent, MessageService, MoneyComponent, MovementType, MultiSelectComponent, MultiTextComponent, NavMenuComponent, NotesComponent, NotesConfig, NumberComponent, OptionComponent, PageComponent, PageConfig, PlansComponent, PositionsComponent, Profile, ProfileComponent, RecoverAccountComponent, Register, Role, RoleAccess, RolesComponent, SearchComponent, SearchConfig, SecurityConfig, SelectBitwiseComponent, SelectComponent, SettingsComponent, SignupComponent, SpaAdminModule, SpaIndexModule, SpaMatModule, SpaUserModule, StatusesComponent, Step, StepConfig, StepsComponent, StorageService, SubCategoriesComponent, SuppliersComponent, TableComponent, TableConfig, TabsComponent, TasksComponent, TenantsComponent, TextComponent, TileConfig, TilesComponent, TinSpaComponent, TinSpaModule, TinSpaService, TitleActionsComponent, UnitOfMeasure, User, UserModule, UsersComponent, ViewerComponent, WelcomeComponent, addRoleDialog, authGuard, dialogOptions, loginConfig, messageDialog, viewerDialog };
13931
14442
  //# sourceMappingURL=tin-spa.mjs.map