{
	"openapi": "3.0.3",
	"info": {
		"title": "MyTown — ws_spring_biz_appointments",
		"version": "0.2.0",
		"description": "Agenda e appuntamenti lato impresa.\n\nDocumentazione generata automaticamente dal codice sorgente da `platform/tools/openapi-gen`.\nNon modificare a mano: le modifiche vanno fatte nei controller e la specifica va rigenerata.\n\nAutenticazione: token JWT nell’header `Authorization: Bearer <token>`, ottenuto da\n`POST /ws_spring_portal_login/api/login`. Gli endpoint marcati come pubblici non richiedono il token.",
		"license": {
			"name": "AGPL-3.0-or-later",
			"url": "https://www.gnu.org/licenses/agpl-3.0.html"
		}
	},
	"servers": [
		{
			"url": "/ws_spring_biz_appointments/api",
			"description": "Stesso host, servizi esposti alla radice (Tomcat diretto)"
		},
		{
			"url": "/api/ws_spring_biz_appointments/api",
			"description": "Stesso host, servizi dietro reverse proxy montato su /api (vedi platform/INSTALL.md)"
		},
		{
			"url": "{host}/ws_spring_biz_appointments/api",
			"description": "Host esplicito",
			"variables": {
				"host": {
					"default": "http://localhost:8080",
					"description": "Schema e host del server applicativo"
				}
			}
		}
	],
	"tags": [
		{
			"name": "Appointments",
			"description": "Endpoint di AppointmentsController (src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java)"
		},
		{
			"name": "Attachments",
			"description": "Endpoint di AttachmentsController (src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AttachmentsController.java)"
		},
		{
			"name": "Availability",
			"description": "Endpoint di AvailabilityController (src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java)"
		},
		{
			"name": "ServiceCategories",
			"description": "Endpoint di ServiceCategoriesController (src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceCategoriesController.java)"
		},
		{
			"name": "ServiceTypes",
			"description": "Endpoint di ServiceTypesController (src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceTypesController.java)"
		}
	],
	"paths": {
		"/api/appointment-attachments/del/{att_id}": {
			"delete": {
				"tags": [
					"Attachments"
				],
				"summary": "Delete Appointment Attachment",
				"description": "DELETE /appointment-attachments/del/{att_id} - Elimina allegato\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AttachmentsController.java:162` — `AttachmentsController.DeleteAppointmentAttachment()`.",
				"operationId": "AttachmentsController.DeleteAppointmentAttachment",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AttachmentsController.java:162",
				"parameters": [
					{
						"name": "att_id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointment-attachments/download-async/{att_id}": {
			"get": {
				"tags": [
					"Attachments"
				],
				"summary": "Download Attachment Async",
				"description": "GET /appointment-attachments/download-async/{att_id} - Download ASINCRONO.\r Accoda un job (BIZ_ATTACHMENT) sulla tabella job condivisa (FDW verso\r CompanyDB): il worker legge il BLOB dal DB e lo mette in \"I miei download\".\r Ritorna subito l'ExportJob (PENDING).\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AttachmentsController.java:139` — `AttachmentsController.DownloadAttachmentAsync()`.",
				"operationId": "AttachmentsController.DownloadAttachmentAsync",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AttachmentsController.java:139",
				"parameters": [
					{
						"name": "att_id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "cmpId",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32",
							"default": "0"
						}
					},
					{
						"name": "label",
						"in": "query",
						"required": false,
						"schema": {
							"type": "string",
							"default": ""
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ExportJob"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointment-attachments/download/{att_id}": {
			"get": {
				"tags": [
					"Attachments"
				],
				"summary": "Download Attachment",
				"description": "GET /appointment-attachments/download/{att_id} - Scarica allegato.\r Scrive il blob nella cartella temp servita su imageBaseURL/temp e ritorna { res: filename },\r stesso pattern degli altri download del portale (funziona anche su app nativa).\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AttachmentsController.java:103` — `AttachmentsController.DownloadAttachment()`.",
				"operationId": "AttachmentsController.DownloadAttachment",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AttachmentsController.java:103",
				"parameters": [
					{
						"name": "att_id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"404": {
						"description": "Risorsa non trovata"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointment-attachments/list/{apt_id}": {
			"get": {
				"tags": [
					"Attachments"
				],
				"summary": "Get Appointment Attachments",
				"description": "GET /appointment-attachments/list/{apt_id} - Lista allegati di un appuntamento\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AttachmentsController.java:84` — `AttachmentsController.GetAppointmentAttachments()`.",
				"operationId": "AttachmentsController.GetAppointmentAttachments",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AttachmentsController.java:84",
				"parameters": [
					{
						"name": "apt_id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/AppointmentAttachment"
									}
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointment-attachments/upload/{apt_id}": {
			"post": {
				"tags": [
					"Attachments"
				],
				"summary": "Upload Attachment",
				"description": "POST /appointment-attachments/upload/{apt_id} - Upload allegato appuntamento\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AttachmentsController.java:53` — `AttachmentsController.UploadAttachment()`.",
				"operationId": "AttachmentsController.UploadAttachment",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AttachmentsController.java:53",
				"parameters": [
					{
						"name": "apt_id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "description",
						"in": "query",
						"required": false,
						"schema": {
							"type": "string",
							"default": ""
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"multipart/form-data": {
							"schema": {
								"type": "object",
								"properties": {
									"file": {
										"type": "string",
										"format": "binary"
									}
								},
								"required": [
									"file"
								]
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AppointmentAttachment"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointments/add": {
			"post": {
				"tags": [
					"Appointments"
				],
				"summary": "Insert Appointment",
				"description": "POST /appointments/add - Crea nuovo appuntamento\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:102` — `AppointmentsController.InsertAppointment()`.",
				"operationId": "AppointmentsController.InsertAppointment",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:102",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/Appointment"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointments/calendar": {
			"get": {
				"tags": [
					"Appointments"
				],
				"summary": "Get Appointments For Calendar",
				"description": "GET /appointments/calendar - Appuntamenti per vista calendario\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:207` — `AppointmentsController.GetAppointmentsForCalendar()`.",
				"operationId": "AppointmentsController.GetAppointmentsForCalendar",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:207",
				"parameters": [
					{
						"name": "cmp_id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "date_from",
						"in": "query",
						"required": true,
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "date_to",
						"in": "query",
						"required": true,
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "status",
						"in": "query",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "service_type_id",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "operator_em_id",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "client_usr_id",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/Appointment"
									}
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointments/del/{id}": {
			"delete": {
				"tags": [
					"Appointments"
				],
				"summary": "Delete Appointment",
				"description": "DELETE /appointments/del/{id} - Elimina appuntamento (soft delete)\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:136` — `AppointmentsController.DeleteAppointment()`.",
				"operationId": "AppointmentsController.DeleteAppointment",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:136",
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointments/free-slots": {
			"get": {
				"tags": [
					"Appointments"
				],
				"summary": "Get Free Slots",
				"description": "GET /appointments/free-slots - Slot liberi disponibili\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:233` — `AppointmentsController.GetFreeSlots()`.",
				"operationId": "AppointmentsController.GetFreeSlots",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:233",
				"parameters": [
					{
						"name": "cmp_id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "service_type_id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "date_from",
						"in": "query",
						"required": true,
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "date_to",
						"in": "query",
						"required": true,
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "operator_em_id",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "duration_minutes",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/FreeSlot"
									}
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointments/get/{id}": {
			"get": {
				"tags": [
					"Appointments"
				],
				"summary": "Get Appointment",
				"description": "GET /appointments/get/{id} - Dettaglio singolo appuntamento\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:85` — `AppointmentsController.GetAppointment()`.",
				"operationId": "AppointmentsController.GetAppointment",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:85",
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Appointment"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointments/list": {
			"get": {
				"tags": [
					"Appointments"
				],
				"summary": "Get List",
				"description": "GET /appointments/list - Lista appuntamenti con filtri e paginazione\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:46` — `AppointmentsController.GetList()`.",
				"operationId": "AppointmentsController.GetList",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:46",
				"parameters": [
					{
						"name": "cmp_id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "txtsearch",
						"in": "query",
						"required": false,
						"schema": {
							"type": "string",
							"default": ""
						}
					},
					{
						"name": "order_by",
						"in": "query",
						"required": false,
						"schema": {
							"type": "string",
							"default": ""
						}
					},
					{
						"name": "limit",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32",
							"default": "20"
						}
					},
					{
						"name": "offset",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int64",
							"default": "0"
						}
					},
					{
						"name": "status",
						"in": "query",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "service_type_id",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "operator_em_id",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "client_usr_id",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "date_from",
						"in": "query",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "date_to",
						"in": "query",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "programmatic_only",
						"in": "query",
						"required": false,
						"schema": {
							"type": "boolean"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "object"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointments/programmatic/{id}": {
			"post": {
				"tags": [
					"Appointments"
				],
				"summary": "Set Programmatic",
				"description": "POST /appointments/programmatic/{id} - Imposta/azzera la scadenza evento programmatico.\r Body: { \"due_date\": \"yyyy-MM-dd\" } oppure { \"due_date\": null } per disattivare.\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:154` — `AppointmentsController.SetProgrammatic()`.",
				"operationId": "AppointmentsController.SetProgrammatic",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:154",
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"additionalProperties": {
									"type": "string"
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointments/transition/{id}": {
			"post": {
				"tags": [
					"Appointments"
				],
				"summary": "Transition Status",
				"description": "POST /appointments/transition/{id} - Transizione stato appuntamento\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:188` — `AppointmentsController.TransitionStatus()`.",
				"operationId": "AppointmentsController.TransitionStatus",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:188",
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/StatusTransitionRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Appointment"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/appointments/upd": {
			"put": {
				"tags": [
					"Appointments"
				],
				"summary": "Update Appointment",
				"description": "PUT /appointments/upd - Aggiorna appuntamento\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:119` — `AppointmentsController.UpdateAppointment()`.",
				"operationId": "AppointmentsController.UpdateAppointment",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AppointmentsController.java:119",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/Appointment"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/availability/exceptions": {
			"get": {
				"tags": [
					"Availability"
				],
				"summary": "Get Exceptions",
				"description": "GET /availability/exceptions - Eccezioni disponibilita\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:79` — `AvailabilityController.GetExceptions()`.",
				"operationId": "AvailabilityController.GetExceptions",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:79",
				"parameters": [
					{
						"name": "cmp_id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "operator_em_id",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "date_from",
						"in": "query",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "date_to",
						"in": "query",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/AvailabilityException"
									}
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/availability/exceptions/add": {
			"post": {
				"tags": [
					"Availability"
				],
				"summary": "Add Exception",
				"description": "POST /availability/exceptions/add - Aggiungi eccezione\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:100` — `AvailabilityController.AddException()`.",
				"operationId": "AvailabilityController.AddException",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:100",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AvailabilityException"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/availability/exceptions/del/{id}": {
			"delete": {
				"tags": [
					"Availability"
				],
				"summary": "Delete Exception",
				"description": "DELETE /availability/exceptions/del/{id} - Elimina eccezione\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:117` — `AvailabilityController.DeleteException()`.",
				"operationId": "AvailabilityController.DeleteException",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:117",
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/availability/operators": {
			"get": {
				"tags": [
					"Availability"
				],
				"summary": "Get Operators",
				"description": "GET /availability/operators - Lista operatori disponibili\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:134` — `AvailabilityController.GetOperators()`.",
				"operationId": "AvailabilityController.GetOperators",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:134",
				"parameters": [
					{
						"name": "cmp_id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/OperatorSimple"
									}
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/availability/templates": {
			"get": {
				"tags": [
					"Availability"
				],
				"summary": "Get Weekly Templates",
				"description": "GET /availability/templates - Template settimanali disponibilita\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:40` — `AvailabilityController.GetWeeklyTemplates()`.",
				"operationId": "AvailabilityController.GetWeeklyTemplates",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:40",
				"parameters": [
					{
						"name": "cmp_id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "operator_em_id",
						"in": "query",
						"required": false,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/WeeklyTemplate"
									}
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/availability/templates/save": {
			"post": {
				"tags": [
					"Availability"
				],
				"summary": "Save Weekly Templates",
				"description": "POST /availability/templates/save - Salva template settimanali\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:59` — `AvailabilityController.SaveWeeklyTemplates()`.",
				"operationId": "AvailabilityController.SaveWeeklyTemplates",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/AvailabilityController.java:59",
				"parameters": [
					{
						"name": "cmp_id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					},
					{
						"name": "operator_em_id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "array",
								"items": {
									"$ref": "#/components/schemas/WeeklyTemplate"
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/categories/add": {
			"post": {
				"tags": [
					"ServiceCategories"
				],
				"summary": "Insert Service Category",
				"description": "POST /categories/add - Crea nuova categoria\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceCategoriesController.java:72` — `ServiceCategoriesController.InsertServiceCategory()`.",
				"operationId": "ServiceCategoriesController.InsertServiceCategory",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceCategoriesController.java:72",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ServiceCategory"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/categories/del/{id}": {
			"delete": {
				"tags": [
					"ServiceCategories"
				],
				"summary": "Delete Service Category",
				"description": "DELETE /categories/del/{id} - Elimina categoria (soft delete)\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceCategoriesController.java:106` — `ServiceCategoriesController.DeleteServiceCategory()`.",
				"operationId": "ServiceCategoriesController.DeleteServiceCategory",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceCategoriesController.java:106",
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/categories/get/{id}": {
			"get": {
				"tags": [
					"ServiceCategories"
				],
				"summary": "Get Service Category",
				"description": "GET /categories/get/{id} - Dettaglio singola categoria\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceCategoriesController.java:55` — `ServiceCategoriesController.GetServiceCategory()`.",
				"operationId": "ServiceCategoriesController.GetServiceCategory",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceCategoriesController.java:55",
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ServiceCategory"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/categories/list": {
			"get": {
				"tags": [
					"ServiceCategories"
				],
				"summary": "Get List",
				"description": "GET /categories/list?cmp_id=X - Lista categorie per azienda\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceCategoriesController.java:38` — `ServiceCategoriesController.GetList()`.",
				"operationId": "ServiceCategoriesController.GetList",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceCategoriesController.java:38",
				"parameters": [
					{
						"name": "cmp_id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/ServiceCategory"
									}
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/categories/upd": {
			"put": {
				"tags": [
					"ServiceCategories"
				],
				"summary": "Update Service Category",
				"description": "PUT /categories/upd - Aggiorna categoria\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceCategoriesController.java:89` — `ServiceCategoriesController.UpdateServiceCategory()`.",
				"operationId": "ServiceCategoriesController.UpdateServiceCategory",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceCategoriesController.java:89",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ServiceCategory"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/service-types/add": {
			"post": {
				"tags": [
					"ServiceTypes"
				],
				"summary": "Insert Service Type",
				"description": "POST /service-types/add - Crea nuovo tipo servizio\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceTypesController.java:72` — `ServiceTypesController.InsertServiceType()`.",
				"operationId": "ServiceTypesController.InsertServiceType",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceTypesController.java:72",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ServiceType"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/service-types/del/{id}": {
			"delete": {
				"tags": [
					"ServiceTypes"
				],
				"summary": "Delete Service Type",
				"description": "DELETE /service-types/del/{id} - Elimina tipo servizio (soft delete)\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceTypesController.java:106` — `ServiceTypesController.DeleteServiceType()`.",
				"operationId": "ServiceTypesController.DeleteServiceType",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceTypesController.java:106",
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/service-types/get/{id}": {
			"get": {
				"tags": [
					"ServiceTypes"
				],
				"summary": "Get Service Type",
				"description": "GET /service-types/get/{id} - Dettaglio singolo tipo servizio\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceTypesController.java:55` — `ServiceTypesController.GetServiceType()`.",
				"operationId": "ServiceTypesController.GetServiceType",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceTypesController.java:55",
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ServiceType"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/service-types/list": {
			"get": {
				"tags": [
					"ServiceTypes"
				],
				"summary": "Get List",
				"description": "GET /service-types/list?cmp_id=X - Lista tipi servizio per azienda\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceTypesController.java:38` — `ServiceTypesController.GetList()`.",
				"operationId": "ServiceTypesController.GetList",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceTypesController.java:38",
				"parameters": [
					{
						"name": "cmp_id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int32"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/ServiceType"
									}
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/service-types/upd": {
			"put": {
				"tags": [
					"ServiceTypes"
				],
				"summary": "Update Service Type",
				"description": "PUT /service-types/upd - Aggiorna tipo servizio\n\nSorgente: `src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceTypesController.java:89` — `ServiceTypesController.UpdateServiceType()`.",
				"operationId": "ServiceTypesController.UpdateServiceType",
				"x-source": "src/main/java/com/kondorcs/ws_spring_biz_appointments/controller/ServiceTypesController.java:89",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ServiceType"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK",
						"content": {
							"application/json": {
								"schema": {
									"type": "integer",
									"format": "int32"
								}
							}
						}
					},
					"400": {
						"description": "Richiesta non valida"
					},
					"401": {
						"description": "Non autenticato: token JWT assente, scaduto o non valido"
					},
					"500": {
						"description": "Errore interno del servizio",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		}
	},
	"components": {
		"securitySchemes": {
			"bearerAuth": {
				"type": "http",
				"scheme": "bearer",
				"bearerFormat": "JWT",
				"description": "Token JWT emesso dal servizio di login del portale."
			}
		},
		"schemas": {
			"ErrorResponse": {
				"type": "object",
				"description": "Corpo di errore del gestore centralizzato delle eccezioni (kondorcs-utils, GlobalExceptionHandler). Le proprietà oltre a `requestId` sono presenti solo se il chiamante ha ruolo ADMIN.",
				"properties": {
					"timestamp": {
						"type": "string",
						"format": "date-time"
					},
					"status": {
						"type": "integer",
						"format": "int32"
					},
					"error": {
						"type": "string"
					},
					"message": {
						"type": "string"
					},
					"requestId": {
						"type": "string",
						"description": "Solo nella variante generica (utenti non ADMIN)."
					},
					"rootCause": {
						"type": "string",
						"description": "Solo per ADMIN."
					},
					"formattedRootCause": {
						"type": "string",
						"description": "Solo per ADMIN."
					},
					"location": {
						"type": "string",
						"description": "Solo per ADMIN: classe, metodo e riga."
					},
					"requestUri": {
						"type": "string",
						"description": "Solo per ADMIN."
					},
					"httpMethod": {
						"type": "string",
						"description": "Solo per ADMIN."
					},
					"user": {
						"type": "string",
						"description": "Solo per ADMIN."
					},
					"parameters": {
						"type": "object",
						"additionalProperties": {
							"type": "string"
						},
						"description": "Solo per ADMIN."
					},
					"contentType": {
						"type": "string",
						"description": "Solo per ADMIN."
					},
					"requestHeaders": {
						"type": "object",
						"additionalProperties": {
							"type": "string"
						},
						"description": "Solo per ADMIN."
					},
					"requestBody": {
						"type": "string",
						"description": "Solo per ADMIN, se la richiesta aveva un corpo."
					},
					"stackTrace": {
						"type": "string",
						"description": "Solo per ADMIN e solo se `log.db.write.stacktrace` è attivo."
					}
				}
			},
			"ExportJob": {
				"type": "object",
				"properties": {
					"exj_id": {
						"type": "integer",
						"format": "int32"
					},
					"exj_pt_id": {
						"type": "integer",
						"format": "int32"
					},
					"exj_user_id": {
						"type": "integer",
						"format": "int32"
					},
					"exj_company_id": {
						"type": "integer",
						"format": "int32"
					},
					"exj_tipo": {
						"type": "string"
					},
					"exj_label": {
						"type": "string"
					},
					"exj_params": {
						"type": "string"
					},
					"exj_stato": {
						"type": "string"
					},
					"exj_file": {
						"type": "string"
					},
					"exj_error": {
						"type": "string"
					},
					"exj_summary": {
						"type": "string"
					},
					"exj_created": {
						"type": "string"
					},
					"exj_started": {
						"type": "string"
					},
					"exj_finished": {
						"type": "string"
					}
				}
			},
			"AppointmentAttachment": {
				"type": "object",
				"properties": {
					"att_id": {
						"type": "integer",
						"format": "int32"
					},
					"att_apt_id": {
						"type": "integer",
						"format": "int32"
					},
					"att_filename": {
						"type": "string"
					},
					"att_mime_type": {
						"type": "string"
					},
					"att_size_bytes": {
						"type": "integer",
						"format": "int64"
					},
					"att_uploaded_by": {
						"type": "integer",
						"format": "int32"
					},
					"att_description": {
						"type": "string"
					},
					"att_created_at": {
						"type": "string",
						"format": "date-time"
					},
					"uploaded_by_lastname": {
						"type": "string"
					}
				}
			},
			"Appointment": {
				"type": "object",
				"properties": {
					"apt_id": {
						"type": "integer",
						"format": "int32"
					},
					"apt_cmp_id": {
						"type": "integer",
						"format": "int32"
					},
					"apt_service_type_id": {
						"type": "integer",
						"format": "int32"
					},
					"apt_client_usr_id": {
						"type": "integer",
						"format": "int32"
					},
					"apt_operator_em_id": {
						"type": "integer",
						"format": "int32"
					},
					"apt_status": {
						"type": "string"
					},
					"apt_requested_date": {
						"type": "string"
					},
					"apt_requested_time": {
						"type": "string"
					},
					"apt_proposed_date": {
						"type": "string"
					},
					"apt_proposed_time": {
						"type": "string"
					},
					"apt_confirmed_date": {
						"type": "string"
					},
					"apt_confirmed_time": {
						"type": "string"
					},
					"apt_duration_minutes": {
						"type": "integer",
						"format": "int32"
					},
					"apt_client_notes": {
						"type": "string"
					},
					"apt_operator_notes": {
						"type": "string"
					},
					"apt_cancellation_reason": {
						"type": "string"
					},
					"apt_rejection_reason": {
						"type": "string"
					},
					"apt_created_at": {
						"type": "string",
						"format": "date-time"
					},
					"apt_updated_at": {
						"type": "string",
						"format": "date-time"
					},
					"apt_created_by": {
						"type": "integer",
						"format": "int32"
					},
					"apt_active": {
						"type": "boolean"
					},
					"apt_service_type_ids": {
						"type": "string"
					},
					"client_lastname": {
						"type": "string"
					},
					"client_email": {
						"type": "string"
					},
					"client_phone": {
						"type": "string"
					},
					"operator_lastname": {
						"type": "string"
					},
					"service_type_mode": {
						"type": "string"
					},
					"service_type_color": {
						"type": "string"
					},
					"message_count": {
						"type": "integer",
						"format": "int32"
					},
					"unread_message_count": {
						"type": "integer",
						"format": "int32"
					}
				}
			},
			"FreeSlot": {
				"type": "object",
				"properties": {
					"operator_em_id": {
						"type": "integer",
						"format": "int32"
					},
					"operator_name": {
						"type": "string"
					},
					"date": {
						"type": "string"
					},
					"start_time": {
						"type": "string"
					},
					"end_time": {
						"type": "string"
					},
					"duration_minutes": {
						"type": "integer",
						"format": "int32"
					},
					"reserved": {
						"type": "boolean"
					}
				}
			},
			"StatusTransitionRequest": {
				"type": "object",
				"properties": {
					"new_status": {
						"type": "string"
					},
					"notes": {
						"type": "string"
					},
					"proposed_date": {
						"type": "string"
					},
					"proposed_time": {
						"type": "string"
					},
					"operator_em_id": {
						"type": "integer",
						"format": "int32"
					},
					"cancellation_reason": {
						"type": "string"
					},
					"quote_description": {
						"type": "string"
					},
					"quote_valid_until": {
						"type": "string"
					}
				}
			},
			"AvailabilityException": {
				"type": "object",
				"properties": {
					"ae_id": {
						"type": "integer",
						"format": "int32"
					},
					"ae_cmp_id": {
						"type": "integer",
						"format": "int32"
					},
					"ae_operator_em_id": {
						"type": "integer",
						"format": "int32"
					},
					"ae_date": {
						"type": "string"
					},
					"ae_type": {
						"type": "string"
					},
					"ae_start_time": {
						"type": "string"
					},
					"ae_end_time": {
						"type": "string"
					},
					"ae_reason": {
						"type": "string"
					},
					"ae_created_at": {
						"type": "string",
						"format": "date-time"
					}
				}
			},
			"OperatorSimple": {
				"type": "object",
				"properties": {
					"em_id": {
						"type": "integer",
						"format": "int32"
					},
					"em_cmp_id": {
						"type": "integer",
						"format": "int32"
					},
					"em_firstname": {
						"type": "string"
					},
					"em_lastname": {
						"type": "string"
					}
				}
			},
			"WeeklyTemplate": {
				"type": "object",
				"properties": {
					"wt_id": {
						"type": "integer",
						"format": "int32"
					},
					"wt_cmp_id": {
						"type": "integer",
						"format": "int32"
					},
					"wt_operator_em_id": {
						"type": "integer",
						"format": "int32"
					},
					"wt_day_of_week": {
						"type": "integer",
						"format": "int32"
					},
					"wt_start_time": {
						"type": "string"
					},
					"wt_end_time": {
						"type": "string"
					},
					"wt_break_start": {
						"type": "string"
					},
					"wt_break_end": {
						"type": "string"
					},
					"wt_active": {
						"type": "boolean"
					},
					"operator_lastname": {
						"type": "string"
					}
				}
			},
			"ServiceCategory": {
				"type": "object",
				"properties": {
					"sc_id": {
						"type": "integer",
						"format": "int32"
					},
					"sc_cmp_id": {
						"type": "integer",
						"format": "int32"
					},
					"sc_name": {
						"type": "string"
					},
					"sc_description": {
						"type": "string"
					},
					"sc_color": {
						"type": "string"
					},
					"sc_order": {
						"type": "integer",
						"format": "int32"
					},
					"sc_active": {
						"type": "boolean"
					},
					"sc_created_at": {
						"type": "string",
						"format": "date-time"
					},
					"sc_updated_at": {
						"type": "string",
						"format": "date-time"
					}
				}
			},
			"ServiceType": {
				"type": "object",
				"properties": {
					"st_id": {
						"type": "integer",
						"format": "int32"
					},
					"st_cmp_id": {
						"type": "integer",
						"format": "int32"
					},
					"st_name": {
						"type": "string"
					},
					"st_description": {
						"type": "string"
					},
					"st_mode": {
						"type": "string"
					},
					"st_color": {
						"type": "string"
					},
					"st_requires_attachments": {
						"type": "boolean"
					},
					"st_active": {
						"type": "boolean"
					},
					"st_order": {
						"type": "integer",
						"format": "int32"
					},
					"st_category_id": {
						"type": "integer",
						"format": "int32"
					},
					"st_created_at": {
						"type": "string",
						"format": "date-time"
					},
					"st_updated_at": {
						"type": "string",
						"format": "date-time"
					}
				}
			}
		}
	},
	"security": [
		{
			"bearerAuth": []
		}
	]
}
