@litusarchieve18/agricore-utils 1.0.11 β†’ 1.0.13

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.
package/README.md CHANGED
@@ -65,6 +65,8 @@ The universal vocabulary of the AgriCore platform, ensuring type-safety across a
65
65
  πŸ” Security & Access Control
66
66
  The library now includes a centralized logic layer to enforce granular permissions across all AgriCore services.
67
67
 
68
+ ---------------------------------------------------------------------
69
+
68
70
  evaluateBaseAccess: Automatically determines a user's base permission level (NONE, READ, or WRITE) for a specific resource path (e.g., records.financials). It respects the OWNER role "God Mode" bypass and uses ROLE_SECTIONS_BY_KEY to provide sensible defaults for different app sections.
69
71
 
70
72
  Access Ranking (resolveEffectiveAccess): Implements an additive permission model. By ranking levels (NONE < READ < WRITE), it allows the system to compare base permissions against specific user overrides and resolve the highest authorized access level.
@@ -92,6 +94,8 @@ const recordToSave = {
92
94
 
93
95
  To completely eliminate database bottlenecks and solve serverless rate-limiting, AgriCore has migrated to a state-of-the-art, "Zero-DB" authorization architecture. By decoupling our security rules from the database SDK, our backend API endpoints now resolve complex multi-tenant boundaries and granular role-based access controls in roughly 1 millisecond.
94
96
 
97
+ ---------------------------------------------------------------------
98
+
95
99
  Key Features of the New Security Engine:
96
100
 
97
101
  One-Time Session Generation: On login, the backend dynamically aggregates a user's full hierarchical profileβ€”including role assignments, availableScopes (Company > Legal Entity > Facility), and granular resourceOverridesβ€”into a single, cryptographically signed JSON Web Token (JWT).
@@ -102,6 +106,56 @@ Smart Frontend Interceptor: A centralized React hook (useApiClient) acts as an a
102
106
 
103
107
  Instant Context Switching: Because the JWT securely holds the user's entire "VIP List" of permitted scopes, users can instantly switch between farms, legal entities, and facilities in the frontend global dropdown without triggering a new authentication handshake or database query.
104
108
 
109
+ ---------------------------------------------------------------------
110
+
111
+ This Document Management Engine provides a standardized, compliant, and migration-ready architecture for handling agricultural records. It ensures that files are stored predictably and matched against audit requirements with high precision.
112
+
113
+ Document Management & Compliance Engine
114
+ This module handles the lifecycle of file assets, from standardized naming and path generation to intelligent metadata matching for compliance audits.
115
+
116
+ 1. Standardized Taxonomy (DocumentType)
117
+ The DocumentType enum serves as the single source of truth for the AgriCore document ecosystem. It categorizes every recordβ€”from SPRAY_RECORD to MAPPING_FARM_MAPSβ€”ensuring that the database remains searchable and consistent across different farms and legal entities.
118
+
119
+ 2. Smart Routing (generateDocumentPath)
120
+ This function enforces the "Core vs. Seasonal" storage architecture. It ensures that permanent files (Fixed Assets) and crop-cycle files (Working Assets) are physically and logically separated:
121
+
122
+ Static Assets (isStatic: true): Routed to {SiteName}/_CORE/{DocumentType}.
123
+
124
+ Seasonal Assets: Routed to a strict temporal hierarchy: {SiteName}/_SEASONAL/{Year}/{DocumentType}/{Crop}.
125
+
126
+ 3. Intelligence Engine (calculateFileMetadataMatch)
127
+ A 3-tier matching algorithm used to automatically suggest evidence for audit questions. It evaluates the relevance of a file based on three layers:
128
+
129
+ Static Hard Fails: Strict equality checks for properties like documentType.
130
+
131
+ Dynamic Hard Fails (mustMatchContext): Ensures files belong to the correct boundaries (e.g., siteId array inclusion) based on the current AuditHeader.
132
+
133
+ Soft Relevance Scoring (contextMatch): Calculates a percentage score based on environmental tags like seasonId or crop, allowing the UI to surface the "best matches" first.
134
+
135
+ Quick Example
136
+ TypeScript
137
+ // 1. Generate a path for a seasonal spray record
138
+ const path = generateDocumentPath({
139
+ siteName: "North Farm",
140
+ docType: DocumentType.SPRAY_RECORD,
141
+ year: 2026,
142
+ crop: "Mango"
143
+ });
144
+ // Output: North_Farm/_SEASONAL/2026/SPRAY_RECORD/MANGO
145
+
146
+ // 2. Score a file against an audit requirement
147
+ const score = calculateFileMetadataMatch(
148
+ {
149
+ mustMatch: { documentType: "SPRAY_RECORD" },
150
+ mustMatchContext: ["siteId"], // Hard fail if wrong farm
151
+ contextMatch: ["seasonId"] // Soft score for season relevance
152
+ },
153
+ file.metadata,
154
+ auditHeader.context
155
+ );
156
+
157
+ ============================================================================
158
+
105
159
  πŸ› οΈ Development & Publishing Guide
106
160
  Zero Dependencies
107
161
  To keep the package ultra-lightweight (~30KB), this library has zero runtime dependencies. All build tools (tsup, typescript) are strictly kept in devDependencies, and the package.json uses the "files": ["dist"] array to ensure only compiled code is uploaded.
@@ -129,6 +183,10 @@ Run the publish command:
129
183
  Bash
130
184
  npm publish --access public
131
185
  πŸ“ Version History
186
+ V1.0.12 β€” add DocumentMenuMap and refactoring library code to export enum
187
+
188
+ V1.0.12 β€” add some functionality to add a file tag
189
+
132
190
  V1.0.11 β€” add userName and userEmail to AgriCoreSession
133
191
 
134
192
  V1.0.10 β€” add an explicit exports map
@@ -0,0 +1,585 @@
1
+ // src/constants.ts
2
+ var MOD = {
3
+ OPERATIONS: "OPR",
4
+ EQUIPMENT: "EQP",
5
+ PACKHOUSE: "PCK",
6
+ FARM: "FRM",
7
+ SAFETY: "SAF",
8
+ TEAM_HR: "THR",
9
+ RECORDS: "REC",
10
+ ADMIN: "ADM",
11
+ DOCUMENTS: "DOC",
12
+ ALERTS: "ALT",
13
+ INFRA: "INF",
14
+ SESSION: "SES"
15
+ };
16
+ var CAT = {
17
+ SUBSCRIPTION: "1",
18
+ PERMISSION: "2",
19
+ VALIDATION: "3",
20
+ INTEGRITY: "4"
21
+ };
22
+ var ACT = {
23
+ GENERIC: "00",
24
+ VIEW: "01",
25
+ CREATE: "02",
26
+ EDIT: "03",
27
+ DELETE: "04",
28
+ UPLOAD: "05"
29
+ };
30
+ var SENTINEL_UUID = "00000000-0000-0000-0000-000000000000";
31
+ var MODULE_LABELS = {
32
+ [MOD.OPERATIONS]: "Operations",
33
+ [MOD.EQUIPMENT]: "Equipment & Fleet",
34
+ [MOD.PACKHOUSE]: "Packhouse",
35
+ [MOD.FARM]: "Farm Management",
36
+ [MOD.SAFETY]: "Safety & Compliance",
37
+ [MOD.TEAM_HR]: "Team & HR",
38
+ [MOD.RECORDS]: "Records & Reports",
39
+ [MOD.ADMIN]: "Admin Settings",
40
+ [MOD.DOCUMENTS]: "Documents",
41
+ [MOD.ALERTS]: "Alerts",
42
+ [MOD.INFRA]: "Infrastructure",
43
+ [MOD.SESSION]: "Session"
44
+ };
45
+ var ERROR_DICTIONARY = {
46
+ // ── Gate 1: Subscription ──────────────────────────────────────────────────
47
+ "100": { title: "Module Locked", text: "This feature is part of a module not enabled for your company. Contact your administrator to unlock it." },
48
+ // ── Gate 2: Permission ────────────────────────────────────────────────────
49
+ "200": { title: "Access Denied", text: "You do not have permission to perform this action. Contact your manager." },
50
+ "201": { title: "Restricted View", text: "Viewing this section requires higher access. Contact your administrator." },
51
+ "202": { title: "Creation Restricted", text: "You are not permitted to create new records here." },
52
+ "203": { title: "Edit Restricted", text: "You do not have permission to edit this record." },
53
+ "204": { title: "Protected Record", text: "You do not have permission to delete this record. Contact your administrator." },
54
+ "205": { title: "Upload Restricted", text: "You are not permitted to upload files here." },
55
+ // ── Gate 3: Validation ────────────────────────────────────────────────────
56
+ "300": { title: "Invalid Input", text: "Something is wrong with the data provided. Please review and try again." },
57
+ "301": { title: "Cannot Load Data", text: "Required information is missing to load this page." },
58
+ "302": { title: "Missing Fields", text: "Please fill in all required fields before saving." },
59
+ "303": { title: "Invalid Update", text: "The data you are trying to save is not valid. Please check your inputs." },
60
+ "304": { title: "Cannot Delete", text: "The record cannot be deleted due to a validation issue." },
61
+ "305": { title: "Upload Failed", text: "The file could not be uploaded. Please check the file type and size." },
62
+ // ── Gate 4: Integrity ─────────────────────────────────────────────────────
63
+ "400": { title: "Data Conflict", text: "A conflict occurred with an existing record. Please review and try again." },
64
+ "402": { title: "Duplicate Entry", text: "A record with this name or identifier already exists." },
65
+ "403": { title: "Edit Conflict", text: "This record was recently updated by someone else. Please refresh and try again." },
66
+ "404": { title: "Record In Use", text: "This record cannot be deleted because it is referenced by other data." }
67
+ };
68
+ var UserRole = {
69
+ OWNER: "owner",
70
+ MANAGER: "manager",
71
+ SUPERVISOR: "supervisor",
72
+ LEADING_HAND: "leadingHand",
73
+ WORKER: "worker"
74
+ };
75
+ var UserPrivilege = {
76
+ FINANCE: "finance",
77
+ HR: "hr",
78
+ MECHANIC: "mechanic",
79
+ AUDIT_COMPLIANCE: "auditCompliance",
80
+ ADMIN: "admin"
81
+ };
82
+ var AccessLevel = {
83
+ NONE: "NONE",
84
+ READ: "READ",
85
+ WRITE: "WRITE"
86
+ };
87
+ var EnabledModule = {
88
+ FARM_MANAGEMENT: "farm_management",
89
+ PACKHOUSE: "packhouse",
90
+ ACCOMMODATION: "accommodation"
91
+ };
92
+ var FacilityType = {
93
+ FARM: "farm",
94
+ PACKHOUSE: "packhouse",
95
+ ACCOMMODATION: "accommodation"
96
+ };
97
+ var LinkedStatus = {
98
+ NOT_LINKED: "not_linked",
99
+ PENDING_LINK: "pending_link",
100
+ LINKED: "linked"
101
+ };
102
+ var RelationshipType = {
103
+ SUPPLIER: "supplier",
104
+ CUSTOMER: "customer",
105
+ BOTH: "both"
106
+ };
107
+ var ApprovalType = {
108
+ ROLE: "role",
109
+ PRIVILEGE: "privilege",
110
+ SPECIFIC_USERS: "specific_users"
111
+ };
112
+ var TransactionType = {
113
+ PURCHASE_ORDER: "purchase_order",
114
+ SALES_ORDER: "sales_order",
115
+ REPAIR: "repair",
116
+ FUEL: "fuel",
117
+ OTHER: "other"
118
+ };
119
+ var ApprovalStatus = {
120
+ PENDING: "pending",
121
+ APPROVED: "approved",
122
+ REJECTED: "rejected"
123
+ };
124
+ var OrderStatus = {
125
+ DRAFT: "draft",
126
+ PENDING_FINANCE: "pending_finance",
127
+ NEW: "new",
128
+ ACKNOWLEDGED: "acknowledged",
129
+ IN_PROGRESS: "in_progress",
130
+ SHIPPED: "shipped",
131
+ RECEIVED: "received",
132
+ CANCELLED: "cancelled"
133
+ };
134
+ var NotificationMode = {
135
+ INTERNAL: "internal",
136
+ EXTERNAL_EMAIL: "external_email",
137
+ NONE: "none"
138
+ };
139
+ var TaskType = {
140
+ KML_PARSE: "KML_PARSE",
141
+ INVOICE_OCR: "INVOICE_OCR",
142
+ AUDIT_UPLOAD: "AUDIT_UPLOAD",
143
+ REPORT_GEN: "REPORT_GEN"
144
+ };
145
+ var TaskStatus = {
146
+ PENDING: "PENDING",
147
+ PROCESSING: "PROCESSING",
148
+ COMPLETED: "COMPLETED",
149
+ FAILED: "FAILED",
150
+ AWAITING_REVIEW: "AWAITING_REVIEW",
151
+ VERIFIED: "VERIFIED",
152
+ REJECTED: "REJECTED"
153
+ };
154
+ var MimeType = {
155
+ KML: "application/vnd.google-earth.kml+xml",
156
+ KMZ: "application/vnd.google-earth.kmz",
157
+ PDF: "application/pdf",
158
+ XLSX: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
159
+ XLS: "application/vnd.ms-excel",
160
+ JPEG: "image/jpeg",
161
+ PNG: "image/png"
162
+ };
163
+ var TargetEntityType = {
164
+ FARM: "FARM",
165
+ ZONE: "ZONE",
166
+ BLOCK: "BLOCK",
167
+ INFRASTRUCTURE: "INFRASTRUCTURE",
168
+ AUTO: "AUTO"
169
+ };
170
+ var AuditType = {
171
+ FRESHCARE: "Freshcare",
172
+ HACCP: "HACCP",
173
+ WHS: "WHS",
174
+ CUSTOM: "Custom"
175
+ };
176
+ var AuditStatus = {
177
+ DRAFT: "DRAFT",
178
+ IN_REVIEW: "IN_REVIEW",
179
+ FINALIZED: "FINALIZED"
180
+ };
181
+ var SoilTexture = {
182
+ SAND: "SAND",
183
+ LOAMY_SAND: "LOAMY_SAND",
184
+ SANDY_LOAM: "SANDY_LOAM",
185
+ LOAM: "LOAM",
186
+ SILT_LOAM: "SILT_LOAM",
187
+ SILT: "SILT",
188
+ SANDY_CLAY_LOAM: "SANDY_CLAY_LOAM",
189
+ CLAY_LOAM: "CLAY_LOAM",
190
+ SILTY_CLAY_LOAM: "SILTY_CLAY_LOAM",
191
+ SANDY_CLAY: "SANDY_CLAY",
192
+ SILTY_CLAY: "SILTY_CLAY",
193
+ CLAY: "CLAY"
194
+ };
195
+ var MicroclimateZone = {
196
+ STANDARD: "STANDARD",
197
+ FROST_POCKET: "FROST_POCKET",
198
+ WIND_CORRIDOR: "WIND_CORRIDOR",
199
+ EXPOSED_RIDGE: "EXPOSED_RIDGE",
200
+ HEAT_TRAP: "HEAT_TRAP",
201
+ RIPARIAN: "RIPARIAN"
202
+ };
203
+ var PlantingMethod = {
204
+ SQUARE: "SQUARE",
205
+ RECTANGULAR: "RECTANGULAR",
206
+ HEXAGONAL: "HEXAGONAL",
207
+ QUINCUNX: "QUINCUNX",
208
+ CONTOUR: "CONTOUR"
209
+ };
210
+ var RowOrientation = {
211
+ NORTH_SOUTH: "NORTH_SOUTH",
212
+ EAST_WEST: "EAST_WEST",
213
+ NORTHEAST_SOUTHWEST: "NORTHEAST_SOUTHWEST",
214
+ NORTHWEST_SOUTHEAST: "NORTHWEST_SOUTHEAST"
215
+ };
216
+ var EmitterType = {
217
+ SURFACE_DRIP: "SURFACE_DRIP",
218
+ SUBSURFACE_DRIP: "SUBSURFACE_DRIP",
219
+ MICRO_SPRINKLER: "MICRO_SPRINKLER",
220
+ JET_SPRAY: "JET_SPRAY",
221
+ INLINE_DRIPPER: "INLINE_DRIPPER",
222
+ PRESSURE_COMPENSATED: "PRESSURE_COMPENSATED"
223
+ };
224
+ var TrellisType = {
225
+ NONE: "NONE",
226
+ VERTICAL_AXIS: "VERTICAL_AXIS",
227
+ TWO_D_PLANE: "2D_PLANE",
228
+ V_TRELLIS: "V_TRELLIS",
229
+ T_BAR: "T_BAR",
230
+ PERGOLA: "PERGOLA",
231
+ Y_TRELLIS: "Y_TRELLIS"
232
+ };
233
+ var NettingType = {
234
+ NONE: "NONE",
235
+ OVERHEAD_HAIL: "OVERHEAD_HAIL",
236
+ SIDE_BIRD: "SIDE_BIRD",
237
+ FULL_EXCLUSION: "FULL_EXCLUSION",
238
+ SHADE_30: "SHADE_30",
239
+ SHADE_50: "SHADE_50",
240
+ CROSS_OVER: "CROSS_OVER"
241
+ };
242
+ var HarvestMethod = {
243
+ HAND: "HAND",
244
+ MACHINE: "MACHINE"
245
+ };
246
+ var VigorRating = {
247
+ VERY_LOW: "VERY_LOW",
248
+ LOW: "LOW",
249
+ MODERATE: "MODERATE",
250
+ HIGH: "HIGH",
251
+ VERY_HIGH: "VERY_HIGH"
252
+ };
253
+ var CropCycleStatus = {
254
+ NEW: "NEW",
255
+ CONFIRMED: "CONFIRMED",
256
+ ACTIVE: "ACTIVE",
257
+ COMPLETED: "COMPLETED"
258
+ };
259
+ var WaterSource = {
260
+ BORE_WELL: "BORE_WELL",
261
+ RIVER_STREAM: "RIVER_STREAM",
262
+ ON_FARM_DAM: "ON_FARM_DAM",
263
+ IRRIGATION_SCHEME: "IRRIGATION_SCHEME",
264
+ MUNICIPAL: "MUNICIPAL",
265
+ RECLAIMED_WASTE: "RECLAIMED_WASTE",
266
+ RAINWATER: "RAINWATER"
267
+ };
268
+ var PhysicalState = {
269
+ LIQUID: "LIQUID",
270
+ GAS: "GAS"
271
+ };
272
+ var FORM_REGISTRY = {
273
+ // ── Farm Management ──────────────────────────────────────────────────────
274
+ farmForm: { label: "Farm Profile", menuUrl: "/admin", module: "Farm Management" },
275
+ zoneForm: { label: "Zone Mapping", menuUrl: "/admin", module: "Farm Management" },
276
+ blockForm: { label: "Block Definition", menuUrl: "/admin", module: "Farm Management" },
277
+ // ── Crop & Variety ───────────────────────────────────────────────────────
278
+ cropForm: { label: "Crop Profile", menuUrl: "/admin", module: "Crop Library" },
279
+ varietyForm: { label: "Variety Blueprint", menuUrl: "/admin", module: "Crop Library" },
280
+ // ── Administration ───────────────────────────────────────────────────────
281
+ userAccessForm: { label: "User Access & Roles", menuUrl: "/admin/users", module: "Administration" },
282
+ companySettingsForm: { label: "Company Settings", menuUrl: "/admin/company", module: "Administration" },
283
+ financeTierForm: { label: "Finance Approval Tier", menuUrl: "/admin/company", module: "Administration" },
284
+ // ── Audit & Compliance ───────────────────────────────────────────────────
285
+ auditProjectForm: { label: "Audit Project", menuUrl: "/admin", module: "Audit & Compliance" }
286
+ };
287
+ var TASK_TYPE_REGISTRY = {
288
+ INVOICE_OCR: {
289
+ label: "Invoice / Receipt OCR",
290
+ targetEntity: "FuelInvoice",
291
+ description: "Extract invoice data (supplier, amount, date, line items) using AI.",
292
+ mimeTypes: [MimeType.PDF, MimeType.JPEG, MimeType.PNG],
293
+ icon: "FileText",
294
+ approveAction: "CREATE_FUEL_INVOICE"
295
+ },
296
+ KML_PARSE: {
297
+ label: "KML / Farm Boundary",
298
+ targetEntity: "Zone",
299
+ description: "Parse KML file to extract GPS polygon boundaries for a farm zone.",
300
+ mimeTypes: [MimeType.KML],
301
+ icon: "MapPin",
302
+ approveAction: "UPDATE_ZONE_POLYGON"
303
+ },
304
+ AUDIT_UPLOAD: {
305
+ label: "Audit / Compliance Document",
306
+ targetEntity: "AuditManifest",
307
+ description: "Attach evidence documents to a compliance audit project.",
308
+ mimeTypes: [MimeType.PDF, MimeType.JPEG, MimeType.PNG, MimeType.XLSX],
309
+ icon: "ShieldCheck",
310
+ approveAction: "LINK_AUDIT_MANIFEST"
311
+ },
312
+ REPORT_GEN: {
313
+ label: "Report Generation",
314
+ targetEntity: "AuditProject",
315
+ description: "Upload a completed audit report for storage and linking.",
316
+ mimeTypes: [MimeType.PDF],
317
+ icon: "BarChart2",
318
+ approveAction: "ATTACH_REPORT_FILE"
319
+ }
320
+ };
321
+ var RESOURCE_PATHS = {
322
+ // ── Top-level menu sections ────────────────────────────────────────────────
323
+ dashboard: "dashboard",
324
+ operations: "operations",
325
+ equipment: "equipment",
326
+ safety: "safety",
327
+ team: "team",
328
+ records: "records",
329
+ adminSettings: "adminSettings",
330
+ // ── Records & Reports ──────────────────────────────────────────────────────
331
+ documentHub: "records.documentHub",
332
+ documentHubTemplates: "records.documentHub.templates",
333
+ documentHubFolder: "records.documentHub.companyFolder",
334
+ documentHubExtraction: "records.documentHub.extractionHub",
335
+ documentHubQueue: "records.documentHub.verificationQueue",
336
+ analytics: "records.analytics",
337
+ // ── Admin Settings ─────────────────────────────────────────────────────────
338
+ adminUserRoster: "adminSettings.userRoster",
339
+ adminRolesPermissions: "adminSettings.rolesPermissions",
340
+ adminBlueprintsSites: "adminSettings.blueprintsSites",
341
+ adminCompanySettings: "adminSettings.companySettings",
342
+ // ── Operations ────────────────────────────────────────────────────────────
343
+ farmManagement: "operations.farmManagement",
344
+ packhouse: "operations.packhouse",
345
+ accommodation: "operations.accommodation",
346
+ // ── Equipment & Fleet ──────────────────────────────────────────────────────
347
+ equipPreStart: "equipment.preStart",
348
+ equipMaintenance: "equipment.maintenance",
349
+ equipFuelRegister: "equipment.fuelRegister",
350
+ equipCalibration: "equipment.calibration",
351
+ equipFleet: "equipment.fleetManagement",
352
+ // ── Safety, Quality & Compliance ──────────────────────────────────────────
353
+ safetyAuditing: "safety.auditing",
354
+ safetyFood: "safety.foodSafety",
355
+ safetyWhs: "safety.whs",
356
+ safetyCleaning: "safety.cleaning",
357
+ // ── Team & HR ──────────────────────────────────────────────────────────────
358
+ teamStaff: "team.staff",
359
+ teamTraining: "team.training"
360
+ };
361
+ var ALL_OPERATIONS = [
362
+ EnabledModule.FARM_MANAGEMENT,
363
+ EnabledModule.PACKHOUSE,
364
+ EnabledModule.ACCOMMODATION
365
+ ];
366
+ var AGRI_ONLY = [
367
+ EnabledModule.FARM_MANAGEMENT,
368
+ EnabledModule.PACKHOUSE
369
+ ];
370
+ var RESOURCE_MODULE_MAP = {
371
+ // ── Top-level menu sections ────────────────────────────────────────────────
372
+ [RESOURCE_PATHS.dashboard]: [],
373
+ [RESOURCE_PATHS.operations]: ALL_OPERATIONS,
374
+ [RESOURCE_PATHS.equipment]: ALL_OPERATIONS,
375
+ [RESOURCE_PATHS.safety]: ALL_OPERATIONS,
376
+ [RESOURCE_PATHS.team]: ALL_OPERATIONS,
377
+ [RESOURCE_PATHS.records]: ALL_OPERATIONS,
378
+ [RESOURCE_PATHS.adminSettings]: ALL_OPERATIONS,
379
+ // ── Records & Reports ──────────────────────────────────────────────────────
380
+ [RESOURCE_PATHS.documentHub]: ALL_OPERATIONS,
381
+ [RESOURCE_PATHS.documentHubTemplates]: ALL_OPERATIONS,
382
+ [RESOURCE_PATHS.documentHubFolder]: ALL_OPERATIONS,
383
+ [RESOURCE_PATHS.documentHubExtraction]: ALL_OPERATIONS,
384
+ [RESOURCE_PATHS.documentHubQueue]: ALL_OPERATIONS,
385
+ [RESOURCE_PATHS.analytics]: ALL_OPERATIONS,
386
+ // ── Admin Settings ─────────────────────────────────────────────────────────
387
+ [RESOURCE_PATHS.adminUserRoster]: ALL_OPERATIONS,
388
+ [RESOURCE_PATHS.adminBlueprintsSites]: ALL_OPERATIONS,
389
+ [RESOURCE_PATHS.adminRolesPermissions]: ALL_OPERATIONS,
390
+ [RESOURCE_PATHS.adminCompanySettings]: ALL_OPERATIONS,
391
+ // ── Operations ────────────────────────────────────────────────────────────
392
+ [RESOURCE_PATHS.farmManagement]: [EnabledModule.FARM_MANAGEMENT],
393
+ [RESOURCE_PATHS.packhouse]: [EnabledModule.PACKHOUSE],
394
+ [RESOURCE_PATHS.accommodation]: [EnabledModule.ACCOMMODATION],
395
+ // ── Equipment & Fleet ──────────────────────────────────────────────────────
396
+ [RESOURCE_PATHS.equipPreStart]: ALL_OPERATIONS,
397
+ [RESOURCE_PATHS.equipMaintenance]: ALL_OPERATIONS,
398
+ [RESOURCE_PATHS.equipFuelRegister]: ALL_OPERATIONS,
399
+ [RESOURCE_PATHS.equipCalibration]: AGRI_ONLY,
400
+ [RESOURCE_PATHS.equipFleet]: ALL_OPERATIONS,
401
+ // ── Safety, Quality & Compliance ──────────────────────────────────────────
402
+ [RESOURCE_PATHS.safetyAuditing]: ALL_OPERATIONS,
403
+ [RESOURCE_PATHS.safetyFood]: AGRI_ONLY,
404
+ [RESOURCE_PATHS.safetyWhs]: ALL_OPERATIONS,
405
+ [RESOURCE_PATHS.safetyCleaning]: ALL_OPERATIONS,
406
+ // ── Team & HR ──────────────────────────────────────────────────────────────
407
+ [RESOURCE_PATHS.teamStaff]: ALL_OPERATIONS,
408
+ [RESOURCE_PATHS.teamTraining]: ALL_OPERATIONS
409
+ };
410
+ var ACCESS_RANK = {
411
+ NONE: 0,
412
+ READ: 1,
413
+ WRITE: 2
414
+ };
415
+ var ROLE_SECTIONS_BY_KEY = {
416
+ dashboard: [UserRole.OWNER, UserRole.MANAGER, UserRole.SUPERVISOR, UserRole.LEADING_HAND, UserRole.WORKER],
417
+ operations: [UserRole.OWNER, UserRole.MANAGER, UserRole.SUPERVISOR, UserRole.LEADING_HAND, UserRole.WORKER],
418
+ equipment: [UserRole.OWNER, UserRole.MANAGER, UserRole.SUPERVISOR, UserRole.LEADING_HAND, UserRole.WORKER],
419
+ safety: [UserRole.OWNER, UserRole.MANAGER, UserRole.SUPERVISOR],
420
+ team: [UserRole.OWNER, UserRole.MANAGER],
421
+ records: [UserRole.OWNER, UserRole.MANAGER],
422
+ adminSettings: []
423
+ };
424
+ var EVERYONE = Object.values(UserRole);
425
+ var RESOURCE_REQUIREMENTS = {
426
+ [RESOURCE_PATHS.dashboard]: { allowedRoles: EVERYONE },
427
+ [RESOURCE_PATHS.operations]: { allowedRoles: EVERYONE },
428
+ // ── Records & Reports ──────────────────────────────────────────────────────
429
+ [RESOURCE_PATHS.documentHub]: {
430
+ allowedRoles: [UserRole.OWNER, UserRole.MANAGER, UserRole.SUPERVISOR],
431
+ requiredPrivileges: [UserPrivilege.ADMIN, UserPrivilege.AUDIT_COMPLIANCE, UserPrivilege.FINANCE, UserPrivilege.HR]
432
+ },
433
+ [RESOURCE_PATHS.documentHubTemplates]: {
434
+ allowedRoles: [UserRole.OWNER, UserRole.MANAGER, UserRole.SUPERVISOR],
435
+ requiredPrivileges: [UserPrivilege.ADMIN, UserPrivilege.AUDIT_COMPLIANCE, UserPrivilege.FINANCE, UserPrivilege.HR]
436
+ },
437
+ [RESOURCE_PATHS.documentHubFolder]: {
438
+ allowedRoles: [UserRole.OWNER, UserRole.MANAGER, UserRole.SUPERVISOR],
439
+ requiredPrivileges: [UserPrivilege.ADMIN, UserPrivilege.AUDIT_COMPLIANCE, UserPrivilege.FINANCE, UserPrivilege.HR]
440
+ },
441
+ [RESOURCE_PATHS.documentHubExtraction]: {
442
+ allowedRoles: [UserRole.OWNER, UserRole.MANAGER, UserRole.SUPERVISOR],
443
+ requiredPrivileges: [UserPrivilege.ADMIN, UserPrivilege.AUDIT_COMPLIANCE, UserPrivilege.FINANCE, UserPrivilege.HR]
444
+ },
445
+ [RESOURCE_PATHS.documentHubQueue]: {
446
+ allowedRoles: [UserRole.OWNER, UserRole.MANAGER, UserRole.SUPERVISOR],
447
+ requiredPrivileges: [UserPrivilege.ADMIN, UserPrivilege.AUDIT_COMPLIANCE, UserPrivilege.FINANCE, UserPrivilege.HR]
448
+ },
449
+ // ── Admin Settings ─────────────────────────────────────────────────────────
450
+ [RESOURCE_PATHS.adminUserRoster]: {
451
+ allowedRoles: [UserRole.OWNER],
452
+ requiredPrivileges: [UserPrivilege.ADMIN]
453
+ },
454
+ [RESOURCE_PATHS.adminBlueprintsSites]: {
455
+ allowedRoles: [UserRole.OWNER],
456
+ requiredPrivileges: [UserPrivilege.ADMIN]
457
+ },
458
+ [RESOURCE_PATHS.adminRolesPermissions]: {
459
+ allowedRoles: [UserRole.OWNER],
460
+ requiredPrivileges: [UserPrivilege.ADMIN]
461
+ },
462
+ [RESOURCE_PATHS.adminCompanySettings]: {
463
+ allowedRoles: [UserRole.OWNER]
464
+ }
465
+ };
466
+ var DocumentType = /* @__PURE__ */ ((DocumentType2) => {
467
+ DocumentType2["SPRAY_RECORD"] = "SPRAY_RECORD";
468
+ DocumentType2["FERTIGATION_RECORD"] = "FERTIGATION_RECORD";
469
+ DocumentType2["FERTILIZER_RECORD"] = "FERTILIZER_RECORD";
470
+ DocumentType2["QA"] = "QA";
471
+ DocumentType2["CLEANING"] = "CLEANING";
472
+ DocumentType2["PEST"] = "PEST";
473
+ DocumentType2["EQUIPMENT_CALIBRATION_RECORD"] = "EQUIPMENT_CALIBRATION_RECORD";
474
+ DocumentType2["INVENTORY_CONSUMABLES"] = "INVENTORY_CONSUMABLES";
475
+ DocumentType2["INVENTORY_BOX_CARTON"] = "INVENTORY_BOX_CARTON";
476
+ DocumentType2["INVENTORY_CHEMICALS"] = "INVENTORY_CHEMICALS";
477
+ DocumentType2["STOCKTAKE"] = "STOCKTAKE";
478
+ DocumentType2["STOCKTAKE_MSDS"] = "STOCKTAKE_MSDS";
479
+ DocumentType2["MAPPING_FARM_MAPS"] = "MAPPING_FARM_MAPS";
480
+ DocumentType2["MAPPING_TRAFIC_MANAGEMENT"] = "MAPPING_TRAFIC_MANAGEMENT";
481
+ DocumentType2["MAPPING_EMERGENCY"] = "MAPPING_EMERGENCY";
482
+ DocumentType2["INCIDENT_REPORT"] = "INCIDENT_REPORT";
483
+ DocumentType2["TRAINING_RECORDS"] = "TRAINING_RECORDS";
484
+ DocumentType2["SOPS"] = "SOPS";
485
+ DocumentType2["RISK_ASSESSMENTS"] = "RISK_ASSESSMENTS";
486
+ DocumentType2["SERVICING_MAINTENANCE"] = "SERVICING_MAINTENANCE";
487
+ DocumentType2["SOIL_TEST"] = "SOIL_TEST";
488
+ DocumentType2["LEAF_TEST"] = "LEAF_TEST";
489
+ DocumentType2["WATER_TEST"] = "WATER_TEST";
490
+ DocumentType2["MRL_TESTING"] = "MRL_TESTING";
491
+ DocumentType2["HEAVY_METAL"] = "HEAVY_METAL";
492
+ DocumentType2["MICROBIAL"] = "MICROBIAL";
493
+ DocumentType2["HARVEST_LOG"] = "HARVEST_LOG";
494
+ DocumentType2["PACKHOUSE_INSPECTION"] = "PACKHOUSE_INSPECTION";
495
+ DocumentType2["TRAINING_CERTIFICATE"] = "TRAINING_CERTIFICATE";
496
+ DocumentType2["INVOICE"] = "INVOICE";
497
+ DocumentType2["LEGAL_CONTRACT"] = "LEGAL_CONTRACT";
498
+ DocumentType2["AUDIT_REPORT"] = "AUDIT_REPORT";
499
+ DocumentType2["SENSITIVE_IDENTITY"] = "SENSITIVE_IDENTITY";
500
+ return DocumentType2;
501
+ })(DocumentType || {});
502
+ var DOCUMENT_MENU_MAP = {
503
+ ["SPRAY_RECORD" /* SPRAY_RECORD */]: [RESOURCE_PATHS.farmManagement],
504
+ ["FERTIGATION_RECORD" /* FERTIGATION_RECORD */]: [RESOURCE_PATHS.farmManagement],
505
+ ["FERTILIZER_RECORD" /* FERTILIZER_RECORD */]: [RESOURCE_PATHS.farmManagement],
506
+ ["QA" /* QA */]: [RESOURCE_PATHS.safetyAuditing],
507
+ ["CLEANING" /* CLEANING */]: [RESOURCE_PATHS.safetyCleaning],
508
+ ["PEST" /* PEST */]: [RESOURCE_PATHS.farmManagement],
509
+ ["EQUIPMENT_CALIBRATION_RECORD" /* EQUIPMENT_CALIBRATION_RECORD */]: [RESOURCE_PATHS.equipCalibration],
510
+ ["SERVICING_MAINTENANCE" /* SERVICING_MAINTENANCE */]: [RESOURCE_PATHS.equipMaintenance],
511
+ ["INVENTORY_CONSUMABLES" /* INVENTORY_CONSUMABLES */]: [RESOURCE_PATHS.packhouse],
512
+ ["INVENTORY_BOX_CARTON" /* INVENTORY_BOX_CARTON */]: [RESOURCE_PATHS.packhouse],
513
+ ["INVENTORY_CHEMICALS" /* INVENTORY_CHEMICALS */]: [RESOURCE_PATHS.packhouse, RESOURCE_PATHS.farmManagement],
514
+ ["STOCKTAKE" /* STOCKTAKE */]: [RESOURCE_PATHS.packhouse],
515
+ ["STOCKTAKE_MSDS" /* STOCKTAKE_MSDS */]: [RESOURCE_PATHS.safetyWhs],
516
+ ["MAPPING_FARM_MAPS" /* MAPPING_FARM_MAPS */]: [RESOURCE_PATHS.adminBlueprintsSites],
517
+ ["MAPPING_TRAFIC_MANAGEMENT" /* MAPPING_TRAFIC_MANAGEMENT */]: [RESOURCE_PATHS.adminBlueprintsSites],
518
+ ["MAPPING_EMERGENCY" /* MAPPING_EMERGENCY */]: [RESOURCE_PATHS.adminBlueprintsSites],
519
+ ["INCIDENT_REPORT" /* INCIDENT_REPORT */]: [RESOURCE_PATHS.safetyWhs],
520
+ ["RISK_ASSESSMENTS" /* RISK_ASSESSMENTS */]: [RESOURCE_PATHS.safetyWhs],
521
+ ["TRAINING_RECORDS" /* TRAINING_RECORDS */]: [RESOURCE_PATHS.teamTraining],
522
+ ["TRAINING_CERTIFICATE" /* TRAINING_CERTIFICATE */]: [RESOURCE_PATHS.teamTraining],
523
+ ["SOPS" /* SOPS */]: [RESOURCE_PATHS.documentHubTemplates],
524
+ ["SOIL_TEST" /* SOIL_TEST */]: [RESOURCE_PATHS.farmManagement],
525
+ ["LEAF_TEST" /* LEAF_TEST */]: [RESOURCE_PATHS.farmManagement],
526
+ ["WATER_TEST" /* WATER_TEST */]: [RESOURCE_PATHS.farmManagement, RESOURCE_PATHS.safetyFood],
527
+ ["MRL_TESTING" /* MRL_TESTING */]: [RESOURCE_PATHS.safetyFood],
528
+ ["HEAVY_METAL" /* HEAVY_METAL */]: [RESOURCE_PATHS.safetyFood],
529
+ ["MICROBIAL" /* MICROBIAL */]: [RESOURCE_PATHS.safetyFood],
530
+ ["HARVEST_LOG" /* HARVEST_LOG */]: [RESOURCE_PATHS.farmManagement],
531
+ ["PACKHOUSE_INSPECTION" /* PACKHOUSE_INSPECTION */]: [RESOURCE_PATHS.packhouse],
532
+ ["INVOICE" /* INVOICE */]: [RESOURCE_PATHS.documentHub],
533
+ ["LEGAL_CONTRACT" /* LEGAL_CONTRACT */]: [RESOURCE_PATHS.documentHub],
534
+ ["AUDIT_REPORT" /* AUDIT_REPORT */]: [RESOURCE_PATHS.safetyAuditing, RESOURCE_PATHS.dashboard],
535
+ ["SENSITIVE_IDENTITY" /* SENSITIVE_IDENTITY */]: [RESOURCE_PATHS.adminUserRoster]
536
+ };
537
+
538
+ export {
539
+ MOD,
540
+ CAT,
541
+ ACT,
542
+ SENTINEL_UUID,
543
+ MODULE_LABELS,
544
+ ERROR_DICTIONARY,
545
+ UserRole,
546
+ UserPrivilege,
547
+ AccessLevel,
548
+ EnabledModule,
549
+ FacilityType,
550
+ LinkedStatus,
551
+ RelationshipType,
552
+ ApprovalType,
553
+ TransactionType,
554
+ ApprovalStatus,
555
+ OrderStatus,
556
+ NotificationMode,
557
+ TaskType,
558
+ TaskStatus,
559
+ MimeType,
560
+ TargetEntityType,
561
+ AuditType,
562
+ AuditStatus,
563
+ SoilTexture,
564
+ MicroclimateZone,
565
+ PlantingMethod,
566
+ RowOrientation,
567
+ EmitterType,
568
+ TrellisType,
569
+ NettingType,
570
+ HarvestMethod,
571
+ VigorRating,
572
+ CropCycleStatus,
573
+ WaterSource,
574
+ PhysicalState,
575
+ FORM_REGISTRY,
576
+ TASK_TYPE_REGISTRY,
577
+ RESOURCE_PATHS,
578
+ RESOURCE_MODULE_MAP,
579
+ ACCESS_RANK,
580
+ ROLE_SECTIONS_BY_KEY,
581
+ EVERYONE,
582
+ RESOURCE_REQUIREMENTS,
583
+ DocumentType,
584
+ DOCUMENT_MENU_MAP
585
+ };