@deepintel-ltd/farmpro-contracts 1.5.8 → 1.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/index.js +50 -92
  2. package/dist/routes/admin.routes.js +13 -16
  3. package/dist/routes/agent-workflows.routes.js +81 -84
  4. package/dist/routes/agents.routes.js +29 -32
  5. package/dist/routes/analytics.routes.js +11 -14
  6. package/dist/routes/auth.routes.js +55 -58
  7. package/dist/routes/categories.routes.js +23 -26
  8. package/dist/routes/documents.routes.js +67 -70
  9. package/dist/routes/equipment.routes.js +55 -58
  10. package/dist/routes/farms.routes.js +32 -35
  11. package/dist/routes/field-monitoring.routes.js +70 -73
  12. package/dist/routes/field-observations.routes.js +41 -44
  13. package/dist/routes/fields.routes.js +44 -47
  14. package/dist/routes/finance.routes.js +121 -124
  15. package/dist/routes/harvest.routes.js +46 -49
  16. package/dist/routes/health.routes.js +6 -9
  17. package/dist/routes/index.js +51 -54
  18. package/dist/routes/input-usage.routes.js +14 -17
  19. package/dist/routes/inventory.routes.js +57 -60
  20. package/dist/routes/seasonal-plans.routes.js +14 -17
  21. package/dist/routes/soil-tests.routes.js +45 -48
  22. package/dist/routes/suppliers.routes.js +70 -73
  23. package/dist/routes/tasks.routes.js +65 -68
  24. package/dist/routes/team.routes.js +57 -60
  25. package/dist/routes/users.routes.js +13 -16
  26. package/dist/routes/weather.routes.js +10 -13
  27. package/dist/schemas/admin.schemas.js +43 -46
  28. package/dist/schemas/agent-workflows.schemas.js +34 -37
  29. package/dist/schemas/agents.schemas.js +46 -49
  30. package/dist/schemas/analytics.schemas.js +51 -54
  31. package/dist/schemas/auth.schemas.js +96 -99
  32. package/dist/schemas/categories.schemas.js +27 -30
  33. package/dist/schemas/common.schemas.js +89 -95
  34. package/dist/schemas/documents.schemas.js +59 -62
  35. package/dist/schemas/equipment.schemas.js +86 -89
  36. package/dist/schemas/farms.schemas.js +40 -43
  37. package/dist/schemas/field-monitoring.schemas.js +207 -210
  38. package/dist/schemas/field-observations.schemas.js +93 -96
  39. package/dist/schemas/fields.schemas.js +82 -85
  40. package/dist/schemas/finance.schemas.js +134 -137
  41. package/dist/schemas/harvest.schemas.js +46 -49
  42. package/dist/schemas/health.schemas.js +14 -17
  43. package/dist/schemas/input-usage.schemas.js +21 -24
  44. package/dist/schemas/inventory.schemas.js +58 -61
  45. package/dist/schemas/recommendations.schemas.js +22 -25
  46. package/dist/schemas/seasonal-plans.schemas.js +21 -24
  47. package/dist/schemas/soil-tests.schemas.js +70 -73
  48. package/dist/schemas/suppliers.schemas.js +90 -93
  49. package/dist/schemas/tasks.schemas.js +93 -96
  50. package/dist/schemas/team.schemas.js +35 -38
  51. package/dist/schemas/users.schemas.js +19 -22
  52. package/dist/schemas/weather.schemas.js +32 -35
  53. package/package.json +9 -1
@@ -1,89 +1,86 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.inventoryItemListResponseSchema = exports.inventoryItemDetailResponseSchema = exports.inventoryItemResponseSchema = exports.inventoryItemDetailResourceSchema = exports.inventoryItemResourceSchema = exports.logPurchaseSchema = exports.updateInventoryItemSchema = exports.createInventoryItemSchema = exports.logPurchaseAttributesSchema = exports.updateInventoryItemAttributesSchema = exports.createInventoryItemAttributesSchema = exports.inventoryItemAttributesSchema = void 0;
4
- const zod_1 = require("zod");
5
- const common_schemas_1 = require("./common.schemas");
1
+ import { z } from 'zod';
2
+ import { timestampsSchema, createJsonApiResourceSchema, jsonApiSingleResponseSchema, jsonApiCollectionResponseSchema } from './common.schemas';
6
3
  /**
7
4
  * Inventory schemas - JSON:API compliant
8
5
  */
9
6
  // Inventory item attributes schema (for JSON:API attributes object)
10
- exports.inventoryItemAttributesSchema = zod_1.z.object({
11
- name: zod_1.z.string(),
12
- category: zod_1.z.string(),
13
- stock: zod_1.z.number().nonnegative(), // Current stock
14
- unit: zod_1.z.string(),
15
- avgCost: zod_1.z.number().nonnegative(), // Average cost per unit
16
- totalValue: zod_1.z.number().nonnegative().optional(), // stock * avgCost
17
- }).merge(common_schemas_1.timestampsSchema);
7
+ export const inventoryItemAttributesSchema = z.object({
8
+ name: z.string(),
9
+ category: z.string(),
10
+ stock: z.number().nonnegative(), // Current stock
11
+ unit: z.string(),
12
+ avgCost: z.number().nonnegative(), // Average cost per unit
13
+ totalValue: z.number().nonnegative().optional(), // stock * avgCost
14
+ }).merge(timestampsSchema);
18
15
  // Inventory item attributes for creation (input)
19
- exports.createInventoryItemAttributesSchema = zod_1.z.object({
20
- name: zod_1.z.string().min(1).max(200),
21
- category: zod_1.z.string().min(1),
22
- unit: zod_1.z.string().min(1),
23
- initialStock: zod_1.z.number().nonnegative().default(0).optional(),
24
- initialCost: zod_1.z.number().nonnegative().optional(),
16
+ export const createInventoryItemAttributesSchema = z.object({
17
+ name: z.string().min(1).max(200),
18
+ category: z.string().min(1),
19
+ unit: z.string().min(1),
20
+ initialStock: z.number().nonnegative().default(0).optional(),
21
+ initialCost: z.number().nonnegative().optional(),
25
22
  });
26
23
  // Inventory item attributes for update (input)
27
- exports.updateInventoryItemAttributesSchema = zod_1.z.object({
28
- name: zod_1.z.string().min(1).max(200).optional(),
29
- category: zod_1.z.string().min(1).optional(),
30
- unit: zod_1.z.string().min(1).optional(),
24
+ export const updateInventoryItemAttributesSchema = z.object({
25
+ name: z.string().min(1).max(200).optional(),
26
+ category: z.string().min(1).optional(),
27
+ unit: z.string().min(1).optional(),
31
28
  });
32
29
  // Log purchase attributes (creates inventory item and expense)
33
- exports.logPurchaseAttributesSchema = zod_1.z.object({
34
- itemId: zod_1.z.string().uuid().optional(), // Existing inventory item ID (for restocking)
35
- name: zod_1.z.string().min(1).max(200).optional(), // New item name (if creating new item)
36
- category: zod_1.z.string().min(1).optional(), // Required if creating new item
37
- quantity: zod_1.z.number().positive(),
38
- unit: zod_1.z.string().min(1), // e.g., "bags", "liters", "kg"
39
- unitCost: zod_1.z.number().positive(),
40
- totalCost: zod_1.z.number().positive(), // quantity * unitCost
41
- date: zod_1.z.string().datetime(),
42
- supplier: zod_1.z.string().optional(),
30
+ export const logPurchaseAttributesSchema = z.object({
31
+ itemId: z.string().uuid().optional(), // Existing inventory item ID (for restocking)
32
+ name: z.string().min(1).max(200).optional(), // New item name (if creating new item)
33
+ category: z.string().min(1).optional(), // Required if creating new item
34
+ quantity: z.number().positive(),
35
+ unit: z.string().min(1), // e.g., "bags", "liters", "kg"
36
+ unitCost: z.number().positive(),
37
+ totalCost: z.number().positive(), // quantity * unitCost
38
+ date: z.string().datetime(),
39
+ supplier: z.string().optional(),
43
40
  // Expense allocation (optional)
44
- fieldId: zod_1.z.string().uuid().optional(),
45
- cropId: zod_1.z.string().optional(),
41
+ fieldId: z.string().uuid().optional(),
42
+ cropId: z.string().optional(),
46
43
  });
47
44
  // Create inventory item input (JSON:API format)
48
- exports.createInventoryItemSchema = zod_1.z.object({
49
- type: zod_1.z.literal('inventory-items'),
50
- attributes: exports.createInventoryItemAttributesSchema,
45
+ export const createInventoryItemSchema = z.object({
46
+ type: z.literal('inventory-items'),
47
+ attributes: createInventoryItemAttributesSchema,
51
48
  });
52
49
  // Update inventory item input (JSON:API format)
53
- exports.updateInventoryItemSchema = zod_1.z.object({
54
- type: zod_1.z.literal('inventory-items'),
55
- id: zod_1.z.string().uuid(),
56
- attributes: exports.updateInventoryItemAttributesSchema,
50
+ export const updateInventoryItemSchema = z.object({
51
+ type: z.literal('inventory-items'),
52
+ id: z.string().uuid(),
53
+ attributes: updateInventoryItemAttributesSchema,
57
54
  });
58
55
  // Log purchase input (JSON:API format)
59
- exports.logPurchaseSchema = zod_1.z.object({
60
- type: zod_1.z.literal('purchases'),
61
- attributes: exports.logPurchaseAttributesSchema,
56
+ export const logPurchaseSchema = z.object({
57
+ type: z.literal('purchases'),
58
+ attributes: logPurchaseAttributesSchema,
62
59
  });
63
60
  // Inventory item resource (JSON:API resource object)
64
- exports.inventoryItemResourceSchema = (0, common_schemas_1.createJsonApiResourceSchema)('inventory-items', exports.inventoryItemAttributesSchema);
61
+ export const inventoryItemResourceSchema = createJsonApiResourceSchema('inventory-items', inventoryItemAttributesSchema);
65
62
  // Inventory item detail resource with relationships
66
- exports.inventoryItemDetailResourceSchema = exports.inventoryItemResourceSchema.extend({
67
- relationships: zod_1.z.object({
68
- tasks: zod_1.z.object({
69
- meta: zod_1.z.object({
70
- count: zod_1.z.number().int().nonnegative(),
63
+ export const inventoryItemDetailResourceSchema = inventoryItemResourceSchema.extend({
64
+ relationships: z.object({
65
+ tasks: z.object({
66
+ meta: z.object({
67
+ count: z.number().int().nonnegative(),
71
68
  }),
72
- links: zod_1.z.object({
73
- related: zod_1.z.string(),
69
+ links: z.object({
70
+ related: z.string(),
74
71
  }),
75
72
  }).optional(),
76
- transactions: zod_1.z.object({
77
- meta: zod_1.z.object({
78
- count: zod_1.z.number().int().nonnegative(),
73
+ transactions: z.object({
74
+ meta: z.object({
75
+ count: z.number().int().nonnegative(),
79
76
  }),
80
- links: zod_1.z.object({
81
- related: zod_1.z.string(),
77
+ links: z.object({
78
+ related: z.string(),
82
79
  }),
83
80
  }).optional(),
84
81
  }).optional(),
85
82
  });
86
83
  // Inventory item responses (JSON:API format)
87
- exports.inventoryItemResponseSchema = (0, common_schemas_1.jsonApiSingleResponseSchema)(exports.inventoryItemResourceSchema);
88
- exports.inventoryItemDetailResponseSchema = (0, common_schemas_1.jsonApiSingleResponseSchema)(exports.inventoryItemDetailResourceSchema);
89
- exports.inventoryItemListResponseSchema = (0, common_schemas_1.jsonApiCollectionResponseSchema)(exports.inventoryItemResourceSchema);
84
+ export const inventoryItemResponseSchema = jsonApiSingleResponseSchema(inventoryItemResourceSchema);
85
+ export const inventoryItemDetailResponseSchema = jsonApiSingleResponseSchema(inventoryItemDetailResourceSchema);
86
+ export const inventoryItemListResponseSchema = jsonApiCollectionResponseSchema(inventoryItemResourceSchema);
@@ -1,32 +1,29 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.recommendationSchema = exports.recommendationMaterialSchema = void 0;
4
- const zod_1 = require("zod");
1
+ import { z } from 'zod';
5
2
  /**
6
3
  * Centralized Recommendation Schemas
7
4
  */
8
5
  // Schema for materials suggested in a recommendation
9
- exports.recommendationMaterialSchema = zod_1.z.object({
10
- inventoryItemId: zod_1.z.string().uuid().optional(),
11
- name: zod_1.z.string(),
12
- quantity: zod_1.z.number(),
13
- unit: zod_1.z.string(),
14
- costPerUnit: zod_1.z.number().optional(),
15
- totalCost: zod_1.z.number().optional(),
16
- availability: zod_1.z.string().optional(),
6
+ export const recommendationMaterialSchema = z.object({
7
+ inventoryItemId: z.string().uuid().optional(),
8
+ name: z.string(),
9
+ quantity: z.number(),
10
+ unit: z.string(),
11
+ costPerUnit: z.number().optional(),
12
+ totalCost: z.number().optional(),
13
+ availability: z.string().optional(),
17
14
  });
18
15
  // The core, reusable recommendation schema
19
- exports.recommendationSchema = zod_1.z.object({
20
- priority: zod_1.z.number().min(1).max(5),
21
- action: zod_1.z.string(),
22
- details: zod_1.z.string(),
23
- timing: zod_1.z.string(),
24
- severity: zod_1.z.enum(['low', 'medium', 'high', 'critical']).optional(),
25
- confidence: zod_1.z.number().min(0).max(1).optional(),
26
- materials: zod_1.z.array(exports.recommendationMaterialSchema).optional(),
27
- applicationMethod: zod_1.z.string().optional(),
28
- expectedOutcome: zod_1.z.string().optional(),
29
- preventiveMeasures: zod_1.z.array(zod_1.z.string()).optional(),
30
- estimatedTime: zod_1.z.string().optional(),
31
- riskLevel: zod_1.z.string().optional(),
16
+ export const recommendationSchema = z.object({
17
+ priority: z.number().min(1).max(5),
18
+ action: z.string(),
19
+ details: z.string(),
20
+ timing: z.string(),
21
+ severity: z.enum(['low', 'medium', 'high', 'critical']).optional(),
22
+ confidence: z.number().min(0).max(1).optional(),
23
+ materials: z.array(recommendationMaterialSchema).optional(),
24
+ applicationMethod: z.string().optional(),
25
+ expectedOutcome: z.string().optional(),
26
+ preventiveMeasures: z.array(z.string()).optional(),
27
+ estimatedTime: z.string().optional(),
28
+ riskLevel: z.string().optional(),
32
29
  });
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getSeasonalPlanQuerySchema = exports.seasonalPlanResponseSchema = exports.seasonalPlanResourceSchema = exports.seasonalPlanAttributesSchema = exports.seasonalPlanItemSchema = void 0;
4
- const zod_1 = require("zod");
5
- const common_schemas_1 = require("./common.schemas");
1
+ import { z } from 'zod';
2
+ import { timestampsSchema, createJsonApiResourceSchema, jsonApiSingleResponseSchema, } from './common.schemas';
6
3
  /**
7
4
  * Seasonal Plans schemas - JSON:API compliant
8
5
  *
@@ -10,28 +7,28 @@ const common_schemas_1 = require("./common.schemas");
10
7
  * Data is calculated from tasks and field data
11
8
  */
12
9
  // Seasonal plan item schema (for progress tracking)
13
- exports.seasonalPlanItemSchema = zod_1.z.object({
14
- id: zod_1.z.string(),
15
- title: zod_1.z.string(), // e.g., "Planted Hectares", "Harvested Hectares"
16
- planned: zod_1.z.number(),
17
- actual: zod_1.z.number(),
18
- unit: zod_1.z.string(), // e.g., "Ha", "kg", "L"
10
+ export const seasonalPlanItemSchema = z.object({
11
+ id: z.string(),
12
+ title: z.string(), // e.g., "Planted Hectares", "Harvested Hectares"
13
+ planned: z.number(),
14
+ actual: z.number(),
15
+ unit: z.string(), // e.g., "Ha", "kg", "L"
19
16
  });
20
17
  // Seasonal plan attributes schema
21
- exports.seasonalPlanAttributesSchema = zod_1.z.object({
22
- farmId: zod_1.z.string().uuid(),
23
- season: zod_1.z.string(), // e.g., "2024-2025"
24
- startDate: zod_1.z.string().datetime().optional(),
25
- endDate: zod_1.z.string().datetime().optional(),
26
- items: zod_1.z.array(exports.seasonalPlanItemSchema), // Progress items
27
- }).merge(common_schemas_1.timestampsSchema);
18
+ export const seasonalPlanAttributesSchema = z.object({
19
+ farmId: z.string().uuid(),
20
+ season: z.string(), // e.g., "2024-2025"
21
+ startDate: z.string().datetime().optional(),
22
+ endDate: z.string().datetime().optional(),
23
+ items: z.array(seasonalPlanItemSchema), // Progress items
24
+ }).merge(timestampsSchema);
28
25
  // Seasonal plan resource schema
29
- exports.seasonalPlanResourceSchema = (0, common_schemas_1.createJsonApiResourceSchema)('seasonal-plans', exports.seasonalPlanAttributesSchema);
26
+ export const seasonalPlanResourceSchema = createJsonApiResourceSchema('seasonal-plans', seasonalPlanAttributesSchema);
30
27
  // Seasonal plan response schema
31
- exports.seasonalPlanResponseSchema = (0, common_schemas_1.jsonApiSingleResponseSchema)(exports.seasonalPlanResourceSchema);
28
+ export const seasonalPlanResponseSchema = jsonApiSingleResponseSchema(seasonalPlanResourceSchema);
32
29
  // Query parameters for getting seasonal plan
33
- exports.getSeasonalPlanQuerySchema = zod_1.z.object({
34
- season: zod_1.z.string().optional(), // e.g., "2024-2025"
35
- 'filter[startDate]': zod_1.z.string().datetime().optional(),
36
- 'filter[endDate]': zod_1.z.string().datetime().optional(),
30
+ export const getSeasonalPlanQuerySchema = z.object({
31
+ season: z.string().optional(), // e.g., "2024-2025"
32
+ 'filter[startDate]': z.string().datetime().optional(),
33
+ 'filter[endDate]': z.string().datetime().optional(),
37
34
  });
@@ -1,102 +1,99 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.soilTestListResponseSchema = exports.soilTestDetailResponseSchema = exports.soilTestResponseSchema = exports.soilTestDetailResourceSchema = exports.soilTestResourceSchema = exports.updateSoilTestSchema = exports.createSoilTestSchema = exports.updateSoilTestAttributesSchema = exports.createSoilTestAttributesSchema = exports.soilTestAttributesSchema = exports.fertilizerRecommendationSchema = exports.nutrientUnitSchema = void 0;
4
- const zod_1 = require("zod");
5
- const common_schemas_1 = require("./common.schemas");
1
+ import { z } from 'zod';
2
+ import { timestampsSchema, createJsonApiResourceSchema, jsonApiSingleResponseSchema, jsonApiCollectionResponseSchema } from './common.schemas';
6
3
  /**
7
4
  * Soil test schemas - JSON:API compliant
8
5
  */
9
6
  // Nutrient unit enum
10
- exports.nutrientUnitSchema = zod_1.z.enum(['ppm', 'kg/ha']);
7
+ export const nutrientUnitSchema = z.enum(['ppm', 'kg/ha']);
11
8
  // Fertilizer recommendation schema (embedded in soil test attributes)
12
- exports.fertilizerRecommendationSchema = zod_1.z.object({
13
- inventoryItemId: zod_1.z.string().uuid(),
14
- quantity: zod_1.z.number().positive(),
15
- unit: zod_1.z.string(),
16
- reason: zod_1.z.string(), // Simple explanation
17
- estimatedCost: zod_1.z.number().nonnegative().optional(),
9
+ export const fertilizerRecommendationSchema = z.object({
10
+ inventoryItemId: z.string().uuid(),
11
+ quantity: z.number().positive(),
12
+ unit: z.string(),
13
+ reason: z.string(), // Simple explanation
14
+ estimatedCost: z.number().nonnegative().optional(),
18
15
  });
19
16
  // Soil test attributes schema (for JSON:API attributes object)
20
- exports.soilTestAttributesSchema = zod_1.z.object({
21
- fieldId: zod_1.z.string().uuid(),
22
- fieldName: zod_1.z.string().optional(),
23
- testDate: zod_1.z.string().datetime(),
24
- testedBy: zod_1.z.string().nullable(),
25
- labName: zod_1.z.string().nullable(),
26
- cropAtTimeOfTest: zod_1.z.string().nullable(),
17
+ export const soilTestAttributesSchema = z.object({
18
+ fieldId: z.string().uuid(),
19
+ fieldName: z.string().optional(),
20
+ testDate: z.string().datetime(),
21
+ testedBy: z.string().nullable(),
22
+ labName: z.string().nullable(),
23
+ cropAtTimeOfTest: z.string().nullable(),
27
24
  // Core properties
28
- pH: zod_1.z.number(),
29
- nitrogen: zod_1.z.number().nullable(),
30
- nitrogenUnit: exports.nutrientUnitSchema.nullable(),
31
- phosphorus: zod_1.z.number().nullable(),
32
- phosphorusUnit: exports.nutrientUnitSchema.nullable(),
33
- potassium: zod_1.z.number().nullable(),
34
- potassiumUnit: exports.nutrientUnitSchema.nullable(),
25
+ pH: z.number(),
26
+ nitrogen: z.number().nullable(),
27
+ nitrogenUnit: nutrientUnitSchema.nullable(),
28
+ phosphorus: z.number().nullable(),
29
+ phosphorusUnit: nutrientUnitSchema.nullable(),
30
+ potassium: z.number().nullable(),
31
+ potassiumUnit: nutrientUnitSchema.nullable(),
35
32
  // Optional
36
- organicMatter: zod_1.z.number().nullable(),
37
- testCost: zod_1.z.number().nullable(),
38
- notes: zod_1.z.string().nullable(),
39
- documentUrl: zod_1.z.string().url().nullable(),
33
+ organicMatter: z.number().nullable(),
34
+ testCost: z.number().nullable(),
35
+ notes: z.string().nullable(),
36
+ documentUrl: z.string().url().nullable(),
40
37
  // Recommendations (generated by backend)
41
- recommendedFertilizers: zod_1.z.array(exports.fertilizerRecommendationSchema).optional(),
42
- recommendations: zod_1.z.string().nullable().optional(), // Simple text recommendations
43
- createdBy: zod_1.z.string().uuid().nullable(),
44
- }).merge(common_schemas_1.timestampsSchema);
38
+ recommendedFertilizers: z.array(fertilizerRecommendationSchema).optional(),
39
+ recommendations: z.string().nullable().optional(), // Simple text recommendations
40
+ createdBy: z.string().uuid().nullable(),
41
+ }).merge(timestampsSchema);
45
42
  // Soil test attributes for creation (input)
46
- exports.createSoilTestAttributesSchema = zod_1.z.object({
47
- fieldId: zod_1.z.string().uuid(),
48
- testDate: zod_1.z.string().datetime(),
49
- testedBy: zod_1.z.string().optional(), // User ID or lab name
50
- labName: zod_1.z.string().optional(),
51
- cropAtTimeOfTest: zod_1.z.string().optional(), // What crop was growing when test was taken
43
+ export const createSoilTestAttributesSchema = z.object({
44
+ fieldId: z.string().uuid(),
45
+ testDate: z.string().datetime(),
46
+ testedBy: z.string().optional(), // User ID or lab name
47
+ labName: z.string().optional(),
48
+ cropAtTimeOfTest: z.string().optional(), // What crop was growing when test was taken
52
49
  // Core chemical properties
53
- pH: zod_1.z.number().min(0).max(14),
54
- nitrogen: zod_1.z.number().nonnegative().optional(),
55
- nitrogenUnit: exports.nutrientUnitSchema.optional(),
56
- phosphorus: zod_1.z.number().nonnegative().optional(),
57
- phosphorusUnit: exports.nutrientUnitSchema.optional(),
58
- potassium: zod_1.z.number().nonnegative().optional(),
59
- potassiumUnit: exports.nutrientUnitSchema.optional(),
50
+ pH: z.number().min(0).max(14),
51
+ nitrogen: z.number().nonnegative().optional(),
52
+ nitrogenUnit: nutrientUnitSchema.optional(),
53
+ phosphorus: z.number().nonnegative().optional(),
54
+ phosphorusUnit: nutrientUnitSchema.optional(),
55
+ potassium: z.number().nonnegative().optional(),
56
+ potassiumUnit: nutrientUnitSchema.optional(),
60
57
  // Optional
61
- organicMatter: zod_1.z.number().nonnegative().optional(), // percentage
62
- testCost: zod_1.z.number().nonnegative().optional(),
63
- notes: zod_1.z.string().optional(),
64
- documentUrl: zod_1.z.string().url().optional(), // Link to uploaded test report
58
+ organicMatter: z.number().nonnegative().optional(), // percentage
59
+ testCost: z.number().nonnegative().optional(),
60
+ notes: z.string().optional(),
61
+ documentUrl: z.string().url().optional(), // Link to uploaded test report
65
62
  });
66
63
  // Soil test attributes for update (input)
67
- exports.updateSoilTestAttributesSchema = exports.createSoilTestAttributesSchema.partial().extend({
68
- fieldId: zod_1.z.string().uuid().optional(),
69
- testDate: zod_1.z.string().datetime().optional(),
64
+ export const updateSoilTestAttributesSchema = createSoilTestAttributesSchema.partial().extend({
65
+ fieldId: z.string().uuid().optional(),
66
+ testDate: z.string().datetime().optional(),
70
67
  });
71
68
  // Create soil test input (JSON:API format)
72
- exports.createSoilTestSchema = zod_1.z.object({
73
- type: zod_1.z.literal('soil-tests'),
74
- attributes: exports.createSoilTestAttributesSchema,
69
+ export const createSoilTestSchema = z.object({
70
+ type: z.literal('soil-tests'),
71
+ attributes: createSoilTestAttributesSchema,
75
72
  });
76
73
  // Update soil test input (JSON:API format)
77
- exports.updateSoilTestSchema = zod_1.z.object({
78
- type: zod_1.z.literal('soil-tests'),
79
- id: zod_1.z.string().uuid(),
80
- attributes: exports.updateSoilTestAttributesSchema,
74
+ export const updateSoilTestSchema = z.object({
75
+ type: z.literal('soil-tests'),
76
+ id: z.string().uuid(),
77
+ attributes: updateSoilTestAttributesSchema,
81
78
  });
82
79
  // Soil test resource (JSON:API resource object)
83
- exports.soilTestResourceSchema = (0, common_schemas_1.createJsonApiResourceSchema)('soil-tests', exports.soilTestAttributesSchema);
80
+ export const soilTestResourceSchema = createJsonApiResourceSchema('soil-tests', soilTestAttributesSchema);
84
81
  // Soil test detail resource with relationships
85
- exports.soilTestDetailResourceSchema = exports.soilTestResourceSchema.extend({
86
- relationships: zod_1.z.object({
87
- field: zod_1.z.object({
88
- links: zod_1.z.object({
89
- related: zod_1.z.string(),
82
+ export const soilTestDetailResourceSchema = soilTestResourceSchema.extend({
83
+ relationships: z.object({
84
+ field: z.object({
85
+ links: z.object({
86
+ related: z.string(),
90
87
  }),
91
88
  }).optional(),
92
- recommended_fertilizers: zod_1.z.object({
93
- links: zod_1.z.object({
94
- related: zod_1.z.string(),
89
+ recommended_fertilizers: z.object({
90
+ links: z.object({
91
+ related: z.string(),
95
92
  }),
96
93
  }).optional(),
97
94
  }).optional(),
98
95
  });
99
96
  // Soil test responses (JSON:API format)
100
- exports.soilTestResponseSchema = (0, common_schemas_1.jsonApiSingleResponseSchema)(exports.soilTestResourceSchema);
101
- exports.soilTestDetailResponseSchema = (0, common_schemas_1.jsonApiSingleResponseSchema)(exports.soilTestDetailResourceSchema);
102
- exports.soilTestListResponseSchema = (0, common_schemas_1.jsonApiCollectionResponseSchema)(exports.soilTestResourceSchema);
97
+ export const soilTestResponseSchema = jsonApiSingleResponseSchema(soilTestResourceSchema);
98
+ export const soilTestDetailResponseSchema = jsonApiSingleResponseSchema(soilTestDetailResourceSchema);
99
+ export const soilTestListResponseSchema = jsonApiCollectionResponseSchema(soilTestResourceSchema);