fork of hey-api/openapi-ts because I need some additional things
1{
2 "openapi": "3.0.4",
3 "info": {
4 "title": "Dutchie Point of Sale API",
5 "description": "\r\n**Comprehensive REST API for Dutchie Point of Sale Platform Integration**\r\n\r\nThe Dutchie Point of Sale API provides complete access to your cannabis retail operations, enabling seamless integration with third-party systems, custom applications, and business intelligence tools.\r\n\r\n**Core Capabilities:**\r\n• **Product Management** - Create, update, and sync product catalogs with real-time inventory\r\n• **Customer Operations** - Manage customer profiles, loyalty programs, and purchase history \r\n• **Inventory Control** - Track stock levels, receive shipments, and monitor product movement\r\n• **Reporting & Analytics** - Access comprehensive sales, inventory, and customer data\r\n• **Compliance Integration** - Maintain regulatory compliance with automated state reporting\r\n\r\n**Base URL:** `https://api.pos.dutchie.com`\r\n\r\n**Authentication:** All requests require a valid API key provided via HTTP Basic Authentication (username: your API key, password: leave empty).\r\n\r\n**Rate Limiting:** Requests are limited to ensure optimal performance for all users. See individual endpoints for specific limits.\r\n",
6 "version": "v1.0.0"
7 },
8 "servers": [
9 {
10 "url": "/",
11 "description": "Current Host"
12 },
13 {
14 "url": "https://api.pos.dutchie.com",
15 "description": "Production API Server"
16 }
17 ],
18 "paths": {
19 "/batch/lab-results": {
20 "post": {
21 "tags": ["Batch"],
22 "summary": "Create or Update Batch Lab Results",
23 "description": "**Purpose:** Create or update comprehensive laboratory testing results for a specific batch to ensure compliance with cannabis regulations and provide quality assurance data.\n\n**Request Requirements:**\n- \"PackageWrite\" role authorization required for lab data operations\n- `UpdateBatchLabResultsRequest` object in request body with lab result data\n- Content-Type: application/json\n- BatchName must exist and be accessible to your location\n\n**Response Data:**\n- Returns success confirmation (HTTP 200) upon successful creation or update\n- No response body content (void return)\n- Lab results are validated and stored for compliance and quality tracking\n- Updates are reflected immediately in batch data and inventory systems\n\n**Create vs Update Behavior:**\n- **CREATE**: When no lab results exist for the batch, new lab results will be created\n- **UPDATE**: When lab results already exist for the batch, existing results will be updated\n- **Validation**: Lab result data must pass validation requirements for regulatory compliance\n- **Batch Sharing**: All packages within the same batch share identical lab results\n\n**Request Body Fields:**\n- BatchName: Name of the batch to update lab results for (required)\n- SampleWeight: Weight of the sample tested (optional, defaults to -1)\n- LabResults: Array of lab result objects with test data (required)\n\n**Sparse Update Behavior:**\n- **Provided lab results**: Will overwrite existing test data with new values\n- **Omitted lab results**: Existing test data for those analytes will be preserved\n- **Special handling**: If multiple packages exist in the same batch, all will share the updated results\n- **Validation**: All provided lab data must meet regulatory testing standards\n\n**Lab Result Data Types:**\n- **Cannabinoid Testing**: THC, THCA, CBD, CBDA, CBN, CBG concentrations\n- **Safety Testing**: Pesticides, heavy metals, microbials, mycotoxins results\n- **Quality Testing**: Moisture content, foreign matter, residual solvents\n- **Potency Testing**: Total THC/CBD calculations and verification\n- **Terpene Testing**: Terpene profiles and concentration data\n\n**Common Use Cases:**\n- Submit initial lab results from testing laboratory for compliance reporting\n- Update lab results when retesting or additional testing is performed\n- Correct lab result data when errors are discovered\n- Add supplementary testing results (terpenes, additional cannabinoids)\n- Maintain accurate Certificate of Analysis (COA) data for regulatory compliance\n\n**Performance & Limits:**\n- Single batch operation for targeted lab result updates\n- Immediate validation and compliance checking\n- Changes propagate to all packages within the batch immediately\n- Optimized for laboratory workflow integration\n\n**Related Endpoints:**\n- `POST /package/lab-results` - Update lab results by package ID instead of batch name\n- `GET /inventory/labresults` - Retrieve lab results for display and verification\n- `GET /reference/lab-result-units` - Get valid units for lab result data\n- `GET /reference/lab-results-names` - Get valid analyte names for testing\n\n**Important Notes:**\n- **Batch Sharing**: All packages in the same batch will share these lab results\n- **Compliance Critical**: Lab results are required for legal cannabis sales and regulatory reporting\n- **Data Integrity**: Validation ensures lab results meet regulatory standards\n- **Certificate Updates**: Changes update Certificate of Analysis (COA) documentation\n- **Alternative Access**: Use POST /package/lab-results if you prefer to work with package IDs",
24 "operationId": "BatchLab-resultsPost",
25 "requestBody": {
26 "description": "Batch lab results update request with batch name and lab data - UpdateBatchLabResultsRequest object",
27 "content": {
28 "application/json-patch+json": {
29 "schema": {
30 "$ref": "#/components/schemas/UpdateBatchLabResultsRequest"
31 }
32 },
33 "application/json": {
34 "schema": {
35 "$ref": "#/components/schemas/UpdateBatchLabResultsRequest"
36 }
37 },
38 "text/json": {
39 "schema": {
40 "$ref": "#/components/schemas/UpdateBatchLabResultsRequest"
41 }
42 },
43 "application/*+json": {
44 "schema": {
45 "$ref": "#/components/schemas/UpdateBatchLabResultsRequest"
46 }
47 }
48 },
49 "x-bodyName": "req"
50 },
51 "responses": {
52 "200": {
53 "description": "Success - Lab results successfully created or updated"
54 },
55 "400": {
56 "description": "Bad Request - String error message (parse response body as plain text) OR `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array",
57 "content": {
58 "application/json": {
59 "schema": {
60 "$ref": "#/components/schemas/ValidationResult"
61 }
62 }
63 }
64 },
65 "401": {
66 "description": "Invalid API Key"
67 },
68 "403": {
69 "description": "Account not authorized"
70 },
71 "404": {
72 "description": "Not Found - Batch with specified name does not exist",
73 "content": {
74 "application/json": {
75 "schema": {
76 "type": "string"
77 }
78 }
79 }
80 },
81 "500": {
82 "description": "Something went wrong."
83 }
84 }
85 }
86 },
87 "/brand": {
88 "get": {
89 "tags": ["Brand"],
90 "summary": "Get All Brands",
91 "description": "**Purpose:** Retrieve comprehensive list of all active product brands available for the authenticated location.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of brand objects: `[{ Brand }, ...]`\n- Array typically contains 10-100 brands per location\n- Returns empty array `[]` if no brands configured for location\n- Brand ID, name, and optional external catalog identifiers\n- Only active, non-deleted brands are included in results\n- Results automatically filtered to authenticated location\n\n**Common Use Cases:**\n- Populate brand dropdown lists in product creation and editing forms\n- Show available brands for product categorization and filtering on e-commerce sites\n- Group products by brand for inventory management and organization\n- Generate brand-specific reports for regulatory compliance requirements\n- Organize dispensary menus by brand for customer browsing\n- Synchronize brand data with external POS and e-commerce systems\n\n**Performance & Limits:**\n- Lightweight data that is typically small and fast to retrieve\n- This endpoint is commonly called for form population and product management\n- No pagination needed due to typically small brand datasets\n\n**Related Endpoints:**\n- `GET /products` - Get products which include brand information in response\n- `POST /brand` - Create or update brand information\n\n**Important Notes:**\n- Despite the singular endpoint name `/brand`, this method returns multiple brands (an array)\n- Brands are automatically scoped to the authenticated dispensary location\n- Only active brands are returned; deleted brands are excluded\n- Brands returned here can be used when creating or updating products",
92 "operationId": "BrandGet",
93 "responses": {
94 "200": {
95 "description": "Success - Returns array of brand objects: `[{ Brand }, ...]`",
96 "content": {
97 "application/json": {
98 "schema": {
99 "type": "array",
100 "items": {
101 "$ref": "#/components/schemas/Brand"
102 }
103 }
104 }
105 }
106 },
107 "401": {
108 "description": "Unauthorized - Invalid or missing API key"
109 },
110 "403": {
111 "description": "Forbidden - Account not authorized for brand access"
112 },
113 "500": {
114 "description": "Internal Server Error - Server error occurred"
115 }
116 }
117 },
118 "post": {
119 "tags": ["Brand"],
120 "summary": "Create or Update Brand",
121 "description": "**Purpose:** Creates a new brand or updates an existing brand with the provided brand information.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- `BrandEditRequest` object in request body with brand details\n- Content-Type: application/json\n\n**Response Data:**\n- Returns brand object: `{ Brand }`\n- Includes assigned or updated brand ID and all brand properties\n\n**Create vs Update Behavior:**\n- **CREATE**: When `BrandId` is null or omitted, a new brand will be created\n- **UPDATE**: When `BrandId` is provided with a valid brand ID, the existing brand will be updated\n- **Validation**: Brand name is required for both operations and must be unique within the location\n\n**Sparse Update Behavior:**\n- **Provided fields**: Will overwrite existing brand values with provided data\n- **Omitted fields**: Will preserve existing brand values (no data loss)\n- **Required validation**: BrandName must be provided even for updates\n\n**Common Use Cases:**\n- Add new product brands to the system for product categorization\n- Update existing brand information when details change\n- Maintain brand consistency across products and inventory\n- Synchronize brand data from external systems\n\n**Performance & Limits:**\n- Single brand operation for targeted updates\n- Immediate validation and response\n- Changes are reflected immediately in brand listings\n\n**Related Endpoints:**\n- `GET /brand` - Retrieve all brands to see current brand list\n- `GET /products` - View products that use specific brands\n\n**Important Notes:**\n- Brand name must be unique within the authenticated location\n- All validation errors will be returned in a structured error response\n- This endpoint handles a single brand per request\n- Successful operations return the complete brand object",
122 "operationId": "BrandPost",
123 "requestBody": {
124 "description": "Brand information to create or update - BrandEditRequest object with brand details",
125 "content": {
126 "application/json-patch+json": {
127 "schema": {
128 "$ref": "#/components/schemas/BrandEditRequest"
129 }
130 },
131 "application/json": {
132 "schema": {
133 "$ref": "#/components/schemas/BrandEditRequest"
134 }
135 },
136 "text/json": {
137 "schema": {
138 "$ref": "#/components/schemas/BrandEditRequest"
139 }
140 },
141 "application/*+json": {
142 "schema": {
143 "$ref": "#/components/schemas/BrandEditRequest"
144 }
145 }
146 },
147 "x-bodyName": "brand"
148 },
149 "responses": {
150 "200": {
151 "description": "Success - Returns brand object: `{ Brand }`",
152 "content": {
153 "application/json": {
154 "schema": {
155 "$ref": "#/components/schemas/Brand"
156 }
157 }
158 }
159 },
160 "400": {
161 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
162 "content": {
163 "application/json": {
164 "schema": {
165 "$ref": "#/components/schemas/BadRequestResponse"
166 }
167 }
168 }
169 },
170 "401": {
171 "description": "Invalid API Key"
172 },
173 "403": {
174 "description": "Account not authorized"
175 },
176 "500": {
177 "description": "Internal server error"
178 }
179 }
180 }
181 },
182 "/customer/customers": {
183 "get": {
184 "tags": ["Customer"],
185 "summary": "Get Customers",
186 "description": "**Purpose:** Retrieves a list of customers with optional filtering by modification date, customer ID, or unique ID for customer management and data synchronization.\n\n**Request Requirements:**\n- \"Customer\" role authorization required for customer data operations\n- Optional query parameters for filtering results\n- No request body needed\n\n**Response Data:**\n- Returns array of customer objects: `[{ Customer }, ...]`\n- Array may contain 0 to 10,000+ customers depending on location and filtering\n- Returns empty array `[]` if no customers match criteria (not null)\n- Includes loyalty status and qualifying conditions when available\n- Results automatically filtered by the authenticated user's location\n- Customer profiles with contact information and preferences\n\n**Filtering Options:**\n- No parameters: Returns all customers for the location\n- fromLastModifiedDateUTC: Returns customers modified after this date for incremental sync\n- toLastModifiedDateUTC: Returns customers modified before this date for date range filtering\n- customerID: Returns a specific customer by internal ID\n- uniqueId: Returns a specific customer by unique identifier\n- includeAnonymous: Include/exclude anonymous customers (default: true)\n\n**Common Use Cases:**\n- Call without parameters for initial sync to get all customers\n- Use fromLastModifiedDateUTC for incremental sync to get only recent changes\n- Use customerID or uniqueId for specific customer retrieval\n- Sync customer data for point-of-sale systems integration\n- Export customer data for external CRM or marketing systems\n\n**Performance & Limits:**\n- Maximum date range is configurable per location (default: 90 days)\n- Use incremental sync for large datasets to avoid timeouts\n- Optimized for high-volume data synchronization\n- Consider using paginated endpoint for very large customer bases\n\n**Related Endpoints:**\n- `GET /customer/customers-paginated` - Paginated version for large datasets\n- `POST /customer` - Create or update customer information\n- `POST /customerLookup` - Find existing customers by various search criteria\n\n**Important Notes:**\n- Results filtered to authenticated user's location for data security\n- Date range limits help prevent timeouts with large customer databases\n- Anonymous customers can be included or excluded based on business needs\n- Loyalty status information included when available for customer insights",
187 "operationId": "CustomerCustomersGet",
188 "parameters": [
189 {
190 "name": "fromLastModifiedDateUTC",
191 "in": "query",
192 "description": "Optional date filter to return customers modified after this timestamp - Used for incremental sync",
193 "schema": {
194 "type": "string",
195 "format": "date-time"
196 }
197 },
198 {
199 "name": "toLastModifiedDateUTC",
200 "in": "query",
201 "description": "Optional date filter to return customers modified before this timestamp - Used for date range filtering",
202 "schema": {
203 "type": "string",
204 "format": "date-time"
205 }
206 },
207 {
208 "name": "customerID",
209 "in": "query",
210 "description": "Optional customer ID to return a specific customer by internal ID",
211 "schema": {
212 "type": "integer",
213 "format": "int32"
214 }
215 },
216 {
217 "name": "includeAnonymous",
218 "in": "query",
219 "description": "Include/exclude anonymous customers in results - Default: true",
220 "schema": {
221 "type": "boolean",
222 "default": true
223 }
224 },
225 {
226 "name": "uniqueId",
227 "in": "query",
228 "description": "Optional unique ID to return a specific customer by unique identifier - Must be valid long integer when provided",
229 "schema": {
230 "type": "string"
231 }
232 }
233 ],
234 "responses": {
235 "200": {
236 "description": "Success - Returns array of customer objects: `[{ Customer }, ...]`",
237 "content": {
238 "application/json": {
239 "schema": {
240 "type": "array",
241 "items": {
242 "$ref": "#/components/schemas/Customer"
243 }
244 }
245 }
246 }
247 },
248 "400": {
249 "description": "Bad Request - Invalid date range or uniqueId format",
250 "content": {
251 "application/json": {
252 "schema": {
253 "$ref": "#/components/schemas/BadRequestResponse"
254 }
255 }
256 }
257 },
258 "401": {
259 "description": "Unauthorized - Invalid or missing API key"
260 },
261 "403": {
262 "description": "Forbidden - Account not authorized for customer data operations"
263 },
264 "404": {
265 "description": "Not Found - Customer not found when searching by customerID or uniqueId"
266 },
267 "500": {
268 "description": "Internal Server Error - Server error occurred"
269 }
270 }
271 }
272 },
273 "/customer/customers-paginated": {
274 "get": {
275 "tags": ["Customer"],
276 "summary": "Get Customers (Paginated)",
277 "description": "**Purpose:** Retrieves customers in paginated chunks for better performance with large customer datasets and efficient memory management.\n\n**Request Requirements:**\n- \"Customer\" role authorization required for customer data operations\n- Optional query parameters for pagination and filtering\n- No request body needed\n\n**Response Data:**\n- Response format: `[{ Customer }, { Customer }, ...]`\n- **No pagination metadata**: Response contains only data array without total counts or page information\n- Array contains up to PageSize customers (default 1000, max 10000)\n- Returns empty array `[]` if no customers found for page (not null)\n- Includes loyalty status and qualifying conditions when available\n- Results automatically filtered by the authenticated user's location\n\n**Pagination Usage:**\n- **First Request**: Call with PageNumber=0 to get first page\n- **Subsequent Requests**: Increment PageNumber for each additional page\n- **End Detection**: Continue requesting pages until you receive an empty array `[]`\n- **Page Size Control**: Use PageSize parameter to control items per page (max 10,000)\n- **Example Flow**: Request PageNumber=0 → Process results → Increment PageNumber → Repeat until empty `[]` response\n\n**Pagination Detection:**\n- **End of data detection**: Continue requesting pages until you receive an empty array `[]`\n- **No metadata provided**: Response does not include total counts, page counts, or hasNextPage indicators\n- **Sequential access**: Increment PageNumber from 0 until empty response indicates no more data\n\n**Filtering Options:**\n- fromLastModifiedDateUTC: Returns customers modified after this date\n- toLastModifiedDateUTC: Returns customers modified before this date\n- includeAnonymous: Include/exclude anonymous customers (default: true)\n\n**Common Use Cases:**\n- Process large customer databases efficiently for data export\n- Batch processing customers to avoid memory issues in applications\n- Large-scale customer data synchronization with external systems\n- Generate customer reports without overwhelming system resources\n- Support high-volume customer data operations with controlled memory usage\n\n**Performance & Limits:**\n- Maximum 10,000 customers per page for optimal performance\n- Use consistent page size throughout pagination sequence for efficiency\n- Monitor response times and adjust page size for optimal performance\n- Cache results locally to minimize API calls and improve responsiveness\n- Recommended over non-paginated endpoint for datasets over 1000 customers\n\n**Related Endpoints:**\n- `GET /customer/customers` - Non-paginated version for smaller datasets\n- `POST /customer` - Create or update customer information\n- `POST /customerLookup` - Find specific customers by search criteria\n\n**Important Notes:**\n- Use this endpoint instead of /customers for better performance with large datasets\n- Results filtered to authenticated user's location for data security\n- Pagination state management required in client applications\n- Suitable for batch processing and large-scale data operations",
278 "operationId": "CustomerCustomers-paginatedGet",
279 "parameters": [
280 {
281 "name": "fromLastModifiedDateUTC",
282 "in": "query",
283 "description": "Optional date filter to return customers modified after this timestamp",
284 "schema": {
285 "type": "string",
286 "format": "date-time"
287 }
288 },
289 {
290 "name": "toLastModifiedDateUTC",
291 "in": "query",
292 "description": "Optional date filter to return customers modified before this timestamp",
293 "schema": {
294 "type": "string",
295 "format": "date-time"
296 }
297 },
298 {
299 "name": "PageNumber",
300 "in": "query",
301 "description": "Page number for sequential pagination (integer, starts at 0) - Default: 0",
302 "schema": {
303 "type": "integer",
304 "format": "int32",
305 "default": 0
306 }
307 },
308 {
309 "name": "PageSize",
310 "in": "query",
311 "description": "Number of items per page (integer) - Default: 1000, Maximum: 10000",
312 "schema": {
313 "type": "integer",
314 "format": "int32",
315 "default": 1000
316 }
317 },
318 {
319 "name": "includeAnonymous",
320 "in": "query",
321 "description": "Include/exclude anonymous customers in results - Default: true",
322 "schema": {
323 "type": "boolean",
324 "default": true
325 }
326 }
327 ],
328 "responses": {
329 "200": {
330 "description": "Success",
331 "content": {
332 "application/json": {
333 "schema": {
334 "type": "array",
335 "items": {
336 "$ref": "#/components/schemas/Customer"
337 }
338 }
339 }
340 }
341 },
342 "400": {
343 "description": "Bad Request - PageSize exceeds maximum limit of 10,000",
344 "content": {
345 "application/json": {
346 "schema": {
347 "$ref": "#/components/schemas/BadRequestResponse"
348 }
349 }
350 }
351 },
352 "401": {
353 "description": "Invalid API Key"
354 },
355 "403": {
356 "description": "Account not authorized"
357 },
358 "500": {
359 "description": "Something went wrong."
360 }
361 }
362 }
363 },
364 "/customer/customer-types": {
365 "get": {
366 "tags": ["Customer"],
367 "summary": "Get Customer Types",
368 "description": "**Purpose:** Retrieve the complete list of customer types available for the authenticated location, used for customer categorization and compliance.\n\n**Request Requirements:**\n- Valid API key authentication required (no specific role restrictions)\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of `CustomerType` objects with customer type information\n- Response format: `[{ CustomerType }, ...]`\n- Array typically contains 2-10 customer types per location\n- Returns empty array `[]` if no customer types enabled for location (rare)\n- Each customer type includes: Id, Name, IsRetail, IsMedical flags\n- Display names include \"Adult Use\", \"Medical\", \"Wholesale\", etc.\n- Results automatically filtered to authenticated location's enabled types\n\n**Customer Type Fields:**\n- Id: Unique identifier for the customer type\n- Name: Display name of the customer type\n- IsRetail: Boolean indicating if this type is for retail customers\n- IsMedical: Boolean indicating if this type is for medical patients\n\n**Common Use Cases:**\n- Populate dropdown/selection lists for customer type in registration forms\n- Ensure customers are assigned to valid, location-specific types for compliance validation\n- Configure point-of-sale systems with available customer categories\n- Configure online ordering systems with proper customer types for e-commerce setup\n- Understand customer type structure for reporting classification and analytics\n- Validate customer type IDs before creating/updating customers\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Customer types rarely change; safe to cache for several hours\n- Small dataset suitable for client-side caching\n- Location-specific results based on API key access\n\n**Integration Workflow:**\n1. Call this endpoint to get available customer types for your location\n2. Present options to users in registration/update forms\n3. Use selected Id in POST /customer requests as CustomerTypeId\n4. Implement validation to ensure selected type is valid for your location\n\n**Related Endpoints:**\n- `POST /customer` - Create customers using these customer type IDs\n- `GET /customer/customers` - Get customers with their assigned types\n- `GET /customer/referral-sources` - Get referral source reference data\n\n**Important Notes:**\n- Customer types are location-specific and may vary between dispensary locations\n- Only returns customer types enabled for your specific location\n- Results automatically filtered based on your API key's location access\n- Use Name field for user-facing displays, Id for API calls\n- Use IsRetail/IsMedical flags for business rule implementation and compliance logic",
369 "operationId": "CustomerCustomer-typesGet",
370 "responses": {
371 "200": {
372 "description": "Success",
373 "content": {
374 "application/json": {
375 "schema": {
376 "type": "array",
377 "items": {
378 "$ref": "#/components/schemas/CustomerType"
379 }
380 }
381 }
382 }
383 },
384 "401": {
385 "description": "Invalid API Key"
386 },
387 "403": {
388 "description": "Account not authorized"
389 },
390 "500": {
391 "description": "Something went wrong."
392 }
393 }
394 }
395 },
396 "/customer/referral-sources": {
397 "get": {
398 "tags": ["Customer"],
399 "summary": "Get Referral Sources",
400 "description": "**Purpose:** Retrieve the complete list of referral sources available system-wide, used for tracking customer acquisition and marketing campaign effectiveness.\n\n**Request Requirements:**\n- \"Customer\" role authorization required for customer data operations\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of string values representing available referral source options\n- Response format: `[\"string\", \"string\", ...]`\n- Array typically contains 10-20 predefined referral sources\n- Returns empty array `[]` if no referral sources configured (rare)\n- Examples include: \"Google\", \"Facebook\", \"Word of Mouth\", \"Print Ad\", \"Radio\", \"TV\", \"Yelp\", \"Instagram\"\n- Standardized list ensures consistent marketing attribution across all locations\n- System-wide reference data for marketing tracking\n\n**Common Use Cases:**\n- Populate \"How did you hear about us?\" dropdown fields in customer registration\n- Track which channels are driving customer acquisition for marketing attribution\n- Measure effectiveness of different marketing strategies for campaign analysis\n- Ensure valid referral source selection in customer profiles for form validation\n- Feed data into marketing analytics and reporting systems for analytics integration\n- Connect customer acquisition costs to specific marketing channels for ROI tracking\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Referral sources change infrequently; safe to cache for extended periods\n- Small static dataset suitable for client-side caching\n- Consistent across all organizations and locations\n\n**Integration Workflow:**\n1. Call this endpoint to get available referral source options\n2. Present options in customer registration or profile update forms\n3. Include selected value when creating/updating customers (if supported)\n4. Use for reporting to analyze customer acquisition patterns\n\n**Marketing Benefits:**\n- Attribution tracking to understand which marketing channels are most effective\n- Budget allocation optimization based on referral source performance\n- Campaign ROI measurement for different marketing campaigns\n- Customer insights to learn how customers discover your dispensary\n\n**Related Endpoints:**\n- `POST /customer` - Create customers with referral source information\n- `GET /customer/customer-types` - Get customer type reference data\n- `GET /customer/customers` - Get customers with their referral source data\n\n**Important Notes:**\n- Returns system-wide referral sources for consistent reporting across all locations\n- Consider adding \"Other\" or \"Prefer not to say\" options in your UI implementation\n- Use these values to populate selection lists in customer forms\n- Validate referral source values against this list before submitting customer data\n- Essential for marketing analytics and customer acquisition tracking",
401 "operationId": "CustomerReferral-sourcesGet",
402 "responses": {
403 "200": {
404 "description": "Success",
405 "content": {
406 "application/json": {
407 "schema": {
408 "type": "array",
409 "items": {
410 "type": "string"
411 }
412 }
413 }
414 }
415 },
416 "401": {
417 "description": "Invalid API Key"
418 },
419 "403": {
420 "description": "Account not authorized"
421 },
422 "500": {
423 "description": "Something went wrong."
424 }
425 }
426 }
427 },
428 "/customer/customer": {
429 "post": {
430 "tags": ["Customer"],
431 "summary": "Create or Update Customer",
432 "description": "**Purpose:** Create new customer profiles or update existing customer information for dispensary operations and e-commerce integration.\n\n**Request Requirements:**\n- \"Customer\" role authorization required for customer data operations\n- `EcomCustomerEdit` object in request body with customer details\n- Content-Type: application/json\n- Optional query parameter to bypass deduplication\n- **Idempotency Support**: Requires `ConsumerKey` header and `IdempotencyKey` field for duplicate prevention (see [Idempotency Documentation](/pages/idempotency.html))\n\n**Response Data:**\n- Returns single `Customer` object (not array) with assigned system ID\n- Response format: `{ Customer }`\n- Includes loyalty program enrollment and qualification status\n- Provides both internal and external system identifiers\n- Contains full customer profile with contact and address information\n\n**Create vs Update Behavior:**\n- **CREATE**: When `CustomerId` is null, 0, or omitted, a new customer record will be created\n- **UPDATE**: When `CustomerId` is provided with a valid customer ID, the existing customer will be updated\n- **Validation**: FirstName, Address1, City, State, PostalCode, Status, and CustomerType are required\n- **Deduplication**: Create operations include smart duplicate detection unless bypassed with query parameter\n\n**Request Body Format:**\n- For new customers: Leave `CustomerId` null or 0 (will be auto-generated)\n- For updates: Include the `CustomerId` in the request\n- FirstName is required (Name will be used as FirstName if FirstName is empty)\n- Address1, City, State, PostalCode are required for address information\n- Status and CustomerType are required for customer classification\n\n**Optional Fields:**\n- DateOfBirth (must be between 1800-01-01 and current date)\n- LastName, MiddleName, NameSuffix, NamePrefix for name information\n- Address2 for additional address details\n- Phone, EmailAddress for contact information\n- EcomUserId for external e-commerce system identifier\n- UniqueId for external system integration\n\n**Sparse Update Behavior:**\n- **Provided fields**: Will overwrite existing values with provided data\n- **Omitted fields**: Will preserve existing values (no data loss for updates)\n- **Special handling**: Name field will be used as FirstName if FirstName is omitted during updates\n- **Validation**: Required fields for updates are more relaxed than for new customer creation\n\n**Smart Deduplication System:**\n- Default behavior automatically searches for existing customers with matching details\n- Helps prevent creating multiple records for the same person\n- Use `bypassDeduplication=true` to force creation of new customer record\n\n**Common Use Cases:**\n- Sync customer profiles from online ordering platforms for e-commerce integration\n- Create new customer accounts during in-store visits and walk-in registration\n- Update existing customer contact and address information\n- Add customers to dispensary loyalty and rewards programs\n- Maintain customer records for regulatory compliance requirements\n- Synchronize customer data with external customer relationship management systems\n\n**Performance & Limits:**\n- Rate limited to 1500 requests per minute (higher limit for high-volume customer operations)\n- Single customer operation for targeted updates\n- Immediate validation and duplicate detection\n- Changes are reflected immediately in customer listings\n- Smart matching algorithms optimize deduplication performance\n\n**Related Endpoints:**\n- `POST /customerLookup` - Find existing customers by various search criteria\n- `POST /search` - Search customers by name, phone, or email for quick lookup\n- `GET /by-external-id` - Retrieve customers using external system identifiers\n- `GET /customers` - List all customers with optional filtering\n\n**Important Notes:**\n- Date of birth must be realistic (between 1800 and current date) for age verification\n- Smart matching helps prevent multiple records for the same person\n- Some fields may be required based on location-specific compliance regulations\n- System validates contact information format and completeness for data quality",
433 "operationId": "CustomerCustomerPost",
434 "parameters": [
435 {
436 "name": "bypassDeduplication",
437 "in": "query",
438 "description": "Skip duplicate detection and force creation of new customer record - Default: false",
439 "schema": {
440 "type": "boolean",
441 "default": false
442 }
443 },
444 {
445 "name": "ConsumerKey",
446 "in": "header",
447 "description": "Optional GUID for idempotency checks. When provided with IdempotencyKey in request body, prevents duplicate customer creation",
448 "schema": {
449 "type": "string"
450 }
451 }
452 ],
453 "requestBody": {
454 "description": "Customer information to create or update - EcomCustomerEdit object with customer details",
455 "content": {
456 "application/json-patch+json": {
457 "schema": {
458 "$ref": "#/components/schemas/EcomCustomerEdit"
459 }
460 },
461 "application/json": {
462 "schema": {
463 "$ref": "#/components/schemas/EcomCustomerEdit"
464 }
465 },
466 "text/json": {
467 "schema": {
468 "$ref": "#/components/schemas/EcomCustomerEdit"
469 }
470 },
471 "application/*+json": {
472 "schema": {
473 "$ref": "#/components/schemas/EcomCustomerEdit"
474 }
475 }
476 },
477 "x-bodyName": "customer"
478 },
479 "responses": {
480 "200": {
481 "description": "Success - Returns complete Customer object with assigned ID and loyalty status",
482 "content": {
483 "application/json": {
484 "schema": {
485 "$ref": "#/components/schemas/Customer"
486 }
487 }
488 }
489 },
490 "400": {
491 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
492 "content": {
493 "application/json": {
494 "schema": {
495 "$ref": "#/components/schemas/BadRequestResponse"
496 }
497 }
498 }
499 },
500 "401": {
501 "description": "Unauthorized - Invalid or missing API key"
502 },
503 "403": {
504 "description": "Forbidden - Account not authorized for customer management"
505 },
506 "404": {
507 "description": "Not Found - Customer ID provided for update but customer does not exist",
508 "content": {
509 "application/json": {
510 "schema": {
511 "type": "string"
512 }
513 }
514 }
515 },
516 "500": {
517 "description": "Internal Server Error - Server error occurred during customer processing"
518 }
519 }
520 }
521 },
522 "/customer/customerLookup": {
523 "post": {
524 "tags": ["Customer"],
525 "operationId": "CustomerCustomerLookupPost",
526 "requestBody": {
527 "content": {
528 "application/json-patch+json": {
529 "schema": {
530 "$ref": "#/components/schemas/EcomCustomerEdit"
531 }
532 },
533 "application/json": {
534 "schema": {
535 "$ref": "#/components/schemas/EcomCustomerEdit"
536 }
537 },
538 "text/json": {
539 "schema": {
540 "$ref": "#/components/schemas/EcomCustomerEdit"
541 }
542 },
543 "application/*+json": {
544 "schema": {
545 "$ref": "#/components/schemas/EcomCustomerEdit"
546 }
547 }
548 },
549 "x-bodyName": "customer"
550 },
551 "responses": {
552 "200": {
553 "description": "OK",
554 "content": {
555 "application/json": {
556 "schema": {
557 "$ref": "#/components/schemas/Customer"
558 }
559 }
560 }
561 },
562 "400": {
563 "description": "Bad Request",
564 "content": {
565 "application/json": {
566 "schema": {
567 "$ref": "#/components/schemas/BadRequestResponse"
568 }
569 }
570 }
571 },
572 "401": {
573 "description": "Unauthorized"
574 },
575 "403": {
576 "description": "Forbidden"
577 },
578 "404": {
579 "description": "Not Found",
580 "content": {
581 "application/json": {
582 "schema": {
583 "type": "string"
584 }
585 }
586 }
587 },
588 "500": {
589 "description": "Internal Server Error"
590 }
591 }
592 }
593 },
594 "/customer/search": {
595 "post": {
596 "tags": ["Customer"],
597 "summary": "Customer Search (PREVIEW)",
598 "description": "**NOTE - THIS ENDPOINT IS CURRENTLY IN PREVIEW - IT MAY UNDERGO BREAKING CHANGES IN UPCOMING RELEASES**\n\n\n**Purpose:** Search for customers using multiple criteria with flexible matching to support customer identification and lookup workflows.\n\n**Request Requirements:**\n- \"Customer\" role authorization required for customer data operations\n- `CustomerSearchRequest` object in request body with search criteria\n- Content-Type: application/json\n- At least one search criterion must be provided\n- Rate limited to 360 requests per minute\n\n**Response Data:**\n- Returns array of `CustomerSearchResult` objects with matching customer information\n- Response format: `[{ CustomerSearchResult }, ...]`\n- Array may contain 0 to 100+ customers depending on search criteria specificity\n- Returns empty array `[]` if no customers match search criteria (not null)\n- Same customer may appear multiple times with different match types\n- Includes match type information to identify which criteria matched\n- Results automatically filtered to authenticated location\n\n**Search Criteria (Independent Matching):**\n- **MMJ ID**: Medical marijuana patient identification number\n- **Drivers License ID**: State-issued driver's license number\n- **Email Address**: Customer's email address (exact match)\n- **Phone Number**: Customer's phone number (normalized matching)\n- **LastName + DateOfBirth**: Combined name and birth date search (both required together)\n\n**Search Behavior:**\n- **Independent Fields**: Most fields are searched independently\n- **Combined Fields**: LastName and DateOfBirth must be used together\n- **Multiple Matches**: Same customer may appear with different match types\n- **Location Scoped**: Results filtered to authenticated location only\n- **Case Sensitivity**: Email and name searches are case-insensitive\n\n**Common Use Cases:**\n- Find customers during check-in process for identification verification\n- Locate existing customer records before creating new accounts\n- Search for customers using partial or alternative identification methods\n- Verify customer identity using multiple data points\n- Support customer service lookup workflows\n\n**Performance & Limits:**\n- Rate limited to 360 requests per minute for system protection\n- Optimized for common customer lookup patterns\n- Results limited to reasonable set size for performance\n- Indexed searches for fast response times\n\n**Related Endpoints:**\n- `POST /customer/customerLookup` - Single customer lookup with hierarchy\n- `GET /customer/customers` - List all customers with filtering\n- `POST /customer/customer` - Create or update customer records\n\n**Important Notes:**\n- **PREVIEW STATUS**: This endpoint may undergo breaking changes in future releases\n- **Multiple Results**: Same customer can appear multiple times with different match types\n- **Location Filtering**: Results are automatically scoped to your authenticated location\n- **Rate Limiting**: 360 requests per minute limit applies for system stability\n- **Validation**: At least one search criterion must be provided in the request",
599 "operationId": "CustomerSearchPost",
600 "requestBody": {
601 "description": "Customer search request with search criteria - CustomerSearchRequest object",
602 "content": {
603 "application/json-patch+json": {
604 "schema": {
605 "$ref": "#/components/schemas/CustomerSearchRequest"
606 }
607 },
608 "application/json": {
609 "schema": {
610 "$ref": "#/components/schemas/CustomerSearchRequest"
611 }
612 },
613 "text/json": {
614 "schema": {
615 "$ref": "#/components/schemas/CustomerSearchRequest"
616 }
617 },
618 "application/*+json": {
619 "schema": {
620 "$ref": "#/components/schemas/CustomerSearchRequest"
621 }
622 }
623 },
624 "x-bodyName": "req"
625 },
626 "responses": {
627 "200": {
628 "description": "Success",
629 "content": {
630 "application/json": {
631 "schema": {
632 "type": "array",
633 "items": {
634 "$ref": "#/components/schemas/CustomerSearchResult"
635 }
636 }
637 }
638 }
639 },
640 "400": {
641 "description": "Bad Request - Validation errors or no search criteria provided",
642 "content": {
643 "application/json": {
644 "schema": {
645 "$ref": "#/components/schemas/BadRequestResponse"
646 }
647 }
648 }
649 },
650 "401": {
651 "description": "Invalid API Key"
652 },
653 "403": {
654 "description": "Account not authorized"
655 },
656 "500": {
657 "description": "Something went wrong."
658 }
659 }
660 }
661 },
662 "/customer/by-external-id": {
663 "get": {
664 "tags": ["Customer"],
665 "operationId": "CustomerBy-external-idGet",
666 "parameters": [
667 {
668 "name": "externalId",
669 "in": "query",
670 "schema": {
671 "type": "string"
672 }
673 }
674 ],
675 "responses": {
676 "200": {
677 "description": "OK",
678 "content": {
679 "application/json": {
680 "schema": {
681 "type": "array",
682 "items": {
683 "$ref": "#/components/schemas/CustomerSearchResult"
684 }
685 }
686 }
687 }
688 },
689 "400": {
690 "description": "Bad Request",
691 "content": {
692 "application/json": {
693 "schema": {
694 "$ref": "#/components/schemas/BadRequestResponse"
695 }
696 }
697 }
698 },
699 "401": {
700 "description": "Unauthorized"
701 },
702 "403": {
703 "description": "Forbidden"
704 },
705 "404": {
706 "description": "Not Found"
707 },
708 "500": {
709 "description": "Internal Server Error"
710 }
711 }
712 }
713 },
714 "/customer-journal": {
715 "get": {
716 "tags": ["CustomerJournal"],
717 "summary": "Get Customer Journal Entries",
718 "description": "**Purpose:** Retrieves all journal entries (notes/comments) associated with a specific customer for customer service and account management.\n\n**Request Requirements:**\n- \"Customer\" role authorization required for customer data operations\n- Customer ID query parameter required\n- No request body needed\n\n**Response Data:**\n- Returns array of journal entry objects: `[{ JournalEntry }, ...]`\n- Array may contain 0 to 100+ entries depending on customer interaction history\n- Returns empty array `[]` if no journal entries exist for customer (not null)\n- Includes entry ID, subject, body, and date\n- Results filtered by customer accessibility to authenticated location\n\n**Common Use Cases:**\n- View interaction history and notes about a customer for customer service\n- Review previous communications and issues for account management\n- Maintain audit trail of customer interactions for compliance\n- Track resolution history and follow-ups for support tickets\n\n**Performance & Limits:**\n- Efficient retrieval for individual customer journal histories\n- Results scoped to specific customer and location\n- No pagination needed for typical journal entry volumes\n\n**Related Endpoints:**\n- `POST /customer-journal/create` - Create new journal entries\n- `POST /customer-journal/update` - Update existing journal entries\n\n**Important Notes:**\n- Customer ID must exist and be accessible to your location\n- Requires customer validation before retrieving entries\n- Entries are returned in database order (not explicitly sorted)",
719 "operationId": "Customer-journalGet",
720 "parameters": [
721 {
722 "name": "customerId",
723 "in": "query",
724 "description": "Internal customer ID to retrieve journal entries for - Must exist and be accessible to your location",
725 "schema": {
726 "type": "integer",
727 "format": "int32"
728 }
729 }
730 ],
731 "responses": {
732 "200": {
733 "description": "Success - Returns array of journal entry objects: `[{ JournalEntry }, ...]`",
734 "content": {
735 "application/json": {
736 "schema": {
737 "type": "array",
738 "items": {
739 "$ref": "#/components/schemas/JournalEntry"
740 }
741 }
742 }
743 }
744 },
745 "400": {
746 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
747 "content": {
748 "application/json": {
749 "schema": {
750 "$ref": "#/components/schemas/BadRequestResponse"
751 }
752 }
753 }
754 },
755 "401": {
756 "description": "Unauthorized - Invalid or missing API key"
757 },
758 "403": {
759 "description": "Forbidden - Account not authorized for customer access"
760 },
761 "500": {
762 "description": "Internal Server Error - Server error occurred"
763 }
764 }
765 }
766 },
767 "/customer-journal/update": {
768 "post": {
769 "tags": ["CustomerJournal"],
770 "summary": "Update Customer Journal Entry",
771 "description": "**Purpose:** Updates an existing journal entry's date, subject, and/or body content for customer service record management.\n\n**Request Requirements:**\n- \"Customer\" role authorization required for customer data operations\n- `UpdateJournalEntryRequest` object in request body\n- Content-Type: application/json\n- Journal entry must exist and be accessible to your location\n\n**Response Data:**\n- Returns journal entry object: `{ JournalEntry }`\n- Includes entry ID, updated subject, body, and date\n- Confirms successful update with complete entry details\n\n**Request Body Fields:**\n- JournalEntryId: The ID of the journal entry to update (required)\n- Subject: New title or summary for the entry (required)\n- Body: New detailed content for the entry (required)\n- Date: New date for the entry (required)\n\n**Update Behavior:**\n- **All fields required**: JournalEntryId, Subject, Body, and Date must all be provided\n- **Complete replacement**: All entry fields will be updated with provided values\n- **Validation**: Entry must exist and be accessible to your location\n\n**Common Use Cases:**\n- Fix typos or errors in previously created entries for correction\n- Add more details to existing notes for additional information\n- Update resolution status or follow-up information for status updates\n- Modify entries to meet regulatory requirements for compliance updates\n\n**Performance & Limits:**\n- Single entry update operation for targeted modifications\n- Immediate validation and response\n- Changes reflected immediately in journal entry lists\n\n**Related Endpoints:**\n- `GET /customer-journal` - Retrieve journal entries for a customer\n- `POST /customer-journal/create` - Create new journal entries\n\n**Important Notes:**\n- Journal entry must exist and be accessible to your location\n- Validation performed before update to ensure data integrity\n- All request fields are required for successful update",
772 "operationId": "Customer-journalUpdatePost",
773 "requestBody": {
774 "description": "Journal entry update request with required fields to update - UpdateJournalEntryRequest object",
775 "content": {
776 "application/json-patch+json": {
777 "schema": {
778 "$ref": "#/components/schemas/UpdateJournalEntryRequest"
779 }
780 },
781 "application/json": {
782 "schema": {
783 "$ref": "#/components/schemas/UpdateJournalEntryRequest"
784 }
785 },
786 "text/json": {
787 "schema": {
788 "$ref": "#/components/schemas/UpdateJournalEntryRequest"
789 }
790 },
791 "application/*+json": {
792 "schema": {
793 "$ref": "#/components/schemas/UpdateJournalEntryRequest"
794 }
795 }
796 },
797 "x-bodyName": "req"
798 },
799 "responses": {
800 "200": {
801 "description": "Success - Returns journal entry object: `{ JournalEntry }`",
802 "content": {
803 "application/json": {
804 "schema": {
805 "$ref": "#/components/schemas/JournalEntry"
806 }
807 }
808 }
809 },
810 "400": {
811 "description": "Bad Request - Validation errors or invalid journal entry ID",
812 "content": {
813 "application/json": {
814 "schema": {
815 "$ref": "#/components/schemas/BadRequestResponse"
816 }
817 }
818 }
819 },
820 "401": {
821 "description": "Unauthorized - Invalid or missing API key"
822 },
823 "403": {
824 "description": "Forbidden - Account not authorized for customer access"
825 },
826 "500": {
827 "description": "Internal Server Error - Server error occurred"
828 }
829 }
830 }
831 },
832 "/customer-journal/create": {
833 "post": {
834 "tags": ["CustomerJournal"],
835 "summary": "Create Customer Journal Entry",
836 "description": "**Purpose:** Creates a new journal entry (note/comment) for a specific customer to maintain interaction records and customer service history.\n\n**Request Requirements:**\n- \"Customer\" role authorization required for customer data operations\n- `CreateJournalEntryRequest` object in request body\n- Content-Type: application/json\n- Customer must exist and be accessible to your location\n\n**Response Data:**\n- Returns journal entry object: `{ JournalEntry }`\n- Includes assigned entry ID, subject, body, and date\n- Confirms successful creation with complete entry details\n\n**Request Body Fields:**\n- CustomerId: The customer to create the journal entry for (required)\n- Subject: Brief title or summary of the entry (required)\n- Body: Detailed content of the journal entry (required)\n- Date: When this entry should be dated (required)\n\n**Common Use Cases:**\n- Record interaction details and resolutions for customer service notes\n- Document changes to customer information for account updates\n- Log problems and their resolution status for issue tracking\n- Maintain required interaction records for compliance documentation\n- Schedule future contact or actions for follow-up reminders\n\n**Performance & Limits:**\n- Single entry creation operation for immediate record keeping\n- Immediate validation and creation\n- New entries appear immediately in journal entry lists\n\n**Related Endpoints:**\n- `GET /customer-journal` - Retrieve journal entries for a customer\n- `POST /customer-journal/update` - Update existing journal entries\n\n**Important Notes:**\n- Customer must exist and be accessible to your location\n- Validation performed before creation to ensure data integrity\n- All request fields are required for successful creation",
837 "operationId": "Customer-journalCreatePost",
838 "requestBody": {
839 "description": "Journal entry creation request with customer ID and entry details - CreateJournalEntryRequest object",
840 "content": {
841 "application/json-patch+json": {
842 "schema": {
843 "$ref": "#/components/schemas/CreateJournalEntryRequest"
844 }
845 },
846 "application/json": {
847 "schema": {
848 "$ref": "#/components/schemas/CreateJournalEntryRequest"
849 }
850 },
851 "text/json": {
852 "schema": {
853 "$ref": "#/components/schemas/CreateJournalEntryRequest"
854 }
855 },
856 "application/*+json": {
857 "schema": {
858 "$ref": "#/components/schemas/CreateJournalEntryRequest"
859 }
860 }
861 },
862 "x-bodyName": "req"
863 },
864 "responses": {
865 "200": {
866 "description": "Success - Returns journal entry object: `{ JournalEntry }`",
867 "content": {
868 "application/json": {
869 "schema": {
870 "$ref": "#/components/schemas/JournalEntry"
871 }
872 }
873 }
874 },
875 "400": {
876 "description": "Bad Request - Validation errors or invalid customer ID",
877 "content": {
878 "application/json": {
879 "schema": {
880 "$ref": "#/components/schemas/BadRequestResponse"
881 }
882 }
883 }
884 },
885 "401": {
886 "description": "Unauthorized - Invalid or missing API key"
887 },
888 "403": {
889 "description": "Forbidden - Account not authorized for customer access"
890 },
891 "500": {
892 "description": "Internal Server Error - Server error occurred"
893 }
894 }
895 }
896 },
897 "/Deliveries": {
898 "get": {
899 "tags": ["Deliveries"],
900 "summary": "Get Deliveries",
901 "description": "**Purpose:** Retrieve delivery status information and order details for cannabis delivery operations and tracking.\n\n**Request Requirements:**\n- \"Deliveries\" role authorization required for delivery data access\n- Optional query parameters for filtering and data inclusion\n- Rate limited to 100 requests per minute\n- No request body needed\n\n**Response Data:**\n- Returns array of delivery objects: `[{ DeliveryOrderStatus }, ...]`\n- Array may contain 0 to 100+ deliveries depending on filtering criteria\n- Returns empty array `[]` if no deliveries match criteria (not null)\n- Delivery status, timing, and location information included\n- Optional line item details when includeLineItems=true\n- Results automatically filtered to authenticated location\n\n**Query Parameters:**\n- PreOrderId: Get delivery status for a specific pre-order (optional)\n- TransactionId: Get delivery status for a specific transaction (optional)\n- transactionIds: Get delivery status for multiple transactions (optional array)\n- deliveryStatus: Filter by delivery status (optional)\n- includeLineItems: Include detailed line item data (default: false)\n\n**Parameter Rules:**\n- **Mutually Exclusive**: Use only ONE of PreOrderId, TransactionId, transactionIds, or deliveryStatus\n- **Default Behavior**: If no parameters provided, returns all open deliveries from last 14 days\n- **Open Definition**: Status of 'filled' or 'received' within the last 14 days\n- **Line Items**: Only available for packages assigned to orders, not unassigned pre-order items\n\n**Delivery Status Values:**\n- **Placed**: Order has been placed but not yet processed\n- **Filled**: Order has been fulfilled and packaged for delivery\n- **Received**: Order has been received by delivery team\n- **In Transit**: Order is currently being delivered\n- **Delivered**: Order has been successfully delivered to customer\n- **Cancelled**: Order has been cancelled\n\n**Common Use Cases:**\n- Monitor delivery status for customer service and tracking\n- Generate delivery reports for operational management\n- Track order fulfillment and delivery performance\n- Provide delivery updates to customers and delivery teams\n- Integrate with third-party delivery tracking systems\n\n**Performance & Limits:**\n- Rate limited to 100 requests per minute for system protection\n- Optimized for delivery tracking and status monitoring\n- Line item data loading is conditional for performance\n- Results filtered to location scope for operational relevance\n\n**Related Endpoints:**\n- `POST /deliveries/set-route-detail` - Update delivery route and driver information\n- `GET /drivers` - Get available drivers for delivery assignments\n- `GET /preorder` - Get pre-order information that may become deliveries\n\n**Important Notes:**\n- **Exclusive Parameters**: Only use one filtering parameter at a time\n- **Line Item Limitation**: Line items only shown for assigned packages, not pre-order items\n- **Time Window**: Default query covers last 14 days of open deliveries\n- **Rate Limiting**: 100 requests per minute limit for delivery tracking operations\n- **Status Tracking**: Provides real-time delivery status for customer and operational visibility",
902 "operationId": "DeliveriesGet",
903 "parameters": [
904 {
905 "name": "PreOrderId",
906 "in": "query",
907 "description": "Pre-order ID to get delivery status for - Optional, mutually exclusive with other filters",
908 "schema": {
909 "type": "integer",
910 "format": "int32"
911 }
912 },
913 {
914 "name": "TransactionId",
915 "in": "query",
916 "description": "Transaction ID to get delivery status for - Optional, mutually exclusive with other filters",
917 "schema": {
918 "type": "integer",
919 "format": "int32"
920 }
921 },
922 {
923 "name": "transactionIds",
924 "in": "query",
925 "description": "Array of transaction IDs to get delivery status for - Optional, mutually exclusive with other filters",
926 "schema": {
927 "type": "array",
928 "items": {
929 "type": "integer",
930 "format": "int32"
931 }
932 }
933 },
934 {
935 "name": "includeLineItems",
936 "in": "query",
937 "description": "Include detailed line item data in response - Default: false",
938 "schema": {
939 "type": "boolean",
940 "default": false
941 }
942 },
943 {
944 "name": "deliveryStatus",
945 "in": "query",
946 "description": "Filter deliveries by status - Optional, mutually exclusive with other filters",
947 "schema": {
948 "type": "string",
949 "default": ""
950 }
951 }
952 ],
953 "responses": {
954 "200": {
955 "description": "Success - Returns array of delivery objects: `[{ DeliveryOrderStatus }, ...]`",
956 "content": {
957 "application/json": {
958 "schema": {
959 "type": "array",
960 "items": {
961 "$ref": "#/components/schemas/DeliveryOrderStatus"
962 }
963 }
964 }
965 }
966 },
967 "400": {
968 "description": "Bad Request - `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array",
969 "content": {
970 "application/json": {
971 "schema": {
972 "$ref": "#/components/schemas/ValidationResult"
973 }
974 }
975 }
976 },
977 "401": {
978 "description": "Unauthorized - Invalid or missing API key"
979 },
980 "403": {
981 "description": "Forbidden - Account not authorized for delivery access"
982 },
983 "500": {
984 "description": "Internal Server Error - Server error occurred"
985 }
986 }
987 }
988 },
989 "/Deliveries/set-route-detail": {
990 "post": {
991 "tags": ["Deliveries"],
992 "summary": "Set Delivery Route Detail",
993 "description": "**Purpose:** Update delivery route information including vehicle, driver assignments, route details, and delivery status for operational management.\n\n**Request Requirements:**\n- \"Deliveries\" role authorization required for delivery operations\n- `UpdateDeliveryRouteDetailRequest` object in request body with route details\n- Content-Type: application/json\n- Rate limited to 100 requests per minute\n- Valid delivery ID must exist and be accessible to your location\n\n**Response Data:**\n- Returns success confirmation (HTTP 200) upon successful update\n- No response body content (void return)\n- Route details are validated and stored for delivery operations\n\n\n**Request Body Fields:**\n- TransactionId: The delivery transaction to update (required)\n- DriverId: Primary driver assignment for the delivery (optional)\n- DriverId2: Secondary driver assignment for the delivery (optional)\n- VehicleId: Vehicle assigned to the delivery (optional)\n- Route: Route information or notes (optional)\n- Status: Delivery status update (optional)\n\n**Route Detail Updates:**\n- **Vehicle Assignment**: Set vehicle ID for the delivery\n- **Driver Assignment**: Assign primary and optional secondary drivers\n- **Route Information**: Update route notes or details\n- **Status Updates**: Modify delivery status\n\n**Common Use Cases:**\n- Assign delivery vehicles and drivers to pending orders\n- Update delivery routes for optimal efficiency and timing\n- Modify delivery status as orders progress through fulfillment\n- Reassign deliveries to different drivers or vehicles\n- Update delivery information for customer tracking and notifications\n\n**Performance & Limits:**\n- Rate limited to 100 requests per minute for system protection\n- Single delivery operation for targeted route updates\n- Immediate validation and storage of route information\n- Changes propagate to delivery tracking systems immediately\n\n**Related Endpoints:**\n- `GET /deliveries` - Retrieve current delivery status and information\n- `GET /drivers` - Get available drivers for delivery assignments\n- `GET /preorder` - Access pre-order information for delivery preparation\n\n**Important Notes:**\n- **Driver and Vehicle IDs**: Must reference valid drivers and vehicles in the system\n- **Validation**: Request fields are validated before processing updates\n- **Status Tracking**: Updates enable delivery tracking for operations\n- **Rate Limiting**: 100 requests per minute limit for delivery management operations",
994 "operationId": "DeliveriesSet-route-detailPost",
995 "requestBody": {
996 "description": "Delivery route detail update request with transaction ID and delivery information - UpdateDeliveryRouteDetailRequest object",
997 "content": {
998 "application/json-patch+json": {
999 "schema": {
1000 "$ref": "#/components/schemas/UpdateDeliveryRouteDetailRequest"
1001 }
1002 },
1003 "application/json": {
1004 "schema": {
1005 "$ref": "#/components/schemas/UpdateDeliveryRouteDetailRequest"
1006 }
1007 },
1008 "text/json": {
1009 "schema": {
1010 "$ref": "#/components/schemas/UpdateDeliveryRouteDetailRequest"
1011 }
1012 },
1013 "application/*+json": {
1014 "schema": {
1015 "$ref": "#/components/schemas/UpdateDeliveryRouteDetailRequest"
1016 }
1017 }
1018 },
1019 "x-bodyName": "req"
1020 },
1021 "responses": {
1022 "200": {
1023 "description": "Success - Route details successfully updated"
1024 },
1025 "400": {
1026 "description": "Bad Request - `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array",
1027 "content": {
1028 "application/json": {
1029 "schema": {
1030 "$ref": "#/components/schemas/ValidationResult"
1031 }
1032 }
1033 }
1034 },
1035 "401": {
1036 "description": "Unauthorized - Invalid or missing API key"
1037 },
1038 "403": {
1039 "description": "Forbidden - Account not authorized for delivery access"
1040 },
1041 "500": {
1042 "description": "Internal Server Error - Server error occurred"
1043 }
1044 }
1045 }
1046 },
1047 "/discounts": {
1048 "get": {
1049 "tags": ["Discounts"],
1050 "summary": "Get Discounts (Legacy)",
1051 "description": "**Purpose:** Retrieves basic discount information using the legacy data structure with limited configuration details.\n\n**LEGACY WARNING:** This endpoint is deprecated. Migrate to `GET /discounts/v2/list` for complete functionality.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for discount data access\n- Optional query parameters for filtering\n- No request body needed\n\n**Response Data:**\n- Returns array of `PublishedDiscount` objects with basic discount information\n- Array typically contains 5-50 discounts per location depending on active promotions\n- Returns empty array `[]` if no discounts are active or configured\n- Validity dates are converted from Eastern Time to UTC in response\n- Automatically excludes \"Loyalty Multiplier\" discount types\n- Results are filtered by the authenticated location\n\n**Key Limitations vs V2:**\n- Basic response model with limited discount information\n- Missing detailed reward and constraint configuration\n- Does not support advanced discount capabilities\n- Simple inclusion/exclusion data structure only\n\n**Common Use Cases:**\n- Legacy system integrations that cannot be updated immediately\n- Basic discount display when minimal information is sufficient\n- Temporary implementations before V2 migration\n\n**Performance & Limits:**\n- Lightweight response for basic discount listing\n- Filtered results improve response time\n- Consider V2 endpoint for comprehensive discount data\n\n**Related Endpoints:**\n- `GET /discounts/v2/list` - Recommended enhanced endpoint with complete configuration\n\n**Important Notes:**\n- This endpoint is deprecated and may be removed in future versions\n- New integrations should use the V2 endpoint\n- Date conversion assumes Eastern Time input, converts to UTC output",
1052 "operationId": "DiscountsGet",
1053 "parameters": [
1054 {
1055 "name": "includeInactive",
1056 "in": "query",
1057 "description": "Include deleted or inactive discounts in results - Default: false",
1058 "schema": {
1059 "type": "boolean",
1060 "default": false
1061 }
1062 },
1063 {
1064 "name": "includeInclusionExclusionData",
1065 "in": "query",
1066 "description": "Include detailed product/category restriction data - Default: false",
1067 "schema": {
1068 "type": "boolean",
1069 "default": false
1070 }
1071 }
1072 ],
1073 "responses": {
1074 "200": {
1075 "description": "Success - Returns array of basic discount information",
1076 "content": {
1077 "text/plain": {
1078 "schema": {
1079 "type": "array",
1080 "items": {
1081 "$ref": "#/components/schemas/PublishedDiscount"
1082 }
1083 }
1084 },
1085 "application/json": {
1086 "schema": {
1087 "type": "array",
1088 "items": {
1089 "$ref": "#/components/schemas/PublishedDiscount"
1090 }
1091 }
1092 },
1093 "text/json": {
1094 "schema": {
1095 "type": "array",
1096 "items": {
1097 "$ref": "#/components/schemas/PublishedDiscount"
1098 }
1099 }
1100 }
1101 }
1102 },
1103 "401": {
1104 "description": "Unauthorized - Invalid or missing API key"
1105 },
1106 "500": {
1107 "description": "Internal Server Error - Server error occurred"
1108 }
1109 }
1110 }
1111 },
1112 "/discounts/v2/list": {
1113 "get": {
1114 "tags": ["Discounts"],
1115 "summary": "Get Discounts V2 (Recommended)",
1116 "description": "**Purpose:** Retrieves comprehensive discount information including detailed reward configuration, payment restrictions, and advanced bundling logic.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for discount data access\n- Optional query parameters for enhanced data inclusion\n- No request body needed\n\n**Response Data:**\n- Returns array of `DiscountApiResponse` objects with complete discount configuration\n- Array typically contains 5-50 discounts per location depending on active promotions\n- Returns empty array `[]` if no discounts are active or configured\n- Validity dates are converted from Eastern Time to UTC in response\n- Includes detailed reward structure and constraint details\n- Results are filtered by the authenticated location\n\n**Enhanced Features vs Legacy:**\n- Complete response model with detailed discount configuration\n- Full discount reward structure and constraint details\n- Payment method restrictions (credit card, cash, etc.)\n- Advanced bundle discount logic and stacking configuration\n- E-commerce menu display configuration and ranking\n- Optimized data retrieval and processing\n\n**Common Use Cases:**\n- New discount integrations requiring complete configuration data\n- E-commerce systems needing full discount logic implementation\n- Point-of-sale systems requiring comprehensive discount rules\n- Advanced analytics and discount performance analysis\n- Payment processing systems validating payment method restrictions\n\n**Performance & Limits:**\n- Single request retrieves all discount data efficiently\n- Optimized processing for large discount configurations\n- Consider parameter filtering to reduce response size when needed\n\n**Related Endpoints:**\n- `GET /discounts` - Legacy endpoint with basic discount information (deprecated)\n\n**Important Notes:**\n- This is the recommended endpoint for all new integrations\n- Includes latest discount capabilities and improvements\n- Date conversion assumes Eastern Time input, converts to UTC output",
1117 "operationId": "DiscountsV2ListGet",
1118 "parameters": [
1119 {
1120 "name": "includeInactive",
1121 "in": "query",
1122 "description": "Include deleted or inactive discounts in results - Default: false",
1123 "schema": {
1124 "type": "boolean",
1125 "default": false
1126 }
1127 },
1128 {
1129 "name": "includeInclusionExclusionData",
1130 "in": "query",
1131 "description": "Include detailed product/category restriction data - Default: false",
1132 "schema": {
1133 "type": "boolean",
1134 "default": false
1135 }
1136 },
1137 {
1138 "name": "includePaymentRestrictions",
1139 "in": "query",
1140 "description": "Include credit card and payment method restrictions - Default: false",
1141 "schema": {
1142 "type": "boolean",
1143 "default": false
1144 }
1145 }
1146 ],
1147 "responses": {
1148 "200": {
1149 "description": "Success - Returns array of comprehensive discount configuration objects",
1150 "content": {
1151 "text/plain": {
1152 "schema": {
1153 "type": "array",
1154 "items": {
1155 "$ref": "#/components/schemas/DiscountApiResponse"
1156 }
1157 }
1158 },
1159 "application/json": {
1160 "schema": {
1161 "type": "array",
1162 "items": {
1163 "$ref": "#/components/schemas/DiscountApiResponse"
1164 }
1165 }
1166 },
1167 "text/json": {
1168 "schema": {
1169 "type": "array",
1170 "items": {
1171 "$ref": "#/components/schemas/DiscountApiResponse"
1172 }
1173 }
1174 }
1175 }
1176 },
1177 "401": {
1178 "description": "Unauthorized - Invalid or missing API key"
1179 },
1180 "500": {
1181 "description": "Internal Server Error - Server error occurred"
1182 }
1183 }
1184 }
1185 },
1186 "/drivers": {
1187 "get": {
1188 "tags": ["Drivers"],
1189 "summary": "Get Drivers",
1190 "description": "**Purpose:** Retrieves the complete list of drivers for the authenticated location for delivery operations and transportation management.\n\n**Request Requirements:**\n- \"Reporting\" or \"Deliveries\" role authorization required for driver data access\n- No query parameters or request body needed\n\n**Response Data:**\n- Response format: `[{ DriverDetail }, { DriverDetail }, ...]`\n- Array typically contains 2-20 drivers per location\n- Returns empty array `[]` if no drivers configured for location\n- Includes driver ID, name, state ID, and driver's license number\n- Location-specific driver roster for delivery and transportation operations\n\n**Common Use Cases:**\n- Populate driver dropdown lists in delivery assignment systems\n- Support delivery operations and route management workflows\n- Validate driver assignments in delivery and transportation systems\n- Access basic driver information for compliance and operational purposes\n\n**Performance & Limits:**\n- Location-specific driver data filtered to authenticated location\n- No pagination needed for typical location driver counts\n- Optimized for delivery operations and transportation management\n\n**Related Endpoints:**\n- `POST /drivers` - Create or update driver information\n- `GET /deliveries` - Get deliveries that may be assigned to these drivers\n- Delivery and transportation endpoints that utilize driver assignments\n\n**Important Notes:**\n- Drivers are scoped to location level for operational relevance\n- Requires Reporting or Deliveries role for access to driver information\n- Essential for delivery operations and transportation compliance\n- Driver information includes basic licensing information\n- Used for delivery assignment and route management",
1191 "operationId": "DriversGet",
1192 "responses": {
1193 "200": {
1194 "description": "Success - Returns array of driver objects: `[{ DriverDetail }, ...]`",
1195 "content": {
1196 "application/json": {
1197 "schema": {
1198 "type": "array",
1199 "items": {
1200 "$ref": "#/components/schemas/DriverDetail"
1201 }
1202 }
1203 }
1204 }
1205 },
1206 "401": {
1207 "description": "Unauthorized - Invalid or missing API key"
1208 },
1209 "403": {
1210 "description": "Forbidden - Account not authorized for driver access"
1211 },
1212 "500": {
1213 "description": "Internal Server Error - Server error occurred"
1214 }
1215 }
1216 },
1217 "post": {
1218 "tags": ["Drivers"],
1219 "summary": "Create or Update Driver",
1220 "description": "**Purpose:** Creates a new driver or updates existing driver information for delivery operations and transportation management.\n\n**Request Requirements:**\n- \"Reporting\" or \"Deliveries\" role authorization required for driver data operations\n- `DriverDetail` object in request body with driver information\n- Content-Type: application/json\n- Driver data must pass validation requirements\n\n**Response Data:**\n- Response format: `200 OK` (no response body)\n- Returns success confirmation upon successful creation or update\n- Driver information is validated and stored for operational use\n- Updates reflected immediately in driver listings and assignments\n\n**Request Body Fields:**\n- DriverId: Driver identifier for updates (0 for new drivers)\n- Name: Driver's full name (required)\n- StateId: State identifier for licensing (optional)\n- DriversLicense: Driver's license number (required)\n\n**Create vs Update Behavior:**\n- **CREATE**: When DriverId is 0 or omitted, creates a new driver record\n- **UPDATE**: When DriverId is provided with valid driver ID, updates existing driver\n- **Validation**: All provided data must pass driver validation requirements\n\n**Common Use Cases:**\n- Add new drivers to the delivery team for expanding operations\n- Update existing driver information when licenses or details change\n- Maintain accurate driver records for compliance and operational purposes\n- Support driver onboarding and management workflows\n\n**Performance & Limits:**\n- Single driver operation for targeted updates\n- Immediate validation and storage\n- Changes reflected immediately in driver listings\n- Location-scoped driver management for operational relevance\n\n**Related Endpoints:**\n- `GET /drivers` - Retrieve current driver information\n- `GET /deliveries` - Get deliveries that may be assigned to drivers\n- Delivery management endpoints that utilize driver assignments\n\n**Important Notes:**\n- Driver information must pass validation before storage\n- Drivers are scoped to location level for operational management\n- Essential for delivery operations and transportation compliance\n- Basic licensing information required for compliance\n- Changes immediately available for delivery assignment and scheduling",
1221 "operationId": "DriversPost",
1222 "requestBody": {
1223 "description": "Driver information to create or update - DriverDetail object with driver details",
1224 "content": {
1225 "application/json-patch+json": {
1226 "schema": {
1227 "$ref": "#/components/schemas/DriverDetail"
1228 }
1229 },
1230 "application/json": {
1231 "schema": {
1232 "$ref": "#/components/schemas/DriverDetail"
1233 }
1234 },
1235 "text/json": {
1236 "schema": {
1237 "$ref": "#/components/schemas/DriverDetail"
1238 }
1239 },
1240 "application/*+json": {
1241 "schema": {
1242 "$ref": "#/components/schemas/DriverDetail"
1243 }
1244 }
1245 },
1246 "x-bodyName": "driver"
1247 },
1248 "responses": {
1249 "200": {
1250 "description": "Success - Driver successfully created or updated"
1251 },
1252 "400": {
1253 "description": "Bad Request - `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array",
1254 "content": {
1255 "application/json": {
1256 "schema": {
1257 "$ref": "#/components/schemas/ValidationResult"
1258 }
1259 }
1260 }
1261 },
1262 "401": {
1263 "description": "Unauthorized - Invalid or missing API key"
1264 },
1265 "403": {
1266 "description": "Forbidden - Account not authorized for driver access"
1267 },
1268 "500": {
1269 "description": "Internal Server Error - Server error occurred"
1270 }
1271 }
1272 }
1273 },
1274 "/employees": {
1275 "get": {
1276 "tags": ["Employees"],
1277 "summary": "Get Employees",
1278 "description": "**Purpose:** Retrieves the complete list of employees for the authenticated organization for staff management and operational workflows.\n\n**Request Requirements:**\n- \"Employee\" role authorization required for employee data access\n- No query parameters or request body needed\n- Rate limited to 300 requests per minute\n\n**Response Data:**\n- Returns array of employee objects: `[{ Employee }, ...]`\n- Array typically contains 5-100 employees per organization\n- Returns empty array `[]` if no employees configured (rare)\n- Includes employee ID, name, location assignments, and permission details\n- Organization-level employee directory filtered to authenticated organization\n- Staff information for operational and management purposes\n\n**Common Use Cases:**\n- Populate employee dropdown lists in scheduling and assignment systems\n- Support staff management and operational workflow assignments\n- Generate employee directories and contact lists for internal use\n- Validate employee assignments in transaction and operational systems\n- Enable staff-based reporting and analytics for management\n- Support payroll and HR integration systems\n\n**Performance & Limits:**\n- Rate limited to 300 requests per minute for optimal performance\n- Organization-level employee data filtered to authenticated organization\n- No pagination needed for typical organization employee counts\n- Optimized for internal operational and management use cases\n\n**Related Endpoints:**\n- Transaction endpoints that may reference employee assignments\n- Operational endpoints that utilize employee information\n- Reporting endpoints that include employee-based analytics\n\n**Important Notes:**\n- Employees are scoped to organization level (LSP) for data security\n- Requires Employee role authorization for access to sensitive staff information\n- Rate limiting enforced to protect employee data and system performance\n- Essential for staff management and operational workflow support\n- Employee information may be used for transaction tracking and audit trails\n- Supports internal operational systems and management workflows",
1279 "operationId": "EmployeesGet",
1280 "responses": {
1281 "200": {
1282 "description": "Success - Returns array of Employee objects: `[{ Employee }, ...]`",
1283 "content": {
1284 "application/json": {
1285 "schema": {
1286 "type": "array",
1287 "items": {
1288 "$ref": "#/components/schemas/Employee"
1289 }
1290 }
1291 }
1292 }
1293 },
1294 "401": {
1295 "description": "Unauthorized - Invalid or missing API key"
1296 },
1297 "403": {
1298 "description": "Forbidden - Account not authorized for employee access"
1299 },
1300 "500": {
1301 "description": "Internal Server Error - Server error occurred"
1302 }
1303 }
1304 }
1305 },
1306 "/guestlist": {
1307 "get": {
1308 "tags": ["GuestList"],
1309 "summary": "Guest List (Active Check-ins)",
1310 "description": "**Purpose:** Retrieves a real-time list of customers currently checked into the dispensary location for queue management and customer service.\n\n**Request Requirements:**\n- \"Customer\" role authorization required for guest management functions\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of guest objects: `[{ GuestListEntry }, ...]`\n- Array typically contains 0-50 active guests depending on current business volume\n- Returns empty array `[]` if no customers are currently checked in\n- Customer details including name, customer ID, customer type, and contact information\n- Check-in status with current status and check-in timestamp in UTC\n- Transaction data with associated transaction ID and reference number\n- Terminal information showing POS terminal name where check-in occurred\n- Pre-order source indicating origin of the order (online, walk-in, etc.)\n- Returns only guests checked into the authenticated location\n\n**Data Filtering:**\n- Real-time data showing only currently active check-ins\n- Guests who have completed their visit and checked out will not appear\n- Automatically excludes guests in hidden rooms (administrative areas)\n- Automatically excludes guests in on-hold rooms (temporary holding areas)\n- Results filtered to show only the most recent check-in per customer\n\n**Common Use Cases:**\n- Monitor current guest queue and wait times for queue management\n- Display active customers for budtender assignment on staff dashboards\n- Maintain records of dispensary occupancy for compliance tracking\n- Identify guests and their order status for customer service\n- Track check-in patterns and peak hours for analytics\n\n**Performance & Limits:**\n- Data optimized for real-time display applications\n- Consider implementing appropriate polling intervals for your use case\n- Live data reflects current check-in status immediately\n- Efficient filtering for large guest lists\n\n**Related Endpoints:**\n- `POST /transaction/create-anonymous` - Create anonymous customer check-ins\n\n**Important Notes:**\n- All timestamps are returned in UTC format for consistent processing across time zones\n- Only shows currently active check-ins; completed visits are excluded\n- Location-specific data filtered to authenticated dispensary location\n- Requires customer role authorization for access to guest management functions",
1311 "operationId": "GuestlistGet",
1312 "responses": {
1313 "200": {
1314 "description": "Success - Returns array of guest objects: `[{ GuestListEntry }, ...]`",
1315 "content": {
1316 "application/json": {
1317 "schema": {
1318 "type": "array",
1319 "items": {
1320 "$ref": "#/components/schemas/GuestListEntry"
1321 }
1322 }
1323 }
1324 }
1325 },
1326 "401": {
1327 "description": "Unauthorized - Invalid or missing API key"
1328 },
1329 "403": {
1330 "description": "Forbidden - Account not authorized for customer access"
1331 },
1332 "500": {
1333 "description": "Internal Server Error - Server error occurred"
1334 }
1335 }
1336 }
1337 },
1338 "/harvest": {
1339 "get": {
1340 "tags": ["Harvest"],
1341 "summary": "Get Harvests",
1342 "description": "**Purpose:** Retrieve harvest records for cannabis cultivation operations including tracking, compliance, and operational management.\n\n**Request Requirements:**\n- Either \"Inventory\" or \"Cultivation\" role required for harvest data access\n- Optional query parameters for filtering and date range selection\n- No request body needed\n\n**Response Data:**\n- Returns array of `Harvest` objects with comprehensive harvest information\n- Array may contain 0 to 1,000+ harvests depending on cultivation scale and filtering\n- Returns empty array `[]` if no harvests match criteria (not null)\n- Results ordered by last modified date (most recent first)\n- Harvest details include timing, quantities, strain information, and compliance data\n- Results automatically filtered to authenticated location\n\n**Filtering Options:**\n- fromLastModifiedDateUTC: Returns harvests modified after this date for incremental sync\n- toLastModifiedDateUTC: Returns harvests modified before this date for date range filtering\n- activeHarvests: Filter by harvest status (true=active, false=completed, null=completed only)\n\n**Harvest Status Definitions:**\n- **Active Harvests**: Currently in progress, not yet completed or processed\n- **Completed Harvests**: Finished harvest operations, ready for processing or completed\n- **Default Behavior**: Returns completed harvests only when activeHarvests parameter is null\n\n**Common Use Cases:**\n- Monitor harvest progress and completion status for cultivation management\n- Generate harvest reports for compliance and regulatory reporting\n- Track harvest yields and timing for operational optimization\n- Synchronize harvest data with cultivation management systems\n- Support inventory management and product traceability requirements\n\n**Performance & Limits:**\n- Optimized for cultivation tracking and harvest management workflows\n- Date range filtering recommended for large cultivation operations\n- Results sorted by modification date for chronological tracking\n- Location-scoped results for operational relevance and security\n\n**Related Endpoints:**\n- `POST /harvest` - Create or update individual harvest records\n- `POST /harvest/bulk` - Create or update multiple harvests efficiently\n- `GET /inventory` - View products created from harvest operations\n- Plant and cultivation tracking endpoints for complete workflow\n\n**Important Notes:**\n- **Default Filter**: Returns completed harvests only unless activeHarvests parameter is specified\n- **Date Filtering**: Use date parameters for incremental sync and performance optimization\n- **Compliance Tracking**: Harvest records support cannabis regulatory compliance requirements\n- **Cultivation Integration**: Links with plant tracking and inventory management systems\n- **Yield Tracking**: Provides harvest quantity and quality data for operational analytics",
1343 "operationId": "HarvestGet",
1344 "parameters": [
1345 {
1346 "name": "fromLastModifiedDateUTC",
1347 "in": "query",
1348 "description": "Filter harvests modified after this date for incremental sync - Optional",
1349 "schema": {
1350 "type": "string",
1351 "format": "date-time"
1352 }
1353 },
1354 {
1355 "name": "toLastModifiedDateUTC",
1356 "in": "query",
1357 "description": "Filter harvests modified before this date for date range filtering - Optional",
1358 "schema": {
1359 "type": "string",
1360 "format": "date-time"
1361 }
1362 },
1363 {
1364 "name": "activeHarvests",
1365 "in": "query",
1366 "description": "Filter by harvest status: true=active, false=completed, null=completed only - Default: null (completed only)",
1367 "schema": {
1368 "type": "boolean"
1369 }
1370 }
1371 ],
1372 "responses": {
1373 "200": {
1374 "description": "Success - Returns array of harvest objects: `[{ Harvest }, ...]`",
1375 "content": {
1376 "application/json": {
1377 "schema": {
1378 "type": "array",
1379 "items": {
1380 "$ref": "#/components/schemas/Harvest"
1381 }
1382 }
1383 }
1384 }
1385 },
1386 "401": {
1387 "description": "Unauthorized - Invalid or missing API key"
1388 },
1389 "403": {
1390 "description": "Forbidden - Account not authorized for cultivation or inventory access"
1391 },
1392 "500": {
1393 "description": "Internal Server Error - Server error occurred"
1394 }
1395 }
1396 },
1397 "post": {
1398 "tags": ["Harvest"],
1399 "summary": "Create or Update Harvest",
1400 "description": "**Purpose:** Create a new harvest record or update an existing harvest with comprehensive cultivation data for compliance tracking and operational management.\n\n**Request Requirements:**\n- \"CultivationWrite\" role authorization required for harvest data operations\n- `CreateOrUpdateHarvest` object in request body with harvest details\n- Content-Type: application/json\n- Plant and strain information must be valid and accessible to your location\n\n**Response Data:**\n- Returns single integer harvest ID (not array) for the created or updated harvest\n- New harvests receive newly assigned harvest ID\n- Updated harvests return the existing harvest ID\n- ID can be used for subsequent harvest operations and tracking\n\n**Create vs Update Behavior:**\n- **CREATE**: When HarvestId is null or omitted, a new harvest record will be created\n- **UPDATE**: When HarvestId is provided with a valid harvest ID, the existing harvest will be updated\n- **Validation**: Plant and strain data must be valid for both create and update operations\n- **Compliance**: All harvest data must meet cannabis regulatory requirements\n\n**Request Body Fields:**\n- HarvestId: ID for updates (null for new harvests)\n- Plant identification and tracking information\n- Harvest timing and scheduling details\n- Yield quantities and measurement data\n- Strain and genetic information\n- Compliance and regulatory tracking data\n\n**Sparse Update Behavior:**\n- **Provided fields**: Will overwrite existing values with provided data\n- **Omitted fields**: Will preserve existing values (no data loss for updates)\n- **Special handling**: Plant and strain associations require valid references\n- **Validation**: All provided data must meet cultivation and compliance standards\n\n**Common Use Cases:**\n- Record new harvest operations as plants are processed\n- Update harvest records with final yield and quality data\n- Maintain compliance with cannabis cultivation tracking requirements\n- Track harvest timing and efficiency for operational optimization\n- Link harvests to plant tracking and inventory management systems\n\n**Performance & Limits:**\n- Single harvest operation for targeted tracking\n- Immediate validation and compliance checking\n- Changes reflected immediately in harvest listings and reporting\n- Optimized for cultivation workflow integration\n\n**Related Endpoints:**\n- `GET /harvest` - Retrieve harvest records for review and tracking\n- `POST /harvest/bulk` - Create or update multiple harvests efficiently\n- Plant tracking endpoints for complete cultivation workflow\n- `GET /inventory` - View products created from harvest operations\n\n**Important Notes:**\n- **Compliance Critical**: Harvest records are required for cannabis regulatory compliance\n- **Plant Tracking**: Must link to valid plant records for traceability\n- **Yield Accuracy**: Accurate yield data is essential for inventory and compliance\n- **Timing Tracking**: Harvest dates and timing support compliance reporting\n- **Bulk Alternative**: Use POST /harvest/bulk for multiple harvest operations",
1401 "operationId": "HarvestPost",
1402 "requestBody": {
1403 "description": "Harvest information to create or update - CreateOrUpdateHarvest object with harvest details",
1404 "content": {
1405 "application/json-patch+json": {
1406 "schema": {
1407 "$ref": "#/components/schemas/CreateOrUpdateHarvest"
1408 }
1409 },
1410 "application/json": {
1411 "schema": {
1412 "$ref": "#/components/schemas/CreateOrUpdateHarvest"
1413 }
1414 },
1415 "text/json": {
1416 "schema": {
1417 "$ref": "#/components/schemas/CreateOrUpdateHarvest"
1418 }
1419 },
1420 "application/*+json": {
1421 "schema": {
1422 "$ref": "#/components/schemas/CreateOrUpdateHarvest"
1423 }
1424 }
1425 },
1426 "x-bodyName": "req"
1427 },
1428 "responses": {
1429 "200": {
1430 "description": "Success - Returns harvest ID for created or updated harvest: `integer`",
1431 "content": {
1432 "application/json": {
1433 "schema": {
1434 "type": "integer",
1435 "format": "int32"
1436 }
1437 }
1438 }
1439 },
1440 "401": {
1441 "description": "Unauthorized - Invalid or missing API key"
1442 },
1443 "403": {
1444 "description": "Forbidden - Account not authorized for cultivation write access"
1445 },
1446 "500": {
1447 "description": "Internal Server Error - Server error occurred"
1448 }
1449 }
1450 }
1451 },
1452 "/harvest/bulk": {
1453 "post": {
1454 "tags": ["Harvest"],
1455 "summary": "Bulk Create or Update Harvests",
1456 "description": "**Purpose:** Create or update multiple harvest records in a single operation for efficient cultivation data management and compliance tracking.\n\n**Request Requirements:**\n- \"CultivationWrite\" role authorization required for harvest data operations\n- `BulkCreateOrUpdateHarvest` object in request body with array of harvest details\n- Content-Type: application/json\n- All plant and strain information must be valid and accessible to your location\n- Request validation performed before any operations are executed\n\n**Response Data:**\n- Returns single `BulkCreateOrUpdateHarvestResponse` object (not array) with operation results\n- CreatedHarvestIds: Array of newly created harvest IDs\n- UpdatedHarvestIds: Array of updated harvest IDs\n- Success message confirming completion of operations\n- All operations are atomic - either all succeed or all fail\n\n**Create vs Update Behavior:**\n- **CREATE**: When HarvestId is null or omitted in harvest objects, new harvest records will be created\n- **UPDATE**: When HarvestId is provided with valid harvest IDs, existing harvests will be updated\n- **Mixed Operations**: Single request can include both create and update operations\n- **Validation**: All harvest data must pass validation before any operations are executed\n- **Atomic Processing**: All operations succeed together or all operations fail together\n\n**Request Body Structure:**\n- Harvests: Array of CreateOrUpdateHarvest objects\n- Each harvest object contains the same fields as individual harvest operations\n- Plant identification, timing, yield, strain, and compliance data for each harvest\n- Mixed create (HarvestId=null) and update (HarvestId=provided) operations supported\n\n**Bulk Processing Benefits:**\n- **Efficiency**: Process multiple harvests in single API call\n- **Performance**: Optimized database operations for large cultivation operations\n- **Consistency**: Atomic operations ensure data integrity\n- **Compliance**: Batch compliance checking and validation\n- **Convenience**: Simplifies integration for cultivation management systems\n\n**Common Use Cases:**\n- Process multiple harvest operations from cultivation management systems\n- Synchronize harvest data between external systems and LeafLogix\n- Update multiple harvest records with final yield and quality data\n- Import harvest data from spreadsheets or external cultivation tracking\n- Maintain compliance with cannabis cultivation tracking requirements\n\n**Performance & Limits:**\n- Optimized for bulk cultivation data processing\n- Atomic transaction processing ensures data consistency\n- All validation performed before any operations are executed\n- Efficient for large-scale cultivation operations\n- Changes reflected immediately in harvest listings and reporting\n\n**Related Endpoints:**\n- `GET /harvest` - Retrieve harvest records for review and tracking\n- `POST /harvest` - Create or update individual harvest records\n- Plant tracking endpoints for complete cultivation workflow\n- `GET /inventory` - View products created from harvest operations\n\n**Important Notes:**\n- **Atomic Operations**: All harvests in the request succeed or fail together\n- **Validation Required**: Complete validation performed before any processing\n- **Compliance Critical**: All harvest records must meet cannabis regulatory requirements\n- **Plant Tracking**: All harvests must link to valid plant records for traceability\n- **Efficiency**: Preferred method for multiple harvest operations",
1457 "operationId": "HarvestBulkPost",
1458 "requestBody": {
1459 "description": "Bulk harvest request with array of harvest operations - BulkCreateOrUpdateHarvest object",
1460 "content": {
1461 "application/json-patch+json": {
1462 "schema": {
1463 "$ref": "#/components/schemas/BulkCreateOrUpdateHarvest"
1464 }
1465 },
1466 "application/json": {
1467 "schema": {
1468 "$ref": "#/components/schemas/BulkCreateOrUpdateHarvest"
1469 }
1470 },
1471 "text/json": {
1472 "schema": {
1473 "$ref": "#/components/schemas/BulkCreateOrUpdateHarvest"
1474 }
1475 },
1476 "application/*+json": {
1477 "schema": {
1478 "$ref": "#/components/schemas/BulkCreateOrUpdateHarvest"
1479 }
1480 }
1481 },
1482 "x-bodyName": "req"
1483 },
1484 "responses": {
1485 "200": {
1486 "description": "Success - Returns bulk harvest response object: `{ BulkCreateOrUpdateHarvestResponse }`",
1487 "content": {
1488 "application/json": {
1489 "schema": {
1490 "$ref": "#/components/schemas/BulkCreateOrUpdateHarvestResponse"
1491 }
1492 }
1493 }
1494 },
1495 "400": {
1496 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
1497 "content": {
1498 "application/json": {
1499 "schema": {
1500 "$ref": "#/components/schemas/BadRequestResponse"
1501 }
1502 }
1503 }
1504 },
1505 "401": {
1506 "description": "Unauthorized - Invalid or missing API key"
1507 },
1508 "403": {
1509 "description": "Forbidden - Account not authorized for cultivation write access"
1510 },
1511 "500": {
1512 "description": "Internal Server Error - Server error occurred"
1513 }
1514 }
1515 }
1516 },
1517 "/okcomputer": {
1518 "get": {
1519 "tags": ["HealthCheck"],
1520 "summary": "Health Check Endpoint",
1521 "description": "**Purpose:** Provides a simple health check endpoint to verify the API service is running and responsive.\n\n**Request Requirements:**\n- No authentication or API key required for infrastructure access\n- AllowAnonymous endpoint for monitoring systems\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns health status object: `{ SuccessResult }`\n- HTTP 200 status when the service is healthy\n- Lightweight JSON response for fast monitoring\n\n**Common Use Cases:**\n- Load balancer health checks to route traffic only to healthy instances\n- External monitoring services (Pingdom, DataDog) for uptime alerting\n- Infrastructure monitoring by DevOps teams for service availability\n- Service verification before making other API calls\n- Automated health monitoring in deployment pipelines\n\n**Performance & Limits:**\n- Designed to respond quickly with minimal system requirements\n- No rate limiting applied to health checks\n- Minimal dependencies to ensure reliable health indication\n- Optimized for frequent polling by monitoring systems\n\n**Related Endpoints:**\n- No related endpoints - this is a standalone health check\n\n**Important Notes:**\n- This endpoint bypasses normal authentication for infrastructure access\n- Designed for automated monitoring and load balancer health checks\n- Simple response format optimized for parsing by monitoring tools\n- Available on both `/health-check` and `/okcomputer` routes",
1522 "operationId": "OkcomputerGet",
1523 "responses": {
1524 "200": {
1525 "description": "Success - Service is healthy and responsive",
1526 "content": {
1527 "text/plain": {
1528 "schema": {
1529 "$ref": "#/components/schemas/SuccessResult"
1530 }
1531 },
1532 "application/json": {
1533 "schema": {
1534 "$ref": "#/components/schemas/SuccessResult"
1535 }
1536 },
1537 "text/json": {
1538 "schema": {
1539 "$ref": "#/components/schemas/SuccessResult"
1540 }
1541 }
1542 }
1543 },
1544 "500": {
1545 "description": "Internal Server Error - Service is experiencing issues"
1546 }
1547 }
1548 }
1549 },
1550 "/integration/integration-recon": {
1551 "get": {
1552 "tags": ["Integration"],
1553 "summary": "Get Inventory Integration Reconciliation",
1554 "description": "**Purpose:** Retrieve inventory reconciliation data between LeafLogix and external state tracking systems for compliance and integration monitoring.\n\n**Request Requirements:**\n- \"Integrations\" role authorization required for integration data access\n- No query parameters or request body needed\n- Integration management permissions for system reconciliation\n\n**Response Data:**\n- Returns single `InventoryIntegrationReconResponse` object (not array) with reconciliation results\n- Includes inventory discrepancies and integration status information\n- State system synchronization details and compliance tracking data\n- Integration health and data consistency information\n\n**Reconciliation Information Included:**\n- **Inventory Discrepancies**: Items with differences between systems\n- **Integration Status**: Current state of external system synchronization\n- **Compliance Data**: Regulatory tracking and audit trail information\n- **Sync Health**: Integration system connectivity and data flow status\n\n**Common Use Cases:**\n- Monitor inventory synchronization between LeafLogix and state tracking systems\n- Identify and resolve inventory discrepancies for compliance\n- Support compliance audits and regulatory reporting requirements\n- Troubleshoot integration issues and data synchronization problems\n- Maintain accurate inventory records across integrated systems\n\n**Performance & Limits:**\n- Real-time reconciliation data for immediate integration monitoring\n- Comprehensive reconciliation across integrated state tracking systems\n- Optimized for compliance monitoring and integration management workflows\n- Results include comprehensive integration status and discrepancy details\n\n**Related Endpoints:**\n- `GET /inventory` - View current inventory status for comparison\n- `GET /plant` - Check plant inventory integration status\n- `GET /harvest` - Monitor harvest integration synchronization\n\n**Important Notes:**\n- **Compliance Critical**: Essential for regulatory compliance and audit requirements\n- **Integration Monitoring**: Real-time visibility into external system synchronization\n- **Complete Data Access**: Provides comprehensive reconciliation across all integrated systems\n- **State System Integration**: Specific to external state tracking system connectivity\n- **Audit Ready**: Data formatted for compliance reporting and audit requirements",
1555 "operationId": "IntegrationIntegration-reconGet",
1556 "responses": {
1557 "200": {
1558 "description": "Success",
1559 "content": {
1560 "application/json": {
1561 "schema": {
1562 "$ref": "#/components/schemas/InventoryIntegrationReconResponse"
1563 }
1564 }
1565 }
1566 },
1567 "401": {
1568 "description": "Invalid API Key"
1569 },
1570 "403": {
1571 "description": "Account not authorized"
1572 },
1573 "500": {
1574 "description": "Something went wrong."
1575 }
1576 }
1577 }
1578 },
1579 "/inventory": {
1580 "get": {
1581 "tags": ["Inventory"],
1582 "summary": "Get Inventory",
1583 "description": "**Purpose:** Retrieve current inventory levels and product details for API-enabled products with available stock.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for inventory data access\n- Optional query parameters for enhanced data inclusion\n- No request body needed\n\n**Response Data:**\n- Returns array of `InventoryItem` objects with current stock and product information\n- Response format: `[{ InventoryItem }, { InventoryItem }, ...]`\n- Array may contain 0 to 5,000+ inventory items depending on location inventory size\n- Returns empty array `[]` if no inventory items have stock or meet criteria\n- Stock levels including available quantities, unit weights, flower equivalent amounts\n- Product details with SKU, name, description, category, brand, pricing (retail/medical)\n- Package data including package ID, batch name, package status, expiration dates\n- Lab results with potency testing, cannabinoid profiles, test dates (when includeLabResults=true)\n- Room breakdown showing quantities by storage location (when includeRoomQuantities=true)\n- Compliance data including external package IDs (METRC/BioTrack), strain information, producer details\n\n**Filtering Options:**\n- includeLabResults: Include detailed lab testing data and cannabinoid profiles (default: false)\n- includeRoomQuantities: Include quantity breakdown by storage room/location (default: false)\n\n**Common Use Cases:**\n- Update online store inventory levels and product availability for e-commerce sync\n- Perform real-time stock checks during sales transactions for POS integration\n- Monitor stock levels across multiple storage locations for inventory management\n- Track package-level inventory for regulatory compliance reporting\n- Show potency and testing information to customers for lab data display\n\n**Performance & Limits:**\n- Response times optimized for high-volume integrations\n- Use minimal parameters for fastest response times\n- Standard rate limits apply for high-volume integrations\n- Data reflects current system state with real-time accuracy\n\n**Related Endpoints:**\n- `GET /products` - Complete product catalog regardless of stock levels (use for menu/catalog display)\n\n**Important Notes:**\n- Only products enabled for API access are returned for access control\n- Products with zero inventory are automatically excluded\n- Results automatically filtered to authenticated user's location only\n- Inventory data reflects current stock levels with real-time accuracy",
1584 "operationId": "InventoryGet",
1585 "parameters": [
1586 {
1587 "name": "includeLabResults",
1588 "in": "query",
1589 "description": "Include detailed lab testing data and cannabinoid profiles - Default: false",
1590 "schema": {
1591 "type": "boolean",
1592 "default": false
1593 }
1594 },
1595 {
1596 "name": "includeRoomQuantities",
1597 "in": "query",
1598 "description": "Include quantity breakdown by storage room/location - Default: false",
1599 "schema": {
1600 "type": "boolean",
1601 "default": false
1602 }
1603 }
1604 ],
1605 "responses": {
1606 "200": {
1607 "description": "Success - Returns array of inventory items with product and stock details",
1608 "content": {
1609 "application/json": {
1610 "schema": {
1611 "type": "array",
1612 "items": {
1613 "$ref": "#/components/schemas/InventoryItem"
1614 }
1615 }
1616 }
1617 }
1618 },
1619 "401": {
1620 "description": "Unauthorized - Invalid or missing API key"
1621 },
1622 "403": {
1623 "description": "Forbidden - Account not authorized for inventory access"
1624 },
1625 "500": {
1626 "description": "Internal Server Error - Server error occurred"
1627 }
1628 }
1629 }
1630 },
1631 "/inventory/labresults": {
1632 "get": {
1633 "tags": ["Inventory"],
1634 "operationId": "InventoryLabresultsGet",
1635 "parameters": [
1636 {
1637 "name": "BatchName",
1638 "in": "query",
1639 "schema": {
1640 "type": "string"
1641 }
1642 }
1643 ],
1644 "responses": {
1645 "200": {
1646 "description": "OK",
1647 "content": {
1648 "application/json": {
1649 "schema": {
1650 "type": "array",
1651 "items": {
1652 "$ref": "#/components/schemas/LabResult"
1653 }
1654 }
1655 }
1656 }
1657 },
1658 "401": {
1659 "description": "Unauthorized"
1660 },
1661 "403": {
1662 "description": "Forbidden"
1663 },
1664 "500": {
1665 "description": "Internal Server Error"
1666 }
1667 }
1668 }
1669 },
1670 "/inventory/snapshot": {
1671 "get": {
1672 "tags": ["Inventory"],
1673 "operationId": "InventorySnapshotGet",
1674 "parameters": [
1675 {
1676 "name": "fromDate",
1677 "in": "query",
1678 "schema": {
1679 "type": "string",
1680 "format": "date-time"
1681 }
1682 }
1683 ],
1684 "responses": {
1685 "200": {
1686 "description": "OK",
1687 "content": {
1688 "application/json": {
1689 "schema": {
1690 "type": "array",
1691 "items": {
1692 "$ref": "#/components/schemas/InventorySnapshot"
1693 }
1694 }
1695 }
1696 }
1697 },
1698 "401": {
1699 "description": "Unauthorized"
1700 },
1701 "403": {
1702 "description": "Forbidden"
1703 },
1704 "500": {
1705 "description": "Internal Server Error"
1706 }
1707 }
1708 }
1709 },
1710 "/inventory/receivedinventory": {
1711 "get": {
1712 "tags": ["Inventory"],
1713 "operationId": "InventoryReceivedinventoryGet",
1714 "parameters": [
1715 {
1716 "name": "receiveInventoryHistoryId",
1717 "in": "query",
1718 "schema": {
1719 "type": "integer",
1720 "format": "int32"
1721 }
1722 },
1723 {
1724 "name": "startDate",
1725 "in": "query",
1726 "schema": {
1727 "type": "string",
1728 "format": "date-time"
1729 }
1730 },
1731 {
1732 "name": "endDate",
1733 "in": "query",
1734 "schema": {
1735 "type": "string",
1736 "format": "date-time"
1737 }
1738 }
1739 ],
1740 "responses": {
1741 "200": {
1742 "description": "OK",
1743 "content": {
1744 "application/json": {
1745 "schema": {
1746 "type": "array",
1747 "items": {
1748 "$ref": "#/components/schemas/ReceivedInventory"
1749 }
1750 }
1751 }
1752 }
1753 },
1754 "401": {
1755 "description": "Unauthorized"
1756 },
1757 "403": {
1758 "description": "Forbidden"
1759 },
1760 "500": {
1761 "description": "Internal Server Error"
1762 }
1763 }
1764 }
1765 },
1766 "/inventory/inventorytransaction": {
1767 "get": {
1768 "tags": ["Inventory"],
1769 "operationId": "InventoryInventorytransactionGet",
1770 "parameters": [
1771 {
1772 "name": "startDate",
1773 "in": "query",
1774 "schema": {
1775 "type": "string",
1776 "format": "date-time"
1777 }
1778 },
1779 {
1780 "name": "endDate",
1781 "in": "query",
1782 "schema": {
1783 "type": "string",
1784 "format": "date-time"
1785 }
1786 },
1787 {
1788 "name": "transactionType",
1789 "in": "query",
1790 "schema": {
1791 "type": "string"
1792 }
1793 }
1794 ],
1795 "responses": {
1796 "200": {
1797 "description": "OK",
1798 "content": {
1799 "application/json": {
1800 "schema": {
1801 "type": "array",
1802 "items": {
1803 "$ref": "#/components/schemas/InventoryTransaction"
1804 }
1805 }
1806 }
1807 }
1808 },
1809 "401": {
1810 "description": "Unauthorized"
1811 },
1812 "403": {
1813 "description": "Forbidden"
1814 },
1815 "500": {
1816 "description": "Internal Server Error"
1817 }
1818 }
1819 }
1820 },
1821 "/inventory/receiveinventory": {
1822 "post": {
1823 "tags": ["Inventory"],
1824 "summary": "Create Receive Inventory Order",
1825 "description": "**Purpose:** Create a new inventory receive order for incoming transfers, purchase orders, or direct inventory additions.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for inventory operations\n- `ReceiveInventorySave` object in request body with vendor and item details\n- Content-Type: application/json\n- UserId or UserName required when ReceiveIntoInventory=true\n\n**Response Data:**\n- Response format: `{ SavedReceive }`\n- Returns transaction ID and processing status information\n\n**Processing Options:**\n- **Draft Mode (ReceiveIntoInventory=false):** Creates a saved receive order that can be opened/edited in LeafLogix\n- **Direct Processing (ReceiveIntoInventory=true):** Immediately processes items into inventory (requires UserId or UserName)\n\n**Required Information:**\n- **Items Array:** Product details, quantities, costs, room assignments, batch information\n- **Vendor Information:** VendorId, delivery details, licensing information\n- **User Context:** UserId or UserName (required when ReceiveIntoInventory=true)\n\n**Item Details Required:**\n- **Product Identification:** ProductId or SKU, product name\n- **Quantities:** Receive quantity, unit of measure\n- **Costs:** Unit cost, total cost (for cost tracking)\n- **Storage:** Room assignment, expiration dates\n- **Compliance:** Package tags, batch names, lab testing status\n\n**Common Use Cases:**\n- **Transfer Processing:** Receive inventory from other licensed locations\n- **Purchase Orders:** Process incoming vendor deliveries\n- **Direct Additions:** Add inventory directly to stock levels\n- **Compliance Tracking:** Maintain chain of custody for regulatory reporting\n- **Batch Processing:** Handle multiple items in a single receive transaction\n\n**Validation Features:**\n- **Vendor Verification:** Validates vendor exists and is active\n- **Room Validation:** Confirms room assignments are valid for location\n- **Potency Indicators:** Validates required compliance fields\n- **Duplicate Prevention:** ExternalId checking prevents duplicate receives\n- **User Authorization:** Verifies user permissions for inventory operations\n\n**Important Notes:**\n- **User Requirement:** UserId or UserName required when ReceiveIntoInventory=true (cannot specify both)\n- **External ID Uniqueness:** ExternalId must be unique or omitted to prevent duplicates\n- **Vendor License Support:** Supports vendor license code mapping for compliance requirements\n- **Location Scoped:** All operations scoped to authenticated user's location\n- **Enhanced Validation:** Additional validation rules may apply based on location settings\n\n**Request Format:**\nProvide a `ReceiveInventorySave` object containing vendor details, delivery information, and an array of items to receive.",
1826 "operationId": "InventoryReceiveinventoryPost",
1827 "requestBody": {
1828 "description": "Receive inventory order details including vendor, delivery, and item information",
1829 "content": {
1830 "application/json-patch+json": {
1831 "schema": {
1832 "$ref": "#/components/schemas/ReceiveInventorySave"
1833 }
1834 },
1835 "application/json": {
1836 "schema": {
1837 "$ref": "#/components/schemas/ReceiveInventorySave"
1838 }
1839 },
1840 "text/json": {
1841 "schema": {
1842 "$ref": "#/components/schemas/ReceiveInventorySave"
1843 }
1844 },
1845 "application/*+json": {
1846 "schema": {
1847 "$ref": "#/components/schemas/ReceiveInventorySave"
1848 }
1849 }
1850 },
1851 "x-bodyName": "recInv"
1852 },
1853 "responses": {
1854 "200": {
1855 "description": "Success - Returns SavedReceive object with transaction details",
1856 "content": {
1857 "application/json": {
1858 "schema": {
1859 "$ref": "#/components/schemas/SavedReceive"
1860 }
1861 }
1862 }
1863 },
1864 "400": {
1865 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors) OR String error message (parse response body as plain text)",
1866 "content": {
1867 "application/json": {
1868 "schema": {
1869 "type": "string"
1870 }
1871 }
1872 }
1873 },
1874 "401": {
1875 "description": "Unauthorized - Invalid or missing API key"
1876 },
1877 "403": {
1878 "description": "Forbidden - Account not authorized for inventory access"
1879 },
1880 "500": {
1881 "description": "Internal Server Error - Server error occurred"
1882 }
1883 }
1884 }
1885 },
1886 "/lineages": {
1887 "get": {
1888 "tags": ["Lineage"],
1889 "summary": "Get Lineages",
1890 "description": "**Purpose:** Retrieves the complete list of genetic lineages available for the authenticated organization for product classification and cannabis genetic tracking.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of lineage objects: `[{ Lineage }, ...]`\n- Array typically contains 10-50 genetic lineages per organization\n- Returns empty array `[]` if no lineages configured (rare)\n- Includes lineage ID, name, and genetic classification details\n- Cannabis genetic lineages and hereditary information for product categorization\n- Results filtered to authenticated organization level\n\n**Common Use Cases:**\n- Track genetic lineage and hereditary information for cannabis products\n- Support compliance reporting with genetic background documentation\n- Populate lineage dropdown lists in product creation and strain management forms\n- Validate genetic lineage assignments in product and cultivation systems\n- Generate lineage-specific reports for cultivation and breeding programs\n- Enable genetic tracking for quality control and consistency\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Small dataset suitable for client-side caching\n- No pagination needed due to manageable number of genetic lineages\n- Results consistent across all locations within organization\n\n**Related Endpoints:**\n- `GET /strains` - Get strains that may be associated with these lineages\n- `GET /products` - Get products with lineage genetic information\n- Cultivation and breeding endpoints that utilize genetic lineage data\n\n**Important Notes:**\n- Lineages are defined at organization level (LSP) for consistency\n- Essential for cannabis genetic tracking and breeding program documentation\n- Used for compliance reporting and genetic background verification\n- Supports cultivation operations with genetic lineage documentation\n- May be required for certain cannabis regulations and track-and-trace systems\n- Helps maintain genetic consistency and quality control in cultivation",
1891 "operationId": "LineagesGet",
1892 "responses": {
1893 "200": {
1894 "description": "Success - Returns array of lineage objects: `[{ Lineage }, ...]`",
1895 "content": {
1896 "application/json": {
1897 "schema": {
1898 "type": "array",
1899 "items": {
1900 "$ref": "#/components/schemas/Lineage"
1901 }
1902 }
1903 }
1904 }
1905 },
1906 "401": {
1907 "description": "Unauthorized - Invalid or missing API key"
1908 },
1909 "403": {
1910 "description": "Forbidden - Account not authorized"
1911 },
1912 "500": {
1913 "description": "Internal Server Error - Server error occurred"
1914 }
1915 }
1916 }
1917 },
1918 "/package/set-tags": {
1919 "post": {
1920 "tags": ["Package"],
1921 "summary": "Set Package Tags",
1922 "description": "**Purpose:** Set inventory tags for packages, completely replacing any existing tags with the new tag set for organization and tracking.\n\n**Request Requirements:**\n- \"PackageWrite\" role authorization required for package tag operations\n- `UpdatePackageTagsRequest` object in request body with package identifiers and tags\n- Content-Type: application/json\n- Must specify either InventoryIds OR PackageIds, but not both\n- All specified packages must be accessible to your location\n\n**Response Data:**\n- Returns success confirmation (HTTP 200) upon successful tag assignment\n- No response body content (void return)\n- Tags are validated and applied immediately to specified packages\n- Changes are reflected immediately in inventory listings and package data\n\n**Package Identification Options:**\n- **InventoryIds**: Target specific inventory records directly (one-to-one relationship)\n- **PackageIds**: Target packages by serial numbers (may affect multiple inventory records)\n- **Mutually Exclusive**: Specify either InventoryIds OR PackageIds, never both\n- **Validation**: Using both types will result in 400 Bad Request error\n\n**Tag Operation Behavior:**\n- **Complete Replacement**: All existing tags are removed and replaced with new tags\n- **Tag Validation**: All tags must be valid and available in the system\n- **Immediate Effect**: Changes apply immediately to all specified packages\n- **Bulk Operation**: Can target multiple packages in a single request\n\n**Request Body Fields:**\n- InventoryIds: Array of inventory record IDs (optional, mutually exclusive with PackageIds)\n- PackageIds: Array of package serial numbers (optional, mutually exclusive with InventoryIds)\n- Tags: Array of tag names to apply to the specified packages (required)\n\n**Common Use Cases:**\n- Standardize tag sets across multiple packages for consistency\n- Replace outdated or incorrect tags with current classification\n- Implement new tagging schema by completely updating existing tags\n- Clean up tag sets by removing unwanted tags and setting only desired ones\n- Maintain organized inventory classification for operational efficiency\n\n**Performance & Limits:**\n- Bulk operation optimized for multiple package updates\n- Immediate validation and tag assignment\n- Changes propagate to inventory systems immediately\n- Efficient for large-scale tag management operations\n\n**Related Endpoints:**\n- `POST /package/add-tags` - Add tags while preserving existing tags\n- `POST /package/remove-tags` - Remove specific tags while preserving others\n- `GET /tags` - Retrieve available tag options for validation\n- `GET /inventory` - View packages with their current tag assignments\n\n**Important Notes:**\n- **Complete Replacement**: This operation removes ALL existing tags and replaces them\n- **Tag Validation**: All tags must exist in the system and be valid\n- **Package Access**: All specified packages must be accessible to your authenticated location\n- **Mutual Exclusion**: Cannot use both InventoryIds and PackageIds in the same request\n- **Alternative Operations**: Use add-tags or remove-tags for partial tag modifications",
1923 "operationId": "PackageSet-tagsPost",
1924 "requestBody": {
1925 "description": "Package tag update request with package identifiers and replacement tags - UpdatePackageTagsRequest object",
1926 "content": {
1927 "application/json-patch+json": {
1928 "schema": {
1929 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
1930 }
1931 },
1932 "application/json": {
1933 "schema": {
1934 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
1935 }
1936 },
1937 "text/json": {
1938 "schema": {
1939 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
1940 }
1941 },
1942 "application/*+json": {
1943 "schema": {
1944 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
1945 }
1946 }
1947 },
1948 "x-bodyName": "req"
1949 },
1950 "responses": {
1951 "200": {
1952 "description": "Success - Tags successfully set on specified packages"
1953 },
1954 "400": {
1955 "description": "Bad Request - `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array",
1956 "content": {
1957 "application/json": {
1958 "schema": {
1959 "$ref": "#/components/schemas/ValidationResult"
1960 }
1961 }
1962 }
1963 },
1964 "401": {
1965 "description": "Invalid API Key"
1966 },
1967 "403": {
1968 "description": "Account not authorized"
1969 },
1970 "500": {
1971 "description": "Something went wrong."
1972 }
1973 }
1974 }
1975 },
1976 "/package/add-tags": {
1977 "post": {
1978 "tags": ["Package"],
1979 "summary": "Add Package Tags",
1980 "description": "**Purpose:** Add new inventory tags to packages while preserving all existing tags for enhanced organization and classification.\n\n**Request Requirements:**\n- \"PackageWrite\" role authorization required for package tag operations\n- `UpdatePackageTagsRequest` object in request body with package identifiers and tags\n- Content-Type: application/json\n- Must specify either InventoryIds OR PackageIds, but not both\n- All specified packages must be accessible to your location\n\n**Response Data:**\n- Returns success confirmation (HTTP 200) upon successful tag addition\n- No response body content (void return)\n- New tags are validated and added immediately to specified packages\n- Changes are reflected immediately in inventory listings and package data\n\n**Package Identification Options:**\n- **InventoryIds**: Target specific inventory records directly (one-to-one relationship)\n- **PackageIds**: Target packages by serial numbers (may affect multiple inventory records)\n- **Mutually Exclusive**: Specify either InventoryIds OR PackageIds, never both\n- **Validation**: Using both types will result in 400 Bad Request error\n\n**Tag Operation Behavior:**\n- **Additive Operation**: New tags are added while preserving all existing tags\n- **Duplicate Handling**: Duplicate tags are automatically ignored (no error)\n- **Tag Validation**: All new tags must be valid and available in the system\n- **Immediate Effect**: Changes apply immediately to all specified packages\n- **Bulk Operation**: Can target multiple packages in a single request\n\n**Request Body Fields:**\n- InventoryIds: Array of inventory record IDs (optional, mutually exclusive with PackageIds)\n- PackageIds: Array of package serial numbers (optional, mutually exclusive with InventoryIds)\n- Tags: Array of tag names to add to the specified packages (required)\n\n**Common Use Cases:**\n- Add seasonal or promotional tags to existing products without losing current classification\n- Enhance product categorization by adding supplementary organizational tags\n- Apply new quality control or testing tags while maintaining existing product tags\n- Add compliance or regulatory tags for audit trails without disrupting inventory organization\n- Implement progressive tagging workflows where tags are added over time\n\n**Performance & Limits:**\n- Bulk operation optimized for multiple package updates\n- Immediate validation and tag addition\n- Changes propagate to inventory systems immediately\n- Efficient for incremental tag management operations\n\n**Related Endpoints:**\n- `POST /package/set-tags` - Replace all existing tags with new tag set\n- `POST /package/remove-tags` - Remove specific tags while preserving others\n- `GET /tags` - Retrieve available tag options for validation\n- `GET /inventory` - View packages with their current tag assignments\n\n**Important Notes:**\n- **Preserves Existing**: This operation keeps ALL existing tags and adds new ones\n- **Duplicate Safe**: Adding tags that already exist will not cause errors\n- **Tag Validation**: All new tags must exist in the system and be valid\n- **Package Access**: All specified packages must be accessible to your authenticated location\n- **Mutual Exclusion**: Cannot use both InventoryIds and PackageIds in the same request",
1981 "operationId": "PackageAdd-tagsPost",
1982 "requestBody": {
1983 "description": "Package tag update request with package identifiers and additional tags - UpdatePackageTagsRequest object",
1984 "content": {
1985 "application/json-patch+json": {
1986 "schema": {
1987 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
1988 }
1989 },
1990 "application/json": {
1991 "schema": {
1992 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
1993 }
1994 },
1995 "text/json": {
1996 "schema": {
1997 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
1998 }
1999 },
2000 "application/*+json": {
2001 "schema": {
2002 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
2003 }
2004 }
2005 },
2006 "x-bodyName": "req"
2007 },
2008 "responses": {
2009 "200": {
2010 "description": "Success - Tags successfully added to specified packages"
2011 },
2012 "400": {
2013 "description": "Bad Request - `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array"
2014 },
2015 "401": {
2016 "description": "Invalid API Key"
2017 },
2018 "403": {
2019 "description": "Account not authorized"
2020 },
2021 "500": {
2022 "description": "Something went wrong."
2023 }
2024 }
2025 }
2026 },
2027 "/package/remove-tags": {
2028 "post": {
2029 "tags": ["Package"],
2030 "summary": "Remove Package Tags",
2031 "description": "**Purpose:** Remove specific inventory tags from packages while preserving all other existing tags for selective tag management.\n\n**Request Requirements:**\n- \"PackageWrite\" role authorization required for package tag operations\n- `UpdatePackageTagsRequest` object in request body with package identifiers and tags to remove\n- Content-Type: application/json\n- Must specify either InventoryIds OR PackageIds, but not both\n- All specified packages must be accessible to your location\n\n**Response Data:**\n- Returns success confirmation (HTTP 200) upon successful tag removal\n- No response body content (void return)\n- Specified tags are removed immediately from specified packages\n- Changes are reflected immediately in inventory listings and package data\n\n**Package Identification Options:**\n- **InventoryIds**: Target specific inventory records directly (one-to-one relationship)\n- **PackageIds**: Target packages by serial numbers (may affect multiple inventory records)\n- **Mutually Exclusive**: Specify either InventoryIds OR PackageIds, never both\n- **Validation**: Using both types will result in 400 Bad Request error\n\n**Tag Operation Behavior:**\n- **Selective Removal**: Only specified tags are removed, all others are preserved\n- **Missing Tag Handling**: Removing tags that don't exist is silently ignored (no error)\n- **Immediate Effect**: Changes apply immediately to all specified packages\n- **Bulk Operation**: Can target multiple packages in a single request\n- **Preservation**: All non-specified tags remain unchanged\n\n**Request Body Fields:**\n- InventoryIds: Array of inventory record IDs (optional, mutually exclusive with PackageIds)\n- PackageIds: Array of package serial numbers (optional, mutually exclusive with InventoryIds)\n- Tags: Array of tag names to remove from the specified packages (required)\n\n**Common Use Cases:**\n- Remove outdated seasonal or promotional tags while keeping product classification\n- Clean up temporary testing or quality control tags after completion\n- Remove incorrect or duplicate tags while preserving accurate classification\n- Implement tag lifecycle management by removing obsolete organizational tags\n- Support compliance workflows by removing temporary audit or review tags\n\n**Performance & Limits:**\n- Bulk operation optimized for multiple package updates\n- Immediate tag removal processing\n- Changes propagate to inventory systems immediately\n- Efficient for selective tag cleanup operations\n\n**Related Endpoints:**\n- `POST /package/set-tags` - Replace all existing tags with new tag set\n- `POST /package/add-tags` - Add new tags while preserving existing tags\n- `GET /tags` - Retrieve available tag options for validation\n- `GET /inventory` - View packages with their current tag assignments\n\n**Important Notes:**\n- **Preserves Others**: This operation keeps ALL non-specified tags unchanged\n- **Missing Tag Safe**: Removing tags that don't exist will not cause errors\n- **Package Access**: All specified packages must be accessible to your authenticated location\n- **Mutual Exclusion**: Cannot use both InventoryIds and PackageIds in the same request\n- **Selective Operation**: Use for precise tag management without affecting other classification",
2032 "operationId": "PackageRemove-tagsPost",
2033 "requestBody": {
2034 "description": "Package tag update request with package identifiers and tags to remove - UpdatePackageTagsRequest object",
2035 "content": {
2036 "application/json-patch+json": {
2037 "schema": {
2038 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
2039 }
2040 },
2041 "application/json": {
2042 "schema": {
2043 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
2044 }
2045 },
2046 "text/json": {
2047 "schema": {
2048 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
2049 }
2050 },
2051 "application/*+json": {
2052 "schema": {
2053 "$ref": "#/components/schemas/UpdatePackageTagsRequest"
2054 }
2055 }
2056 },
2057 "x-bodyName": "req"
2058 },
2059 "responses": {
2060 "200": {
2061 "description": "Success - Tags successfully removed from specified packages"
2062 },
2063 "400": {
2064 "description": "Bad Request - `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array"
2065 },
2066 "401": {
2067 "description": "Invalid API Key"
2068 },
2069 "403": {
2070 "description": "Account not authorized"
2071 },
2072 "500": {
2073 "description": "Something went wrong."
2074 }
2075 }
2076 }
2077 },
2078 "/plant": {
2079 "get": {
2080 "tags": ["Plant"],
2081 "summary": "Get Plants",
2082 "description": "**Purpose:** Retrieve cannabis plant records for cultivation tracking, compliance monitoring, and operational management.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for plant data access\n- Optional query parameters for filtering by plant attributes and date ranges\n- No request body needed\n\n**Response Data:**\n- Response format: `[{ Plant }, { Plant }, ...]`\n- Returns array of `Plant` objects with comprehensive plant information\n- Array may contain 0 to 10,000+ plants depending on cultivation scale and filtering\n- Returns empty array `[]` if no plants match criteria (not null)\n- Plant details include identification, growth status, cultivation tracking, and compliance data\n- Results automatically filtered to authenticated location\n\n**Filtering Options:**\n- plantId: Filter by specific LeafLogix internal plant ID for individual plant lookup\n- serialNumber: Filter by plant serial number for tracking system integration\n- status: Filter by plant status (Active, Harvesting, Harvested, Retired)\n- lastModifiedDateStart: Returns plants modified after this date for incremental sync\n- lastModifiedDateEnd: Returns plants modified before this date for date range filtering\n\n**Plant Status Definitions:**\n- **Active**: Plants currently growing and under cultivation\n- **Harvesting**: Plants currently being harvested or in harvest process\n- **Harvested**: Plants that have completed harvest operations\n- **Retired**: Plants that have been retired from cultivation (destroyed, failed, etc.)\n\n**Common Use Cases:**\n- Monitor plant growth progress and cultivation status for operational management\n- Generate compliance reports for regulatory tracking and auditing\n- Synchronize plant data with cultivation management and tracking systems\n- Track plant lifecycle from cultivation through harvest completion\n- Support inventory management and product traceability requirements\n\n**Performance & Limits:**\n- Optimized for cultivation tracking and plant management workflows\n- Date range filtering recommended for large cultivation operations\n- Plant status filtering efficient for operational dashboards\n- Location-scoped results for operational relevance and security\n\n**Related Endpoints:**\n- `POST /plant/harvest` - Move plants into harvest status\n- `POST /harvest` - Create harvest records for harvested plants\n- `GET /inventory` - View products created from harvested plants\n- Plant lifecycle and cultivation management endpoints\n\n**Important Notes:**\n- **Compliance Tracking**: Plant records support cannabis regulatory compliance requirements\n- **Lifecycle Management**: Tracks complete plant lifecycle from cultivation to harvest\n- **Date Filtering**: Use date parameters for incremental sync and performance optimization\n- **Status Filtering**: Essential for operational workflows and cultivation management\n- **Traceability**: Links with harvest and inventory systems for complete product tracking",
2083 "operationId": "PlantGet",
2084 "parameters": [
2085 {
2086 "name": "plantId",
2087 "in": "query",
2088 "description": "Dutchie internal plant ID for specific plant lookup - Optional",
2089 "schema": {
2090 "type": "integer",
2091 "format": "int32"
2092 }
2093 },
2094 {
2095 "name": "serialNumber",
2096 "in": "query",
2097 "description": "Plant serial number for tracking system integration - Optional",
2098 "schema": {
2099 "type": "string"
2100 }
2101 },
2102 {
2103 "name": "status",
2104 "in": "query",
2105 "description": "Plant status filter: Active, Harvesting, Harvested, Retired - Optional",
2106 "schema": {
2107 "type": "string"
2108 }
2109 },
2110 {
2111 "name": "lastModifiedDateStart",
2112 "in": "query",
2113 "description": "Filter plants modified after this date for incremental sync - Optional",
2114 "schema": {
2115 "type": "string",
2116 "format": "date-time"
2117 }
2118 },
2119 {
2120 "name": "lastModifiedDateEnd",
2121 "in": "query",
2122 "description": "Filter plants modified before this date for date range filtering - Optional",
2123 "schema": {
2124 "type": "string",
2125 "format": "date-time"
2126 }
2127 }
2128 ],
2129 "responses": {
2130 "200": {
2131 "description": "Success",
2132 "content": {
2133 "application/json": {
2134 "schema": {
2135 "type": "array",
2136 "items": {
2137 "$ref": "#/components/schemas/Plant"
2138 }
2139 }
2140 }
2141 }
2142 },
2143 "401": {
2144 "description": "Invalid API Key"
2145 },
2146 "403": {
2147 "description": "Account not authorized"
2148 },
2149 "500": {
2150 "description": "Something went wrong."
2151 }
2152 }
2153 },
2154 "post": {
2155 "tags": ["Plant"],
2156 "summary": "Add Plant",
2157 "description": "**Purpose:** Create a new cannabis plant record in the cultivation system with unique identification and tracking for compliance monitoring and operational management.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for plant creation operations\n- `CreatePlantRequest` object in request body with plant identification and group details\n- Content-Type: application/json\n- Serial number must be unique within the facility\n- Plant group must exist or strain must be provided for new group creation\n\n**Response Data:**\n- Response format: `int` (Plant ID)\n- Returns the newly created plant's unique LeafLogix plant ID\n- Plant ID can be used in subsequent plant management operations\n- Immediate plant creation with tracking system integration\n\n**Request Body Fields:**\n- `PlantGroupName`: Name of plant group for batch tracking (required)\n- `SerialNumber`: Unique plant identifier for compliance tracking (required, must be unique)\n- `Strain`: Strain name for new plant groups (required when creating new plant group)\n- `Room`: Cultivation room name for plant location (required when using state integrations)\n- `BypassStateIntegration`: Skip external system integration (optional, default: false)\n- `DateCreated`: Plant creation date (optional, defaults to current UTC time)\n- `PhaseStartDate`: Initial growth phase start date (optional, defaults to current UTC time)\n\n**Plant Group Behavior:**\n- **Existing Groups**: If plant group exists, strain information is inherited\n- **New Groups**: If plant group doesn't exist, strain must be provided for group creation\n- **Batch Tracking**: Plant groups enable batch-based cultivation tracking and compliance\n- **Strain Assignment**: All plants in a group share the same strain genetics\n\n**Validation Rules:**\n- **Serial Number**: Must be unique across the facility for compliance tracking\n- **Plant Group**: Required for batch organization and cultivation management\n- **Strain Requirement**: Must provide strain when creating new plant groups\n- **Room Validation**: Room name must exist and be accessible when using integrations\n- **State Integration**: Room required unless bypassing external system integration\n\n**Common Use Cases:**\n- Register new clones or seedlings entering the cultivation facility\n- Create plant records for compliance tracking and regulatory reporting\n- Initialize plant tracking for cultivation workflow management\n- Support batch-based cultivation and harvest planning\n- Integrate with external cultivation and compliance systems\n\n**Performance & Limits:**\n- Single plant creation for precise record management\n- Immediate validation and unique identifier assignment\n- Optional integration with external cultivation systems\n- Efficient for individual plant registration workflows\n\n**Related Endpoints:**\n- `GET /plant` - Retrieve created plant information and status\n- `POST /plant/assign-plants-to-group` - Assign existing plants to groups\n- `POST /plant/move` - Move plants between cultivation rooms\n- Plant lifecycle management endpoints for complete workflow\n\n**Important Notes:**\n- **Unique Tracking**: Serial numbers must be unique for compliance and tracking\n- **Compliance Critical**: Plant registration is required for cannabis regulatory compliance\n- **Group Management**: Plant groups support batch-based cultivation workflows\n- **Integration**: External system integration supports cultivation management platforms\n- **Immediate Processing**: Plant creation is immediate with tracking system updates",
2158 "operationId": "PlantPost",
2159 "requestBody": {
2160 "description": "Plant creation request with identification and group details - see `CreatePlantRequest` model for complete field documentation",
2161 "content": {
2162 "application/json-patch+json": {
2163 "schema": {
2164 "$ref": "#/components/schemas/CreatePlantRequest"
2165 }
2166 },
2167 "application/json": {
2168 "schema": {
2169 "$ref": "#/components/schemas/CreatePlantRequest"
2170 }
2171 },
2172 "text/json": {
2173 "schema": {
2174 "$ref": "#/components/schemas/CreatePlantRequest"
2175 }
2176 },
2177 "application/*+json": {
2178 "schema": {
2179 "$ref": "#/components/schemas/CreatePlantRequest"
2180 }
2181 }
2182 },
2183 "x-bodyName": "request"
2184 },
2185 "responses": {
2186 "200": {
2187 "description": "Success - Returns newly created plant ID as integer",
2188 "content": {
2189 "application/json": {
2190 "schema": {
2191 "type": "integer",
2192 "format": "int32"
2193 }
2194 }
2195 }
2196 },
2197 "400": {
2198 "description": "Bad Request - Validation errors or duplicate serial number",
2199 "content": {
2200 "application/json": {
2201 "schema": {
2202 "type": "object"
2203 }
2204 }
2205 }
2206 },
2207 "401": {
2208 "description": "Invalid API Key"
2209 },
2210 "403": {
2211 "description": "Account not authorized"
2212 },
2213 "500": {
2214 "description": "Something went wrong."
2215 }
2216 }
2217 }
2218 },
2219 "/plant/harvest": {
2220 "post": {
2221 "tags": ["Plant"],
2222 "summary": "Harvest Plants",
2223 "description": "**Purpose:** Move plants from cultivation into harvest status with optional weight tracking for cannabis cultivation compliance and operational management.\n\n**Request Requirements:**\n- \"CultivationWrite\" role authorization required for plant harvest operations\n- `HarvestPlantRequest` object in request body with plant identifiers and harvest details\n- Content-Type: application/json\n- Rate limited to 300 requests per minute\n- All specified plants must be accessible to your location and in valid status for harvesting\n\n**Response Data:**\n- Response format: No response body (void)\n- Returns success confirmation (HTTP 200) upon successful harvest initiation\n- No response body content (void return)\n- Plants are moved to harvesting status immediately\n- Changes are reflected immediately in plant listings and cultivation tracking\n\n**Request Body Fields:**\n- Plant identifiers for the plants to be harvested\n- Optional wet weight measurements for harvest tracking\n- Harvest timing and operational details\n- Compliance and tracking information required for regulatory reporting\n\n**Harvest Operation Behavior:**\n- **Status Change**: Plants are moved from Active to Harvesting status\n- **Weight Tracking**: Optional wet weight can be recorded for yield tracking\n- **Bulk Processing**: Multiple plants can be harvested in a single operation\n- **Compliance**: All operations logged for regulatory compliance requirements\n- **Immediate Effect**: Status changes apply immediately to all specified plants\n\n**Common Use Cases:**\n- Initiate harvest operations for mature cannabis plants ready for processing\n- Record harvest timing and initial weight measurements for yield tracking\n- Maintain compliance with cannabis cultivation and harvest regulations\n- Support cultivation workflow transitions from growing to processing phases\n- Track harvest operations for operational efficiency and planning\n\n**Performance & Limits:**\n- Rate limited to 300 requests per minute for cultivation workflow protection\n- Bulk operation optimized for multiple plant processing\n- Immediate status updates and tracking system integration\n- Efficient for large-scale cultivation harvest operations\n\n**Related Endpoints:**\n- `GET /plant` - Retrieve plant records and current status\n- `POST /harvest` - Create harvest records for tracking and compliance\n- `GET /harvest` - Monitor harvest progress and completion status\n- Cultivation and inventory management endpoints for complete workflow\n\n**Important Notes:**\n- **Status Requirements**: Plants must be in Active status to be harvested\n- **Compliance Critical**: Harvest operations are required for cannabis regulatory compliance\n- **Weight Tracking**: Wet weight measurements support yield tracking and compliance\n- **Rate Limiting**: 300 requests per minute limit for cultivation workflow stability\n- **Immediate Processing**: Status changes are immediate and irreversible through this endpoint",
2224 "operationId": "PlantHarvestPost",
2225 "requestBody": {
2226 "description": "Plant harvest request with plant identifiers and optional weight data - HarvestPlantRequest object",
2227 "content": {
2228 "application/json-patch+json": {
2229 "schema": {
2230 "$ref": "#/components/schemas/HarvestPlantRequest"
2231 }
2232 },
2233 "application/json": {
2234 "schema": {
2235 "$ref": "#/components/schemas/HarvestPlantRequest"
2236 }
2237 },
2238 "text/json": {
2239 "schema": {
2240 "$ref": "#/components/schemas/HarvestPlantRequest"
2241 }
2242 },
2243 "application/*+json": {
2244 "schema": {
2245 "$ref": "#/components/schemas/HarvestPlantRequest"
2246 }
2247 }
2248 },
2249 "x-bodyName": "req"
2250 },
2251 "responses": {
2252 "200": {
2253 "description": "Success - Plants successfully moved to harvest status"
2254 },
2255 "401": {
2256 "description": "Invalid API Key"
2257 },
2258 "403": {
2259 "description": "Account not authorized"
2260 },
2261 "500": {
2262 "description": "Something went wrong."
2263 }
2264 }
2265 }
2266 },
2267 "/plant/move": {
2268 "post": {
2269 "tags": ["Plant"],
2270 "summary": "Move Plants",
2271 "description": "**Purpose:** Move cannabis plants to a different room or cultivation area within the same facility for cultivation workflow management and compliance tracking.\n\n**Request Requirements:**\n- \"CultivationWrite\" role authorization required for plant movement operations\n- `MovePlantRequest` object in request body with plant IDs and target room information\n- Content-Type: application/json\n- All specified plants must be accessible to your location and in moveable status\n- Target room must be within the same facility (location)\n\n**Response Data:**\n- Response format: No response body (void)\n- Returns success confirmation (HTTP 200) upon successful plant movement\n- No response body content (void return)\n- Plants are moved to new room immediately\n- Changes are reflected immediately in plant location tracking\n\n**Request Body Fields:**\n- `PlantIds`: Array of LeafLogix plant IDs to move (required)\n- `RoomId`: Target room ID within the same facility (required)\n- `TableId`: Optional table assignment within the target room\n\n**Movement Operation Behavior:**\n- **Location Validation**: Target room must belong to the same facility\n- **Bulk Processing**: Multiple plants can be moved in a single operation\n- **Stage Updates**: If target room has cultivation stage, plants automatically update to that stage\n- **Compliance**: All movement operations logged for regulatory compliance requirements\n- **Integration**: Movement synchronized with external cultivation systems when configured\n\n**Common Use Cases:**\n- Move plants between cultivation rooms as they progress through growth stages\n- Relocate plants for environmental optimization and cultivation management\n- Transfer plants to harvest preparation areas when ready for processing\n- Support cultivation workflow automation and plant lifecycle management\n- Maintain compliance with cannabis cultivation and tracking regulations\n\n**Performance & Limits:**\n- Bulk operation optimized for multiple plant processing\n- Immediate location updates and tracking system integration\n- Efficient for large-scale cultivation facility operations\n- Location validation prevents cross-facility security violations\n\n**Related Endpoints:**\n- `GET /plant` - Retrieve current plant locations and status\n- `POST /plant/change-phase` - Update growth phases when moving between rooms\n- `GET /room` - List available rooms for plant movement planning\n- Cultivation management endpoints for complete workflow\n\n**Important Notes:**\n- **Facility Restriction**: Plants cannot be moved to rooms in different facilities\n- **Compliance Critical**: Plant movements are required for cannabis regulatory compliance\n- **Stage Automation**: Room-specific cultivation stages applied automatically when configured\n- **Immediate Processing**: Location changes are immediate and tracked for audit purposes\n- **Integration**: Movement synchronized with external cultivation and compliance systems",
2272 "operationId": "PlantMovePost",
2273 "requestBody": {
2274 "description": "Plant movement request with plant IDs and target room information - see `MovePlantRequest` model for complete field documentation",
2275 "content": {
2276 "application/json-patch+json": {
2277 "schema": {
2278 "$ref": "#/components/schemas/MovePlantRequest"
2279 }
2280 },
2281 "application/json": {
2282 "schema": {
2283 "$ref": "#/components/schemas/MovePlantRequest"
2284 }
2285 },
2286 "text/json": {
2287 "schema": {
2288 "$ref": "#/components/schemas/MovePlantRequest"
2289 }
2290 },
2291 "application/*+json": {
2292 "schema": {
2293 "$ref": "#/components/schemas/MovePlantRequest"
2294 }
2295 }
2296 },
2297 "x-bodyName": "req"
2298 },
2299 "responses": {
2300 "200": {
2301 "description": "Success - Plants successfully moved to target room"
2302 },
2303 "400": {
2304 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)"
2305 },
2306 "401": {
2307 "description": "Invalid API Key"
2308 },
2309 "403": {
2310 "description": "Account not authorized"
2311 },
2312 "500": {
2313 "description": "Something went wrong."
2314 }
2315 }
2316 }
2317 },
2318 "/plant/change-phase": {
2319 "post": {
2320 "tags": ["Plant"],
2321 "summary": "Change Plants Growth Phase",
2322 "description": "**Purpose:** Update the cultivation growth phase of cannabis plants to track their development stage and optimize cultivation management.\n\n**Request Requirements:**\n- \"CultivationWrite\" role authorization required for plant growth phase operations\n- `ChangeGrowthPhaseRequest` object in request body with plant IDs and growth phase information\n- Content-Type: application/json\n- All specified plants must be accessible to your location and in valid status for phase changes\n- Growth phase must be one of the valid phase values\n\n**Response Data:**\n- Response format: No response body (void)\n- Returns success confirmation (HTTP 200) upon successful phase change\n- No response body content (void return)\n- Plants are updated to new growth phase immediately\n- Changes are reflected immediately in plant cultivation tracking\n\n**Request Body Fields:**\n- `PlantIds`: Array of LeafLogix plant IDs to update (required)\n- `GrowthPhase`: Target cultivation phase - must be one of: `Vegetative`, `Propagation`, `Flowering` (required)\n- `PhaseStartDate`: Date when new phase begins - defaults to current UTC time if omitted (optional)\n\n**Growth Phase Values:**\n- **Propagation**: Initial plant development and cloning phase\n- **Vegetative**: Active vegetative growth before flowering initiation\n- **Flowering**: Reproductive growth phase leading to harvest\n\n**Phase Change Operation Behavior:**\n- **Phase Validation**: Growth phase value validated against allowed phases\n- **Bulk Processing**: Multiple plants can be updated in a single operation\n- **Date Management**: Phase start date defaults to current time if not specified\n- **Compliance**: All phase changes logged for regulatory compliance requirements\n- **Integration**: Phase updates synchronized with external cultivation systems when configured\n\n**Common Use Cases:**\n- Transition plants from vegetative to flowering phase for harvest timing\n- Update plant phases during cultivation workflow automation\n- Maintain accurate cultivation records for compliance reporting\n- Support cultivation planning and scheduling optimization\n- Synchronize growth phases with environmental control systems\n\n**Performance & Limits:**\n- Bulk operation optimized for multiple plant processing\n- Immediate phase updates and tracking system integration\n- Efficient for large-scale cultivation facility operations\n- Phase validation prevents invalid cultivation state transitions\n\n**Related Endpoints:**\n- `GET /plant` - Retrieve current plant phases and cultivation status\n- `POST /plant/move` - Move plants between rooms optimized for different phases\n- `POST /plant/harvest` - Harvest plants when flowering phase is complete\n- Cultivation management endpoints for complete workflow\n\n**Important Notes:**\n- **Phase Validation**: Only `Vegetative`, `Propagation`, and `Flowering` phases are accepted\n- **Compliance Critical**: Phase tracking is required for cannabis regulatory compliance\n- **Date Tracking**: Phase start dates support cultivation timeline management\n- **Immediate Processing**: Phase changes are immediate and tracked for audit purposes\n- **Integration**: Phase updates synchronized with external cultivation and compliance systems",
2323 "operationId": "PlantChange-phasePost",
2324 "requestBody": {
2325 "description": "Growth phase change request with plant IDs and target phase information - see `ChangeGrowthPhaseRequest` model for complete field documentation",
2326 "content": {
2327 "application/json-patch+json": {
2328 "schema": {
2329 "$ref": "#/components/schemas/ChangeGrowthPhaseRequest"
2330 }
2331 },
2332 "application/json": {
2333 "schema": {
2334 "$ref": "#/components/schemas/ChangeGrowthPhaseRequest"
2335 }
2336 },
2337 "text/json": {
2338 "schema": {
2339 "$ref": "#/components/schemas/ChangeGrowthPhaseRequest"
2340 }
2341 },
2342 "application/*+json": {
2343 "schema": {
2344 "$ref": "#/components/schemas/ChangeGrowthPhaseRequest"
2345 }
2346 }
2347 },
2348 "x-bodyName": "req"
2349 },
2350 "responses": {
2351 "200": {
2352 "description": "Success - Plants successfully updated to new growth phase"
2353 },
2354 "400": {
2355 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)"
2356 },
2357 "401": {
2358 "description": "Invalid API Key"
2359 },
2360 "403": {
2361 "description": "Account not authorized"
2362 },
2363 "500": {
2364 "description": "Something went wrong."
2365 }
2366 }
2367 }
2368 },
2369 "/plant/retire": {
2370 "post": {
2371 "tags": ["Plant"],
2372 "summary": "Retire Plants",
2373 "description": "**Purpose:** Permanently retire cannabis plants from cultivation due to various reasons such as disease, damage, or end-of-life for compliance tracking and waste management.\n\n**Request Requirements:**\n- \"CultivationWrite\" role authorization required for plant retirement operations\n- `RetirePlantRequest` object in request body with plant IDs and retirement details\n- Content-Type: application/json\n- Rate limited to 300 requests per minute\n- All specified plants must be accessible to your location and in retirable status\n- Either `ReasonId` or `ReasonCode` must be provided for retirement justification\n\n**Response Data:**\n- Response format: No response body (void)\n- Returns success confirmation (HTTP 200) upon successful plant retirement\n- No response body content (void return)\n- Plants are permanently retired from cultivation immediately\n- Changes are reflected immediately in plant status and compliance tracking\n\n**Request Body Fields:**\n- `PlantIds`: Array of LeafLogix plant IDs to retire (required)\n- `ReasonId`: Numeric reason ID for retirement - use if known (optional if ReasonCode provided)\n- `ReasonCode`: String reason code for retirement - use if ReasonId unknown (optional if ReasonId provided)\n- `RoomId`: Room where retirement occurs for waste tracking (required)\n- `WasteType`: Type of waste generated from retirement (optional)\n- `WasteWeight`: Weight of waste material in specified units (optional)\n- `PlantWeight`: Weight of plant material being retired (optional)\n- `WasteDate`: Date of waste generation for compliance tracking (optional)\n- Additional waste tracking and compliance fields\n\n**Reason Code Management:**\n- **ReasonId Priority**: If both ReasonId and ReasonCode provided, ReasonId takes precedence\n- **Code Lookup**: ReasonCode automatically looked up to find corresponding ReasonId\n- **Validation**: Invalid ReasonId or ReasonCode will result in 400 Bad Request response\n- **Flexibility**: Use ReasonCode when integrating without pre-knowledge of reason IDs\n\n**Retirement Operation Behavior:**\n- **Permanent Action**: Plant retirement is irreversible once completed\n- **Bulk Processing**: Multiple plants can be retired in a single operation\n- **Waste Tracking**: Optional waste weight and material tracking for compliance\n- **Compliance**: All retirement operations logged for regulatory compliance requirements\n- **Integration**: Retirement synchronized with external cultivation and waste tracking systems\n\n**Common Use Cases:**\n- Retire diseased or damaged plants to prevent contamination spread\n- Remove plants that have reached end-of-life or failed quality standards\n- Comply with regulatory requirements for plant destruction documentation\n- Manage cultivation space by removing non-productive plants\n- Support waste tracking and disposal compliance reporting\n\n**Performance & Limits:**\n- Rate limited to 300 requests per minute for cultivation workflow protection\n- Bulk operation optimized for multiple plant processing\n- Immediate retirement status updates and tracking system integration\n- Efficient for large-scale cultivation facility operations\n\n**Related Endpoints:**\n- `GET /plant` - Retrieve current plant status before retirement\n- `GET /plant/get-reason-codes` - List available retirement reason codes\n- `POST /waste` - Create waste records for retired plant material\n- Cultivation and compliance management endpoints\n\n**Important Notes:**\n- **Irreversible Action**: Plant retirement cannot be undone once completed\n- **Reason Required**: Either ReasonId or ReasonCode must be provided for compliance\n- **Compliance Critical**: Retirement tracking is required for cannabis regulatory compliance\n- **Rate Limiting**: 300 requests per minute limit for cultivation workflow stability\n- **Waste Integration**: Retirement can generate waste records for disposal tracking",
2374 "operationId": "PlantRetirePost",
2375 "requestBody": {
2376 "description": "Plant retirement request with plant IDs, reason codes, and waste tracking details - see `RetirePlantRequest` model for complete field documentation",
2377 "content": {
2378 "application/json-patch+json": {
2379 "schema": {
2380 "$ref": "#/components/schemas/RetirePlantRequest"
2381 }
2382 },
2383 "application/json": {
2384 "schema": {
2385 "$ref": "#/components/schemas/RetirePlantRequest"
2386 }
2387 },
2388 "text/json": {
2389 "schema": {
2390 "$ref": "#/components/schemas/RetirePlantRequest"
2391 }
2392 },
2393 "application/*+json": {
2394 "schema": {
2395 "$ref": "#/components/schemas/RetirePlantRequest"
2396 }
2397 }
2398 },
2399 "x-bodyName": "req"
2400 },
2401 "responses": {
2402 "200": {
2403 "description": "Success - Plants successfully retired from cultivation"
2404 },
2405 "400": {
2406 "description": "Bad Request - Invalid reason ID/code or validation errors",
2407 "content": {
2408 "application/json": {
2409 "schema": {
2410 "$ref": "#/components/schemas/BadRequestResponse"
2411 }
2412 }
2413 }
2414 },
2415 "401": {
2416 "description": "Invalid API Key"
2417 },
2418 "403": {
2419 "description": "Account not authorized"
2420 },
2421 "500": {
2422 "description": "Something went wrong."
2423 }
2424 }
2425 }
2426 },
2427 "/plant/get-reason-codes": {
2428 "get": {
2429 "tags": ["Plant"],
2430 "summary": "Get Plant Reason Codes",
2431 "description": "**Purpose:** Retrieve the list of valid reason codes for cannabis plant retirement operations to support compliance documentation and proper retirement categorization.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for plant data access\n- No query parameters or request body needed\n\n**Response Data:**\n- Response format: `[string, string, ...]`\n- Returns array of string reason codes for plant retirement\n- Array typically contains 5-20 reason codes depending on organization configuration\n- Returns empty array `[]` if no reason codes configured (rare)\n- Reason codes are organization-specific and configurable by administrators\n- Results automatically filtered to authenticated organization\n\n**Common Reason Code Examples:**\n- Disease or pest infestation requiring plant destruction\n- Physical damage or environmental stress failures\n- Quality control failures or contamination issues\n- End-of-life or harvest completion scenarios\n- Regulatory compliance or audit requirements\n\n**Common Use Cases:**\n- Populate reason code dropdown lists in plant retirement forms\n- Validate reason codes before submitting plant retirement requests\n- Generate compliance reports showing retirement reasons and frequencies\n- Support cultivation management workflows with proper retirement categorization\n- Maintain audit trails for regulatory compliance and operational analysis\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Small dataset suitable for client-side caching\n- No pagination needed due to manageable reason code catalog sizes\n- Results filtered to organization-specific reason configurations\n\n**Related Endpoints:**\n- `POST /plant/retire` - Retire plants using these reason codes for compliance\n- `GET /plant` - Retrieve plant status before determining retirement reasons\n- Plant lifecycle and cultivation management endpoints\n\n**Important Notes:**\n- **Organization-Specific**: Reason codes vary by organization and compliance requirements\n- **Compliance Required**: Proper reason codes are essential for cannabis regulatory compliance\n- **Validation**: Use these codes to validate retirement requests before submission\n- **Reference Data**: Cache locally for performance in plant retirement workflows\n- **Administrative**: Reason codes are configured by system administrators",
2432 "operationId": "PlantGet-reason-codesGet",
2433 "responses": {
2434 "200": {
2435 "description": "Success - Returns array of reason code strings: `[string, ...]`",
2436 "content": {
2437 "application/json": {
2438 "schema": {
2439 "type": "array",
2440 "items": {
2441 "type": "string"
2442 }
2443 }
2444 }
2445 }
2446 },
2447 "401": {
2448 "description": "Invalid API Key"
2449 },
2450 "403": {
2451 "description": "Account not authorized"
2452 },
2453 "500": {
2454 "description": "Something went wrong."
2455 }
2456 }
2457 }
2458 },
2459 "/plant/assign-plants-to-group": {
2460 "post": {
2461 "tags": ["Plant"],
2462 "summary": "Assign Plants to Group",
2463 "description": "**Purpose:** Assign existing cannabis plants to a specific plant group for batch management and cultivation workflow organization using plant serial numbers.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for plant group management operations\n- `AssignPlantsToGroupRequest` object in request body with group name and plant serial numbers\n- Content-Type: application/json\n- All specified plant serial numbers must exist and be accessible to your location\n- Target plant group must exist within the facility\n\n**Response Data:**\n- Response format: No response body (void)\n- Returns success confirmation (HTTP 200) upon successful plant assignment\n- No response body content (void return)\n- Plants are assigned to target group immediately\n- Changes are reflected immediately in plant group organization and batch tracking\n\n**Request Body Fields:**\n- `PlantGroupName`: Name of target plant group for batch organization (required)\n- `PlantSerialNumbers`: Array of plant serial numbers to assign to the group (required)\n\n**Plant Group Assignment Behavior:**\n- **Batch Organization**: Plants assigned to groups for batch-based cultivation tracking\n- **Serial Number Lookup**: Plants identified by serial numbers for precise assignment\n- **Group Validation**: Target plant group must exist before assignment\n- **Bulk Processing**: Multiple plants can be assigned to the same group in a single operation\n- **Immediate Processing**: Group assignments are immediate and tracked for compliance\n\n**Validation Rules:**\n- **Plant Existence**: All serial numbers must correspond to existing plants\n- **Location Access**: Plants must be accessible to the authenticated location\n- **Group Existence**: Target plant group must exist within the facility\n- **Serial Number Format**: Serial numbers must match existing plant tracking identifiers\n\n**Common Use Cases:**\n- Reorganize plants into batch groups for cultivation workflow management\n- Assign newly created plants to existing cultivation batches\n- Support batch-based harvest planning and cultivation scheduling\n- Maintain proper plant group organization for compliance reporting\n- Facilitate cultivation management and operational efficiency\n\n**Performance & Limits:**\n- Bulk operation optimized for multiple plant assignment\n- Immediate group assignment and tracking system integration\n- Efficient for cultivation workflow organization and batch management\n- Serial number validation ensures accurate plant identification\n\n**Related Endpoints:**\n- `GET /plant` - Retrieve current plant group assignments and status\n- `POST /plant` - Create new plants that can be assigned to groups\n- Plant group and cultivation management endpoints for complete workflow\n\n**Important Notes:**\n- **Batch Management**: Plant groups enable batch-based cultivation tracking and compliance\n- **Serial Number Precision**: Use exact serial numbers for accurate plant identification\n- **Compliance Support**: Proper group organization supports regulatory compliance requirements\n- **Immediate Processing**: Group assignments are immediate and tracked for audit purposes\n- **Workflow Integration**: Supports cultivation management and harvest planning workflows",
2464 "operationId": "PlantAssign-plants-to-groupPost",
2465 "requestBody": {
2466 "description": "Plant group assignment request with group name and plant serial numbers - see `AssignPlantsToGroupRequest` model for complete field documentation",
2467 "content": {
2468 "application/json-patch+json": {
2469 "schema": {
2470 "$ref": "#/components/schemas/AssignPlantsToGroupRequest"
2471 }
2472 },
2473 "application/json": {
2474 "schema": {
2475 "$ref": "#/components/schemas/AssignPlantsToGroupRequest"
2476 }
2477 },
2478 "text/json": {
2479 "schema": {
2480 "$ref": "#/components/schemas/AssignPlantsToGroupRequest"
2481 }
2482 },
2483 "application/*+json": {
2484 "schema": {
2485 "$ref": "#/components/schemas/AssignPlantsToGroupRequest"
2486 }
2487 }
2488 },
2489 "x-bodyName": "request"
2490 },
2491 "responses": {
2492 "200": {
2493 "description": "Success - Plants successfully assigned to target group"
2494 },
2495 "400": {
2496 "description": "Bad Request - Validation errors or invalid plant serial numbers",
2497 "content": {
2498 "application/json": {
2499 "schema": {
2500 "$ref": "#/components/schemas/BadRequestResponse"
2501 }
2502 }
2503 }
2504 },
2505 "401": {
2506 "description": "Invalid API Key"
2507 },
2508 "403": {
2509 "description": "Account not authorized"
2510 },
2511 "500": {
2512 "description": "Something went wrong."
2513 }
2514 }
2515 }
2516 },
2517 "/plant/nonsts/update": {
2518 "post": {
2519 "tags": ["PlantNonsts"],
2520 "summary": "Update Existing Plants (Non-State Tracking)",
2521 "description": "**Purpose:** Update existing plant records with cultivation data without reporting to state traceability systems for internal plant management.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for plant data modification\n- `UpdatePlantsRequest` object in request body with plant update details\n- Content-Type: application/json\n- Valid PlantId required for each plant to be updated\n- Feature flag \"rollout.trym-integration\" must be enabled\n\n**Response Data:**\n- Returns single `SuccessResult` object (not array) with operation confirmation\n- Includes success message confirming plants were updated\n- Operation status and any relevant update information\n\n**Sparse Update Behavior:**\n- **Null/Empty/Omitted Fields**: Will NOT have their data updated (preserves existing values)\n- **Provided Fields**: Only fields with values in the request will be updated\n- **Field Independence**: Each field can be updated independently without affecting others\n- **Safe Updates**: Omitted fields maintain their current database values\n\n**Non-State Tracking (NONSTS) Behavior:**\n- **Internal Only**: Updates are for internal cultivation tracking only\n- **No External Reporting**: Changes are NOT reported to state traceability systems\n- **Cultivation Focus**: Designed for internal plant management and cultivation workflows\n- **Compliance Safe**: Does not interfere with official state tracking requirements\n\n**Common Use Cases:**\n- Update internal plant cultivation notes and observations\n- Modify plant growth stage information for internal tracking\n- Update plant location within cultivation facility\n- Record internal plant health and development data\n- Maintain cultivation workflow information without state system updates\n\n**Performance & Limits:**\n- Batch plant updates for efficient cultivation management\n- Validation performed before any changes to ensure data integrity\n- Changes reflected immediately in internal cultivation systems\n- Optimized for cultivation facility management workflows\n\n**Related Endpoints:**\n- `GET /plant` - Retrieve current plant data before updates\n- `POST /plant/nonsts` - Create new plants for internal tracking\n- `POST /plant/harvest` - Official plant harvest operations (state tracked)\n\n**Important Notes:**\n- **Feature Gated**: Requires \"rollout.trym-integration\" feature flag to be enabled\n- **Internal Tracking**: Updates are for internal cultivation management only\n- **State Compliance**: Does not affect official state traceability system records\n- **Validation Required**: Plant IDs must exist and be valid for the location\n- **Cultivation Focus**: Designed specifically for cultivation facility workflows",
2522 "operationId": "PlantNonstsUpdatePost",
2523 "requestBody": {
2524 "description": "Plant update request with PlantId and field updates - UpdatePlantsRequest object",
2525 "content": {
2526 "application/json-patch+json": {
2527 "schema": {
2528 "$ref": "#/components/schemas/UpdatePlantsRequest"
2529 }
2530 },
2531 "application/json": {
2532 "schema": {
2533 "$ref": "#/components/schemas/UpdatePlantsRequest"
2534 }
2535 },
2536 "text/json": {
2537 "schema": {
2538 "$ref": "#/components/schemas/UpdatePlantsRequest"
2539 }
2540 },
2541 "application/*+json": {
2542 "schema": {
2543 "$ref": "#/components/schemas/UpdatePlantsRequest"
2544 }
2545 }
2546 },
2547 "x-bodyName": "request"
2548 },
2549 "responses": {
2550 "200": {
2551 "description": "Success",
2552 "content": {
2553 "application/json": {
2554 "schema": {
2555 "$ref": "#/components/schemas/SuccessResult"
2556 }
2557 }
2558 }
2559 },
2560 "400": {
2561 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
2562 "content": {
2563 "application/json": {
2564 "schema": {
2565 "$ref": "#/components/schemas/BadRequestResponse"
2566 }
2567 }
2568 }
2569 },
2570 "401": {
2571 "description": "Invalid API Key"
2572 },
2573 "403": {
2574 "description": "Account not authorized"
2575 },
2576 "500": {
2577 "description": "Something went wrong."
2578 }
2579 }
2580 }
2581 },
2582 "/plant/nonsts/batch/immatureplants": {
2583 "post": {
2584 "tags": ["PlantNonsts"],
2585 "summary": "Create Immature Plant Batch (Non-State Tracking)",
2586 "description": "**Purpose:** Create a batch of immature plants for internal cultivation tracking without reporting to state traceability systems.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for plant creation\n- `PostImmatureBatchRequest` object in request body with batch details\n- Content-Type: application/json\n- Valid plant data for each immature plant in the batch\n- Feature flag \"rollout.trym-integration\" must be enabled\n\n**Response Data:**\n- Returns single `ApiResult<CreateImmatureBatchResponse>` object (not array) with creation results\n- Includes array of created plant IDs for tracking and reference\n- Batch creation status and success confirmation\n- Plant ID assignments for newly created immature plants\n\n**Batch Creation Process:**\n- **Multiple Plants**: Creates multiple immature plants in a single operation\n- **ID Assignment**: Each plant receives a unique PlantId for future operations\n- **Validation**: All plant data validated before batch creation\n- **Atomic Operation**: Batch succeeds or fails as a complete unit\n\n**Non-State Tracking (NONSTS) Behavior:**\n- **Internal Only**: Plant creation for internal cultivation tracking only\n- **No External Reporting**: Plant creation NOT transmitted to state traceability systems\n- **Cultivation Focus**: Designed for internal plant management and cultivation workflows\n- **Compliance Safe**: Does not interfere with official state tracking requirements\n\n**Immature Plant Characteristics:**\n- **Growth Stage**: Plants in early vegetative or seedling stage\n- **Tracking Ready**: Created with unique identifiers for cultivation tracking\n- **Development Phase**: Pre-flowering plants requiring cultivation management\n- **Internal Records**: Maintained in internal cultivation systems only\n\n**Common Use Cases:**\n- Create batches of seedlings for internal cultivation tracking\n- Initialize plant records for new cultivation cycles\n- Set up immature plant inventory for facility management\n- Start cultivation workflows without state system integration\n- Manage internal plant genetics and breeding programs\n\n**Performance & Limits:**\n- Batch processing for efficient plant creation workflows\n- Validation performed before any plant creation\n- Changes reflected immediately in internal cultivation systems\n- Optimized for cultivation facility startup and expansion workflows\n\n**Related Endpoints:**\n- `POST /plant/nonsts/update` - Update created plants with cultivation data\n- `GET /plant` - Retrieve created plant information\n- `POST /plant/harvest` - Official plant harvest operations (state tracked)\n\n**Important Notes:**\n- **Feature Gated**: Requires \"rollout.trym-integration\" feature flag to be enabled\n- **Plant IDs Returned**: Save returned plant IDs for future plant management operations\n- **Internal Tracking**: Plants created for internal cultivation management only\n- **State Compliance**: Does not affect official state traceability system records\n- **Batch Efficiency**: Creates multiple plants efficiently in single operation",
2587 "operationId": "PlantNonstsBatchImmatureplantsPost",
2588 "requestBody": {
2589 "description": "Immature plant batch request with plant details - PostImmatureBatchRequest object",
2590 "content": {
2591 "application/json-patch+json": {
2592 "schema": {
2593 "$ref": "#/components/schemas/PostImmatureBatchRequest"
2594 }
2595 },
2596 "application/json": {
2597 "schema": {
2598 "$ref": "#/components/schemas/PostImmatureBatchRequest"
2599 }
2600 },
2601 "text/json": {
2602 "schema": {
2603 "$ref": "#/components/schemas/PostImmatureBatchRequest"
2604 }
2605 },
2606 "application/*+json": {
2607 "schema": {
2608 "$ref": "#/components/schemas/PostImmatureBatchRequest"
2609 }
2610 }
2611 },
2612 "x-bodyName": "request"
2613 },
2614 "responses": {
2615 "200": {
2616 "description": "Success",
2617 "content": {
2618 "application/json": {
2619 "schema": {
2620 "$ref": "#/components/schemas/CreateImmaturePlantBatchResponseApiResult"
2621 }
2622 }
2623 }
2624 },
2625 "400": {
2626 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
2627 "content": {
2628 "application/json": {
2629 "schema": {
2630 "$ref": "#/components/schemas/BadRequestResponse"
2631 }
2632 }
2633 }
2634 },
2635 "401": {
2636 "description": "Invalid API Key"
2637 },
2638 "403": {
2639 "description": "Account not authorized"
2640 },
2641 "500": {
2642 "description": "Something went wrong."
2643 }
2644 }
2645 }
2646 },
2647 "/plant/nonsts/batch/convert/immatureplants": {
2648 "post": {
2649 "tags": ["PlantNonsts"],
2650 "summary": "Convert Immature Plant Batch to Mature (Non-State Tracking)",
2651 "description": "**Purpose:** Convert immature plant batches to mature plant status for internal cultivation tracking without reporting to state traceability systems.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for plant conversion\n- `ConvertImmatureBatchRequest` object in request body with conversion details\n- Content-Type: application/json\n- Valid immature batch data for conversion to mature plants\n- Feature flag \"rollout.trym-integration\" must be enabled\n\n**Response Data:**\n- Returns single `ApiResult<ConvertImmaturePlantResponse>` object (not array) with conversion results\n- Includes array of converted plant IDs for tracking and reference\n- Plant conversion status and success confirmation\n- Mature plant ID assignments for newly converted plants\n\n**Plant Conversion Process:**\n- **Status Transition**: Converts immature plants to mature plant status\n- **ID Retention**: Existing plant IDs maintained through conversion process\n- **Validation**: All conversion data validated before processing\n- **Batch Processing**: Multiple immature plants converted in single operation\n\n**Non-State Tracking (NONSTS) Behavior:**\n- **Internal Only**: Plant creation for internal cultivation tracking only\n- **No External Reporting**: Plant conversion NOT transmitted to state traceability systems\n- **Cultivation Focus**: Designed for internal plant management and cultivation workflows\n- **Compliance Safe**: Does not interfere with official state tracking requirements\n\n**Maturity Transition:**\n- **Growth Stage**: Immature to mature plant status transition\n- **Cultivation Ready**: Mature plants ready for flowering phase management\n- **Tracking Continuity**: Maintains plant tracking through maturity transition\n- **Workflow Integration**: Supports cultivation facility growth phase workflows\n\n**Common Use Cases:**\n- Convert vegetative plants to mature flowering status\n- Transition immature batches to mature cultivation phases\n- Progress plants through cultivation development stages\n- Support internal cultivation workflow maturity management\n- Manage plant lifecycle transitions without state system integration\n\n**Performance & Limits:**\n- Efficient plant conversion for cultivation management\n- Validation performed before any plant conversion\n- Changes reflected immediately in internal cultivation systems\n- Optimized for cultivation facility maturity workflows\n\n**Related Endpoints:**\n- `POST /plant/nonsts/update` - Update converted plants with cultivation data\n- `GET /plant` - Retrieve converted plant information\n- `POST /plant/harvest` - Official plant harvest operations (state tracked)\n\n**Important Notes:**\n- **Feature Gated**: Requires \"rollout.trym-integration\" feature flag to be enabled\n- **Plant IDs Returned**: Save returned plant IDs for future plant management operations\n- **Internal Tracking**: Plants converted for internal cultivation management only\n- **State Compliance**: Does not affect official state traceability system records\n- **Cultivation Ready**: Mature plants ready for internal cultivation tracking workflows",
2652 "operationId": "PlantNonstsBatchConvertImmatureplantsPost",
2653 "requestBody": {
2654 "description": "Immature batch conversion request with conversion details - ConvertImmatureBatchRequest object",
2655 "content": {
2656 "application/json-patch+json": {
2657 "schema": {
2658 "$ref": "#/components/schemas/ConvertImmatureBatchRequest"
2659 }
2660 },
2661 "application/json": {
2662 "schema": {
2663 "$ref": "#/components/schemas/ConvertImmatureBatchRequest"
2664 }
2665 },
2666 "text/json": {
2667 "schema": {
2668 "$ref": "#/components/schemas/ConvertImmatureBatchRequest"
2669 }
2670 },
2671 "application/*+json": {
2672 "schema": {
2673 "$ref": "#/components/schemas/ConvertImmatureBatchRequest"
2674 }
2675 }
2676 },
2677 "x-bodyName": "request"
2678 },
2679 "responses": {
2680 "200": {
2681 "description": "Success",
2682 "content": {
2683 "application/json": {
2684 "schema": {
2685 "$ref": "#/components/schemas/ConvertImmaturePlantResponseApiResult"
2686 }
2687 }
2688 }
2689 },
2690 "400": {
2691 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
2692 "content": {
2693 "application/json": {
2694 "schema": {
2695 "$ref": "#/components/schemas/BadRequestResponse"
2696 }
2697 }
2698 }
2699 },
2700 "401": {
2701 "description": "Invalid API Key"
2702 },
2703 "403": {
2704 "description": "Account not authorized"
2705 },
2706 "500": {
2707 "description": "Something went wrong."
2708 }
2709 }
2710 }
2711 },
2712 "/plant/nonsts/batch/matureplants": {
2713 "post": {
2714 "tags": ["PlantNonsts"],
2715 "summary": "Create Mature Plant Batch (Non-State Tracking)",
2716 "description": "**Purpose:** Create a batch of mature plants ready for flowering phase cultivation tracking without reporting to state traceability systems.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for mature plant creation\n- `CreateMatureBatchRequest` object in request body with mature plant batch details\n- Content-Type: application/json\n- Valid mature plant data for each plant in the batch\n- Feature flag \"rollout.trym-integration\" must be enabled\n\n**Response Data:**\n- Returns single `ApiResult<CreateMaturePlantsResponse>` object (not array) with creation results\n- Includes array of created plant IDs for tracking and reference\n- Batch creation status and success confirmation\n- Plant ID assignments for newly created mature plants\n\n**Mature Plant Batch Creation:**\n- **Multiple Plants**: Creates multiple mature plants in a single operation\n- **Flowering Ready**: Plants created at mature stage ready for flowering phase\n- **ID Assignment**: Each plant receives a unique PlantId for future operations\n- **Validation**: All plant data validated before batch creation\n- **Atomic Operation**: Batch succeeds or fails as a complete unit\n\n**Non-State Tracking (NONSTS) Behavior:**\n- **Internal Only**: Plant creation for internal cultivation tracking only\n- **No External Reporting**: Plant creation NOT transmitted to state traceability systems\n- **Cultivation Focus**: Designed for internal mature plant management and flowering workflows\n- **Compliance Safe**: Does not interfere with official state tracking requirements\n\n**Mature Plant Characteristics:**\n- **Growth Stage**: Plants ready for flowering phase cultivation\n- **Cultivation Ready**: Created with unique identifiers for flowering management\n- **Production Phase**: Mature plants prepared for harvest cultivation workflows\n- **Internal Records**: Maintained in internal cultivation systems only\n\n**Common Use Cases:**\n- Create batches of mature plants for flowering room management\n- Initialize mature plant inventory for production cycles\n- Set up flowering phase plant tracking for facility management\n- Start mature cultivation workflows without state system integration\n- Manage internal mature plant genetics and production programs\n\n**Performance & Limits:**\n- Batch processing for efficient mature plant creation workflows\n- Validation performed before any plant creation\n- Changes reflected immediately in internal cultivation systems\n- Optimized for cultivation facility flowering phase workflows\n\n**Related Endpoints:**\n- `POST /plant/nonsts/update` - Update created mature plants with cultivation data\n- `POST /plant/nonsts/batch/immatureplants` - Create immature plant batches\n- `POST /plant/nonsts/batch/convert/immatureplants` - Convert immature to mature plants\n- `GET /plant` - Retrieve created mature plant information\n- `POST /plant/harvest` - Official plant harvest operations (state tracked)\n\n**Important Notes:**\n- **Feature Gated**: Requires \"rollout.trym-integration\" feature flag to be enabled\n- **Plant IDs Returned**: Save returned plant IDs for future mature plant management operations\n- **Internal Tracking**: Plants created for internal cultivation management only\n- **State Compliance**: Does not affect official state traceability system records\n- **Flowering Ready**: Mature plants ready for flowering phase cultivation workflows\n- **Batch Efficiency**: Creates multiple mature plants efficiently in single operation",
2717 "operationId": "PlantNonstsBatchMatureplantsPost",
2718 "requestBody": {
2719 "description": "Mature plant batch request with plant details - CreateMatureBatchRequest object",
2720 "content": {
2721 "application/json-patch+json": {
2722 "schema": {
2723 "$ref": "#/components/schemas/CreateMatureBatchRequest"
2724 }
2725 },
2726 "application/json": {
2727 "schema": {
2728 "$ref": "#/components/schemas/CreateMatureBatchRequest"
2729 }
2730 },
2731 "text/json": {
2732 "schema": {
2733 "$ref": "#/components/schemas/CreateMatureBatchRequest"
2734 }
2735 },
2736 "application/*+json": {
2737 "schema": {
2738 "$ref": "#/components/schemas/CreateMatureBatchRequest"
2739 }
2740 }
2741 },
2742 "x-bodyName": "request"
2743 },
2744 "responses": {
2745 "200": {
2746 "description": "Success - Returns ApiResult<CreateMaturePlantsResponse> with created plant IDs: `{ \"data\": { \"createdPlants\": [plantId1, plantId2, ...] }, \"message\": \"Successfully created mature plants from batches.\", \"success\": true }`",
2747 "content": {
2748 "application/json": {
2749 "schema": {
2750 "$ref": "#/components/schemas/CreateMaturePlantsResponseApiResult"
2751 }
2752 }
2753 }
2754 },
2755 "400": {
2756 "description": "Bad Request - Validation failed or invalid request data",
2757 "content": {
2758 "application/json": {
2759 "schema": {
2760 "$ref": "#/components/schemas/BadRequestResponse"
2761 }
2762 }
2763 }
2764 },
2765 "401": {
2766 "description": "Unauthorized - Invalid or missing API key"
2767 },
2768 "403": {
2769 "description": "Forbidden - Account not authorized for mature plant creation or feature flag disabled"
2770 },
2771 "500": {
2772 "description": "Internal Server Error - Server error occurred"
2773 }
2774 }
2775 }
2776 },
2777 "/plant/nonsts/retag": {
2778 "post": {
2779 "tags": ["PlantNonsts"],
2780 "summary": "Retag Plant or Clone (Non-State Tracking)",
2781 "description": "**Purpose:** Update plant or clone tag identification for internal cultivation tracking without reporting to state traceability systems.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for plant retagging\n- `RetagPlantRequest` object in request body with retagging details\n- Content-Type: application/json\n- Valid existing plant identification and new tag information\n- Feature flag \"rollout.trym-integration\" must be enabled\n\n**Response Data:**\n- Returns HTTP 200 with no response body on success\n- No data returned - operation confirmation only\n- Operation status confirms successful retagging completion\n\n**Retagging Process:**\n- **Tag Replacement**: Updates existing plant tag with new identification\n- **Plant Identification**: Maintains plant record while updating tag reference\n- **Validation**: Ensures new tag is unique and valid for the facility\n- **Immediate Update**: Tag change reflected immediately in cultivation systems\n\n**Non-State Tracking (NONSTS) Behavior:**\n- **Internal Only**: Tag updates for internal cultivation tracking only\n- **No External Reporting**: Retagging NOT transmitted to state traceability systems\n- **Cultivation Focus**: Designed for internal plant management and tag organization\n- **Compliance Safe**: Does not interfere with official state tracking requirements\n\n**Retagging Applications:**\n- **Tag Damage**: Replace damaged or unreadable plant tags\n- **Organization**: Update tag numbering for facility organization\n- **Growth Stage**: Retag plants when moving between cultivation areas\n- **Clone Management**: Update clone tags for genetic tracking\n\n**Common Use Cases:**\n- Replace damaged plant tags for continued tracking\n- Update plant identification for facility reorganization\n- Retag clones for genetic lineage management\n- Maintain plant tag consistency across cultivation areas\n- Support internal cultivation workflow tag requirements\n\n**Performance & Limits:**\n- Single plant retagging operation for targeted tag management\n- Validation performed before any tag changes\n- Changes reflected immediately in internal cultivation systems\n- Optimized for cultivation facility tag management workflows\n\n**Related Endpoints:**\n- `POST /plant/nonsts/update` - Update other plant data beyond tags\n- `GET /plant` - Retrieve plant information with current tags\n- `POST /plant/nonsts` - Create new plants with initial tags\n\n**Important Notes:**\n- **Feature Gated**: Requires \"rollout.trym-integration\" feature flag to be enabled\n- **Tag Uniqueness**: New tag must be unique within the cultivation facility\n- **Internal Tracking**: Tag changes for internal cultivation management only\n- **State Compliance**: Does not affect official state traceability system records\n- **Cultivation Continuity**: Maintains plant tracking continuity with updated identification",
2782 "operationId": "PlantNonstsRetagPost",
2783 "requestBody": {
2784 "description": "Plant retagging request with plant and new tag details - RetagPlantRequest object",
2785 "content": {
2786 "application/json-patch+json": {
2787 "schema": {
2788 "$ref": "#/components/schemas/RetagPlantRequest"
2789 }
2790 },
2791 "application/json": {
2792 "schema": {
2793 "$ref": "#/components/schemas/RetagPlantRequest"
2794 }
2795 },
2796 "text/json": {
2797 "schema": {
2798 "$ref": "#/components/schemas/RetagPlantRequest"
2799 }
2800 },
2801 "application/*+json": {
2802 "schema": {
2803 "$ref": "#/components/schemas/RetagPlantRequest"
2804 }
2805 }
2806 },
2807 "x-bodyName": "request"
2808 },
2809 "responses": {
2810 "200": {
2811 "description": "Success"
2812 },
2813 "400": {
2814 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
2815 "content": {
2816 "application/json": {
2817 "schema": {
2818 "$ref": "#/components/schemas/BadRequestResponse"
2819 }
2820 }
2821 }
2822 },
2823 "401": {
2824 "description": "Invalid API Key"
2825 },
2826 "403": {
2827 "description": "Account not authorized"
2828 },
2829 "500": {
2830 "description": "Something went wrong."
2831 }
2832 }
2833 }
2834 },
2835 "/plant/nonsts/batch/retire": {
2836 "post": {
2837 "tags": ["PlantNonsts"],
2838 "summary": "Retire Immature Plant Batch (Non-State Tracking)",
2839 "description": "**Purpose:** Retire batches of immature plants or clones from active cultivation for internal tracking without reporting to state traceability systems.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for plant retirement\n- `RetireImmaturePlantsRequest` object in request body with retirement details\n- Content-Type: application/json\n- Valid immature plant or clone identification for retirement\n- Plants must be in immature stage for this operation\n\n**Response Data:**\n- Returns HTTP 200 with no response body on success\n- No data returned - operation confirmation only\n- Status confirmation indicates successful plant retirement completion\n\n**Plant Retirement Process:**\n- **Batch Retirement**: Retires multiple immature plants or clones in single operation\n- **Status Change**: Updates plant status to retired/inactive in cultivation systems\n- **Validation**: Ensures plants are valid and in immature stage before retirement\n- **Immediate Effect**: Retirement status applied immediately to cultivation records\n\n**Non-State Tracking (NONSTS) Behavior:**\n- **Internal Only**: Plant retirement for internal cultivation tracking only\n- **No External Reporting**: Retirement actions NOT transmitted to state traceability systems\n- **Cultivation Focus**: Designed for internal plant lifecycle management\n- **Compliance Safe**: Does not interfere with official state tracking requirements\n\n**Immature Plant Retirement Reasons:**\n- **Quality Control**: Remove plants that don't meet cultivation standards\n- **Space Management**: Retire excess plants for cultivation area optimization\n- **Health Issues**: Remove unhealthy or diseased plants from active cultivation\n- **Selection Process**: Retire plants not selected for continued cultivation\n- **Facility Management**: Clear immature plants for cultivation workflow changes\n\n**Common Use Cases:**\n- Retire poor-performing immature plants or clones\n- Remove excess immature plants to optimize cultivation space\n- Clear unhealthy plants from cultivation areas\n- Support cultivation selection and quality control processes\n- Manage immature plant inventory for facility efficiency\n\n**Performance & Limits:**\n- Batch processing for efficient plant retirement workflows\n- Validation performed before any retirement actions\n- Changes reflected immediately in internal cultivation systems\n- Optimized for cultivation facility plant lifecycle management\n\n**Related Endpoints:**\n- `POST /plant/nonsts/batch/immatureplants` - Create immature plant batches\n- `POST /plant/nonsts/update` - Update immature plants before retirement\n- `GET /plant` - Retrieve plant information including retirement status\n- `POST /plant/nonsts/batch/convert/immatureplants` - Convert immature to mature plants\n\n**Important Notes:**\n- **Immature Only**: This endpoint specifically handles immature plants and clones\n- **Batch Operation**: Can retire multiple plants efficiently in single request\n- **Internal Tracking**: Retirement for internal cultivation management only\n- **State Compliance**: Does not affect official state traceability system records\n- **Irreversible**: Plant retirement action cannot be easily undone\n- **Validation Required**: Plants must exist and be in immature stage for retirement",
2840 "operationId": "PlantNonstsBatchRetirePost",
2841 "requestBody": {
2842 "description": "Immature plant retirement request with plant details - RetireImmaturePlantsRequest object",
2843 "content": {
2844 "application/json-patch+json": {
2845 "schema": {
2846 "$ref": "#/components/schemas/RetireImmaturePlantsRequest"
2847 }
2848 },
2849 "application/json": {
2850 "schema": {
2851 "$ref": "#/components/schemas/RetireImmaturePlantsRequest"
2852 }
2853 },
2854 "text/json": {
2855 "schema": {
2856 "$ref": "#/components/schemas/RetireImmaturePlantsRequest"
2857 }
2858 },
2859 "application/*+json": {
2860 "schema": {
2861 "$ref": "#/components/schemas/RetireImmaturePlantsRequest"
2862 }
2863 }
2864 },
2865 "x-bodyName": "request"
2866 },
2867 "responses": {
2868 "200": {
2869 "description": "Success - No response body, operation completed successfully"
2870 },
2871 "400": {
2872 "description": "Bad Request - Validation failed or invalid plant data",
2873 "content": {
2874 "application/json": {
2875 "schema": {
2876 "$ref": "#/components/schemas/BadRequestResponse"
2877 }
2878 }
2879 }
2880 },
2881 "401": {
2882 "description": "Unauthorized - Invalid or missing API key"
2883 },
2884 "403": {
2885 "description": "Forbidden - Account not authorized for plant retirement"
2886 },
2887 "500": {
2888 "description": "Internal Server Error - Server error occurred"
2889 }
2890 }
2891 }
2892 },
2893 "/plant/nonsts/batch/finish-harvest": {
2894 "post": {
2895 "tags": ["PlantNonsts"],
2896 "summary": "Finish or Unfinish Harvest Batch (Non-State Tracking)",
2897 "description": "**Purpose:** Mark harvest batches as finished or unfinished for internal cultivation tracking without reporting to state traceability systems.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for harvest status management\n- `FinishHarvestBatchRequest` object in request body with harvest batch details\n- Content-Type: application/json\n- Valid harvest batch identification and finish/unfinish action\n- Feature flag \"rollout.trym-integration\" must be enabled\n\n**Response Data:**\n- Returns HTTP 200 with no response body on success\n- No data returned - operation confirmation only\n- Status confirmation indicates successful harvest batch update\n\n**Finish/Unfinish Operations:**\n- **FINISH**: Marks harvest batch as completed and ready for processing\n- **UNFINISH**: Reverts harvest batch to in-progress status for continued work\n- **Status Toggle**: Can switch between finished and unfinished states as needed\n- **Batch Management**: Affects entire harvest batch status uniformly\n\n**Non-State Tracking (NONSTS) Behavior:**\n- **Internal Only**: Harvest status updates for internal cultivation tracking only\n- **No External Reporting**: Status changes NOT transmitted to state traceability systems\n- **Cultivation Focus**: Designed for internal harvest workflow management\n- **Compliance Safe**: Does not interfere with official state tracking requirements\n\n**Harvest Batch Status Management:**\n- **Workflow Control**: Controls harvest batch progression through processing stages\n- **Quality Gates**: Finish status indicates batch readiness for next processing steps\n- **Reversible Actions**: Unfinish allows returning to active harvest work\n- **Batch Integrity**: Maintains harvest batch data consistency\n\n**Common Use Cases:**\n- Mark harvest batches as complete when cultivation work is finished\n- Unfinish harvest batches to allow additional cultivation work\n- Control harvest workflow progression through processing stages\n- Manage harvest batch status for internal tracking and reporting\n- Support cultivation facility harvest workflow requirements\n\n**Performance & Limits:**\n- Single batch operation for targeted harvest status management\n- Immediate status update reflected in cultivation systems\n- Optimized for harvest workflow management and status tracking\n- Validation performed before any status changes\n\n**Related Endpoints:**\n- `GET /harvest` - Retrieve harvest batch information and current status\n- `POST /plant/harvest` - Official plant harvest operations (state tracked)\n- `POST /plant/nonsts/update` - Update plant data related to harvest\n\n**Important Notes:**\n- **Feature Gated**: Requires \"rollout.trym-integration\" feature flag to be enabled\n- **Reversible Operation**: Finish and unfinish actions can be toggled as needed\n- **Internal Tracking**: Status changes for internal cultivation management only\n- **State Compliance**: Does not affect official state traceability system records\n- **Workflow Control**: Critical for managing internal harvest processing workflows",
2898 "operationId": "PlantNonstsBatchFinish-harvestPost",
2899 "requestBody": {
2900 "description": "Harvest batch finish/unfinish request with batch details - FinishHarvestBatchRequest object",
2901 "content": {
2902 "application/json-patch+json": {
2903 "schema": {
2904 "type": "array",
2905 "items": {
2906 "$ref": "#/components/schemas/FinishOrUnfinishBatchDetails"
2907 }
2908 }
2909 },
2910 "application/json": {
2911 "schema": {
2912 "type": "array",
2913 "items": {
2914 "$ref": "#/components/schemas/FinishOrUnfinishBatchDetails"
2915 }
2916 }
2917 },
2918 "text/json": {
2919 "schema": {
2920 "type": "array",
2921 "items": {
2922 "$ref": "#/components/schemas/FinishOrUnfinishBatchDetails"
2923 }
2924 }
2925 },
2926 "application/*+json": {
2927 "schema": {
2928 "type": "array",
2929 "items": {
2930 "$ref": "#/components/schemas/FinishOrUnfinishBatchDetails"
2931 }
2932 }
2933 }
2934 },
2935 "x-bodyName": "request"
2936 },
2937 "responses": {
2938 "200": {
2939 "description": "Success"
2940 },
2941 "400": {
2942 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
2943 "content": {
2944 "application/json": {
2945 "schema": {
2946 "$ref": "#/components/schemas/BadRequestResponse"
2947 }
2948 }
2949 }
2950 },
2951 "401": {
2952 "description": "Invalid API Key"
2953 },
2954 "403": {
2955 "description": "Account not authorized"
2956 },
2957 "500": {
2958 "description": "Something went wrong."
2959 }
2960 }
2961 }
2962 },
2963 "/plant/nonsts/split": {
2964 "post": {
2965 "tags": ["PlantNonsts"],
2966 "summary": "Split Immature Plant Batch (Non-State Tracking)",
2967 "description": "**Purpose:** Split immature plant or clone batches into two separate batches for internal cultivation management without reporting to state traceability systems.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for batch splitting\n- `SplitImmaturePlantsRequest` object in request body with split details\n- Content-Type: application/json\n- Valid immature batch identification and split configuration\n- Source batch must contain multiple plants to enable splitting\n\n**Response Data:**\n- Returns single `ApiResult<SplitImmaturePlantResult>` object (not array) with split results\n- Includes details of both resulting batches after split operation\n- Batch split status and success confirmation\n- Plant distribution information for the two new batches\n\n**Batch Splitting Process:**\n- **Source Division**: Divides single immature batch into two separate batches\n- **Plant Distribution**: Distributes plants between original and new batch\n- **Batch Integrity**: Maintains plant tracking continuity through split operation\n- **Validation**: Ensures source batch is valid and contains sufficient plants for splitting\n- **Atomic Operation**: Split succeeds or fails as complete operation\n\n**Non-State Tracking (NONSTS) Behavior:**\n- **Internal Only**: Batch splitting for internal cultivation tracking only\n- **No External Reporting**: Split operations NOT transmitted to state traceability systems\n- **Cultivation Focus**: Designed for internal batch management and cultivation workflows\n- **Compliance Safe**: Does not interfere with official state tracking requirements\n\n**Immature Batch Splitting Applications:**\n- **Facility Management**: Split large batches for different cultivation areas\n- **Growth Phase Management**: Separate plants based on development stage\n- **Quality Control**: Isolate high-performing plants from standard batches\n- **Genetic Management**: Separate clones for different breeding programs\n- **Space Optimization**: Distribute plants across multiple cultivation rooms\n\n**Common Use Cases:**\n- Split large immature plant batches for better facility management\n- Separate high-quality clones from standard cultivation batches\n- Distribute plants across different cultivation rooms or areas\n- Create specialized batches for different cultivation treatments\n- Support cultivation workflow organization and plant management\n\n**Performance & Limits:**\n- Single batch operation creating two resulting batches\n- Validation performed before any batch splitting\n- Changes reflected immediately in internal cultivation systems\n- Optimized for cultivation facility batch management workflows\n\n**Related Endpoints:**\n- `POST /plant/nonsts/batch/immatureplants` - Create original immature plant batches\n- `POST /plant/nonsts/update` - Update plants within split batches\n- `GET /plant` - Retrieve plant information for both resulting batches\n- `POST /plant/nonsts/batch/convert/immatureplants` - Convert split batches to mature\n\n**Important Notes:**\n- **Immature Only**: This endpoint specifically handles immature plant and clone batches\n- **Two-Batch Result**: Split operation always creates exactly two batches\n- **Plant Continuity**: All plants maintain their tracking through the split process\n- **Internal Tracking**: Split operations for internal cultivation management only\n- **State Compliance**: Does not affect official state traceability system records\n- **Batch Requirements**: Source batch must contain multiple plants to enable splitting",
2968 "operationId": "PlantNonstsSplitPost",
2969 "requestBody": {
2970 "description": "Immature plant batch split request with batch and split details - SplitImmaturePlantsRequest object",
2971 "content": {
2972 "application/json-patch+json": {
2973 "schema": {
2974 "$ref": "#/components/schemas/SplitImmaturePlantsRequest"
2975 }
2976 },
2977 "application/json": {
2978 "schema": {
2979 "$ref": "#/components/schemas/SplitImmaturePlantsRequest"
2980 }
2981 },
2982 "text/json": {
2983 "schema": {
2984 "$ref": "#/components/schemas/SplitImmaturePlantsRequest"
2985 }
2986 },
2987 "application/*+json": {
2988 "schema": {
2989 "$ref": "#/components/schemas/SplitImmaturePlantsRequest"
2990 }
2991 }
2992 },
2993 "x-bodyName": "request"
2994 },
2995 "responses": {
2996 "200": {
2997 "description": "Success - Returns ApiResult<SplitImmaturePlantResult> with split batch details: `{ \"data\": { \"originalBatch\": {...}, \"newBatch\": {...} }, \"message\": \"Successfully split immature batches of plants.\", \"success\": true }`",
2998 "content": {
2999 "application/json": {
3000 "schema": {
3001 "$ref": "#/components/schemas/SplitImmaturePlantResultApiResult"
3002 }
3003 }
3004 }
3005 },
3006 "400": {
3007 "description": "Bad Request - Validation failed or invalid batch data",
3008 "content": {
3009 "application/json": {
3010 "schema": {
3011 "$ref": "#/components/schemas/BadRequestResponse"
3012 }
3013 }
3014 }
3015 },
3016 "401": {
3017 "description": "Unauthorized - Invalid or missing API key"
3018 },
3019 "403": {
3020 "description": "Forbidden - Account not authorized for batch splitting"
3021 },
3022 "500": {
3023 "description": "Internal Server Error - Server error occurred"
3024 }
3025 }
3026 }
3027 },
3028 "/plant/nonsts/batch": {
3029 "post": {
3030 "tags": ["PlantNonsts"],
3031 "summary": "Update Plant Batch (Non-State Tracking)",
3032 "description": "**Purpose:** Update plant batch information such as strain or location for internal cultivation tracking without reporting to state traceability systems.\n\n**Request Requirements:**\n- \"Inventory\" or \"Cultivation\" role authorization required for batch data modification\n- `UpdateBatchRequest` object in request body with batch update details\n- Content-Type: application/json\n- Valid batch identification and field updates\n- Feature flag \"rollout.trym-integration\" must be enabled\n\n**Response Data:**\n- Returns HTTP 200 with no response body on success\n- No data returned - operation confirmation only\n- Status confirmation indicates successful batch update completion\n\n**Batch Update Capabilities:**\n- **Strain Updates**: Modify strain information for entire plant batch\n- **Location Updates**: Change cultivation location or room assignment for batch\n- **Batch Properties**: Update other batch-level cultivation characteristics\n- **Bulk Changes**: Apply updates to all plants within the specified batch\n\n**Sparse Update Behavior:**\n- **Selective Updates**: Only provided fields in the request will be updated\n- **Field Independence**: Each batch property can be updated independently\n- **Preservation**: Omitted fields maintain their current values\n- **Validation**: All provided updates validated before application\n\n**Non-State Tracking (NONSTS) Behavior:**\n- **Internal Only**: Batch updates for internal cultivation tracking only\n- **No External Reporting**: Changes NOT transmitted to state traceability systems\n- **Cultivation Focus**: Designed for internal batch management and cultivation workflows\n- **Compliance Safe**: Does not interfere with official state tracking requirements\n\n**Common Use Cases:**\n- Update strain information when batch genetics are reclassified\n- Move plant batches to different cultivation rooms or areas\n- Modify batch properties for improved cultivation tracking\n- Correct batch information for accurate facility management\n- Support cultivation workflow batch organization requirements\n\n**Performance & Limits:**\n- Single batch operation affecting all plants in the specified batch\n- Validation performed before any batch changes\n- Changes reflected immediately in internal cultivation systems\n- Optimized for cultivation facility batch management workflows\n\n**Related Endpoints:**\n- `POST /plant/nonsts/update` - Update individual plant data within batches\n- `GET /plant` - Retrieve current plant and batch information\n- `POST /plant/nonsts` - Create new plant batches with initial properties\n\n**Important Notes:**\n- **Feature Gated**: Requires \"rollout.trym-integration\" feature flag to be enabled\n- **Batch-Wide Impact**: Updates affect all plants within the specified batch\n- **Internal Tracking**: Changes for internal cultivation management only\n- **State Compliance**: Does not affect official state traceability system records\n- **Cultivation Efficiency**: Streamlines batch-level cultivation management operations",
3033 "operationId": "PlantNonstsBatchPost",
3034 "requestBody": {
3035 "description": "Batch update request with batch identification and field updates - UpdateBatchRequest object",
3036 "content": {
3037 "application/json-patch+json": {
3038 "schema": {
3039 "$ref": "#/components/schemas/UpdateBatchRequest"
3040 }
3041 },
3042 "application/json": {
3043 "schema": {
3044 "$ref": "#/components/schemas/UpdateBatchRequest"
3045 }
3046 },
3047 "text/json": {
3048 "schema": {
3049 "$ref": "#/components/schemas/UpdateBatchRequest"
3050 }
3051 },
3052 "application/*+json": {
3053 "schema": {
3054 "$ref": "#/components/schemas/UpdateBatchRequest"
3055 }
3056 }
3057 },
3058 "x-bodyName": "request"
3059 },
3060 "responses": {
3061 "200": {
3062 "description": "Success"
3063 },
3064 "400": {
3065 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
3066 "content": {
3067 "application/json": {
3068 "schema": {
3069 "$ref": "#/components/schemas/BadRequestResponse"
3070 }
3071 }
3072 }
3073 },
3074 "401": {
3075 "description": "Invalid API Key"
3076 },
3077 "403": {
3078 "description": "Account not authorized"
3079 },
3080 "500": {
3081 "description": "Something went wrong."
3082 }
3083 }
3084 }
3085 },
3086 "/preorder/submit": {
3087 "post": {
3088 "tags": ["PreOrder"],
3089 "summary": "Create PreOrder",
3090 "description": "**Purpose:** Create a new customer pre-order by submitting cart items with customer information and fulfillment details.\n\n**Request Requirements:**\n- \"PreOrder\" role authorization required for order creation\n- `CreatePreOrderRequest` object in request body with complete order details\n- Content-Type: application/json\n- Valid customer ID that exists in the system\n- **Idempotency Support**: Requires `ConsumerKey` header and `IdempotencyKey` field for duplicate prevention (see [Idempotency Documentation](/pages/idempotency.html))\n\n**Response Data:**\n- Returns `PreOrderResponse` object with assigned order ID and transaction ID\n- Order ID can be used for tracking and future order operations\n- Transaction ID links to the transaction for fulfillment tracking\n\n**Required Request Information:**\n- Valid CustomerId for the order recipient\n- Array of cart items with products, quantities, and any special instructions\n- Order source for tracking and reporting (Web, In-Store, Express)\n- Fulfillment details with pickup or delivery information and timing\n\n**Order Sources Available:**\n- Web: Online orders from e-commerce platforms\n- In-Store: Orders placed directly at dispensary location\n- Express: Expedited or curbside pickup orders\n- Note: Order Source is deprecated and will be replaced with more comprehensive tracking values\n\n**Delivery Time Windows:**\n- TimeWindowXXXDateUtc fields express desired delivery time windows\n- May be expanded to pickup orders in the future\n- Data exposed to locations with \"Delivery Management\" feature enabled\n\n**Redemptions Support:**\n- Third-party loyalty redemptions and LeafLogix discount codes supported\n- Valid types: SpringBig Rewards/Offers, Alpine IQ, LeafLogix Codes, Fyllo\n- Redemption ID should be discount code, reward ID, offer ID, or template ID\n\n**Common Use Cases:**\n- Process e-commerce orders from online platforms\n- Create pickup orders for customer convenience\n- Handle delivery orders with specified time windows\n- Apply loyalty rewards and promotional discounts\n- Enable customers to secure products before visiting store\n\n**Performance & Limits:**\n- Uses idempotency key to prevent duplicate order creation\n- Product validation ensures availability and purchase limits\n- Customer verification confirms validity for location\n- Compliance checking for local regulations and restrictions\n\n**Related Endpoints:**\n- `POST /preorder/price-cart` - Calculate pricing before order submission\n- `POST /transaction/create-anonymous` - Anonymous customers without full profiles\n\n\n**Important Notes:**\n- Payment occurs later at pickup/delivery, not during order creation\n- System validates product availability and customer purchase limits\n- Customer must exist and be valid for the authenticated location\n- Orders must comply with local regulations and purchase restrictions\n- Use IdempotencyKey to prevent duplicate order creation",
3091 "operationId": "PreorderSubmitPost",
3092 "requestBody": {
3093 "description": "Pre-order details including customer, cart items, and fulfillment information - CreatePreOrderRequest object",
3094 "content": {
3095 "application/json-patch+json": {
3096 "schema": {
3097 "$ref": "#/components/schemas/CreatePreOrderRequest"
3098 }
3099 },
3100 "application/json": {
3101 "schema": {
3102 "$ref": "#/components/schemas/CreatePreOrderRequest"
3103 }
3104 },
3105 "text/json": {
3106 "schema": {
3107 "$ref": "#/components/schemas/CreatePreOrderRequest"
3108 }
3109 },
3110 "application/*+json": {
3111 "schema": {
3112 "$ref": "#/components/schemas/CreatePreOrderRequest"
3113 }
3114 }
3115 },
3116 "x-bodyName": "req"
3117 },
3118 "responses": {
3119 "200": {
3120 "description": "Success - Returns orderId and transactionId for the created pre-order",
3121 "content": {
3122 "application/json": {
3123 "schema": {
3124 "type": "integer",
3125 "format": "int32"
3126 }
3127 }
3128 }
3129 },
3130 "400": {
3131 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
3132 "content": {
3133 "application/json": {
3134 "schema": {
3135 "$ref": "#/components/schemas/BadRequestResponse"
3136 }
3137 }
3138 }
3139 },
3140 "500": {
3141 "description": "Internal Server Error - Server error occurred"
3142 }
3143 }
3144 }
3145 },
3146 "/preorder/update": {
3147 "post": {
3148 "tags": ["PreOrder"],
3149 "summary": "Update PreOrder",
3150 "description": "**✏️ Purpose:** Modify an existing pre-order's items, delivery information, notes, or redemptions.\n\n**🔄 Updatable Fields:**\n- **Cart Items:** Add, remove, or modify product quantities and special instructions\n- **Order Notes:** Update customer notes or special handling instructions\n- **Delivery Information:** Change delivery address or timing preferences\n- **Loyalty Redemptions:** Add, remove, or modify applied discounts and rewards\n- **Order Source:** Update tracking source information\n\n**🚫 Non-Updatable Fields:**\n- **Customer ID:** Cannot transfer order to different customer\n- **Idempotency Key:** Cannot modify unique transaction identifier\n- **Order ID:** Core order identifier remains fixed\n\n**📋 Update Behavior:**\n- **Redemptions:** If redemptions field is omitted, existing redemptions are preserved\n- **Items:** Complete replacement of cart items with provided array\n- **Delivery:** Updates only if delivery information is provided\n- **Incremental Changes:** Only provided fields are modified\n\n**⏰ Update Restrictions:**\nOrders can only be updated while in specific states:\n- ✅ **Submitted/Pending:** Full updates allowed\n- ✅ **Processing:** Limited updates may be available\n- ❌ **Filled/Complete:** No updates permitted\n- ❌ **Checked Out:** Payment completed, updates blocked\n\n**🎯 Common Use Cases:**\n- **Cart Modifications:** Customer wants to add/remove items before fulfillment\n- **Address Changes:** Update delivery location for customer convenience\n- **Special Instructions:** Add preparation notes or customer preferences\n- **Discount Updates:** Apply newly available promotions or loyalty rewards\n- **Fulfillment Changes:** Switch between pickup and delivery options\n\n**🔧 Request Format:**\nProvide an `UpdatePreOrderRequest` object with OrderId and the fields to be updated.\n\n**⚠️ Important Notes:**\n- **Status Check:** Use the status endpoint to verify order is still updateable\n- **Inventory Impact:** Item changes may affect product availability\n- **Pricing Recalculation:** Updates may change order totals and taxes\n- **Delivery Validation:** Address changes subject to delivery zone verification",
3151 "operationId": "PreorderUpdatePost",
3152 "requestBody": {
3153 "description": "Update details including OrderId and fields to be modified",
3154 "content": {
3155 "application/json-patch+json": {
3156 "schema": {
3157 "$ref": "#/components/schemas/UpdatePreOrderRequest"
3158 }
3159 },
3160 "application/json": {
3161 "schema": {
3162 "$ref": "#/components/schemas/UpdatePreOrderRequest"
3163 }
3164 },
3165 "text/json": {
3166 "schema": {
3167 "$ref": "#/components/schemas/UpdatePreOrderRequest"
3168 }
3169 },
3170 "application/*+json": {
3171 "schema": {
3172 "$ref": "#/components/schemas/UpdatePreOrderRequest"
3173 }
3174 }
3175 },
3176 "x-bodyName": "req"
3177 },
3178 "responses": {
3179 "200": {
3180 "description": "Success - Order updated successfully"
3181 },
3182 "400": {
3183 "description": "Bad Request - Empty response body (handle via HTTP status code only)"
3184 },
3185 "404": {
3186 "description": "Not Found - Order ID does not exist"
3187 },
3188 "500": {
3189 "description": "Internal Server Error - Server error occurred"
3190 }
3191 }
3192 }
3193 },
3194 "/preorder/cancel": {
3195 "post": {
3196 "tags": ["PreOrder"],
3197 "summary": "Cancel PreOrder",
3198 "description": "**❌ Purpose:** Cancel an existing pre-order and release any reserved inventory.\n\n**🔍 Cancellation Requirements:**\nOrder must be in a cancellable state - use the status endpoint to verify before attempting cancellation.\n\n**✅ Cancellable States:**\n- **Submitted/Pending:** Order not yet started by staff\n- **Processing:** Order in early preparation stages (may vary by location)\n\n**🚫 Non-Cancellable States:**\n- **Checked Out:** Payment has been processed\n- **Filled/Complete:** Order fulfillment finished\n- **Partially Filled:** Some items already prepared/dispensed\n- **In Transit:** Delivery orders already out for delivery\n\n**🔄 Cancellation Effects:**\n- **Inventory Release:** Reserved items returned to available inventory\n- **Payment Handling:** Refunds processed according to payment method\n- **Loyalty Redemptions:** Applied rewards/discounts are restored to customer account\n- **Order Status:** Permanently marked as cancelled\n- **Customer Notification:** Automated notifications sent if configured\n\n**🎯 Common Cancellation Reasons:**\n- **Customer Request:** Customer no longer wants the order\n- **Inventory Issues:** Items became unavailable after order placement\n- **Payment Problems:** Payment processing failed or was declined\n- **Delivery Issues:** Address problems or delivery zone restrictions\n- **Business Operations:** Store closure or emergency situations\n\n**🔧 Request Format:**\nProvide a `CancelPreOrderRequest` object with the OrderId to cancel.\n\n**Performance & Limits:**\n- Rate limited to 240 requests per minute for order management protection\n- Single order cancellation operation for targeted processing\n- Immediate inventory and payment processing upon successful cancellation\n\n**⚠️ Important Notes:**\n- **Irreversible Action:** Cancelled orders cannot be restored or reactivated\n- **Status Verification:** Always check cancellable status before attempting cancellation\n- **Refund Processing:** Payment refunds may take time depending on payment method\n- **Inventory Impact:** Cancellation immediately releases reserved inventory\n- **Customer Communication:** Consider notifying customer of cancellation reason",
3199 "operationId": "PreorderCancelPost",
3200 "requestBody": {
3201 "description": "Cancellation request containing the OrderId to cancel",
3202 "content": {
3203 "application/json-patch+json": {
3204 "schema": {
3205 "$ref": "#/components/schemas/CancelPreorderRequest"
3206 }
3207 },
3208 "application/json": {
3209 "schema": {
3210 "$ref": "#/components/schemas/CancelPreorderRequest"
3211 }
3212 },
3213 "text/json": {
3214 "schema": {
3215 "$ref": "#/components/schemas/CancelPreorderRequest"
3216 }
3217 },
3218 "application/*+json": {
3219 "schema": {
3220 "$ref": "#/components/schemas/CancelPreorderRequest"
3221 }
3222 }
3223 },
3224 "x-bodyName": "req"
3225 },
3226 "responses": {
3227 "200": {
3228 "description": "Success - Order cancelled successfully",
3229 "content": {
3230 "application/json": {
3231 "schema": {
3232 "type": "integer",
3233 "format": "int32"
3234 }
3235 }
3236 }
3237 },
3238 "400": {
3239 "description": "Bad Request - Empty response body (handle via HTTP status code only)"
3240 },
3241 "404": {
3242 "description": "Not Found - Order ID does not exist"
3243 },
3244 "500": {
3245 "description": "Internal Server Error - Server error occurred",
3246 "content": {
3247 "application/json": {
3248 "schema": {
3249 "type": "string"
3250 }
3251 }
3252 }
3253 }
3254 }
3255 }
3256 },
3257 "/preorder/Status": {
3258 "get": {
3259 "tags": ["PreOrder"],
3260 "summary": "Get PreOrder Status",
3261 "description": "**📊 Purpose:** Retrieve current status and details for pre-orders to track fulfillment progress.\n\n**🔍 Query Options:**\n- **Specific Order:** Provide PreOrderId to get detailed status for a single order\n- **All Open Orders:** Omit PreOrderId to retrieve all recent active orders (last 14 days)\n- **Line Item Details:** Set includeLineItems=true for detailed product information (requires PreOrderId)\n\n**📋 Status Information Returned:**\n- **Order Details:** Order ID, transaction ID, customer information, timestamps\n- **Current Status:** Order state (Submitted, Processing, Filled, Complete, Cancelled)\n- **Fulfillment Info:** Pickup/delivery details, estimated completion times\n- **Update Permissions:** Whether order can still be modified or cancelled\n- **Payment Status:** Payment processing state and totals\n- **Line Items:** Product details, quantities, allocated inventory (when requested)\n\n**📦 Order Status States:**\n- **Submitted:** Order received and queued for processing\n- **Processing:** Staff actively preparing order items\n- **Filled:** All items prepared and ready for customer\n- **Complete:** Customer has received order (pickup/delivery completed)\n- **Cancelled:** Order cancelled and inventory released\n\n**⚡ Performance Features:**\n- **Optimized for Real-Time:** Designed for frequent status checking and monitoring\n- **Batch Queries:** Retrieve multiple order statuses efficiently without PreOrderId\n- **Selective Detail:** Choose level of detail needed with includeLineItems parameter\n\n**🎯 Common Use Cases:**\n- **Customer Updates:** Provide real-time order progress to customers\n- **Operations Dashboard:** Monitor all active orders across fulfillment workflow\n- **Integration Sync:** Keep external systems updated with current order states\n- **Customer Service:** Quick lookup of order status for support inquiries\n- **Automated Notifications:** Trigger customer alerts based on status changes\n\n**⚠️ Important Notes:**\n- **Line Item Restriction:** includeLineItems requires a specific PreOrderId\n- **Recent Orders Filter:** Bulk queries return orders from last 14 days only\n- **Location Scoped:** Results filtered to authenticated user's location\n- **Real-Time Data:** Status reflects current state, may change during fulfillment",
3262 "operationId": "PreorderStatusGet",
3263 "parameters": [
3264 {
3265 "name": "PreOrderId",
3266 "in": "query",
3267 "description": "Specific order ID to retrieve status for (optional - omit for all open orders)",
3268 "schema": {
3269 "type": "integer",
3270 "format": "int32"
3271 }
3272 },
3273 {
3274 "name": "includeLineItems",
3275 "in": "query",
3276 "description": "Include detailed product line item information (requires PreOrderId)",
3277 "schema": {
3278 "type": "boolean",
3279 "default": false
3280 }
3281 }
3282 ],
3283 "responses": {
3284 "200": {
3285 "description": "Success - Returns PreOrderStatus object(s) with current order information",
3286 "content": {
3287 "application/json": {
3288 "schema": {
3289 "$ref": "#/components/schemas/PreOrderStatus"
3290 }
3291 }
3292 }
3293 },
3294 "400": {
3295 "description": "Bad Request - Empty response body (handle via HTTP status code only)"
3296 },
3297 "500": {
3298 "description": "Internal Server Error - Server error occurred"
3299 }
3300 }
3301 }
3302 },
3303 "/preorder/price-cart": {
3304 "post": {
3305 "tags": ["PreOrder"],
3306 "summary": "Calculate Cart Pricing",
3307 "description": "**💰 Purpose:** Calculate accurate pricing for a cart before order submission, including taxes, discounts, and final totals.\n\n**📋 Required Information:**\n- **Customer Identity:** Either CustomerId (existing customer) OR CustomerTypeId (customer category)\n- **Cart Items:** Array of products with quantities to be priced\n- **Fulfillment Type:** Specify if delivery pricing applies (affects taxes/fees)\n\n**💵 Pricing Components Calculated:**\n- **Subtotal:** Base product prices multiplied by quantities\n- **Taxes:** Location-specific tax rates applied to taxable items\n- **Discounts:** Customer-specific pricing, loyalty discounts, promotional offers\n- **Delivery Fees:** Additional charges for delivery service (if applicable)\n- **Final Total:** Complete order amount including all fees and adjustments\n\n**🎯 Customer Pricing Options:**\n- **Existing Customer:** Use CustomerId for personalized pricing and loyalty benefits\n- **Customer Type:** Use CustomerTypeId for category-based pricing (Medical, Recreational, etc.)\n- **Delivery Context:** Set IsDelivery=true to include delivery-specific pricing\n\n**🔍 Pricing Accuracy:**\n- **Real-Time Calculations:** Pricing reflects current product costs and tax rates\n- **Location-Specific:** Taxes and fees calculated based on dispensary location\n- **Customer-Specific:** Applies individual discounts, loyalty rewards, and membership benefits\n- **Delivery Zones:** Delivery fees calculated based on customer address when provided\n\n**🎯 Common Use Cases:**\n- **Cart Preview:** Show customers accurate totals before checkout\n- **Price Comparison:** Compare costs across different customer types or delivery options\n- **Integration Sync:** Keep external e-commerce platforms synchronized with current pricing\n- **Customer Service:** Provide accurate quotes for customer inquiries\n- **Mobile Apps:** Real-time cart totals for mobile ordering experiences\n\n**🔧 Request Format:**\nProvide a `PriceCartRequest` object with customer information, cart items, and delivery preferences.\n\n**Performance & Limits:**\n- Rate limited to 240 requests per minute for pricing calculation protection\n- Real-time pricing calculations optimized for responsive user experience\n- Single cart operation for immediate pricing feedback\n\n**⚠️ Important Notes:**\n- **Unique Products:** Each product should only appear once in the cart array\n- **Customer Requirement:** Must specify either CustomerId OR CustomerTypeId (not both)\n- **Pricing Volatility:** Prices may change between calculation and order submission\n- **Location Dependency:** Pricing is specific to the authenticated dispensary location\n- **Address Impact:** Delivery address affects tax calculations and delivery fees",
3308 "operationId": "PreorderPrice-cartPost",
3309 "requestBody": {
3310 "description": "Pricing request containing customer information, cart items, and delivery preferences",
3311 "content": {
3312 "application/json-patch+json": {
3313 "schema": {
3314 "$ref": "#/components/schemas/PriceCartRequest"
3315 }
3316 },
3317 "application/json": {
3318 "schema": {
3319 "$ref": "#/components/schemas/PriceCartRequest"
3320 }
3321 },
3322 "text/json": {
3323 "schema": {
3324 "$ref": "#/components/schemas/PriceCartRequest"
3325 }
3326 },
3327 "application/*+json": {
3328 "schema": {
3329 "$ref": "#/components/schemas/PriceCartRequest"
3330 }
3331 }
3332 },
3333 "x-bodyName": "req"
3334 },
3335 "responses": {
3336 "200": {
3337 "description": "Success - Returns detailed pricing breakdown for the cart",
3338 "content": {
3339 "application/json": {
3340 "schema": {
3341 "$ref": "#/components/schemas/CartPrice"
3342 }
3343 }
3344 }
3345 },
3346 "400": {
3347 "description": "Bad Request - String error message (parse response body as plain text)",
3348 "content": {
3349 "application/json": {
3350 "schema": {
3351 "type": "string"
3352 }
3353 }
3354 }
3355 },
3356 "500": {
3357 "description": "Internal Server Error - Server error occurred during pricing calculation"
3358 }
3359 }
3360 }
3361 },
3362 "/pricing-tiers": {
3363 "get": {
3364 "tags": ["PricingTier"],
3365 "summary": "Get Pricing Tiers",
3366 "description": "**Purpose:** Retrieves the complete list of pricing tiers available for the authenticated organization for product pricing strategy and customer segmentation.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of pricing tier objects: `[{ PricingTier }, ...]`\n- Array typically contains 2-8 pricing tiers per organization\n- Returns empty array `[]` if no pricing tiers configured (rare)\n- Includes tier ID, name, and configuration details\n- Organization-level pricing tiers for customer segmentation (e.g., \"Retail\", \"Wholesale\", \"Medical\", \"VIP\")\n- Results filtered to authenticated organization level\n\n**Common Use Cases:**\n- Configure product pricing based on customer tier assignments\n- Support tiered pricing strategies for different customer segments\n- Populate pricing tier dropdown lists in customer management forms\n- Validate pricing tier assignments in product and order management systems\n- Generate tier-specific pricing reports and analytics\n- Enable dynamic pricing based on customer classifications\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Small dataset suitable for client-side caching\n- No pagination needed due to limited number of pricing tiers\n- Results consistent across all locations within organization\n\n**Related Endpoints:**\n- `GET /products` - Get products with tier-based pricing\n- `GET /customer/customer-types` - Get customer types that may use pricing tiers\n- Pricing calculation endpoints that utilize these tiers\n\n**Important Notes:**\n- Pricing tiers are defined at organization level (LSP) not location level\n- Essential for implementing tiered pricing strategies and customer segmentation\n- Used for dynamic pricing calculations based on customer classifications\n- Supports business models with wholesale, retail, and VIP pricing structures\n- May be used in conjunction with customer types for comprehensive pricing strategies",
3367 "operationId": "Pricing-tiersGet",
3368 "responses": {
3369 "200": {
3370 "description": "Success - Returns array of pricing tier objects: `[{ PricingTier }, ...]`",
3371 "content": {
3372 "application/json": {
3373 "schema": {
3374 "type": "array",
3375 "items": {
3376 "$ref": "#/components/schemas/PricingTier"
3377 }
3378 }
3379 }
3380 }
3381 },
3382 "401": {
3383 "description": "Unauthorized - Invalid or missing API key"
3384 },
3385 "403": {
3386 "description": "Forbidden - Account not authorized"
3387 },
3388 "500": {
3389 "description": "Internal Server Error - Server error occurred"
3390 }
3391 }
3392 }
3393 },
3394 "/producers": {
3395 "get": {
3396 "tags": ["Producer"],
3397 "summary": "Get Producers",
3398 "description": "**Purpose:** Retrieve basic producer identification information for product attribution and reference data needs.\n\n**Request Requirements:**\n- Valid authentication required for producer data access\n- No request body needed\n- No query parameters required\n\n**Response Data:**\n- Returns array of producer objects: `[{ Producer }, ...]`\n- Array typically contains 1-50 producers per organization\n- Returns empty array `[]` if no producers configured (rare)\n- Producer details include basic identification information only\n- Results automatically filtered to authenticated organization and exclude deleted records\n\n**Producer Information:**\n- **Producer ID**: Unique identifier for the producer\n- **Producer Name**: Display name of the producer\n\n**Common Use Cases:**\n- Populate producer dropdown lists in product management forms\n- Display producer names for product attribution and branding\n- Support basic producer identification in product catalogs\n- Enable producer-based filtering and organization in product displays\n- Provide producer reference data for product creation workflows\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Organization-scoped results for operational relevance and security\n- Small dataset suitable for client-side caching\n- Essential reference data for basic producer identification\n\n**Related Endpoints:**\n- `GET /products` - View products that include producer information\n- `GET /brands` - Related brand information for product attribution\n- `GET /vendors` - Related vendor information and business relationships\n\n**Important Notes:**\n- **Basic Reference Data**: Provides minimal producer identification information\n- **Organization Scoped**: Results filtered to authenticated organization level and exclude deleted records\n- **Limited Data**: Only includes producer ID and name - no licensing, contact, or compliance details\n- **Product Attribution**: Enables basic producer attribution for product displays",
3399 "operationId": "ProducersGet",
3400 "responses": {
3401 "200": {
3402 "description": "Success - Returns array of producer objects: `[{ Producer }, ...]`",
3403 "content": {
3404 "application/json": {
3405 "schema": {
3406 "type": "array",
3407 "items": {
3408 "$ref": "#/components/schemas/Producer"
3409 }
3410 }
3411 }
3412 }
3413 },
3414 "401": {
3415 "description": "Unauthorized - Invalid or missing API key"
3416 },
3417 "403": {
3418 "description": "Forbidden - Account not authorized"
3419 },
3420 "500": {
3421 "description": "Internal Server Error - Server error occurred"
3422 }
3423 }
3424 }
3425 },
3426 "/products/location-overrides": {
3427 "get": {
3428 "tags": ["Product"],
3429 "summary": "Get Location Product Overrides",
3430 "description": "**Purpose:** Retrieve all location-specific product overrides for pricing, availability, and display customization at the current location.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for product override data access\n- No query parameters required\n- No request body needed\n\n**Response Data:**\n- Returns array of `LocationProductOverride` objects with location-specific settings\n- Array typically contains 50-5,000+ overrides depending on location customization\n- Returns empty array `[]` if no overrides exist for the location (not null)\n- If a field is `null`, then the product master version of that field applies\n- Includes pricing overrides, availability settings, and display configurations\n- Results automatically filtered to authenticated location\n\n**Override Behavior:**\n- **Null Fields**: When override field is null, the product master value is used\n- **Set Fields**: When override field has a value, it replaces the master value\n- **Location Specific**: Overrides only apply to the authenticated location\n- **Inheritance**: Non-overridden fields inherit from product master data\n\n**Common Use Cases:**\n- Retrieve location-specific pricing for multi-location businesses\n- Get availability overrides for location inventory management\n- Access display customizations for location-specific product presentation\n- Synchronize location overrides with external point-of-sale systems\n- Generate location-specific product catalogs and pricing sheets\n\n**Performance & Limits:**\n- Optimized for location-specific product management workflows\n- Results filtered automatically to current location scope\n- Efficient for multi-location businesses with location-specific pricing\n- Consider caching for frequent access to override data\n\n**Related Endpoints:**\n- `POST /products/location-overrides` - Create or update location overrides\n- `GET /products` - Get product master data with default values\n- `GET /inventory` - Get current inventory levels for overridden products\n\n**Important Notes:**\n- **Inheritance Model**: Null override fields inherit from product master data\n- **Location Scoped**: Results automatically filtered to authenticated location\n- **Override Priority**: Location overrides take precedence over master product data\n- **Multi-Location**: Essential for businesses operating multiple dispensary locations\n- **Pricing Control**: Enables location-specific pricing strategies and market adaptation",
3431 "operationId": "ProductsLocation-overridesGet",
3432 "responses": {
3433 "200": {
3434 "description": "Success",
3435 "content": {
3436 "application/json": {
3437 "schema": {
3438 "type": "array",
3439 "items": {
3440 "$ref": "#/components/schemas/LocationProductOverride"
3441 }
3442 }
3443 }
3444 }
3445 },
3446 "401": {
3447 "description": "Invalid API Key"
3448 },
3449 "403": {
3450 "description": "Account not authorized"
3451 },
3452 "500": {
3453 "description": "Something went wrong."
3454 }
3455 }
3456 },
3457 "post": {
3458 "tags": ["Product"],
3459 "summary": "Create or Update Location Product Overrides",
3460 "description": "**Purpose:** Create or update location-specific product overrides for pricing, availability, and display customization to support multi-location business operations.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for product override modification\n- Array of `LocationProductOverrideRequest` objects in request body\n- Content-Type: application/json\n- Valid ProductId required for each override\n\n**Response Data:**\n- Returns HTTP 200 with no response body on success\n- No data returned - operation confirmation only\n- Returns HTTP 400 with validation errors if request data is invalid\n- Partial success possible: some overrides may save even if others fail\n\n**Create vs Update Behavior:**\n- **CREATE**: When no existing override exists for the ProductId at this location, a new override is created\n- **UPDATE**: When an override already exists for the ProductId at this location, it is updated\n- **Identification**: Override existence determined by ProductId and authenticated location\n- **Automatic Detection**: System automatically determines create vs update based on existing data\n\n**Sparse Update Behavior:**\n- **Omitted Fields**: Retain their current override value (no change)\n- **Null Values**: Remove the override for that field (product master value will apply)\n- **Set Values**: Update the override with the provided value\n- **Field Independence**: Each field can be updated independently without affecting others\n\n**Override Management:**\n- **Removal**: Set fields to null to remove overrides and revert to product master values\n- **Addition**: Set fields to specific values to create new overrides\n- **Location Scoped**: All overrides apply only to the authenticated location\n- **Dual Pricing**: Automatically handles recreational price sync when dual pricing is disabled\n\n**Common Use Cases:**\n- Set location-specific pricing for multi-location businesses\n- Override product availability for location inventory management\n- Customize product display settings for location-specific presentation\n- Manage location-based pricing strategies and market adaptation\n- Synchronize pricing changes from external systems to specific locations\n\n**Performance & Limits:**\n- Batch processing for efficient multi-product override updates\n- Validation performed before any changes to ensure data integrity\n- Partial success handling: some overrides may succeed even if others fail\n- Optimized for location-specific product management workflows\n\n**Related Endpoints:**\n- `GET /products/location-overrides` - Retrieve current location overrides\n- `GET /products` - Get product master data for comparison\n- `GET /inventory` - Check inventory levels for overridden products\n\n**Important Notes:**\n- **Partial Success**: Some overrides may save successfully even if others fail validation\n- **Null Behavior**: Setting fields to null removes overrides and reverts to master data\n- **Location Isolation**: Overrides only affect the authenticated location\n- **Validation Required**: All ProductIds must exist and be valid for the location\n- **Dual Pricing Sync**: Recreational prices automatically sync with medical when dual pricing disabled",
3461 "operationId": "ProductsLocation-overridesPost",
3462 "requestBody": {
3463 "description": "Array of location product override requests with ProductId and override values - LocationProductOverrideRequest objects",
3464 "content": {
3465 "application/json-patch+json": {
3466 "schema": {
3467 "type": "array",
3468 "items": {
3469 "$ref": "#/components/schemas/LocationProductOverrideRequest"
3470 }
3471 }
3472 },
3473 "application/json": {
3474 "schema": {
3475 "type": "array",
3476 "items": {
3477 "$ref": "#/components/schemas/LocationProductOverrideRequest"
3478 }
3479 }
3480 },
3481 "text/json": {
3482 "schema": {
3483 "type": "array",
3484 "items": {
3485 "$ref": "#/components/schemas/LocationProductOverrideRequest"
3486 }
3487 }
3488 },
3489 "application/*+json": {
3490 "schema": {
3491 "type": "array",
3492 "items": {
3493 "$ref": "#/components/schemas/LocationProductOverrideRequest"
3494 }
3495 }
3496 }
3497 },
3498 "x-bodyName": "updates"
3499 },
3500 "responses": {
3501 "200": {
3502 "description": "Success"
3503 },
3504 "400": {
3505 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)"
3506 },
3507 "401": {
3508 "description": "Invalid API Key"
3509 },
3510 "403": {
3511 "description": "Account not authorized"
3512 },
3513 "500": {
3514 "description": "Something went wrong. One or more overrides may have been saved"
3515 }
3516 }
3517 }
3518 },
3519 "/products": {
3520 "get": {
3521 "tags": ["Product"],
3522 "summary": "Get Products",
3523 "description": "**Purpose:** Retrieve comprehensive product catalog information for API-enabled products, regardless of current inventory levels.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for product data access\n- Optional query parameters for filtering results\n- No request body needed\n\n**Response Data:**\n- Returns array of product objects: `[{ ProductDetail }, ...]`\n- Array may contain 0 to 10,000+ products depending on location inventory size\n- Returns empty array `[]` if no products match criteria (not null)\n- Product details including SKU, name, description, category, brand, strain information\n- Pricing data with retail and medical pricing, tax rates, discount eligibility\n- Classification data including product types, categories, regulatory classifications\n- Lab results with potency data, cannabinoid profiles, test results when available\n- Inventory data showing stock levels and availability status\n- Media assets including product images and visual content\n- Compliance data with external IDs, producer information, regulatory data\n\n**Filtering Options:**\n- No parameters: Returns all API-enabled products for the location\n- fromLastModifiedDateUTC: Returns products modified after this date for incremental sync\n- isActive: Filter by active status (true/false/null for all)\n\n**Product Filtering Logic:**\n- Only products specifically enabled for API access are returned\n- Only includes products with online availability enabled (onlyOnlineAvailable = true)\n- Products returned even if currently out of stock\n- Results automatically filtered to authenticated user's location only\n\n**Common Use Cases:**\n- Get complete product catalog for first-time integration setup\n- Use incremental updates with fromLastModifiedDateUTC to sync only recent changes\n- Populate e-commerce online store with complete product information\n- Maintain up-to-date product database for point-of-sale systems\n- Build dispensary menus with detailed product information\n- Analyze product catalog for purchasing and inventory planning decisions\n\n**Performance & Limits:**\n- Use incremental sync with fromLastModifiedDateUTC for regular updates to minimize data transfer\n- Filter by isActive=true to exclude discontinued products for better performance\n- Run full catalog sync during off-peak hours for optimal performance\n- Large product catalogs may require pagination in future versions\n\n**Related Endpoints:**\n- `GET /inventory` - Current stock levels for products with available inventory\n- `GET /products/strains` - Strain-specific information and genetics data\n- `GET /products/external-categories` - Product categorization and classification data\n\n**Important Notes:**\n- This endpoint respects the \"API access\" setting on products for access control\n- Returns only online-available products (excludes products not enabled for online sales)\n- Response includes comprehensive product information for full integration capabilities\n- Products are automatically filtered to the authenticated location",
3524 "operationId": "ProductsGet",
3525 "parameters": [
3526 {
3527 "name": "fromLastModifiedDateUTC",
3528 "in": "query",
3529 "description": "Optional date filter to return only products modified after this timestamp - Used for incremental sync",
3530 "schema": {
3531 "type": "string",
3532 "format": "date-time"
3533 }
3534 },
3535 {
3536 "name": "isActive",
3537 "in": "query",
3538 "description": "Optional status filter - true for active products only, false for inactive only, null for all products",
3539 "schema": {
3540 "type": "boolean"
3541 }
3542 }
3543 ],
3544 "responses": {
3545 "200": {
3546 "description": "Success - Returns array of product objects: `[{ ProductDetail }, ...]`",
3547 "content": {
3548 "application/json": {
3549 "schema": {
3550 "type": "array",
3551 "items": {
3552 "$ref": "#/components/schemas/ProductDetail"
3553 }
3554 }
3555 }
3556 }
3557 },
3558 "401": {
3559 "description": "Unauthorized - Invalid or missing API key"
3560 },
3561 "403": {
3562 "description": "Forbidden - Account not authorized for inventory access"
3563 },
3564 "500": {
3565 "description": "Internal Server Error - Server error occurred"
3566 }
3567 }
3568 }
3569 },
3570 "/products/product": {
3571 "post": {
3572 "tags": ["Product"],
3573 "summary": "Create or Update Product",
3574 "description": "**Purpose:** Creates a new product or updates an existing product with comprehensive product information for inventory management.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for product data access\n- `ProductDetailUpload` object in request body with product details\n- Content-Type: application/json\n- SKU and ProductName required for new products\n\n**Response Data:**\n- Returns single `ProductDetail` object (not array) with updated product information\n- Response format: `{ ProductDetail }`\n- Includes assigned product ID for new products or updated ID for existing products\n- Complete product information with all fields populated\n\n**CRITICAL DATA LOSS WARNING:**\nMost fields will be overwritten with null/zero values if not provided in the request.\nRECOMMENDED APPROACH: First GET the existing product, modify only the fields you want to change, then POST the complete object back.\n\n**Required Fields:**\n- For CREATE: SKU and ProductName are required\n- For UPDATE: Only ProductId is required (SKU and ProductName can be omitted to preserve existing values)\n\n**Field Behavior:**\n- Optional<T> Fields: Can be explicitly set to null or omitted to preserve existing values\n- Regular Fields: Will be set to null/zero if omitted, potentially causing data loss\n- Exception: Fields like SKU and ProductName preserve existing values when omitted during updates\n\n**Common Use Cases:**\n- Add new products to the catalog for inventory management\n- Update existing product information when details change\n- Synchronize product data from external inventory systems\n- Bulk product updates for pricing or categorization changes\n- Maintain accurate product information for compliance and sales\n\n**Performance & Limits:**\n- Single product operation for targeted updates\n- Immediate validation and response\n- Changes reflected immediately in product catalogs\n- Consider using GET before POST to avoid data loss\n\n**Related Endpoints:**\n- `GET /products` - Retrieve existing product data before updates\n- `GET /brand` - Get valid brand IDs for product association\n- `GET /strains` - Get valid strain IDs for product classification\n\n**Important Notes:**\n- Data loss risk: Always retrieve existing product data before updates\n- Product ID assignment for successful new product creation\n- Validation performed before creation/update to ensure data integrity\n- Changes propagate to inventory and sales systems immediately",
3575 "operationId": "ProductsProductPost",
3576 "requestBody": {
3577 "description": "Product information to create or update - ProductDetailUpload object with product details",
3578 "content": {
3579 "application/json-patch+json": {
3580 "schema": {
3581 "$ref": "#/components/schemas/ProductDetailUpload"
3582 }
3583 },
3584 "application/json": {
3585 "schema": {
3586 "$ref": "#/components/schemas/ProductDetailUpload"
3587 }
3588 },
3589 "text/json": {
3590 "schema": {
3591 "$ref": "#/components/schemas/ProductDetailUpload"
3592 }
3593 },
3594 "application/*+json": {
3595 "schema": {
3596 "$ref": "#/components/schemas/ProductDetailUpload"
3597 }
3598 }
3599 },
3600 "x-bodyName": "product"
3601 },
3602 "responses": {
3603 "200": {
3604 "description": "Success",
3605 "content": {
3606 "application/json": {
3607 "schema": {
3608 "$ref": "#/components/schemas/ProductDetail"
3609 }
3610 }
3611 }
3612 },
3613 "400": {
3614 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
3615 "content": {
3616 "application/json": {
3617 "schema": {
3618 "$ref": "#/components/schemas/BadRequestResponse"
3619 }
3620 }
3621 }
3622 },
3623 "401": {
3624 "description": "Invalid API Key"
3625 },
3626 "403": {
3627 "description": "Account not authorized"
3628 },
3629 "500": {
3630 "description": "Something went wrong."
3631 }
3632 }
3633 }
3634 },
3635 "/products/products": {
3636 "post": {
3637 "tags": ["Product"],
3638 "summary": "Bulk Create or Update Products",
3639 "description": "**Purpose:** Create or update multiple products in a single operation for efficient catalog management and bulk data synchronization.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for product data operations\n- Array of `ProductDetailUpload` objects in request body with product details\n- Content-Type: application/json\n- Each product requires SKU and ProductName for creation, ProductId for updates\n\n**Response Data:**\n- Returns mixed array: `[{ ProductDetail }, { SaveProductError }, ...]`\n- Successful operations return complete `ProductDetail` objects with updated product information\n- Failed operations return `SaveProductError` objects with ProductId, SKU, ProductName, and ErrorMessage\n- HTTP 200 for successful processing - check individual items in response array for success/error status\n- HTTP 400 for validation errors that prevent processing\n- Mixed array allows partial success - some products may succeed while others fail\n\n**CRITICAL DATA LOSS WARNING:**\nMost fields will be overwritten with null/zero values if not provided in the request.\n**RECOMMENDED APPROACH:** First GET existing products, modify only desired fields, then POST complete objects back.\n\n**Create vs Update Behavior:**\n- **CREATE**: When ProductId is null or omitted, new product records will be created\n- **UPDATE**: When ProductId is provided with valid product IDs, existing products will be updated\n- **Mixed Operations**: Single request can include both create and update operations\n- **Validation**: SKU and ProductName required for creates, ProductId required for updates\n- **Individual Processing**: Each product processed independently - some may succeed while others fail\n\n**Field Preservation Behavior:**\n- **Optional<T> Fields**: Can be explicitly set to null or omitted to preserve existing values\n- **Regular Fields**: Will be set to null/zero if omitted, potentially causing data loss\n- **Preserved Fields**: SKU and ProductName preserve existing values when omitted during updates\n- **Best Practice**: Always provide complete product objects to avoid unintended data loss\n\n**Error Handling:**\n- **Partial Success**: Some products may succeed while others fail within the same request\n- **Error Identification**: Failed products include ErrorMessage, ProductId, SKU, and ProductName\n- **Validation Errors**: Returns HTTP 400 for validation errors that prevent processing\n- **Processing Errors**: Returns HTTP 200 with mixed results for individual product errors\n- **Rollback Behavior**: No automatic rollback - successful operations persist even if others fail\n\n**Common Use Cases:**\n- Import large product catalogs from external systems efficiently\n- Synchronize product changes across multiple products simultaneously\n- Bulk update pricing, categorization, or product attributes\n- Migrate product data between systems with batch processing\n- Update multiple products after inventory or regulatory changes\n\n**Performance & Limits:**\n- Optimized for bulk product operations and catalog management\n- Individual product validation and processing for data integrity\n- No automatic external system broadcasting for performance\n- Efficient for large-scale product catalog updates\n\n**Related Endpoints:**\n- `GET /products` - Retrieve existing product data before bulk updates\n- `POST /products/product` - Create or update individual products with external sync\n- `GET /brand` - Get valid brand IDs for product associations\n- `GET /strains` - Get valid strain IDs for product classifications\n\n**Important Notes:**\n- **Individual Processing**: Each product processed independently with separate success/failure results\n- **No External Broadcast**: Traceability system broadcasting not supported on this endpoint\n- **Data Loss Risk**: Always retrieve existing product data before bulk updates\n- **Error Checking Required**: Always check response for individual product errors\n- **Performance Optimized**: Designed for efficient bulk operations without external system overhead",
3640 "operationId": "ProductsProductsPost",
3641 "requestBody": {
3642 "description": "Array of product information to create or update - IEnumerable<ProductDetailUpload> objects",
3643 "content": {
3644 "application/json-patch+json": {
3645 "schema": {
3646 "type": "array",
3647 "items": {
3648 "$ref": "#/components/schemas/ProductDetailUpload"
3649 }
3650 }
3651 },
3652 "application/json": {
3653 "schema": {
3654 "type": "array",
3655 "items": {
3656 "$ref": "#/components/schemas/ProductDetailUpload"
3657 }
3658 }
3659 },
3660 "text/json": {
3661 "schema": {
3662 "type": "array",
3663 "items": {
3664 "$ref": "#/components/schemas/ProductDetailUpload"
3665 }
3666 }
3667 },
3668 "application/*+json": {
3669 "schema": {
3670 "type": "array",
3671 "items": {
3672 "$ref": "#/components/schemas/ProductDetailUpload"
3673 }
3674 }
3675 }
3676 },
3677 "x-bodyName": "products"
3678 },
3679 "responses": {
3680 "200": {
3681 "description": "Success - Products processed with individual success/error results",
3682 "content": {
3683 "application/json": {
3684 "schema": {
3685 "type": "array",
3686 "items": {
3687 "type": "object"
3688 }
3689 }
3690 }
3691 }
3692 },
3693 "400": {
3694 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors) OR `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array",
3695 "content": {
3696 "application/json": {
3697 "schema": {
3698 "$ref": "#/components/schemas/ValidationResult"
3699 }
3700 }
3701 }
3702 },
3703 "401": {
3704 "description": "Invalid API Key"
3705 },
3706 "403": {
3707 "description": "Account not authorized"
3708 },
3709 "500": {
3710 "description": "Something went wrong."
3711 }
3712 }
3713 }
3714 },
3715 "/products/set-image": {
3716 "post": {
3717 "tags": ["Product"],
3718 "summary": "Set Product Image",
3719 "description": "**Purpose:** Add or update a single image for a product to enhance product presentation and visual merchandising.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for product image management\n- `SetImageRequest` object in request body with ProductId and image data\n- Content-Type: application/json\n- Valid ProductId and base64-encoded image data required\n\n**Response Data:**\n- Returns single image response object: `{ SetImageResponse }`\n- Includes unique image ID for future image management operations\n- Provides image URL for immediate access to uploaded image\n- Contains ImageId (integer) and ImageUrl (string) fields only\n\n**Image Processing:**\n- **Single Image**: Adds one image per request to the specified product\n- **Image ID Assignment**: Returns unique DPOS product image ID for tracking\n- **Format Support**: Supports standard image formats via base64 encoding\n- **Validation**: Validates image data and product existence before processing\n\n**Integration Behavior:**\n- **Metrc Integration**: If using Metrc with upload product images enabled, the image will automatically upload to Metrc on next product save\n- **Automatic Sync**: Integration occurs when `Save Product` is called for this ProductId\n- **Compliance**: Supports regulatory compliance through integrated system image sync\n- **External Systems**: Compatible with cultivation and compliance system requirements\n\n**Common Use Cases:**\n- Add product photos for e-commerce and point-of-sale display\n- Update existing product images for marketing and merchandising\n- Comply with regulatory requirements for product visual documentation\n- Enhance customer experience with high-quality product imagery\n- Support integrated systems with automated image synchronization\n\n**Performance & Limits:**\n- Single image processing for targeted product updates\n- Base64 encoding for secure image data transmission\n- Validation performed before processing to ensure data integrity\n- Optimized for product visual merchandising workflows\n\n**Related Endpoints:**\n- `POST /products/remove-image` - Remove product images using the returned image ID\n- `POST /products/product` - Save product data and trigger Metrc image sync\n- `GET /products` - Retrieve products with associated image information\n\n**Important Notes:**\n- **Image ID Required**: Save the returned image ID for future image management operations\n- **Metrc Auto-Upload**: Images automatically sync to Metrc on next product save when enabled\n- **Single Operation**: One image per request - use multiple requests for multiple images\n- **Validation Required**: ProductId must exist and image data must be valid\n- **Integration Ready**: Supports automated compliance system synchronization",
3720 "operationId": "ProductsSet-imagePost",
3721 "requestBody": {
3722 "description": "Image upload request with ProductId and base64 image data - SetImageRequest object",
3723 "content": {
3724 "application/json-patch+json": {
3725 "schema": {
3726 "$ref": "#/components/schemas/SetImageRequest"
3727 }
3728 },
3729 "application/json": {
3730 "schema": {
3731 "$ref": "#/components/schemas/SetImageRequest"
3732 }
3733 },
3734 "text/json": {
3735 "schema": {
3736 "$ref": "#/components/schemas/SetImageRequest"
3737 }
3738 },
3739 "application/*+json": {
3740 "schema": {
3741 "$ref": "#/components/schemas/SetImageRequest"
3742 }
3743 }
3744 },
3745 "x-bodyName": "req"
3746 },
3747 "responses": {
3748 "200": {
3749 "description": "Success",
3750 "content": {
3751 "application/json": {
3752 "schema": {
3753 "$ref": "#/components/schemas/SetImageResponse"
3754 }
3755 }
3756 }
3757 },
3758 "400": {
3759 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
3760 "content": {
3761 "application/json": {
3762 "schema": {
3763 "$ref": "#/components/schemas/BadRequestResponse"
3764 }
3765 }
3766 }
3767 },
3768 "401": {
3769 "description": "Invalid API Key"
3770 },
3771 "403": {
3772 "description": "Account not authorized"
3773 },
3774 "500": {
3775 "description": "Something went wrong."
3776 }
3777 }
3778 }
3779 },
3780 "/products/remove-image": {
3781 "post": {
3782 "tags": ["Product"],
3783 "summary": "Delete Product Image",
3784 "description": "**Purpose:** Remove a specific image from a product using the image ID to maintain clean product presentation and manage visual merchandising.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for product image management\n- `DeleteImageRequest` object in request body with ProductId and ImageId\n- Content-Type: application/json\n- Valid ProductId and ImageId required (ImageId obtained from set-image response)\n\n**Response Data:**\n- Returns success confirmation object: `{ SuccessResult }`\n- Simple success confirmation with HTTP 200 status\n- No additional data fields returned beyond success indicator\n\n**Image Removal Process:**\n- **Targeted Deletion**: Removes specific image identified by ImageId\n- **Product Association**: Verifies image belongs to the specified ProductId\n- **Validation**: Ensures both ProductId and ImageId exist and are valid\n- **Clean Removal**: Permanently removes image from product and storage systems\n\n**Safety & Validation:**\n- **Existence Check**: Validates ProductId and ImageId before deletion\n- **Ownership Verification**: Ensures image belongs to the specified product\n- **Authorization**: Confirms user has permission to modify product images\n- **Error Handling**: Returns appropriate errors for invalid requests\n\n**Common Use Cases:**\n- Remove outdated or incorrect product images from visual merchandising\n- Clean up product galleries by deleting unwanted or duplicate images\n- Manage product image lifecycle for marketing and compliance requirements\n- Maintain accurate product representation in e-commerce and point-of-sale systems\n- Support product image management workflows and content updates\n\n**Performance & Limits:**\n- Single image deletion for targeted image management\n- Immediate removal from product and storage systems\n- Validation performed before deletion to ensure data integrity\n- Optimized for product visual merchandising and content management workflows\n\n**Related Endpoints:**\n- `POST /products/set-image` - Add images and obtain ImageId for future deletion\n- `GET /products` - Retrieve products with current image information\n- `POST /products/product` - Update product data and manage overall product information\n\n**Important Notes:**\n- **ImageId Required**: Use ImageId returned from set-image endpoint for deletion\n- **Permanent Operation**: Image deletion is permanent and cannot be undone\n- **Validation Critical**: Both ProductId and ImageId must be valid and associated\n- **Single Target**: One image per request - use multiple requests for multiple deletions\n- **Clean Management**: Essential for maintaining organized product image galleries",
3785 "operationId": "ProductsRemove-imagePost",
3786 "requestBody": {
3787 "description": "Image deletion request with ProductId and ImageId - DeleteImageRequest object",
3788 "content": {
3789 "application/json-patch+json": {
3790 "schema": {
3791 "$ref": "#/components/schemas/DeleteImageRequest"
3792 }
3793 },
3794 "application/json": {
3795 "schema": {
3796 "$ref": "#/components/schemas/DeleteImageRequest"
3797 }
3798 },
3799 "text/json": {
3800 "schema": {
3801 "$ref": "#/components/schemas/DeleteImageRequest"
3802 }
3803 },
3804 "application/*+json": {
3805 "schema": {
3806 "$ref": "#/components/schemas/DeleteImageRequest"
3807 }
3808 }
3809 },
3810 "x-bodyName": "req"
3811 },
3812 "responses": {
3813 "200": {
3814 "description": "Success",
3815 "content": {
3816 "application/json": {
3817 "schema": {
3818 "$ref": "#/components/schemas/SuccessResult"
3819 }
3820 }
3821 }
3822 },
3823 "400": {
3824 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
3825 "content": {
3826 "application/json": {
3827 "schema": {
3828 "$ref": "#/components/schemas/BadRequestResponse"
3829 }
3830 }
3831 }
3832 },
3833 "401": {
3834 "description": "Invalid API Key"
3835 },
3836 "403": {
3837 "description": "Account not authorized"
3838 },
3839 "500": {
3840 "description": "Something went wrong."
3841 }
3842 }
3843 }
3844 },
3845 "/products/strains": {
3846 "get": {
3847 "tags": ["Product"],
3848 "summary": "Get Product Strains",
3849 "description": "**Purpose:** Retrieve all available cannabis strains for product classification and inventory management in compliance with industry standards.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for strain data access\n- No query parameters required\n- No request body needed\n\n**Response Data:**\n- Returns array of strain objects: `[{ StrainDetail }, ...]`\n- Array typically contains 50-1,000+ strains depending on dispensary catalog\n- Returns empty array `[]` if no strains are configured (not null)\n- Basic strain information including ID, name, description, type, and external ID\n- Results automatically filtered to authenticated location strain catalog\n\n**Strain Information:**\n- **Strain ID**: Unique identifier for the strain\n- **Strain Name**: Display name of the strain\n- **Strain Description**: Basic text description of the strain\n- **Strain Abbreviation**: Short code or abbreviation for the strain\n- **Strain Type**: Basic type classification (e.g., Indica, Sativa, Hybrid)\n- **External ID**: External system identifier for integration\n\n**Common Use Cases:**\n- Populate strain dropdown lists in product creation and management forms\n- Display basic strain information for product attribution\n- Support strain-based product categorization and filtering\n- Enable strain identification in inventory management systems\n- Provide strain reference data for product classification workflows\n\n**Performance & Limits:**\n- Optimized for product classification and strain selection workflows\n- Comprehensive strain database for complete cannabis product categorization\n- Results filtered to location-specific strain catalog\n- Efficient for strain-based product search and filtering operations\n\n**Related Endpoints:**\n- `GET /products` - View products with assigned strain classifications\n- `POST /products/product` - Assign strains to products during creation/update\n- `GET /strains` - Manage strain master data and configurations\n\n**Important Notes:**\n- **Basic Reference Data**: Provides essential strain identification information only\n- **Limited Data**: Only includes basic strain details - no cannabinoid profiles, genetics, or effects\n- **Product Classification**: Strains used for basic product categorization and identification\n- **Location Catalog**: Results filtered to strains available for the authenticated location\n- **External Integration**: Includes External ID for traceability system integration",
3850 "operationId": "ProductsStrainsGet",
3851 "responses": {
3852 "200": {
3853 "description": "Success",
3854 "content": {
3855 "application/json": {
3856 "schema": {
3857 "type": "array",
3858 "items": {
3859 "$ref": "#/components/schemas/StrainDetail"
3860 }
3861 }
3862 }
3863 }
3864 },
3865 "401": {
3866 "description": "Invalid API Key"
3867 },
3868 "403": {
3869 "description": "Account not authorized"
3870 },
3871 "500": {
3872 "description": "Something went wrong."
3873 }
3874 }
3875 }
3876 },
3877 "/products/external-categories": {
3878 "get": {
3879 "tags": ["Product"],
3880 "summary": "Get External Categories",
3881 "description": "**Purpose:** Retrieve external system categories for product classification to support integration with traceability and compliance systems.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for external category data access\n- UserId query parameter highly recommended for traceability system integration\n- No request body needed\n\n**Response Data:**\n- Returns array of string values with external category names\n- Response format: `[string, string, ...]`\n- Array contains categories available from integrated traceability systems\n- Returns empty array `[]` if no external categories are available (not null)\n- Category names correspond to external system classification standards\n- Used for populating ExternalCategory field in product data\n- Results depend on configured integrated systems and user permissions\n\n**Integration Requirements:**\n- **Traceability Systems**: Categories pulled from connected compliance systems (e.g., Metrc, BioTrack)\n- **User Context**: UserId parameter provides system access context for category retrieval\n- **System Configuration**: Available categories depend on integrated system configuration\n- **Compliance Mapping**: Categories align with regulatory compliance requirements\n\n**Parameter Guidelines:**\n- **UserId**: Technically optional but highly recommended for traceability system calls\n- **System Failure**: Call may fail without UserId when categories come from traceability systems\n- **Permission Context**: UserId provides proper system access permissions for category retrieval\n- **Default Fallback**: Uses default user (ID 6) when UserId not provided\n\n**Common Use Cases:**\n- Populate product ExternalCategory field with valid compliance categories\n- Synchronize product classifications with regulatory traceability systems\n- Ensure product categories align with state compliance requirements\n- Support automated product categorization for integrated systems\n- Validate product classifications against external system standards\n\n**Performance & Limits:**\n- Real-time integration with external traceability systems\n- Response time dependent on external system availability\n- Error handling for external system connectivity issues\n- Optimized for product classification and compliance workflows\n\n**Related Endpoints:**\n- `POST /products/product` - Use external categories in ExternalCategory field\n- `GET /products` - View products with assigned external categories\n- `POST /products/products` - Bulk assign external categories to products\n\n**Important Notes:**\n- **UserId Critical**: Highly recommended to prevent traceability system call failures\n- **External Dependency**: Categories sourced from integrated traceability systems\n- **Compliance Essential**: External categories required for regulatory compliance\n- **System Specific**: Available categories depend on configured integrated systems\n- **Error Handling**: May return errors if external systems are unavailable",
3882 "operationId": "ProductsExternal-categoriesGet",
3883 "parameters": [
3884 {
3885 "name": "userId",
3886 "in": "query",
3887 "description": "User ID for traceability system access context (highly recommended) - Optional but prevents system failures",
3888 "schema": {
3889 "type": "integer",
3890 "format": "int32"
3891 }
3892 }
3893 ],
3894 "responses": {
3895 "200": {
3896 "description": "Success",
3897 "content": {
3898 "application/json": {
3899 "schema": {
3900 "type": "array",
3901 "items": {
3902 "type": "string"
3903 }
3904 }
3905 }
3906 }
3907 },
3908 "400": {
3909 "description": "Bad Request - String error message (parse response body as plain text)",
3910 "content": {
3911 "application/json": {
3912 "schema": {
3913 "$ref": "#/components/schemas/BadRequestResponse"
3914 }
3915 }
3916 }
3917 },
3918 "401": {
3919 "description": "Invalid API Key"
3920 },
3921 "403": {
3922 "description": "Account not authorized"
3923 },
3924 "500": {
3925 "description": "Something went wrong."
3926 }
3927 }
3928 }
3929 },
3930 "/product-category": {
3931 "get": {
3932 "tags": ["ProductCategory"],
3933 "summary": "Get Product Categories",
3934 "description": "**Purpose:** Retrieves the complete list of product categories available for the authenticated organization for product classification and menu organization.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of product category objects: `[{ ProductCategory }, ...]`\n- Array typically contains 10-30 product categories per organization\n- Returns empty array `[]` if no categories configured (rare)\n- Includes category ID, name, and master category classification\n- Standard cannabis product categories (Flower, Edibles, Concentrates, etc.)\n- Results filtered to authenticated organization level and exclude deleted records\n\n**Common Use Cases:**\n- Populate product category dropdown lists in product creation forms\n- Organize product menus by category for customer browsing\n- Validate product categorization in inventory management systems\n- Generate category-specific reports for sales analytics\n- Support e-commerce product filtering and navigation\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Small dataset suitable for client-side caching\n- No pagination needed due to limited number of categories\n- Results consistent across all locations within organization\n\n**Related Endpoints:**\n- `GET /products` - Get products that use these categories\n- `POST /product` - Create products with category assignments\n- `GET /regulatory-category` - Get regulatory category classifications\n\n**Important Notes:**\n- Categories are defined at organization level (LSP) not location level\n- Standard cannabis industry categories for compliance and consistency\n- Used for product menu organization and customer filtering\n- Essential reference data for product management workflows",
3935 "operationId": "Product-categoryGet",
3936 "responses": {
3937 "200": {
3938 "description": "Success - Returns array of product category objects: `[{ ProductCategory }, ...]`",
3939 "content": {
3940 "application/json": {
3941 "schema": {
3942 "type": "array",
3943 "items": {
3944 "$ref": "#/components/schemas/ProductCategory"
3945 }
3946 }
3947 }
3948 }
3949 },
3950 "401": {
3951 "description": "Unauthorized - Invalid or missing API key"
3952 },
3953 "403": {
3954 "description": "Forbidden - Account not authorized"
3955 },
3956 "500": {
3957 "description": "Internal Server Error - Server error occurred"
3958 }
3959 }
3960 }
3961 },
3962 "/purchase-order": {
3963 "get": {
3964 "tags": ["PurchaseOrder"],
3965 "summary": "Get Purchase Orders",
3966 "description": "**Purpose:** Retrieve purchase orders with comprehensive filtering options to support procurement management and vendor relationship tracking.\n\n**Request Requirements:**\n- \"PurchaseOrder\" role authorization required for purchase order data access\n- Optional query parameters available for filtering purchase orders\n- Purchase order management permissions for procurement operations\n\n**Response Data:**\n- Response format: `[{ PurchaseOrderData }, { PurchaseOrderData }, ...]`\n- **No pagination metadata**: Response contains only data array without total counts or page information\n- Array contains up to PageSize purchase orders (default 1000)\n- Returns empty array `[]` if no purchase orders match filtering criteria\n- Includes comprehensive purchase order details and line item information\n- Results automatically filtered to authenticated location\n\n**Pagination Usage:**\n- **First Request**: Call with PageNumber=0 to get first page\n- **Subsequent Requests**: Increment PageNumber for each additional page\n- **End Detection**: Continue requesting pages until you receive an empty array `[]`\n- **Page Size Control**: Use PageSize parameter to control items per page\n- **Example Flow**: Request PageNumber=0 → Process results → Increment PageNumber → Repeat until empty `[]` response\n\n**Pagination Detection:**\n- **End of data detection**: Continue requesting pages until you receive an empty array `[]`\n- **No metadata provided**: Response does not include total counts, page counts, or hasNextPage indicators\n- **Sequential access**: Increment PageNumber from 0 until empty response indicates no more data\n\n**Filtering Options:**\n- **FromDateCreated**: Optional date parameter to filter orders created after specific date\n- **ToDateCreated**: Optional date parameter to filter orders created before specific date\n- **PurchaseOrderId**: Optional integer parameter to retrieve specific purchase order\n- **IncludeItemDetails**: Optional boolean to include detailed line item information\n\n**Purchase Order Information Included:**\n- **Order Details**: Purchase order identification, status, and vendor information\n- **Line Items**: Product details and quantities (when IncludeItemDetails is true)\n- **Dates**: Creation, modification, and expected delivery dates\n- **Financial Data**: Order totals, costs, and payment information\n\n**Common Use Cases:**\n- Display purchase orders for procurement management and vendor tracking\n- Filter orders by date ranges for reporting and analysis\n- Retrieve specific purchase orders for detailed review and management\n- Support vendor relationship management and procurement workflows\n- Generate procurement reports and purchase order analytics\n\n**Performance & Limits:**\n- Use consistent page size throughout pagination sequence for efficiency\n- Monitor response times and adjust page size for optimal performance\n- Cache results locally to minimize API calls and improve responsiveness\n- Validation performed on all query parameters before processing\n- Optimized for procurement management and vendor tracking workflows\n\n**Related Endpoints:**\n- `POST /purchase-order` - Create or update purchase orders\n- `GET /vendors` - View vendors associated with purchase orders\n- `GET /inventory` - View inventory levels for procurement planning\n\n**Important Notes:**\n- **Procurement Integration**: Essential for vendor management and procurement workflows\n- **Flexible Filtering**: Multiple parameters can be combined for precise order lookup\n- **Location Scoped**: Purchase orders filtered to authenticated location operations\n- **Validation Required**: All query parameters validated before purchase order retrieval",
3967 "operationId": "Purchase-orderGet",
3968 "parameters": [
3969 {
3970 "name": "FromDateCreated",
3971 "in": "query",
3972 "description": "Start date filter for purchase orders created after this date (optional).",
3973 "schema": {
3974 "type": "string",
3975 "format": "date-time"
3976 }
3977 },
3978 {
3979 "name": "ToDateCreated",
3980 "in": "query",
3981 "description": "End date filter for purchase orders created before this date (optional).",
3982 "schema": {
3983 "type": "string",
3984 "format": "date-time"
3985 }
3986 },
3987 {
3988 "name": "PurchaseOrderId",
3989 "in": "query",
3990 "description": "Specific purchase order identifier for single order retrieval (optional).",
3991 "schema": {
3992 "type": "integer",
3993 "format": "int32"
3994 }
3995 },
3996 {
3997 "name": "IncludeItemDetails",
3998 "in": "query",
3999 "description": "Whether to include detailed line item information in the response (default: false).",
4000 "schema": {
4001 "type": "boolean"
4002 }
4003 },
4004 {
4005 "name": "PageNumber",
4006 "in": "query",
4007 "description": "Page number for pagination control (default: 0).",
4008 "schema": {
4009 "type": "integer",
4010 "format": "int32"
4011 }
4012 },
4013 {
4014 "name": "PageSize",
4015 "in": "query",
4016 "description": "Number of results per page for pagination (default: 1000).",
4017 "schema": {
4018 "type": "integer",
4019 "format": "int32"
4020 }
4021 }
4022 ],
4023 "responses": {
4024 "200": {
4025 "description": "Success",
4026 "content": {
4027 "application/json": {
4028 "schema": {
4029 "type": "array",
4030 "items": {
4031 "$ref": "#/components/schemas/PurchaseOrderData"
4032 }
4033 }
4034 }
4035 }
4036 },
4037 "400": {
4038 "description": "Bad Request - `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array",
4039 "content": {
4040 "application/json": {
4041 "schema": {
4042 "$ref": "#/components/schemas/BadRequestResponse"
4043 }
4044 }
4045 }
4046 },
4047 "401": {
4048 "description": "Invalid API Key"
4049 },
4050 "403": {
4051 "description": "Account not authorized"
4052 },
4053 "500": {
4054 "description": "Something went wrong."
4055 }
4056 }
4057 },
4058 "post": {
4059 "tags": ["PurchaseOrder"],
4060 "summary": "Create or Update Purchase Orders",
4061 "description": "**Purpose:** Create new purchase orders or update existing purchase orders for procurement management and vendor relationship operations.\n\n**Request Requirements:**\n- \"PurchaseOrder\" role authorization required for purchase order modification\n- `CreateUpdatePurchaseOrdersRequest` object in request body with purchase order details\n- Content-Type: application/json\n- Purchase order management permissions for procurement operations\n\n**Response Data:**\n- Returns result object with purchase order creation/update status\n- Response format: `{ \"createdPurchaseOrderIds\": [int, ...], \"updatedPurchaseOrderIds\": [int, ...] }`\n- Includes arrays of created and updated purchase order IDs\n- Purchase order identification and processing results\n\n**Create vs Update Behavior:**\n- **CREATE**: When PurchaseOrderId is null, a new purchase order will be created\n- **UPDATE**: When PurchaseOrderId is non-null, the existing purchase order will be updated\n- **Identification**: Purchase order existence determined by PurchaseOrderId value\n- **Line Item Updates**: Updates affect both purchase order header and line item details\n\n**Purchase Order Data Fields:**\n- **Header Information**: Vendor details, order dates, and procurement specifications\n- **Line Items**: Product details, quantities, costs, and delivery requirements\n- **Financial Data**: Order totals, taxes, and payment terms\n- **Status Information**: Order status and processing workflow details\n\n**Common Use Cases:**\n- Create new purchase orders for vendor procurement operations\n- Update existing purchase orders with revised quantities or specifications\n- Modify purchase order line items for procurement adjustments\n- Support vendor relationship management and procurement workflows\n- Maintain accurate procurement records and vendor tracking\n\n**Performance & Limits:**\n- Validation performed before any purchase order processing\n- Batch processing for multiple purchase order operations\n- Optimized for procurement management and vendor tracking workflows\n- Changes reflected immediately in procurement and vendor systems\n\n**Related Endpoints:**\n- `GET /purchase-order` - Retrieve purchase orders for review before updates\n- `GET /vendors` - View vendors for purchase order creation\n- `GET /inventory` - Check inventory levels for procurement planning\n\n**Important Notes:**\n- **Validation Critical**: All purchase order data validated before processing\n- **Procurement Integration**: Purchase orders affect vendor management and procurement workflows\n- **Location Scoped**: Purchase orders automatically associated with authenticated location\n- **Batch Processing**: Multiple purchase orders can be processed in single operation\n- **Vendor Relationships**: Purchase order creation strengthens vendor tracking and management",
4062 "operationId": "Purchase-orderPost",
4063 "requestBody": {
4064 "description": "Purchase order creation/update request with order details - CreateUpdatePurchaseOrdersRequest object",
4065 "content": {
4066 "application/json-patch+json": {
4067 "schema": {
4068 "$ref": "#/components/schemas/CreateUpdatePurchaseOrdersRequest"
4069 }
4070 },
4071 "application/json": {
4072 "schema": {
4073 "$ref": "#/components/schemas/CreateUpdatePurchaseOrdersRequest"
4074 }
4075 },
4076 "text/json": {
4077 "schema": {
4078 "$ref": "#/components/schemas/CreateUpdatePurchaseOrdersRequest"
4079 }
4080 },
4081 "application/*+json": {
4082 "schema": {
4083 "$ref": "#/components/schemas/CreateUpdatePurchaseOrdersRequest"
4084 }
4085 }
4086 },
4087 "x-bodyName": "req"
4088 },
4089 "responses": {
4090 "200": {
4091 "description": "Success",
4092 "content": {
4093 "application/json": {
4094 "schema": {
4095 "$ref": "#/components/schemas/CreateUpdatePurchaseOrderResponse"
4096 }
4097 }
4098 }
4099 },
4100 "400": {
4101 "description": "Bad Request - `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array",
4102 "content": {
4103 "application/json": {
4104 "schema": {
4105 "$ref": "#/components/schemas/BadRequestResponse"
4106 }
4107 }
4108 }
4109 },
4110 "401": {
4111 "description": "Invalid API Key"
4112 },
4113 "403": {
4114 "description": "Account not authorized"
4115 },
4116 "500": {
4117 "description": "Something went wrong."
4118 }
4119 }
4120 }
4121 },
4122 "/reference/units": {
4123 "get": {
4124 "tags": ["ReferenceData"],
4125 "summary": "Get Units",
4126 "description": "**Purpose:** Retrieves the complete list of measurement units available for product tracking and inventory management.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of unit objects: `[{ Unit }, ...]`\n- Array typically contains 20-30 measurement units\n- Returns empty array `[]` if no units configured (rare)\n- Includes unit ID, name, abbreviation, and conversion factors\n- Standard measurement units (grams, ounces, pounds, units, etc.)\n- Essential reference data for product weight and quantity tracking\n\n**Common Use Cases:**\n- Configure product measurement units in inventory systems\n- Support weight-based pricing and inventory calculations\n- Validate unit measurements in product and package operations\n- Generate reports with proper unit conversions and formatting\n- Enable accurate compliance reporting with regulatory weight requirements\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Small static dataset suitable for client-side caching\n- No pagination needed due to limited number of standard units\n- Consistent across all organizations and locations\n\n**Related Endpoints:**\n- `GET /reference/unit-types` - Get unit type classifications\n- `GET /products` - Get products with unit measurements\n- `GET /inventory` - Get inventory with unit-based quantities\n\n**Important Notes:**\n- Standard cannabis industry measurement units for compliance\n- Essential for accurate weight tracking and regulatory reporting\n- Used throughout the system for product and inventory operations\n- Supports both metric and imperial measurement systems",
4127 "operationId": "ReferenceUnitsGet",
4128 "responses": {
4129 "200": {
4130 "description": "Success - Returns array of unit objects: `[{ Unit }, ...]`",
4131 "content": {
4132 "application/json": {
4133 "schema": {
4134 "type": "array",
4135 "items": {
4136 "$ref": "#/components/schemas/Unit"
4137 }
4138 }
4139 }
4140 }
4141 },
4142 "401": {
4143 "description": "Unauthorized - Invalid or missing API key"
4144 },
4145 "403": {
4146 "description": "Forbidden - Account not authorized"
4147 },
4148 "500": {
4149 "description": "Internal Server Error - Server error occurred"
4150 }
4151 }
4152 }
4153 },
4154 "/reference/unit-types": {
4155 "get": {
4156 "tags": ["ReferenceData"],
4157 "summary": "Get Unit Types",
4158 "description": "**Purpose:** Retrieves the complete list of unit type classifications used to categorize different measurement units.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of unit type objects: `[{ UnitType }, ...]`\n- Array typically contains 5-10 unit type categories\n- Returns empty array `[]` if no unit types configured (rare)\n- Includes type ID, name, and category descriptions\n- Unit type categories (Weight, Volume, Count, etc.) for measurement classification\n- Reference data for organizing units by measurement type\n\n**Common Use Cases:**\n- Organize units by measurement type in user interfaces\n- Validate unit assignments based on product type requirements\n- Support advanced filtering and categorization of measurement units\n- Enable proper unit selection based on product characteristics\n- Generate reports organized by measurement type categories\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Small static dataset suitable for client-side caching\n- No pagination needed due to limited number of unit types\n- Consistent across all organizations and locations\n\n**Related Endpoints:**\n- `GET /reference/units` - Get specific units within these types\n- `GET /products` - Get products using typed unit measurements\n- `GET /inventory` - Get inventory with type-based unit tracking\n\n**Important Notes:**\n- Standard measurement type categories for consistent classification\n- Helps organize units for better user experience and validation\n- Used for advanced unit selection and validation logic\n- Essential for proper measurement type categorization",
4159 "operationId": "ReferenceUnit-typesGet",
4160 "responses": {
4161 "200": {
4162 "description": "Success - Returns array of unit type objects: `[{ UnitType }, ...]`",
4163 "content": {
4164 "application/json": {
4165 "schema": {
4166 "type": "array",
4167 "items": {
4168 "$ref": "#/components/schemas/UnitType"
4169 }
4170 }
4171 }
4172 }
4173 },
4174 "401": {
4175 "description": "Unauthorized - Invalid or missing API key"
4176 },
4177 "403": {
4178 "description": "Forbidden - Account not authorized"
4179 },
4180 "500": {
4181 "description": "Internal Server Error - Server error occurred"
4182 }
4183 }
4184 }
4185 },
4186 "/reference/lab-result-units": {
4187 "get": {
4188 "tags": ["ReferenceData"],
4189 "summary": "Get Lab Result Units",
4190 "description": "**Purpose:** Retrieves the complete list of measurement units specifically used for laboratory test results and cannabinoid/terpene reporting.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of lab result unit objects: `[{ LabResultUnitData }, ...]`\n- Array typically contains 5-15 specialized lab measurement units\n- Returns empty array `[]` if no lab units configured (rare)\n- Includes lab result unit ID and unit name/abbreviation\n- Specialized units for cannabinoid and terpene concentration measurements\n- Essential reference data for laboratory test result reporting\n\n**Common Use Cases:**\n- Configure lab result units in testing and compliance systems\n- Validate unit measurements in laboratory data submissions\n- Support cannabinoid and terpene concentration reporting\n- Generate compliance reports with proper lab result unit formatting\n- Enable accurate potency testing and COA (Certificate of Analysis) generation\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Small static dataset suitable for client-side caching\n- No pagination needed due to limited number of lab result units\n- Consistent across all organizations and locations\n\n**Related Endpoints:**\n- `GET /reference/lab-results-names` - Get available lab result names\n- `GET /reference/units` - Get general measurement units\n- Lab result POST endpoints (for submitting test data)\n\n**Important Notes:**\n- Specialized units for cannabis laboratory testing and analysis\n- Essential for compliance with cannabis testing regulations\n- Used specifically for cannabinoid and terpene concentration measurements\n- Required for accurate Certificate of Analysis (COA) reporting\n- Different from general product measurement units",
4191 "operationId": "ReferenceLab-result-unitsGet",
4192 "responses": {
4193 "200": {
4194 "description": "Success - Returns array of lab result unit objects: `[{ LabResultUnitData }, ...]`",
4195 "content": {
4196 "application/json": {
4197 "schema": {
4198 "type": "array",
4199 "items": {
4200 "$ref": "#/components/schemas/LabResultUnitData"
4201 }
4202 }
4203 }
4204 }
4205 },
4206 "401": {
4207 "description": "Unauthorized - Invalid or missing API key"
4208 },
4209 "403": {
4210 "description": "Forbidden - Account not authorized"
4211 },
4212 "500": {
4213 "description": "Internal Server Error - Server error occurred"
4214 }
4215 }
4216 }
4217 },
4218 "/reference/lab-results-names": {
4219 "get": {
4220 "tags": ["ReferenceData"],
4221 "summary": "Get Lab Result Names",
4222 "description": "**Purpose:** Retrieves the complete list of available lab result names that can be used with lab result POST endpoints for cannabinoid and terpene testing.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of strings with valid lab result names: `[\"string\", ...]`\n- Array typically contains 50-100 cannabinoid and terpene names\n- Returns empty array `[]` if no lab result names configured (rare)\n- Standard cannabinoid names (THC, CBD, CBG, CBN, etc.)\n- Common terpene names (Myrcene, Limonene, Pinene, etc.)\n- All acceptable values for lab result name validation\n\n**Common Use Cases:**\n- Validate lab result names before submitting test data\n- Populate dropdown lists for lab result entry forms\n- Reference data for cannabinoid and terpene testing workflows\n- Support laboratory data integration and validation\n- Generate dynamic forms for Certificate of Analysis (COA) entry\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Static dataset suitable for client-side caching\n- No pagination needed due to manageable list size\n- Consistent across all organizations and locations\n\n**Related Endpoints:**\n- `GET /reference/lab-result-units` - Get valid units for these results\n- Lab result POST endpoints - Submit test data using these names\n- `GET /products` - Get products with lab result data\n\n**Important Notes:**\n- These are the only valid values accepted for lab result names\n- Standard cannabis testing terminology for consistency\n- Essential for proper cannabinoid and terpene data submission\n- Used throughout the system for lab result validation\n- Required for compliance with cannabis testing standards",
4223 "operationId": "ReferenceLab-results-namesGet",
4224 "responses": {
4225 "200": {
4226 "description": "Success - Returns array of strings with lab result names: `[\"string\", ...]`",
4227 "content": {
4228 "application/json": {
4229 "schema": {
4230 "type": "array",
4231 "items": {
4232 "type": "string"
4233 }
4234 }
4235 }
4236 }
4237 },
4238 "401": {
4239 "description": "Unauthorized - Invalid or missing API key"
4240 },
4241 "403": {
4242 "description": "Forbidden - Account not authorized"
4243 },
4244 "500": {
4245 "description": "Internal Server Error - Server error occurred"
4246 }
4247 }
4248 }
4249 },
4250 "/regulatory-category": {
4251 "get": {
4252 "tags": ["RegulatoryCategory"],
4253 "summary": "Get Regulatory Categories",
4254 "description": "**Purpose:** Retrieves the complete list of regulatory categories available for the authenticated location for compliance reporting and state-mandated product classification.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of regulatory category objects: `[{ RegulatoryCategory }, ...]`\n- Array typically contains 5-20 regulatory categories per jurisdiction\n- Returns empty array `[]` if no regulatory categories configured (rare)\n- Includes category ID, name, and state-specific compliance codes\n- State-mandated product categories for regulatory reporting (varies by jurisdiction)\n- Results filtered to authenticated location's regulatory requirements\n\n**Common Use Cases:**\n- Validate product regulatory classification for compliance reporting\n- Generate state-mandated reports with proper category classifications\n- Ensure product data meets regulatory requirements for each jurisdiction\n- Support track-and-trace system integration with proper categorization\n- Populate regulatory category fields in product management systems\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Small dataset specific to location's regulatory jurisdiction\n- No pagination needed due to limited number of regulatory categories\n- Results may vary by location based on state/local regulations\n\n**Related Endpoints:**\n- `GET /product-category` - Get general product categories\n- `GET /products` - Get products with regulatory category assignments\n- `POST /product` - Create products with regulatory category classifications\n\n**Important Notes:**\n- Categories are specific to location's regulatory jurisdiction\n- Required for compliance with state cannabis regulations\n- Essential for accurate track-and-trace system reporting\n- Category requirements may change based on evolving regulations\n- Used for state-mandated reporting and audit compliance",
4255 "operationId": "Regulatory-categoryGet",
4256 "responses": {
4257 "200": {
4258 "description": "Success - Returns array of regulatory category objects: `[{ RegulatoryCategory }, ...]`",
4259 "content": {
4260 "application/json": {
4261 "schema": {
4262 "type": "array",
4263 "items": {
4264 "$ref": "#/components/schemas/RegulatoryCategory"
4265 }
4266 }
4267 }
4268 }
4269 },
4270 "401": {
4271 "description": "Unauthorized - Invalid or missing API key"
4272 },
4273 "403": {
4274 "description": "Forbidden - Account not authorized"
4275 },
4276 "500": {
4277 "description": "Internal Server Error - Server error occurred"
4278 }
4279 }
4280 }
4281 },
4282 "/reporting/inventory": {
4283 "get": {
4284 "tags": ["Reporting"],
4285 "operationId": "ReportingInventoryGet",
4286 "parameters": [
4287 {
4288 "name": "includeLabResults",
4289 "in": "query",
4290 "schema": {
4291 "type": "boolean",
4292 "default": false
4293 }
4294 },
4295 {
4296 "name": "includeRoomQuantities",
4297 "in": "query",
4298 "schema": {
4299 "type": "boolean",
4300 "default": false
4301 }
4302 },
4303 {
4304 "name": "includeAllocated",
4305 "in": "query",
4306 "schema": {
4307 "type": "boolean",
4308 "default": false
4309 }
4310 },
4311 {
4312 "name": "includeLineage",
4313 "in": "query",
4314 "schema": {
4315 "type": "boolean",
4316 "default": false
4317 }
4318 }
4319 ],
4320 "responses": {
4321 "200": {
4322 "description": "OK",
4323 "content": {
4324 "application/json": {
4325 "schema": {
4326 "type": "array",
4327 "items": {
4328 "$ref": "#/components/schemas/ReportingInventoryItem"
4329 }
4330 }
4331 }
4332 }
4333 },
4334 "401": {
4335 "description": "Unauthorized"
4336 },
4337 "403": {
4338 "description": "Forbidden"
4339 },
4340 "500": {
4341 "description": "Internal Server Error"
4342 }
4343 }
4344 }
4345 },
4346 "/reporting/transactions": {
4347 "get": {
4348 "tags": ["Reporting"],
4349 "summary": "Transactions List",
4350 "description": "Retrieves POS and Wholesale transaction(s) from the provided dates and/or transactionId.\nThe use of transactionId, to/from transaction date, and to/from last modified date are mutually exclusive.\nProviding more than one will result in a validation error.\n\n**Performance & Limits:**\n- Rate limited to 600 requests per minute (higher limit for frequently accessed transaction data)\n- Optimized for transaction reporting and financial analysis workflows\n- Use date range filtering to limit result size for better performance",
4351 "operationId": "ReportingTransactionsGet",
4352 "parameters": [
4353 {
4354 "name": "TransactionId",
4355 "in": "query",
4356 "description": "Specific transaction identifier for single transaction lookup.",
4357 "schema": {
4358 "type": "integer",
4359 "format": "int32"
4360 }
4361 },
4362 {
4363 "name": "FromLastModifiedDateUTC",
4364 "in": "query",
4365 "description": "Start date for filtering transactions by last modified date (UTC) for incremental sync.",
4366 "schema": {
4367 "type": "string",
4368 "format": "date-time"
4369 }
4370 },
4371 {
4372 "name": "ToLastModifiedDateUTC",
4373 "in": "query",
4374 "description": "End date for filtering transactions by last modified date (UTC) for incremental sync.",
4375 "schema": {
4376 "type": "string",
4377 "format": "date-time"
4378 }
4379 },
4380 {
4381 "name": "FromDateUTC",
4382 "in": "query",
4383 "description": "Start date for filtering transactions by transaction date (UTC) for periodic reports.",
4384 "schema": {
4385 "type": "string",
4386 "format": "date-time"
4387 }
4388 },
4389 {
4390 "name": "ToDateUTC",
4391 "in": "query",
4392 "description": "End date for filtering transactions by transaction date (UTC) for periodic reports.",
4393 "schema": {
4394 "type": "string",
4395 "format": "date-time"
4396 }
4397 },
4398 {
4399 "name": "IncludeDetail",
4400 "in": "query",
4401 "description": "Flag to include detailed transaction item information for comprehensive reporting.",
4402 "schema": {
4403 "type": "boolean"
4404 }
4405 },
4406 {
4407 "name": "IncludeTaxes",
4408 "in": "query",
4409 "description": "Flag to include tax information for financial compliance reporting.",
4410 "schema": {
4411 "type": "boolean"
4412 }
4413 },
4414 {
4415 "name": "IncludeOrderIds",
4416 "in": "query",
4417 "description": "Flag to include order identifiers for order fulfillment tracking.",
4418 "schema": {
4419 "type": "boolean"
4420 }
4421 },
4422 {
4423 "name": "IncludeFeesAndDonations",
4424 "in": "query",
4425 "description": "Flag to include fees and donations for complete financial analysis.",
4426 "schema": {
4427 "type": "boolean"
4428 }
4429 }
4430 ],
4431 "responses": {
4432 "200": {
4433 "description": "Success",
4434 "content": {
4435 "application/json": {
4436 "schema": {
4437 "type": "array",
4438 "items": {
4439 "$ref": "#/components/schemas/Transaction"
4440 }
4441 }
4442 }
4443 }
4444 },
4445 "400": {
4446 "description": "Bad Request - `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array",
4447 "content": {
4448 "application/json": {
4449 "schema": {
4450 "$ref": "#/components/schemas/ValidationResult"
4451 }
4452 }
4453 }
4454 },
4455 "401": {
4456 "description": "Invalid API Key"
4457 },
4458 "403": {
4459 "description": "Account not authorized"
4460 },
4461 "500": {
4462 "description": "Something went wrong."
4463 },
4464 "503": {
4465 "description": "Temporarily disabled (kill switch)."
4466 }
4467 }
4468 }
4469 },
4470 "/reporting/customers": {
4471 "get": {
4472 "tags": ["Reporting"],
4473 "summary": "Customers List (Reporting)",
4474 "description": "**Purpose:** Retrieves a comprehensive list of wholesale and POS customers optimized for reporting and analytics.\n\n**Request Requirements:**\n- \"Reporting\" role authorization required for analytics data access\n- Optional UTC date parameters for filtering\n- No request body needed\n\n**Response Data:**\n- Response format: `[{ Customer }, { Customer }, ...]`\n- Array of `Customer` objects with complete customer information\n- Includes primary and secondary qualifying conditions for medical customers\n- Contains customer profile data, contact information, and preferences\n- Results are automatically filtered by the authenticated location\n\n**How This Differs from `/customer/customers`:**\n- Requires \"Reporting\" role instead of \"Customer\" role authorization\n- Optimized for reporting and analytics rather than operational management\n- Returns ALL customers for comprehensive reporting purposes\n- Enhanced date range filtering designed for reporting workflows\n- Performance tuned for bulk data export and analysis\n\n**Common Use Cases:**\n- Generate comprehensive customer reports and analytics\n- Export customer data for external systems or compliance requirements\n- Synchronize customer changes with external databases using incremental sync\n- Review customer records for regulatory compliance audits\n- Analyze customer demographics and behavior patterns for marketing\n\n**Performance & Limits:**\n- Rate limited to 600 requests per minute (higher limit for frequently accessed reporting data)\n- Use date range filtering to limit result size for better performance\n- Consider using `/reporting/customers-paginated` for very large datasets\n- Cache results locally and use incremental sync for regular updates\n- May return large datasets as it includes ALL customer types\n\n**Related Endpoints:**\n- `GET /reporting/customers-paginated` - Paginated version for large datasets\n- `GET /customer/customers` - Operational customer management endpoint\n\n**Important Notes:**\n- This endpoint returns ALL customers (wholesale and POS) and may return large datasets\n- Requires reporting authorization role for access\n- Use date filtering to improve performance with large customer bases",
4475 "operationId": "ReportingCustomersGet",
4476 "parameters": [
4477 {
4478 "name": "fromLastModifiedDateUTC",
4479 "in": "query",
4480 "description": "Filter customers modified after this UTC date - Used for incremental sync",
4481 "schema": {
4482 "type": "string",
4483 "format": "date-time"
4484 }
4485 },
4486 {
4487 "name": "toLastModifiedDateUTC",
4488 "in": "query",
4489 "description": "Filter customers modified before this UTC date - Used for date range filtering",
4490 "schema": {
4491 "type": "string",
4492 "format": "date-time"
4493 }
4494 },
4495 {
4496 "name": "includeAnonymous",
4497 "in": "query",
4498 "description": "Include anonymous customers in results - Default: true",
4499 "schema": {
4500 "type": "boolean",
4501 "default": true
4502 }
4503 }
4504 ],
4505 "responses": {
4506 "200": {
4507 "description": "Success - Returns array of customer objects",
4508 "content": {
4509 "application/json": {
4510 "schema": {
4511 "type": "array",
4512 "items": {
4513 "$ref": "#/components/schemas/Customer"
4514 }
4515 }
4516 }
4517 }
4518 },
4519 "401": {
4520 "description": "Unauthorized - Invalid or missing API key"
4521 },
4522 "403": {
4523 "description": "Forbidden - Account not authorized for reporting access"
4524 },
4525 "500": {
4526 "description": "Internal Server Error - Server error occurred"
4527 }
4528 }
4529 }
4530 },
4531 "/reporting/customers-paginated": {
4532 "get": {
4533 "tags": ["Reporting"],
4534 "summary": "Get Customers (Paginated, Reporting)",
4535 "description": "**Purpose:** Retrieve paginated customer data optimized for reporting and analytics with enhanced performance for large-scale customer analysis.\n\n**Request Requirements:**\n- \"Reporting\" role authorization required for analytics data access\n- Optional query parameters for filtering and pagination control\n- No request body needed\n- Maximum page size of 10,000 customers for optimal performance\n\n**Response Data:**\n- Response format: `[{ Customer }, { Customer }, ...]`\n- Returns array of `Customer` objects for the requested page\n- Array contains up to PageSize customers (default 1000, max 10,000)\n- Returns empty array `[]` if no customers match criteria for the page (not null)\n- **No pagination metadata**: Response contains only customer data without total counts or page information\n- Includes primary and secondary qualifying conditions for medical customers\n- Contains customer profile data, contact information, and preferences\n- Results automatically filtered to authenticated location\n\n**Pagination Usage:**\n- **First Request**: Call with PageNumber=0 to get first page\n- **Subsequent Requests**: Increment PageNumber for each additional page\n- **End Detection**: Continue requesting pages until you receive an empty array `[]`\n- **Page Size Control**: Use PageSize parameter to control items per page (max 10,000)\n- **Example Flow**: Request PageNumber=0 → Process results → Increment PageNumber → Repeat until empty `[]` response\n\n**Key Differences from `/customer/customers-paginated`:**\n- **Authorization**: Requires \"Reporting\" role vs \"Customer\" role\n- **Purpose**: Optimized for reporting and analytics vs operational customer management\n- **Page Size**: Higher maximum page size limits for bulk reporting\n- **Profile Sharing**: Enhanced customer profile sharing logic for reporting\n- **Performance**: Designed for large-scale data export and analysis\n\n**Filtering Options:**\n- fromLastModifiedDateUTC: Returns customers modified after this date (incremental sync)\n- toLastModifiedDateUTC: Returns customers modified before this date (date range filtering)\n- includeAnonymous: Include anonymous customers in results (default: true)\n\n**Common Use Cases:**\n- Handle thousands of customers efficiently with paginated processing\n- Process customers in manageable chunks for batch operations\n- Avoid loading entire customer base at once for memory-conscious applications\n- Stream customer data for live reporting dashboards and analytics\n- Transfer customer data between systems in controlled batches\n\n**Performance & Limits:**\n- Maximum 10,000 customers per page for optimal performance\n- Start with PageNumber=0 and increment until no more data available\n- Use consistent PageSize throughout pagination sequence for efficiency\n- Monitor response times and adjust PageSize for optimal performance\n- Cache results locally to minimize API calls and improve responsiveness\n\n**Pagination Detection:**\n- **End of data detection**: Continue requesting pages until you receive an empty array `[]`\n- **No metadata provided**: Response does not include total counts, page counts, or hasNextPage indicators\n- **Sequential access**: Increment PageNumber from 0 until empty response indicates no more data\n\n**Related Endpoints:**\n- `GET /reporting/customers` - Non-paginated version for smaller datasets\n- `GET /customer/customers` - Operational customer management endpoint\n\n**Important Notes:**\n- **Pagination Required**: Large customer bases require multiple page requests\n- **Enhanced Profile Logic**: Uses advanced customer profile sharing based on LSP configuration\n- **Reporting Optimized**: Designed for analytics and large-scale data processing\n- **Location Scoped**: Results automatically filtered to authenticated location\n- **Page Size Validation**: Requests exceeding 10,000 customers per page will be rejected",
4536 "operationId": "ReportingCustomers-paginatedGet",
4537 "parameters": [
4538 {
4539 "name": "fromLastModifiedDateUTC",
4540 "in": "query",
4541 "description": "Filter customers modified after this UTC date for incremental sync - Optional",
4542 "schema": {
4543 "type": "string",
4544 "format": "date-time"
4545 }
4546 },
4547 {
4548 "name": "toLastModifiedDateUTC",
4549 "in": "query",
4550 "description": "Filter customers modified before this UTC date for date range filtering - Optional",
4551 "schema": {
4552 "type": "string",
4553 "format": "date-time"
4554 }
4555 },
4556 {
4557 "name": "PageNumber",
4558 "in": "query",
4559 "description": "Page number for sequential pagination (integer, starts at 0) - Default: 0",
4560 "schema": {
4561 "type": "integer",
4562 "format": "int32",
4563 "default": 0
4564 }
4565 },
4566 {
4567 "name": "PageSize",
4568 "in": "query",
4569 "description": "Number of items per page (integer) - Default: 1000, Maximum: 10000",
4570 "schema": {
4571 "type": "integer",
4572 "format": "int32",
4573 "default": 1000
4574 }
4575 },
4576 {
4577 "name": "includeAnonymous",
4578 "in": "query",
4579 "description": "Include anonymous customers in results - Default: true",
4580 "schema": {
4581 "type": "boolean",
4582 "default": true
4583 }
4584 }
4585 ],
4586 "responses": {
4587 "200": {
4588 "description": "Success - Returns array of customer objects for the requested page",
4589 "content": {
4590 "application/json": {
4591 "schema": {
4592 "type": "array",
4593 "items": {
4594 "$ref": "#/components/schemas/Customer"
4595 }
4596 }
4597 }
4598 }
4599 },
4600 "400": {
4601 "description": "Bad Request - `BadRequestResponse` object with `message` string field (check `propertyErrors`: null for simple message, array for field-specific errors)",
4602 "content": {
4603 "application/json": {
4604 "schema": {
4605 "$ref": "#/components/schemas/BadRequestResponse"
4606 }
4607 }
4608 }
4609 },
4610 "401": {
4611 "description": "Unauthorized - Invalid or missing API key"
4612 },
4613 "403": {
4614 "description": "Forbidden - Account not authorized for reporting access"
4615 },
4616 "500": {
4617 "description": "Internal Server Error - Server error occurred"
4618 }
4619 }
4620 }
4621 },
4622 "/reporting/register-adjustments": {
4623 "get": {
4624 "tags": ["Reporting"],
4625 "summary": "Get Register Adjustments",
4626 "description": "**Purpose:** Retrieve register adjustment transactions for cash management and reconciliation reporting with detailed audit trail information.\n\n**Request Requirements:**\n- \"Reporting\" role authorization required for financial data access\n- Optional query parameters for date range filtering\n- No request body needed\n\n**Response Data:**\n- Response format: `[{ RegisterAdjustment }, { RegisterAdjustment }, ...]`\n- Returns array of `RegisterAdjustment` objects with detailed transaction information\n- Array may contain 0 to 1,000+ adjustments depending on date range and activity\n- Returns empty array `[]` if no adjustments match criteria (not null)\n- Includes adjustment amounts, types, timestamps, and employee information\n- Contains reason codes and descriptions for each adjustment\n- Results automatically filtered to authenticated location\n\n**Transaction Types Included:**\n- **Adjustments**: Manual cash register corrections and balancing entries\n- **Close Outs**: End-of-shift register closing transactions\n- **Deposits**: Cash deposits made to the register\n- **Withdrawals**: Cash withdrawals from the register\n- **Cash Drops**: Safe drops and cash removal transactions\n\n**Filtering Options:**\n- fromLastModifiedDateUTC: Returns adjustments modified after this date (incremental sync)\n- toLastModifiedDateUTC: Returns adjustments modified before this date (date range filtering)\n\n**Common Use Cases:**\n- Track all register cash movements for balancing and reconciliation\n- Maintain detailed records of cash handling activities for audit trails\n- Generate end-of-shift cash management summaries and reports\n- Document cash handling for regulatory requirements and compliance\n- Analyze cash flow patterns and adjustment trends for financial analysis\n- Monitor unusual adjustment patterns or discrepancies for loss prevention\n\n**Performance & Limits:**\n- Use date range filtering to limit results to specific time periods for optimal performance\n- Combine with cash-summary endpoint for comprehensive cash reporting\n- Cache results locally and use incremental sync for regular updates\n- Optimized for financial reconciliation and audit trail workflows\n\n**Related Endpoints:**\n- `GET /reporting/register-transactions` - Complete register activity including sales\n- `GET /reporting/cash-summary` - Comprehensive cash reporting and summaries\n- `GET /reporting/closing-report` - Financial closing reports with cash details\n\n**Important Notes:**\n- **Adjustment Focus**: This endpoint focuses specifically on register adjustments only\n- **Complete Activity**: For complete register activity including sales, use register-transactions\n- **Audit Trail**: Maintains detailed records of all cash handling activities\n- **Location Scoped**: Results automatically filtered to authenticated location\n- **Employee Tracking**: Includes employee information for accountability and audit purposes",
4627 "operationId": "ReportingRegister-adjustmentsGet",
4628 "parameters": [
4629 {
4630 "name": "fromLastModifiedDateUTC",
4631 "in": "query",
4632 "description": "Filter adjustments modified after this date for incremental sync - Optional",
4633 "schema": {
4634 "type": "string",
4635 "format": "date-time"
4636 }
4637 },
4638 {
4639 "name": "toLastModifiedDateUTC",
4640 "in": "query",
4641 "description": "Filter adjustments modified before this date for date range filtering - Optional",
4642 "schema": {
4643 "type": "string",
4644 "format": "date-time"
4645 }
4646 }
4647 ],
4648 "responses": {
4649 "200": {
4650 "description": "Success - Returns array of register adjustment objects",
4651 "content": {
4652 "application/json": {
4653 "schema": {
4654 "type": "array",
4655 "items": {
4656 "$ref": "#/components/schemas/RegisterAdjustment"
4657 }
4658 }
4659 }
4660 }
4661 },
4662 "401": {
4663 "description": "Unauthorized - Invalid or missing API key"
4664 },
4665 "403": {
4666 "description": "Forbidden - Account not authorized for reporting access"
4667 },
4668 "500": {
4669 "description": "Internal Server Error - Server error occurred"
4670 }
4671 }
4672 }
4673 },
4674 "/reporting/register-transactions": {
4675 "get": {
4676 "tags": ["Reporting"],
4677 "summary": "Get Register Transactions (Comprehensive Transaction History)",
4678 "description": "**Purpose:** Retrieve comprehensive register transaction history including sales, adjustments, cash management, and operational activities for complete financial reporting.\n\n**Request Requirements:**\n- \"Reporting\" role authorization required for financial transaction data access\n- Optional query parameters for date range filtering\n- No request body needed\n\n**Response Data:**\n- Response format: `[{ RegisterTransaction }, { RegisterTransaction }, ...]`\n- Returns array of `RegisterTransaction` objects with comprehensive transaction data\n- Array may contain 0 to 50,000+ transactions depending on date range and business volume\n- Returns empty array `[]` if no transactions match criteria (not null)\n- Includes financial details, customer information, product details, and employee tracking\n- Complete audit trail with timestamps, register context, and status information\n- Results automatically filtered to authenticated location\n\n**Transaction Types Included:**\n- **Sales Transactions**: Completed customer purchases and returns\n- **Register Adjustments**: Manual cash corrections and balance adjustments\n- **Cash Management**: Deposits, withdrawals, cash drops, and till operations\n- **Register Close-Outs**: End-of-shift register balancing and reconciliation\n- **Payment Processing**: Credit card, cash, and other payment method transactions\n- **Operational Activities**: Register opening, closing, and maintenance operations\n\n**Transaction Data Returned:**\n- **Financial Details**: Transaction amounts, payment methods, taxes, and fees\n- **Customer Information**: Customer IDs, types, and transaction associations\n- **Product Details**: Items sold, quantities, prices, and categories\n- **Employee Tracking**: Staff members who processed transactions\n- **Timestamps**: Creation, modification, and completion times\n- **Register Context**: Terminal/register identification and session information\n- **Status Information**: Transaction status, voiding, and modification history\n\n**Filtering Options:**\n- fromLastModifiedDateUTC: Returns transactions modified after this date (incremental sync)\n- toLastModifiedDateUTC: Returns transactions modified before this date (date range filtering)\n\n**Common Use Cases:**\n- Balance daily sales across all registers and payment methods for financial reconciliation\n- Generate comprehensive revenue reports and analytics for sales reporting\n- Maintain detailed transaction records for compliance and audit preparation\n- Track all cash movements and register balancing activities for cash management\n- Analyze sales patterns, employee performance, and business trends for performance analysis\n- Extract detailed tax information for regulatory compliance and tax reporting\n- Monitor transaction patterns for unusual activities and fraud prevention\n\n**Performance & Limits:**\n- Large datasets: This endpoint can return substantial amounts of transaction data\n- Use date range filtering to limit results for better performance\n- Use fromLastModifiedDateUTC for regular data synchronization and incremental sync\n- Schedule large data exports during low-traffic periods for optimal performance\n- Optimized for comprehensive financial reporting and audit trail requirements\n\n**Related Endpoints:**\n- `GET /reporting/register-adjustments` - Cash adjustments and corrections only\n- `GET /reporting/closing-report` - Summary financial reports for specific date ranges\n- `GET /reporting/cash-summary` - Cash-specific summaries and balancing information\n\n**Important Notes:**\n- **Comprehensive Data**: Returns ALL register activities, resulting in potentially large datasets\n- **Real-Time Updates**: Transaction data reflects current state and may include recent modifications\n- **Location Scoped**: Results automatically filtered to authenticated dispensary location\n- **Historical Accuracy**: Maintains complete audit trail for all register operations\n- **Complete Activity**: This is the most comprehensive endpoint for all register transaction types",
4679 "operationId": "ReportingRegister-transactionsGet",
4680 "parameters": [
4681 {
4682 "name": "fromLastModifiedDateUTC",
4683 "in": "query",
4684 "description": "Filter transactions modified after this date for incremental sync - Optional",
4685 "schema": {
4686 "type": "string",
4687 "format": "date-time"
4688 }
4689 },
4690 {
4691 "name": "toLastModifiedDateUTC",
4692 "in": "query",
4693 "description": "Filter transactions modified before this date for date range filtering - Optional",
4694 "schema": {
4695 "type": "string",
4696 "format": "date-time"
4697 }
4698 }
4699 ],
4700 "responses": {
4701 "200": {
4702 "description": "Success - Returns array of RegisterTransaction objects with comprehensive transaction data",
4703 "content": {
4704 "application/json": {
4705 "schema": {
4706 "type": "array",
4707 "items": {
4708 "$ref": "#/components/schemas/RegisterTransaction"
4709 }
4710 }
4711 }
4712 }
4713 },
4714 "401": {
4715 "description": "Unauthorized - Invalid or missing API key"
4716 },
4717 "403": {
4718 "description": "Forbidden - Account not authorized for reporting access"
4719 },
4720 "500": {
4721 "description": "Internal Server Error - Server error occurred"
4722 }
4723 }
4724 }
4725 },
4726 "/reporting/cash-summary": {
4727 "get": {
4728 "tags": ["Reporting"],
4729 "summary": "Get Cash Summary (Real-time Register Activity)",
4730 "description": "**Purpose:** Retrieve real-time register cash activity summary with comprehensive financial reconciliation data for cash management and balancing.\n\n**Request Requirements:**\n- \"Reporting\" role authorization required for financial data access\n- Optional query parameters for date range filtering\n- Date range must be within the last 7 days for optimal performance\n- No request body needed\n\n**Response Data:**\n- Response format: `[{ RegisterCashSummary }, { RegisterCashSummary }, ...]`\n- Returns array of `RegisterCashSummary` objects with detailed cash flow information\n- Array may contain 1-50+ register summaries depending on number of active registers\n- Returns empty array `[]` if no cash activity matches criteria (not null)\n- Real-time data reflecting current register status and activities\n- Includes variance calculations and reconciliation details\n- Results automatically filtered to authenticated location\n\n**Summary Data Included:**\n- **Starting Balance**: Register opening cash amount for the period\n- **Ending Balance**: Current or closing register cash amount\n- **Sales**: Total cash sales transactions processed\n- **Returns**: Cash refunds and return transactions\n- **Deposits**: Cash deposits added to the register\n- **Adjustments**: Manual cash corrections and modifications\n- **Over/Short**: Cash variance from expected amounts\n\n**Filtering Options:**\n- fromLastModifiedDateUTC: Returns activity after this date (incremental sync, within 7 days)\n- toLastModifiedDateUTC: Returns activity before this date (date range filtering)\n\n**Common Use Cases:**\n- Track current register cash status throughout the day for real-time monitoring\n- Balance register cash at shift changes for reconciliation\n- Generate end-of-day cash summaries for closing procedures\n- Identify and investigate cash discrepancies for variance analysis\n- Create comprehensive cash flow reports for financial reporting\n- Maintain detailed cash handling records for audit preparation\n\n**Performance & Limits:**\n- Rate limited to 480 requests per minute (higher limit for frequent cash monitoring)\n- Date range restriction: fromLastModifiedDateUTC must be within the last 7 days\n- Use recent date ranges (within 7 days) for fastest response times\n- Combine with register-adjustments endpoint for detailed transaction breakdown\n- Cache results and refresh periodically for dashboard applications\n- Optimized for real-time cash monitoring and reconciliation workflows\n\n**Related Endpoints:**\n- `GET /reporting/register-adjustments` - Detailed transaction breakdown\n- `GET /reporting/register-transactions` - Complete register transaction history\n- `GET /reporting/closing-report` - Comprehensive financial closing reports\n\n**Important Notes:**\n- **Real-time Data**: Provides real-time data and may show different results than historical reports during active business hours\n- **7-Day Limit**: Date filtering restricted to last 7 days for optimal performance\n- **Active Business Hours**: Results may vary during active operations due to real-time updates\n- **Location Scoped**: Results automatically filtered to authenticated location\n- **Variance Tracking**: Includes over/short calculations for cash discrepancy identification",
4731 "operationId": "ReportingCash-summaryGet",
4732 "parameters": [
4733 {
4734 "name": "fromLastModifiedDateUTC",
4735 "in": "query",
4736 "description": "Filter activity after this date (must be within last 7 days) - Optional",
4737 "schema": {
4738 "type": "string",
4739 "format": "date-time"
4740 }
4741 },
4742 {
4743 "name": "toLastModifiedDateUTC",
4744 "in": "query",
4745 "description": "Filter activity before this date for date range filtering - Optional",
4746 "schema": {
4747 "type": "string",
4748 "format": "date-time"
4749 }
4750 }
4751 ],
4752 "responses": {
4753 "200": {
4754 "description": "Success - Returns array of register cash summary objects",
4755 "content": {
4756 "application/json": {
4757 "schema": {
4758 "type": "array",
4759 "items": {
4760 "$ref": "#/components/schemas/RegisterCashSummary"
4761 }
4762 }
4763 }
4764 }
4765 },
4766 "400": {
4767 "description": "Bad Request - String error message (parse response body as plain text)",
4768 "content": {
4769 "application/json": {
4770 "schema": {
4771 "type": "string"
4772 }
4773 }
4774 }
4775 },
4776 "401": {
4777 "description": "Unauthorized - Invalid or missing API key"
4778 },
4779 "403": {
4780 "description": "Forbidden - Account not authorized for reporting access"
4781 },
4782 "500": {
4783 "description": "Internal Server Error - Server error occurred"
4784 }
4785 }
4786 }
4787 },
4788 "/reporting/loyalty-snapshot": {
4789 "get": {
4790 "tags": ["Reporting"],
4791 "summary": "Get Loyalty Balance Snapshot (Daily)",
4792 "description": "**Purpose:** Retrieve current loyalty point balances for all customers with nightly batch processing for comprehensive loyalty program reporting and analysis.\n\n**Request Requirements:**\n- \"Reporting\" role authorization required for loyalty data access\n- No query parameters required\n- No request body needed\n- Rate limited to 1 request per minute for system protection\n\n**Response Data:**\n- Response format: `[{ LoyaltySnapshot }, { LoyaltySnapshot }, ...]`\n- Returns array of `LoyaltySnapshot` objects with customer loyalty information\n- Array typically contains 100-10,000+ customers depending on loyalty program participation\n- Returns empty array `[]` if no customers have loyalty activity (not null)\n- Includes current point balances, loyalty tier information, and customer identifiers\n- Contains earned points, redeemed points, and available balance details\n- Results automatically filtered to authenticated location\n\n**Data Characteristics:**\n- **Update Frequency**: Nightly batch processing (updated once per day)\n- **Data Freshness**: Reflects loyalty activity through the previous business day\n- **Scope**: All customers with loyalty program participation\n- **Balance Types**: Current available points, earned points, redeemed points\n- **Configuration**: Uses either loyalty ledger service or database depending on system configuration\n\n**Common Use Cases:**\n- Generate end-of-day loyalty summaries for daily loyalty reports\n- Check customer loyalty balances and history for customer service\n- Identify customers by loyalty tier or balance ranges for marketing campaigns\n- Document loyalty program activity for audits and compliance reporting\n- Export loyalty data to external systems for data synchronization\n- Analyze loyalty program engagement and effectiveness for analytics\n\n**Consumption Guidelines:**\n- **Recommended Frequency**: Once per day (after nightly processing completes)\n- **Optimal Timing**: Early morning hours after batch processing\n- **Caching Strategy**: Cache results for 24 hours, refresh daily\n\n**Performance & Limits:**\n- Rate limited to 1 request per minute for system protection\n- Schedule automated calls during off-peak hours for optimal performance\n- Cache results locally to avoid repeated calls within the same day\n- Use for batch processing rather than real-time customer lookups\n- Optimized for daily loyalty program management and reporting workflows\n\n**Related Endpoints:**\n- `GET /reporting/customer-loyalty-snapshot` - Individual customer loyalty data\n- `GET /reporting/loyalty-transactions-paginated` - Detailed loyalty transaction history\n- `GET /reporting/national-loyalty-snapshot-paginated` - Cross-organization loyalty data\n\n**Important Notes:**\n- **Snapshot Data**: This is a snapshot of loyalty balances as of the last nightly processing\n- **Real-time Alternative**: For real-time loyalty transactions, use other loyalty endpoints\n- **Nightly Processing**: Data reflects activity through the previous business day\n- **Location Scoped**: Results filtered to authenticated location loyalty participants\n- **Rate Limited**: Maximum 1 request per minute to protect system resources",
4793 "operationId": "ReportingLoyalty-snapshotGet",
4794 "responses": {
4795 "200": {
4796 "description": "Success - Returns array of loyalty balance snapshot objects",
4797 "content": {
4798 "application/json": {
4799 "schema": {
4800 "type": "array",
4801 "items": {
4802 "$ref": "#/components/schemas/LoyaltySnapshot"
4803 }
4804 }
4805 }
4806 }
4807 },
4808 "401": {
4809 "description": "Unauthorized - Invalid or missing API key"
4810 },
4811 "403": {
4812 "description": "Forbidden - Account not authorized for reporting access"
4813 },
4814 "500": {
4815 "description": "Internal Server Error - Server error occurred"
4816 }
4817 }
4818 }
4819 },
4820 "/reporting/products": {
4821 "get": {
4822 "tags": ["Reporting"],
4823 "summary": "Get Products (Master List, Reporting)",
4824 "description": "**Purpose:** Retrieve the complete product master list with comprehensive product data for reporting and analytics, including all products regardless of API or online availability settings.\n\n**Request Requirements:**\n- \"Reporting\" role authorization required for comprehensive product data access\n- Optional query parameters for incremental sync filtering\n- No request body needed\n\n**Response Data:**\n- Response format: `[{ ProductDetail }, { ProductDetail }, ...]`\n- Returns array of `ProductDetail` objects with complete product information\n- Array typically contains 100-50,000+ products depending on catalog size\n- Returns empty array `[]` if no products exist or match criteria (not null)\n- Includes ALL products in the system (active and inactive)\n- Contains pricing, categories, strains, lab results, and inventory data\n- Results automatically filtered to authenticated location\n\n**Key Differences from `/products`:**\n- **No API Access Filter**: Returns ALL products, not just those enabled for API access\n- **No Online Filter**: Ignores online availability settings used by standard products endpoint\n- **Master Data Focus**: Designed for comprehensive product data exports and reporting\n- **Complete Dataset**: Includes inactive and non-public products for complete catalog view\n\n**Filtering Options:**\n- fromLastModifiedDateUTC: Returns products modified after this date (incremental sync)\n\n**Common Use Cases:**\n- Get complete product catalog for analysis and comprehensive reporting\n- Export all product data for external systems and data warehousing\n- Review all products regardless of API/online settings for inventory audits\n- Maintain complete product records for master data management\n- Generate reports including all products for compliance reporting\n\n**When to Use This vs `/products`:**\n- **Use `/reporting/products`**: For complete data exports, reporting, audits, and analytics\n- **Use `/products`**: For e-commerce, POS integration, and customer-facing applications\n\n**Performance & Limits:**\n- Large datasets: This endpoint can return substantial product catalogs\n- Use fromLastModifiedDateUTC for incremental sync to optimize performance\n- Optimized for comprehensive product reporting and analytics workflows\n- Consider pagination for very large product catalogs (50,000+ products)\n\n**Related Endpoints:**\n- `GET /products` - Customer-facing products with API and online filters\n- `GET /inventory` - Product inventory levels and availability\n- `GET /product-categories` - Product categorization data\n\n**Important Notes:**\n- **Complete Dataset**: Returns ALL products, including those not intended for public API access or online sales\n- **Master Data**: This is the authoritative source for complete product catalog data\n- **Reporting Focus**: Designed for analytics and reporting rather than customer-facing operations\n- **Location Scoped**: Results filtered to authenticated location product catalog\n- **Incremental Sync**: Use date filtering for efficient data synchronization",
4825 "operationId": "ReportingProductsGet",
4826 "parameters": [
4827 {
4828 "name": "fromLastModifiedDateUTC",
4829 "in": "query",
4830 "description": "Filter products modified after this date for incremental sync - Optional",
4831 "schema": {
4832 "type": "string",
4833 "format": "date-time"
4834 }
4835 }
4836 ],
4837 "responses": {
4838 "200": {
4839 "description": "Success",
4840 "content": {
4841 "application/json": {
4842 "schema": {
4843 "type": "array",
4844 "items": {
4845 "$ref": "#/components/schemas/ProductDetail"
4846 }
4847 }
4848 }
4849 }
4850 },
4851 "401": {
4852 "description": "Invalid API Key"
4853 },
4854 "403": {
4855 "description": "Account not authorized"
4856 },
4857 "500": {
4858 "description": "Something went wrong."
4859 }
4860 }
4861 }
4862 },
4863 "/reporting/closing-report": {
4864 "get": {
4865 "tags": ["Reporting"],
4866 "summary": "Get Closing Report (Comprehensive Financial Summary)",
4867 "description": "**Purpose:** Retrieve comprehensive closing report with detailed financial summaries, payment breakdowns, and business analytics for specified date range reporting.\n\n**Request Requirements:**\n- \"Reporting\" role authorization required for financial data access\n- fromDateUTC and toDateUTC parameters required (both must be provided)\n- Date range must be between 12 hours and 31 days maximum\n- UTC datetime format required for all date parameters\n\n**Response Data:**\n- Response format: `{ ClosingReport }` or `{ ClosingReportV2 }` (structure varies by system configuration)\n- Returns `ClosingReport` or `ClosingReportV2` object with comprehensive financial data\n- Single object containing multi-dimensional analysis across all business aspects\n- Not an array - returns one comprehensive report object for the date range\n- Multi-dimensional analysis across payment methods, customer types, and product categories\n- Detailed tax calculations and compliance information\n- Payment processor-specific data and settlement details\n- Results automatically filtered to authenticated location\n\n**Date Range Restrictions:**\n- **Maximum Range**: 31 days or less\n- **Minimum Range**: Greater than 12 hours\n- **Format**: UTC datetime values\n- **Both Required**: fromDateUTC and toDateUTC must be provided\n\n**Report Sections Included:**\n- **Payment Summary**: Breakdown by payment method (cash, card, etc.)\n- **Customer Type Summary**: Sales analysis by customer categories\n- **Category Summary**: Revenue breakdown by product categories\n- **Tax Summary**: Detailed tax calculations and rates\n- **Order Source Summary**: Sales by channel (online, in-store, etc.)\n- **Order Type Summary**: Analysis by order types (delivery, pickup, etc.)\n- **Fees & Donations**: Processing fees and charitable donations (when enabled)\n- **Pay-by-Bank Details**: ACH transaction summaries and batch files (when enabled)\n\n**Response Version Determination:**\n- Response structure varies based on internal system configuration\n- **V1 (ClosingReport)**: Standard financial summaries without tips/fees\n- **V2 (ClosingReportV2)**: Enhanced with tips, fees, and Pay-by-Bank details\n- **API Consumer Guidance**: Both versions share common base fields, V2 extends V1 with additional properties\n- **Breaking Change Protection**: V2 is additive-only (safe to parse as V1 and ignore extra fields)\n\n**Handling Variable Response Types:**\n- **Recommended Approach**: Parse response for common fields first, then check for V2-specific properties\n- **Common Base Properties**: All versions include PaymentSummary, CustomerTypeSummary, CategorySummary, TaxSummary\n- **V2 Additional Properties**: TipsSummary, FeesSummary, PayByBankDetails (when present)\n\n**Common Use Cases:**\n- Generate end-of-period financial summaries for daily/weekly closing\n- Balance sales across all payment methods and channels for financial reconciliation\n- Extract detailed tax information for compliance and tax reporting\n- Analyze sales performance across multiple dimensions for business analytics\n- Reconcile payment processor settlements for payment processing\n- Generate comprehensive financial documentation for audit preparation\n\n**Performance & Limits:**\n- This report processes large amounts of transactional data\n- Longer date ranges may take additional time to generate\n- Use shorter date ranges for faster processing\n- Schedule report generation during off-peak hours for optimal performance\n- Cache results for frequently accessed date ranges\n\n**Related Endpoints:**\n- `GET /reporting/register-transactions` - Detailed transaction-level data\n- `GET /reporting/cash-summary` - Cash-specific summaries\n- `GET /reporting/register-adjustments` - Register adjustment details\n\n**Important Notes:**\n- **Processing Intensive**: This report processes large amounts of transactional data\n- **Date Range Validation**: Requests with invalid date ranges will be rejected\n- **Comprehensive Data**: Includes all financial aspects of business operations\n- **Location Scoped**: Results filtered to authenticated location financial data\n- **Version Dependent**: Response object type depends on system configuration and features enabled",
4868 "operationId": "ReportingClosing-reportGet",
4869 "parameters": [
4870 {
4871 "name": "fromDateUTC",
4872 "in": "query",
4873 "description": "Start date for the report period (required) - Must be UTC datetime",
4874 "schema": {
4875 "type": "string",
4876 "format": "date-time"
4877 }
4878 },
4879 {
4880 "name": "toDateUTC",
4881 "in": "query",
4882 "description": "End date for the report period (required) - Must be UTC datetime",
4883 "schema": {
4884 "type": "string",
4885 "format": "date-time"
4886 }
4887 }
4888 ],
4889 "responses": {
4890 "200": {
4891 "description": "Success - Returns comprehensive closing report object",
4892 "content": {
4893 "application/json": {
4894 "schema": {
4895 "$ref": "#/components/schemas/ClosingReportV2"
4896 }
4897 }
4898 }
4899 },
4900 "400": {
4901 "description": "Bad Request - String error message (parse response body as plain text)",
4902 "content": {
4903 "application/json": {
4904 "schema": {
4905 "type": "string"
4906 }
4907 }
4908 }
4909 },
4910 "401": {
4911 "description": "Unauthorized - Invalid or missing API key"
4912 },
4913 "403": {
4914 "description": "Forbidden - Account not authorized for reporting access"
4915 },
4916 "500": {
4917 "description": "Internal Server Error - Server error occurred"
4918 }
4919 }
4920 }
4921 },
4922 "/reporting/discounts": {
4923 "get": {
4924 "tags": ["Reporting"],
4925 "summary": "Get Discounts (Complete Discount Configuration)",
4926 "description": "**Purpose:** Retrieve comprehensive discount configuration data for all discounts regardless of status, type, or activation state for promotional reporting and analysis.\n\n**Request Requirements:**\n- \"Reporting\" role authorization required for discount configuration data access\n- Optional query parameter for including deleted discounts\n- No request body needed\n\n**Response Data:**\n- Response format: `[{ ReportingDiscountDetail }, { ReportingDiscountDetail }, ...]`\n- Returns array of `ReportingDiscountDetail` objects with complete discount configurations\n- Array typically contains 5-500+ discounts depending on promotional activity\n- Returns empty array `[]` if no discounts exist (not null)\n- Includes all restriction types and eligibility criteria\n- Contains scheduling and recurrence information\n- Provides location-specific applicability data\n- Results automatically filtered to authenticated location\n\n**Unique Endpoint:** This is the only discounts endpoint in the Public API - there is no parallel non-reporting version.\n\n**Filtering Options:**\n- includeDeleted: Include deleted/archived discounts in results (default: false)\n\n**Discount Information Included:**\n- **Basic Details**: Discount names, descriptions, and identifiers\n- **Status Information**: Active/inactive status and deletion state\n- **Type Classification**: Manual vs automatic discount types\n- **Validity Periods**: Start and end dates (converted to UTC)\n- **Discount Groups**: Associated discount group memberships\n- **Product Restrictions**: Specific products eligible for the discount\n- **Category Restrictions**: Product categories covered by the discount\n- **Strain Restrictions**: Cannabis strain-specific discount rules\n- **Brand Restrictions**: Brand-specific discount applications\n- **Vendor Restrictions**: Vendor-specific discount configurations\n- **Weekly Recurrence**: Recurring discount schedule information\n- **Location Mapping**: Multi-location discount applicability\n\n**Common Use Cases:**\n- Analyze discount effectiveness and usage patterns for discount analysis\n- Export complete discount configurations for configuration backup\n- Document promotional activities for regulatory review and compliance reporting\n- Synchronize discount rules with external systems for system integration\n- Review existing promotions for campaign planning and marketing planning\n- Maintain comprehensive records of all promotional activities for audit preparation\n\n**Performance & Limits:**\n- Use includeDeleted=false for active discount analysis to optimize performance\n- Cache results locally as discount configurations change infrequently\n- Process restriction arrays to understand discount eligibility logic\n- Optimized for promotional reporting and marketing analysis workflows\n\n**Related Endpoints:**\n- `GET /reporting/closing-report` - Financial impact of discount usage\n- `GET /reporting/register-transactions` - Transaction-level discount application\n- `GET /products` - Products eligible for discount restrictions\n\n**Important Notes:**\n- **Complete Configuration**: Returns ALL discount configurations including inactive and deleted discounts when requested\n- **Use Filtering**: Use includeDeleted parameter appropriately for your use case\n- **UTC Conversion**: All validity periods are automatically converted to UTC\n- **Location Scoped**: Results filtered to authenticated location discount configurations\n- **Unique Endpoint**: This is the only public API endpoint for discount data access",
4927 "operationId": "ReportingDiscountsGet",
4928 "parameters": [
4929 {
4930 "name": "includeDeleted",
4931 "in": "query",
4932 "description": "Include deleted/archived discounts in results - Default: false",
4933 "schema": {
4934 "type": "boolean",
4935 "default": false
4936 }
4937 }
4938 ],
4939 "responses": {
4940 "200": {
4941 "description": "Success - Returns array of comprehensive discount configuration objects",
4942 "content": {
4943 "application/json": {
4944 "schema": {
4945 "type": "array",
4946 "items": {
4947 "$ref": "#/components/schemas/ReportingDiscountDetail"
4948 }
4949 }
4950 }
4951 }
4952 },
4953 "401": {
4954 "description": "Unauthorized - Invalid or missing API key"
4955 },
4956 "403": {
4957 "description": "Forbidden - Account not authorized for reporting access"
4958 },
4959 "500": {
4960 "description": "Internal Server Error - Server error occurred"
4961 }
4962 }
4963 }
4964 },
4965 "/room/rooms": {
4966 "get": {
4967 "tags": ["Room"],
4968 "summary": "Get Rooms",
4969 "description": "**Purpose:** Retrieve cultivation rooms and facility areas configured for the location to support cultivation operations and facility management.\n\n**Request Requirements:**\n- \"Room\" role authorization required for room data access\n- Optional filtering parameters available for specific room lookup\n- Cultivation facility management permissions required\n\n**Response Data:**\n- Returns array of `Room` objects with room identification and type information\n- Array typically contains 5-50 rooms depending on cultivation facility size\n- Returns empty array `[]` if no rooms match criteria (not null)\n- Includes room identification, naming, and functional type flags\n- Results automatically filtered to authenticated location\n\n**Filtering Options:**\n- **roomId**: Optional integer parameter to retrieve specific room by ID\n- **roomName**: Optional string parameter to search rooms by name\n- **Combined Filtering**: Parameters can be used together for precise room lookup\n- **No Filters**: Returns all rooms when no parameters provided\n\n**Room Information Included:**\n- **RoomId**: Unique identifier for each cultivation room or facility area\n- **RoomName**: Human-readable name for room identification and management\n- **Location Information**: Facility location details (when integrator is Dutchie)\n- **Room Type Flags**: Boolean flags indicating room functionality (IsQuarantineRoom, IsVaultRoom, IsSalesFloor, etc.)\n\n**Common Use Cases:**\n- Populate room dropdown lists in cultivation management interfaces\n- Display available rooms for plant placement and cultivation tracking\n- Support cultivation facility room management and organization\n- Enable room-specific cultivation tracking and environmental monitoring\n- Facilitate cultivation workflow room assignments and plant movement\n\n**Performance & Limits:**\n- Efficient room lookup optimized for cultivation facility workflows\n- Optimized database queries for improved performance\n- Flexible filtering for specific room management needs\n- Results consistent across cultivation and facility management systems\n\n**Related Endpoints:**\n- `POST /room` - Create or update room configuration\n- `GET /plant` - View plants assigned to specific cultivation rooms\n- `GET /harvest` - Track harvest operations by cultivation room\n\n**Important Notes:**\n- **Cultivation Integration**: Essential for cultivation facility management and plant tracking\n- **Location Specific**: Results filtered to authenticated location facility setup\n- **Integrator Dependent**: Location information visibility controlled by integrator type\n- **Cultivation Ready**: Room data used throughout cultivation tracking workflows",
4970 "operationId": "RoomRoomsGet",
4971 "parameters": [
4972 {
4973 "name": "roomId",
4974 "in": "query",
4975 "description": "Optional room ID for specific room lookup - integer",
4976 "schema": {
4977 "type": "integer",
4978 "format": "int32"
4979 }
4980 },
4981 {
4982 "name": "roomName",
4983 "in": "query",
4984 "description": "Optional room name for searching rooms by name - string",
4985 "schema": {
4986 "type": "string"
4987 }
4988 }
4989 ],
4990 "responses": {
4991 "200": {
4992 "description": "Success - Returns array of room objects: `[{ Room }, ...]`",
4993 "content": {
4994 "application/json": {
4995 "schema": {
4996 "type": "array",
4997 "items": {
4998 "$ref": "#/components/schemas/Room"
4999 }
5000 }
5001 }
5002 }
5003 },
5004 "401": {
5005 "description": "Unauthorized - Invalid or missing API key"
5006 },
5007 "403": {
5008 "description": "Forbidden - Account not authorized for room access"
5009 },
5010 "500": {
5011 "description": "Internal Server Error - Server error occurred"
5012 }
5013 }
5014 }
5015 },
5016 "/room": {
5017 "post": {
5018 "tags": ["Room"],
5019 "summary": "Create or Update Room",
5020 "description": "**Purpose:** Create a new cultivation room or update an existing room configuration for cultivation facility management and plant tracking operations.\n\n**Request Requirements:**\n- \"Room\" role authorization required for room data modification\n- `Room` object in request body with room configuration details\n- Content-Type: application/json\n- Cultivation facility management permissions required\n\n**Response Data:**\n- Returns single `Room` object (not array) with updated room information\n- Includes assigned RoomId for new rooms or updated ID for existing rooms\n- Complete room information with all fields populated\n- Room identification, naming, and type flag information\n\n**Create vs Update Behavior:**\n- **CREATE**: When RoomId is null or 0, a new room record will be created\n- **UPDATE**: When RoomId is provided with a valid room ID, the existing room will be updated\n- **Identification**: Room existence determined by RoomId value\n- **Automatic Detection**: System automatically determines create vs update based on RoomId\n\n**Room Data Fields:**\n- **RoomId**: Unique identifier for room (null/0 for new rooms, specific ID for updates)\n- **RoomName**: Human-readable name for room identification and cultivation tracking\n- **Room Type Flags**: Boolean indicators for room functionality (IsQuarantineRoom, IsVaultRoom, etc.)\n\n**Common Use Cases:**\n- Add new cultivation rooms to facility management system\n- Update existing room names or configuration details\n- Modify room setup for cultivation facility reorganization\n- Create room assignments for cultivation tracking workflows\n- Support cultivation facility expansion and room management\n\n**Performance & Limits:**\n- Single room operation for targeted cultivation facility management\n- Immediate room configuration update reflected in cultivation systems\n- Optimized for cultivation facility management and plant tracking workflows\n- Changes reflected immediately in room assignment and cultivation systems\n\n**Related Endpoints:**\n- `GET /room/rooms` - Retrieve existing room configuration before updates\n- `GET /plant` - View plants assigned to cultivation rooms\n- `POST /plant/nonsts/update` - Update plant room assignments\n\n**Important Notes:**\n- **RoomId Assignment**: New rooms receive automatically generated RoomId\n- **Cultivation Integration**: Room configuration affects plant tracking and cultivation workflows\n- **Location Scoped**: Rooms automatically associated with authenticated location\n- **Cultivation Ready**: Room data immediately available for plant assignment operations\n- **Facility Management**: Supports cultivation facility organization and room tracking",
5021 "operationId": "RoomPost",
5022 "requestBody": {
5023 "description": "Room information to create or update - Room object with RoomId, RoomName, and room type flags",
5024 "content": {
5025 "application/json-patch+json": {
5026 "schema": {
5027 "$ref": "#/components/schemas/Room"
5028 }
5029 },
5030 "application/json": {
5031 "schema": {
5032 "$ref": "#/components/schemas/Room"
5033 }
5034 },
5035 "text/json": {
5036 "schema": {
5037 "$ref": "#/components/schemas/Room"
5038 }
5039 },
5040 "application/*+json": {
5041 "schema": {
5042 "$ref": "#/components/schemas/Room"
5043 }
5044 }
5045 },
5046 "x-bodyName": "room"
5047 },
5048 "responses": {
5049 "200": {
5050 "description": "Success - Returns single room object: `{ Room }`",
5051 "content": {
5052 "application/json": {
5053 "schema": {
5054 "$ref": "#/components/schemas/Room"
5055 }
5056 }
5057 }
5058 },
5059 "401": {
5060 "description": "Unauthorized - Invalid or missing API key"
5061 },
5062 "403": {
5063 "description": "Forbidden - Account not authorized for room modification"
5064 },
5065 "500": {
5066 "description": "Internal Server Error - Server error occurred"
5067 }
5068 }
5069 }
5070 },
5071 "/sizes": {
5072 "get": {
5073 "tags": ["Size"],
5074 "summary": "Get Product Sizes",
5075 "description": "**Purpose:** Retrieves the complete list of product sizes available for the authenticated organization for product configuration and inventory management.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of size objects: `[{ Size }, ...]`\n- Response format: `[{ Size }, { Size }, ...]`\n- Example: `[{ \"SizeId\": 1, \"SizeName\": \"1g\", \"Description\": \"One gram flower package\" }, { \"SizeId\": 2, \"SizeName\": \"3.5g\", \"Description\": \"Eighth ounce flower package\" }, ...]`\n- Array typically contains 15-40 product sizes per organization\n- Returns empty array `[]` if no sizes configured (rare)\n- Includes size ID, name, and measurement details\n- Standard product sizes (grams, ounces, units, etc.) for cannabis products\n- Results filtered to authenticated organization level\n\n**Common Use Cases:**\n- Populate product size dropdown lists in product creation forms\n- Configure product variants with different size options\n- Support inventory management with size-based tracking\n- Generate size-specific pricing and inventory reports\n- Enable e-commerce product configuration with size selections\n\n**Performance & Limits:**\n- Lightweight reference data optimized for frequent access\n- Small dataset suitable for client-side caching\n- No pagination needed due to limited number of standard sizes\n- Results consistent across all locations within organization\n\n**Related Endpoints:**\n- `GET /products` - Get products that use these size configurations\n- `POST /product` - Create products with size assignments\n- `GET /inventory` - Get inventory levels by product size\n\n**Important Notes:**\n- Sizes are defined at organization level (LSP) not location level\n- Standard cannabis industry size configurations for consistency\n- Used for product configuration and inventory tracking\n- Essential reference data for product and pricing management\n- Supports both weight-based and unit-based product sizing",
5076 "operationId": "SizesGet",
5077 "responses": {
5078 "200": {
5079 "description": "Success - Returns array of size objects: `[{ Size }, ...]`",
5080 "content": {
5081 "application/json": {
5082 "schema": {
5083 "type": "array",
5084 "items": {
5085 "$ref": "#/components/schemas/Size"
5086 }
5087 }
5088 }
5089 }
5090 },
5091 "401": {
5092 "description": "Unauthorized - Invalid or missing API key"
5093 },
5094 "403": {
5095 "description": "Forbidden - Account not authorized"
5096 },
5097 "500": {
5098 "description": "Internal Server Error - Server error occurred"
5099 }
5100 }
5101 }
5102 },
5103 "/strains": {
5104 "post": {
5105 "tags": ["Strains"],
5106 "operationId": "StrainsPost",
5107 "requestBody": {
5108 "content": {
5109 "application/json-patch+json": {
5110 "schema": {
5111 "$ref": "#/components/schemas/UpdateStrain"
5112 }
5113 },
5114 "application/json": {
5115 "schema": {
5116 "$ref": "#/components/schemas/UpdateStrain"
5117 }
5118 },
5119 "text/json": {
5120 "schema": {
5121 "$ref": "#/components/schemas/UpdateStrain"
5122 }
5123 },
5124 "application/*+json": {
5125 "schema": {
5126 "$ref": "#/components/schemas/UpdateStrain"
5127 }
5128 }
5129 },
5130 "x-bodyName": "req"
5131 },
5132 "responses": {
5133 "200": {
5134 "description": "OK",
5135 "content": {
5136 "application/json": {
5137 "schema": {
5138 "$ref": "#/components/schemas/StrainDetail"
5139 }
5140 }
5141 }
5142 },
5143 "400": {
5144 "description": "Bad Request",
5145 "content": {
5146 "application/json": {
5147 "schema": {
5148 "type": "string"
5149 }
5150 }
5151 }
5152 },
5153 "401": {
5154 "description": "Unauthorized"
5155 },
5156 "403": {
5157 "description": "Forbidden"
5158 },
5159 "500": {
5160 "description": "Internal Server Error"
5161 }
5162 }
5163 },
5164 "get": {
5165 "tags": ["Strains"],
5166 "summary": "Get Strains",
5167 "description": "**Purpose:** Retrieves all cannabis strains available for the authenticated location with genetic and classification information.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for strain data access\n- No query parameters or request body needed\n\n**Response Data:**\n- Response format: `[{ StrainDetail }, { StrainDetail }, ...]`\n- Array typically contains 10-100 strains per location\n- Returns empty array `[]` if no strains configured for location\n- Results automatically filtered to authenticated location\n- See `StrainDetail` model for complete field descriptions\n\n**Data Filtering:**\n- Results are automatically scoped to the authenticated location\n- Only active strains are included in the response\n- Strain types include full classification information for categorization\n\n**Common Use Cases:**\n- Populate strain dropdown lists in product creation and editing forms\n- Display available strain genetics for product categorization and filtering\n- Synchronize strain catalog with external inventory management systems\n- Generate strain-specific compliance reports and analytics\n- Support product menu organization by genetic type and characteristics\n- Cache strain data for offline product creation workflows\n\n**Performance & Limits:**\n- Lightweight data optimized for frequent access and caching\n- Typically small dataset (10-100 strains) suitable for client-side storage\n- No pagination needed due to manageable strain catalog sizes per location\n- Response time typically under 50ms for standard strain catalogs\n- Safe for frequent polling (recommended: cache for 5-10 minutes)\n\n**Integration Patterns:**\n- **UI Dropdowns**: Cache response locally for form population\n- **Product Creation**: Use strain IDs for product categorization\n- **External Sync**: Compare ExternalId values for third-party integration\n- **Menu Display**: Filter products by strain type and characteristics\n\n**Related Endpoints:**\n- `POST /strains` - Create or update strain information in this catalog\n- `GET /strains/types` - Get valid strain type classifications for filtering\n\n**Important Notes:**\n- Strain catalog is location-specific and varies by dispensary\n- External ID values enable synchronization with cultivation management systems\n- Strain information directly affects product categorization and compliance reporting",
5168 "operationId": "StrainsGet",
5169 "responses": {
5170 "200": {
5171 "description": "Success - Returns array of strain objects: `[{ StrainDetail }, ...]`",
5172 "content": {
5173 "application/json": {
5174 "schema": {
5175 "type": "array",
5176 "items": {
5177 "$ref": "#/components/schemas/StrainDetail"
5178 }
5179 }
5180 }
5181 }
5182 },
5183 "401": {
5184 "description": "Unauthorized - Invalid or missing API key"
5185 },
5186 "403": {
5187 "description": "Forbidden - Account not authorized for inventory access"
5188 },
5189 "500": {
5190 "description": "Internal Server Error - Server error occurred"
5191 }
5192 }
5193 }
5194 },
5195 "/strains/types": {
5196 "get": {
5197 "tags": ["Strains"],
5198 "summary": "Get Strain Types",
5199 "description": "**Purpose:** Retrieves the list of valid strain type classifications for cannabis strain categorization.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for strain data access\n- No query parameters or request body needed\n\n**Response Data:**\n- Response format: `[string, string, string, string]`\n- Example: `[\"Indica\", \"Sativa\", \"Hybrid\", \"CBD\"]`\n- Returns available strain type classifications\n- Includes standard classifications: Indica, Sativa, Hybrid, CBD\n- Reference data for strain type validation\n\n**Common Use Cases:**\n- Validate strain type values before creating or updating strains\n- Populate strain type dropdown lists in user interfaces\n- Reference data for strain classification validation\n- Support product categorization by genetic type\n- Ensure consistency in strain type terminology\n\n**Performance & Limits:**\n- Reference data with immediate response\n- Small dataset suitable for frequent caching\n- No location filtering needed for standard classifications\n- Consistent across all locations and organizations\n\n**Related Endpoints:**\n- `POST /strains` - Create or update strains (validates against these types)\n- `GET /strains` - Get all strains with their assigned types\n\n**Important Notes:**\n- These are the only valid values accepted for strain type in strain creation/updates\n- Values are case-sensitive when used in strain operations\n- Standard cannabis industry classifications for genetic types\n- Used for product menu organization and customer filtering",
5200 "operationId": "StrainsTypesGet",
5201 "responses": {
5202 "200": {
5203 "description": "Success - Returns array of strings with strain type names: `[\"Indica\", \"Sativa\", \"Hybrid\", \"CBD\"]`",
5204 "content": {
5205 "application/json": {
5206 "schema": {
5207 "type": "array",
5208 "items": {
5209 "type": "string"
5210 }
5211 }
5212 }
5213 }
5214 },
5215 "401": {
5216 "description": "Unauthorized - Invalid or missing API key"
5217 },
5218 "403": {
5219 "description": "Forbidden - Account not authorized for inventory access"
5220 },
5221 "500": {
5222 "description": "Internal Server Error - Server error occurred"
5223 }
5224 }
5225 }
5226 },
5227 "/table/tables": {
5228 "get": {
5229 "tags": ["Table"],
5230 "summary": "Get Tables",
5231 "description": "**Purpose:** Retrieve dining tables or seating areas configured for the location to support hospitality operations and table management.\n\n**Request Requirements:**\n- \"Room\" role authorization required for table data access\n- Optional filtering parameters available for specific table lookup\n- Table management permissions for hospitality operations\n\n**Response Data:**\n- Returns array of `Table` objects with table identification details\n- Array typically contains 10-100 tables depending on hospitality operation size\n- Returns empty array `[]` if no tables match criteria (not null)\n- Includes table identification and naming information (TableId, TableName)\n- Results automatically filtered to authenticated location\n\n**Filtering Options:**\n- **tableId**: Optional integer parameter to retrieve specific table by ID\n- **tableName**: Optional string parameter to search tables by name\n- **Combined Filtering**: Parameters can be used together for precise table lookup\n- **No Filters**: Returns all tables when no parameters provided\n\n**Table Information Included:**\n- **TableId**: Unique identifier for each dining table or seating area\n- **TableName**: Human-readable name for table identification and assignment\n\n**Common Use Cases:**\n- Populate table dropdown lists in reservation and seating management\n- Display available tables for customer seating assignments\n- Support hospitality operation table management and configuration\n- Enable table-specific service tracking and order management\n- Facilitate dining room management and table allocation workflows\n\n**Performance & Limits:**\n- Efficient table lookup optimized for hospitality operation workflows\n- Flexible filtering for specific table management needs\n- No pagination needed for typical table counts per location\n- Results consistent across hospitality and service management systems\n\n**Related Endpoints:**\n- `POST /table` - Create or update table configuration\n- `GET /guest-list` - View guest check-ins by table assignments\n- `POST /transaction` - Process transactions linked to table service\n\n**Important Notes:**\n- **Hospitality Integration**: Essential for dining room management and table service\n- **Table Management**: Supports table configuration and seating assignments\n- **Location Specific**: Results filtered to authenticated location table setup\n- **Service Ready**: Table data used throughout hospitality service workflows\n- **Flexible Lookup**: Multiple filtering options for precise table management",
5232 "operationId": "TableTablesGet",
5233 "parameters": [
5234 {
5235 "name": "tableId",
5236 "in": "query",
5237 "description": "Optional table ID for specific table lookup - integer",
5238 "schema": {
5239 "type": "integer",
5240 "format": "int32"
5241 }
5242 },
5243 {
5244 "name": "tableName",
5245 "in": "query",
5246 "description": "Optional table name for searching tables by name - string",
5247 "schema": {
5248 "type": "string"
5249 }
5250 }
5251 ],
5252 "responses": {
5253 "200": {
5254 "description": "Success - Returns array of table objects: `[{ Table }, ...]`",
5255 "content": {
5256 "application/json": {
5257 "schema": {
5258 "type": "array",
5259 "items": {
5260 "$ref": "#/components/schemas/Table"
5261 }
5262 }
5263 }
5264 }
5265 },
5266 "401": {
5267 "description": "Unauthorized - Invalid or missing API key"
5268 },
5269 "403": {
5270 "description": "Forbidden - Account not authorized for table access"
5271 },
5272 "500": {
5273 "description": "Internal Server Error - Server error occurred"
5274 }
5275 }
5276 }
5277 },
5278 "/table": {
5279 "post": {
5280 "tags": ["Table"],
5281 "summary": "Create or Update Table",
5282 "description": "**Purpose:** Create a new dining table or update an existing table configuration for hospitality operations and seating management.\n\n**Request Requirements:**\n- \"Room\" role authorization required for table data modification\n- `Table` object in request body with table information\n- Content-Type: application/json\n- Table management permissions for hospitality operations\n\n**Response Data:**\n- Returns single `Table` object (not array) with updated table information\n- Includes assigned TableId for new tables or updated ID for existing tables\n- Complete table information with all fields populated (TableId, TableName)\n- Table identification and naming information\n\n**Create vs Update Behavior:**\n- **CREATE**: When TableId is null or 0, a new table record will be created\n- **UPDATE**: When TableId is provided with a positive integer, the existing table will be updated\n- **Identification**: Table existence determined by TableId value (null/0 = create, positive = update)\n- **Automatic Detection**: System automatically determines create vs update based on TableId\n\n**Table Data Fields:**\n- **TableId**: Unique identifier for table (null/0 for new tables, positive integer for updates)\n- **TableName**: Human-readable name for table identification and assignment\n\n**Common Use Cases:**\n- Add new dining tables to hospitality seating configuration\n- Update existing table names or configuration details\n- Modify table setup for dining room reorganization\n- Create table assignments for hospitality service workflows\n- Support dining room management and table allocation systems\n\n**Performance & Limits:**\n- Single table operation for targeted table management\n- Immediate table configuration update reflected in hospitality systems\n- Optimized for dining room management and seating workflows\n- Changes reflected immediately in table assignment and service systems\n\n**Related Endpoints:**\n- `GET /table/tables` - Retrieve existing table configuration before updates\n- `GET /guest-list` - View guest check-ins that use table assignments\n- `POST /transaction` - Process transactions linked to table service\n\n**Important Notes:**\n- **TableId Assignment**: New tables receive automatically generated TableId\n- **Hospitality Integration**: Table configuration affects seating and service workflows\n- **Location Scoped**: Tables automatically associated with authenticated location\n- **Service Ready**: Table data immediately available for hospitality operations\n- **Configuration Management**: Supports dining room setup and table organization",
5283 "operationId": "TablePost",
5284 "requestBody": {
5285 "description": "Table information to create or update - Table object with TableId and TableName fields",
5286 "content": {
5287 "application/json-patch+json": {
5288 "schema": {
5289 "$ref": "#/components/schemas/Table"
5290 }
5291 },
5292 "application/json": {
5293 "schema": {
5294 "$ref": "#/components/schemas/Table"
5295 }
5296 },
5297 "text/json": {
5298 "schema": {
5299 "$ref": "#/components/schemas/Table"
5300 }
5301 },
5302 "application/*+json": {
5303 "schema": {
5304 "$ref": "#/components/schemas/Table"
5305 }
5306 }
5307 },
5308 "x-bodyName": "table"
5309 },
5310 "responses": {
5311 "200": {
5312 "description": "Success - Returns single table object: `{ Table }`",
5313 "content": {
5314 "application/json": {
5315 "schema": {
5316 "$ref": "#/components/schemas/Table"
5317 }
5318 }
5319 }
5320 },
5321 "401": {
5322 "description": "Unauthorized - Invalid or missing API key"
5323 },
5324 "403": {
5325 "description": "Forbidden - Account not authorized for table modification"
5326 },
5327 "500": {
5328 "description": "Internal Server Error - Server error occurred"
5329 }
5330 }
5331 }
5332 },
5333 "/tag": {
5334 "get": {
5335 "tags": ["Tag"],
5336 "summary": "Get Tags",
5337 "description": "**Purpose:** Retrieve all inventory tracking tags available for the location to support inventory management and regulatory compliance tracking.\n\n**Request Requirements:**\n- \"Inventory\" role authorization required for tag data access\n- No query parameters or request body needed\n- Inventory management permissions for tag tracking operations\n\n**Response Data:**\n- Returns array of `Tag` objects with tag identification information\n- Array typically contains 100-10,000 tags depending on facility operation size\n- Returns empty array `[]` if no tags are available (not null)\n- Includes tag names and unique identifiers for inventory assignment\n- Results automatically filtered to authenticated service provider level\n\n**Tag Information Included:**\n- **TagId**: Unique numeric identifier for each tag\n- **TagName**: Human-readable name or label for the tag\n- **Assignment Ready**: Tag information available for inventory assignment operations\n\n**Common Use Cases:**\n- Populate tag dropdown lists in inventory management interfaces\n- Display available tags for plant and package assignment workflows\n- Support inventory tracking and regulatory compliance operations\n- Enable tag allocation and assignment for cultivation and retail workflows\n- Facilitate state system integration and regulatory reporting requirements\n\n**Performance & Limits:**\n- Comprehensive tag data retrieval for inventory management\n- Service provider level tag access for facility operations\n- Optimized for inventory tracking and compliance workflows\n- Results include all available tags for assignment and tracking\n\n**Related Endpoints:**\n- `POST /package/set-tags` - Assign tags to inventory packages\n- `POST /package/add-tags` - Add additional tags to packages\n- `POST /package/remove-tags` - Remove tags from inventory packages\n\n**Important Notes:**\n- **Compliance Critical**: Essential for regulatory compliance and state system integration\n- **Inventory Integration**: Tag data used throughout inventory tracking workflows\n- **Service Provider Scoped**: Tags filtered to authenticated service provider level\n- **Assignment Ready**: Tag data immediately available for inventory assignment operations\n- **Regulatory Tracking**: Tags support state system compliance and audit requirements",
5338 "operationId": "TagGet",
5339 "responses": {
5340 "200": {
5341 "description": "Success - Returns array of tag objects: `[{ Tag }, ...]`",
5342 "content": {
5343 "application/json": {
5344 "schema": {
5345 "type": "array",
5346 "items": {
5347 "$ref": "#/components/schemas/Tag"
5348 }
5349 }
5350 }
5351 }
5352 },
5353 "401": {
5354 "description": "Unauthorized - Invalid or missing API key"
5355 },
5356 "403": {
5357 "description": "Forbidden - Account not authorized for inventory access"
5358 },
5359 "500": {
5360 "description": "Internal Server Error - Server error occurred"
5361 }
5362 }
5363 }
5364 },
5365 "/terminals": {
5366 "get": {
5367 "tags": ["Terminals"],
5368 "summary": "Get Terminals",
5369 "description": "**Purpose:** Retrieve all point-of-sale terminals configured for the location to support transaction processing and retail operations.\n\n**Request Requirements:**\n- Valid API key authentication required for terminal data access\n- No specific role restrictions beyond authentication\n- No query parameters or request body needed\n\n**Response Data:**\n- Returns array of `Terminal` objects with terminal identification information\n- Response format: `[{ Terminal }, { Terminal }, ...]`\n- Array typically contains 1-10 terminals depending on retail operation size\n- Returns empty array `[]` if no terminals are configured (not null)\n- Includes terminal identification and naming information only\n- Results automatically filtered to authenticated location\n\n**Terminal Information Included:**\n- **TerminalId**: Unique numeric identifier for each point-of-sale terminal\n- **TerminalName**: Human-readable name for terminal identification\n\n**Common Use Cases:**\n- Populate terminal dropdown lists in transaction processing interfaces\n- Display available terminals for cashier assignment and management\n- Support point-of-sale system configuration and setup\n- Enable terminal-specific transaction tracking and reporting\n- Facilitate retail operation management and terminal allocation\n\n**Performance & Limits:**\n- Lightweight operation optimized for frequent terminal lookups\n- Small dataset suitable for real-time retail operation workflows\n- No pagination needed due to limited terminal counts per location\n- Results consistent across point-of-sale and transaction systems\n\n**Related Endpoints:**\n- `POST /transaction` - Process transactions using configured terminals\n- `GET /reporting/register-transactions` - View terminal-specific transaction history\n- `GET /reporting/cash-summary` - Terminal cash management and reconciliation\n\n**Important Notes:**\n- **Retail Integration**: Essential for point-of-sale operations and transaction processing\n- **Terminal Management**: Supports retail terminal configuration and assignment\n- **Location Specific**: Results filtered to authenticated location terminal setup\n- **Real-time Access**: Current terminal availability and configuration information\n- **Transaction Ready**: Terminal data used throughout retail transaction workflows",
5370 "operationId": "TerminalsGet",
5371 "responses": {
5372 "200": {
5373 "description": "Success - Returns array of terminal objects: `[{ Terminal }, ...]`",
5374 "content": {
5375 "application/json": {
5376 "schema": {
5377 "type": "array",
5378 "items": {
5379 "$ref": "#/components/schemas/Terminal"
5380 }
5381 }
5382 }
5383 }
5384 },
5385 "401": {
5386 "description": "Unauthorized - Invalid or missing API key"
5387 },
5388 "403": {
5389 "description": "Forbidden - Account not authorized"
5390 },
5391 "500": {
5392 "description": "Internal Server Error - Server error occurred"
5393 }
5394 }
5395 }
5396 },
5397 "/transaction/create-anonymous": {
5398 "post": {
5399 "tags": ["Transaction"],
5400 "summary": "Create Anonymous Customer Transaction",
5401 "description": "**Purpose:** Create an anonymous customer profile and automatically check them into the dispensary guest list for pickup or service.\n\n**Request Requirements:**\n- \"PreOrder\" role authorization required for transaction creation\n- `CreateAnonymousTransactionRequest` object in request body\n- Content-Type: application/json\n- Optional transaction reference for internal tracking\n\n**Response Data:**\n- Returns anonymous transaction object: `{ AnonymousTransaction }`\n- CustomerId: Temporary customer identifier for this session\n- TransactionId: Transaction identifier for order processing and tracking\n- UniqueId: System-generated unique identifier for customer lookup\n\n**Process Flow:**\n1. Anonymous profile creation: Generate temporary customer record with unique identifier\n2. Guest list check-in: Automatically add customer to dispensary queue/guest list\n3. Transaction setup: Create transaction record for order processing\n4. Unique tracking: Assign unique ID for following up on order status\n\n**Common Use Cases:**\n- Process walk-in customers without pre-existing accounts\n- Provide quick service for customers who prefer not to create full accounts\n- Handle one-time or occasional customers efficiently\n- Accommodate privacy-focused customers who prefer minimal data collection\n- Bridge anonymous sales with customer tracking systems for POS integration\n\n**Performance & Limits:**\n- Immediate customer profile and transaction creation\n- Automatic guest list integration for streamlined workflow\n- Temporary records designed for single-session use\n- Optimized for high-volume walk-in customer processing\n\n**Related Endpoints:**\n- `POST /preorder/submit` - Create orders for existing customers with full profiles\n- `GET /guest-list` - View current guest list including anonymous customers\n\n**Important Notes:**\n- Anonymous customer profiles are temporary and session-based\n- Customer automatically appears in dispensary queue/guest list\n- Optional transaction reference field for external system correlation\n- Each anonymous customer gets a unique system identifier\n- Minimal data collection while maintaining operational requirements\n- Choose this for walk-ins who don't want accounts; use preorder endpoints for existing customers",
5402 "operationId": "TransactionCreate-anonymousPost",
5403 "requestBody": {
5404 "description": "Anonymous transaction request with optional transaction reference - CreateAnonymousTransactionRequest object",
5405 "content": {
5406 "application/json-patch+json": {
5407 "schema": {
5408 "$ref": "#/components/schemas/CreateAnonymousTransactionRequest"
5409 }
5410 },
5411 "application/json": {
5412 "schema": {
5413 "$ref": "#/components/schemas/CreateAnonymousTransactionRequest"
5414 }
5415 },
5416 "text/json": {
5417 "schema": {
5418 "$ref": "#/components/schemas/CreateAnonymousTransactionRequest"
5419 }
5420 },
5421 "application/*+json": {
5422 "schema": {
5423 "$ref": "#/components/schemas/CreateAnonymousTransactionRequest"
5424 }
5425 }
5426 },
5427 "x-bodyName": "req"
5428 },
5429 "responses": {
5430 "200": {
5431 "description": "Success - Returns anonymous transaction object: `{ AnonymousTransaction }`",
5432 "content": {
5433 "application/json": {
5434 "schema": {
5435 "$ref": "#/components/schemas/AnonymousTransaction"
5436 }
5437 }
5438 }
5439 },
5440 "401": {
5441 "description": "Unauthorized - Invalid or missing API key"
5442 },
5443 "403": {
5444 "description": "Forbidden - Account not authorized for transaction creation"
5445 },
5446 "500": {
5447 "description": "Internal Server Error - Server error occurred during transaction creation"
5448 }
5449 }
5450 }
5451 },
5452 "/util/AuthorizationHeader/{apiKey}": {
5453 "get": {
5454 "tags": ["Util"],
5455 "summary": "Generate Authorization Header",
5456 "description": "**Purpose:** Convert an API key into a properly formatted authorization header for initial API client setup and testing.\n\n**Intended Use:** This utility endpoint is designed for initial setup and testing workflows. For production applications, consider encoding headers client-side using Base64: `Basic {base64(api_key:)}`\n\n**Request Requirements:**\n- No authentication required - public utility endpoint\n- API key provided as URL path parameter\n- Utility function for API client development and testing\n\n**Response Data:**\n- Returns single string value (not array) with formatted authorization header\n- Basic authentication header format: \"Basic [base64-encoded-api-key]\"\n- Ready-to-use authorization header value for HTTP clients\n- Base64 encoded API key in standard HTTP Basic authentication format\n\n**Authorization Header Format:**\n- **Encoding**: API key converted to Base64 ASCII encoding\n- **Format**: \"Basic {base64-encoded-key}\" format for HTTP Authorization header\n- **Standards Compliant**: Follows HTTP Basic Authentication specification\n- **Client Ready**: Direct usage in HTTP client authorization headers\n\n**Common Use Cases:**\n- Initial API client setup and configuration\n- Development and testing workflows\n- Manual header generation for API testing tools\n- Integration development and troubleshooting\n\n**Related Endpoints:**\n- `GET /whoami` - Verify API key validity and location access\n- `GET /health` - Test basic API connectivity\n- All other endpoints that require the generated authorization header\n\n**Important Notes:**\n- **Public Utility**: No authentication required for this utility endpoint\n- **Developer Tool**: Designed for API client development and testing support\n- **Header Generation**: Produces standard HTTP Basic authentication headers\n- **Standards Compliant**: Follows HTTP Basic Authentication formatting requirements",
5457 "operationId": "UtilAuthorizationHeaderByApiKeyGet",
5458 "parameters": [
5459 {
5460 "name": "apiKey",
5461 "in": "path",
5462 "description": "API key to convert into authorization header format - string",
5463 "required": true,
5464 "schema": {
5465 "type": "string"
5466 }
5467 }
5468 ],
5469 "responses": {
5470 "200": {
5471 "description": "Success - Returns formatted authorization header string: \"Basic {base64-encoded-key}\"",
5472 "content": {
5473 "application/json": {
5474 "schema": {
5475 "type": "string"
5476 }
5477 }
5478 }
5479 }
5480 }
5481 }
5482 },
5483 "/vehicles": {
5484 "get": {
5485 "tags": ["Vehicles"],
5486 "summary": "Get Vehicles",
5487 "description": "**Purpose:** Retrieve all vehicles available for delivery and transportation operations to support logistics and compliance tracking.\n\n**Request Requirements:**\n- \"Reporting\" or \"Deliveries\" role authorization required for vehicle data access\n- No query parameters or request body needed\n\n**Response Data:**\n- Response format: `[{ VehicleDetail }, { VehicleDetail }, ...]`\n- Array typically contains 1-20 vehicles depending on delivery operation size\n- Returns empty array `[]` if no vehicles are configured (not null)\n- Includes vehicle identification, specifications, and operational details\n- License plate numbers, make/model information, and registration data\n- Results automatically filtered to authenticated location\n\n**Vehicle Information Included:**\n- **Identification**: Vehicle ID, license plate, VIN numbers\n- **Specifications**: Make, model, year, color, and vehicle type\n- **Registration**: Registration status and compliance information\n- **Operational**: Availability status and assignment details\n\n**Common Use Cases:**\n- Populate vehicle dropdown lists in delivery assignment forms\n- Display vehicle fleet information for logistics management\n- Support delivery route planning and vehicle allocation\n- Maintain vehicle records for compliance and regulatory requirements\n- Generate vehicle utilization reports for operational analysis\n\n**Performance & Limits:**\n- Lightweight operation optimized for frequent vehicle lookups\n- Small dataset suitable for real-time delivery assignment workflows\n- No pagination needed due to limited fleet sizes\n- Results consistent across delivery management operations\n\n**Related Endpoints:**\n- `POST /vehicles` - Create or update vehicle information\n- `GET /drivers` - Get drivers who can operate vehicles\n- `POST /deliveries/set-route-detail` - Assign vehicles to delivery routes\n\n**Important Notes:**\n- **Fleet Management**: Essential for delivery operations and logistics coordination\n- **Compliance Ready**: Vehicle data supports regulatory compliance and tracking\n- **Location Specific**: Results filtered to authenticated location vehicle fleet\n- **Real-time Access**: Current vehicle availability and status information\n- **Delivery Integration**: Vehicle data used throughout delivery assignment workflows",
5488 "operationId": "VehiclesGet",
5489 "responses": {
5490 "200": {
5491 "description": "Success - Returns array of vehicle objects: `[{ VehicleDetail }, ...]`",
5492 "content": {
5493 "application/json": {
5494 "schema": {
5495 "type": "array",
5496 "items": {
5497 "$ref": "#/components/schemas/VehicleDetail"
5498 }
5499 }
5500 }
5501 }
5502 },
5503 "401": {
5504 "description": "Unauthorized - Invalid or missing API key"
5505 },
5506 "403": {
5507 "description": "Forbidden - Account not authorized for vehicle access"
5508 },
5509 "500": {
5510 "description": "Internal Server Error - Server error occurred"
5511 }
5512 }
5513 },
5514 "post": {
5515 "tags": ["Vehicles"],
5516 "summary": "Create or Update Vehicle",
5517 "description": "**Purpose:** Create a new vehicle or update an existing vehicle with comprehensive fleet information for delivery operations and compliance tracking.\n\n**Request Requirements:**\n- \"Reporting\" or \"Deliveries\" role authorization required for vehicle data modification\n- `VehicleDetail` object in request body with vehicle information\n- Content-Type: application/json\n- Validation performed on vehicle data before processing\n\n**Response Data:**\n- Response format: `200 OK` (no response body)\n- No data returned - operation confirmation only\n- Returns HTTP 400 with validation errors if request data is invalid\n\n**Create vs Update Behavior:**\n- **CREATE**: When VehicleId is null, 0, or omitted, a new vehicle record will be created\n- **UPDATE**: When VehicleId is provided with a valid vehicle ID, the existing vehicle will be updated\n- **Identification**: Vehicle existence determined by VehicleId value\n- **Automatic Detection**: System automatically determines create vs update based on vehicle data\n\n**Sparse Update Behavior:**\n- **Validation Required**: All provided vehicle data must pass validation checks\n- **Field Updates**: Provided fields will update existing vehicle information\n- **Data Integrity**: Validation ensures vehicle data meets operational requirements\n- **Fleet Consistency**: Updates maintain fleet data consistency and compliance standards\n\n**Vehicle Data Fields:**\n- **Identification**: License plate, VIN, vehicle ID\n- **Specifications**: Make, model, year, color, vehicle type\n- **Registration**: Registration information and compliance data\n- **Operational**: Status, availability, and assignment details\n\n**Common Use Cases:**\n- Add new vehicles to delivery fleet for expanded operations\n- Update existing vehicle information when details change\n- Maintain vehicle registration and compliance records\n- Support fleet management and vehicle tracking requirements\n- Ensure accurate vehicle data for delivery route assignments\n\n**Performance & Limits:**\n- Single vehicle operation for targeted fleet management\n- Comprehensive validation performed before any changes\n- Changes reflected immediately in delivery assignment systems\n- Optimized for fleet management and compliance workflows\n\n**Related Endpoints:**\n- `GET /vehicles` - Retrieve existing vehicle data before updates\n- `GET /drivers` - Manage driver assignments for vehicles\n- `POST /deliveries/set-route-detail` - Assign updated vehicles to delivery routes\n\n**Important Notes:**\n- **Validation Critical**: All vehicle data must pass validation before processing\n- **Fleet Integration**: Vehicle updates affect delivery assignment and logistics systems\n- **Compliance Essential**: Vehicle data must meet regulatory requirements for delivery operations\n- **Location Scoped**: Vehicles automatically associated with authenticated location\n- **Operation Confirmation**: Success indicated by HTTP 200 status (no response body)",
5518 "operationId": "VehiclesPost",
5519 "requestBody": {
5520 "description": "Vehicle information to create or update - VehicleDetail object with fleet details",
5521 "content": {
5522 "application/json-patch+json": {
5523 "schema": {
5524 "$ref": "#/components/schemas/VehicleDetail"
5525 }
5526 },
5527 "application/json": {
5528 "schema": {
5529 "$ref": "#/components/schemas/VehicleDetail"
5530 }
5531 },
5532 "text/json": {
5533 "schema": {
5534 "$ref": "#/components/schemas/VehicleDetail"
5535 }
5536 },
5537 "application/*+json": {
5538 "schema": {
5539 "$ref": "#/components/schemas/VehicleDetail"
5540 }
5541 }
5542 },
5543 "x-bodyName": "vehicle"
5544 },
5545 "responses": {
5546 "200": {
5547 "description": "Success"
5548 },
5549 "400": {
5550 "description": "Bad Request - `ValidationResult` object with `isValid` boolean, `errors` array, and `ruleSetsExecuted` array",
5551 "content": {
5552 "application/json": {
5553 "schema": {
5554 "$ref": "#/components/schemas/ValidationResult"
5555 }
5556 }
5557 }
5558 },
5559 "401": {
5560 "description": "Invalid API Key"
5561 },
5562 "403": {
5563 "description": "Account not authorized"
5564 },
5565 "500": {
5566 "description": "Something went wrong."
5567 }
5568 }
5569 }
5570 },
5571 "/vendor/vendors": {
5572 "get": {
5573 "tags": ["Vendor"],
5574 "summary": "Get Vendors",
5575 "description": "**Purpose:** Retrieves a list of vendors with optional filtering by vendor ID or name for procurement and inventory management.\n\n**Request Requirements:**\n- \"Vendor\" role authorization required for vendor data access\n- Optional query parameters for filtering results\n- No request body needed\n\n**Response Data:**\n- Response format: `[{ Vendor }, { Vendor }, ...]`\n- Array typically contains 5-50 vendors per location\n- Returns empty array `[]` if no vendors configured or match filtering criteria\n- Includes contact details, address, and license information\n- Results are automatically filtered by the authenticated user's location\n- Vendor ID, name, and contact information included\n\n**Filtering Options:**\n- No parameters: Returns all vendors for the location\n- vendorId: Returns specific vendor by ID\n- vendorName: Filters vendors by name with partial matching support\n- Both parameters: Can be used together for more specific filtering\n\n**Common Use Cases:**\n- Populate vendor dropdown lists in purchase order creation forms\n- Search for specific vendors by name or ID for quick lookup\n- Synchronize vendor data with external inventory management systems\n- Display vendor contact information for procurement and purchasing\n- Maintain vendor databases for supply chain management\n\n**Performance & Limits:**\n- Rate limiting disabled for this endpoint to support frequent lookups\n- Lightweight response for fast vendor list population\n- Efficient filtering for large vendor databases\n- Results cached for improved performance\n\n**Related Endpoints:**\n- `POST /vendor` - Create or update vendor information\n\n**Important Notes:**\n- Results are automatically filtered to the authenticated user's location\n- Vendor name filtering supports partial matching for flexible search\n- Both filtering parameters can be used simultaneously for precise results\n- No rate limiting applied to support frequent vendor lookups",
5576 "operationId": "VendorVendorsGet",
5577 "parameters": [
5578 {
5579 "name": "vendorId",
5580 "in": "query",
5581 "description": "Optional vendor ID to filter by specific vendor - Returns exact match",
5582 "schema": {
5583 "type": "integer",
5584 "format": "int32"
5585 }
5586 },
5587 {
5588 "name": "vendorName",
5589 "in": "query",
5590 "description": "Optional vendor name to filter by - Supports partial matching for flexible search",
5591 "schema": {
5592 "type": "string"
5593 }
5594 }
5595 ],
5596 "responses": {
5597 "200": {
5598 "description": "Success - Returns array of vendor objects: `[{ Vendor }, ...]`",
5599 "content": {
5600 "application/json": {
5601 "schema": {
5602 "type": "array",
5603 "items": {
5604 "$ref": "#/components/schemas/Vendor"
5605 }
5606 }
5607 }
5608 }
5609 },
5610 "401": {
5611 "description": "Unauthorized - Invalid or missing API key"
5612 },
5613 "403": {
5614 "description": "Forbidden - Account not authorized for vendor access"
5615 },
5616 "500": {
5617 "description": "Internal Server Error - Server error occurred"
5618 }
5619 }
5620 }
5621 },
5622 "/vendor": {
5623 "post": {
5624 "tags": ["Vendor"],
5625 "summary": "Create or Update Vendor",
5626 "description": "**Purpose:** Create a new vendor or update an existing vendor with comprehensive supplier information for procurement and inventory management.\n\n**Request Requirements:**\n- \"Vendor\" role authorization required for vendor data modification\n- `Vendor` object in request body with vendor details\n- Content-Type: application/json\n- All vendor fields are optional (no validation performed)\n\n**Response Data:**\n- Response format: `{ Vendor }`\n- Returns single `Vendor` object (not array) with updated vendor information\n- Includes assigned VendorId for new vendors or updated ID for existing vendors\n- Complete vendor information with all fields populated\n- Contact details, address, and license information included\n\n**Create vs Update Behavior:**\n- **CREATE**: When VendorId is null, 0, or omitted, a new vendor record will be created\n- **UPDATE**: When VendorId is provided with a valid vendor ID, the existing vendor will be updated\n- **Identification**: Vendor existence determined by VendorId value\n- **Automatic Detection**: System automatically determines create vs update based on VendorId\n\n**Sparse Update Behavior:**\n- **No Required Fields**: All fields are optional\n- **Optional Fields**: Address, contact, and license fields can be omitted to preserve existing values\n- **Null Handling**: Null values will overwrite existing data (use with caution)\n- **Field Independence**: Each field can be updated independently\n\n**Required Fields:**\n- **None**: No validation is performed on any fields\n\n**Optional Fields:**\n- **Address, City, State, PostalCode**: Physical address information for shipping and contact\n- **LicenseNumber**: Vendor's business license number for compliance tracking\n- **ContactName, ContactEmail, ContactPhone**: Primary contact information for procurement\n\n**Common Use Cases:**\n- Add new suppliers to the vendor database for procurement management\n- Update existing vendor contact information when details change\n- Maintain vendor address and license details for compliance\n- Establish vendor relationships for purchase orders and inventory management\n- Synchronize vendor data with external procurement systems\n\n**Performance & Limits:**\n- Single vendor operation for targeted supplier management\n- Immediate validation and response with complete vendor data\n- Changes reflected immediately in vendor catalogs and purchase order systems\n- Optimized for vendor relationship management workflows\n\n**Related Endpoints:**\n- `GET /vendor/vendors` - Retrieve existing vendor data before updates\n- `POST /purchase-orders` - Create purchase orders using vendor relationships\n- `GET /inventory` - View inventory from specific vendors\n\n**Important Notes:**\n- **VendorId Assignment**: New vendors receive automatically generated VendorId\n- **No Validation**: No validation is performed before creation/update\n- **Supplier Relationships**: Vendor data used throughout procurement and inventory systems\n- **Location Scoped**: Vendors automatically associated with authenticated location\n- **Contact Management**: Maintain accurate contact information for effective supplier communication",
5627 "operationId": "VendorPost",
5628 "requestBody": {
5629 "description": "Vendor information to create or update - Vendor object with supplier details",
5630 "content": {
5631 "application/json-patch+json": {
5632 "schema": {
5633 "$ref": "#/components/schemas/Vendor"
5634 }
5635 },
5636 "application/json": {
5637 "schema": {
5638 "$ref": "#/components/schemas/Vendor"
5639 }
5640 },
5641 "text/json": {
5642 "schema": {
5643 "$ref": "#/components/schemas/Vendor"
5644 }
5645 },
5646 "application/*+json": {
5647 "schema": {
5648 "$ref": "#/components/schemas/Vendor"
5649 }
5650 }
5651 },
5652 "x-bodyName": "vendor"
5653 },
5654 "responses": {
5655 "200": {
5656 "description": "Success - Returns vendor object: `{ Vendor }`",
5657 "content": {
5658 "application/json": {
5659 "schema": {
5660 "$ref": "#/components/schemas/Vendor"
5661 }
5662 }
5663 }
5664 },
5665 "401": {
5666 "description": "Unauthorized - Invalid or missing API key"
5667 },
5668 "403": {
5669 "description": "Forbidden - Account not authorized for vendor management"
5670 },
5671 "500": {
5672 "description": "Internal Server Error - Server error occurred during vendor operation"
5673 }
5674 }
5675 }
5676 },
5677 "/waste": {
5678 "get": {
5679 "tags": ["Waste"],
5680 "summary": "Get Waste Records",
5681 "description": "**Purpose:** Retrieve comprehensive waste disposal records for cultivation and compliance tracking to support regulatory reporting and facility management.\n\n**Request Requirements:**\n- \"CultivationWrite\" role authorization required for waste data access\n- No query parameters or request body needed\n- Waste tracking permissions essential for compliance operations\n\n**Response Data:**\n- Returns single `WasteSummary` object (not array) with comprehensive waste information\n- Response format: `{ WasteSummary }`\n- Includes categorized waste records by type and source\n- Contains room waste, harvest waste, and plant waste details\n- Waste disposal tracking and compliance documentation\n- Results automatically filtered to authenticated location\n\n**Waste Categories Included:**\n- **Room Waste**: General cultivation room waste disposal records\n- **Harvest Waste**: Plant material disposal from harvest operations\n- **Plant Waste**: Individual plant disposal and destruction records\n\n**Common Use Cases:**\n- Generate regulatory compliance reports for waste disposal\n- Track cultivation facility waste management and disposal\n- Support compliance audits and regulatory inspections\n- Monitor waste disposal efficiency and facility operations\n- Maintain cultivation facility waste tracking for legal requirements\n\n**Performance & Limits:**\n- Comprehensive waste data retrieval for facility management\n- Location-specific waste records for compliance tracking\n- Optimized for regulatory reporting and compliance workflows\n- Results include all waste categories and disposal records\n\n**Related Endpoints:**\n- `GET /harvest` - View harvest operations that generate waste\n- `GET /plant` - Track plants before waste disposal\n- `POST /plant/harvest` - Harvest operations that create waste records\n\n**Important Notes:**\n- **Compliance Critical**: Essential for regulatory compliance and waste tracking\n- **Cultivation Focus**: Specific to cultivation facility waste management\n- **Location Scoped**: Waste records filtered to authenticated location\n- **Regulatory Ready**: Data formatted for compliance reporting requirements\n- **Disposal Tracking**: Comprehensive waste disposal and destruction records",
5682 "operationId": "WasteGet",
5683 "responses": {
5684 "200": {
5685 "description": "Success",
5686 "content": {
5687 "application/json": {
5688 "schema": {
5689 "$ref": "#/components/schemas/WasteSummary"
5690 }
5691 }
5692 }
5693 },
5694 "401": {
5695 "description": "Invalid API Key"
5696 },
5697 "403": {
5698 "description": "Account not authorized"
5699 },
5700 "500": {
5701 "description": "Something went wrong."
5702 }
5703 }
5704 }
5705 },
5706 "/waste/HarvestWaste": {
5707 "post": {
5708 "tags": ["Waste"],
5709 "operationId": "WasteHarvestWastePost",
5710 "requestBody": {
5711 "content": {
5712 "application/json-patch+json": {
5713 "schema": {
5714 "$ref": "#/components/schemas/HarvestWasteDetailWaste"
5715 }
5716 },
5717 "application/json": {
5718 "schema": {
5719 "$ref": "#/components/schemas/HarvestWasteDetailWaste"
5720 }
5721 },
5722 "text/json": {
5723 "schema": {
5724 "$ref": "#/components/schemas/HarvestWasteDetailWaste"
5725 }
5726 },
5727 "application/*+json": {
5728 "schema": {
5729 "$ref": "#/components/schemas/HarvestWasteDetailWaste"
5730 }
5731 }
5732 },
5733 "x-bodyName": "req"
5734 },
5735 "responses": {
5736 "200": {
5737 "description": "OK",
5738 "content": {
5739 "application/json": {
5740 "schema": {
5741 "type": "object"
5742 }
5743 }
5744 }
5745 },
5746 "400": {
5747 "description": "Bad Request",
5748 "content": {
5749 "application/json": {
5750 "schema": {
5751 "type": "string"
5752 }
5753 }
5754 }
5755 },
5756 "401": {
5757 "description": "Unauthorized"
5758 },
5759 "403": {
5760 "description": "Forbidden"
5761 },
5762 "500": {
5763 "description": "Internal Server Error"
5764 }
5765 }
5766 }
5767 },
5768 "/waste/PlantWaste": {
5769 "post": {
5770 "tags": ["Waste"],
5771 "operationId": "WastePlantWastePost",
5772 "requestBody": {
5773 "content": {
5774 "application/json-patch+json": {
5775 "schema": {
5776 "$ref": "#/components/schemas/PlantWasteDetailWaste"
5777 }
5778 },
5779 "application/json": {
5780 "schema": {
5781 "$ref": "#/components/schemas/PlantWasteDetailWaste"
5782 }
5783 },
5784 "text/json": {
5785 "schema": {
5786 "$ref": "#/components/schemas/PlantWasteDetailWaste"
5787 }
5788 },
5789 "application/*+json": {
5790 "schema": {
5791 "$ref": "#/components/schemas/PlantWasteDetailWaste"
5792 }
5793 }
5794 },
5795 "x-bodyName": "req"
5796 },
5797 "responses": {
5798 "200": {
5799 "description": "OK",
5800 "content": {
5801 "application/json": {
5802 "schema": {
5803 "type": "object"
5804 }
5805 }
5806 }
5807 },
5808 "400": {
5809 "description": "Bad Request",
5810 "content": {
5811 "application/json": {
5812 "schema": {
5813 "type": "string"
5814 }
5815 }
5816 }
5817 },
5818 "401": {
5819 "description": "Unauthorized"
5820 },
5821 "403": {
5822 "description": "Forbidden"
5823 },
5824 "500": {
5825 "description": "Internal Server Error"
5826 }
5827 }
5828 }
5829 },
5830 "/whoami": {
5831 "get": {
5832 "tags": ["WhoAmI"],
5833 "summary": "Verify API key and get location identity information",
5834 "description": "**Purpose:** Verifies your API key is valid and returns detailed information about the location/store it's associated with.\n\n**Request Requirements:**\n- Any authenticated role authorization (no specific role required)\n- No query parameters or request body needed\n\n**Response Data:**\n- Response format: `{ LocationIdentity }`\n- Returns location identity object with complete location and company information\n- Location details including name, address, license number, and business information\n- Parent company (LSP) details and global identifiers\n- Configuration settings like customer profile sharing preferences\n- Regional data for compliance and routing\n\n**Common Use Cases:**\n- Confirm your API key is working correctly for API key validation\n- Identify which store/location your API key accesses for location discovery\n- Determine current location context for multi-location applications\n- Get location details for application initialization and configuration setup\n- Troubleshoot authentication and location access issues during debugging\n\n**Performance & Limits:**\n- Lightweight operation with immediate response\n- No rate limiting typically applied to identity verification\n- Recommended as first call when setting up API integration\n- Cached results can be used for session duration\n\n**Related Endpoints:**\n- No direct related endpoints - this is a foundational identity endpoint\n\n**Important Notes:**\n- Call this endpoint first when setting up API integration\n- Verify authentication and understand your location context before other calls\n- Response includes both location-specific and company-wide identifiers\n- Regional information helps with compliance and API routing decisions\n\n**Response Fields:**\n- `LocationId` / `LocationName` for store identification\n- `LspId` / `LspName` for parent company information\n- `Address`, `City`, `State`, `PostalCode` for physical location\n- `LicenseNumber` for business license and compliance\n- `ShareCustomerProfiles` for customer data sharing configuration\n- `LocationGlobalId` / `LspGlobalId` for global unique identifiers",
5835 "operationId": "WhoamiGet",
5836 "responses": {
5837 "200": {
5838 "description": "Success - Returns location identity object: `{ LocationIdentity }`",
5839 "content": {
5840 "application/json": {
5841 "schema": {
5842 "$ref": "#/components/schemas/LocationIdentity"
5843 }
5844 }
5845 }
5846 },
5847 "401": {
5848 "description": "Unauthorized - Invalid or missing API key"
5849 },
5850 "403": {
5851 "description": "Forbidden - API key doesn't have access to this location"
5852 },
5853 "404": {
5854 "description": "Not Found - Location not found for the authenticated API key"
5855 },
5856 "500": {
5857 "description": "Internal Server Error - Server error occurred"
5858 }
5859 }
5860 }
5861 }
5862 },
5863 "components": {
5864 "schemas": {
5865 "Address": {
5866 "type": "object",
5867 "properties": {
5868 "addressId": {
5869 "type": "integer",
5870 "format": "int32",
5871 "nullable": true
5872 },
5873 "customerId": {
5874 "type": "integer",
5875 "format": "int32"
5876 },
5877 "street": {
5878 "type": "string",
5879 "nullable": true
5880 },
5881 "street2": {
5882 "type": "string",
5883 "nullable": true
5884 },
5885 "city": {
5886 "type": "string",
5887 "nullable": true
5888 },
5889 "state": {
5890 "type": "string",
5891 "nullable": true
5892 },
5893 "postal_code": {
5894 "type": "string",
5895 "nullable": true
5896 },
5897 "country_Code": {
5898 "type": "string",
5899 "nullable": true
5900 },
5901 "latitude": {
5902 "type": "number",
5903 "format": "double",
5904 "nullable": true
5905 },
5906 "longitude": {
5907 "type": "number",
5908 "format": "double",
5909 "nullable": true
5910 },
5911 "county": {
5912 "type": "string",
5913 "nullable": true
5914 },
5915 "additionalStateIdentifiers": {
5916 "type": "string",
5917 "nullable": true
5918 }
5919 },
5920 "additionalProperties": false
5921 },
5922 "AllocatedDeliveryItem": {
5923 "type": "object",
5924 "properties": {
5925 "transactionId": {
5926 "type": "integer",
5927 "format": "int32"
5928 },
5929 "productName": {
5930 "type": "string",
5931 "nullable": true
5932 },
5933 "quantity": {
5934 "type": "number",
5935 "format": "double"
5936 },
5937 "totalPrice": {
5938 "type": "number",
5939 "format": "double"
5940 },
5941 "totalDiscount": {
5942 "type": "number",
5943 "format": "double"
5944 },
5945 "totalTax": {
5946 "type": "number",
5947 "format": "double"
5948 }
5949 },
5950 "additionalProperties": false
5951 },
5952 "AllocatedPreOrderItem": {
5953 "type": "object",
5954 "properties": {
5955 "productName": {
5956 "type": "string",
5957 "nullable": true
5958 },
5959 "quantity": {
5960 "type": "number",
5961 "format": "double"
5962 },
5963 "totalPrice": {
5964 "type": "number",
5965 "format": "double"
5966 },
5967 "totalDiscount": {
5968 "type": "number",
5969 "format": "double"
5970 },
5971 "totalTax": {
5972 "type": "number",
5973 "format": "double"
5974 }
5975 },
5976 "additionalProperties": false
5977 },
5978 "AnonymousTransaction": {
5979 "type": "object",
5980 "properties": {
5981 "customerId": {
5982 "type": "integer",
5983 "description": "Unique identifier for the customer record associated with this anonymous transaction.",
5984 "format": "int32"
5985 },
5986 "transactionId": {
5987 "type": "integer",
5988 "description": "Unique identifier for the transaction record.",
5989 "format": "int32"
5990 },
5991 "uniqueId": {
5992 "type": "string",
5993 "description": "String representation of the unique identifier for API responses.",
5994 "nullable": true,
5995 "readOnly": true
5996 }
5997 },
5998 "additionalProperties": false,
5999 "description": "Anonymous transaction response model containing transaction identifiers for guest checkout operations."
6000 },
6001 "AppliedDiscount": {
6002 "type": "object",
6003 "properties": {
6004 "discountId": {
6005 "type": "integer",
6006 "description": "Unique identifier for the discount program or campaign applied.",
6007 "format": "int32"
6008 },
6009 "discountName": {
6010 "type": "string",
6011 "description": "Display name of the discount for customer receipts and reporting.",
6012 "nullable": true
6013 },
6014 "discountReason": {
6015 "type": "string",
6016 "description": "Reason or justification for the discount application (e.g., \"Loyalty Reward\", \"Medical Patient\").",
6017 "nullable": true
6018 },
6019 "amount": {
6020 "type": "number",
6021 "description": "Discount amount applied to the transaction item (in USD, positive value represents savings).",
6022 "format": "double"
6023 },
6024 "transactionItemId": {
6025 "type": "integer",
6026 "description": "Reference identifier linking this discount back to the specific transaction line item.\nNot guaranteed to be unique outside of a single transaction.",
6027 "format": "int32",
6028 "readOnly": true
6029 }
6030 },
6031 "additionalProperties": false,
6032 "description": "Discount information applied to a specific transaction item in cannabis retail operations."
6033 },
6034 "AssignPlantsToGroupRequest": {
6035 "type": "object",
6036 "properties": {
6037 "plantGroupName": {
6038 "type": "string",
6039 "description": "Name of target plant group for batch organization and cultivation tracking",
6040 "nullable": true
6041 },
6042 "plantSerialNumbers": {
6043 "type": "array",
6044 "items": {
6045 "type": "string"
6046 },
6047 "description": "Collection of plant serial numbers to assign to the specified plant group",
6048 "nullable": true
6049 }
6050 },
6051 "additionalProperties": false,
6052 "description": "Request model for assigning existing cannabis plants to a specific plant group for batch management and cultivation workflow organization.\n\n**Plant Group Assignment:**\n- Assigns existing plants to target plant group using serial numbers\n- Supports batch organization for cultivation workflow management\n- Plants identified by serial numbers for precise assignment\n- Validates target plant group exists before assignment\n\n**Serial Number Identification:**\n- Plants identified by their unique serial numbers rather than IDs\n- All serial numbers must correspond to existing plants in the facility\n- Plants must be accessible to the authenticated location\n- Serial numbers must match exact plant tracking identifiers\n\n**Batch Management:**\n- Plant groups enable batch-based cultivation tracking and compliance\n- Supports harvest planning and cultivation scheduling optimization\n- Facilitates cultivation management and operational efficiency"
6053 },
6054 "BadRequestPropertyError": {
6055 "type": "object",
6056 "properties": {
6057 "propertyName": {
6058 "type": "string",
6059 "description": "Name of the property that failed validation.",
6060 "nullable": true
6061 },
6062 "propertyError": {
6063 "type": "string",
6064 "description": "Description of the validation error for the specified property.",
6065 "nullable": true
6066 }
6067 },
6068 "additionalProperties": false,
6069 "description": "Field-specific validation error details for BadRequest responses."
6070 },
6071 "BadRequestResponse": {
6072 "type": "object",
6073 "properties": {
6074 "message": {
6075 "type": "string",
6076 "description": "General error message describing the nature of the bad request.",
6077 "nullable": true
6078 },
6079 "propertyErrors": {
6080 "type": "array",
6081 "items": {
6082 "$ref": "#/components/schemas/BadRequestPropertyError"
6083 },
6084 "description": "Collection of field-specific validation errors for detailed feedback.",
6085 "nullable": true
6086 }
6087 },
6088 "additionalProperties": false,
6089 "description": "Standardized error response model for HTTP 400 Bad Request responses across the API."
6090 },
6091 "BatchDetails": {
6092 "type": "object",
6093 "properties": {
6094 "batchName": {
6095 "type": "string",
6096 "description": "Display name for the immature plant batch for identification and organization.",
6097 "nullable": true
6098 },
6099 "plantType": {
6100 "type": "string",
6101 "description": "Plant type designation for the batch (e.g., \"Seedling\", \"Clone\", \"Cutting\").",
6102 "nullable": true
6103 },
6104 "plantCount": {
6105 "type": "integer",
6106 "description": "Number of plants in the immature batch for inventory tracking and compliance.",
6107 "format": "int32"
6108 },
6109 "strainId": {
6110 "type": "integer",
6111 "description": "Strain identifier for the cannabis strain being cultivated in this batch.",
6112 "format": "int32"
6113 },
6114 "roomId": {
6115 "type": "integer",
6116 "description": "Room identifier for the immature batch location assignment.",
6117 "format": "int32"
6118 },
6119 "tableId": {
6120 "type": "integer",
6121 "description": "Table identifier within the room for precise location tracking (optional).",
6122 "format": "int32",
6123 "nullable": true
6124 },
6125 "motherPlantId": {
6126 "type": "integer",
6127 "description": "Mother plant identifier for tracking genetic lineage (required for clone batches).",
6128 "format": "int32",
6129 "nullable": true
6130 },
6131 "dateCreated": {
6132 "type": "string",
6133 "description": "Date when the immature batch was created for cultivation timeline documentation.",
6134 "format": "date-time",
6135 "nullable": true
6136 }
6137 },
6138 "additionalProperties": false,
6139 "description": "Detailed specification for creating individual immature plant batches with cultivation and compliance information."
6140 },
6141 "BooleanNullableOptional": {
6142 "type": "boolean",
6143 "additionalProperties": false
6144 },
6145 "BooleanOptional": {
6146 "type": "boolean",
6147 "additionalProperties": false
6148 },
6149 "Brand": {
6150 "type": "object",
6151 "properties": {
6152 "brandId": {
6153 "type": "integer",
6154 "format": "int32"
6155 },
6156 "brandName": {
6157 "type": "string",
6158 "nullable": true
6159 },
6160 "brandCatalogBrandId": {
6161 "type": "string",
6162 "nullable": true
6163 }
6164 },
6165 "additionalProperties": false
6166 },
6167 "BrandEditRequest": {
6168 "type": "object",
6169 "properties": {
6170 "brandId": {
6171 "type": "integer",
6172 "format": "int32",
6173 "nullable": true
6174 },
6175 "brandName": {
6176 "type": "string",
6177 "nullable": true
6178 }
6179 },
6180 "additionalProperties": false
6181 },
6182 "BroadcastedResponses": {
6183 "type": "object",
6184 "properties": {
6185 "responses": {
6186 "type": "array",
6187 "items": {
6188 "$ref": "#/components/schemas/LocationResponse"
6189 },
6190 "nullable": true
6191 }
6192 },
6193 "additionalProperties": false
6194 },
6195 "BulkCreateOrUpdateHarvest": {
6196 "type": "object",
6197 "properties": {
6198 "harvests": {
6199 "type": "array",
6200 "items": {
6201 "$ref": "#/components/schemas/BulkHarvestDetail"
6202 },
6203 "nullable": true
6204 }
6205 },
6206 "additionalProperties": false
6207 },
6208 "BulkCreateOrUpdateHarvestResponse": {
6209 "type": "object",
6210 "properties": {
6211 "createdHarvestIds": {
6212 "type": "array",
6213 "items": {
6214 "type": "integer",
6215 "format": "int32"
6216 },
6217 "nullable": true
6218 },
6219 "updatedHarvestIds": {
6220 "type": "array",
6221 "items": {
6222 "type": "integer",
6223 "format": "int32"
6224 },
6225 "nullable": true
6226 }
6227 },
6228 "additionalProperties": false
6229 },
6230 "BulkHarvestDetail": {
6231 "type": "object",
6232 "properties": {
6233 "harvestId": {
6234 "type": "integer",
6235 "format": "int32",
6236 "nullable": true
6237 },
6238 "harvestName": {
6239 "type": "string",
6240 "nullable": true
6241 },
6242 "harvestRoomId": {
6243 "type": "integer",
6244 "format": "int32"
6245 },
6246 "harvestDate": {
6247 "type": "string",
6248 "format": "date-time",
6249 "nullable": true
6250 },
6251 "strainId": {
6252 "type": "integer",
6253 "format": "int32"
6254 }
6255 },
6256 "additionalProperties": false
6257 },
6258 "CalculationMethod": {
6259 "enum": [1, 2, 3, 4, 5, 6, 15],
6260 "type": "integer",
6261 "format": "int32"
6262 },
6263 "CancelPreorderRequest": {
6264 "type": "object",
6265 "properties": {
6266 "orderId": {
6267 "type": "integer",
6268 "description": "Unique identifier of the pre-order to be canceled.",
6269 "format": "int32"
6270 },
6271 "cancellationReason": {
6272 "type": "string",
6273 "description": "Required reason for canceling the order (used for business analytics and customer service).",
6274 "nullable": true
6275 }
6276 },
6277 "additionalProperties": false,
6278 "description": "Request model for canceling existing customer pre-orders before fulfillment."
6279 },
6280 "CannabinoidTerpeneValue": {
6281 "required": ["labResultName", "labResultUnitId", "value"],
6282 "type": "object",
6283 "properties": {
6284 "labResultName": {
6285 "minLength": 1,
6286 "type": "string",
6287 "description": "Name of the laboratory test result (e.g., \"THC\", \"CBD\", \"Limonene\") - must match predefined compound list."
6288 },
6289 "value": {
6290 "type": "number",
6291 "description": "Measured value of the compound in the cannabis sample (decimal precision for accurate reporting).",
6292 "format": "double"
6293 },
6294 "labResultUnitId": {
6295 "type": "integer",
6296 "description": "Unit identifier for the measurement (references LabResultUnit enum - mg/g, percentage, etc.).",
6297 "format": "int32"
6298 }
6299 },
6300 "additionalProperties": false,
6301 "description": "Laboratory test result value model for cannabinoid and terpene measurements in cannabis products."
6302 },
6303 "CartItemPrice": {
6304 "type": "object",
6305 "properties": {
6306 "productName": {
6307 "type": "string",
6308 "nullable": true
6309 },
6310 "productId": {
6311 "type": "integer",
6312 "format": "int32"
6313 },
6314 "quantity": {
6315 "type": "number",
6316 "format": "double"
6317 },
6318 "subtotal": {
6319 "type": "number",
6320 "format": "double"
6321 },
6322 "pricingTierAdjustment": {
6323 "type": "number",
6324 "format": "double",
6325 "nullable": true
6326 },
6327 "discounts": {
6328 "type": "array",
6329 "items": {
6330 "$ref": "#/components/schemas/Discount"
6331 },
6332 "nullable": true
6333 },
6334 "tax": {
6335 "type": "number",
6336 "format": "double"
6337 }
6338 },
6339 "additionalProperties": false
6340 },
6341 "CartPrice": {
6342 "type": "object",
6343 "properties": {
6344 "cartItemPrices": {
6345 "type": "array",
6346 "items": {
6347 "$ref": "#/components/schemas/CartItemPrice"
6348 },
6349 "nullable": true
6350 },
6351 "subTotal": {
6352 "type": "number",
6353 "format": "double"
6354 },
6355 "taxes": {
6356 "type": "number",
6357 "format": "double"
6358 },
6359 "discount": {
6360 "type": "number",
6361 "format": "double"
6362 },
6363 "total": {
6364 "type": "number",
6365 "format": "double"
6366 },
6367 "originalTotal": {
6368 "type": "number",
6369 "format": "double"
6370 },
6371 "roundedDifference": {
6372 "type": "number",
6373 "format": "double"
6374 }
6375 },
6376 "additionalProperties": false
6377 },
6378 "ChangeGrowthPhaseRequest": {
6379 "type": "object",
6380 "properties": {
6381 "plantIds": {
6382 "type": "array",
6383 "items": {
6384 "type": "integer",
6385 "format": "int32"
6386 },
6387 "description": "Collection of LeafLogix plant IDs to update to the new growth phase",
6388 "nullable": true
6389 },
6390 "growthPhase": {
6391 "type": "string",
6392 "description": "Target cultivation growth phase. Must be one of: `Propagation`, `Vegetative`, `Flowering`",
6393 "nullable": true
6394 },
6395 "phaseStartDate": {
6396 "type": "string",
6397 "description": "Date when new growth phase begins (optional, defaults to current UTC time if not specified)",
6398 "format": "date-time",
6399 "nullable": true
6400 }
6401 },
6402 "additionalProperties": false,
6403 "description": "Request model for updating the cultivation growth phase of cannabis plants to track development stages.\n\n**Growth Phase Management:**\n- Updates plant cultivation phase for proper development tracking\n- Supports bulk processing of multiple plants in single operation\n- Validates growth phase against allowed phase values\n- Automatically sets phase start date if not provided\n\n**Valid Growth Phases:**\n- `Propagation`: Initial plant development and cloning phase\n- `Vegetative`: Active vegetative growth before flowering initiation\n- `Flowering`: Reproductive growth phase leading to harvest\n\n**Phase Transition Rules:**\n- Phase start date defaults to current UTC time if not specified\n- Phase changes are logged for cultivation timeline tracking\n- Integration with external cultivation systems for environmental control"
6404 },
6405 "ClosingReportCategorySummary": {
6406 "type": "object",
6407 "properties": {
6408 "category": {
6409 "type": "string",
6410 "description": "Product category name (e.g., \"Flower\", \"Edibles\", \"Concentrates\").",
6411 "nullable": true
6412 },
6413 "categoryTotal": {
6414 "type": "number",
6415 "description": "Total net sales for the category (calculated property returning CategoryNetTotal).",
6416 "format": "double",
6417 "readOnly": true
6418 },
6419 "categoryGrossTotal": {
6420 "type": "number",
6421 "description": "Gross sales total for the category before discounts (in USD).",
6422 "format": "double"
6423 },
6424 "categoryDiscountTotal": {
6425 "type": "number",
6426 "description": "Total discount amount applied to products in this category (in USD).",
6427 "format": "double"
6428 },
6429 "categoryNetTotal": {
6430 "type": "number",
6431 "description": "Net sales total for the category after discounts (in USD).",
6432 "format": "double"
6433 },
6434 "categoryCost": {
6435 "type": "number",
6436 "description": "Total cost of goods sold for products in this category (in USD).",
6437 "format": "double"
6438 }
6439 },
6440 "additionalProperties": false,
6441 "description": "Product category sales summary for cannabis retail closing reports and financial analysis."
6442 },
6443 "ClosingReportCustomerTypeSummary": {
6444 "type": "object",
6445 "properties": {
6446 "customerType": {
6447 "type": "string",
6448 "description": "Customer type classification (e.g., \"Recreational\", \"Medical\", \"Industry\").",
6449 "nullable": true
6450 },
6451 "total": {
6452 "type": "number",
6453 "description": "Total net sales for this customer type (calculated property returning NetTotal).",
6454 "format": "double",
6455 "readOnly": true
6456 },
6457 "grossTotal": {
6458 "type": "number",
6459 "description": "Gross sales total for this customer type before discounts (in USD).",
6460 "format": "double"
6461 },
6462 "netTotal": {
6463 "type": "number",
6464 "description": "Net sales total for this customer type after discounts (in USD).",
6465 "format": "double"
6466 },
6467 "discountTotal": {
6468 "type": "number",
6469 "description": "Total discount amount applied to this customer type (in USD).",
6470 "format": "double"
6471 },
6472 "customerTypeCost": {
6473 "type": "number",
6474 "description": "Total cost of goods sold for this customer type (in USD).",
6475 "format": "double"
6476 },
6477 "cannabisSales": {
6478 "type": "number",
6479 "description": "Cannabis product sales total for this customer type (in USD).",
6480 "format": "double"
6481 },
6482 "nonCannabisSales": {
6483 "type": "number",
6484 "description": "Non-cannabis product sales total for this customer type (accessories, etc.) (in USD).",
6485 "format": "double"
6486 }
6487 },
6488 "additionalProperties": false,
6489 "description": "Customer type sales summary for cannabis retail closing reports and customer segment analysis."
6490 },
6491 "ClosingReportOrderSourceSummary": {
6492 "type": "object",
6493 "properties": {
6494 "orderSource": {
6495 "type": "string",
6496 "description": "Order origination source (e.g., \"Website\", \"Mobile App\", \"Weedmaps\", \"Walk-In\").",
6497 "nullable": true
6498 },
6499 "total": {
6500 "type": "number",
6501 "description": "Total net sales for this order source (calculated property returning NetTotal).",
6502 "format": "double",
6503 "readOnly": true
6504 },
6505 "grossTotal": {
6506 "type": "number",
6507 "description": "Gross sales total for this order source before discounts (in USD).",
6508 "format": "double"
6509 },
6510 "netTotal": {
6511 "type": "number",
6512 "description": "Net sales total for this order source after discounts (in USD).",
6513 "format": "double"
6514 },
6515 "discountTotal": {
6516 "type": "number",
6517 "description": "Total discount amount applied to this order source (in USD).",
6518 "format": "double"
6519 },
6520 "orderSourceCost": {
6521 "type": "number",
6522 "format": "double"
6523 }
6524 },
6525 "additionalProperties": false,
6526 "description": "Order source sales summary for cannabis retail closing reports and marketing channel analysis."
6527 },
6528 "ClosingReportOrderTypeSummary": {
6529 "type": "object",
6530 "properties": {
6531 "orderType": {
6532 "type": "string",
6533 "description": "Order fulfillment type (e.g., \"In-Store\", \"Pickup\", \"Delivery\", \"Curbside\").",
6534 "nullable": true
6535 },
6536 "total": {
6537 "type": "number",
6538 "description": "Total net sales for this order type (calculated property returning NetTotal).",
6539 "format": "double",
6540 "readOnly": true
6541 },
6542 "grossTotal": {
6543 "type": "number",
6544 "description": "Gross sales total for this order type before discounts (in USD).",
6545 "format": "double"
6546 },
6547 "netTotal": {
6548 "type": "number",
6549 "description": "Net sales total for this order type after discounts (in USD).",
6550 "format": "double"
6551 },
6552 "discountTotal": {
6553 "type": "number",
6554 "description": "Total discount amount applied to this order type (in USD).",
6555 "format": "double"
6556 },
6557 "orderTypeCost": {
6558 "type": "number",
6559 "description": "Total cost of goods sold for this order type (in USD).",
6560 "format": "double"
6561 }
6562 },
6563 "additionalProperties": false,
6564 "description": "Order type sales summary for cannabis retail closing reports and fulfillment channel analysis."
6565 },
6566 "ClosingReportPayByBankBatchFileSums": {
6567 "type": "object",
6568 "properties": {
6569 "batchFileName": {
6570 "type": "string",
6571 "description": "Batch file name for payment processor identification and tracking.",
6572 "nullable": true
6573 },
6574 "payByBankBatchFileAdjustmentAmount": {
6575 "type": "number",
6576 "description": "Adjustment amount for the batch file for financial reconciliation.",
6577 "format": "double"
6578 }
6579 },
6580 "additionalProperties": false,
6581 "description": "Pay-by-Bank batch file summary for cannabis payment processing reconciliation."
6582 },
6583 "ClosingReportPaymentSummary": {
6584 "type": "object",
6585 "properties": {
6586 "paymentType": {
6587 "type": "string",
6588 "description": "Payment method type (e.g., \"Cash\", \"Credit Card\", \"CanPay\", \"Hypur\").",
6589 "nullable": true
6590 },
6591 "totalPaid": {
6592 "type": "number",
6593 "description": "Total amount paid using this payment method (in USD).",
6594 "format": "double"
6595 }
6596 },
6597 "additionalProperties": false,
6598 "description": "Payment method summary for cannabis retail closing reports and financial reconciliation."
6599 },
6600 "ClosingReportTaxRateSummary": {
6601 "type": "object",
6602 "properties": {
6603 "taxRate": {
6604 "type": "string",
6605 "description": "Tax rate name or type (e.g., \"State Excise Tax\", \"City Cannabis Tax\", \"Sales Tax\").",
6606 "nullable": true
6607 },
6608 "totalTax": {
6609 "type": "number",
6610 "description": "Total tax amount collected for this tax rate (in USD).",
6611 "format": "double"
6612 }
6613 },
6614 "additionalProperties": false,
6615 "description": "Tax rate summary for cannabis retail closing reports and tax liability tracking."
6616 },
6617 "ClosingReportV2": {
6618 "type": "object",
6619 "properties": {
6620 "totalTips": {
6621 "type": "number",
6622 "description": "Total tips aggregated for the closing period for staff distribution.",
6623 "format": "double",
6624 "nullable": true,
6625 "readOnly": true
6626 },
6627 "payByBankTips": {
6628 "type": "number",
6629 "description": "Tips processed through Pay-by-Bank system for electronic tip distribution.",
6630 "format": "double"
6631 },
6632 "payByBankTransactionFees": {
6633 "type": "number",
6634 "description": "Transaction fees charged by Pay-by-Bank system for cost accounting.",
6635 "format": "double"
6636 },
6637 "payByBankBatchFile": {
6638 "type": "array",
6639 "items": {
6640 "$ref": "#/components/schemas/ClosingReportPayByBankBatchFileSums"
6641 },
6642 "description": "Batch file summaries for Pay-by-Bank transaction reconciliation.",
6643 "nullable": true
6644 },
6645 "feesDonations": {
6646 "type": "array",
6647 "items": {
6648 "$ref": "#/components/schemas/FeeDonation"
6649 },
6650 "description": "Fees and donations collected during the closing period for compliance reporting.",
6651 "nullable": true
6652 },
6653 "dutchiePayTips": {
6654 "type": "number",
6655 "description": "DutchiePay tips processed for cannabis payment integration.",
6656 "format": "double",
6657 "nullable": true,
6658 "readOnly": true
6659 },
6660 "dutchiePayTotalAdjustmentAmount": {
6661 "type": "number",
6662 "description": "DutchiePay transaction adjustments for cannabis payment processing.",
6663 "format": "double",
6664 "nullable": true,
6665 "readOnly": true
6666 },
6667 "dutchiePayBatchFileSums": {
6668 "type": "array",
6669 "items": {
6670 "$ref": "#/components/schemas/ClosingReportPayByBankBatchFileSums"
6671 },
6672 "description": "DutchiePay batch file summaries for cannabis payment reconciliation.",
6673 "nullable": true,
6674 "readOnly": true
6675 },
6676 "grossSales": {
6677 "type": "number",
6678 "format": "double",
6679 "nullable": true
6680 },
6681 "discount": {
6682 "type": "number",
6683 "format": "double",
6684 "nullable": true
6685 },
6686 "loyalty": {
6687 "type": "number",
6688 "format": "double",
6689 "nullable": true
6690 },
6691 "totalTax": {
6692 "type": "number",
6693 "format": "double",
6694 "nullable": true
6695 },
6696 "cost": {
6697 "type": "number",
6698 "format": "double",
6699 "nullable": true
6700 },
6701 "coupons": {
6702 "type": "number",
6703 "format": "double",
6704 "nullable": true
6705 },
6706 "itemTotal": {
6707 "type": "number",
6708 "format": "double",
6709 "nullable": true
6710 },
6711 "transactionCount": {
6712 "type": "integer",
6713 "format": "int32"
6714 },
6715 "itemCount": {
6716 "type": "integer",
6717 "format": "int32"
6718 },
6719 "customerCount": {
6720 "type": "integer",
6721 "format": "int32"
6722 },
6723 "newCustomerCount": {
6724 "type": "integer",
6725 "format": "int32"
6726 },
6727 "voidCount": {
6728 "type": "integer",
6729 "format": "int32"
6730 },
6731 "voidTotal": {
6732 "type": "number",
6733 "format": "double",
6734 "nullable": true
6735 },
6736 "returnTotal": {
6737 "type": "number",
6738 "format": "double",
6739 "nullable": true
6740 },
6741 "startingBalance": {
6742 "type": "number",
6743 "format": "double",
6744 "nullable": true
6745 },
6746 "endingBalance": {
6747 "type": "number",
6748 "format": "double",
6749 "nullable": true
6750 },
6751 "deposits": {
6752 "type": "number",
6753 "format": "double",
6754 "nullable": true
6755 },
6756 "adjustments": {
6757 "type": "number",
6758 "format": "double",
6759 "nullable": true
6760 },
6761 "totalPayments": {
6762 "type": "number",
6763 "format": "double",
6764 "nullable": true
6765 },
6766 "invoiceTotal": {
6767 "type": "number",
6768 "format": "double",
6769 "nullable": true
6770 },
6771 "cannabisSales": {
6772 "type": "number",
6773 "format": "double",
6774 "nullable": true
6775 },
6776 "nonCannabisSales": {
6777 "type": "number",
6778 "format": "double",
6779 "nullable": true
6780 },
6781 "netSales": {
6782 "type": "number",
6783 "format": "double",
6784 "nullable": true
6785 },
6786 "revenueFeesDonations": {
6787 "type": "number",
6788 "format": "double",
6789 "nullable": true
6790 },
6791 "nonRevenueFeesDonations": {
6792 "type": "number",
6793 "format": "double",
6794 "nullable": true
6795 },
6796 "rounding": {
6797 "type": "number",
6798 "format": "double",
6799 "nullable": true
6800 },
6801 "totalIncome": {
6802 "type": "number",
6803 "format": "double",
6804 "nullable": true
6805 },
6806 "averageCartNetSales": {
6807 "type": "number",
6808 "format": "double",
6809 "nullable": true
6810 },
6811 "overShort": {
6812 "type": "number",
6813 "format": "double",
6814 "nullable": true,
6815 "readOnly": true
6816 },
6817 "categorySummary": {
6818 "type": "array",
6819 "items": {
6820 "$ref": "#/components/schemas/ClosingReportCategorySummary"
6821 },
6822 "nullable": true
6823 },
6824 "paymentSummary": {
6825 "type": "array",
6826 "items": {
6827 "$ref": "#/components/schemas/ClosingReportPaymentSummary"
6828 },
6829 "nullable": true
6830 },
6831 "taxSummary": {
6832 "type": "array",
6833 "items": {
6834 "$ref": "#/components/schemas/ClosingReportTaxRateSummary"
6835 },
6836 "nullable": true
6837 },
6838 "customerTypeSummary": {
6839 "type": "array",
6840 "items": {
6841 "$ref": "#/components/schemas/ClosingReportCustomerTypeSummary"
6842 },
6843 "nullable": true
6844 },
6845 "orderTypeSummary": {
6846 "type": "array",
6847 "items": {
6848 "$ref": "#/components/schemas/ClosingReportOrderTypeSummary"
6849 },
6850 "nullable": true
6851 },
6852 "orderSourceSummary": {
6853 "type": "array",
6854 "items": {
6855 "$ref": "#/components/schemas/ClosingReportOrderSourceSummary"
6856 },
6857 "nullable": true
6858 }
6859 },
6860 "additionalProperties": false,
6861 "description": "Enhanced closing report model for cannabis dispensary daily financial operations with payment processing integration."
6862 },
6863 "ConvertBatchDetails": {
6864 "type": "object",
6865 "properties": {
6866 "batchId": {
6867 "type": "integer",
6868 "description": "Batch identifier for the plant batch being converted to mature growth phase.",
6869 "format": "int32"
6870 },
6871 "serialNumbers": {
6872 "type": "array",
6873 "items": {
6874 "type": "string"
6875 },
6876 "description": "Collection of individual plant serial numbers within the batch for state tracking compliance.",
6877 "nullable": true
6878 },
6879 "batchStage": {
6880 "type": "string",
6881 "description": "Target growth stage for the batch conversion (e.g., \"Vegetative\", \"Flowering\").",
6882 "nullable": true
6883 },
6884 "roomId": {
6885 "type": "integer",
6886 "description": "Destination room identifier for the converted batch location tracking.",
6887 "format": "int32"
6888 },
6889 "tableId": {
6890 "type": "integer",
6891 "description": "Destination table identifier within the room for precise location tracking (optional).",
6892 "format": "int32",
6893 "nullable": true
6894 },
6895 "dateCreated": {
6896 "type": "string",
6897 "description": "Date when the batch conversion was performed for cultivation timeline documentation.",
6898 "format": "date-time",
6899 "nullable": true
6900 }
6901 },
6902 "additionalProperties": false,
6903 "description": "Detailed specification for converting individual plant batches during cultivation growth phase transitions."
6904 },
6905 "ConvertImmatureBatchRequest": {
6906 "type": "object",
6907 "properties": {
6908 "batches": {
6909 "type": "array",
6910 "items": {
6911 "$ref": "#/components/schemas/ConvertBatchDetails"
6912 },
6913 "description": "Collection of plant batches to be converted from immature to mature growth phases.",
6914 "nullable": true
6915 }
6916 },
6917 "additionalProperties": false,
6918 "description": "Request model for converting immature plant batches to mature growth phases in cannabis cultivation operations."
6919 },
6920 "ConvertImmaturePlantResponse": {
6921 "type": "object",
6922 "properties": {
6923 "convertedPlants": {
6924 "type": "array",
6925 "items": {
6926 "$ref": "#/components/schemas/CreatedMaturePlant"
6927 },
6928 "description": "Collection of mature plants created from immature batch conversion.",
6929 "nullable": true
6930 }
6931 },
6932 "additionalProperties": false,
6933 "description": "Response model for immature plant batch conversion operations containing converted mature plant identifiers."
6934 },
6935 "ConvertImmaturePlantResponseApiResult": {
6936 "type": "object",
6937 "properties": {
6938 "result": {
6939 "type": "boolean"
6940 },
6941 "message": {
6942 "type": "string",
6943 "nullable": true
6944 },
6945 "data": {
6946 "$ref": "#/components/schemas/ConvertImmaturePlantResponse"
6947 }
6948 },
6949 "additionalProperties": false
6950 },
6951 "CreateAnonymousTransactionRequest": {
6952 "type": "object",
6953 "properties": {
6954 "transactionReference": {
6955 "type": "string",
6956 "description": "Optional reference identifier for the transaction (for external system integration).",
6957 "nullable": true
6958 }
6959 },
6960 "additionalProperties": false,
6961 "description": "Request model for creating anonymous transactions for guest customer operations."
6962 },
6963 "CreateImmaturePlantBatchResponse": {
6964 "type": "object",
6965 "properties": {
6966 "batches": {
6967 "type": "array",
6968 "items": {
6969 "$ref": "#/components/schemas/CreatedImmaturePlantBatch"
6970 },
6971 "description": "Collection of created immature plant batches with associated plant identifiers.",
6972 "nullable": true
6973 }
6974 },
6975 "additionalProperties": false,
6976 "description": "Response model for immature plant batch creation operations containing created batch and plant identifiers."
6977 },
6978 "CreateImmaturePlantBatchResponseApiResult": {
6979 "type": "object",
6980 "properties": {
6981 "result": {
6982 "type": "boolean"
6983 },
6984 "message": {
6985 "type": "string",
6986 "nullable": true
6987 },
6988 "data": {
6989 "$ref": "#/components/schemas/CreateImmaturePlantBatchResponse"
6990 }
6991 },
6992 "additionalProperties": false
6993 },
6994 "CreateJournalEntryRequest": {
6995 "required": ["body", "customerId", "date", "subject"],
6996 "type": "object",
6997 "properties": {
6998 "customerId": {
6999 "type": "integer",
7000 "description": "The customer ID to create the journal entry for.",
7001 "format": "int32"
7002 },
7003 "subject": {
7004 "minLength": 1,
7005 "type": "string",
7006 "description": "Brief title or summary of the journal entry."
7007 },
7008 "body": {
7009 "minLength": 1,
7010 "type": "string",
7011 "description": "Detailed content and notes for the journal entry."
7012 },
7013 "date": {
7014 "type": "string",
7015 "description": "Date and time when the journal entry should be dated.",
7016 "format": "date-time"
7017 }
7018 },
7019 "additionalProperties": false,
7020 "description": "Request model for creating new customer journal entries with interaction details and notes."
7021 },
7022 "CreateMatureBatchRequest": {
7023 "type": "object",
7024 "properties": {
7025 "batches": {
7026 "type": "array",
7027 "items": {
7028 "$ref": "#/components/schemas/MatureBatchDetails"
7029 },
7030 "description": "Collection of mature plant batch specifications for bulk batch creation operations.",
7031 "nullable": true
7032 }
7033 },
7034 "additionalProperties": false,
7035 "description": "Request model for creating mature plant batches in cannabis cultivation operations."
7036 },
7037 "CreateMaturePlantsResponse": {
7038 "type": "object",
7039 "properties": {
7040 "createdPlants": {
7041 "type": "array",
7042 "items": {
7043 "$ref": "#/components/schemas/CreatedMaturePlant"
7044 },
7045 "description": "Collection of mature plants created ready for flowering phase cultivation.",
7046 "nullable": true
7047 }
7048 },
7049 "additionalProperties": false,
7050 "description": "Response model for mature plant batch creation operations containing created mature plant identifiers."
7051 },
7052 "CreateMaturePlantsResponseApiResult": {
7053 "type": "object",
7054 "properties": {
7055 "result": {
7056 "type": "boolean"
7057 },
7058 "message": {
7059 "type": "string",
7060 "nullable": true
7061 },
7062 "data": {
7063 "$ref": "#/components/schemas/CreateMaturePlantsResponse"
7064 }
7065 },
7066 "additionalProperties": false
7067 },
7068 "CreateOrUpdateHarvest": {
7069 "type": "object",
7070 "properties": {
7071 "harvestId": {
7072 "type": "integer",
7073 "format": "int32",
7074 "nullable": true
7075 },
7076 "harvestName": {
7077 "type": "string",
7078 "nullable": true
7079 },
7080 "strainName": {
7081 "type": "string",
7082 "nullable": true
7083 },
7084 "harvestRoomId": {
7085 "type": "integer",
7086 "format": "int32"
7087 },
7088 "harvestDate": {
7089 "type": "string",
7090 "format": "date-time"
7091 }
7092 },
7093 "additionalProperties": false
7094 },
7095 "CreatePlantRequest": {
7096 "type": "object",
7097 "properties": {
7098 "serialNumber": {
7099 "type": "string",
7100 "nullable": true
7101 },
7102 "plantGroupName": {
7103 "type": "string",
7104 "nullable": true
7105 },
7106 "growthPhase": {
7107 "type": "string",
7108 "nullable": true
7109 },
7110 "phaseStartDate": {
7111 "type": "string",
7112 "format": "date-time",
7113 "nullable": true
7114 },
7115 "dateCreated": {
7116 "type": "string",
7117 "format": "date-time",
7118 "nullable": true
7119 },
7120 "bornDate": {
7121 "type": "string",
7122 "format": "date-time",
7123 "nullable": true
7124 },
7125 "strain": {
7126 "type": "string",
7127 "nullable": true
7128 },
7129 "room": {
7130 "type": "string",
7131 "nullable": true
7132 },
7133 "table": {
7134 "type": "string",
7135 "nullable": true
7136 },
7137 "isMother": {
7138 "type": "boolean"
7139 },
7140 "bypassStateIntegration": {
7141 "type": "boolean"
7142 }
7143 },
7144 "additionalProperties": false
7145 },
7146 "CreatePreOrderRequest": {
7147 "required": ["customerId"],
7148 "type": "object",
7149 "properties": {
7150 "customerId": {
7151 "type": "integer",
7152 "format": "int32"
7153 },
7154 "items": {
7155 "type": "array",
7156 "items": {
7157 "$ref": "#/components/schemas/PreOrderItem"
7158 },
7159 "nullable": true
7160 },
7161 "redemptions": {
7162 "type": "array",
7163 "items": {
7164 "$ref": "#/components/schemas/PreOrderRedemption"
7165 },
7166 "nullable": true
7167 },
7168 "isDelivery": {
7169 "type": "boolean"
7170 },
7171 "orderSource": {
7172 "type": "string",
7173 "nullable": true,
7174 "deprecated": true
7175 },
7176 "orderType": {
7177 "type": "string",
7178 "nullable": true
7179 },
7180 "deliveryStreet": {
7181 "type": "string",
7182 "nullable": true
7183 },
7184 "deliveryStreet2": {
7185 "type": "string",
7186 "nullable": true
7187 },
7188 "deliveryCity": {
7189 "type": "string",
7190 "nullable": true
7191 },
7192 "deliveryState": {
7193 "type": "string",
7194 "nullable": true
7195 },
7196 "deliveryPostalCode": {
7197 "type": "string",
7198 "nullable": true
7199 },
7200 "idempotencyKey": {
7201 "type": "string",
7202 "nullable": true
7203 },
7204 "notes": {
7205 "type": "string",
7206 "nullable": true
7207 },
7208 "status": {
7209 "type": "string",
7210 "nullable": true
7211 },
7212 "transactionReference": {
7213 "type": "string",
7214 "nullable": true
7215 },
7216 "timeWindowStartDateUtc": {
7217 "type": "string",
7218 "format": "date-time",
7219 "nullable": true
7220 },
7221 "timeWindowEndDateUtc": {
7222 "type": "string",
7223 "format": "date-time",
7224 "nullable": true
7225 },
7226 "deliveryScheduleId": {
7227 "$ref": "#/components/schemas/DeliveryScheduleType"
7228 }
7229 },
7230 "additionalProperties": false
7231 },
7232 "CreateUpdatePurchaseOrderItemRequest": {
7233 "type": "object",
7234 "properties": {
7235 "productId": {
7236 "type": "integer",
7237 "format": "int32"
7238 },
7239 "unitId": {
7240 "$ref": "#/components/schemas/Int32NullableOptional"
7241 },
7242 "quantity": {
7243 "$ref": "#/components/schemas/Int32NullableOptional"
7244 },
7245 "subtotal": {
7246 "$ref": "#/components/schemas/DecimalNullableOptional"
7247 },
7248 "tax": {
7249 "$ref": "#/components/schemas/DecimalNullableOptional"
7250 }
7251 },
7252 "additionalProperties": false
7253 },
7254 "CreateUpdatePurchaseOrderRequest": {
7255 "type": "object",
7256 "properties": {
7257 "purchaseOrderId": {
7258 "type": "integer",
7259 "format": "int32",
7260 "nullable": true
7261 },
7262 "expectedArrivalDate": {
7263 "$ref": "#/components/schemas/DateTimeNullableOptional"
7264 },
7265 "title": {
7266 "$ref": "#/components/schemas/StringOptional"
7267 },
7268 "dateReceived": {
7269 "$ref": "#/components/schemas/DateTimeNullableOptional"
7270 },
7271 "shippingInformation": {
7272 "$ref": "#/components/schemas/StringOptional"
7273 },
7274 "vendorContact": {
7275 "$ref": "#/components/schemas/StringOptional"
7276 },
7277 "status": {
7278 "$ref": "#/components/schemas/StringOptional"
7279 },
7280 "vendorId": {
7281 "$ref": "#/components/schemas/Int32NullableOptional"
7282 },
7283 "purchaseOrderNumber": {
7284 "$ref": "#/components/schemas/Int32NullableOptional"
7285 },
7286 "purchaseOrderItems": {
7287 "type": "array",
7288 "items": {
7289 "$ref": "#/components/schemas/CreateUpdatePurchaseOrderItemRequest"
7290 },
7291 "nullable": true
7292 }
7293 },
7294 "additionalProperties": false
7295 },
7296 "CreateUpdatePurchaseOrderResponse": {
7297 "type": "object",
7298 "properties": {
7299 "createdPurchaseOrderIds": {
7300 "type": "array",
7301 "items": {
7302 "type": "integer",
7303 "format": "int32"
7304 },
7305 "nullable": true
7306 },
7307 "updatedPurchaseOrderIds": {
7308 "type": "array",
7309 "items": {
7310 "type": "integer",
7311 "format": "int32"
7312 },
7313 "nullable": true
7314 }
7315 },
7316 "additionalProperties": false
7317 },
7318 "CreateUpdatePurchaseOrdersRequest": {
7319 "type": "object",
7320 "properties": {
7321 "purchaseOrders": {
7322 "type": "array",
7323 "items": {
7324 "$ref": "#/components/schemas/CreateUpdatePurchaseOrderRequest"
7325 },
7326 "nullable": true
7327 }
7328 },
7329 "additionalProperties": false
7330 },
7331 "CreatedImmaturePlantBatch": {
7332 "type": "object",
7333 "properties": {
7334 "batchId": {
7335 "type": "integer",
7336 "description": "Unique identifier assigned to the created immature plant batch.",
7337 "format": "int32"
7338 },
7339 "plantIds": {
7340 "type": "array",
7341 "items": {
7342 "type": "integer",
7343 "format": "int32"
7344 },
7345 "description": "Collection of unique plant identifiers created within this batch.",
7346 "nullable": true
7347 }
7348 },
7349 "additionalProperties": false,
7350 "description": "Individual created immature plant batch containing batch identifier and associated plant IDs."
7351 },
7352 "CreatedMaturePlant": {
7353 "type": "object",
7354 "properties": {
7355 "batchId": {
7356 "type": "integer",
7357 "format": "int32"
7358 },
7359 "plantId": {
7360 "type": "integer",
7361 "format": "int32"
7362 },
7363 "plantSerialNumber": {
7364 "type": "string",
7365 "nullable": true
7366 }
7367 },
7368 "additionalProperties": false
7369 },
7370 "Customer": {
7371 "type": "object",
7372 "properties": {
7373 "customerId": {
7374 "type": "integer",
7375 "description": "Unique internal identifier for the customer record.",
7376 "format": "int32"
7377 },
7378 "uniqueId": {
7379 "type": "string",
7380 "description": "String representation of UniqueId for external API consumption.",
7381 "nullable": true,
7382 "readOnly": true
7383 },
7384 "name": {
7385 "type": "string",
7386 "description": "Deprecated name field (use FirstName and LastName instead).",
7387 "nullable": true,
7388 "deprecated": true
7389 },
7390 "firstName": {
7391 "type": "string",
7392 "description": "Customer's first name.",
7393 "nullable": true
7394 },
7395 "lastName": {
7396 "type": "string",
7397 "description": "Customer's last name.",
7398 "nullable": true
7399 },
7400 "middleName": {
7401 "type": "string",
7402 "description": "Customer's middle name.",
7403 "nullable": true
7404 },
7405 "nameSuffix": {
7406 "type": "string",
7407 "description": "Name suffix (Jr., Sr., III, etc.).",
7408 "nullable": true
7409 },
7410 "namePrefix": {
7411 "type": "string",
7412 "description": "Name prefix (Mr., Mrs., Dr., etc.).",
7413 "nullable": true
7414 },
7415 "address1": {
7416 "type": "string",
7417 "description": "Primary street address line.",
7418 "nullable": true
7419 },
7420 "address2": {
7421 "type": "string",
7422 "description": "Secondary address line (apartment, suite, etc.).",
7423 "nullable": true
7424 },
7425 "city": {
7426 "type": "string",
7427 "description": "City name.",
7428 "nullable": true
7429 },
7430 "state": {
7431 "type": "string",
7432 "description": "State or province.",
7433 "nullable": true
7434 },
7435 "postalCode": {
7436 "type": "string",
7437 "description": "Postal or ZIP code.",
7438 "nullable": true
7439 },
7440 "phone": {
7441 "type": "string",
7442 "description": "Primary phone number.",
7443 "nullable": true
7444 },
7445 "cellPhone": {
7446 "type": "string",
7447 "description": "Cell phone number.",
7448 "nullable": true
7449 },
7450 "emailAddress": {
7451 "type": "string",
7452 "description": "Email address.",
7453 "nullable": true
7454 },
7455 "status": {
7456 "type": "string",
7457 "description": "Customer account status.",
7458 "nullable": true
7459 },
7460 "mmjidNumber": {
7461 "type": "string",
7462 "description": "Medical marijuana identification number.",
7463 "nullable": true
7464 },
7465 "mmjidExpirationDate": {
7466 "type": "string",
7467 "description": "Medical marijuana ID expiration date.",
7468 "format": "date-time",
7469 "nullable": true
7470 },
7471 "lastModifiedDateUTC": {
7472 "type": "string",
7473 "description": "Last modification timestamp in UTC format.",
7474 "nullable": true
7475 },
7476 "creationDate": {
7477 "type": "string",
7478 "description": "Customer record creation date.",
7479 "format": "date-time",
7480 "nullable": true
7481 },
7482 "customerType": {
7483 "type": "string",
7484 "description": "Customer type classification.",
7485 "nullable": true
7486 },
7487 "gender": {
7488 "type": "string",
7489 "description": "Customer's gender.",
7490 "nullable": true
7491 },
7492 "driversLicenseHash": {
7493 "type": "string",
7494 "description": "SHA2_256 hash of the Driver License ID",
7495 "nullable": true
7496 },
7497 "dateOfBirth": {
7498 "type": "string",
7499 "description": "Customer's date of birth.",
7500 "format": "date-time",
7501 "nullable": true
7502 },
7503 "externalCustomerId": {
7504 "type": "string",
7505 "description": "External system customer identifier.",
7506 "nullable": true
7507 },
7508 "createdByIntegrator": {
7509 "type": "string",
7510 "description": "Name of the integration system that created this customer.",
7511 "nullable": true
7512 },
7513 "isAnonymous": {
7514 "type": "boolean",
7515 "description": "Indicates if this is an anonymous customer record."
7516 },
7517 "referralSource": {
7518 "type": "string",
7519 "description": "How the customer heard about the dispensary.",
7520 "nullable": true
7521 },
7522 "otherReferralSource": {
7523 "type": "string",
7524 "description": "Additional details about referral source when \"Other\" is selected.",
7525 "nullable": true
7526 },
7527 "springBigMemberId": {
7528 "type": "integer",
7529 "description": "SpringBig loyalty system member identifier.",
7530 "format": "int32"
7531 },
7532 "customIdentifier": {
7533 "type": "string",
7534 "description": "Custom identifier for external system integration.",
7535 "nullable": true
7536 },
7537 "discountGroups": {
7538 "type": "array",
7539 "items": {
7540 "type": "string"
7541 },
7542 "description": "Collection of active discount groups for this customer.",
7543 "nullable": true,
7544 "readOnly": true
7545 },
7546 "createdAtLocation": {
7547 "type": "string",
7548 "description": "Location where this customer record was created.",
7549 "nullable": true
7550 },
7551 "notes": {
7552 "type": "string",
7553 "description": "Additional notes about the customer.",
7554 "nullable": true
7555 },
7556 "isLoyaltyMember": {
7557 "type": "boolean",
7558 "description": "Indicates if customer is enrolled in loyalty program.",
7559 "nullable": true
7560 },
7561 "primaryQualifyingCondition": {
7562 "type": "string",
7563 "description": "Primary medical condition for medical marijuana patients.",
7564 "nullable": true
7565 },
7566 "secondaryQualifyingConditions": {
7567 "type": "array",
7568 "items": {
7569 "type": "string"
7570 },
7571 "description": "Additional medical conditions for medical marijuana patients.",
7572 "nullable": true
7573 },
7574 "mergedIntoCustomerId": {
7575 "type": "integer",
7576 "description": "Customer ID this record was merged into (if applicable).",
7577 "format": "int32",
7578 "nullable": true
7579 },
7580 "optedIntoMarketing": {
7581 "type": "boolean",
7582 "description": "Customer's marketing communication preference.",
7583 "nullable": true
7584 },
7585 "loyaltyTier": {
7586 "type": "string",
7587 "description": "Customer's current loyalty program tier.",
7588 "nullable": true
7589 }
7590 },
7591 "additionalProperties": false,
7592 "description": "Represents a customer profile with personal information, contact details, and cannabis compliance data."
7593 },
7594 "CustomerSearchRequest": {
7595 "type": "object",
7596 "properties": {
7597 "lastName": {
7598 "type": "string",
7599 "description": "Customer's last name for name-based search matching.",
7600 "nullable": true
7601 },
7602 "dateOfBirth": {
7603 "type": "string",
7604 "description": "Customer's date of birth for identity verification and precise matching.",
7605 "format": "date-time",
7606 "nullable": true
7607 },
7608 "phone": {
7609 "type": "string",
7610 "description": "Customer's phone number for contact-based search matching.",
7611 "nullable": true
7612 },
7613 "emailAddress": {
7614 "type": "string",
7615 "description": "Customer's email address for account-based search matching.",
7616 "nullable": true
7617 },
7618 "mmjidNumber": {
7619 "type": "string",
7620 "description": "Medical marijuana identification number for regulatory compliance search.",
7621 "nullable": true
7622 },
7623 "driversLicenseId": {
7624 "type": "string",
7625 "description": "Driver's license identifier for government ID-based search matching.",
7626 "nullable": true
7627 }
7628 },
7629 "additionalProperties": false,
7630 "description": "Search criteria model for customer lookup operations with flexible matching options."
7631 },
7632 "CustomerSearchResult": {
7633 "type": "object",
7634 "properties": {
7635 "matchType": {
7636 "type": "string",
7637 "description": "Indicates how the customer record was matched during the search operation.",
7638 "nullable": true
7639 },
7640 "customerId": {
7641 "type": "integer",
7642 "description": "Unique internal identifier for the customer record.",
7643 "format": "int32"
7644 },
7645 "uniqueId": {
7646 "type": "string",
7647 "description": "String representation of UniqueId for external API consumption.",
7648 "nullable": true,
7649 "readOnly": true
7650 },
7651 "name": {
7652 "type": "string",
7653 "description": "Deprecated name field (use FirstName and LastName instead).",
7654 "nullable": true,
7655 "deprecated": true
7656 },
7657 "firstName": {
7658 "type": "string",
7659 "description": "Customer's first name.",
7660 "nullable": true
7661 },
7662 "lastName": {
7663 "type": "string",
7664 "description": "Customer's last name.",
7665 "nullable": true
7666 },
7667 "middleName": {
7668 "type": "string",
7669 "description": "Customer's middle name.",
7670 "nullable": true
7671 },
7672 "nameSuffix": {
7673 "type": "string",
7674 "description": "Name suffix (Jr., Sr., III, etc.).",
7675 "nullable": true
7676 },
7677 "namePrefix": {
7678 "type": "string",
7679 "description": "Name prefix (Mr., Mrs., Dr., etc.).",
7680 "nullable": true
7681 },
7682 "address1": {
7683 "type": "string",
7684 "description": "Primary street address line.",
7685 "nullable": true
7686 },
7687 "address2": {
7688 "type": "string",
7689 "description": "Secondary address line (apartment, suite, etc.).",
7690 "nullable": true
7691 },
7692 "city": {
7693 "type": "string",
7694 "description": "City name.",
7695 "nullable": true
7696 },
7697 "state": {
7698 "type": "string",
7699 "description": "State or province.",
7700 "nullable": true
7701 },
7702 "postalCode": {
7703 "type": "string",
7704 "description": "Postal or ZIP code.",
7705 "nullable": true
7706 },
7707 "phone": {
7708 "type": "string",
7709 "description": "Primary phone number.",
7710 "nullable": true
7711 },
7712 "cellPhone": {
7713 "type": "string",
7714 "description": "Cell phone number.",
7715 "nullable": true
7716 },
7717 "emailAddress": {
7718 "type": "string",
7719 "description": "Email address.",
7720 "nullable": true
7721 },
7722 "status": {
7723 "type": "string",
7724 "description": "Customer account status.",
7725 "nullable": true
7726 },
7727 "mmjidNumber": {
7728 "type": "string",
7729 "description": "Medical marijuana identification number.",
7730 "nullable": true
7731 },
7732 "mmjidExpirationDate": {
7733 "type": "string",
7734 "description": "Medical marijuana ID expiration date.",
7735 "format": "date-time",
7736 "nullable": true
7737 },
7738 "lastModifiedDateUTC": {
7739 "type": "string",
7740 "description": "Last modification timestamp in UTC format.",
7741 "nullable": true
7742 },
7743 "creationDate": {
7744 "type": "string",
7745 "description": "Customer record creation date.",
7746 "format": "date-time",
7747 "nullable": true
7748 },
7749 "customerType": {
7750 "type": "string",
7751 "description": "Customer type classification.",
7752 "nullable": true
7753 },
7754 "gender": {
7755 "type": "string",
7756 "description": "Customer's gender.",
7757 "nullable": true
7758 },
7759 "driversLicenseHash": {
7760 "type": "string",
7761 "description": "SHA2_256 hash of the Driver License ID",
7762 "nullable": true
7763 },
7764 "dateOfBirth": {
7765 "type": "string",
7766 "description": "Customer's date of birth.",
7767 "format": "date-time",
7768 "nullable": true
7769 },
7770 "externalCustomerId": {
7771 "type": "string",
7772 "description": "External system customer identifier.",
7773 "nullable": true
7774 },
7775 "createdByIntegrator": {
7776 "type": "string",
7777 "description": "Name of the integration system that created this customer.",
7778 "nullable": true
7779 },
7780 "isAnonymous": {
7781 "type": "boolean",
7782 "description": "Indicates if this is an anonymous customer record."
7783 },
7784 "referralSource": {
7785 "type": "string",
7786 "description": "How the customer heard about the dispensary.",
7787 "nullable": true
7788 },
7789 "otherReferralSource": {
7790 "type": "string",
7791 "description": "Additional details about referral source when \"Other\" is selected.",
7792 "nullable": true
7793 },
7794 "springBigMemberId": {
7795 "type": "integer",
7796 "description": "SpringBig loyalty system member identifier.",
7797 "format": "int32"
7798 },
7799 "customIdentifier": {
7800 "type": "string",
7801 "description": "Custom identifier for external system integration.",
7802 "nullable": true
7803 },
7804 "discountGroups": {
7805 "type": "array",
7806 "items": {
7807 "type": "string"
7808 },
7809 "description": "Collection of active discount groups for this customer.",
7810 "nullable": true,
7811 "readOnly": true
7812 },
7813 "createdAtLocation": {
7814 "type": "string",
7815 "description": "Location where this customer record was created.",
7816 "nullable": true
7817 },
7818 "notes": {
7819 "type": "string",
7820 "description": "Additional notes about the customer.",
7821 "nullable": true
7822 },
7823 "isLoyaltyMember": {
7824 "type": "boolean",
7825 "description": "Indicates if customer is enrolled in loyalty program.",
7826 "nullable": true
7827 },
7828 "primaryQualifyingCondition": {
7829 "type": "string",
7830 "description": "Primary medical condition for medical marijuana patients.",
7831 "nullable": true
7832 },
7833 "secondaryQualifyingConditions": {
7834 "type": "array",
7835 "items": {
7836 "type": "string"
7837 },
7838 "description": "Additional medical conditions for medical marijuana patients.",
7839 "nullable": true
7840 },
7841 "mergedIntoCustomerId": {
7842 "type": "integer",
7843 "description": "Customer ID this record was merged into (if applicable).",
7844 "format": "int32",
7845 "nullable": true
7846 },
7847 "optedIntoMarketing": {
7848 "type": "boolean",
7849 "description": "Customer's marketing communication preference.",
7850 "nullable": true
7851 },
7852 "loyaltyTier": {
7853 "type": "string",
7854 "description": "Customer's current loyalty program tier.",
7855 "nullable": true
7856 }
7857 },
7858 "additionalProperties": false,
7859 "description": "Extended customer model that includes search match type information for customer lookup operations."
7860 },
7861 "CustomerType": {
7862 "type": "object",
7863 "properties": {
7864 "id": {
7865 "type": "integer",
7866 "description": "Unique identifier for the customer type.",
7867 "format": "int32"
7868 },
7869 "name": {
7870 "type": "string",
7871 "description": "Display name of the customer type.",
7872 "nullable": true
7873 },
7874 "isMedical": {
7875 "type": "boolean",
7876 "description": "Indicates whether this customer type is for medical marijuana patients."
7877 },
7878 "isRetail": {
7879 "type": "boolean",
7880 "description": "Indicates whether this customer type is for retail (adult-use) customers."
7881 }
7882 },
7883 "additionalProperties": false,
7884 "description": "Represents a customer type classification for cannabis dispensary operations and compliance."
7885 },
7886 "DateTimeNullableOptional": {
7887 "type": "string",
7888 "additionalProperties": false
7889 },
7890 "DecimalNullableOptional": {
7891 "type": "number",
7892 "additionalProperties": false
7893 },
7894 "DeleteImageRequest": {
7895 "required": ["imageId", "productId"],
7896 "type": "object",
7897 "properties": {
7898 "productId": {
7899 "type": "integer",
7900 "description": "The unique identifier of the product that owns the image to be deleted.",
7901 "format": "int32"
7902 },
7903 "imageId": {
7904 "type": "integer",
7905 "description": "The unique identifier of the specific image to be deleted from the product.",
7906 "format": "int32"
7907 }
7908 },
7909 "additionalProperties": false,
7910 "description": "Request model for deleting a product image through the product image management API."
7911 },
7912 "DeliveryOrderStatus": {
7913 "type": "object",
7914 "properties": {
7915 "preOrderId": {
7916 "type": "integer",
7917 "format": "int32",
7918 "nullable": true
7919 },
7920 "transactionId": {
7921 "type": "integer",
7922 "format": "int32"
7923 },
7924 "status": {
7925 "type": "string",
7926 "nullable": true
7927 },
7928 "orderDate": {
7929 "type": "string",
7930 "format": "date-time"
7931 },
7932 "customerFirstName": {
7933 "type": "string",
7934 "nullable": true
7935 },
7936 "customerLastName": {
7937 "type": "string",
7938 "nullable": true
7939 },
7940 "customerId": {
7941 "type": "integer",
7942 "format": "int32"
7943 },
7944 "orderType": {
7945 "type": "string",
7946 "nullable": true
7947 },
7948 "orderSource": {
7949 "type": "string",
7950 "nullable": true
7951 },
7952 "rejectedReason": {
7953 "type": "string",
7954 "nullable": true
7955 },
7956 "total": {
7957 "type": "number",
7958 "format": "double",
7959 "nullable": true
7960 },
7961 "subTotal": {
7962 "type": "number",
7963 "format": "double",
7964 "nullable": true
7965 },
7966 "totalTax": {
7967 "type": "number",
7968 "format": "double",
7969 "nullable": true
7970 },
7971 "streetAddress1": {
7972 "type": "string",
7973 "nullable": true
7974 },
7975 "streetAddress2": {
7976 "type": "string",
7977 "nullable": true
7978 },
7979 "city": {
7980 "type": "string",
7981 "nullable": true
7982 },
7983 "deliveryState": {
7984 "type": "string",
7985 "nullable": true
7986 },
7987 "postalCode": {
7988 "type": "string",
7989 "nullable": true
7990 },
7991 "customerPhone": {
7992 "type": "string",
7993 "nullable": true
7994 },
7995 "customerExpectedTimeStart": {
7996 "type": "string",
7997 "format": "date-time"
7998 },
7999 "customerExpectedTimeEnd": {
8000 "type": "string",
8001 "format": "date-time"
8002 },
8003 "dispatchDepartTime": {
8004 "type": "string",
8005 "format": "date-time"
8006 },
8007 "dispatchArriveTime": {
8008 "type": "string",
8009 "format": "date-time"
8010 },
8011 "items": {
8012 "type": "array",
8013 "items": {
8014 "$ref": "#/components/schemas/AllocatedDeliveryItem"
8015 },
8016 "nullable": true
8017 },
8018 "payments": {
8019 "type": "array",
8020 "items": {
8021 "$ref": "#/components/schemas/DeliveryPayment"
8022 },
8023 "nullable": true
8024 },
8025 "deliveryStatus": {
8026 "type": "string",
8027 "nullable": true
8028 }
8029 },
8030 "additionalProperties": false
8031 },
8032 "DeliveryPayment": {
8033 "type": "object",
8034 "properties": {
8035 "name": {
8036 "type": "string",
8037 "nullable": true
8038 },
8039 "amount": {
8040 "type": "number",
8041 "format": "double"
8042 }
8043 },
8044 "additionalProperties": false
8045 },
8046 "DeliveryScheduleType": {
8047 "enum": [1, 2],
8048 "type": "integer",
8049 "format": "int32"
8050 },
8051 "Discount": {
8052 "type": "object",
8053 "properties": {
8054 "name": {
8055 "type": "string",
8056 "nullable": true
8057 },
8058 "amount": {
8059 "type": "number",
8060 "format": "double"
8061 },
8062 "discountId": {
8063 "type": "integer",
8064 "format": "int32",
8065 "nullable": true
8066 }
8067 },
8068 "additionalProperties": false
8069 },
8070 "DiscountApiResponse": {
8071 "type": "object",
8072 "properties": {
8073 "id": {
8074 "type": "integer",
8075 "format": "int32",
8076 "nullable": true
8077 },
8078 "externalId": {
8079 "type": "string",
8080 "nullable": true
8081 },
8082 "validDateFrom": {
8083 "type": "string",
8084 "format": "date-time",
8085 "nullable": true
8086 },
8087 "validDateTo": {
8088 "type": "string",
8089 "format": "date-time",
8090 "nullable": true
8091 },
8092 "maxRedemptions": {
8093 "type": "integer",
8094 "format": "int32",
8095 "nullable": true
8096 },
8097 "redemptionLimit": {
8098 "type": "integer",
8099 "format": "int32",
8100 "nullable": true
8101 },
8102 "firstTimeCustomerOnly": {
8103 "$ref": "#/components/schemas/DiscountFirstTimeCustomer"
8104 },
8105 "discountDescription": {
8106 "type": "string",
8107 "nullable": true
8108 },
8109 "discountCode": {
8110 "type": "string",
8111 "nullable": true
8112 },
8113 "applicationMethodId": {
8114 "$ref": "#/components/schemas/DiscountApplicationMethod"
8115 },
8116 "applicationMethod": {
8117 "type": "string",
8118 "nullable": true,
8119 "readOnly": true
8120 },
8121 "canStackAutomatically": {
8122 "type": "boolean"
8123 },
8124 "onlineName": {
8125 "type": "string",
8126 "nullable": true
8127 },
8128 "locationRestrictions": {
8129 "type": "array",
8130 "items": {
8131 "type": "integer",
8132 "format": "int32"
8133 },
8134 "nullable": true
8135 },
8136 "restrictToGroupIds": {
8137 "type": "array",
8138 "items": {
8139 "type": "integer",
8140 "format": "int32"
8141 },
8142 "nullable": true
8143 },
8144 "startTime": {
8145 "type": "object",
8146 "nullable": true
8147 },
8148 "endTime": {
8149 "type": "object",
8150 "nullable": true
8151 },
8152 "monday": {
8153 "type": "boolean",
8154 "nullable": true
8155 },
8156 "tuesday": {
8157 "type": "boolean",
8158 "nullable": true
8159 },
8160 "wednesday": {
8161 "type": "boolean",
8162 "nullable": true
8163 },
8164 "thursday": {
8165 "type": "boolean",
8166 "nullable": true
8167 },
8168 "friday": {
8169 "type": "boolean",
8170 "nullable": true
8171 },
8172 "saturday": {
8173 "type": "boolean",
8174 "nullable": true
8175 },
8176 "sunday": {
8177 "type": "boolean",
8178 "nullable": true
8179 },
8180 "isActive": {
8181 "type": "boolean"
8182 },
8183 "isBundledDiscount": {
8184 "type": "boolean"
8185 },
8186 "constraints": {
8187 "type": "array",
8188 "items": {
8189 "$ref": "#/components/schemas/DiscountConstraintAPIResponse"
8190 },
8191 "nullable": true
8192 },
8193 "reward": {
8194 "$ref": "#/components/schemas/DiscountRewardAPIResponse"
8195 },
8196 "menuDisplay": {
8197 "$ref": "#/components/schemas/DiscountMenuDisplayAPIResponse"
8198 },
8199 "paymentRestrictions": {
8200 "$ref": "#/components/schemas/DiscountPaymentRestrictionAPIResponse"
8201 }
8202 },
8203 "additionalProperties": false
8204 },
8205 "DiscountApplicationMethod": {
8206 "enum": [1, 2, 3, 4, 5, 6],
8207 "type": "integer",
8208 "format": "int32"
8209 },
8210 "DiscountConstraintAPIResponse": {
8211 "type": "object",
8212 "properties": {
8213 "discountConstraintId": {
8214 "type": "integer",
8215 "format": "int32",
8216 "nullable": true
8217 },
8218 "discountId": {
8219 "type": "integer",
8220 "format": "int32"
8221 },
8222 "thresholdMin": {
8223 "type": "number",
8224 "format": "double",
8225 "nullable": true
8226 },
8227 "includeNonCannabis": {
8228 "type": "boolean"
8229 },
8230 "thresholdTypeId": {
8231 "$ref": "#/components/schemas/DiscountThresholdType"
8232 },
8233 "thresholdType": {
8234 "type": "string",
8235 "nullable": true,
8236 "readOnly": true
8237 },
8238 "hasThreshold": {
8239 "type": "boolean",
8240 "readOnly": true
8241 },
8242 "discountItemGroupTypeId": {
8243 "$ref": "#/components/schemas/DiscountItemGroupType"
8244 },
8245 "itemGroupType": {
8246 "type": "string",
8247 "nullable": true,
8248 "readOnly": true
8249 },
8250 "restrictions": {
8251 "type": "object",
8252 "additionalProperties": {
8253 "$ref": "#/components/schemas/IRestrictionAPIResponse"
8254 },
8255 "nullable": true
8256 }
8257 },
8258 "additionalProperties": false
8259 },
8260 "DiscountFirstTimeCustomer": {
8261 "enum": [0, 1, 2],
8262 "type": "integer",
8263 "format": "int32"
8264 },
8265 "DiscountGroup": {
8266 "type": "object",
8267 "properties": {
8268 "discountGroupId": {
8269 "type": "integer",
8270 "description": "Unique identifier for the discount group.",
8271 "format": "int32"
8272 },
8273 "discountGroupName": {
8274 "type": "string",
8275 "description": "Display name of the discount group for management and organization.",
8276 "nullable": true
8277 }
8278 },
8279 "additionalProperties": false,
8280 "description": "Discount group model for organizing and categorizing related discounts."
8281 },
8282 "DiscountItemGroupType": {
8283 "enum": [5, 6],
8284 "type": "integer",
8285 "format": "int32"
8286 },
8287 "DiscountMenuDisplayAPIResponse": {
8288 "type": "object",
8289 "properties": {
8290 "menuDisplayDescription": {
8291 "type": "string",
8292 "nullable": true
8293 },
8294 "menuDisplayImageUrl": {
8295 "type": "string",
8296 "nullable": true
8297 },
8298 "menuDisplayName": {
8299 "type": "string",
8300 "nullable": true
8301 },
8302 "menuDisplayRank": {
8303 "type": "integer",
8304 "format": "int32"
8305 }
8306 },
8307 "additionalProperties": false
8308 },
8309 "DiscountPaymentRestrictionAPIResponse": {
8310 "type": "object",
8311 "properties": {
8312 "payByBankSignupIncentive": {
8313 "type": "boolean"
8314 }
8315 },
8316 "additionalProperties": false
8317 },
8318 "DiscountRestriction": {
8319 "type": "object",
8320 "properties": {
8321 "ids": {
8322 "type": "array",
8323 "items": {
8324 "type": "integer",
8325 "format": "int32"
8326 },
8327 "description": "Collection of entity identifiers subject to the restriction rule.",
8328 "nullable": true
8329 },
8330 "isExclusion": {
8331 "type": "boolean",
8332 "description": "Indicates if this is an exclusion rule (true) or inclusion rule (false)."
8333 }
8334 },
8335 "additionalProperties": false,
8336 "description": "Discount restriction model defining entity inclusion or exclusion rules for discount application."
8337 },
8338 "DiscountRewardAPIResponse": {
8339 "type": "object",
8340 "properties": {
8341 "discountRewardId": {
8342 "type": "integer",
8343 "format": "int32",
8344 "nullable": true
8345 },
8346 "discountId": {
8347 "type": "integer",
8348 "format": "int32"
8349 },
8350 "calculationMethodId": {
8351 "$ref": "#/components/schemas/CalculationMethod"
8352 },
8353 "calculationMethod": {
8354 "type": "string",
8355 "nullable": true,
8356 "readOnly": true
8357 },
8358 "discountValue": {
8359 "type": "number",
8360 "format": "double"
8361 },
8362 "includeNonCannabis": {
8363 "type": "boolean"
8364 },
8365 "highestOrLowest": {
8366 "type": "string",
8367 "nullable": true
8368 },
8369 "thresholdTypeId": {
8370 "$ref": "#/components/schemas/DiscountThresholdType"
8371 },
8372 "thresholdType": {
8373 "type": "string",
8374 "nullable": true,
8375 "readOnly": true
8376 },
8377 "hasThreshold": {
8378 "type": "boolean",
8379 "readOnly": true
8380 },
8381 "itemGroupTypeId": {
8382 "$ref": "#/components/schemas/DiscountItemGroupType"
8383 },
8384 "itemGroupType": {
8385 "type": "string",
8386 "nullable": true,
8387 "readOnly": true
8388 },
8389 "thresholdMin": {
8390 "type": "number",
8391 "format": "double",
8392 "nullable": true
8393 },
8394 "thresholdMax": {
8395 "type": "number",
8396 "format": "double",
8397 "nullable": true
8398 },
8399 "applyToOnlyOneItem": {
8400 "type": "boolean"
8401 },
8402 "restrictions": {
8403 "type": "object",
8404 "additionalProperties": {
8405 "$ref": "#/components/schemas/IRestrictionAPIResponse"
8406 },
8407 "nullable": true
8408 }
8409 },
8410 "additionalProperties": false
8411 },
8412 "DiscountThresholdType": {
8413 "enum": [1, 2, 3],
8414 "type": "integer",
8415 "format": "int32"
8416 },
8417 "DriverDetail": {
8418 "type": "object",
8419 "properties": {
8420 "driverId": {
8421 "type": "integer",
8422 "format": "int32"
8423 },
8424 "name": {
8425 "type": "string",
8426 "nullable": true
8427 },
8428 "stateId": {
8429 "type": "string",
8430 "nullable": true
8431 },
8432 "driversLicense": {
8433 "type": "string",
8434 "nullable": true
8435 }
8436 },
8437 "additionalProperties": false
8438 },
8439 "EcomCustomerEdit": {
8440 "required": [
8441 "address1",
8442 "city",
8443 "customerType",
8444 "firstName",
8445 "postalCode",
8446 "state",
8447 "status"
8448 ],
8449 "type": "object",
8450 "properties": {
8451 "customerId": {
8452 "type": "integer",
8453 "description": "When specified, it updates the record, if the ID exists\nnull / unspecified will create a new customer",
8454 "format": "int32",
8455 "nullable": true
8456 },
8457 "uniqueId": {
8458 "type": "string",
8459 "description": "Unique identifier for external system integration.",
8460 "nullable": true
8461 },
8462 "name": {
8463 "type": "string",
8464 "description": "Deprecated full name field (use FirstName and LastName instead).",
8465 "nullable": true,
8466 "deprecated": true
8467 },
8468 "firstName": {
8469 "minLength": 1,
8470 "type": "string",
8471 "description": "Customer's first name (required)."
8472 },
8473 "lastName": {
8474 "type": "string",
8475 "description": "Customer's last name.",
8476 "nullable": true
8477 },
8478 "middleName": {
8479 "type": "string",
8480 "description": "Customer's middle name.",
8481 "nullable": true
8482 },
8483 "nameSuffix": {
8484 "type": "string",
8485 "description": "Name suffix (Jr., Sr., III, etc.).",
8486 "nullable": true
8487 },
8488 "namePrefix": {
8489 "type": "string",
8490 "description": "Name prefix (Mr., Mrs., Dr., etc.).",
8491 "nullable": true
8492 },
8493 "address1": {
8494 "minLength": 1,
8495 "type": "string",
8496 "description": "Primary street address line (required)."
8497 },
8498 "address2": {
8499 "type": "string",
8500 "description": "Secondary address line (apartment, suite, etc.).",
8501 "nullable": true
8502 },
8503 "city": {
8504 "minLength": 1,
8505 "type": "string",
8506 "description": "City name (required)."
8507 },
8508 "state": {
8509 "minLength": 1,
8510 "type": "string",
8511 "description": "State or province (required)."
8512 },
8513 "postalCode": {
8514 "minLength": 1,
8515 "type": "string",
8516 "description": "Postal or ZIP code (required)."
8517 },
8518 "phone": {
8519 "type": "string",
8520 "description": "Phone number.",
8521 "nullable": true
8522 },
8523 "emailAddress": {
8524 "type": "string",
8525 "description": "Email address.",
8526 "nullable": true
8527 },
8528 "status": {
8529 "minLength": 1,
8530 "type": "string",
8531 "description": "Active; Cancelled; Hold; Banned"
8532 },
8533 "mmjidNumber": {
8534 "type": "string",
8535 "description": "Medical marijuana identification number.",
8536 "nullable": true
8537 },
8538 "driversLicenseID": {
8539 "type": "string",
8540 "description": "Driver's license ID.",
8541 "nullable": true
8542 },
8543 "driversLicenseExpiration": {
8544 "type": "string",
8545 "description": "Driver's license expiration date.",
8546 "format": "date-time",
8547 "nullable": true
8548 },
8549 "mmjidExpirationDate": {
8550 "type": "string",
8551 "description": "Medical marijuana ID expiration date.",
8552 "format": "date-time",
8553 "nullable": true
8554 },
8555 "customerType": {
8556 "minLength": 1,
8557 "type": "string",
8558 "description": "Customer type classification (required). Use CustomerTypes endpoint to retrieve active customer types for a given location."
8559 },
8560 "dateOfBirth": {
8561 "type": "string",
8562 "description": "Customer's date of birth.",
8563 "format": "date-time",
8564 "nullable": true
8565 },
8566 "externalCustomerId": {
8567 "type": "string",
8568 "description": "External system customer identifier.",
8569 "nullable": true
8570 },
8571 "gender": {
8572 "type": "string",
8573 "description": "Customer's gender.",
8574 "nullable": true
8575 },
8576 "idempotencyKey": {
8577 "type": "string",
8578 "description": "Optional idempotency key for duplicate prevention. When provided with a ConsumerKey header, ensures the same customer creation request is not processed multiple times.",
8579 "nullable": true
8580 },
8581 "referralSource": {
8582 "type": "string",
8583 "description": "How the customer heard about the dispensary. Use ReferralSources endpoint to retrieve values.",
8584 "nullable": true
8585 },
8586 "customIdentifier": {
8587 "type": "string",
8588 "description": "Custom identifier for external system integration.",
8589 "nullable": true
8590 },
8591 "notes": {
8592 "type": "string",
8593 "description": "Additional notes about the customer.",
8594 "nullable": true
8595 },
8596 "isLoyaltyMember": {
8597 "type": "boolean",
8598 "description": "Indicates if customer is enrolled in loyalty program.",
8599 "nullable": true
8600 }
8601 },
8602 "additionalProperties": false,
8603 "description": "E-commerce customer data model for creating or updating customer profiles via API integration."
8604 },
8605 "Employee": {
8606 "type": "object",
8607 "properties": {
8608 "userId": {
8609 "type": "integer",
8610 "format": "int32"
8611 },
8612 "loginId": {
8613 "type": "string",
8614 "nullable": true
8615 },
8616 "fullName": {
8617 "type": "string",
8618 "nullable": true
8619 },
8620 "defaultLocation": {
8621 "type": "string",
8622 "nullable": true
8623 },
8624 "status": {
8625 "type": "string",
8626 "nullable": true
8627 },
8628 "stateId": {
8629 "type": "string",
8630 "nullable": true
8631 },
8632 "mmjExpiration": {
8633 "type": "string",
8634 "format": "date-time"
8635 },
8636 "permissionsLocation": {
8637 "type": "string",
8638 "nullable": true
8639 },
8640 "groups": {
8641 "type": "string",
8642 "nullable": true
8643 }
8644 },
8645 "additionalProperties": false
8646 },
8647 "FeeDonation": {
8648 "type": "object",
8649 "properties": {
8650 "name": {
8651 "type": "string",
8652 "description": "Name of the fee or donation for identification and reporting purposes.",
8653 "nullable": true
8654 },
8655 "cashValue": {
8656 "type": "number",
8657 "description": "Cash value of the fee or donation for financial accounting.",
8658 "format": "double"
8659 },
8660 "isRevenue": {
8661 "type": "boolean",
8662 "description": "Flag indicating whether the fee or donation counts as revenue for accounting purposes."
8663 }
8664 },
8665 "additionalProperties": false,
8666 "description": "Fee and donation tracking model for cannabis dispensary compliance and accounting."
8667 },
8668 "FeeDonationInfo": {
8669 "type": "object",
8670 "properties": {
8671 "feeDonationId": {
8672 "type": "integer",
8673 "description": "Unique identifier for the specific fee or donation program.",
8674 "format": "int32"
8675 },
8676 "description": {
8677 "type": "string",
8678 "description": "Description of the fee or donation for customer receipts and reporting.",
8679 "nullable": true
8680 },
8681 "amount": {
8682 "type": "number",
8683 "description": "Amount of the fee or donation (in USD).",
8684 "format": "double"
8685 },
8686 "isRevenue": {
8687 "type": "boolean",
8688 "description": "Indicates whether this fee counts as business revenue for accounting purposes."
8689 }
8690 },
8691 "additionalProperties": false,
8692 "description": "Fee and donation information associated with cannabis retail transactions."
8693 },
8694 "FinishOrUnfinishBatchDetails": {
8695 "type": "object",
8696 "properties": {
8697 "batchId": {
8698 "type": "integer",
8699 "format": "int32"
8700 },
8701 "harvestCompletedOn": {
8702 "type": "string",
8703 "format": "date-time",
8704 "nullable": true
8705 }
8706 },
8707 "additionalProperties": false
8708 },
8709 "GuestListEntry": {
8710 "type": "object",
8711 "properties": {
8712 "name": {
8713 "type": "string",
8714 "nullable": true
8715 },
8716 "checkinDateUTC": {
8717 "type": "string",
8718 "format": "date-time"
8719 },
8720 "status": {
8721 "type": "string",
8722 "nullable": true
8723 },
8724 "customerId": {
8725 "type": "integer",
8726 "format": "int32"
8727 },
8728 "transactionId": {
8729 "type": "integer",
8730 "format": "int32"
8731 },
8732 "transactionReferenceNumber": {
8733 "type": "string",
8734 "nullable": true
8735 },
8736 "terminalName": {
8737 "type": "string",
8738 "nullable": true
8739 },
8740 "customerType": {
8741 "type": "string",
8742 "nullable": true
8743 },
8744 "phone": {
8745 "type": "string",
8746 "nullable": true
8747 },
8748 "cellPhone": {
8749 "type": "string",
8750 "nullable": true
8751 },
8752 "preOrderSource": {
8753 "type": "string",
8754 "nullable": true
8755 }
8756 },
8757 "additionalProperties": false
8758 },
8759 "Harvest": {
8760 "type": "object",
8761 "properties": {
8762 "harvestId": {
8763 "type": "integer",
8764 "format": "int32"
8765 },
8766 "harvestName": {
8767 "type": "string",
8768 "nullable": true
8769 },
8770 "harvestDate": {
8771 "type": "string",
8772 "format": "date-time"
8773 },
8774 "harvestRoom": {
8775 "type": "string",
8776 "nullable": true
8777 },
8778 "plantCount": {
8779 "type": "integer",
8780 "format": "int32"
8781 },
8782 "plantWeight": {
8783 "type": "number",
8784 "format": "double",
8785 "nullable": true
8786 },
8787 "wetWeight": {
8788 "type": "number",
8789 "format": "double",
8790 "nullable": true
8791 },
8792 "wetWaste": {
8793 "type": "number",
8794 "format": "double",
8795 "nullable": true
8796 },
8797 "dryBudWeight": {
8798 "type": "number",
8799 "format": "double",
8800 "nullable": true
8801 },
8802 "dryShakeWeight": {
8803 "type": "number",
8804 "format": "double",
8805 "nullable": true
8806 },
8807 "dryWaste": {
8808 "type": "number",
8809 "format": "double",
8810 "nullable": true
8811 },
8812 "packageCount": {
8813 "type": "integer",
8814 "format": "int32"
8815 },
8816 "packagedWeight": {
8817 "type": "number",
8818 "format": "double",
8819 "nullable": true
8820 },
8821 "lastModifiedDateUTC": {
8822 "type": "string",
8823 "format": "date-time"
8824 },
8825 "strainName": {
8826 "type": "string",
8827 "nullable": true
8828 }
8829 },
8830 "additionalProperties": false
8831 },
8832 "HarvestPlantRequest": {
8833 "type": "object",
8834 "properties": {
8835 "plants": {
8836 "type": "array",
8837 "items": {
8838 "$ref": "#/components/schemas/HarvestedPlant"
8839 },
8840 "description": "Collection of plants to be harvested with optional weight measurements",
8841 "nullable": true
8842 },
8843 "harvestId": {
8844 "type": "integer",
8845 "description": "Target harvest record ID for associating harvested plants",
8846 "format": "int32"
8847 },
8848 "harvestedOn": {
8849 "type": "string",
8850 "description": "Date and time when harvest occurred (optional, defaults to current UTC time if not specified)",
8851 "format": "date-time",
8852 "nullable": true
8853 }
8854 },
8855 "additionalProperties": false,
8856 "description": "Request model for moving cannabis plants from cultivation to harvest status with optional weight tracking.\n\n**Request Behavior:**\n- Moves specified plants from cultivation status to harvesting status\n- Supports bulk processing of multiple plants in single operation\n- Optional weight tracking for harvest yield management\n- Integrates with external cultivation systems when configured\n\n**Validation:**\n- All plant IDs must exist and be accessible to the authenticated location\n- Plants must be in valid status for harvesting (typically Active status)\n- Harvest ID must correspond to existing harvest record"
8857 },
8858 "HarvestWasteDetail": {
8859 "type": "object",
8860 "properties": {
8861 "harvestId": {
8862 "type": "integer",
8863 "description": "Identifier for the harvest batch generating this waste.",
8864 "format": "int32"
8865 },
8866 "wasteType": {
8867 "type": "string",
8868 "description": "Type or category of waste material from the harvest.",
8869 "nullable": true
8870 },
8871 "wasteAmount": {
8872 "type": "number",
8873 "description": "Quantity of waste material generated from the harvest.",
8874 "format": "double"
8875 },
8876 "unitId": {
8877 "type": "integer",
8878 "description": "Unit of measurement identifier for the waste amount.",
8879 "format": "int32"
8880 }
8881 },
8882 "additionalProperties": false,
8883 "description": "Harvest waste detail model for tracking waste generated from specific harvest operations."
8884 },
8885 "HarvestWasteDetailWaste": {
8886 "type": "object",
8887 "properties": {
8888 "wasteId": {
8889 "type": "integer",
8890 "description": "Unique identifier for the waste record (null for new waste creation).",
8891 "format": "int32",
8892 "nullable": true
8893 },
8894 "referenceNo": {
8895 "type": "string",
8896 "description": "Reference number for waste tracking and documentation.",
8897 "nullable": true
8898 },
8899 "comments": {
8900 "type": "string",
8901 "description": "Additional comments or notes about the waste disposal.",
8902 "nullable": true
8903 },
8904 "wasteDate": {
8905 "type": "string",
8906 "description": "Date when the waste disposal occurred.",
8907 "format": "date-time",
8908 "nullable": true
8909 },
8910 "wasteDetail": {
8911 "type": "array",
8912 "items": {
8913 "$ref": "#/components/schemas/HarvestWasteDetail"
8914 },
8915 "description": "Collection of waste detail records containing specific item information.",
8916 "nullable": true
8917 },
8918 "lspId": {
8919 "type": "integer",
8920 "description": "Licensed Service Provider identifier (internal use only).",
8921 "format": "int32",
8922 "nullable": true
8923 },
8924 "locId": {
8925 "type": "integer",
8926 "description": "Location identifier (internal use only).",
8927 "format": "int32",
8928 "nullable": true
8929 },
8930 "roomRequired": {
8931 "type": "boolean",
8932 "description": "Indicates if room identification is required for this waste type (internal use only).",
8933 "nullable": true
8934 },
8935 "isBioTrack": {
8936 "type": "boolean",
8937 "description": "Indicates if this waste integrates with BioTrack system (internal use only).",
8938 "nullable": true
8939 }
8940 },
8941 "additionalProperties": false,
8942 "description": "Generic waste record model containing waste disposal information and associated detail records for cannabis compliance and waste tracking."
8943 },
8944 "HarvestedPlant": {
8945 "type": "object",
8946 "properties": {
8947 "plantId": {
8948 "type": "integer",
8949 "description": "Unique LeafLogix plant identifier for the plant being harvested",
8950 "format": "int32"
8951 },
8952 "weight": {
8953 "type": "number",
8954 "description": "Optional harvest weight measurement (typically wet weight in grams)",
8955 "format": "double",
8956 "nullable": true
8957 }
8958 },
8959 "additionalProperties": false,
8960 "description": "Individual plant harvest information with optional weight tracking for yield management.\n\n**Weight Tracking:**\n- Weight is optional but recommended for harvest yield analysis\n- Typically represents wet weight at time of harvest\n- Used for compliance reporting and operational analytics"
8961 },
8962 "IRestrictionAPIResponse": {
8963 "type": "object",
8964 "properties": {
8965 "isExclusion": {
8966 "type": "boolean"
8967 }
8968 },
8969 "additionalProperties": false
8970 },
8971 "Int32IEnumerableOptional": {
8972 "type": "array",
8973 "additionalProperties": false
8974 },
8975 "Int32NullableOptional": {
8976 "type": "integer",
8977 "additionalProperties": false
8978 },
8979 "IntegratedPayment": {
8980 "type": "object",
8981 "properties": {
8982 "integrationType": {
8983 "type": "string",
8984 "description": "Type of integrated payment processor used for the transaction (e.g., \"CreditCard\", \"CanPay\", \"ACH\").",
8985 "nullable": true
8986 },
8987 "integratedPaid": {
8988 "type": "number",
8989 "description": "Amount paid through the integrated payment system (in USD).",
8990 "format": "double"
8991 },
8992 "externalPaymentId": {
8993 "type": "string",
8994 "description": "External payment identifier from the integrated payment processor for transaction tracking.",
8995 "nullable": true
8996 }
8997 },
8998 "additionalProperties": false,
8999 "description": "Integrated payment processing information for cannabis transactions processed through connected payment systems."
9000 },
9001 "InventoryDiscrepancy": {
9002 "type": "object",
9003 "properties": {
9004 "inventoryId": {
9005 "type": "integer",
9006 "format": "int32",
9007 "nullable": true
9008 },
9009 "packageId": {
9010 "type": "string",
9011 "nullable": true
9012 },
9013 "quantity": {
9014 "type": "number",
9015 "format": "double"
9016 },
9017 "roomId": {
9018 "type": "integer",
9019 "format": "int32"
9020 },
9021 "unitId": {
9022 "type": "integer",
9023 "format": "int32"
9024 },
9025 "externalQuantity": {
9026 "type": "number",
9027 "format": "double"
9028 },
9029 "externalUnitId": {
9030 "type": "integer",
9031 "format": "int32"
9032 },
9033 "equivalentExternalQuantity": {
9034 "type": "number",
9035 "format": "double",
9036 "nullable": true
9037 },
9038 "difference": {
9039 "type": "number",
9040 "format": "double",
9041 "readOnly": true
9042 },
9043 "productName": {
9044 "type": "string",
9045 "nullable": true
9046 },
9047 "room": {
9048 "type": "string",
9049 "nullable": true
9050 },
9051 "externalRoom": {
9052 "type": "string",
9053 "nullable": true
9054 },
9055 "batchModeQuantity": {
9056 "type": "number",
9057 "format": "double",
9058 "nullable": true
9059 },
9060 "bioTrackCategoryName": {
9061 "type": "string",
9062 "nullable": true
9063 },
9064 "externalBioTrackCategoryName": {
9065 "type": "string",
9066 "nullable": true
9067 },
9068 "sku": {
9069 "type": "string",
9070 "nullable": true
9071 },
9072 "unitErrorMsg": {
9073 "type": "string",
9074 "nullable": true
9075 },
9076 "rooms": {
9077 "type": "array",
9078 "items": {
9079 "type": "string"
9080 },
9081 "nullable": true
9082 },
9083 "serialNumber": {
9084 "type": "string",
9085 "nullable": true
9086 }
9087 },
9088 "additionalProperties": false
9089 },
9090 "InventoryIntegrationReconResponse": {
9091 "type": "object",
9092 "properties": {
9093 "lastUpdated": {
9094 "type": "string",
9095 "format": "date-time",
9096 "nullable": true
9097 },
9098 "discrepancies": {
9099 "type": "array",
9100 "items": {
9101 "$ref": "#/components/schemas/InventoryDiscrepancy"
9102 },
9103 "nullable": true
9104 }
9105 },
9106 "additionalProperties": false
9107 },
9108 "InventoryItem": {
9109 "type": "object",
9110 "properties": {
9111 "unitWeightUnit": {
9112 "type": "string",
9113 "description": "Unit of measurement for unit weight, always \"g\" (grams).",
9114 "nullable": true
9115 },
9116 "inventoryId": {
9117 "type": "integer",
9118 "description": "Unique inventory record identifier for this specific inventory item.",
9119 "format": "int32"
9120 },
9121 "productId": {
9122 "type": "integer",
9123 "description": "Product identifier linking this inventory to the product catalog.",
9124 "format": "int32"
9125 },
9126 "sku": {
9127 "type": "string",
9128 "description": "Stock Keeping Unit (SKU) code for inventory tracking and identification.",
9129 "nullable": true
9130 },
9131 "productName": {
9132 "type": "string",
9133 "description": "Display name of the product for customer-facing applications.",
9134 "nullable": true
9135 },
9136 "description": {
9137 "type": "string",
9138 "description": "Detailed product description including effects, characteristics, and usage information.",
9139 "nullable": true
9140 },
9141 "categoryId": {
9142 "type": "integer",
9143 "description": "Category identifier for product classification (optional).",
9144 "format": "int32",
9145 "nullable": true
9146 },
9147 "category": {
9148 "type": "string",
9149 "description": "Category name for product classification and filtering.",
9150 "nullable": true
9151 },
9152 "imageUrl": {
9153 "type": "string",
9154 "description": "URL path to product image for display purposes.",
9155 "nullable": true
9156 },
9157 "quantityAvailable": {
9158 "type": "number",
9159 "description": "Current available quantity for sale or transfer.",
9160 "format": "double"
9161 },
9162 "quantityUnits": {
9163 "type": "string",
9164 "description": "Unit of measurement for the available quantity (e.g., \"g\", \"mg\", \"ea\").",
9165 "nullable": true
9166 },
9167 "unitWeight": {
9168 "type": "number",
9169 "description": "Weight per unit in grams for dosing and compliance calculations.",
9170 "format": "double"
9171 },
9172 "flowerEquivalent": {
9173 "type": "number",
9174 "description": "Flower equivalent amount in grams for compliance tracking.",
9175 "format": "double"
9176 },
9177 "recFlowerEquivalent": {
9178 "type": "number",
9179 "description": "Recreational flower equivalent amount in grams (optional).",
9180 "format": "double",
9181 "nullable": true
9182 },
9183 "flowerEquivalentUnits": {
9184 "type": "string",
9185 "description": "Unit of measurement for flower equivalent, always \"g\" (grams).",
9186 "nullable": true,
9187 "readOnly": true
9188 },
9189 "batchId": {
9190 "type": "integer",
9191 "description": "Batch identifier for lot tracking and quality control.",
9192 "format": "int32"
9193 },
9194 "batchName": {
9195 "type": "string",
9196 "description": "Human-readable batch name or lot number for tracking.",
9197 "nullable": true
9198 },
9199 "packageId": {
9200 "type": "string",
9201 "description": "Package identifier for compliance tracking and traceability.",
9202 "nullable": true
9203 },
9204 "packageStatus": {
9205 "type": "string",
9206 "description": "Current status of the package (e.g., \"Active\", \"Testing\", \"Quarantine\").",
9207 "nullable": true
9208 },
9209 "unitPrice": {
9210 "type": "number",
9211 "description": "Base unit price for retail sales.",
9212 "format": "double"
9213 },
9214 "medUnitPrice": {
9215 "type": "number",
9216 "description": "Medical program pricing (optional, different from retail).",
9217 "format": "double",
9218 "nullable": true
9219 },
9220 "recUnitPrice": {
9221 "type": "number",
9222 "description": "Recreational program pricing (optional, different from medical).",
9223 "format": "double",
9224 "nullable": true
9225 },
9226 "strainId": {
9227 "type": "integer",
9228 "description": "Strain identifier for cannabis products (optional).",
9229 "format": "int32",
9230 "nullable": true
9231 },
9232 "strain": {
9233 "type": "string",
9234 "description": "Strain name for cannabis products.",
9235 "nullable": true
9236 },
9237 "strainType": {
9238 "type": "string",
9239 "description": "Cannabis strain classification (Hybrid, Indica, Sativa, CBD).",
9240 "nullable": true
9241 },
9242 "size": {
9243 "type": "string",
9244 "description": "Product size designation for packaging and dosing information.",
9245 "nullable": true
9246 },
9247 "labResults": {
9248 "type": "array",
9249 "items": {
9250 "$ref": "#/components/schemas/LabResult"
9251 },
9252 "description": "Collection of laboratory test results for this batch (included when includeLabResults=true).",
9253 "nullable": true
9254 },
9255 "testedDate": {
9256 "type": "string",
9257 "description": "Date when laboratory testing was completed (optional).",
9258 "format": "date-time",
9259 "nullable": true
9260 },
9261 "sampleDate": {
9262 "type": "string",
9263 "description": "Date when sample was collected for laboratory testing (optional).",
9264 "format": "date-time",
9265 "nullable": true
9266 },
9267 "packagedDate": {
9268 "type": "string",
9269 "description": "Date when product was packaged for distribution (optional).",
9270 "format": "date-time",
9271 "nullable": true
9272 },
9273 "manufacturingDate": {
9274 "type": "string",
9275 "description": "Date when product was manufactured or produced (optional).",
9276 "format": "date-time",
9277 "nullable": true
9278 },
9279 "lastModifiedDateUtc": {
9280 "type": "string",
9281 "description": "Last modification timestamp in UTC for data synchronization.",
9282 "format": "date-time",
9283 "nullable": true
9284 },
9285 "labTestStatus": {
9286 "type": "string",
9287 "description": "Current status of laboratory testing (e.g., \"Passed\", \"Failed\", \"Pending\").",
9288 "nullable": true
9289 },
9290 "vendorId": {
9291 "type": "integer",
9292 "description": "Vendor identifier for the supplier of this inventory (optional).",
9293 "format": "int32",
9294 "nullable": true
9295 },
9296 "vendor": {
9297 "type": "string",
9298 "description": "Vendor name for the supplier of this inventory.",
9299 "nullable": true
9300 },
9301 "expirationDate": {
9302 "type": "string",
9303 "description": "Product expiration date for compliance and quality control (optional).",
9304 "format": "date-time",
9305 "nullable": true
9306 },
9307 "roomQuantities": {
9308 "type": "array",
9309 "items": {
9310 "$ref": "#/components/schemas/InventoryRoomQuantity"
9311 },
9312 "description": "Quantity breakdown by storage room/location (included when includeRoomQuantities=true).",
9313 "nullable": true
9314 },
9315 "pricingTierName": {
9316 "type": "string",
9317 "description": "Pricing tier classification for bulk pricing strategies.",
9318 "nullable": true
9319 },
9320 "alternateName": {
9321 "type": "string",
9322 "description": "Alternative product name for display purposes.",
9323 "nullable": true
9324 },
9325 "tags": {
9326 "type": "array",
9327 "items": {
9328 "$ref": "#/components/schemas/InventoryTag"
9329 },
9330 "description": "Collection of compliance tags associated with this inventory package.",
9331 "nullable": true
9332 },
9333 "brandId": {
9334 "type": "integer",
9335 "description": "Brand identifier for branded products (optional).",
9336 "format": "int32",
9337 "nullable": true
9338 },
9339 "brandName": {
9340 "type": "string",
9341 "description": "Brand name for branded products.",
9342 "nullable": true
9343 },
9344 "medicalOnly": {
9345 "type": "boolean",
9346 "description": "Indicates if product is restricted to medical program only."
9347 },
9348 "externalPackageId": {
9349 "type": "string",
9350 "description": "External compliance system ID (METRC or BioTrack) for regulatory tracking.",
9351 "nullable": true
9352 },
9353 "producer": {
9354 "type": "string",
9355 "description": "Producer name for cultivation and manufacturing tracking.",
9356 "nullable": true
9357 },
9358 "producerId": {
9359 "type": "integer",
9360 "description": "Producer identifier for cultivation and manufacturing tracking (optional).",
9361 "format": "int32",
9362 "nullable": true
9363 },
9364 "lineage": {
9365 "type": "array",
9366 "items": {
9367 "$ref": "#/components/schemas/PackageLineage"
9368 },
9369 "description": "Package lineage information for traceability and compliance tracking.",
9370 "nullable": true
9371 },
9372 "potencyIndicator": {
9373 "type": "string",
9374 "description": "Potency classification indicator for dosing guidance.",
9375 "nullable": true
9376 },
9377 "masterCategory": {
9378 "type": "string",
9379 "description": "Master category classification for product grouping.",
9380 "nullable": true
9381 },
9382 "effectivePotencyMg": {
9383 "type": "number",
9384 "description": "Effective potency in milligrams for dosing calculations (optional).",
9385 "format": "double",
9386 "nullable": true
9387 },
9388 "isCannabis": {
9389 "type": "boolean",
9390 "description": "Indicates if product contains cannabis or is cannabis-related."
9391 },
9392 "packageNDC": {
9393 "type": "string",
9394 "description": "National Drug Code for pharmaceutical tracking (optional).",
9395 "nullable": true
9396 },
9397 "labResultUrl": {
9398 "type": "string",
9399 "description": "URL to certificate of analysis or lab testing document.",
9400 "nullable": true
9401 }
9402 },
9403 "additionalProperties": false,
9404 "description": "Inventory item model representing current stock and product details for available inventory."
9405 },
9406 "InventoryRoomQuantity": {
9407 "type": "object",
9408 "properties": {
9409 "roomId": {
9410 "type": "integer",
9411 "description": "Room identifier for the storage location.",
9412 "format": "int32"
9413 },
9414 "room": {
9415 "type": "string",
9416 "description": "Room name or description for the storage location.",
9417 "nullable": true
9418 },
9419 "quantityAvailable": {
9420 "type": "number",
9421 "description": "Quantity of cannabis product available in this specific room location.",
9422 "format": "double"
9423 }
9424 },
9425 "additionalProperties": false,
9426 "description": "Cannabis inventory quantity tracking model by room location for facility management and compliance."
9427 },
9428 "InventorySnapshot": {
9429 "required": [
9430 "inventoryId",
9431 "packageId",
9432 "product",
9433 "productId",
9434 "quantity",
9435 "room",
9436 "roomId",
9437 "sku",
9438 "snapshotDate",
9439 "unit",
9440 "unitId"
9441 ],
9442 "type": "object",
9443 "properties": {
9444 "sku": {
9445 "minLength": 1,
9446 "type": "string",
9447 "description": "Stock Keeping Unit (SKU) code for product identification."
9448 },
9449 "product": {
9450 "minLength": 1,
9451 "type": "string",
9452 "description": "Product name as it existed at the snapshot date."
9453 },
9454 "productId": {
9455 "type": "integer",
9456 "description": "Product identifier linking to the product catalog.",
9457 "format": "int32"
9458 },
9459 "room": {
9460 "minLength": 1,
9461 "type": "string",
9462 "description": "Storage room name where inventory was located at snapshot time."
9463 },
9464 "roomId": {
9465 "type": "integer",
9466 "description": "Storage room identifier for location tracking.",
9467 "format": "int32"
9468 },
9469 "vendor": {
9470 "type": "string",
9471 "description": "Vendor name for the supplier of this inventory (optional).",
9472 "nullable": true
9473 },
9474 "packageId": {
9475 "minLength": 1,
9476 "type": "string",
9477 "description": "Package identifier for compliance tracking and traceability."
9478 },
9479 "batchName": {
9480 "type": "string",
9481 "description": "Batch name or lot number for quality tracking (optional).",
9482 "nullable": true
9483 },
9484 "batchId": {
9485 "type": "integer",
9486 "description": "Batch identifier for lot tracking (optional).",
9487 "format": "int32",
9488 "nullable": true
9489 },
9490 "quantity": {
9491 "type": "number",
9492 "description": "Inventory quantity as it existed at the snapshot date.",
9493 "format": "double"
9494 },
9495 "totalCost": {
9496 "type": "number",
9497 "description": "Total cost value of the inventory quantity (optional).",
9498 "format": "double",
9499 "nullable": true
9500 },
9501 "unit": {
9502 "minLength": 1,
9503 "type": "string",
9504 "description": "Unit of measurement for the quantity."
9505 },
9506 "unitId": {
9507 "type": "integer",
9508 "description": "Unit identifier for the measurement type.",
9509 "format": "int32"
9510 },
9511 "status": {
9512 "type": "string",
9513 "description": "Inventory status at the time of snapshot (e.g., \"Active\", \"Quarantine\").",
9514 "nullable": true
9515 },
9516 "snapshotDate": {
9517 "type": "string",
9518 "description": "Date and time when this inventory snapshot was captured.",
9519 "format": "date-time"
9520 },
9521 "inventoryId": {
9522 "type": "integer",
9523 "description": "Inventory record identifier linking to the specific inventory item.",
9524 "format": "int32"
9525 }
9526 },
9527 "additionalProperties": false,
9528 "description": "Historical inventory snapshot model representing inventory levels at a specific point in time."
9529 },
9530 "InventoryTag": {
9531 "type": "object",
9532 "properties": {
9533 "tagId": {
9534 "type": "integer",
9535 "format": "int32"
9536 },
9537 "tagName": {
9538 "type": "string",
9539 "nullable": true
9540 },
9541 "packageId": {
9542 "type": "string",
9543 "nullable": true
9544 }
9545 },
9546 "additionalProperties": false
9547 },
9548 "InventoryTransaction": {
9549 "required": ["inventoryTransactionId"],
9550 "type": "object",
9551 "properties": {
9552 "inventoryTransactionId": {
9553 "type": "integer",
9554 "description": "Unique identifier for the inventory transaction record.",
9555 "format": "int32"
9556 },
9557 "transactionType": {
9558 "type": "string",
9559 "description": "Type of inventory transaction performed.\n**Options**: Move, Convert, Adjust, Combine, Receive, Change Product, Discontinue, Detail Update, Reconciliation, Create Package",
9560 "nullable": true
9561 },
9562 "product": {
9563 "type": "string",
9564 "description": "Product name at the time of transaction.",
9565 "nullable": true
9566 },
9567 "sku": {
9568 "type": "string",
9569 "description": "Stock Keeping Unit (SKU) code for the product.",
9570 "nullable": true
9571 },
9572 "productId": {
9573 "type": "integer",
9574 "description": "Product identifier linking to the product catalog.",
9575 "format": "int32"
9576 },
9577 "unit": {
9578 "type": "string",
9579 "description": "Unit of measurement for the transaction quantities.",
9580 "nullable": true
9581 },
9582 "packageId": {
9583 "type": "string",
9584 "description": "Package identifier for compliance tracking and traceability.",
9585 "nullable": true
9586 },
9587 "externalPackageId": {
9588 "type": "string",
9589 "description": "External package identifier from integrated compliance systems.",
9590 "nullable": true
9591 },
9592 "batchId": {
9593 "type": "integer",
9594 "description": "Batch identifier for lot tracking (optional).",
9595 "format": "int32",
9596 "nullable": true
9597 },
9598 "batchName": {
9599 "type": "string",
9600 "description": "Batch name or lot number for quality tracking (optional).",
9601 "nullable": true
9602 },
9603 "quantity": {
9604 "type": "number",
9605 "description": "Transaction quantity for non-adjustment operations (Move, Convert, Receive, etc.).",
9606 "format": "double",
9607 "nullable": true
9608 },
9609 "fromQuantity": {
9610 "type": "number",
9611 "description": "Original quantity before adjustment (used for Adjust transaction type).",
9612 "format": "double",
9613 "nullable": true
9614 },
9615 "toQuantity": {
9616 "type": "number",
9617 "description": "New quantity after adjustment (used for Adjust transaction type).",
9618 "format": "double",
9619 "nullable": true
9620 },
9621 "reason": {
9622 "type": "string",
9623 "description": "Reason for adjustment (used for Adjust transaction type).",
9624 "nullable": true
9625 },
9626 "receiveInventoryHistoryId": {
9627 "type": "integer",
9628 "description": "Receive inventory history identifier for received inventory linkage (optional).",
9629 "format": "int32",
9630 "nullable": true
9631 },
9632 "fromLocation": {
9633 "type": "string",
9634 "description": "Source location name for Move transactions.",
9635 "nullable": true
9636 },
9637 "fromRoom": {
9638 "type": "string",
9639 "description": "Source room name for Move transactions.",
9640 "nullable": true
9641 },
9642 "toLocation": {
9643 "type": "string",
9644 "description": "Destination location name for Move transactions.",
9645 "nullable": true
9646 },
9647 "toRoom": {
9648 "type": "string",
9649 "description": "Destination room name for Move transactions.",
9650 "nullable": true
9651 },
9652 "conversionTransactionID": {
9653 "type": "integer",
9654 "description": "Conversion transaction identifier for Convert operations (optional).",
9655 "format": "int32",
9656 "nullable": true
9657 },
9658 "transactionBy": {
9659 "type": "string",
9660 "description": "Username or identifier of the person who performed the transaction.",
9661 "nullable": true
9662 },
9663 "transactionDate": {
9664 "type": "string",
9665 "description": "Date and time when the transaction was performed.",
9666 "format": "date-time"
9667 },
9668 "unitCost": {
9669 "type": "number",
9670 "description": "Unit cost of the package at the time of transaction (optional).",
9671 "format": "double",
9672 "nullable": true
9673 },
9674 "purchaseOrderId": {
9675 "type": "integer",
9676 "description": "Purchase order identifier for received inventory linkage (optional).",
9677 "format": "int32",
9678 "nullable": true
9679 },
9680 "inventoryId": {
9681 "type": "integer",
9682 "description": "Unique inventory item identifier affected by this transaction.",
9683 "format": "int32"
9684 }
9685 },
9686 "additionalProperties": false,
9687 "description": "Inventory transaction record model representing historical inventory movement and modification operations."
9688 },
9689 "JournalEntry": {
9690 "type": "object",
9691 "properties": {
9692 "journalEntryId": {
9693 "type": "integer",
9694 "description": "Unique identifier for the journal entry.",
9695 "format": "int32"
9696 },
9697 "subject": {
9698 "type": "string",
9699 "description": "Brief title or summary of the journal entry.",
9700 "nullable": true
9701 },
9702 "body": {
9703 "type": "string",
9704 "description": "Detailed content and notes for the journal entry.",
9705 "nullable": true
9706 },
9707 "date": {
9708 "type": "string",
9709 "description": "Date and time when the journal entry was created or should be dated.",
9710 "format": "date-time"
9711 }
9712 },
9713 "additionalProperties": false,
9714 "description": "Represents a customer journal entry containing notes and interaction history for customer service tracking."
9715 },
9716 "LabResult": {
9717 "type": "object",
9718 "properties": {
9719 "labTest": {
9720 "type": "string",
9721 "description": "Name of the laboratory test performed (e.g., \"THC\", \"CBD\", \"Myrcene\", \"Total Aerobic Count\").",
9722 "nullable": true
9723 },
9724 "value": {
9725 "type": "number",
9726 "description": "Numeric test result value (null if not detected or not applicable).",
9727 "format": "double",
9728 "nullable": true
9729 },
9730 "labResultUnitId": {
9731 "$ref": "#/components/schemas/LabResultUnit"
9732 },
9733 "labResultUnit": {
9734 "type": "string",
9735 "description": "Human-readable unit name corresponding to the LabResultUnitId.",
9736 "nullable": true,
9737 "readOnly": true
9738 }
9739 },
9740 "additionalProperties": false,
9741 "description": "Laboratory testing result model for cannabis and cannabis product analysis."
9742 },
9743 "LabResultUnit": {
9744 "enum": [1, 2, 3, 4, 5, 6],
9745 "type": "integer",
9746 "format": "int32"
9747 },
9748 "LabResultUnitData": {
9749 "type": "object",
9750 "properties": {
9751 "labResultUnitId": {
9752 "type": "integer",
9753 "description": "Unique identifier for the lab result unit type.",
9754 "format": "int32"
9755 },
9756 "labResultUnit": {
9757 "type": "string",
9758 "description": "Display name of the lab result unit (e.g., \"mg\", \"%\", \"mg/g\", \"ND\", \"LOQ\", \"Pass/Fail\").",
9759 "nullable": true
9760 }
9761 },
9762 "additionalProperties": false,
9763 "description": "Laboratory result unit data model for cannabis testing measurements and reporting."
9764 },
9765 "LineItemTaxInfo": {
9766 "type": "object",
9767 "properties": {
9768 "rateName": {
9769 "type": "string",
9770 "description": "Name of the tax rate applied (e.g., \"State Excise Tax\", \"City Cannabis Tax\", \"Sales Tax\").",
9771 "nullable": true
9772 },
9773 "rate": {
9774 "type": "number",
9775 "description": "Tax rate as a decimal percentage (e.g., 0.0875 for 8.75% tax rate).",
9776 "format": "double"
9777 },
9778 "amount": {
9779 "type": "number",
9780 "description": "Calculated tax amount applied to the line item (in USD).",
9781 "format": "double"
9782 },
9783 "transactionItemId": {
9784 "type": "integer",
9785 "description": "Reference identifier linking this tax information back to the specific transaction line item.\nNot guaranteed to be unique outside of a single transaction.",
9786 "format": "int32",
9787 "readOnly": true
9788 }
9789 },
9790 "additionalProperties": false,
9791 "description": "Tax information applied to individual transaction line items in cannabis retail operations."
9792 },
9793 "Lineage": {
9794 "type": "object",
9795 "properties": {
9796 "lineageId": {
9797 "type": "integer",
9798 "description": "Unique identifier for the genetic lineage.",
9799 "format": "int32"
9800 },
9801 "lineageName": {
9802 "type": "string",
9803 "description": "Display name for the genetic lineage (e.g., \"Indica\", \"Sativa\", \"Hybrid\").",
9804 "nullable": true
9805 }
9806 },
9807 "additionalProperties": false,
9808 "description": "Cannabis genetic lineage model containing hereditary classification information for product categorization and genetic tracking."
9809 },
9810 "LocationIdentity": {
9811 "type": "object",
9812 "properties": {
9813 "locationId": {
9814 "type": "integer",
9815 "description": "Unique identifier for the cannabis dispensary location.",
9816 "format": "int32"
9817 },
9818 "lspId": {
9819 "type": "integer",
9820 "description": "Unique identifier for the parent company (LSP - Licensed Service Provider).",
9821 "format": "int32"
9822 },
9823 "locationName": {
9824 "type": "string",
9825 "description": "Business name of the cannabis dispensary location.",
9826 "nullable": true
9827 },
9828 "lspName": {
9829 "type": "string",
9830 "description": "Company name of the parent organization (Licensed Service Provider).",
9831 "nullable": true
9832 },
9833 "address": {
9834 "type": "string",
9835 "description": "Primary street address of the dispensary location.",
9836 "nullable": true
9837 },
9838 "address2": {
9839 "type": "string",
9840 "description": "Secondary address line (suite, unit, etc.) if applicable.",
9841 "nullable": true
9842 },
9843 "city": {
9844 "type": "string",
9845 "description": "City where the dispensary is located.",
9846 "nullable": true
9847 },
9848 "state": {
9849 "type": "string",
9850 "description": "State or province where the dispensary is licensed to operate.",
9851 "nullable": true
9852 },
9853 "postalCode": {
9854 "type": "string",
9855 "description": "Postal code (ZIP code) for the dispensary location.",
9856 "nullable": true
9857 },
9858 "licenseNumber": {
9859 "type": "string",
9860 "description": "State-issued cannabis business license number for regulatory compliance.",
9861 "nullable": true
9862 },
9863 "doingBusinessAs": {
9864 "type": "string",
9865 "description": "\"Doing Business As\" name if different from the legal business name.",
9866 "nullable": true
9867 },
9868 "shareCustomerProfiles": {
9869 "type": "boolean",
9870 "description": "Indicates whether customer profiles are shared across locations within the organization."
9871 },
9872 "globalId": {
9873 "type": "string",
9874 "description": "Legacy global unique identifier for the location (deprecated).",
9875 "format": "uuid",
9876 "nullable": true,
9877 "deprecated": true
9878 },
9879 "locationGlobalId": {
9880 "type": "string",
9881 "description": "Global unique identifier for the location across all systems and integrations.",
9882 "format": "uuid",
9883 "nullable": true
9884 },
9885 "lspGlobalId": {
9886 "type": "string",
9887 "description": "Global unique identifier for the parent company (LSP) across all systems.",
9888 "format": "uuid",
9889 "nullable": true
9890 },
9891 "region": {
9892 "type": "string",
9893 "description": "Regional identifier for compliance and API routing (internal use only).",
9894 "nullable": true
9895 },
9896 "regionId": {
9897 "type": "string",
9898 "description": "Base64-encoded SHA256 hash of the region identifier for secure regional routing.",
9899 "nullable": true,
9900 "readOnly": true
9901 }
9902 },
9903 "additionalProperties": false,
9904 "description": "Location identity model containing complete location and parent company information for API key verification and context identification."
9905 },
9906 "LocationMapping": {
9907 "type": "object",
9908 "properties": {
9909 "locationName": {
9910 "type": "string",
9911 "description": "Name of the location where the discount applies.",
9912 "nullable": true
9913 }
9914 },
9915 "additionalProperties": false,
9916 "description": "Location mapping model for associating discounts with specific business locations."
9917 },
9918 "LocationProductOverride": {
9919 "type": "object",
9920 "properties": {
9921 "productId": {
9922 "type": "integer",
9923 "format": "int32"
9924 },
9925 "price": {
9926 "type": "number",
9927 "format": "double",
9928 "nullable": true
9929 },
9930 "recPrice": {
9931 "type": "number",
9932 "format": "double",
9933 "nullable": true
9934 },
9935 "cost": {
9936 "type": "number",
9937 "format": "double",
9938 "nullable": true
9939 },
9940 "onlineAvailable": {
9941 "type": "boolean",
9942 "nullable": true
9943 },
9944 "posAvailable": {
9945 "type": "boolean",
9946 "nullable": true
9947 },
9948 "maxPurchasable": {
9949 "type": "number",
9950 "format": "double",
9951 "nullable": true
9952 },
9953 "lowInventoryThreshold": {
9954 "type": "number",
9955 "format": "double",
9956 "nullable": true
9957 },
9958 "customMetadata": {
9959 "type": "string",
9960 "nullable": true
9961 }
9962 },
9963 "additionalProperties": false
9964 },
9965 "LocationProductOverrideRequest": {
9966 "type": "object",
9967 "properties": {
9968 "productId": {
9969 "type": "integer",
9970 "description": "Product identifier for the product being configured with location-specific overrides.",
9971 "format": "int32"
9972 },
9973 "price": {
9974 "$ref": "#/components/schemas/DecimalNullableOptional"
9975 },
9976 "recPrice": {
9977 "$ref": "#/components/schemas/DecimalNullableOptional"
9978 },
9979 "cost": {
9980 "$ref": "#/components/schemas/DecimalNullableOptional"
9981 },
9982 "onlineAvailable": {
9983 "$ref": "#/components/schemas/BooleanNullableOptional"
9984 },
9985 "posAvailable": {
9986 "$ref": "#/components/schemas/BooleanNullableOptional"
9987 },
9988 "maxPurchasable": {
9989 "$ref": "#/components/schemas/DecimalNullableOptional"
9990 },
9991 "lowInventoryThreshold": {
9992 "$ref": "#/components/schemas/DecimalNullableOptional"
9993 },
9994 "customMetadata": {
9995 "$ref": "#/components/schemas/StringOptional"
9996 }
9997 },
9998 "additionalProperties": false
9999 },
10000 "LocationResponse": {
10001 "type": "object",
10002 "properties": {
10003 "locationName": {
10004 "type": "string",
10005 "nullable": true
10006 },
10007 "locId": {
10008 "type": "integer",
10009 "format": "int32"
10010 },
10011 "licenseNumber": {
10012 "type": "string",
10013 "nullable": true
10014 },
10015 "outcome": {
10016 "type": "string",
10017 "nullable": true,
10018 "readOnly": true
10019 },
10020 "outcomeId": {
10021 "type": "integer",
10022 "format": "int32",
10023 "readOnly": true
10024 },
10025 "broadcastedTo": {
10026 "type": "string",
10027 "nullable": true
10028 },
10029 "errorDetail": {
10030 "type": "string",
10031 "nullable": true
10032 }
10033 },
10034 "additionalProperties": false
10035 },
10036 "LoyaltySnapshot": {
10037 "type": "object",
10038 "properties": {
10039 "customerId": {
10040 "type": "integer",
10041 "description": "Unique identifier for the customer in the loyalty program.\nLinks this loyalty snapshot to the specific customer account.",
10042 "format": "int32"
10043 },
10044 "loyaltyBalance": {
10045 "type": "number",
10046 "description": "Current available loyalty points balance for the customer.\nRepresents points that can be redeemed for rewards or discounts.",
10047 "format": "double"
10048 },
10049 "loyaltySpent": {
10050 "type": "number",
10051 "description": "Total loyalty points redeemed/spent by the customer over their lifetime.\nHistorical record of all point redemptions and rewards claimed.",
10052 "format": "double"
10053 },
10054 "loyaltyEarned": {
10055 "type": "number",
10056 "description": "Total loyalty points earned by the customer over their lifetime.\nHistorical record of all points awarded through purchases and activities.",
10057 "format": "double"
10058 }
10059 },
10060 "additionalProperties": false,
10061 "description": "Represents a customer's loyalty program balance and activity snapshot for reporting purposes.\n\nContains current point balances and historical activity for individual customers within the\nloyalty program. Used for daily balance reporting, customer service inquiries, and loyalty\nprogram analytics. Data reflects nightly batch processing and may not include real-time changes."
10062 },
10063 "ManualPayment": {
10064 "type": "object",
10065 "properties": {
10066 "manualPaymentProcessorName": {
10067 "type": "string",
10068 "description": "Name of the manual payment processor or handling method (e.g., \"Cash\", \"Check\", \"Money Order\").",
10069 "nullable": true
10070 },
10071 "manualPaid": {
10072 "type": "number",
10073 "description": "Amount paid through the manual payment method (in USD).",
10074 "format": "double"
10075 }
10076 },
10077 "additionalProperties": false,
10078 "description": "Manual payment information for cannabis transactions processed outside integrated payment systems."
10079 },
10080 "MatureBatchDetails": {
10081 "type": "object",
10082 "properties": {
10083 "batchId": {
10084 "type": "integer",
10085 "description": "Batch identifier for the mature plant batch being created.",
10086 "format": "int32"
10087 },
10088 "serialNumbers": {
10089 "type": "array",
10090 "items": {
10091 "type": "string"
10092 },
10093 "description": "Collection of individual plant serial numbers within the mature batch for state tracking compliance.",
10094 "nullable": true
10095 },
10096 "batchStage": {
10097 "type": "string",
10098 "description": "Growth stage designation for the mature batch (e.g., \"Vegetative\", \"Flowering\").",
10099 "nullable": true
10100 },
10101 "roomId": {
10102 "type": "integer",
10103 "description": "Room identifier for the mature batch location assignment.",
10104 "format": "int32"
10105 },
10106 "tableId": {
10107 "type": "integer",
10108 "description": "Table identifier within the room for precise location tracking (optional).",
10109 "format": "int32",
10110 "nullable": true
10111 },
10112 "dateCreated": {
10113 "type": "string",
10114 "description": "Date when the mature batch was created for cultivation timeline documentation.",
10115 "format": "date-time",
10116 "nullable": true
10117 }
10118 },
10119 "additionalProperties": false,
10120 "description": "Detailed specification for creating individual mature plant batches with compliance tracking information."
10121 },
10122 "MovePlantRequest": {
10123 "type": "object",
10124 "properties": {
10125 "plantIds": {
10126 "type": "array",
10127 "items": {
10128 "type": "integer",
10129 "format": "int32"
10130 },
10131 "description": "Collection of LeafLogix plant IDs to move to the target room",
10132 "nullable": true
10133 },
10134 "roomId": {
10135 "type": "integer",
10136 "description": "Target cultivation room ID within the same facility where plants will be moved",
10137 "format": "int32"
10138 },
10139 "tableId": {
10140 "type": "integer",
10141 "description": "Optional table ID within the target room for precise plant positioning (optional)",
10142 "format": "int32",
10143 "nullable": true
10144 }
10145 },
10146 "additionalProperties": false,
10147 "description": "Request model for moving cannabis plants to a different cultivation room or table within the same facility.\n\n**Movement Behavior:**\n- Moves specified plants to target room within same facility\n- Optional table assignment for precise cultivation area management\n- Validates target room belongs to same facility for security\n- Automatically updates plant cultivation stage if room has associated stage\n\n**Facility Restrictions:**\n- Target room must belong to same facility as requesting user\n- Cross-facility plant movements are prohibited for security and compliance\n- All plant IDs must be accessible to the authenticated location\n\n**Integration:**\n- Movement synchronized with external cultivation systems when configured\n- Supports cultivation workflow automation and environmental optimization"
10148 },
10149 "ObjectWaste": {
10150 "type": "object",
10151 "properties": {
10152 "wasteId": {
10153 "type": "integer",
10154 "description": "Unique identifier for the waste record (null for new waste creation).",
10155 "format": "int32",
10156 "nullable": true
10157 },
10158 "referenceNo": {
10159 "type": "string",
10160 "description": "Reference number for waste tracking and documentation.",
10161 "nullable": true
10162 },
10163 "comments": {
10164 "type": "string",
10165 "description": "Additional comments or notes about the waste disposal.",
10166 "nullable": true
10167 },
10168 "wasteDate": {
10169 "type": "string",
10170 "description": "Date when the waste disposal occurred.",
10171 "format": "date-time",
10172 "nullable": true
10173 },
10174 "wasteDetail": {
10175 "type": "array",
10176 "items": {
10177 "type": "object"
10178 },
10179 "description": "Collection of waste detail records containing specific item information.",
10180 "nullable": true
10181 },
10182 "lspId": {
10183 "type": "integer",
10184 "description": "Licensed Service Provider identifier (internal use only).",
10185 "format": "int32",
10186 "nullable": true
10187 },
10188 "locId": {
10189 "type": "integer",
10190 "description": "Location identifier (internal use only).",
10191 "format": "int32",
10192 "nullable": true
10193 },
10194 "roomRequired": {
10195 "type": "boolean",
10196 "description": "Indicates if room identification is required for this waste type (internal use only).",
10197 "nullable": true
10198 },
10199 "isBioTrack": {
10200 "type": "boolean",
10201 "description": "Indicates if this waste integrates with BioTrack system (internal use only).",
10202 "nullable": true
10203 }
10204 },
10205 "additionalProperties": false,
10206 "description": "Generic waste record model containing waste disposal information and associated detail records for cannabis compliance and waste tracking."
10207 },
10208 "PackageLineage": {
10209 "type": "object",
10210 "properties": {
10211 "packageId": {
10212 "type": "string",
10213 "description": "Package identifier for the current package in the lineage chain.",
10214 "nullable": true
10215 },
10216 "antecedentPackageDistance": {
10217 "type": "integer",
10218 "description": "Number of generations between current package and antecedent package in the lineage chain.",
10219 "format": "int32"
10220 },
10221 "antecedentIsHarvest": {
10222 "type": "boolean",
10223 "description": "Flag indicating whether the antecedent package originated from a harvest operation."
10224 },
10225 "batchName": {
10226 "type": "string",
10227 "description": "Batch name for the current package for lot tracking and quality control.",
10228 "nullable": true
10229 },
10230 "antecedentBatchName": {
10231 "type": "string",
10232 "description": "Batch name of the antecedent package for lineage and quality tracking.",
10233 "nullable": true
10234 }
10235 },
10236 "additionalProperties": false,
10237 "description": "Package lineage tracking model for cannabis product traceability and regulatory compliance."
10238 },
10239 "Plant": {
10240 "type": "object",
10241 "properties": {
10242 "plantId": {
10243 "type": "integer",
10244 "format": "int32"
10245 },
10246 "serialNumber": {
10247 "type": "string",
10248 "nullable": true
10249 },
10250 "growthPhase": {
10251 "type": "string",
10252 "nullable": true
10253 },
10254 "type": {
10255 "type": "string",
10256 "nullable": true
10257 },
10258 "harvestedWeight": {
10259 "type": "number",
10260 "format": "double",
10261 "nullable": true
10262 },
10263 "status": {
10264 "type": "string",
10265 "nullable": true
10266 },
10267 "plantCount": {
10268 "type": "integer",
10269 "format": "int32",
10270 "nullable": true
10271 },
10272 "isMother": {
10273 "type": "boolean"
10274 },
10275 "motherPlantId": {
10276 "type": "integer",
10277 "format": "int32",
10278 "nullable": true
10279 },
10280 "plantedOn": {
10281 "type": "string",
10282 "format": "date-time",
10283 "nullable": true
10284 },
10285 "addedToHarvestOn": {
10286 "type": "string",
10287 "format": "date-time",
10288 "nullable": true
10289 },
10290 "harvestDate": {
10291 "type": "string",
10292 "format": "date-time",
10293 "nullable": true
10294 },
10295 "destroyedDate": {
10296 "type": "string",
10297 "format": "date-time",
10298 "nullable": true
10299 },
10300 "plantGroupName": {
10301 "type": "string",
10302 "nullable": true
10303 },
10304 "strain": {
10305 "type": "string",
10306 "nullable": true
10307 },
10308 "room": {
10309 "type": "string",
10310 "nullable": true
10311 },
10312 "table": {
10313 "type": "string",
10314 "nullable": true
10315 },
10316 "vegetationStartedOn": {
10317 "type": "string",
10318 "format": "date-time",
10319 "nullable": true
10320 },
10321 "vegetationEndedOn": {
10322 "type": "string",
10323 "format": "date-time",
10324 "nullable": true
10325 },
10326 "floweringStartedOn": {
10327 "type": "string",
10328 "format": "date-time",
10329 "nullable": true
10330 },
10331 "floweringEndedOn": {
10332 "type": "string",
10333 "format": "date-time",
10334 "nullable": true
10335 },
10336 "currentPhaseStartDate": {
10337 "type": "string",
10338 "format": "date-time",
10339 "nullable": true
10340 },
10341 "lastModifiedDate": {
10342 "type": "string",
10343 "format": "date-time",
10344 "nullable": true
10345 },
10346 "daysInCurrentPhase": {
10347 "type": "integer",
10348 "format": "int32",
10349 "nullable": true
10350 },
10351 "floweringRoom": {
10352 "type": "string",
10353 "nullable": true
10354 },
10355 "floweringTable": {
10356 "type": "string",
10357 "nullable": true
10358 },
10359 "vegetationRoom": {
10360 "type": "string",
10361 "nullable": true
10362 },
10363 "vegetationTable": {
10364 "type": "string",
10365 "nullable": true
10366 },
10367 "daysInFlowering": {
10368 "type": "integer",
10369 "format": "int32",
10370 "nullable": true
10371 },
10372 "daysInVegetation": {
10373 "type": "integer",
10374 "format": "int32",
10375 "nullable": true
10376 },
10377 "batchId": {
10378 "type": "integer",
10379 "format": "int32"
10380 },
10381 "harvestId": {
10382 "type": "integer",
10383 "format": "int32",
10384 "readOnly": true
10385 }
10386 },
10387 "additionalProperties": false
10388 },
10389 "PlantWasteDetail": {
10390 "type": "object",
10391 "properties": {
10392 "plantId": {
10393 "type": "integer",
10394 "description": "Identifier for the plant generating this waste.",
10395 "format": "int32"
10396 },
10397 "wasteType": {
10398 "type": "string",
10399 "description": "Type or category of waste material from the plant.",
10400 "nullable": true
10401 },
10402 "wasteAmount": {
10403 "type": "number",
10404 "description": "Quantity of waste material generated from the plant.",
10405 "format": "double"
10406 },
10407 "unitId": {
10408 "type": "integer",
10409 "description": "Unit of measurement identifier for the waste amount.",
10410 "format": "int32"
10411 }
10412 },
10413 "additionalProperties": false,
10414 "description": "Plant waste detail model for tracking waste generated from specific plant disposal operations."
10415 },
10416 "PlantWasteDetailWaste": {
10417 "type": "object",
10418 "properties": {
10419 "wasteId": {
10420 "type": "integer",
10421 "description": "Unique identifier for the waste record (null for new waste creation).",
10422 "format": "int32",
10423 "nullable": true
10424 },
10425 "referenceNo": {
10426 "type": "string",
10427 "description": "Reference number for waste tracking and documentation.",
10428 "nullable": true
10429 },
10430 "comments": {
10431 "type": "string",
10432 "description": "Additional comments or notes about the waste disposal.",
10433 "nullable": true
10434 },
10435 "wasteDate": {
10436 "type": "string",
10437 "description": "Date when the waste disposal occurred.",
10438 "format": "date-time",
10439 "nullable": true
10440 },
10441 "wasteDetail": {
10442 "type": "array",
10443 "items": {
10444 "$ref": "#/components/schemas/PlantWasteDetail"
10445 },
10446 "description": "Collection of waste detail records containing specific item information.",
10447 "nullable": true
10448 },
10449 "lspId": {
10450 "type": "integer",
10451 "description": "Licensed Service Provider identifier (internal use only).",
10452 "format": "int32",
10453 "nullable": true
10454 },
10455 "locId": {
10456 "type": "integer",
10457 "description": "Location identifier (internal use only).",
10458 "format": "int32",
10459 "nullable": true
10460 },
10461 "roomRequired": {
10462 "type": "boolean",
10463 "description": "Indicates if room identification is required for this waste type (internal use only).",
10464 "nullable": true
10465 },
10466 "isBioTrack": {
10467 "type": "boolean",
10468 "description": "Indicates if this waste integrates with BioTrack system (internal use only).",
10469 "nullable": true
10470 }
10471 },
10472 "additionalProperties": false,
10473 "description": "Generic waste record model containing waste disposal information and associated detail records for cannabis compliance and waste tracking."
10474 },
10475 "PostImmatureBatchRequest": {
10476 "type": "object",
10477 "properties": {
10478 "batches": {
10479 "type": "array",
10480 "items": {
10481 "$ref": "#/components/schemas/BatchDetails"
10482 },
10483 "description": "Collection of immature plant batch specifications for bulk batch creation operations.",
10484 "nullable": true
10485 }
10486 },
10487 "additionalProperties": false,
10488 "description": "Request model for creating immature plant batches in cannabis cultivation operations."
10489 },
10490 "PreOrderItem": {
10491 "required": ["productId", "quantity"],
10492 "type": "object",
10493 "properties": {
10494 "productId": {
10495 "type": "integer",
10496 "format": "int32"
10497 },
10498 "quantity": {
10499 "type": "number",
10500 "format": "double"
10501 }
10502 },
10503 "additionalProperties": false
10504 },
10505 "PreOrderRedemption": {
10506 "required": ["redemptionId", "redemptionType"],
10507 "type": "object",
10508 "properties": {
10509 "productId": {
10510 "type": "integer",
10511 "format": "int32",
10512 "nullable": true
10513 },
10514 "redemptionType": {
10515 "minLength": 1,
10516 "type": "string"
10517 },
10518 "redemptionId": {
10519 "minLength": 1,
10520 "type": "string"
10521 },
10522 "redemptionDescription": {
10523 "type": "string",
10524 "nullable": true
10525 },
10526 "redemptionCallbackUrl": {
10527 "type": "string",
10528 "nullable": true
10529 }
10530 },
10531 "additionalProperties": false
10532 },
10533 "PreOrderRedemptionIEnumerableOptional": {
10534 "type": "array",
10535 "additionalProperties": false
10536 },
10537 "PreOrderStatus": {
10538 "type": "object",
10539 "properties": {
10540 "preOrderId": {
10541 "type": "integer",
10542 "format": "int32"
10543 },
10544 "status": {
10545 "type": "string",
10546 "nullable": true
10547 },
10548 "transactionId": {
10549 "type": "integer",
10550 "format": "int32",
10551 "nullable": true
10552 },
10553 "orderDate": {
10554 "type": "string",
10555 "format": "date-time"
10556 },
10557 "customerFirstName": {
10558 "type": "string",
10559 "nullable": true
10560 },
10561 "customerLastName": {
10562 "type": "string",
10563 "nullable": true
10564 },
10565 "customerId": {
10566 "type": "integer",
10567 "format": "int32"
10568 },
10569 "orderType": {
10570 "type": "string",
10571 "nullable": true
10572 },
10573 "orderSource": {
10574 "type": "string",
10575 "nullable": true
10576 },
10577 "rejectedReason": {
10578 "type": "string",
10579 "nullable": true
10580 },
10581 "isCancellable": {
10582 "type": "boolean"
10583 },
10584 "isUpdateable": {
10585 "type": "boolean"
10586 },
10587 "total": {
10588 "type": "number",
10589 "format": "double",
10590 "nullable": true
10591 },
10592 "subTotal": {
10593 "type": "number",
10594 "format": "double",
10595 "nullable": true
10596 },
10597 "totalTax": {
10598 "type": "number",
10599 "format": "double",
10600 "nullable": true
10601 },
10602 "sourceSystem": {
10603 "type": "string",
10604 "nullable": true
10605 },
10606 "items": {
10607 "type": "array",
10608 "items": {
10609 "$ref": "#/components/schemas/AllocatedPreOrderItem"
10610 },
10611 "nullable": true
10612 }
10613 },
10614 "additionalProperties": false
10615 },
10616 "PrecartItem": {
10617 "type": "object",
10618 "properties": {
10619 "productId": {
10620 "type": "integer",
10621 "format": "int32"
10622 },
10623 "quantity": {
10624 "type": "number",
10625 "format": "double"
10626 }
10627 },
10628 "additionalProperties": false
10629 },
10630 "PriceCartRequest": {
10631 "type": "object",
10632 "properties": {
10633 "cart": {
10634 "type": "array",
10635 "items": {
10636 "$ref": "#/components/schemas/PrecartItem"
10637 },
10638 "description": "Collection of products in the customer's shopping cart with quantities and specifications.",
10639 "nullable": true
10640 },
10641 "customerTypeId": {
10642 "type": "integer",
10643 "description": "Customer type identifier for pricing tier and discount eligibility (e.g., medical, recreational).",
10644 "format": "int32",
10645 "nullable": true
10646 },
10647 "customerId": {
10648 "type": "integer",
10649 "description": "Unique customer identifier for personalized pricing and loyalty program benefits.",
10650 "format": "int32",
10651 "nullable": true
10652 },
10653 "deliveryStreet": {
10654 "type": "string",
10655 "description": "Primary street address for delivery orders (used for tax calculation and delivery fee estimation).",
10656 "nullable": true
10657 },
10658 "deliveryStreet2": {
10659 "type": "string",
10660 "description": "Secondary address information (apartment, suite, unit number) for delivery orders.",
10661 "nullable": true
10662 },
10663 "deliveryCity": {
10664 "type": "string",
10665 "description": "City name for delivery address (used for tax jurisdiction determination).",
10666 "nullable": true
10667 },
10668 "deliveryState": {
10669 "type": "string",
10670 "description": "State or province for delivery address (used for tax calculation and compliance verification).",
10671 "nullable": true
10672 },
10673 "deliveryPostalCode": {
10674 "type": "string",
10675 "description": "Postal or ZIP code for delivery address (used for precise tax calculation and delivery zones).",
10676 "nullable": true
10677 },
10678 "isDelivery": {
10679 "type": "boolean",
10680 "description": "Indicates whether this is a delivery order (true) or pickup order (false) for tax and fee calculation."
10681 }
10682 },
10683 "additionalProperties": false,
10684 "description": "Request model for calculating pricing, taxes, and discounts for a customer's shopping cart before creating a pre-order."
10685 },
10686 "PriceEstimates": {
10687 "type": "object",
10688 "properties": {
10689 "discountAmount": {
10690 "type": "number",
10691 "format": "double"
10692 },
10693 "taxAmount": {
10694 "type": "number",
10695 "format": "double"
10696 },
10697 "feeAmount": {
10698 "type": "number",
10699 "format": "double"
10700 },
10701 "subtotal": {
10702 "type": "number",
10703 "format": "double"
10704 },
10705 "grandTotal": {
10706 "type": "number",
10707 "format": "double"
10708 }
10709 },
10710 "additionalProperties": false
10711 },
10712 "PricingDetail": {
10713 "type": "object",
10714 "properties": {
10715 "medPrice": {
10716 "type": "number",
10717 "description": "Medical cannabis patient pricing (typically lower due to tax benefits and patient programs).",
10718 "format": "double",
10719 "nullable": true
10720 },
10721 "recPrice": {
10722 "type": "number",
10723 "description": "Recreational adult-use cannabis pricing (standard retail pricing with full taxes).",
10724 "format": "double",
10725 "nullable": true
10726 },
10727 "pricingTierName": {
10728 "type": "string",
10729 "description": "Pricing tier name for customer segmentation (e.g., \"Standard\", \"VIP\", \"Bulk\", \"Employee\").",
10730 "nullable": true
10731 }
10732 },
10733 "additionalProperties": false,
10734 "description": "Pricing detail information for cannabis products with medical and recreational pricing tiers."
10735 },
10736 "PricingTier": {
10737 "type": "object",
10738 "properties": {
10739 "pricingTierId": {
10740 "type": "integer",
10741 "format": "int32"
10742 },
10743 "pricingTierName": {
10744 "type": "string",
10745 "nullable": true
10746 }
10747 },
10748 "additionalProperties": false
10749 },
10750 "PricingTierData": {
10751 "type": "object",
10752 "properties": {
10753 "startWeight": {
10754 "type": "number",
10755 "format": "double",
10756 "nullable": true
10757 },
10758 "endWeight": {
10759 "type": "number",
10760 "format": "double",
10761 "nullable": true
10762 },
10763 "price": {
10764 "type": "number",
10765 "format": "double"
10766 },
10767 "medicalPrice": {
10768 "type": "number",
10769 "format": "double"
10770 }
10771 },
10772 "additionalProperties": false
10773 },
10774 "Producer": {
10775 "type": "object",
10776 "properties": {
10777 "producerId": {
10778 "type": "integer",
10779 "description": "Unique identifier for the producer.",
10780 "format": "int32"
10781 },
10782 "producerName": {
10783 "type": "string",
10784 "description": "Display name of the producer for product attribution and branding.",
10785 "nullable": true
10786 }
10787 },
10788 "additionalProperties": false,
10789 "description": "Producer identification model containing basic producer information for product attribution and reference data needs."
10790 },
10791 "ProductCategory": {
10792 "type": "object",
10793 "properties": {
10794 "productCategoryId": {
10795 "type": "integer",
10796 "description": "Unique identifier for the product category.",
10797 "format": "int32"
10798 },
10799 "productCategoryName": {
10800 "type": "string",
10801 "description": "Display name of the product category (e.g., \"Flower\", \"Edibles\", \"Concentrates\").",
10802 "nullable": true
10803 },
10804 "masterCategory": {
10805 "type": "string",
10806 "description": "Higher-level master category classification for broader product grouping.",
10807 "nullable": true
10808 }
10809 },
10810 "additionalProperties": false,
10811 "description": "Product category model containing cannabis product classification information for menu organization and product management."
10812 },
10813 "ProductDetail": {
10814 "type": "object",
10815 "properties": {
10816 "productId": {
10817 "type": "integer",
10818 "format": "int32"
10819 },
10820 "sku": {
10821 "type": "string",
10822 "nullable": true
10823 },
10824 "internalName": {
10825 "type": "string",
10826 "nullable": true
10827 },
10828 "productName": {
10829 "type": "string",
10830 "nullable": true
10831 },
10832 "description": {
10833 "type": "string",
10834 "nullable": true
10835 },
10836 "masterCategory": {
10837 "type": "string",
10838 "nullable": true
10839 },
10840 "categoryId": {
10841 "type": "integer",
10842 "format": "int32",
10843 "nullable": true
10844 },
10845 "category": {
10846 "type": "string",
10847 "nullable": true
10848 },
10849 "imageUrl": {
10850 "type": "string",
10851 "nullable": true
10852 },
10853 "imageUrls": {
10854 "type": "array",
10855 "items": {
10856 "type": "string"
10857 },
10858 "nullable": true
10859 },
10860 "strainId": {
10861 "type": "integer",
10862 "format": "int32",
10863 "nullable": true
10864 },
10865 "strain": {
10866 "type": "string",
10867 "nullable": true
10868 },
10869 "strainType": {
10870 "type": "string",
10871 "nullable": true
10872 },
10873 "size": {
10874 "type": "string",
10875 "nullable": true
10876 },
10877 "netWeight": {
10878 "type": "number",
10879 "format": "double",
10880 "nullable": true
10881 },
10882 "netWeightUnitId": {
10883 "type": "integer",
10884 "format": "int32",
10885 "nullable": true
10886 },
10887 "netWeightUnit": {
10888 "type": "string",
10889 "nullable": true,
10890 "readOnly": true
10891 },
10892 "brandId": {
10893 "type": "integer",
10894 "format": "int32",
10895 "nullable": true
10896 },
10897 "brandName": {
10898 "type": "string",
10899 "nullable": true
10900 },
10901 "vendorId": {
10902 "type": "integer",
10903 "format": "int32",
10904 "nullable": true
10905 },
10906 "vendorName": {
10907 "type": "string",
10908 "nullable": true
10909 },
10910 "isCannabis": {
10911 "type": "boolean"
10912 },
10913 "isActive": {
10914 "type": "boolean"
10915 },
10916 "isCoupon": {
10917 "type": "boolean"
10918 },
10919 "thcContent": {
10920 "type": "number",
10921 "format": "double",
10922 "nullable": true
10923 },
10924 "thcContentUnit": {
10925 "type": "string",
10926 "nullable": true
10927 },
10928 "cbdContent": {
10929 "type": "number",
10930 "format": "double",
10931 "nullable": true
10932 },
10933 "cbdContentUnit": {
10934 "type": "string",
10935 "nullable": true
10936 },
10937 "productGrams": {
10938 "type": "number",
10939 "format": "double",
10940 "nullable": true
10941 },
10942 "flowerEquivalent": {
10943 "type": "number",
10944 "format": "double",
10945 "nullable": true
10946 },
10947 "recFlowerEquivalent": {
10948 "type": "number",
10949 "format": "double",
10950 "nullable": true
10951 },
10952 "price": {
10953 "type": "number",
10954 "format": "double",
10955 "nullable": true
10956 },
10957 "medPrice": {
10958 "type": "number",
10959 "format": "double",
10960 "nullable": true
10961 },
10962 "recPrice": {
10963 "type": "number",
10964 "format": "double",
10965 "nullable": true
10966 },
10967 "unitCost": {
10968 "type": "number",
10969 "format": "double",
10970 "nullable": true
10971 },
10972 "unitType": {
10973 "type": "string",
10974 "nullable": true
10975 },
10976 "onlineTitle": {
10977 "type": "string",
10978 "nullable": true
10979 },
10980 "onlineDescription": {
10981 "type": "string",
10982 "nullable": true
10983 },
10984 "onlineProduct": {
10985 "type": "boolean",
10986 "nullable": true,
10987 "readOnly": true
10988 },
10989 "posProducts": {
10990 "type": "boolean",
10991 "nullable": true
10992 },
10993 "pricingTier": {
10994 "type": "integer",
10995 "format": "int32",
10996 "nullable": true
10997 },
10998 "onlineAvailable": {
10999 "type": "boolean",
11000 "nullable": true
11001 },
11002 "lowInventoryThreshold": {
11003 "type": "number",
11004 "format": "double",
11005 "nullable": true
11006 },
11007 "pricingTierName": {
11008 "type": "string",
11009 "nullable": true
11010 },
11011 "pricingTierDescription": {
11012 "type": "string",
11013 "nullable": true
11014 },
11015 "pricingTierData": {
11016 "type": "array",
11017 "items": {
11018 "$ref": "#/components/schemas/PricingTierData"
11019 },
11020 "nullable": true
11021 },
11022 "flavor": {
11023 "type": "string",
11024 "nullable": true
11025 },
11026 "alternateName": {
11027 "type": "string",
11028 "nullable": true
11029 },
11030 "lineageName": {
11031 "type": "string",
11032 "nullable": true
11033 },
11034 "distillationName": {
11035 "type": "string",
11036 "nullable": true
11037 },
11038 "maxPurchaseablePerTransaction": {
11039 "type": "number",
11040 "format": "double",
11041 "nullable": true
11042 },
11043 "tags": {
11044 "type": "array",
11045 "items": {
11046 "$ref": "#/components/schemas/ProductTag"
11047 },
11048 "nullable": true
11049 },
11050 "effects": {
11051 "type": "array",
11052 "items": {
11053 "$ref": "#/components/schemas/ProductEffect"
11054 },
11055 "nullable": true
11056 },
11057 "dosage": {
11058 "type": "string",
11059 "nullable": true
11060 },
11061 "instructions": {
11062 "type": "string",
11063 "nullable": true
11064 },
11065 "allergens": {
11066 "type": "string",
11067 "nullable": true
11068 },
11069 "standardAllergens": {
11070 "$ref": "#/components/schemas/StandardAllergensDetails"
11071 },
11072 "defaultUnit": {
11073 "type": "string",
11074 "nullable": true
11075 },
11076 "producerId": {
11077 "type": "integer",
11078 "format": "int32",
11079 "nullable": true
11080 },
11081 "producerName": {
11082 "type": "string",
11083 "nullable": true
11084 },
11085 "createdDate": {
11086 "type": "string",
11087 "format": "date-time",
11088 "nullable": true
11089 },
11090 "isMedicalOnly": {
11091 "type": "boolean"
11092 },
11093 "lastModifiedDateUTC": {
11094 "type": "string",
11095 "format": "date-time",
11096 "nullable": true
11097 },
11098 "grossWeight": {
11099 "type": "number",
11100 "format": "double",
11101 "nullable": true
11102 },
11103 "isTaxable": {
11104 "type": "boolean",
11105 "nullable": true
11106 },
11107 "taxCategories": {
11108 "type": "array",
11109 "items": {
11110 "type": "string"
11111 },
11112 "nullable": true
11113 },
11114 "upc": {
11115 "type": "string",
11116 "nullable": true
11117 },
11118 "regulatoryCategory": {
11119 "type": "string",
11120 "nullable": true
11121 },
11122 "ndc": {
11123 "type": "string",
11124 "nullable": true
11125 },
11126 "daysSupply": {
11127 "type": "number",
11128 "format": "double",
11129 "nullable": true
11130 },
11131 "illinoisTaxCategory": {
11132 "type": "string",
11133 "nullable": true,
11134 "readOnly": true
11135 },
11136 "externalCategory": {
11137 "type": "string",
11138 "nullable": true
11139 },
11140 "externalId": {
11141 "type": "string",
11142 "nullable": true
11143 },
11144 "syncExternally": {
11145 "type": "boolean"
11146 },
11147 "regulatoryName": {
11148 "type": "string",
11149 "nullable": true
11150 },
11151 "broadcastedResponses": {
11152 "$ref": "#/components/schemas/BroadcastedResponses"
11153 },
11154 "administrationMethod": {
11155 "type": "string",
11156 "nullable": true
11157 },
11158 "unitCBDContentDose": {
11159 "type": "number",
11160 "format": "double",
11161 "nullable": true
11162 },
11163 "unitTHCContentDose": {
11164 "type": "number",
11165 "format": "double",
11166 "nullable": true
11167 },
11168 "oilVolume": {
11169 "type": "number",
11170 "format": "double",
11171 "nullable": true
11172 },
11173 "ingredientList": {
11174 "type": "string",
11175 "nullable": true
11176 },
11177 "expirationDays": {
11178 "type": "integer",
11179 "format": "int32",
11180 "nullable": true
11181 },
11182 "abbreviation": {
11183 "type": "string",
11184 "nullable": true
11185 },
11186 "isTestProduct": {
11187 "type": "boolean"
11188 },
11189 "isFinished": {
11190 "type": "boolean"
11191 },
11192 "allowAutomaticDiscounts": {
11193 "type": "boolean"
11194 },
11195 "servingSize": {
11196 "type": "string",
11197 "nullable": true
11198 },
11199 "servingSizePerUnit": {
11200 "type": "integer",
11201 "format": "int32",
11202 "nullable": true
11203 },
11204 "isNutrient": {
11205 "type": "boolean"
11206 },
11207 "approvalDateUTC": {
11208 "type": "string",
11209 "format": "date-time",
11210 "nullable": true
11211 },
11212 "ecomCategory": {
11213 "type": "string",
11214 "nullable": true
11215 },
11216 "ecomSubcategory": {
11217 "type": "string",
11218 "nullable": true
11219 },
11220 "customMetadata": {
11221 "type": "string",
11222 "nullable": true
11223 }
11224 },
11225 "additionalProperties": false
11226 },
11227 "ProductDetailUpload": {
11228 "required": ["productName", "sku"],
11229 "type": "object",
11230 "properties": {
11231 "productId": {
11232 "type": "integer",
11233 "description": "The unique identifier for a product in the system.\n\n**IMPORTANT**: This field determines whether a product is created or updated:\n- To CREATE a new product: Omit this field or set to null\n- To UPDATE an existing product: You MUST provide the ProductId of the existing product",
11234 "format": "int32",
11235 "nullable": true
11236 },
11237 "sku": {
11238 "minLength": 1,
11239 "type": "string",
11240 "description": "Product SKU - REQUIRED for CREATE operations"
11241 },
11242 "productName": {
11243 "minLength": 1,
11244 "type": "string",
11245 "description": "Product Name - REQUIRED for CREATE operations"
11246 },
11247 "description": {
11248 "type": "string",
11249 "description": "Deprecated in favor of AlternateName",
11250 "nullable": true
11251 },
11252 "alternateName": {
11253 "type": "string",
11254 "nullable": true
11255 },
11256 "masterCategory": {
11257 "type": "string",
11258 "nullable": true
11259 },
11260 "category": {
11261 "type": "string",
11262 "nullable": true
11263 },
11264 "strain": {
11265 "type": "string",
11266 "nullable": true
11267 },
11268 "strainType": {
11269 "type": "string",
11270 "description": "Strain type of the specified strain.\nUsed to disambiguate strains, if duplicates exist.\nIf no duplicates exist in the location's strain list, this field is not useful.\nIf duplicates DO exist and this field is not specified, the strain will be chosen by the first one created.",
11271 "nullable": true,
11272 "example": "123"
11273 },
11274 "size": {
11275 "type": "string",
11276 "nullable": true
11277 },
11278 "netWeight": {
11279 "type": "number",
11280 "format": "double",
11281 "nullable": true
11282 },
11283 "netWeightUnit": {
11284 "type": "string",
11285 "description": "Optional. Abbreviation of the unit of the product's net weight.",
11286 "nullable": true
11287 },
11288 "grossWeight": {
11289 "type": "number",
11290 "format": "double",
11291 "nullable": true
11292 },
11293 "brandName": {
11294 "type": "string",
11295 "nullable": true
11296 },
11297 "vendorName": {
11298 "type": "string",
11299 "nullable": true
11300 },
11301 "isCannabis": {
11302 "type": "boolean"
11303 },
11304 "isActive": {
11305 "type": "boolean"
11306 },
11307 "thcContent": {
11308 "type": "number",
11309 "format": "double",
11310 "nullable": true
11311 },
11312 "thcContentUnit": {
11313 "type": "string",
11314 "description": "mg; %; mg/g; n.d.",
11315 "nullable": true
11316 },
11317 "cbdContent": {
11318 "type": "number",
11319 "format": "double",
11320 "nullable": true
11321 },
11322 "cbdContentUnit": {
11323 "type": "string",
11324 "description": "mg; %; mg/g; n.d.",
11325 "nullable": true
11326 },
11327 "productGrams": {
11328 "type": "number",
11329 "format": "double",
11330 "nullable": true
11331 },
11332 "flowerEquivalent": {
11333 "type": "number",
11334 "format": "double",
11335 "nullable": true
11336 },
11337 "recFlowerEquivalent": {
11338 "type": "number",
11339 "format": "double",
11340 "nullable": true
11341 },
11342 "price": {
11343 "type": "number",
11344 "format": "double",
11345 "nullable": true
11346 },
11347 "unitCost": {
11348 "type": "number",
11349 "format": "double",
11350 "nullable": true
11351 },
11352 "unitType": {
11353 "type": "string",
11354 "nullable": true
11355 },
11356 "onlineTitle": {
11357 "type": "string",
11358 "nullable": true
11359 },
11360 "onlineDescription": {
11361 "type": "string",
11362 "nullable": true
11363 },
11364 "onlineProduct": {
11365 "type": "boolean",
11366 "nullable": true
11367 },
11368 "posProducts": {
11369 "type": "boolean",
11370 "nullable": true
11371 },
11372 "tags": {
11373 "type": "array",
11374 "items": {
11375 "type": "integer",
11376 "format": "int32"
11377 },
11378 "nullable": true
11379 },
11380 "defaultUnit": {
11381 "type": "string",
11382 "nullable": true
11383 },
11384 "isMedicalOnly": {
11385 "type": "boolean",
11386 "nullable": true
11387 },
11388 "isTaxable": {
11389 "type": "boolean",
11390 "nullable": true
11391 },
11392 "regulatoryCategory": {
11393 "type": "string",
11394 "nullable": true
11395 },
11396 "ndc": {
11397 "type": "string",
11398 "nullable": true
11399 },
11400 "daysSupply": {
11401 "type": "number",
11402 "format": "double",
11403 "nullable": true
11404 },
11405 "illinoisTaxCategory": {
11406 "type": "string",
11407 "nullable": true
11408 },
11409 "externalCategory": {
11410 "type": "string",
11411 "nullable": true
11412 },
11413 "externalId": {
11414 "$ref": "#/components/schemas/StringOptional"
11415 },
11416 "syncExternally": {
11417 "type": "boolean",
11418 "nullable": true
11419 },
11420 "bypassExternalUpdate": {
11421 "type": "boolean",
11422 "nullable": true
11423 },
11424 "administrationMethod": {
11425 "$ref": "#/components/schemas/StringOptional"
11426 },
11427 "unitCBDContentDose": {
11428 "$ref": "#/components/schemas/DecimalNullableOptional"
11429 },
11430 "unitTHCContentDose": {
11431 "$ref": "#/components/schemas/DecimalNullableOptional"
11432 },
11433 "oilVolume": {
11434 "$ref": "#/components/schemas/DecimalNullableOptional"
11435 },
11436 "ingredientList": {
11437 "$ref": "#/components/schemas/StringOptional"
11438 },
11439 "expirationDays": {
11440 "$ref": "#/components/schemas/Int32NullableOptional"
11441 },
11442 "abbreviation": {
11443 "$ref": "#/components/schemas/StringOptional"
11444 },
11445 "isTestProduct": {
11446 "$ref": "#/components/schemas/BooleanOptional"
11447 },
11448 "isFinished": {
11449 "$ref": "#/components/schemas/BooleanOptional"
11450 },
11451 "allowAutomaticDiscounts": {
11452 "$ref": "#/components/schemas/BooleanOptional"
11453 },
11454 "servingSize": {
11455 "$ref": "#/components/schemas/StringOptional"
11456 },
11457 "servingSizePerUnit": {
11458 "$ref": "#/components/schemas/Int32NullableOptional"
11459 },
11460 "isNutrient": {
11461 "$ref": "#/components/schemas/BooleanOptional"
11462 },
11463 "approvalDateUTC": {
11464 "$ref": "#/components/schemas/DateTimeNullableOptional"
11465 },
11466 "customMetadata": {
11467 "$ref": "#/components/schemas/StringOptional"
11468 },
11469 "taxCategories": {
11470 "type": "array",
11471 "items": {
11472 "type": "string"
11473 },
11474 "description": "List of strings of tax categories that the product belongs to.",
11475 "nullable": true
11476 },
11477 "pricingDetails": {
11478 "$ref": "#/components/schemas/PricingDetail"
11479 },
11480 "userName": {
11481 "type": "string",
11482 "description": "UserName of the user making the product change\nThis will be used when authorizing with traceability systems (METRC/BioTrack) - if not included or NULL is specified, the traceability integration's \"master key\" will be used, if possible.\nThis field is only relevant if the request is setting SyncExternally to true",
11483 "nullable": true
11484 },
11485 "instructions": {
11486 "type": "string",
11487 "nullable": true
11488 },
11489 "upc": {
11490 "type": "string",
11491 "nullable": true
11492 },
11493 "regulatoryName": {
11494 "$ref": "#/components/schemas/StringOptional"
11495 },
11496 "broadcast": {
11497 "$ref": "#/components/schemas/BooleanOptional"
11498 }
11499 },
11500 "additionalProperties": false,
11501 "description": "Product upload model for creating and updating products.\n\n⚠️ **DATA LOSS WARNING**: Most fields will be overwritten with null/zero if not provided.\n**RECOMMENDED**: Use GET /products first, modify needed fields, then POST the complete object."
11502 },
11503 "ProductEffect": {
11504 "type": "object",
11505 "properties": {
11506 "effectId": {
11507 "type": "integer",
11508 "format": "int32"
11509 },
11510 "effectName": {
11511 "type": "string",
11512 "nullable": true
11513 },
11514 "productId": {
11515 "type": "integer",
11516 "format": "int32"
11517 }
11518 },
11519 "additionalProperties": false
11520 },
11521 "ProductTag": {
11522 "type": "object",
11523 "properties": {
11524 "tagId": {
11525 "type": "integer",
11526 "format": "int32"
11527 },
11528 "tagName": {
11529 "type": "string",
11530 "nullable": true
11531 },
11532 "productId": {
11533 "type": "integer",
11534 "format": "int32"
11535 }
11536 },
11537 "additionalProperties": false
11538 },
11539 "PublishedDiscount": {
11540 "type": "object",
11541 "properties": {
11542 "discountId": {
11543 "type": "integer",
11544 "description": "Unique identifier for the discount.",
11545 "format": "int32"
11546 },
11547 "discountName": {
11548 "type": "string",
11549 "description": "Display name of the discount for customer-facing applications.",
11550 "nullable": true
11551 },
11552 "discountAmount": {
11553 "type": "number",
11554 "description": "Monetary discount amount or percentage value.",
11555 "format": "double"
11556 },
11557 "discountCode": {
11558 "type": "string",
11559 "description": "Promotional code required to apply the discount (optional).",
11560 "nullable": true
11561 },
11562 "discountType": {
11563 "type": "string",
11564 "description": "Type classification of the discount (e.g., percentage, fixed amount).",
11565 "nullable": true
11566 },
11567 "discountMethod": {
11568 "type": "string",
11569 "description": "Method used to apply the discount (e.g., automatic, code required).",
11570 "nullable": true
11571 },
11572 "isActive": {
11573 "type": "boolean",
11574 "description": "Indicates if the discount is currently active and available."
11575 },
11576 "validFrom": {
11577 "type": "string",
11578 "description": "Start date and time when discount becomes valid (UTC converted from Eastern Time).",
11579 "format": "date-time",
11580 "nullable": true
11581 },
11582 "validUntil": {
11583 "type": "string",
11584 "description": "End date and time when discount expires (UTC converted from Eastern Time).",
11585 "format": "date-time",
11586 "nullable": true
11587 },
11588 "thresholdType": {
11589 "type": "string",
11590 "description": "Type of threshold requirement for discount eligibility (optional).",
11591 "nullable": true
11592 },
11593 "minimumItemsRequired": {
11594 "type": "number",
11595 "description": "Minimum number of qualifying items required for discount application (optional).",
11596 "format": "double",
11597 "nullable": true
11598 },
11599 "maximumItemsAllowed": {
11600 "type": "number",
11601 "description": "Maximum number of items that can receive the discount (optional).",
11602 "format": "double",
11603 "nullable": true
11604 },
11605 "maximumUsageCount": {
11606 "type": "number",
11607 "description": "Maximum number of times this discount can be used (optional).",
11608 "format": "double",
11609 "nullable": true
11610 },
11611 "includeNonCannabis": {
11612 "type": "boolean",
11613 "description": "Indicates if discount applies to non-cannabis products."
11614 },
11615 "firstTimeCustomerOnly": {
11616 "type": "boolean",
11617 "description": "Indicates if discount is restricted to first-time customers only."
11618 },
11619 "stackOnOtherDiscounts": {
11620 "type": "boolean",
11621 "description": "Indicates if discount can be combined with other discounts."
11622 },
11623 "weeklyRecurrenceInfo": {
11624 "$ref": "#/components/schemas/WeeklyRecurrenceInfo"
11625 },
11626 "products": {
11627 "$ref": "#/components/schemas/DiscountRestriction"
11628 },
11629 "productCategories": {
11630 "$ref": "#/components/schemas/DiscountRestriction"
11631 },
11632 "brands": {
11633 "$ref": "#/components/schemas/DiscountRestriction"
11634 },
11635 "vendors": {
11636 "$ref": "#/components/schemas/DiscountRestriction"
11637 },
11638 "strains": {
11639 "$ref": "#/components/schemas/DiscountRestriction"
11640 },
11641 "tiers": {
11642 "$ref": "#/components/schemas/DiscountRestriction"
11643 },
11644 "tags": {
11645 "$ref": "#/components/schemas/DiscountRestriction"
11646 },
11647 "inventoryTags": {
11648 "$ref": "#/components/schemas/DiscountRestriction"
11649 },
11650 "customerTypes": {
11651 "$ref": "#/components/schemas/DiscountRestriction"
11652 },
11653 "discountGroups": {
11654 "type": "array",
11655 "items": {
11656 "$ref": "#/components/schemas/DiscountGroup"
11657 },
11658 "description": "Associated discount groups for bundling and organization (loaded conditionally).",
11659 "nullable": true
11660 }
11661 },
11662 "additionalProperties": false,
11663 "description": "Published discount model containing complete discount configuration and constraint information for customer-facing applications."
11664 },
11665 "PurchaseOrderData": {
11666 "type": "object",
11667 "properties": {
11668 "purchaseOrderId": {
11669 "type": "integer",
11670 "format": "int32"
11671 },
11672 "expectedArrivalDate": {
11673 "type": "string",
11674 "format": "date-time",
11675 "nullable": true
11676 },
11677 "title": {
11678 "type": "string",
11679 "nullable": true
11680 },
11681 "dateReceived": {
11682 "type": "string",
11683 "format": "date-time",
11684 "nullable": true
11685 },
11686 "dateSubmitted": {
11687 "type": "string",
11688 "format": "date-time",
11689 "nullable": true
11690 },
11691 "shippingInformation": {
11692 "type": "string",
11693 "nullable": true
11694 },
11695 "vendorId": {
11696 "type": "integer",
11697 "format": "int32"
11698 },
11699 "vendorName": {
11700 "type": "string",
11701 "nullable": true
11702 },
11703 "vendorContact": {
11704 "type": "string",
11705 "nullable": true
11706 },
11707 "status": {
11708 "type": "string",
11709 "nullable": true
11710 },
11711 "purchaseOrderNumber": {
11712 "type": "integer",
11713 "format": "int32"
11714 },
11715 "createdByUser": {
11716 "type": "string",
11717 "nullable": true
11718 },
11719 "dateCreated": {
11720 "type": "string",
11721 "format": "date-time",
11722 "nullable": true
11723 },
11724 "purchaseOrderItems": {
11725 "type": "array",
11726 "items": {
11727 "$ref": "#/components/schemas/PurchaseOrderItemDetail"
11728 },
11729 "nullable": true
11730 }
11731 },
11732 "additionalProperties": false
11733 },
11734 "PurchaseOrderItemDetail": {
11735 "type": "object",
11736 "properties": {
11737 "purchaseOrderId": {
11738 "type": "integer",
11739 "format": "int32"
11740 },
11741 "purchaseOrderItemId": {
11742 "type": "integer",
11743 "format": "int32"
11744 },
11745 "productId": {
11746 "type": "integer",
11747 "format": "int32"
11748 },
11749 "productName": {
11750 "type": "string",
11751 "nullable": true
11752 },
11753 "quantity": {
11754 "type": "integer",
11755 "format": "int32"
11756 },
11757 "unitId": {
11758 "type": "integer",
11759 "format": "int32"
11760 },
11761 "unitName": {
11762 "type": "string",
11763 "nullable": true
11764 },
11765 "unitNameAbbreviation": {
11766 "type": "string",
11767 "nullable": true
11768 },
11769 "subtotal": {
11770 "type": "number",
11771 "format": "double"
11772 },
11773 "tax": {
11774 "type": "number",
11775 "format": "double"
11776 }
11777 },
11778 "additionalProperties": false
11779 },
11780 "ReceiveInventoryItemSave": {
11781 "required": ["productId", "quantity"],
11782 "type": "object",
11783 "properties": {
11784 "productId": {
11785 "type": "integer",
11786 "description": "Product identifier for the cannabis product being received into inventory (required).",
11787 "format": "int32"
11788 },
11789 "quantity": {
11790 "type": "number",
11791 "description": "Quantity of the product being received into inventory (required).",
11792 "format": "double"
11793 },
11794 "unitType": {
11795 "type": "string",
11796 "description": "Unit type for the received quantity (qty; ml; g; Gal; L; lb; mg; oz; fl oz; kg).",
11797 "nullable": true
11798 },
11799 "flowerEquivalent": {
11800 "type": "number",
11801 "description": "Flower equivalent weight for regulatory compliance and limit calculations.",
11802 "format": "double",
11803 "nullable": true
11804 },
11805 "recFlowerEquivalent": {
11806 "type": "number",
11807 "description": "Recreational flower equivalent weight for regulatory compliance tracking.",
11808 "format": "double",
11809 "nullable": true
11810 },
11811 "vendorId": {
11812 "type": "integer",
11813 "description": "Vendor identifier for supply chain tracking and vendor management.",
11814 "format": "int32",
11815 "nullable": true
11816 },
11817 "roomId": {
11818 "type": "integer",
11819 "description": "Room identifier for facility location assignment and space management.",
11820 "format": "int32",
11821 "nullable": true
11822 },
11823 "packageId": {
11824 "type": "string",
11825 "description": "Package identifier from state tracking system for compliance documentation.",
11826 "nullable": true
11827 },
11828 "lot": {
11829 "type": "string",
11830 "description": "Lot number for batch tracking and quality control management.",
11831 "nullable": true
11832 },
11833 "cost": {
11834 "type": "number",
11835 "description": "Unit cost for inventory valuation and cost accounting.",
11836 "format": "double",
11837 "nullable": true
11838 },
11839 "price": {
11840 "type": "number",
11841 "description": "General retail price for the received inventory item.",
11842 "format": "double",
11843 "nullable": true
11844 },
11845 "recPrice": {
11846 "type": "number",
11847 "description": "Recreational market price for dual-license operations.",
11848 "format": "double",
11849 "nullable": true
11850 },
11851 "tax": {
11852 "type": "number",
11853 "description": "Tax amount for financial compliance and tax reporting.",
11854 "format": "double",
11855 "nullable": true
11856 },
11857 "expirationDate": {
11858 "type": "string",
11859 "description": "Product expiration date for inventory rotation and compliance management.",
11860 "format": "date-time",
11861 "nullable": true
11862 },
11863 "tags": {
11864 "type": "array",
11865 "items": {
11866 "type": "integer",
11867 "format": "int32"
11868 },
11869 "description": "Collection of tag identifiers for product categorization and organization.",
11870 "nullable": true
11871 },
11872 "cultivationTax": {
11873 "type": "number",
11874 "description": "Cultivation tax amount for cannabis-specific tax compliance.",
11875 "format": "double",
11876 "nullable": true
11877 },
11878 "tableId": {
11879 "type": "integer",
11880 "description": "Table identifier within the room for precise location tracking.",
11881 "format": "int32",
11882 "nullable": true
11883 },
11884 "sourceAllocatedInventoryId": {
11885 "type": "integer",
11886 "description": "Source allocated inventory identifier for traceability and audit trails.",
11887 "format": "int32",
11888 "nullable": true
11889 },
11890 "totalPackageCost": {
11891 "type": "number",
11892 "description": "Total package cost for comprehensive cost allocation and accounting.",
11893 "format": "double",
11894 "nullable": true
11895 },
11896 "getMetrcLabResults": {
11897 "type": "boolean",
11898 "description": "Flag to retrieve lab results from Metrc for compliance integration.",
11899 "nullable": true
11900 },
11901 "productName": {
11902 "type": "string",
11903 "description": "Product name for inventory identification and display purposes.",
11904 "nullable": true
11905 },
11906 "packagingDate": {
11907 "type": "string",
11908 "description": "Date when the product was packaged for shelf life tracking.",
11909 "format": "date-time",
11910 "nullable": true
11911 },
11912 "manufacturingDate": {
11913 "type": "string",
11914 "description": "Date when the product was manufactured for quality control tracking.",
11915 "format": "date-time",
11916 "nullable": true
11917 },
11918 "producerId": {
11919 "type": "integer",
11920 "description": "Producer identifier for supply chain tracking and compliance documentation.",
11921 "format": "int32",
11922 "nullable": true
11923 },
11924 "externalPackageId": {
11925 "type": "string",
11926 "description": "External package identifier for cross-system integration and tracking.",
11927 "nullable": true
11928 },
11929 "potencyIndicator": {
11930 "type": "string",
11931 "description": "Potency indicator for product strength classification and customer information.",
11932 "nullable": true
11933 }
11934 },
11935 "additionalProperties": false,
11936 "description": "Request model for receiving and recording new cannabis inventory items into the facility management system."
11937 },
11938 "ReceiveInventorySave": {
11939 "required": ["deliveredOn"],
11940 "type": "object",
11941 "properties": {
11942 "vendorId": {
11943 "type": "integer",
11944 "description": "Vendor identifier for the supplier (optional, can be resolved from VendorLicense).",
11945 "format": "int32",
11946 "nullable": true
11947 },
11948 "deliveredBy": {
11949 "type": "string",
11950 "description": "Name of the person who delivered the inventory shipment.",
11951 "nullable": true
11952 },
11953 "deliveredOn": {
11954 "type": "string",
11955 "description": "Date and time when the inventory was delivered (required).",
11956 "format": "date-time"
11957 },
11958 "vendorLicense": {
11959 "type": "string",
11960 "description": "Vendor license code for compliance tracking and vendor identification.",
11961 "nullable": true
11962 },
11963 "transactionId": {
11964 "type": "string",
11965 "description": "External transaction reference ID for tracking and reconciliation.",
11966 "nullable": true
11967 },
11968 "orderTitle": {
11969 "type": "string",
11970 "description": "Descriptive title for the receive order for identification purposes.",
11971 "nullable": true
11972 },
11973 "externalId": {
11974 "type": "string",
11975 "description": "External system ID for preventing duplicate receives (must be unique).",
11976 "nullable": true
11977 },
11978 "note": {
11979 "type": "string",
11980 "description": "Additional notes or comments about the receive transaction.",
11981 "nullable": true
11982 },
11983 "items": {
11984 "type": "array",
11985 "items": {
11986 "$ref": "#/components/schemas/ReceiveInventoryItemSave"
11987 },
11988 "description": "Collection of inventory items being received in this transaction.",
11989 "nullable": true
11990 },
11991 "receiveIntoInventory": {
11992 "type": "boolean",
11993 "description": "Indicates whether to immediately process items into inventory (true) or save as draft (false).",
11994 "nullable": true
11995 },
11996 "userId": {
11997 "type": "integer",
11998 "description": "User ID for processing the receive (required when ReceiveIntoInventory=true).",
11999 "format": "int32",
12000 "nullable": true
12001 },
12002 "userName": {
12003 "type": "string",
12004 "description": "Username for processing the receive (alternative to UserId, required when ReceiveIntoInventory=true).",
12005 "nullable": true
12006 }
12007 },
12008 "additionalProperties": false,
12009 "description": "Request model for creating inventory receive orders for incoming transfers, purchase orders, or direct inventory additions."
12010 },
12011 "ReceivedInventory": {
12012 "type": "object",
12013 "properties": {
12014 "receiveInventoryHistoryId": {
12015 "type": "integer",
12016 "description": "Unique identifier for the receive inventory transaction.",
12017 "format": "int32"
12018 },
12019 "title": {
12020 "type": "string",
12021 "description": "Descriptive title for the receive order for identification purposes.",
12022 "nullable": true
12023 },
12024 "status": {
12025 "type": "string",
12026 "description": "Current processing status of the receive order (e.g., \"Pending\", \"Completed\", \"Failed\").",
12027 "nullable": true
12028 },
12029 "failureMessage": {
12030 "type": "string",
12031 "description": "Error message if the receive order failed processing (optional).",
12032 "nullable": true
12033 },
12034 "deliveredOn": {
12035 "type": "string",
12036 "description": "Date and time when the inventory was delivered by the vendor (optional).",
12037 "format": "date-time",
12038 "nullable": true
12039 },
12040 "addedOn": {
12041 "type": "string",
12042 "description": "Date and time when the receive order was created in the system (optional).",
12043 "format": "date-time",
12044 "nullable": true
12045 },
12046 "vendor": {
12047 "type": "string",
12048 "description": "Name of the vendor who supplied the inventory.",
12049 "nullable": true
12050 },
12051 "vendorLicense": {
12052 "type": "string",
12053 "description": "Vendor license code for compliance tracking and verification.",
12054 "nullable": true
12055 },
12056 "items": {
12057 "type": "array",
12058 "items": {
12059 "$ref": "#/components/schemas/ReceivedInventoryItem"
12060 },
12061 "description": "Collection of inventory items included in this receive order.",
12062 "nullable": true
12063 }
12064 },
12065 "additionalProperties": false,
12066 "description": "Received inventory record model representing completed or pending inventory receive orders and their processing status."
12067 },
12068 "ReceivedInventoryItem": {
12069 "type": "object",
12070 "properties": {
12071 "product": {
12072 "type": "string",
12073 "description": "Product name for inventory item identification and display.",
12074 "nullable": true
12075 },
12076 "sku": {
12077 "type": "string",
12078 "description": "Stock Keeping Unit (SKU) for product identification and retail operations.",
12079 "nullable": true
12080 },
12081 "productId": {
12082 "type": "integer",
12083 "description": "Product identifier for database references and system integration.",
12084 "format": "int32",
12085 "nullable": true
12086 },
12087 "type": {
12088 "type": "string",
12089 "description": "Product type classification for cannabis product categorization.",
12090 "nullable": true
12091 },
12092 "quantity": {
12093 "type": "number",
12094 "description": "Quantity of the received inventory item for stock tracking.",
12095 "format": "double"
12096 },
12097 "unitAbbreviation": {
12098 "type": "string",
12099 "description": "Unit abbreviation for quantity measurement display (e.g., \"g\", \"oz\", \"ml\").",
12100 "nullable": true
12101 },
12102 "unit": {
12103 "type": "string",
12104 "description": "Full unit name for quantity measurement (e.g., \"grams\", \"ounces\", \"milliliters\").",
12105 "nullable": true
12106 },
12107 "unitCost": {
12108 "type": "number",
12109 "description": "Cost per unit for inventory valuation and financial accounting.",
12110 "format": "double"
12111 },
12112 "unitTax": {
12113 "type": "number",
12114 "description": "Tax amount per unit for cannabis tax compliance and reporting.",
12115 "format": "double"
12116 },
12117 "totalCost": {
12118 "type": "number",
12119 "description": "Total cost for the received inventory item including all taxes and fees.",
12120 "format": "double"
12121 },
12122 "packageId": {
12123 "type": "string",
12124 "description": "Package identifier from state tracking system for compliance documentation.",
12125 "nullable": true
12126 },
12127 "externalPackageId": {
12128 "type": "string",
12129 "description": "External package identifier for cross-system tracking and integration.",
12130 "nullable": true
12131 },
12132 "batchName": {
12133 "type": "string",
12134 "description": "Batch name for lot tracking and quality control management.",
12135 "nullable": true
12136 },
12137 "batchId": {
12138 "type": "integer",
12139 "description": "Batch identifier for database references and batch tracking.",
12140 "format": "int32",
12141 "nullable": true
12142 },
12143 "room": {
12144 "type": "string",
12145 "description": "Room name for facility location identification and display.",
12146 "nullable": true
12147 },
12148 "roomId": {
12149 "type": "integer",
12150 "description": "Room identifier for database references and location tracking.",
12151 "format": "int32",
12152 "nullable": true
12153 }
12154 },
12155 "additionalProperties": false,
12156 "description": "Response model representing received cannabis inventory items with complete tracking and financial information."
12157 },
12158 "RegisterAdjustment": {
12159 "type": "object",
12160 "properties": {
12161 "adjustmentId": {
12162 "type": "integer",
12163 "description": "Unique identifier for the register adjustment transaction.\nPrimary key for tracking and referencing specific adjustment records.",
12164 "format": "int32"
12165 },
12166 "adjustmentType": {
12167 "type": "string",
12168 "description": "Type of register adjustment being performed.\nCommon values include \"Adjustment\", \"Close Out\", \"Deposit\", \"Withdrawal\", \"Cash Drop\".",
12169 "nullable": true
12170 },
12171 "adjustmentAmount": {
12172 "type": "number",
12173 "description": "Dollar amount of the register adjustment (positive or negative).\nPositive values indicate cash added to register, negative values indicate cash removed.",
12174 "format": "double"
12175 },
12176 "adjustedBy": {
12177 "type": "string",
12178 "description": "Name of the employee who performed the register adjustment.\nUsed for accountability and audit trail purposes.",
12179 "nullable": true
12180 },
12181 "adjustedOn": {
12182 "type": "string",
12183 "description": "Date and time when the register adjustment was performed (optional).\nTimestamp for audit trail and reconciliation purposes.",
12184 "format": "date-time",
12185 "nullable": true
12186 },
12187 "terminalName": {
12188 "type": "string",
12189 "description": "Name of the register/terminal where the adjustment occurred.\nIdentifies which physical register or point-of-sale terminal was adjusted.",
12190 "nullable": true
12191 },
12192 "terminalId": {
12193 "type": "integer",
12194 "description": "Unique identifier for the register/terminal where the adjustment occurred.\nNumeric identifier for the specific point-of-sale terminal.",
12195 "format": "int32"
12196 },
12197 "adjustedByEmployeeId": {
12198 "type": "integer",
12199 "description": "Employee ID of the staff member who performed the adjustment.\nNumeric identifier linking to the employee record for accountability.",
12200 "format": "int32"
12201 },
12202 "adjustmentReason": {
12203 "type": "string",
12204 "description": "Reason code or description for why the adjustment was made.\nProvides business justification for the cash adjustment.",
12205 "nullable": true
12206 },
12207 "comment": {
12208 "type": "string",
12209 "description": "Additional comments or notes about the register adjustment (optional).\nFree-text field for additional details or explanations.",
12210 "nullable": true
12211 }
12212 },
12213 "additionalProperties": false,
12214 "description": "Represents a register cash adjustment transaction record for financial reconciliation and audit trails.\n\nRegister adjustments include manual cash corrections, deposits, withdrawals, close-outs, and other\ncash management activities that affect register balances. Each adjustment maintains a complete\naudit trail with employee accountability and reason tracking."
12215 },
12216 "RegisterCashSummary": {
12217 "type": "object",
12218 "properties": {
12219 "terminalName": {
12220 "type": "string",
12221 "description": "Name of the register/terminal for which this cash summary applies.\nIdentifies the specific point-of-sale terminal or register location.",
12222 "nullable": true
12223 },
12224 "startingBalance": {
12225 "type": "number",
12226 "description": "Starting cash balance for the register at the beginning of the period.\nBase amount of cash in the register before any transactions occurred.",
12227 "format": "double"
12228 },
12229 "endingBalance": {
12230 "type": "number",
12231 "description": "Ending cash balance for the register at the end of the period.\nFinal amount of cash in the register after all transactions and adjustments.",
12232 "format": "double"
12233 },
12234 "sales": {
12235 "type": "number",
12236 "description": "Total cash sales processed through the register during the period.\nIncludes all cash payments received for customer transactions.",
12237 "format": "double"
12238 },
12239 "returns": {
12240 "type": "number",
12241 "description": "Total cash refunds and returns processed during the period.\nRepresents cash paid out to customers for returned merchandise.",
12242 "format": "double"
12243 },
12244 "deposits": {
12245 "type": "number",
12246 "description": "Total cash deposits added to the register during the period.\nIncludes cash added to the register for operational purposes.",
12247 "format": "double"
12248 },
12249 "adjustments": {
12250 "type": "number",
12251 "description": "Total register adjustments (positive or negative) made during the period.\nIncludes manual cash corrections, withdrawals, and balancing entries.",
12252 "format": "double"
12253 },
12254 "overShort": {
12255 "type": "number",
12256 "description": "Cash variance (over or short) compared to expected register balance.\nPositive values indicate cash overage, negative values indicate shortage.",
12257 "format": "double"
12258 }
12259 },
12260 "additionalProperties": false,
12261 "description": "Represents a comprehensive cash flow summary for a specific register terminal.\n\nThis model provides real-time cash reconciliation data including starting balances,\ntransaction activity, and variance calculations for cash management and balancing\npurposes. Used for end-of-shift reconciliation and cash discrepancy identification."
12262 },
12263 "RegisterTransaction": {
12264 "type": "object",
12265 "properties": {
12266 "registerTransactionId": {
12267 "type": "integer",
12268 "description": "Unique identifier for the register transaction record.\nPrimary key for tracking and referencing specific transaction activities.",
12269 "format": "int32"
12270 },
12271 "transactionType": {
12272 "type": "string",
12273 "description": "Type of register transaction being recorded.\nExamples include \"Sale\", \"Adjustment\", \"Close Out\", \"Deposit\", \"Withdrawal\", \"Return\", \"Payment\".",
12274 "nullable": true
12275 },
12276 "transactionAmount": {
12277 "type": "number",
12278 "description": "Dollar amount of the register transaction (positive or negative).\nRepresents the financial impact of the transaction on register balances.",
12279 "format": "double"
12280 },
12281 "transactionBy": {
12282 "type": "string",
12283 "description": "Name of the employee who processed the register transaction.\nUsed for accountability and performance tracking.",
12284 "nullable": true
12285 },
12286 "transactionDateUTC": {
12287 "type": "string",
12288 "description": "Date and time when the register transaction occurred in UTC (optional).\nTimestamp for audit trail and financial reconciliation purposes.",
12289 "format": "date-time",
12290 "nullable": true
12291 },
12292 "transactionId": {
12293 "type": "integer",
12294 "description": "Reference to the associated business transaction ID (optional).\nLinks register activity to customer sales transactions when applicable.",
12295 "format": "int32",
12296 "nullable": true
12297 },
12298 "terminalName": {
12299 "type": "string",
12300 "description": "Name of the register/terminal where the transaction was processed.\nIdentifies which physical register or point-of-sale terminal handled the transaction.",
12301 "nullable": true
12302 },
12303 "terminalId": {
12304 "type": "integer",
12305 "description": "Unique identifier for the register/terminal where the transaction occurred.\nNumeric identifier for the specific point-of-sale terminal.",
12306 "format": "int32"
12307 },
12308 "transactionByEmployeeId": {
12309 "type": "integer",
12310 "description": "Employee ID of the staff member who processed the transaction.\nNumeric identifier linking to the employee record for accountability tracking.",
12311 "format": "int32"
12312 },
12313 "adjustmentReason": {
12314 "type": "string",
12315 "description": "Reason code or description for adjustment transactions (optional).\nProvides business justification when the transaction is an adjustment or correction.",
12316 "nullable": true
12317 },
12318 "comment": {
12319 "type": "string",
12320 "description": "Additional comments or notes about the register transaction (optional).\nFree-text field for additional context or explanations.",
12321 "nullable": true
12322 }
12323 },
12324 "additionalProperties": false,
12325 "description": "Represents a comprehensive register transaction record including sales, adjustments, and cash management activities.\n\nThis model encompasses all types of register activity including customer sales transactions, cash adjustments,\npayment processing, register maintenance, and operational activities. Each transaction maintains complete\naudit trails with employee accountability and detailed financial information."
12326 },
12327 "RegulatoryCategory": {
12328 "type": "object",
12329 "properties": {
12330 "regulatoryCategoryId": {
12331 "type": "integer",
12332 "description": "Unique identifier for the regulatory category.",
12333 "format": "int32"
12334 },
12335 "regulatoryCategoryName": {
12336 "type": "string",
12337 "description": "Display name of the regulatory category as defined by state cannabis regulations.",
12338 "nullable": true
12339 }
12340 },
12341 "additionalProperties": false,
12342 "description": "Regulatory category model containing state-mandated product classification information for cannabis compliance and reporting."
12343 },
12344 "ReportingDiscountDetail": {
12345 "type": "object",
12346 "properties": {
12347 "isAvailableOnline": {
12348 "type": "boolean",
12349 "description": "Indicates if discount is available for online/e-commerce ordering."
12350 },
12351 "applicationMethod": {
12352 "type": "string",
12353 "description": "Method used to apply the discount in the system.",
12354 "nullable": true
12355 },
12356 "externalId": {
12357 "type": "string",
12358 "description": "External system identifier for integration mapping.",
12359 "nullable": true
12360 },
12361 "requireManagerApproval": {
12362 "type": "boolean",
12363 "description": "Indicates if discount application requires manager approval."
12364 },
12365 "isDeleted": {
12366 "type": "boolean",
12367 "description": "Indicates if discount has been marked as deleted."
12368 },
12369 "appliesToLocations": {
12370 "type": "array",
12371 "items": {
12372 "$ref": "#/components/schemas/LocationMapping"
12373 },
12374 "description": "Collection of location mappings where this discount applies.",
12375 "nullable": true
12376 },
12377 "discountId": {
12378 "type": "integer",
12379 "description": "Unique identifier for the discount.",
12380 "format": "int32"
12381 },
12382 "discountName": {
12383 "type": "string",
12384 "description": "Display name of the discount for customer-facing applications.",
12385 "nullable": true
12386 },
12387 "discountAmount": {
12388 "type": "number",
12389 "description": "Monetary discount amount or percentage value.",
12390 "format": "double"
12391 },
12392 "discountCode": {
12393 "type": "string",
12394 "description": "Promotional code required to apply the discount (optional).",
12395 "nullable": true
12396 },
12397 "discountType": {
12398 "type": "string",
12399 "description": "Type classification of the discount (e.g., percentage, fixed amount).",
12400 "nullable": true
12401 },
12402 "discountMethod": {
12403 "type": "string",
12404 "description": "Method used to apply the discount (e.g., automatic, code required).",
12405 "nullable": true
12406 },
12407 "isActive": {
12408 "type": "boolean",
12409 "description": "Indicates if the discount is currently active and available."
12410 },
12411 "validFrom": {
12412 "type": "string",
12413 "description": "Start date and time when discount becomes valid (UTC converted from Eastern Time).",
12414 "format": "date-time",
12415 "nullable": true
12416 },
12417 "validUntil": {
12418 "type": "string",
12419 "description": "End date and time when discount expires (UTC converted from Eastern Time).",
12420 "format": "date-time",
12421 "nullable": true
12422 },
12423 "thresholdType": {
12424 "type": "string",
12425 "description": "Type of threshold requirement for discount eligibility (optional).",
12426 "nullable": true
12427 },
12428 "minimumItemsRequired": {
12429 "type": "number",
12430 "description": "Minimum number of qualifying items required for discount application (optional).",
12431 "format": "double",
12432 "nullable": true
12433 },
12434 "maximumItemsAllowed": {
12435 "type": "number",
12436 "description": "Maximum number of items that can receive the discount (optional).",
12437 "format": "double",
12438 "nullable": true
12439 },
12440 "maximumUsageCount": {
12441 "type": "number",
12442 "description": "Maximum number of times this discount can be used (optional).",
12443 "format": "double",
12444 "nullable": true
12445 },
12446 "includeNonCannabis": {
12447 "type": "boolean",
12448 "description": "Indicates if discount applies to non-cannabis products."
12449 },
12450 "firstTimeCustomerOnly": {
12451 "type": "boolean",
12452 "description": "Indicates if discount is restricted to first-time customers only."
12453 },
12454 "stackOnOtherDiscounts": {
12455 "type": "boolean",
12456 "description": "Indicates if discount can be combined with other discounts."
12457 },
12458 "weeklyRecurrenceInfo": {
12459 "$ref": "#/components/schemas/WeeklyRecurrenceInfo"
12460 },
12461 "products": {
12462 "$ref": "#/components/schemas/DiscountRestriction"
12463 },
12464 "productCategories": {
12465 "$ref": "#/components/schemas/DiscountRestriction"
12466 },
12467 "brands": {
12468 "$ref": "#/components/schemas/DiscountRestriction"
12469 },
12470 "vendors": {
12471 "$ref": "#/components/schemas/DiscountRestriction"
12472 },
12473 "strains": {
12474 "$ref": "#/components/schemas/DiscountRestriction"
12475 },
12476 "tiers": {
12477 "$ref": "#/components/schemas/DiscountRestriction"
12478 },
12479 "tags": {
12480 "$ref": "#/components/schemas/DiscountRestriction"
12481 },
12482 "inventoryTags": {
12483 "$ref": "#/components/schemas/DiscountRestriction"
12484 },
12485 "customerTypes": {
12486 "$ref": "#/components/schemas/DiscountRestriction"
12487 },
12488 "discountGroups": {
12489 "type": "array",
12490 "items": {
12491 "$ref": "#/components/schemas/DiscountGroup"
12492 },
12493 "description": "Associated discount groups for bundling and organization (loaded conditionally).",
12494 "nullable": true
12495 }
12496 },
12497 "additionalProperties": false,
12498 "description": "Extended discount model with additional reporting and administrative properties for internal operations."
12499 },
12500 "ReportingInventoryItem": {
12501 "type": "object",
12502 "properties": {
12503 "unitWeightUnit": {
12504 "type": "string",
12505 "description": "Unit of measurement for unit weight, always \"g\" (grams).",
12506 "nullable": true
12507 },
12508 "unitCost": {
12509 "type": "number",
12510 "description": "Unit cost of the inventory item for cost of goods sold calculations (in USD).",
12511 "format": "double",
12512 "nullable": true
12513 },
12514 "allocatedQuantity": {
12515 "type": "number",
12516 "description": "Quantity of inventory allocated to orders or transfers but not yet fulfilled.",
12517 "format": "double",
12518 "nullable": true
12519 },
12520 "inventoryId": {
12521 "type": "integer",
12522 "description": "Unique inventory record identifier for this specific inventory item.",
12523 "format": "int32"
12524 },
12525 "productId": {
12526 "type": "integer",
12527 "description": "Product identifier linking this inventory to the product catalog.",
12528 "format": "int32"
12529 },
12530 "sku": {
12531 "type": "string",
12532 "description": "Stock Keeping Unit (SKU) code for inventory tracking and identification.",
12533 "nullable": true
12534 },
12535 "productName": {
12536 "type": "string",
12537 "description": "Display name of the product for customer-facing applications.",
12538 "nullable": true
12539 },
12540 "description": {
12541 "type": "string",
12542 "description": "Detailed product description including effects, characteristics, and usage information.",
12543 "nullable": true
12544 },
12545 "categoryId": {
12546 "type": "integer",
12547 "description": "Category identifier for product classification (optional).",
12548 "format": "int32",
12549 "nullable": true
12550 },
12551 "category": {
12552 "type": "string",
12553 "description": "Category name for product classification and filtering.",
12554 "nullable": true
12555 },
12556 "imageUrl": {
12557 "type": "string",
12558 "description": "URL path to product image for display purposes.",
12559 "nullable": true
12560 },
12561 "quantityAvailable": {
12562 "type": "number",
12563 "description": "Current available quantity for sale or transfer.",
12564 "format": "double"
12565 },
12566 "quantityUnits": {
12567 "type": "string",
12568 "description": "Unit of measurement for the available quantity (e.g., \"g\", \"mg\", \"ea\").",
12569 "nullable": true
12570 },
12571 "unitWeight": {
12572 "type": "number",
12573 "description": "Weight per unit in grams for dosing and compliance calculations.",
12574 "format": "double"
12575 },
12576 "flowerEquivalent": {
12577 "type": "number",
12578 "description": "Flower equivalent amount in grams for compliance tracking.",
12579 "format": "double"
12580 },
12581 "recFlowerEquivalent": {
12582 "type": "number",
12583 "description": "Recreational flower equivalent amount in grams (optional).",
12584 "format": "double",
12585 "nullable": true
12586 },
12587 "flowerEquivalentUnits": {
12588 "type": "string",
12589 "description": "Unit of measurement for flower equivalent, always \"g\" (grams).",
12590 "nullable": true,
12591 "readOnly": true
12592 },
12593 "batchId": {
12594 "type": "integer",
12595 "description": "Batch identifier for lot tracking and quality control.",
12596 "format": "int32"
12597 },
12598 "batchName": {
12599 "type": "string",
12600 "description": "Human-readable batch name or lot number for tracking.",
12601 "nullable": true
12602 },
12603 "packageId": {
12604 "type": "string",
12605 "description": "Package identifier for compliance tracking and traceability.",
12606 "nullable": true
12607 },
12608 "packageStatus": {
12609 "type": "string",
12610 "description": "Current status of the package (e.g., \"Active\", \"Testing\", \"Quarantine\").",
12611 "nullable": true
12612 },
12613 "unitPrice": {
12614 "type": "number",
12615 "description": "Base unit price for retail sales.",
12616 "format": "double"
12617 },
12618 "medUnitPrice": {
12619 "type": "number",
12620 "description": "Medical program pricing (optional, different from retail).",
12621 "format": "double",
12622 "nullable": true
12623 },
12624 "recUnitPrice": {
12625 "type": "number",
12626 "description": "Recreational program pricing (optional, different from medical).",
12627 "format": "double",
12628 "nullable": true
12629 },
12630 "strainId": {
12631 "type": "integer",
12632 "description": "Strain identifier for cannabis products (optional).",
12633 "format": "int32",
12634 "nullable": true
12635 },
12636 "strain": {
12637 "type": "string",
12638 "description": "Strain name for cannabis products.",
12639 "nullable": true
12640 },
12641 "strainType": {
12642 "type": "string",
12643 "description": "Cannabis strain classification (Hybrid, Indica, Sativa, CBD).",
12644 "nullable": true
12645 },
12646 "size": {
12647 "type": "string",
12648 "description": "Product size designation for packaging and dosing information.",
12649 "nullable": true
12650 },
12651 "labResults": {
12652 "type": "array",
12653 "items": {
12654 "$ref": "#/components/schemas/LabResult"
12655 },
12656 "description": "Collection of laboratory test results for this batch (included when includeLabResults=true).",
12657 "nullable": true
12658 },
12659 "testedDate": {
12660 "type": "string",
12661 "description": "Date when laboratory testing was completed (optional).",
12662 "format": "date-time",
12663 "nullable": true
12664 },
12665 "sampleDate": {
12666 "type": "string",
12667 "description": "Date when sample was collected for laboratory testing (optional).",
12668 "format": "date-time",
12669 "nullable": true
12670 },
12671 "packagedDate": {
12672 "type": "string",
12673 "description": "Date when product was packaged for distribution (optional).",
12674 "format": "date-time",
12675 "nullable": true
12676 },
12677 "manufacturingDate": {
12678 "type": "string",
12679 "description": "Date when product was manufactured or produced (optional).",
12680 "format": "date-time",
12681 "nullable": true
12682 },
12683 "lastModifiedDateUtc": {
12684 "type": "string",
12685 "description": "Last modification timestamp in UTC for data synchronization.",
12686 "format": "date-time",
12687 "nullable": true
12688 },
12689 "labTestStatus": {
12690 "type": "string",
12691 "description": "Current status of laboratory testing (e.g., \"Passed\", \"Failed\", \"Pending\").",
12692 "nullable": true
12693 },
12694 "vendorId": {
12695 "type": "integer",
12696 "description": "Vendor identifier for the supplier of this inventory (optional).",
12697 "format": "int32",
12698 "nullable": true
12699 },
12700 "vendor": {
12701 "type": "string",
12702 "description": "Vendor name for the supplier of this inventory.",
12703 "nullable": true
12704 },
12705 "expirationDate": {
12706 "type": "string",
12707 "description": "Product expiration date for compliance and quality control (optional).",
12708 "format": "date-time",
12709 "nullable": true
12710 },
12711 "roomQuantities": {
12712 "type": "array",
12713 "items": {
12714 "$ref": "#/components/schemas/InventoryRoomQuantity"
12715 },
12716 "description": "Quantity breakdown by storage room/location (included when includeRoomQuantities=true).",
12717 "nullable": true
12718 },
12719 "pricingTierName": {
12720 "type": "string",
12721 "description": "Pricing tier classification for bulk pricing strategies.",
12722 "nullable": true
12723 },
12724 "alternateName": {
12725 "type": "string",
12726 "description": "Alternative product name for display purposes.",
12727 "nullable": true
12728 },
12729 "tags": {
12730 "type": "array",
12731 "items": {
12732 "$ref": "#/components/schemas/InventoryTag"
12733 },
12734 "description": "Collection of compliance tags associated with this inventory package.",
12735 "nullable": true
12736 },
12737 "brandId": {
12738 "type": "integer",
12739 "description": "Brand identifier for branded products (optional).",
12740 "format": "int32",
12741 "nullable": true
12742 },
12743 "brandName": {
12744 "type": "string",
12745 "description": "Brand name for branded products.",
12746 "nullable": true
12747 },
12748 "medicalOnly": {
12749 "type": "boolean",
12750 "description": "Indicates if product is restricted to medical program only."
12751 },
12752 "externalPackageId": {
12753 "type": "string",
12754 "description": "External compliance system ID (METRC or BioTrack) for regulatory tracking.",
12755 "nullable": true
12756 },
12757 "producer": {
12758 "type": "string",
12759 "description": "Producer name for cultivation and manufacturing tracking.",
12760 "nullable": true
12761 },
12762 "producerId": {
12763 "type": "integer",
12764 "description": "Producer identifier for cultivation and manufacturing tracking (optional).",
12765 "format": "int32",
12766 "nullable": true
12767 },
12768 "lineage": {
12769 "type": "array",
12770 "items": {
12771 "$ref": "#/components/schemas/PackageLineage"
12772 },
12773 "description": "Package lineage information for traceability and compliance tracking.",
12774 "nullable": true
12775 },
12776 "potencyIndicator": {
12777 "type": "string",
12778 "description": "Potency classification indicator for dosing guidance.",
12779 "nullable": true
12780 },
12781 "masterCategory": {
12782 "type": "string",
12783 "description": "Master category classification for product grouping.",
12784 "nullable": true
12785 },
12786 "effectivePotencyMg": {
12787 "type": "number",
12788 "description": "Effective potency in milligrams for dosing calculations (optional).",
12789 "format": "double",
12790 "nullable": true
12791 },
12792 "isCannabis": {
12793 "type": "boolean",
12794 "description": "Indicates if product contains cannabis or is cannabis-related."
12795 },
12796 "packageNDC": {
12797 "type": "string",
12798 "description": "National Drug Code for pharmaceutical tracking (optional).",
12799 "nullable": true
12800 },
12801 "labResultUrl": {
12802 "type": "string",
12803 "description": "URL to certificate of analysis or lab testing document.",
12804 "nullable": true
12805 }
12806 },
12807 "additionalProperties": false,
12808 "description": "Extended inventory item model for financial reporting with cost and allocation data."
12809 },
12810 "RetagPlantRequest": {
12811 "type": "object",
12812 "properties": {
12813 "plantId": {
12814 "type": "integer",
12815 "description": "Plant identifier for the cannabis plant being retagged with a new serial number.",
12816 "format": "int32"
12817 },
12818 "serialNumber": {
12819 "type": "string",
12820 "description": "New serial number for the plant identification tag replacement.",
12821 "nullable": true
12822 }
12823 },
12824 "additionalProperties": false,
12825 "description": "Request model for retagging cannabis plants with new serial numbers for compliance and tracking updates."
12826 },
12827 "RetireImmaturePlantsDetails": {
12828 "type": "object",
12829 "properties": {
12830 "batchId": {
12831 "type": "integer",
12832 "description": "Batch identifier for the plant batch containing plants to be retired.",
12833 "format": "int32"
12834 },
12835 "countToRetire": {
12836 "type": "integer",
12837 "description": "Number of plants to retire from the specified batch.",
12838 "format": "int32"
12839 },
12840 "reasonCode": {
12841 "type": "string",
12842 "description": "Standardized reason code for the plant retirement (e.g., \"DISEASE\", \"PEST\", \"POOR_HEALTH\", \"CONTAMINATION\").",
12843 "nullable": true
12844 },
12845 "retireDate": {
12846 "type": "string",
12847 "description": "Date when the plants were retired for cultivation timeline documentation.",
12848 "format": "date-time",
12849 "nullable": true
12850 }
12851 },
12852 "additionalProperties": false,
12853 "description": "Detailed specification for retiring immature plants from cultivation batches with compliance documentation."
12854 },
12855 "RetireImmaturePlantsRequest": {
12856 "type": "object",
12857 "properties": {
12858 "plants": {
12859 "type": "array",
12860 "items": {
12861 "$ref": "#/components/schemas/RetireImmaturePlantsDetails"
12862 },
12863 "description": "Collection of plant retirement specifications for batch processing of plant removals.",
12864 "nullable": true
12865 }
12866 },
12867 "additionalProperties": false,
12868 "description": "Request model for retiring immature cannabis plants due to loss, contamination, or quality issues."
12869 },
12870 "RetirePlantRequest": {
12871 "type": "object",
12872 "properties": {
12873 "plantIds": {
12874 "type": "array",
12875 "items": {
12876 "type": "integer",
12877 "format": "int32"
12878 },
12879 "nullable": true
12880 },
12881 "reasonId": {
12882 "type": "integer",
12883 "format": "int32",
12884 "nullable": true
12885 },
12886 "reasonCode": {
12887 "type": "string",
12888 "nullable": true
12889 },
12890 "wasteType": {
12891 "type": "string",
12892 "nullable": true
12893 },
12894 "roomId": {
12895 "type": "integer",
12896 "format": "int32"
12897 },
12898 "wasteWeight": {
12899 "type": "number",
12900 "format": "double",
12901 "nullable": true
12902 },
12903 "comment": {
12904 "type": "string",
12905 "nullable": true
12906 },
12907 "wastePackageId": {
12908 "type": "string",
12909 "nullable": true
12910 },
12911 "wasteDate": {
12912 "type": "string",
12913 "format": "date-time",
12914 "nullable": true
12915 },
12916 "plantWeight": {
12917 "type": "number",
12918 "format": "double",
12919 "nullable": true
12920 },
12921 "plantWeightUnitId": {
12922 "type": "integer",
12923 "format": "int32",
12924 "nullable": true
12925 },
12926 "wasteMaterial": {
12927 "type": "string",
12928 "nullable": true
12929 },
12930 "wasteReason": {
12931 "type": "string",
12932 "nullable": true
12933 },
12934 "wasteMethod": {
12935 "type": "string",
12936 "nullable": true
12937 },
12938 "reasonNote": {
12939 "type": "string",
12940 "nullable": true
12941 },
12942 "emptyCloneGroup": {
12943 "type": "boolean"
12944 }
12945 },
12946 "additionalProperties": false
12947 },
12948 "Room": {
12949 "type": "object",
12950 "properties": {
12951 "roomId": {
12952 "type": "integer",
12953 "description": "Unique identifier for the cultivation room or facility area.\n**Required for updates, null/0 for new room creation.**",
12954 "format": "int32",
12955 "nullable": true
12956 },
12957 "roomName": {
12958 "type": "string",
12959 "description": "Human-readable name for room identification and cultivation tracking.\n**Required for both create and update operations.**",
12960 "nullable": true
12961 },
12962 "isQuarantineRoom": {
12963 "type": "boolean",
12964 "description": "Indicates if this room is designated for quarantine operations and compliance isolation."
12965 },
12966 "isVaultRoom": {
12967 "type": "boolean",
12968 "description": "Indicates if this room is designated as a secure vault for valuable inventory storage."
12969 },
12970 "isWaitingRoom": {
12971 "type": "boolean",
12972 "description": "Indicates if this room is designated as a customer waiting area."
12973 },
12974 "isSalesFloor": {
12975 "type": "boolean",
12976 "description": "Indicates if this room is designated as the main sales floor for customer transactions."
12977 },
12978 "isPOSRoom": {
12979 "type": "boolean",
12980 "description": "Indicates if this room is designated for point-of-sale operations and transactions."
12981 },
12982 "isInventoryRoom": {
12983 "type": "boolean",
12984 "description": "Indicates if this room is designated for inventory storage and management."
12985 },
12986 "isPreOrderRoom": {
12987 "type": "boolean",
12988 "description": "Indicates if this room is designated for pre-order fulfillment operations."
12989 },
12990 "isEcommerceRoom": {
12991 "type": "boolean",
12992 "description": "Indicates if this room is designated for e-commerce order processing and fulfillment."
12993 }
12994 },
12995 "additionalProperties": false,
12996 "description": "Cultivation room model containing facility area configuration information for cannabis operations and facility management."
12997 },
12998 "RoomWaste": {
12999 "type": "object",
13000 "properties": {
13001 "wasteId": {
13002 "type": "integer",
13003 "description": "Unique identifier for the waste record.",
13004 "format": "int32",
13005 "nullable": true
13006 },
13007 "referenceNo": {
13008 "type": "string",
13009 "description": "Reference number for waste tracking and documentation.",
13010 "nullable": true
13011 },
13012 "comments": {
13013 "type": "string",
13014 "description": "Additional comments or notes about the waste disposal.",
13015 "nullable": true
13016 },
13017 "wasteDate": {
13018 "type": "string",
13019 "description": "Date when the waste disposal occurred.",
13020 "format": "date-time",
13021 "nullable": true
13022 },
13023 "wasteType": {
13024 "type": "string",
13025 "description": "Type or category of waste material being disposed.",
13026 "nullable": true
13027 },
13028 "roomId": {
13029 "type": "integer",
13030 "description": "Identifier for the room or facility area where waste originated.",
13031 "format": "int32"
13032 },
13033 "wasteAmount": {
13034 "type": "number",
13035 "description": "Quantity of waste material being disposed.",
13036 "format": "double"
13037 },
13038 "unitId": {
13039 "type": "integer",
13040 "description": "Unit of measurement identifier for the waste amount.",
13041 "format": "int32"
13042 }
13043 },
13044 "additionalProperties": false,
13045 "description": "Room-based waste record model for facility waste disposal tracking and compliance documentation."
13046 },
13047 "SavedReceive": {
13048 "type": "object",
13049 "properties": {
13050 "receiveInventoryHistoryId": {
13051 "type": "integer",
13052 "description": "Unique identifier for the created receive inventory transaction.",
13053 "format": "int32"
13054 }
13055 },
13056 "additionalProperties": false,
13057 "description": "Response model for successful inventory receive order creation operations."
13058 },
13059 "SetImageRequest": {
13060 "required": ["base64Image", "fileName", "productId"],
13061 "type": "object",
13062 "properties": {
13063 "productId": {
13064 "type": "integer",
13065 "description": "The unique identifier of the product to associate the image with.",
13066 "format": "int32"
13067 },
13068 "base64Image": {
13069 "minLength": 1,
13070 "type": "string",
13071 "description": "Base64-encoded string representation of the image file data."
13072 },
13073 "fileName": {
13074 "minLength": 1,
13075 "type": "string",
13076 "description": "Original filename of the image including file extension for proper handling."
13077 },
13078 "image": {
13079 "type": "string",
13080 "description": "Computed property that converts the Base64Image string to byte array for processing.",
13081 "format": "byte",
13082 "nullable": true,
13083 "readOnly": true
13084 },
13085 "fileType": {
13086 "$ref": "#/components/schemas/UploadFileType"
13087 }
13088 },
13089 "additionalProperties": false,
13090 "description": "Request model for setting a product image through the product image management API."
13091 },
13092 "SetImageResponse": {
13093 "type": "object",
13094 "properties": {
13095 "imageId": {
13096 "type": "integer",
13097 "description": "Unique identifier assigned to the uploaded image for tracking and reference.",
13098 "format": "int32"
13099 },
13100 "imageUrl": {
13101 "type": "string",
13102 "description": "Public URL where the uploaded image can be accessed and displayed.",
13103 "nullable": true
13104 }
13105 },
13106 "additionalProperties": false,
13107 "description": "Response model for successful product image upload operations."
13108 },
13109 "Severity": {
13110 "enum": [0, 1, 2],
13111 "type": "integer",
13112 "format": "int32"
13113 },
13114 "Size": {
13115 "type": "object",
13116 "properties": {
13117 "sizeId": {
13118 "type": "integer",
13119 "description": "Unique identifier for the product size configuration.",
13120 "format": "int32"
13121 },
13122 "sizeName": {
13123 "type": "string",
13124 "description": "Display name for the product size.",
13125 "nullable": true
13126 },
13127 "description": {
13128 "type": "string",
13129 "description": "Detailed description of the product size and its usage.",
13130 "nullable": true
13131 }
13132 },
13133 "additionalProperties": false,
13134 "description": "Represents a product size configuration for cannabis products within an organization."
13135 },
13136 "SplitBatchDetails": {
13137 "type": "object",
13138 "properties": {
13139 "newBatchName": {
13140 "type": "string",
13141 "nullable": true
13142 },
13143 "batchId": {
13144 "type": "integer",
13145 "format": "int32"
13146 },
13147 "location": {
13148 "type": "string",
13149 "nullable": true
13150 },
13151 "strain": {
13152 "type": "string",
13153 "nullable": true
13154 },
13155 "quantity": {
13156 "type": "integer",
13157 "format": "int32"
13158 },
13159 "splitDate": {
13160 "type": "string",
13161 "format": "date-time",
13162 "nullable": true
13163 }
13164 },
13165 "additionalProperties": false
13166 },
13167 "SplitImmaturePlantResult": {
13168 "type": "object",
13169 "properties": {
13170 "batch": {
13171 "type": "array",
13172 "items": {
13173 "$ref": "#/components/schemas/SplitImmaturePlantResultDetail"
13174 },
13175 "nullable": true
13176 },
13177 "plant": {
13178 "type": "array",
13179 "items": {
13180 "$ref": "#/components/schemas/SplitImmaturePlantResultDetail"
13181 },
13182 "nullable": true
13183 }
13184 },
13185 "additionalProperties": false
13186 },
13187 "SplitImmaturePlantResultApiResult": {
13188 "type": "object",
13189 "properties": {
13190 "result": {
13191 "type": "boolean"
13192 },
13193 "message": {
13194 "type": "string",
13195 "nullable": true
13196 },
13197 "data": {
13198 "$ref": "#/components/schemas/SplitImmaturePlantResult"
13199 }
13200 },
13201 "additionalProperties": false
13202 },
13203 "SplitImmaturePlantResultDetail": {
13204 "type": "object",
13205 "properties": {
13206 "batchId": {
13207 "type": "integer",
13208 "format": "int32"
13209 },
13210 "batchPlantCount": {
13211 "type": "integer",
13212 "format": "int32"
13213 },
13214 "newBatchId": {
13215 "type": "integer",
13216 "format": "int32"
13217 },
13218 "newBatchPlantCount": {
13219 "type": "integer",
13220 "format": "int32"
13221 }
13222 },
13223 "additionalProperties": false
13224 },
13225 "SplitImmaturePlantsRequest": {
13226 "type": "object",
13227 "properties": {
13228 "batch": {
13229 "type": "array",
13230 "items": {
13231 "$ref": "#/components/schemas/SplitBatchDetails"
13232 },
13233 "description": "Collection of batch split specifications for dividing immature plant batches into smaller groups.",
13234 "nullable": true
13235 },
13236 "plant": {
13237 "type": "array",
13238 "items": {
13239 "$ref": "#/components/schemas/SplitPlantDetails"
13240 },
13241 "description": "Collection of individual plant split specifications for precise cultivation management.",
13242 "nullable": true
13243 }
13244 },
13245 "additionalProperties": false,
13246 "description": "Request model for splitting immature cannabis plant batches and individual plants for cultivation optimization."
13247 },
13248 "SplitPlantDetails": {
13249 "type": "object",
13250 "properties": {
13251 "batchId": {
13252 "type": "integer",
13253 "format": "int32"
13254 },
13255 "location": {
13256 "type": "string",
13257 "nullable": true
13258 },
13259 "strain": {
13260 "type": "string",
13261 "nullable": true
13262 },
13263 "quantity": {
13264 "type": "integer",
13265 "format": "int32"
13266 },
13267 "splitDate": {
13268 "type": "string",
13269 "format": "date-time",
13270 "nullable": true
13271 }
13272 },
13273 "additionalProperties": false
13274 },
13275 "StandardAllergensDetails": {
13276 "type": "object",
13277 "properties": {
13278 "milk": {
13279 "type": "boolean"
13280 },
13281 "eggs": {
13282 "type": "boolean"
13283 },
13284 "fish": {
13285 "type": "boolean"
13286 },
13287 "peanuts": {
13288 "type": "boolean"
13289 },
13290 "treeNuts": {
13291 "type": "boolean"
13292 },
13293 "sesame": {
13294 "type": "boolean"
13295 },
13296 "shellfish": {
13297 "type": "boolean"
13298 },
13299 "soybeans": {
13300 "type": "boolean"
13301 },
13302 "wheat": {
13303 "type": "boolean"
13304 }
13305 },
13306 "additionalProperties": false
13307 },
13308 "StrainDetail": {
13309 "type": "object",
13310 "properties": {
13311 "strainId": {
13312 "type": "integer",
13313 "description": "Unique identifier for the strain",
13314 "format": "int32"
13315 },
13316 "strainName": {
13317 "type": "string",
13318 "description": "Name of the cannabis strain",
13319 "nullable": true
13320 },
13321 "strainDescription": {
13322 "type": "string",
13323 "description": "Detailed description of the strain's characteristics and effects",
13324 "nullable": true
13325 },
13326 "strainAbbreviation": {
13327 "type": "string",
13328 "description": "Short name or code for the strain",
13329 "nullable": true
13330 },
13331 "strainType": {
13332 "type": "string",
13333 "description": "Classification type of the strain. Valid values: `Indica`, `Sativa`, `Hybrid`, `CBD`",
13334 "nullable": true
13335 },
13336 "externalId": {
13337 "type": "string",
13338 "description": "External system identifier for third-party integration",
13339 "nullable": true
13340 }
13341 },
13342 "additionalProperties": false,
13343 "description": "Cannabis strain information with genetic and classification details for product categorization and cultivation tracking."
13344 },
13345 "StringIEnumerableOptional": {
13346 "type": "array",
13347 "additionalProperties": false
13348 },
13349 "StringOptional": {
13350 "type": "string",
13351 "additionalProperties": false
13352 },
13353 "SuccessResult": {
13354 "type": "object",
13355 "properties": {
13356 "result": {
13357 "type": "boolean"
13358 },
13359 "message": {
13360 "type": "string",
13361 "nullable": true
13362 },
13363 "data": {
13364 "type": "object",
13365 "nullable": true
13366 }
13367 },
13368 "additionalProperties": false
13369 },
13370 "Table": {
13371 "type": "object",
13372 "properties": {
13373 "tableId": {
13374 "type": "integer",
13375 "format": "int32",
13376 "nullable": true
13377 },
13378 "tableName": {
13379 "type": "string",
13380 "nullable": true
13381 }
13382 },
13383 "additionalProperties": false
13384 },
13385 "Tag": {
13386 "type": "object",
13387 "properties": {
13388 "tagName": {
13389 "type": "string",
13390 "nullable": true
13391 },
13392 "tagId": {
13393 "type": "integer",
13394 "format": "int32"
13395 }
13396 },
13397 "additionalProperties": false
13398 },
13399 "TaxSummaryInfo": {
13400 "type": "object",
13401 "properties": {
13402 "rateName": {
13403 "type": "string",
13404 "description": "Name of the tax type being summarized (e.g., \"State Excise Tax\", \"Sales Tax\").",
13405 "nullable": true
13406 },
13407 "amount": {
13408 "type": "number",
13409 "description": "Total tax amount for this tax type across all transaction items (in USD).",
13410 "format": "double"
13411 }
13412 },
13413 "additionalProperties": false,
13414 "description": "Summary tax information aggregated across transaction items for reporting and receipt generation."
13415 },
13416 "Terminal": {
13417 "type": "object",
13418 "properties": {
13419 "terminalId": {
13420 "type": "integer",
13421 "description": "Unique identifier for the point-of-sale terminal.",
13422 "format": "int32"
13423 },
13424 "terminalName": {
13425 "type": "string",
13426 "description": "Human-readable name for terminal identification and assignment.",
13427 "nullable": true
13428 }
13429 },
13430 "additionalProperties": false,
13431 "description": "Point-of-sale terminal model containing terminal identification information for retail operations and transaction processing."
13432 },
13433 "Transaction": {
13434 "type": "object",
13435 "properties": {
13436 "transactionId": {
13437 "type": "integer",
13438 "format": "int32"
13439 },
13440 "customerId": {
13441 "type": "integer",
13442 "format": "int32"
13443 },
13444 "employeeId": {
13445 "type": "integer",
13446 "format": "int32"
13447 },
13448 "transactionDate": {
13449 "type": "string",
13450 "format": "date-time"
13451 },
13452 "voidDate": {
13453 "type": "string",
13454 "format": "date-time",
13455 "nullable": true
13456 },
13457 "isVoid": {
13458 "type": "boolean"
13459 },
13460 "subtotal": {
13461 "type": "number",
13462 "format": "double"
13463 },
13464 "totalDiscount": {
13465 "type": "number",
13466 "format": "double"
13467 },
13468 "totalBeforeTax": {
13469 "type": "number",
13470 "format": "double",
13471 "readOnly": true
13472 },
13473 "tax": {
13474 "type": "number",
13475 "format": "double"
13476 },
13477 "tipAmount": {
13478 "type": "number",
13479 "format": "double",
13480 "nullable": true
13481 },
13482 "total": {
13483 "type": "number",
13484 "format": "double"
13485 },
13486 "paid": {
13487 "type": "number",
13488 "format": "double"
13489 },
13490 "changeDue": {
13491 "type": "number",
13492 "format": "double"
13493 },
13494 "totalItems": {
13495 "type": "integer",
13496 "format": "int32"
13497 },
13498 "terminalName": {
13499 "type": "string",
13500 "nullable": true
13501 },
13502 "checkInDate": {
13503 "type": "string",
13504 "format": "date-time",
13505 "nullable": true
13506 },
13507 "invoiceNumber": {
13508 "type": "string",
13509 "nullable": true
13510 },
13511 "isTaxInclusive": {
13512 "type": "boolean"
13513 },
13514 "transactionType": {
13515 "type": "string",
13516 "description": "Will have one of the following values: Retail, Transfer, WholesaleOrder",
13517 "nullable": true
13518 },
13519 "loyaltyEarned": {
13520 "type": "number",
13521 "description": "Loyalty points earned on this transaction (can be negative if it's a return)",
13522 "format": "double",
13523 "nullable": true
13524 },
13525 "loyaltySpent": {
13526 "type": "number",
13527 "description": "Loyalty points spent on this transaction (can be negative if it's a return)",
13528 "format": "double",
13529 "nullable": true
13530 },
13531 "items": {
13532 "type": "array",
13533 "items": {
13534 "$ref": "#/components/schemas/TransactionItem"
13535 },
13536 "nullable": true
13537 },
13538 "discounts": {
13539 "type": "array",
13540 "items": {
13541 "$ref": "#/components/schemas/AppliedDiscount"
13542 },
13543 "nullable": true,
13544 "readOnly": true
13545 },
13546 "lastModifiedDateUTC": {
13547 "type": "string",
13548 "format": "date-time"
13549 },
13550 "cashPaid": {
13551 "type": "number",
13552 "format": "double",
13553 "nullable": true
13554 },
13555 "debitPaid": {
13556 "type": "number",
13557 "format": "double",
13558 "nullable": true
13559 },
13560 "electronicPaid": {
13561 "type": "number",
13562 "format": "double",
13563 "nullable": true
13564 },
13565 "electronicPaymentMethod": {
13566 "type": "string",
13567 "nullable": true
13568 },
13569 "checkPaid": {
13570 "type": "number",
13571 "format": "double",
13572 "nullable": true
13573 },
13574 "creditPaid": {
13575 "type": "number",
13576 "format": "double",
13577 "nullable": true
13578 },
13579 "giftPaid": {
13580 "type": "number",
13581 "format": "double",
13582 "nullable": true
13583 },
13584 "mmapPaid": {
13585 "type": "number",
13586 "format": "double",
13587 "nullable": true
13588 },
13589 "prePaymentAmount": {
13590 "type": "number",
13591 "format": "double",
13592 "nullable": true
13593 },
13594 "revenueFeesAndDonations": {
13595 "type": "number",
13596 "format": "double",
13597 "nullable": true
13598 },
13599 "nonRevenueFeesAndDonations": {
13600 "type": "number",
13601 "format": "double",
13602 "nullable": true
13603 },
13604 "feesAndDonations": {
13605 "type": "array",
13606 "items": {
13607 "$ref": "#/components/schemas/FeeDonationInfo"
13608 },
13609 "nullable": true
13610 },
13611 "taxSummary": {
13612 "type": "array",
13613 "items": {
13614 "$ref": "#/components/schemas/TaxSummaryInfo"
13615 },
13616 "nullable": true,
13617 "readOnly": true
13618 },
13619 "returnOnTransactionId": {
13620 "type": "integer",
13621 "format": "int32",
13622 "nullable": true
13623 },
13624 "adjustmentForTransactionId": {
13625 "type": "integer",
13626 "format": "int32",
13627 "nullable": true
13628 },
13629 "orderType": {
13630 "type": "string",
13631 "nullable": true
13632 },
13633 "wasPreOrdered": {
13634 "type": "boolean"
13635 },
13636 "orderSource": {
13637 "type": "string",
13638 "nullable": true
13639 },
13640 "orderMethod": {
13641 "type": "string",
13642 "nullable": true
13643 },
13644 "invoiceName": {
13645 "type": "string",
13646 "nullable": true
13647 },
13648 "isReturn": {
13649 "type": "boolean",
13650 "readOnly": true
13651 },
13652 "authCode": {
13653 "type": "string",
13654 "nullable": true
13655 },
13656 "customerTypeId": {
13657 "type": "integer",
13658 "format": "int32"
13659 },
13660 "isMedical": {
13661 "type": "boolean"
13662 },
13663 "orderIds": {
13664 "type": "array",
13665 "items": {
13666 "type": "integer",
13667 "format": "int32"
13668 },
13669 "nullable": true
13670 },
13671 "totalCredit": {
13672 "type": "number",
13673 "format": "double"
13674 },
13675 "completedByUser": {
13676 "type": "string",
13677 "nullable": true
13678 },
13679 "responsibleForSaleUserId": {
13680 "type": "integer",
13681 "format": "int32"
13682 },
13683 "transactionDateLocalTime": {
13684 "type": "string",
13685 "format": "date-time"
13686 },
13687 "estTimeArrivalLocal": {
13688 "type": "string",
13689 "format": "date-time",
13690 "nullable": true
13691 },
13692 "estDeliveryDateLocal": {
13693 "type": "string",
13694 "format": "date-time",
13695 "nullable": true,
13696 "readOnly": true
13697 },
13698 "referenceId": {
13699 "type": "string",
13700 "nullable": true
13701 },
13702 "manualPayments": {
13703 "type": "array",
13704 "items": {
13705 "$ref": "#/components/schemas/ManualPayment"
13706 },
13707 "nullable": true
13708 },
13709 "manualPaid": {
13710 "type": "number",
13711 "format": "double",
13712 "nullable": true
13713 },
13714 "integratedPayments": {
13715 "type": "array",
13716 "items": {
13717 "$ref": "#/components/schemas/IntegratedPayment"
13718 },
13719 "nullable": true
13720 },
13721 "integratedPaid": {
13722 "type": "number",
13723 "format": "double",
13724 "nullable": true
13725 }
13726 },
13727 "additionalProperties": false,
13728 "description": "Complete cannabis retail transaction model representing all aspects of cannabis sales operations."
13729 },
13730 "TransactionItem": {
13731 "type": "object",
13732 "properties": {
13733 "transactionId": {
13734 "type": "integer",
13735 "description": "Parent transaction identifier linking this item to the overall transaction.",
13736 "format": "int32"
13737 },
13738 "productId": {
13739 "type": "integer",
13740 "description": "Product identifier for the purchased cannabis product.",
13741 "format": "int32"
13742 },
13743 "totalPrice": {
13744 "type": "number",
13745 "description": "Total price for this line item including all taxes and discounts (in USD).",
13746 "format": "double"
13747 },
13748 "quantity": {
13749 "type": "number",
13750 "description": "Quantity of the product purchased (units based on product type - grams, pieces, etc.).",
13751 "format": "double"
13752 },
13753 "unitPrice": {
13754 "type": "number",
13755 "description": "Unit price per individual item before taxes and discounts (in USD).",
13756 "format": "double"
13757 },
13758 "unitCost": {
13759 "type": "number",
13760 "description": "Cost basis of the product for internal accounting and margin calculations (in USD).",
13761 "format": "double",
13762 "nullable": true
13763 },
13764 "packageId": {
13765 "type": "string",
13766 "description": "State tracking system package identifier for regulatory compliance (seed-to-sale tracking).",
13767 "nullable": true
13768 },
13769 "sourcePackageId": {
13770 "type": "string",
13771 "description": "Original source package identifier for product lineage tracking in state systems.",
13772 "nullable": true
13773 },
13774 "totalDiscount": {
13775 "type": "number",
13776 "description": "Total discount amount applied to this line item (in USD).",
13777 "format": "double"
13778 },
13779 "inventoryId": {
13780 "type": "integer",
13781 "description": "Inventory record identifier for the specific product inventory being sold.",
13782 "format": "int32"
13783 },
13784 "unitId": {
13785 "type": "integer",
13786 "description": "Unit type identifier defining how the product is measured and sold.",
13787 "format": "int32"
13788 },
13789 "unitWeight": {
13790 "type": "number",
13791 "description": "Weight of the product unit in grams (calculated for flower products with UnitId = 1).",
13792 "format": "double",
13793 "nullable": true,
13794 "readOnly": true
13795 },
13796 "unitWeightUnit": {
13797 "type": "string",
13798 "description": "Unit of measurement for product weight (always \"g\" for grams).",
13799 "nullable": true,
13800 "readOnly": true
13801 },
13802 "flowerEquivalent": {
13803 "type": "number",
13804 "description": "Flower equivalent weight for concentrate products in grams (for regulatory compliance).",
13805 "format": "double",
13806 "nullable": true
13807 },
13808 "flowerEquivalentUnit": {
13809 "type": "string",
13810 "description": "Unit of measurement for flower equivalent (always \"g\" for grams).",
13811 "nullable": true,
13812 "readOnly": true
13813 },
13814 "discounts": {
13815 "type": "array",
13816 "items": {
13817 "$ref": "#/components/schemas/AppliedDiscount"
13818 },
13819 "description": "Collection of discounts applied to this transaction item.",
13820 "nullable": true
13821 },
13822 "taxes": {
13823 "type": "array",
13824 "items": {
13825 "$ref": "#/components/schemas/LineItemTaxInfo"
13826 },
13827 "description": "Collection of taxes applied to this transaction item.",
13828 "nullable": true
13829 },
13830 "returnDate": {
13831 "type": "string",
13832 "description": "Date when this item was returned (null if not returned).",
13833 "format": "date-time",
13834 "nullable": true
13835 },
13836 "isReturned": {
13837 "type": "boolean",
13838 "description": "Indicates whether this transaction item has been returned.",
13839 "readOnly": true
13840 },
13841 "returnedByTransactionId": {
13842 "type": "integer",
13843 "description": "Transaction identifier of the return transaction that processed this item's return.",
13844 "format": "int32",
13845 "nullable": true
13846 },
13847 "returnReason": {
13848 "type": "string",
13849 "description": "Reason provided for returning this item (e.g., \"Defective\", \"Customer Dissatisfaction\").",
13850 "nullable": true
13851 },
13852 "batchName": {
13853 "type": "string",
13854 "description": "Cultivation batch name for product traceability and regulatory compliance.",
13855 "nullable": true
13856 },
13857 "transactionItemId": {
13858 "type": "integer",
13859 "description": "Reference identifier to tie child items to parent items within a transaction.\nNot guaranteed to be unique outside of a single transaction.",
13860 "format": "int32",
13861 "readOnly": true
13862 },
13863 "vendor": {
13864 "type": "string",
13865 "description": "Vendor or supplier name for the product.",
13866 "nullable": true
13867 },
13868 "isCoupon": {
13869 "type": "boolean",
13870 "description": "Indicates whether this item represents a coupon or promotional discount rather than a physical product."
13871 }
13872 },
13873 "additionalProperties": false,
13874 "description": "Individual line item within a cannabis retail transaction containing product, pricing, and compliance information."
13875 },
13876 "Unit": {
13877 "type": "object",
13878 "properties": {
13879 "unitId": {
13880 "type": "integer",
13881 "description": "Unique identifier for the measurement unit.",
13882 "format": "int32"
13883 },
13884 "unitName": {
13885 "type": "string",
13886 "description": "Full name of the measurement unit (e.g., \"Grams\", \"Ounces\", \"Pounds\").",
13887 "nullable": true
13888 },
13889 "abbreviation": {
13890 "type": "string",
13891 "description": "Short abbreviation for the unit (e.g., \"g\", \"oz\", \"lb\").",
13892 "nullable": true
13893 },
13894 "unitTypeId": {
13895 "type": "integer",
13896 "description": "Unit type classification identifier linking to measurement category.",
13897 "format": "int32"
13898 }
13899 },
13900 "additionalProperties": false,
13901 "description": "Measurement unit model for cannabis product tracking and inventory management."
13902 },
13903 "UnitType": {
13904 "type": "object",
13905 "properties": {
13906 "unitTypeId": {
13907 "type": "integer",
13908 "description": "Unique identifier for the unit type category.",
13909 "format": "int32"
13910 },
13911 "unitTypeName": {
13912 "type": "string",
13913 "description": "Display name of the unit type category (e.g., \"Weight\", \"Volume\", \"Quantity\").",
13914 "nullable": true
13915 },
13916 "unitTypeAbbreivation": {
13917 "type": "string",
13918 "description": "Short abbreviation for the unit type (e.g., \"Wgt\", \"Vol\", \"Qty\").",
13919 "nullable": true
13920 }
13921 },
13922 "additionalProperties": false,
13923 "description": "Unit type classification model for organizing measurement units by category."
13924 },
13925 "UpdateBatchLabResultsRequest": {
13926 "required": ["batchName"],
13927 "type": "object",
13928 "properties": {
13929 "batchName": {
13930 "minLength": 1,
13931 "type": "string",
13932 "description": "Name of the batch to update with laboratory test results (required)."
13933 },
13934 "sampleWeight": {
13935 "type": "number",
13936 "description": "Weight of the laboratory sample used for testing (in grams).",
13937 "format": "double",
13938 "nullable": true
13939 },
13940 "labResults": {
13941 "type": "array",
13942 "items": {
13943 "$ref": "#/components/schemas/CannabinoidTerpeneValue"
13944 },
13945 "description": "Collection of laboratory test results including cannabinoids and terpenes.",
13946 "nullable": true
13947 }
13948 },
13949 "additionalProperties": false,
13950 "description": "Request model for updating laboratory test results for a specific batch by batch name."
13951 },
13952 "UpdateBatchRequest": {
13953 "type": "object",
13954 "properties": {
13955 "batchName": {
13956 "type": "string",
13957 "nullable": true
13958 },
13959 "roomId": {
13960 "type": "integer",
13961 "format": "int32",
13962 "nullable": true
13963 },
13964 "strainId": {
13965 "type": "integer",
13966 "format": "int32",
13967 "nullable": true
13968 }
13969 },
13970 "additionalProperties": false
13971 },
13972 "UpdateDeliveryRouteDetailRequest": {
13973 "type": "object",
13974 "properties": {
13975 "transactionId": {
13976 "type": "integer",
13977 "description": "Delivery transaction identifier to update (required).",
13978 "format": "int32"
13979 },
13980 "driverId": {
13981 "type": "integer",
13982 "description": "Primary driver identifier for delivery assignment (optional).",
13983 "format": "int32",
13984 "nullable": true
13985 },
13986 "driverId2": {
13987 "type": "integer",
13988 "description": "Secondary driver identifier for delivery assignment (optional).",
13989 "format": "int32",
13990 "nullable": true
13991 },
13992 "vehicleId": {
13993 "type": "integer",
13994 "description": "Vehicle identifier for delivery assignment (optional).",
13995 "format": "int32",
13996 "nullable": true
13997 },
13998 "route": {
13999 "type": "string",
14000 "description": "Route information or delivery notes (optional).",
14001 "nullable": true
14002 },
14003 "status": {
14004 "type": "string",
14005 "description": "Delivery status update (optional).",
14006 "nullable": true
14007 }
14008 },
14009 "additionalProperties": false,
14010 "description": "Request model for updating delivery route details including vehicle assignments, driver assignments, and delivery status."
14011 },
14012 "UpdateJournalEntryRequest": {
14013 "required": ["body", "date", "journalEntryId", "subject"],
14014 "type": "object",
14015 "properties": {
14016 "journalEntryId": {
14017 "type": "integer",
14018 "description": "The ID of the existing journal entry to update.",
14019 "format": "int32"
14020 },
14021 "subject": {
14022 "minLength": 1,
14023 "type": "string",
14024 "description": "Updated title or summary for the journal entry."
14025 },
14026 "body": {
14027 "minLength": 1,
14028 "type": "string",
14029 "description": "Updated detailed content and notes for the journal entry."
14030 },
14031 "date": {
14032 "type": "string",
14033 "description": "Updated date and time when the journal entry should be dated.",
14034 "format": "date-time"
14035 }
14036 },
14037 "additionalProperties": false,
14038 "description": "Request model for updating existing customer journal entries with modified content and details."
14039 },
14040 "UpdatePackageTagsRequest": {
14041 "required": ["tags"],
14042 "type": "object",
14043 "properties": {
14044 "packageIds": {
14045 "$ref": "#/components/schemas/StringIEnumerableOptional"
14046 },
14047 "inventoryIds": {
14048 "$ref": "#/components/schemas/Int32IEnumerableOptional"
14049 },
14050 "tags": {
14051 "type": "array",
14052 "items": {
14053 "type": "string"
14054 },
14055 "description": "Required collection of tags to apply to the specified packages (required)."
14056 }
14057 },
14058 "additionalProperties": false
14059 },
14060 "UpdatePlantDetails": {
14061 "type": "object",
14062 "properties": {
14063 "plantId": {
14064 "type": "integer",
14065 "format": "int32"
14066 },
14067 "serialNumber": {
14068 "$ref": "#/components/schemas/StringOptional"
14069 },
14070 "dateCreated": {
14071 "$ref": "#/components/schemas/DateTimeNullableOptional"
14072 },
14073 "bornDate": {
14074 "$ref": "#/components/schemas/DateTimeNullableOptional"
14075 },
14076 "isMother": {
14077 "$ref": "#/components/schemas/BooleanNullableOptional"
14078 },
14079 "strainId": {
14080 "$ref": "#/components/schemas/Int32NullableOptional"
14081 },
14082 "roomId": {
14083 "$ref": "#/components/schemas/Int32NullableOptional"
14084 },
14085 "tableId": {
14086 "$ref": "#/components/schemas/Int32NullableOptional"
14087 },
14088 "batchId": {
14089 "$ref": "#/components/schemas/Int32NullableOptional"
14090 }
14091 },
14092 "additionalProperties": false
14093 },
14094 "UpdatePlantsRequest": {
14095 "type": "object",
14096 "properties": {
14097 "plants": {
14098 "type": "array",
14099 "items": {
14100 "$ref": "#/components/schemas/UpdatePlantDetails"
14101 },
14102 "nullable": true
14103 }
14104 },
14105 "additionalProperties": false
14106 },
14107 "UpdatePreOrderRequest": {
14108 "type": "object",
14109 "properties": {
14110 "orderId": {
14111 "type": "integer",
14112 "format": "int32"
14113 },
14114 "items": {
14115 "type": "array",
14116 "items": {
14117 "$ref": "#/components/schemas/PreOrderItem"
14118 },
14119 "nullable": true
14120 },
14121 "isDelivery": {
14122 "type": "boolean"
14123 },
14124 "orderSource": {
14125 "type": "string",
14126 "nullable": true,
14127 "deprecated": true
14128 },
14129 "deliveryStreet": {
14130 "type": "string",
14131 "nullable": true
14132 },
14133 "deliveryCity": {
14134 "type": "string",
14135 "nullable": true
14136 },
14137 "deliveryState": {
14138 "type": "string",
14139 "nullable": true
14140 },
14141 "deliveryPostalCode": {
14142 "type": "string",
14143 "nullable": true
14144 },
14145 "deliveryScheduleId": {
14146 "$ref": "#/components/schemas/DeliveryScheduleType"
14147 },
14148 "notes": {
14149 "type": "string",
14150 "nullable": true
14151 },
14152 "redemptions": {
14153 "$ref": "#/components/schemas/PreOrderRedemptionIEnumerableOptional"
14154 },
14155 "customerId": {
14156 "type": "integer",
14157 "format": "int32"
14158 },
14159 "deliveryStreet2": {
14160 "type": "string",
14161 "nullable": true
14162 },
14163 "timeWindowStartDateUtc": {
14164 "type": "string",
14165 "format": "date-time",
14166 "nullable": true
14167 },
14168 "timeWindowEndDateUtc": {
14169 "type": "string",
14170 "format": "date-time",
14171 "nullable": true
14172 }
14173 },
14174 "additionalProperties": false
14175 },
14176 "UpdateStrain": {
14177 "required": ["strainDescription", "strainName"],
14178 "type": "object",
14179 "properties": {
14180 "strainId": {
14181 "type": "integer",
14182 "description": "Unique identifier for strain updates.\n- **For CREATE**: Omit this field, set to null, or set to 0\n- **For UPDATE**: Provide the existing strain's ID",
14183 "format": "int32",
14184 "nullable": true
14185 },
14186 "strainName": {
14187 "minLength": 1,
14188 "type": "string",
14189 "description": "Name of the cannabis strain (required for creation)"
14190 },
14191 "strainDescription": {
14192 "minLength": 1,
14193 "type": "string",
14194 "description": "Detailed description of the strain's characteristics and effects.\n**REQUIRED** - Cannot be null or empty for both create and update operations."
14195 },
14196 "abbreviation": {
14197 "type": "string",
14198 "description": "Short name or code for the strain (optional)",
14199 "nullable": true
14200 },
14201 "strainType": {
14202 "type": "string",
14203 "description": "Classification type of the strain (optional).\n**Must be one of**: `Indica`, `Sativa`, `Hybrid`, `CBD`\nIf provided, value will be validated against allowed strain types.",
14204 "nullable": true
14205 },
14206 "externalId": {
14207 "type": "string",
14208 "description": "External system identifier for third-party integration (optional).\nUseful for synchronizing with cultivation management systems.",
14209 "nullable": true
14210 },
14211 "broadcast": {
14212 "$ref": "#/components/schemas/BooleanOptional"
14213 }
14214 },
14215 "additionalProperties": false,
14216 "description": "Request model for creating or updating cannabis strain information.\n\n**Create vs Update Behavior:**\n- **CREATE**: When `StrainId` is null, 0, or omitted, a new strain record will be created\n- **UPDATE**: When `StrainId` is provided with a valid strain ID, the existing strain will be updated\n\n**Sparse Update Behavior:**\n- **Provided fields**: Will overwrite existing values with provided data\n- **Omitted fields**: Will preserve existing values (no data loss for updates)\n- **Special handling**: `StrainDescription` is always required and cannot be null"
14217 },
14218 "UploadFileType": {
14219 "enum": [0, 1, 2, 3, 4, 5],
14220 "type": "integer",
14221 "format": "int32"
14222 },
14223 "ValidationFailure": {
14224 "type": "object",
14225 "properties": {
14226 "propertyName": {
14227 "type": "string",
14228 "nullable": true
14229 },
14230 "errorMessage": {
14231 "type": "string",
14232 "nullable": true
14233 },
14234 "attemptedValue": {
14235 "type": "object",
14236 "nullable": true
14237 },
14238 "customState": {
14239 "type": "object",
14240 "nullable": true
14241 },
14242 "severity": {
14243 "$ref": "#/components/schemas/Severity"
14244 },
14245 "errorCode": {
14246 "type": "string",
14247 "nullable": true
14248 },
14249 "formattedMessagePlaceholderValues": {
14250 "type": "object",
14251 "additionalProperties": {
14252 "type": "object",
14253 "nullable": true
14254 },
14255 "nullable": true
14256 }
14257 },
14258 "additionalProperties": false
14259 },
14260 "ValidationResult": {
14261 "type": "object",
14262 "properties": {
14263 "isValid": {
14264 "type": "boolean",
14265 "readOnly": true
14266 },
14267 "errors": {
14268 "type": "array",
14269 "items": {
14270 "$ref": "#/components/schemas/ValidationFailure"
14271 },
14272 "nullable": true
14273 },
14274 "ruleSetsExecuted": {
14275 "type": "array",
14276 "items": {
14277 "type": "string"
14278 },
14279 "nullable": true
14280 }
14281 },
14282 "additionalProperties": false
14283 },
14284 "VehicleDetail": {
14285 "type": "object",
14286 "properties": {
14287 "vehicleId": {
14288 "type": "integer",
14289 "format": "int32"
14290 },
14291 "make": {
14292 "type": "string",
14293 "nullable": true
14294 },
14295 "model": {
14296 "type": "string",
14297 "nullable": true
14298 },
14299 "modelYear": {
14300 "type": "string",
14301 "nullable": true
14302 },
14303 "color": {
14304 "type": "string",
14305 "nullable": true
14306 },
14307 "licensePlate": {
14308 "type": "string",
14309 "nullable": true
14310 },
14311 "vin": {
14312 "type": "string",
14313 "nullable": true
14314 }
14315 },
14316 "additionalProperties": false
14317 },
14318 "Vendor": {
14319 "type": "object",
14320 "properties": {
14321 "vendorId": {
14322 "type": "integer",
14323 "description": "Unique identifier for the vendor in the system (null for new vendor creation).",
14324 "format": "int32",
14325 "nullable": true
14326 },
14327 "vendorName": {
14328 "type": "string",
14329 "description": "Official business name of the vendor as registered with regulatory authorities.",
14330 "nullable": true
14331 },
14332 "address": {
14333 "type": "string",
14334 "description": "Street address of the vendor's business location.",
14335 "nullable": true
14336 },
14337 "city": {
14338 "type": "string",
14339 "description": "City where the vendor's business is located.",
14340 "nullable": true
14341 },
14342 "state": {
14343 "type": "string",
14344 "description": "State or province where the vendor's business is located.",
14345 "nullable": true
14346 },
14347 "postalCode": {
14348 "type": "string",
14349 "description": "Postal or ZIP code for the vendor's business address.",
14350 "nullable": true
14351 },
14352 "licenseNumber": {
14353 "type": "string",
14354 "description": "Cannabis business license number issued by state regulatory authorities.",
14355 "nullable": true
14356 },
14357 "contactName": {
14358 "type": "string",
14359 "description": "Name of the primary business contact for this vendor.",
14360 "nullable": true
14361 },
14362 "contactEmail": {
14363 "type": "string",
14364 "description": "Email address for business communications with the vendor.",
14365 "nullable": true
14366 },
14367 "contactPhone": {
14368 "type": "string",
14369 "description": "Phone number for business communications with the vendor.",
14370 "nullable": true
14371 }
14372 },
14373 "additionalProperties": false,
14374 "description": "Vendor information model for cannabis supply chain and compliance management."
14375 },
14376 "WasteSummary": {
14377 "type": "object",
14378 "properties": {
14379 "roomWaste": {
14380 "type": "array",
14381 "items": {
14382 "$ref": "#/components/schemas/RoomWaste"
14383 },
14384 "description": "Collection of room-based waste disposal records.",
14385 "nullable": true
14386 },
14387 "harvestWaste": {
14388 "type": "array",
14389 "items": {
14390 "$ref": "#/components/schemas/ObjectWaste"
14391 },
14392 "description": "Collection of harvest-based waste disposal records.",
14393 "nullable": true
14394 },
14395 "plantWaste": {
14396 "type": "array",
14397 "items": {
14398 "$ref": "#/components/schemas/ObjectWaste"
14399 },
14400 "description": "Collection of plant-based waste disposal records.",
14401 "nullable": true
14402 }
14403 },
14404 "additionalProperties": false,
14405 "description": "Comprehensive waste summary model containing all waste types for facility waste management and regulatory reporting."
14406 },
14407 "WeeklyRecurrenceInfo": {
14408 "type": "object",
14409 "properties": {
14410 "startTime": {
14411 "type": "string",
14412 "description": "Daily start time when discount becomes available (optional).",
14413 "format": "date-span",
14414 "nullable": true
14415 },
14416 "endTime": {
14417 "type": "string",
14418 "description": "Daily end time when discount expires (optional).",
14419 "format": "date-span",
14420 "nullable": true
14421 },
14422 "appliesOnMonday": {
14423 "type": "boolean",
14424 "description": "Indicates if discount is available on Mondays."
14425 },
14426 "appliesOnTuesday": {
14427 "type": "boolean",
14428 "description": "Indicates if discount is available on Tuesdays."
14429 },
14430 "appliesOnWednesday": {
14431 "type": "boolean",
14432 "description": "Indicates if discount is available on Wednesdays."
14433 },
14434 "appliesOnThursday": {
14435 "type": "boolean",
14436 "description": "Indicates if discount is available on Thursdays."
14437 },
14438 "appliesOnFriday": {
14439 "type": "boolean",
14440 "description": "Indicates if discount is available on Fridays."
14441 },
14442 "appliesOnSaturday": {
14443 "type": "boolean",
14444 "description": "Indicates if discount is available on Saturdays."
14445 },
14446 "appliesOnSunday": {
14447 "type": "boolean",
14448 "description": "Indicates if discount is available on Sundays."
14449 }
14450 },
14451 "additionalProperties": false,
14452 "description": "Weekly recurring schedule model defining time-based availability patterns for discount application."
14453 }
14454 },
14455 "securitySchemes": {
14456 "basicAuth": {
14457 "type": "http",
14458 "description": "**API Key Authentication Required**\r\n\r\n**How to Authenticate:**\r\n1. Use HTTP Basic Authentication\r\n2. Username: Your API key\r\n3. Password: Leave empty\r\n4. Header format: `Authorization: Basic <base64-encoded-api-key:>`\r\n\r\n**Example:**\r\n- API Key: `your-api-key-here`\r\n- Header: `Authorization: Basic eW91ci1hcGkta2V5LWhlcmU6`\r\n\r\n**All endpoints require authentication** - requests without valid API keys will receive `401 Unauthorized` responses.",
14459 "scheme": "basic"
14460 }
14461 }
14462 },
14463 "security": [
14464 {
14465 "basicAuth": []
14466 }
14467 ]
14468}