cooperto-mcp 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mattia Quercioli
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # Cooperto MCP
2
+
3
+ [![npm version](https://img.shields.io/npm/v/cooperto-mcp.svg)](https://www.npmjs.com/package/cooperto-mcp)
4
+ [![license](https://img.shields.io/npm/l/cooperto-mcp.svg)](./LICENSE)
5
+
6
+ A [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for the **[Cooperto.it](https://cooperto.it) API** — the booking, contacts/loyalty, queue and venue management platform.
7
+
8
+ The server is **spec-driven**: it reads `openapi.json` and automatically generates one MCP tool for each of the API's ~40 operations. When the spec is updated, the tools update with it — no code to rewrite. This lets any MCP-compatible client (such as Claude) read and manage Cooperto data through natural language.
9
+
10
+ ## Features
11
+
12
+ - **One tool per endpoint** — e.g. `Prenotazioni_ElencoByCodiceSede`, `Contatti_Crea`, `Coda_ConfermaArrivo`.
13
+ - **Model-friendly inputs** — `query` and `path` parameters become flat tool fields; the JSON request `body` is flattened into readable fields.
14
+ - **Secure token handling** — the `Authorization: Bearer <token>` header is injected by the server, never exposed to the model as a parameter.
15
+ - **Multi-tenant ready** — each Cooperto client can use its own token, set per session or per call.
16
+
17
+ ## Requirements
18
+
19
+ - [Node.js](https://nodejs.org) 18 or newer.
20
+ - A valid Cooperto.it API token (Bearer token issued by Cooperto.it).
21
+
22
+ ## Installation
23
+
24
+ The package is published on npm, so there is nothing to clone or build. Your MCP client downloads and runs it with `npx`.
25
+
26
+ ### Claude Desktop
27
+
28
+ Add the following to your `claude_desktop_config.json`:
29
+
30
+ ```json
31
+ {
32
+ "mcpServers": {
33
+ "cooperto": {
34
+ "command": "npx",
35
+ "args": ["-y", "cooperto-mcp@latest"]
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ Then fully restart the app. The same configuration works on any machine — no local paths, no manual install.
42
+
43
+ ### Claude Code (CLI)
44
+
45
+ ```bash
46
+ claude mcp add cooperto -- npx -y cooperto-mcp@latest
47
+ ```
48
+
49
+ ## Authentication
50
+
51
+ Every Cooperto client has its own token. The server resolves it in this **order of priority**:
52
+
53
+ 1. a `token` field passed in an **individual tool call** (one-off override);
54
+ 2. a token set for the **session** via the `cooperto_imposta_token` tool;
55
+ 3. the `COOPERTO_API_TOKEN` **environment variable** (server default).
56
+
57
+ ### Recommended: token per project
58
+
59
+ Keep a **separate Claude project for each client** and put its token in the project instructions, for example:
60
+
61
+ > At the start of the conversation, call `cooperto_imposta_token` with `token: <CLIENT_TOKEN>` and `cliente: <NAME>`. Use only that token for all Cooperto calls.
62
+
63
+ This keeps every project scoped to a single client.
64
+
65
+ ### Token via environment variable
66
+
67
+ To avoid placing the token in chat, set it as a server environment variable in your client config:
68
+
69
+ ```json
70
+ {
71
+ "mcpServers": {
72
+ "cooperto": {
73
+ "command": "npx",
74
+ "args": ["-y", "cooperto-mcp@latest"],
75
+ "env": { "COOPERTO_API_TOKEN": "YOUR_TOKEN" }
76
+ }
77
+ }
78
+ }
79
+ ```
80
+
81
+ > **Note:** a token written into chat or project instructions remains in plain text within the conversation context. For sensitive use, prefer the environment-variable approach.
82
+
83
+ ## Available endpoint groups
84
+
85
+ | Group | Example tools |
86
+ |----------------|-------------------------------------------------------------------------------|
87
+ | `Sedi` | `Sedi_Elenco`, `Sedi_ElencoOrari` |
88
+ | `Prenotazioni` | `Prenotazioni_ElencoByCodiceSede`, `Prenotazioni_Crea`, `Prenotazioni_Aggiorna`, `Prenotazioni_AggiornaStato`, `Prenotazioni_OrariModulo` |
89
+ | `Contatti` | `Contatti_Elenco`, `Contatti_Crea`, `Contatti_SaldoPuntiByCodiceContatto`, `Contatti_AggiungiPuntiCard`, coupons, tags, movements |
90
+ | `Coda` | `Coda_ElencoByCodiceSede`, `Coda_Crea`, `Coda_ConfermaArrivo` |
91
+ | `FidelityCard` | `FidelityCard_Elenco` |
92
+ | `Wifi` | `Wifi_Login` |
93
+
94
+ ## ⚠️ Write operations
95
+
96
+ Many tools **modify real data** (create/update/delete bookings, add/remove loyalty points, redeem coupons). When using the server conversationally, keep this in mind: consider testing against a demo venue first, and keep manual confirmation of write tools enabled in your client.
97
+
98
+ ## Disclaimer
99
+
100
+ This is an unofficial, community-maintained client for the Cooperto.it API. It is not affiliated with or endorsed by Cooperto.it. "Cooperto" and related marks belong to their respective owners. Use at your own risk.
101
+
102
+ ## License
103
+
104
+ Released under the [MIT License](./LICENSE).
package/dist/index.js ADDED
@@ -0,0 +1,362 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP server per l'API Cooperto.it.
4
+ *
5
+ * È "spec-driven": legge openapi.json (Swagger 2.0) e genera automaticamente
6
+ * un tool MCP per ogni operazione. L'autenticazione Bearer viene iniettata dal
7
+ * server a partire dalla variabile d'ambiente COOPERTO_API_TOKEN, quindi il
8
+ * token non è mai un parametro esposto al modello.
9
+ */
10
+ import { readFileSync } from "node:fs";
11
+ import { fileURLToPath } from "node:url";
12
+ import { dirname, join } from "node:path";
13
+ import { Agent, setGlobalDispatcher } from "undici";
14
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
15
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
16
+ import { ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
17
+ // ---------------------------------------------------------------------------
18
+ // Config
19
+ // ---------------------------------------------------------------------------
20
+ const __dirname = dirname(fileURLToPath(import.meta.url));
21
+ const SPEC_PATH = join(__dirname, "..", "openapi.json");
22
+ // L'host (Cloudflare) pubblica record sia IPv4 sia IPv6. Su reti senza rotta
23
+ // IPv6 il fetch di Node può andare in ETIMEDOUT invece di ripiegare su IPv4.
24
+ // Abilitiamo Happy-Eyeballs (autoSelectFamily); con COOPERTO_IPV4_ONLY=1 si
25
+ // forza IPv4 (più veloce su reti solo-IPv4).
26
+ const IPV4_ONLY = /^(1|true|yes)$/i.test(process.env.COOPERTO_IPV4_ONLY?.trim() ?? "");
27
+ const connectOptions = IPV4_ONLY
28
+ ? { family: 4 }
29
+ : { autoSelectFamily: true, autoSelectFamilyAttemptTimeout: 300 };
30
+ setGlobalDispatcher(new Agent({ connect: connectOptions, headersTimeout: 30_000, bodyTimeout: 30_000 }));
31
+ const RAW_TOKEN = process.env.COOPERTO_API_TOKEN?.trim() ?? "";
32
+ // Tollera che l'utente abbia già incluso il prefisso "Bearer ".
33
+ const ENV_TOKEN = RAW_TOKEN.replace(/^Bearer\s+/i, "");
34
+ // Token "di sessione" impostato a runtime via il tool cooperto_imposta_token.
35
+ // Permette il flusso multi-cliente: si indica il token del cliente corrente
36
+ // (dalle istruzioni di progetto o dalla chat) e tutte le chiamate lo useranno.
37
+ let sessionToken = "";
38
+ let sessionLabel = "";
39
+ const SET_TOKEN_TOOL = "cooperto_imposta_token";
40
+ function stripBearer(t) {
41
+ return t.replace(/^Bearer\s+/i, "").trim();
42
+ }
43
+ function maskToken(t) {
44
+ if (!t)
45
+ return "(vuoto)";
46
+ return t.length <= 8 ? "****" : `${t.slice(0, 4)}…${t.slice(-4)}`;
47
+ }
48
+ const spec = JSON.parse(readFileSync(SPEC_PATH, "utf8"));
49
+ const DEFINITIONS = spec.definitions ?? {};
50
+ const SCHEMES = spec.schemes ?? ["https"];
51
+ const HOST = spec.host ?? "api.cooperto.it";
52
+ const BASE_PATH = spec.basePath ?? "";
53
+ const DEFAULT_BASE = `${SCHEMES.includes("https") ? "https" : SCHEMES[0]}://${HOST}${BASE_PATH}`;
54
+ const BASE_URL = (process.env.COOPERTO_BASE_URL?.trim() || DEFAULT_BASE).replace(/\/$/, "");
55
+ // --- gestione $ref (Swagger usa #/definitions, JSON Schema usa #/$defs) ------
56
+ function collectRefs(node, used) {
57
+ if (Array.isArray(node)) {
58
+ for (const n of node)
59
+ collectRefs(n, used);
60
+ return;
61
+ }
62
+ if (node && typeof node === "object") {
63
+ if (typeof node.$ref === "string") {
64
+ const m = node.$ref.match(/#\/definitions\/(.+)$/);
65
+ if (m)
66
+ used.add(m[1]);
67
+ }
68
+ for (const v of Object.values(node))
69
+ collectRefs(v, used);
70
+ }
71
+ }
72
+ function rewriteRefs(node) {
73
+ if (Array.isArray(node))
74
+ return node.map(rewriteRefs);
75
+ if (node && typeof node === "object") {
76
+ const out = {};
77
+ for (const [k, v] of Object.entries(node)) {
78
+ if (k === "$ref" && typeof v === "string") {
79
+ out[k] = v.replace("#/definitions/", "#/$defs/");
80
+ }
81
+ else {
82
+ out[k] = rewriteRefs(v);
83
+ }
84
+ }
85
+ return out;
86
+ }
87
+ return node;
88
+ }
89
+ /** Chiusura transitiva delle definition referenziate, riscritte in #/$defs. */
90
+ function buildDefs(seed) {
91
+ const used = new Set(seed);
92
+ const frontier = [...used];
93
+ while (frontier.length) {
94
+ const name = frontier.pop();
95
+ const def = DEFINITIONS[name];
96
+ if (!def)
97
+ continue;
98
+ const sub = new Set();
99
+ collectRefs(def, sub);
100
+ for (const s of sub) {
101
+ if (!used.has(s)) {
102
+ used.add(s);
103
+ frontier.push(s);
104
+ }
105
+ }
106
+ }
107
+ const defs = {};
108
+ for (const name of used) {
109
+ if (DEFINITIONS[name])
110
+ defs[name] = rewriteRefs(DEFINITIONS[name]);
111
+ }
112
+ return defs;
113
+ }
114
+ // --- conversione parametri (non-body) in proprietà JSON Schema ---------------
115
+ function paramToProp(p) {
116
+ const prop = {};
117
+ if (p.type)
118
+ prop.type = p.type;
119
+ if (p.format)
120
+ prop.format = p.format;
121
+ if (p.description)
122
+ prop.description = p.description;
123
+ if (p.enum)
124
+ prop.enum = p.enum;
125
+ if (p.items)
126
+ prop.items = rewriteRefs(p.items);
127
+ if (p.default !== undefined)
128
+ prop.default = p.default;
129
+ return prop;
130
+ }
131
+ const tools = [];
132
+ for (const [path, methods] of Object.entries(spec.paths)) {
133
+ for (const [method, op] of Object.entries(methods)) {
134
+ if (!["get", "post", "put", "patch", "delete"].includes(method))
135
+ continue;
136
+ const name = (op.operationId || `${method}_${path}`).replace(/[^a-zA-Z0-9_-]/g, "_");
137
+ const properties = {};
138
+ const required = [];
139
+ const defsSeed = new Set();
140
+ const queryNames = [];
141
+ const pathNames = [];
142
+ let bodyMode = "none";
143
+ let bodyKeys = [];
144
+ for (const p of (op.parameters || [])) {
145
+ if (p.in === "header" && String(p.name).toLowerCase() === "authorization")
146
+ continue; // iniettato dal server
147
+ if (p.in === "query" || p.in === "path") {
148
+ properties[p.name] = paramToProp(p);
149
+ if (p.required)
150
+ required.push(p.name);
151
+ (p.in === "query" ? queryNames : pathNames).push(p.name);
152
+ }
153
+ else if (p.in === "body") {
154
+ collectRefs(p.schema, defsSeed);
155
+ const rewritten = rewriteRefs(p.schema);
156
+ // Risolve un eventuale $ref di primo livello per provare a "appiattire"
157
+ // le proprietà dell'oggetto body al livello superiore (più leggibili
158
+ // per il modello).
159
+ let resolved = rewritten;
160
+ let resolvedRaw = p.schema;
161
+ const refMatch = typeof p.schema.$ref === "string" ? p.schema.$ref.match(/#\/definitions\/(.+)$/) : null;
162
+ if (refMatch && DEFINITIONS[refMatch[1]]) {
163
+ resolved = rewriteRefs(DEFINITIONS[refMatch[1]]);
164
+ resolvedRaw = DEFINITIONS[refMatch[1]];
165
+ }
166
+ const isFlatObject = resolved && resolved.type === "object" && resolved.properties && typeof resolved.properties === "object";
167
+ const collides = isFlatObject && Object.keys(resolved.properties).some((k) => k in properties);
168
+ if (isFlatObject && !collides) {
169
+ bodyMode = "merge";
170
+ for (const [k, v] of Object.entries(resolved.properties)) {
171
+ properties[k] = v;
172
+ bodyKeys.push(k);
173
+ }
174
+ for (const r of resolvedRaw.required || [])
175
+ if (!required.includes(r))
176
+ required.push(r);
177
+ }
178
+ else {
179
+ bodyMode = "nested";
180
+ properties["body"] = resolved;
181
+ if (p.required)
182
+ required.push("body");
183
+ }
184
+ }
185
+ }
186
+ // Parametro token opzionale per-chiamata (override multi-cliente).
187
+ if (!("token" in properties)) {
188
+ properties.token = {
189
+ type: "string",
190
+ description: "(Opzionale) Token Bearer del cliente da usare SOLO per questa chiamata. " +
191
+ "Passalo quando in chat o nelle istruzioni di progetto è indicato il token di uno specifico cliente. " +
192
+ "Se omesso, viene usato il token impostato con cooperto_imposta_token, o quello di default del server.",
193
+ };
194
+ }
195
+ const inputSchema = { type: "object", properties };
196
+ if (required.length)
197
+ inputSchema.required = required;
198
+ if (defsSeed.size)
199
+ inputSchema.$defs = buildDefs(defsSeed);
200
+ const description = [op.summary, op.description].filter(Boolean).join(" — ") ||
201
+ `${method.toUpperCase()} ${path}`;
202
+ tools.push({
203
+ name,
204
+ method,
205
+ path,
206
+ inputSchema,
207
+ description: `${description} [${method.toUpperCase()} ${path}]`,
208
+ queryNames,
209
+ pathNames,
210
+ bodyMode,
211
+ bodyKeys,
212
+ });
213
+ }
214
+ }
215
+ const toolByName = new Map(tools.map((t) => [t.name, t]));
216
+ // ---------------------------------------------------------------------------
217
+ // Server MCP
218
+ // ---------------------------------------------------------------------------
219
+ const server = new Server({ name: "cooperto-mcp", version: "0.1.0" }, { capabilities: { tools: {} } });
220
+ const setTokenToolDef = {
221
+ name: SET_TOKEN_TOOL,
222
+ description: "Imposta il token Bearer Cooperto da usare per le chiamate successive di questa sessione. " +
223
+ "Pensato per chi gestisce più clienti: indica qui il token del cliente corrente (preso dalle istruzioni " +
224
+ "di progetto o dalla chat) e tutte le chiamate lo useranno, così non si rischia di accedere ai dati di un altro cliente. " +
225
+ "Chiamalo all'inizio della conversazione quando le istruzioni indicano un token specifico.",
226
+ inputSchema: {
227
+ type: "object",
228
+ properties: {
229
+ token: {
230
+ type: "string",
231
+ description: "Token Bearer del cliente (con o senza il prefisso 'Bearer ').",
232
+ },
233
+ cliente: {
234
+ type: "string",
235
+ description: "(Opzionale) Nome/etichetta del cliente, usato solo per una conferma leggibile.",
236
+ },
237
+ },
238
+ required: ["token"],
239
+ },
240
+ };
241
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
242
+ tools: [
243
+ setTokenToolDef,
244
+ ...tools.map((t) => ({
245
+ name: t.name,
246
+ description: t.description,
247
+ inputSchema: t.inputSchema,
248
+ })),
249
+ ],
250
+ }));
251
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
252
+ // Tool speciale: imposta il token di sessione (flusso multi-cliente).
253
+ if (request.params.name === SET_TOKEN_TOOL) {
254
+ const t = stripBearer(String(request.params.arguments?.token ?? ""));
255
+ const label = String(request.params.arguments?.cliente ?? "");
256
+ if (!t) {
257
+ return { content: [{ type: "text", text: "Nessun token fornito." }], isError: true };
258
+ }
259
+ sessionToken = t;
260
+ sessionLabel = label;
261
+ return {
262
+ content: [
263
+ {
264
+ type: "text",
265
+ text: `Token di sessione impostato${label ? ` per il cliente "${label}"` : ""} (${maskToken(t)}). ` +
266
+ "Tutte le chiamate Cooperto useranno questo token finché non lo cambi o passi un token esplicito nella singola chiamata.",
267
+ },
268
+ ],
269
+ };
270
+ }
271
+ const tool = toolByName.get(request.params.name);
272
+ if (!tool) {
273
+ return { content: [{ type: "text", text: `Tool sconosciuto: ${request.params.name}` }], isError: true };
274
+ }
275
+ const args = request.params.arguments ?? {};
276
+ // Risoluzione token: esplicito per-chiamata > sessione > env di default.
277
+ const perCall = args.token ? stripBearer(String(args.token)) : "";
278
+ const effectiveToken = perCall || sessionToken || ENV_TOKEN;
279
+ if (!effectiveToken) {
280
+ return {
281
+ content: [
282
+ {
283
+ type: "text",
284
+ text: "Nessun token disponibile. Imposta il token del cliente con il tool cooperto_imposta_token, " +
285
+ "oppure passa il campo 'token' in questa chiamata, oppure configura COOPERTO_API_TOKEN come env del server.",
286
+ },
287
+ ],
288
+ isError: true,
289
+ };
290
+ }
291
+ // URL + path params
292
+ let url = BASE_URL + tool.path;
293
+ for (const pn of tool.pathNames) {
294
+ url = url.replace(`{${pn}}`, encodeURIComponent(String(args[pn] ?? "")));
295
+ }
296
+ // Query string
297
+ const qs = new URLSearchParams();
298
+ for (const qn of tool.queryNames) {
299
+ const v = args[qn];
300
+ if (v === undefined || v === null)
301
+ continue;
302
+ if (Array.isArray(v))
303
+ v.forEach((item) => qs.append(qn, String(item)));
304
+ else
305
+ qs.append(qn, String(v));
306
+ }
307
+ const query = qs.toString();
308
+ if (query)
309
+ url += `?${query}`;
310
+ // Body
311
+ let body;
312
+ const headers = { Authorization: `Bearer ${effectiveToken}` };
313
+ if (tool.bodyMode === "merge") {
314
+ const payload = {};
315
+ for (const k of tool.bodyKeys)
316
+ if (args[k] !== undefined)
317
+ payload[k] = args[k];
318
+ body = JSON.stringify(payload);
319
+ headers["Content-Type"] = "application/json";
320
+ }
321
+ else if (tool.bodyMode === "nested" && args.body !== undefined) {
322
+ body = JSON.stringify(args.body);
323
+ headers["Content-Type"] = "application/json";
324
+ }
325
+ try {
326
+ const res = await fetch(url, { method: tool.method.toUpperCase(), headers, body });
327
+ const text = await res.text();
328
+ let pretty = text;
329
+ try {
330
+ pretty = JSON.stringify(JSON.parse(text), null, 2);
331
+ }
332
+ catch {
333
+ /* non-JSON: lascio com'è */
334
+ }
335
+ return {
336
+ content: [{ type: "text", text: `HTTP ${res.status} ${res.statusText}\n${pretty}` }],
337
+ isError: !res.ok,
338
+ };
339
+ }
340
+ catch (err) {
341
+ const e = err;
342
+ const cause = e?.cause ? ` (causa: ${e.cause.code || e.cause.message})` : "";
343
+ return {
344
+ content: [{ type: "text", text: `Errore di rete chiamando ${url}: ${e?.message}${cause}` }],
345
+ isError: true,
346
+ };
347
+ }
348
+ });
349
+ // ---------------------------------------------------------------------------
350
+ // Avvio
351
+ // ---------------------------------------------------------------------------
352
+ async function main() {
353
+ const transport = new StdioServerTransport();
354
+ await server.connect(transport);
355
+ // stderr non interferisce col protocollo stdio
356
+ console.error(`[cooperto-mcp] pronto — ${tools.length} tool generati (+ ${SET_TOKEN_TOOL}), base URL ${BASE_URL}, ` +
357
+ `token di default ${ENV_TOKEN ? "presente" : "assente"} — token multi-cliente via tool/per-chiamata`);
358
+ }
359
+ main().catch((e) => {
360
+ console.error("[cooperto-mcp] errore fatale:", e);
361
+ process.exit(1);
362
+ });
package/openapi.json ADDED
@@ -0,0 +1 @@
1
+ {"swagger":"2.0","info":{"version":"v1","title":"API Cooperto.it"},"host":"api.cooperto.it","schemes":["https"],"paths":{"/api/Coda/ElencoByCodiceSede":{"get":{"tags":["Coda"],"summary":"Restituisce l'elenco delle prenotazioni in coda del locale autenticato filtrate per codice sede, ordinato per DataCoda decrescente","operationId":"Coda_ElencoByCodiceSede","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceSede","in":"query","description":"codice della sede","required":true,"type":"string"},{"name":"skip","in":"query","description":"numero di record da saltare (Default 0)","required":false,"type":"integer","format":"int32"},{"name":"pageSize","in":"query","description":"numero di record per pagina (Default 100)","required":false,"type":"integer","format":"int32"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.ResponseElenco[api.cooperto.it.Controllers.CodaController.CodaElencoViewModel]"}}}}},"/api/Coda/DettagliByCodice":{"get":{"tags":["Coda"],"summary":"Restituisce i dettagli di una coda dato un codice coda","operationId":"Coda_DettagliByCodice","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceSede","in":"query","required":true,"type":"string"},{"name":"codiceCoda","in":"query","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.CodaController.CodaViewModel"}}}}},"/api/Coda/Crea":{"post":{"tags":["Coda"],"summary":"Crea la coda e il relativo contatto (se presenti mail o telefono) sul locale autenticato","operationId":"Coda_Crea","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"coda","in":"body","description":"Definizione campi coda","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.CodaController.RequestCreaCoda"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.CodaController.CodaViewModel"}}}}},"/api/Coda/ConfermaArrivo":{"post":{"tags":["Coda"],"summary":"Conferma arrivo del cliente in coda","operationId":"Coda_ConfermaArrivo","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.CodaController.RequestCodaClienteIn"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.PrenotazioniViewModel"}}}}},"/api/Coda/Elimina":{"post":{"tags":["Coda"],"summary":"Elimina l'elemento in coda","operationId":"Coda_Elimina","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.CodaController.RequestEliminaCoda"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"boolean"}}}}},"/api/Coda/ElencoAutomazioniManuali":{"get":{"tags":["Coda"],"summary":"Restituisce l'elenco delle automazioni manuali eseguibili sulla coda","operationId":"Coda_ElencoAutomazioniManuali","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceSede","in":"query","description":"Codice della sede","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.Controllers.CodaController.AutomazioneCodaDTO"}}}}}},"/api/Coda/EseguiAutomazioneManuale":{"post":{"tags":["Coda"],"summary":"Esegue l'automazione indicata sull'elemento di coda","operationId":"Coda_EseguiAutomazioneManuale","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.CodaController.RequestEseguiAutomazioneCoda"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"boolean"}}}}},"/api/Contatti/Elenco":{"get":{"tags":["Contatti"],"summary":"Restituisce l'elenco dei contatti del locale autenticato","operationId":"Contatti_Elenco","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"skip","in":"query","description":"numero di record da saltare (Default 0)","required":false,"type":"integer","format":"int32"},{"name":"pageSize","in":"query","description":"numero di record per pagina (Default 100)","required":false,"type":"integer","format":"int32"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.ResponseElenco[api.cooperto.it.ContattoViewModel]"}}}}},"/api/Contatti/DettagliByEMail":{"get":{"tags":["Contatti"],"summary":"Restituisce i dettagli di un contatto dato un indirizzo email","operationId":"Contatti_DettagliByEMail","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"email","in":"query","description":"email del contatto","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.ContattoViewModel"}}}}},"/api/Contatti/DettagliByCodiceContatto":{"get":{"tags":["Contatti"],"summary":"Restituisce i dettagli di un contatto dato un codice contatto","operationId":"Contatti_DettagliByCodiceContatto","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceContatto","in":"query","description":"codice del contatto","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.ContattoViewModel"}}}}},"/api/Contatti/SaldoPuntiByCodiceContatto":{"get":{"tags":["Contatti"],"summary":"Restituisce il saldo di un contatto dato un codice contatto","operationId":"Contatti_SaldoPuntiByCodiceContatto","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceContatto","in":"query","description":"codice del contatto","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"format":"int32","type":"integer"}}}}},"/api/Contatti/ElencoCampiCustom":{"get":{"tags":["Contatti"],"summary":"Restituisce l'elenco dei campi custom disponibili per i contatti","operationId":"Contatti_ElencoCampiCustom","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.CampiCustomViewModel"}}}}}},"/api/Contatti/ElencoCouponContatto":{"get":{"tags":["Contatti"],"summary":"Restituisce l'elenco dei coupon del contatto","operationId":"Contatti_ElencoCouponContatto","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceContatto","in":"query","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.CouponContattoViewModel"}}}}}},"/api/Contatti/VerificaCouponContatto":{"get":{"tags":["Contatti"],"summary":"Restituisce le informazioni del codice coupon contatto ricercato","operationId":"Contatti_VerificaCouponContatto","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceCouponContatto","in":"query","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.CouponContattoViewModel"}}}}},"/api/Contatti/UtilizzaCouponContatto":{"post":{"tags":["Contatti"],"summary":"Utilizza il codice coupon contatto indicato","operationId":"Contatti_UtilizzaCouponContatto","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestUtilizzaCoupon"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.CouponContattoViewModel"}}}}},"/api/Contatti/AggiungiPuntiCard":{"post":{"tags":["Contatti"],"summary":"Aggiunge punti dato un codice contatto","operationId":"Contatti_AggiungiPuntiCard","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestPunti"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"format":"int32","type":"integer"}}}}},"/api/Contatti/RimuoviPuntiCard":{"post":{"tags":["Contatti"],"summary":"Rimuovi punti dato un codice contatto","operationId":"Contatti_RimuoviPuntiCard","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestPunti"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"format":"int32","type":"integer"}}}}},"/api/Contatti/AggiornaFidelityCard":{"post":{"tags":["Contatti"],"summary":"Aggiorna la fidelity card del contatto.\r\nSe il contatto non ha nessuna card associata, verrà creato un nuovo codice personale.\r\nÈ possibile indicare un codice personalizzato valorizzando il campo codiceCardContatto, in alternativa verrà generato automaticamente in base alle impostazioni del ristorante.\r\nLasciare vuoto il campo codiceCardContatto per modificare solamente la fidelity card associata al contatto.","operationId":"Contatti_AggiornaFidelityCard","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":[],"parameters":[{"name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestAggiornaFidelity"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"204":{"description":"No Content"}}}},"/api/Contatti/Crea":{"post":{"tags":["Contatti"],"summary":"Crea il contatto sul locale autenticato.\r\nSe viene trovato un contatto gia presente in base a email/telefono, ed il parametro SovrascriviDati è valorizzato a 'true', verranno sovrascritti solo i dati inviati","operationId":"Contatti_Crea","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"contatto","in":"body","description":"Definizione contatto","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestContatto"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.ContattoViewModel"}}}}},"/api/Contatti/AggiungiTag":{"post":{"tags":["Contatti"],"summary":"Aggiunge il tag specificato al contatto","operationId":"Contatti_AggiungiTag","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"contattoTag","in":"body","description":"Definizione tag e contatto","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestAggiungiTagContatto"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"boolean"}}}}},"/api/Contatti/AggiungiTags":{"post":{"tags":["Contatti"],"summary":"Aggiunge l'elenco di tag specificati al contatto","operationId":"Contatti_AggiungiTags","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"contattoTags","in":"body","description":"Definizione tag e contatto","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestAggiungiTagsContatto"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"boolean"}}}}},"/api/Contatti/RimuoviTag":{"post":{"tags":["Contatti"],"summary":"Rimuove il tag specificato al contatto","operationId":"Contatti_RimuoviTag","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"contattoTag","in":"body","description":"Definizione tag e contatto","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestRimuoviTagContatto"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"boolean"}}}}},"/api/Contatti/RimuoviTags":{"post":{"tags":["Contatti"],"summary":"Rimuove l'elenco di tag specificati dal contatto","operationId":"Contatti_RimuoviTags","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"contattoTags","in":"body","description":"Definizione tag e contatto","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestRimuoviTagsContatto"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"boolean"}}}}},"/api/Contatti/GeneraCoupon":{"post":{"tags":["Contatti"],"summary":"Genera il coupon per il contatto specificato, se il contatto non è presente lo crea","operationId":"Contatti_GeneraCoupon","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"generaCoupon","in":"body","description":"Parametri di generazione coupon e contatto","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestGeneraCoupon"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.ResponseGeneraCoupon"}}}}},"/api/Contatti/CreaMovimento":{"post":{"tags":["Contatti"],"summary":"Crea un nuovo movimento per il contatto, nella data indicata","operationId":"Contatti_CreaMovimento","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"request","in":"body","description":"","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestCreaMovimentoContatto"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"boolean"}}}}},"/api/Contatti/RegistraVisita":{"post":{"tags":["Contatti"],"summary":"Registra la visita di un contatto, se non è già presente una visita nella stessa giornata","operationId":"Contatti_RegistraVisita","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":[],"parameters":[{"name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestRegistraVisita"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"204":{"description":"No Content"}}}},"/api/FidelityCard/Elenco":{"get":{"tags":["FidelityCard"],"summary":"Restituisce l'elenco delle fidelity cards del locale autenticato","operationId":"FidelityCard_Elenco","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"skip","in":"query","description":"numero di record da saltare (Default 0)","required":false,"type":"integer","format":"int32"},{"name":"pageSize","in":"query","description":"numero di record per pagina (Default 100)","required":false,"type":"integer","format":"int32"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.ResponseElenco[api.cooperto.it.CardsViewModel]"}}}}},"/api/Prenotazioni/ElencoByCodiceSede":{"get":{"tags":["Prenotazioni"],"summary":"Restituisce l'elenco delle prenotazioni del locale autenticato filtrate per codice sede, ordinato per DataPrenotazione decrescente","operationId":"Prenotazioni_ElencoByCodiceSede","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceSede","in":"query","description":"codice della sede","required":true,"type":"string"},{"name":"dataInizio","in":"query","description":"data inizio nel formato YYYY-MM-DD","required":false,"type":"string"},{"name":"dataFine","in":"query","description":"data fine nel formato YYYY-MM-DD","required":false,"type":"string"},{"name":"codiciStato","in":"query","description":"codici stato separati da virgola (es: 2,5) - Elenco codici stato: Da confermare = 1, Confermata = 2, Cancellata = 3, NonAccettata = 4, ClienteIN = 5, ClienteOUT = 6, ListaAttesa = 8, AnnullataCliente = 9, NoShow = 10","required":false,"type":"string"},{"name":"skip","in":"query","description":"numero di record da saltare (Default 0)","required":false,"type":"integer","format":"int32"},{"name":"pageSize","in":"query","description":"numero di record per pagina (Default 100)","required":false,"type":"integer","format":"int32"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.ResponseElenco[api.cooperto.it.PrenotazioniViewModel]"}}}}},"/api/Prenotazioni/ElencoByEMailContatto":{"get":{"tags":["Prenotazioni"],"summary":"Restituisce l'elenco delle prenotazioni del contatto filtrato per email, ordinato per DataPrenotazione decrescente","operationId":"Prenotazioni_ElencoByEMailContatto","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"emailContatto","in":"query","description":"email del contatto","required":true,"type":"string"},{"name":"skip","in":"query","description":"numero di record da saltare (Default 0)","required":false,"type":"integer","format":"int32"},{"name":"pageSize","in":"query","description":"numero di record per pagina (Default 100)","required":false,"type":"integer","format":"int32"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.ResponseElenco[api.cooperto.it.PrenotazioniViewModel]"}}}}},"/api/Prenotazioni/ElencoByCodiceContatto":{"get":{"tags":["Prenotazioni"],"summary":"Restituisce l'elenco delle prenotazioni del contatto filtrato per codice contatto, ordinato per DataPrenotazione decrescente","operationId":"Prenotazioni_ElencoByCodiceContatto","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceContatto","in":"query","description":"codice del contatto","required":true,"type":"string"},{"name":"skip","in":"query","description":"numero di record da saltare (Default 0)","required":false,"type":"integer","format":"int32"},{"name":"pageSize","in":"query","description":"numero di record per pagina (Default 100)","required":false,"type":"integer","format":"int32"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.ResponseElenco[api.cooperto.it.PrenotazioniViewModel]"}}}}},"/api/Prenotazioni/DettagliByCodicePrenotazione":{"get":{"tags":["Prenotazioni"],"summary":"Restituisce i dettagli di una prenotazione dato un codice prenotazione","operationId":"Prenotazioni_DettagliByCodicePrenotazione","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codicePrenotazione","in":"query","description":"Codice della prenotazione","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.PrenotazioniViewModel"}}}}},"/api/Prenotazioni/ElencoModuliPrenotazione":{"get":{"tags":["Prenotazioni"],"summary":"Restituisce l'elenco dei moduli prenotazioni del locale autenticato filtrate per codice sede","operationId":"Prenotazioni_ElencoModuliPrenotazione","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceSede","in":"query","description":"codice della sede","required":true,"type":"string"},{"name":"skip","in":"query","description":"numero di record da saltare (Default 0)","required":false,"type":"integer","format":"int32"},{"name":"pageSize","in":"query","description":"numero di record per pagina (Default 100)","required":false,"type":"integer","format":"int32"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.ResponseElenco[api.cooperto.it.ModuliPrenotazioneViewModel]"}}}}},"/api/Prenotazioni/OrariModulo":{"get":{"tags":["Prenotazioni"],"summary":"Restituisce l'elenco degli orari di un modulo di prenotazione per la data ed il numero di persone indicato","operationId":"Prenotazioni_OrariModulo","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceModulo","in":"query","description":"codice univoco del modulo prenotazioni da utilizzare","required":true,"type":"string"},{"name":"data","in":"query","description":"data inizio nel formato YYYY-MM-DD","required":true,"type":"string"},{"name":"pax","in":"query","description":"numero di persone","required":true,"type":"integer","format":"int32"},{"name":"codiceSala","in":"query","description":"codice sala selezionata, se il modulo richiede la scelta sala","required":false,"type":"string"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.OrariPrenotazioniService.GiornataPrenotazioneViewModel"}}}}}},"/api/Prenotazioni/Crea":{"post":{"tags":["Prenotazioni"],"summary":"Crea la prenotazione e il relativo contatto (se presenti mail o telefono) sul locale autenticato","operationId":"Prenotazioni_Crea","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"prenotazione","in":"body","description":"Definizione campi prenotazione","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.PrenotazioniController.RequestCreaPrenotazione"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.PrenotazioniViewModel"}}}}},"/api/Prenotazioni/Aggiorna":{"post":{"tags":["Prenotazioni"],"summary":"Aggiorna i dati della prenotazione sul locale autenticato","operationId":"Prenotazioni_Aggiorna","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"prenotazione","in":"body","description":"Definizione campi prenotazione","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.PrenotazioniController.RequestAggiornaPrenotazione"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.PrenotazioniViewModel"}}}}},"/api/Prenotazioni/AggiornaStato":{"post":{"tags":["Prenotazioni"],"summary":"Aggiorna lo stato della prenotazione con il codice indicato","operationId":"Prenotazioni_AggiornaStato","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"request","in":"body","description":"","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.PrenotazioniController.RequestAggiornaStatoPrenotazione"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"boolean"}}}}},"/api/Prenotazioni/CreaMovimento":{"post":{"tags":["Prenotazioni"],"summary":"Aggiorna l'importo speso sulla prenotazione con il codice indicato","operationId":"Prenotazioni_CreaMovimento","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"request","in":"body","description":"","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.PrenotazioniController.RequestCreaMovimentoPrenotazione"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"boolean"}}}}},"/api/Sedi/Elenco":{"get":{"tags":["Sedi"],"summary":"Restituisce l'elenco delle sedi del locale autenticato","operationId":"Sedi_Elenco","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"skip","in":"query","description":"numero di record da saltare (Default 0)","required":false,"type":"integer","format":"int32"},{"name":"pageSize","in":"query","description":"numero di record per pagina (Default 100)","required":false,"type":"integer","format":"int32"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.ResponseElenco[api.cooperto.it.SediViewModel]"}}}}},"/api/Sedi/ElencoOrari":{"get":{"tags":["Sedi"],"summary":"Restituisce l'elenco dei giorni ed orari di apertura di una sede e le varie eccezioni attive future (chiusura o apertura)","operationId":"Sedi_ElencoOrari","consumes":[],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"codiceSede","in":"query","description":"codice della sede","required":true,"type":"string"},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.SediController.OrariSedeViewModel"}}}}},"/api/Wifi/Login":{"post":{"tags":["Wifi"],"summary":"Crea l'evento in base ai parametri indicati","operationId":"Wifi_Login","consumes":["application/json","text/json","text/html","application/x-www-form-urlencoded"],"produces":["application/json","text/json","text/html"],"parameters":[{"name":"login","in":"body","required":true,"schema":{"$ref":"#/definitions/api.cooperto.it.Controllers.WifiController.RequestWifiLogin"}},{"name":"Authorization","in":"header","description":"API Key del ristorante","required":true,"type":"string","default":"Bearer {API_KEY}"}],"responses":{"200":{"description":"OK","schema":{"type":"boolean"}}}}}},"definitions":{"api.cooperto.it.Controllers.ResponseUtilizzoCoupon":{"type":"object","properties":{"Scaricati":{"format":"int32","description":"Conteggia il numero di coupon scaricati nel periodo selezionato.","type":"integer"},"UtilizzatiSuScaricati":{"format":"int32","description":"Conteggia il numero di coupon utilizzati tra quelli scaricati nel periodo selezionato.","type":"integer"},"PercentualeUtilizzo":{"format":"double","description":"Rappresenta la percentuale di coupon utilizzati sul totale dei coupon scaricati nel periodo selezionato.","type":"number"},"UtilizzatiNelPeriodo":{"format":"int32","description":"Conteggia il numero di tutti i coupon utilizzati nel periodo selezionato.","type":"integer"},"MediaGiorniUtilizzo":{"format":"double","description":"Rappresenta i giorni medi che intercorrono tra lo scaricamento ed utilizzo dei coupon.","type":"number"}}},"api.cooperto.it.Controllers.ApprestoController.ApprestoRequestCreaPrenotazione":{"required":["CodiceSede","CodiceStato","DataPrenotazione","Pax"],"type":"object","properties":{"CodiceSede":{"type":"string"},"CodiceStato":{"format":"int32","description":"1 = Da confermare,\r\n2 = Confermata","type":"integer"},"DataPrenotazione":{"format":"date-time","description":"Data e ora della prenotazione in UTC","type":"string"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)","type":"string"},"Email":{"type":"string"},"Pax":{"format":"int32","description":"Numero di persone (numero interno maggiore di 0)","type":"integer"},"TempoPermanenza":{"format":"int32","type":"integer"},"Note":{"type":"string"},"ConsensoPrivacy":{"type":"boolean"},"ConsensoMarketing":{"type":"boolean"}}},"api.cooperto.it.PrenotazioniViewModel":{"type":"object","properties":{"DataCreazione":{"format":"date-time","type":"string"},"DataPrenotazione":{"format":"date-time","type":"string"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"type":"string"},"Pax":{"format":"int32","type":"integer"},"Note":{"type":"string"},"Email":{"type":"string"},"MotivoRifiuto":{"type":"string"},"CodiceStato":{"format":"int32","type":"integer"},"LabelStato":{"type":"string"},"CodicePrenotazione":{"type":"string"},"CodiceSede":{"type":"string"},"CodiceContatto":{"type":"string"},"CodiceModuloPrenotazione":{"type":"string"},"CodiceSala":{"type":"string"},"NomeSala":{"type":"string"},"Tavoli":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.PrenotazioniViewModel.TavoloPrenotazioneViewModel"}}}},"api.cooperto.it.PrenotazioniViewModel.TavoloPrenotazioneViewModel":{"type":"object","properties":{"CodiceTavolo":{"type":"string"},"NomeTavolo":{"type":"string"}}},"api.cooperto.it.Controllers.ApprestoController.ApprestoRequestAggiornaPrenotazione":{"required":["CodicePrenotazione","CodiceSede","CodiceStato","DataPrenotazione","Pax"],"type":"object","properties":{"CodicePrenotazione":{"type":"string"},"CodiceSede":{"type":"string"},"CodiceStato":{"format":"int32","description":"1 = Da confermare,\r\n2 = Confermata,\r\n3 = Cancellata,\r\n4 = Non accettata,\r\n5 = Cliente IN,\r\n6 = Cliente OUT,\r\n10 =\tNo-show","type":"integer"},"DataPrenotazione":{"format":"date-time","description":"Data e ora della prenotazione in UTC","type":"string"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)","type":"string"},"Email":{"type":"string"},"Pax":{"format":"int32","description":"Numero di persone (numero interno maggiore di 0)","type":"integer"},"TempoPermanenza":{"format":"int32","type":"integer"},"Note":{"type":"string"},"Elimina":{"description":"Default value ='false. \r\nSe valorizzato a 'true' elimina la prenotazione. \r\nL'operazione NON è reversibile","type":"boolean"}}},"api.cooperto.it.Controllers.ApprestoController.ApprestoRequestAggiornaStatoPrenotazione":{"required":["CodicePrenotazione","CodiceStato"],"type":"object","properties":{"CodicePrenotazione":{"type":"string"},"CodiceStato":{"format":"int32","description":"1 = Da confermare,\r\n2 = Confermata,\r\n3 = Cancellata,\r\n4 = Non accettata,\r\n5 = Cliente IN,\r\n6 = Cliente OUT,\r\n10 =\tNo-show","type":"integer"}}},"api.cooperto.it.Controllers.ApprestoController.ApprestoRequestAggiornaImportoSpesoPrenotazione":{"required":["CodicePrenotazione","Importo"],"type":"object","properties":{"CodicePrenotazione":{"type":"string"},"Importo":{"format":"double","type":"number"},"Note":{"type":"string"}}},"api.cooperto.it.ResponseElenco[api.cooperto.it.Controllers.CodaController.CodaElencoViewModel]":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.Controllers.CodaController.CodaElencoViewModel"}},"total":{"format":"int32","type":"integer"},"pageSize":{"format":"int32","type":"integer"},"nextPage":{"type":"string","readOnly":true}}},"api.cooperto.it.Controllers.CodaController.CodaElencoViewModel":{"type":"object","properties":{"DataCoda":{"format":"date-time","type":"string"},"DataCreazione":{"format":"date-time","type":"string"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"type":"string"},"Email":{"type":"string"},"Pax":{"format":"int32","type":"integer"},"Note":{"type":"string"},"CodiceCoda":{"type":"string"},"CodiceSede":{"type":"string"},"CodiceContatto":{"type":"string"},"LinkCoda":{"type":"string"}}},"api.cooperto.it.Controllers.CodaController.CodaViewModel":{"type":"object","properties":{"DataCoda":{"format":"date-time","type":"string"},"DataCreazione":{"format":"date-time","type":"string"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"type":"string"},"Email":{"type":"string"},"Pax":{"format":"int32","type":"integer"},"Note":{"type":"string"},"CodiceCoda":{"type":"string"},"CodiceSede":{"type":"string"},"CodiceContatto":{"type":"string"},"LinkCoda":{"type":"string"},"MinutiAttesaMin":{"format":"int32","type":"integer"},"MinutiAttesaMax":{"format":"int32","type":"integer"}}},"api.cooperto.it.Controllers.CodaController.RequestCreaCoda":{"required":["CodiceSede","Telefono","Pax"],"type":"object","properties":{"CodiceSede":{"type":"string"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)","type":"string"},"Email":{"type":"string"},"Pax":{"format":"int32","description":"Numero di persone (numero interno maggiore di 0)","type":"integer"},"Note":{"type":"string"},"ConsensoPrivacy":{"type":"boolean"},"ConsensoMarketing":{"type":"boolean"}}},"api.cooperto.it.Controllers.CodaController.RequestCodaClienteIn":{"required":["CodiceCoda"],"type":"object","properties":{"CodiceCoda":{"type":"string"}}},"api.cooperto.it.Controllers.CodaController.RequestEliminaCoda":{"required":["CodiceCoda"],"type":"object","properties":{"CodiceCoda":{"type":"string"}}},"api.cooperto.it.Controllers.CodaController.AutomazioneCodaDTO":{"type":"object","properties":{"Nome":{"type":"string"},"CodiceAutomazione":{"type":"string"}}},"api.cooperto.it.Controllers.CodaController.RequestEseguiAutomazioneCoda":{"type":"object","properties":{"codiceCoda":{"type":"string"},"codiceAutomazione":{"type":"string"}}},"api.cooperto.it.ResponseElenco[api.cooperto.it.ContattoViewModel]":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.ContattoViewModel"}},"total":{"format":"int32","type":"integer"},"pageSize":{"format":"int32","type":"integer"},"nextPage":{"type":"string","readOnly":true}}},"api.cooperto.it.ContattoViewModel":{"type":"object","properties":{"Nome":{"type":"string"},"Cognome":{"type":"string"},"Email":{"type":"string"},"DataCreazione":{"format":"date-time","type":"string"},"Telefono":{"type":"string"},"DataDiNascita":{"format":"date-time","type":"string"},"Indirizzo":{"type":"string"},"Citta":{"type":"string"},"CAP":{"type":"string"},"Nazione":{"type":"string"},"ConsensoPrivacy":{"format":"int32","type":"integer"},"DataConsensoPrivacy":{"format":"date-time","type":"string"},"ConsensoMarketing":{"format":"int32","type":"integer"},"DataConsensoMarketing":{"format":"date-time","type":"string"},"Note":{"type":"string"},"NumeroVisite":{"format":"int32","type":"integer"},"DataUltimaVisita":{"format":"date-time","type":"string"},"Provincia":{"type":"string"},"CodiceCard":{"description":"Codice identificativo univoco della card del contatto","type":"string"},"CodiceCardAssegnata":{"description":"Codice identificativo generale della fidelity card","type":"string"},"NomeCardAssegnata":{"description":"Nome della fidelity card","type":"string"},"SaldoPuntiCard":{"format":"int32","type":"integer"},"Disiscritto":{"format":"int32","type":"integer"},"DataDisiscrizione":{"format":"date-time","type":"string"},"CodiceContatto":{"type":"string"},"Tags":{"type":"array","items":{"type":"string"}}}},"api.cooperto.it.CampiCustomViewModel":{"type":"object","properties":{"Label":{"type":"string"},"CodiceCampo":{"type":"string"},"CodiceTipo":{"format":"int32","type":"integer"},"NomeTipo":{"type":"string"},"RisposteDisponibili":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.CampiCustomRispostaViewModel"}}}},"api.cooperto.it.CampiCustomRispostaViewModel":{"type":"object","properties":{"CodiceRisposta":{"type":"string"},"Testo":{"type":"string"}}},"api.cooperto.it.CouponContattoViewModel":{"type":"object","properties":{"CodiceContatto":{"type":"string"},"DataCreazione":{"format":"date-time","type":"string"},"DataScadenza":{"format":"date-time","type":"string"},"DataUtilizzo":{"format":"date-time","type":"string"},"CodiceCouponContatto":{"type":"string"},"Utilizzato":{"type":"boolean"},"CodiceCoupon":{"type":"string"}}},"api.cooperto.it.Controllers.ContattiController.RequestUtilizzaCoupon":{"required":["CodiceCouponContatto","CodiceSede"],"type":"object","properties":{"CodiceCouponContatto":{"description":"Codice del coupon contatto","type":"string"},"CodiceSede":{"type":"string"}}},"api.cooperto.it.Controllers.ContattiController.RequestInviaWhatsappApi":{"type":"object","properties":{"Telefono":{"description":"Numero di telefono con prefisso internazionale (es: +39)","type":"string"},"Messaggio":{"type":"string"},"CodiceSede":{"type":"string"}}},"api.cooperto.it.Controllers.ContattiController.RequestPunti":{"type":"object","properties":{"codiceContatto":{"type":"string"},"punti":{"format":"int32","type":"integer"},"note":{"type":"string"}}},"api.cooperto.it.Controllers.ContattiController.RequestAggiornaFidelity":{"required":["codiceContatto","codiceCard"],"type":"object","properties":{"codiceContatto":{"description":"Codice del contatto su Cooperto","type":"string"},"codiceCard":{"description":"Codice della fidelity card su Cooperto","type":"string"},"codiceCardContatto":{"description":"Codice della card personale del contatto. \r\nAttenzione: se valorizzato sovrascriverà il codice generato automaticamente per il contatto","type":"string"}}},"api.cooperto.it.Controllers.ContattiController.RequestContatto":{"type":"object","properties":{"Nome":{"type":"string"},"Cognome":{"type":"string"},"Email":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)","type":"string"},"DataDiNascita":{"format":"date-time","description":"Data di nascita del contatto, verrà considerata solo la data ed escluso il time","type":"string"},"Indirizzo":{"type":"string"},"Citta":{"type":"string"},"CAP":{"type":"string"},"Provincia":{"type":"string"},"Nazione":{"type":"string"},"Note":{"type":"string"},"ConsensoPrivacy":{"type":"boolean"},"DataConsensoPrivacy":{"format":"date-time","type":"string"},"ConsensoMarketing":{"type":"boolean"},"DataConsensoMarketing":{"format":"date-time","type":"string"},"SovrascriviDati":{"description":"Se viene trovato un contatto in base alla email/telefono, i valori passati vengono sovrascritti","type":"boolean"},"CampiCustom":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.Controllers.ContattiController.RequestContatto.ValoreCampoCustom"}}}},"api.cooperto.it.Controllers.ContattiController.RequestContatto.ValoreCampoCustom":{"type":"object","properties":{"CodiceCampo":{"type":"string"},"Valore":{"type":"string"},"CodiciRisposte":{"type":"array","items":{"type":"string"}}}},"api.cooperto.it.Controllers.ContattiController.RequestAggiungiTagContatto":{"required":["CodiceSede","CodiceContatto","Tag"],"type":"object","properties":{"CodiceSede":{"type":"string"},"CodiceContatto":{"type":"string"},"Tag":{"type":"string"}}},"api.cooperto.it.Controllers.ContattiController.RequestAggiungiTagsContatto":{"required":["CodiceSede","CodiceContatto","Tags"],"type":"object","properties":{"CodiceSede":{"type":"string"},"CodiceContatto":{"type":"string"},"CreaTagSeNonPresente":{"description":"Se uno dei tag non è presente su Cooperto, lo crea e lo associa al contatto.\r\nSe non specificato, il valore di default è 'false'","type":"boolean"},"Tags":{"type":"array","items":{"type":"string"}}}},"api.cooperto.it.Controllers.ContattiController.RequestRimuoviTagContatto":{"required":["CodiceContatto","Tag"],"type":"object","properties":{"CodiceContatto":{"type":"string"},"Tag":{"type":"string"}}},"api.cooperto.it.Controllers.ContattiController.RequestRimuoviTagsContatto":{"type":"object","properties":{"CodiceSede":{"type":"string"},"CodiceContatto":{"type":"string"},"Tags":{"type":"array","items":{"type":"string"}}}},"api.cooperto.it.Controllers.ContattiController.RequestEliminaContatto":{"type":"object","properties":{"CodiceContatto":{"type":"string"}}},"api.cooperto.it.Controllers.ContattiController.RequestGeneraCoupon":{"type":"object","properties":{"Nome":{"type":"string"},"Cognome":{"type":"string"},"Email":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)","type":"string"},"CodiceCoupon":{"type":"string"},"DataPrivacy":{"format":"date-time","type":"string"},"DataMarketing":{"format":"date-time","type":"string"}}},"api.cooperto.it.Controllers.ContattiController.ResponseGeneraCoupon":{"type":"object","properties":{"UrlQRCode":{"type":"string"},"DataGenerazione":{"format":"date-time","type":"string"},"DataUtilizzo":{"format":"date-time","type":"string"},"DataScadenza":{"format":"date-time","type":"string"}}},"api.cooperto.it.Controllers.ContattiController.RequestCreaMovimentoContatto":{"required":["CodiceContatto","DataMovimento","Importo"],"type":"object","properties":{"CodiceContatto":{"type":"string"},"DataMovimento":{"format":"date-time","type":"string"},"Importo":{"format":"double","type":"number"},"Note":{"type":"string"}}},"api.cooperto.it.Controllers.ContattiController.RequestRegistraVisita":{"required":["codiceContatto","codiceSede","dataVisita"],"type":"object","properties":{"codiceContatto":{"type":"string"},"codiceSede":{"type":"string"},"dataVisita":{"format":"date-time","description":"Data e ora della visita in timezone W. Europe Standard Time","type":"string"}}},"api.cooperto.it.Controllers.EventiController.EventiViewModel":{"type":"object","properties":{"id":{"format":"int32","type":"integer"},"nome":{"type":"string"}}},"api.cooperto.it.Controllers.EventiController.RequestCreaEvento":{"required":["codiceSede","idTipoEvento","codiceContatto","customValue"],"type":"object","properties":{"codiceSede":{"type":"string"},"idTipoEvento":{"format":"int32","description":"37 = WIFI_LOGIN","type":"integer"},"codiceContatto":{"type":"string"},"customValue":{"type":"string"}}},"api.cooperto.it.ResponseElenco[api.cooperto.it.CardsViewModel]":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.CardsViewModel"}},"total":{"format":"int32","type":"integer"},"pageSize":{"format":"int32","type":"integer"},"nextPage":{"type":"string","readOnly":true}}},"api.cooperto.it.CardsViewModel":{"type":"object","properties":{"Nome":{"type":"string"},"Livello":{"format":"int32","type":"integer"},"CodiceCard":{"type":"string"}}},"api.cooperto.it.Controllers.FloodController.FloodRequestCreaPrenotazione":{"required":["CodicePrenotazioneFlood","CodiceSedeFlood","DataPrenotazione","Pax"],"type":"object","properties":{"CodicePrenotazioneFlood":{"type":"string"},"CodiceSedeFlood":{"type":"string"},"DataPrenotazione":{"format":"date-time","description":"Data e ora della prenotazione in UTC","type":"string"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)","type":"string"},"Email":{"type":"string"},"Pax":{"format":"int32","description":"Numero di persone (numero interno maggiore di 0)","type":"integer"},"Note":{"type":"string"},"CodiciTavoli":{"type":"array","items":{"type":"string"}},"ConsensoPrivacy":{"type":"boolean"},"ConsensoMarketing":{"type":"boolean"}}},"api.cooperto.it.Controllers.FloodController.FloodRequestAggiornaPrenotazione":{"required":["CodiceSedeFlood","CodiceStato","DataPrenotazione","Pax"],"type":"object","properties":{"CodicePrenotazione":{"description":"se valorizzato, utilizza il codice prenotazione interno di Cooperto per identificare la prenotazione","type":"string"},"CodicePrenotazioneFlood":{"description":"se CodicePrenotazione non viene indicato, utilizza il CodicePrenotazioneFlood per identificare la prenotazione","type":"string"},"CodiceSedeFlood":{"type":"string"},"CodiceStato":{"format":"int32","type":"integer"},"DataPrenotazione":{"format":"date-time","description":"Data e ora della prenotazione in UTC","type":"string"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)","type":"string"},"Email":{"type":"string"},"Pax":{"format":"int32","description":"Numero di persone (numero interno maggiore di 0)","type":"integer"},"Note":{"type":"string"},"CodiciTavoli":{"type":"array","items":{"type":"string"}}}},"api.cooperto.it.Controllers.FloodController.FloodRequestAggiornaStatoPrenotazione":{"required":["CodiceStato"],"type":"object","properties":{"CodicePrenotazione":{"description":"se valorizzato, utilizza il codice prenotazione interno di Cooperto per identificare la prenotazione","type":"string"},"CodicePrenotazioneFlood":{"description":"se CodicePrenotazione non viene indicato, utilizza il CodicePrenotazioneFlood per identificare la prenotazione","type":"string"},"CodiceStato":{"format":"int32","type":"integer"}}},"api.cooperto.it.Controllers.FloodController.FloodRequestAggiornaImportoSpesoPrenotazione":{"required":["Importo"],"type":"object","properties":{"CodicePrenotazione":{"description":"se valorizzato, utilizza il codice prenotazione interno di Cooperto per identificare la prenotazione","type":"string"},"CodicePrenotazioneFlood":{"description":"se CodicePrenotazione non viene indicato, utilizza il CodicePrenotazioneFlood per identificare la prenotazione","type":"string"},"Importo":{"format":"double","type":"number"},"Note":{"type":"string"}}},"api.cooperto.it.ResponseElenco[api.cooperto.it.PrenotazioniViewModel]":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.PrenotazioniViewModel"}},"total":{"format":"int32","type":"integer"},"pageSize":{"format":"int32","type":"integer"},"nextPage":{"type":"string","readOnly":true}}},"api.cooperto.it.ResponseElenco[api.cooperto.it.ModuliPrenotazioneViewModel]":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.ModuliPrenotazioneViewModel"}},"total":{"format":"int32","type":"integer"},"pageSize":{"format":"int32","type":"integer"},"nextPage":{"type":"string","readOnly":true}}},"api.cooperto.it.ModuliPrenotazioneViewModel":{"type":"object","properties":{"Nome":{"type":"string"},"CodiceModulo":{"type":"string"},"TipoModulo":{"type":"string"},"AbilitaSceltaSala":{"type":"boolean"},"SaleAbilitate":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.ModuliPrenotazioneViewModel.SalaViewModel"}}}},"api.cooperto.it.ModuliPrenotazioneViewModel.SalaViewModel":{"type":"object","properties":{"CodiceSala":{"type":"string"},"Nome":{"type":"string"},"NomePubblico":{"type":"string"}}},"api.cooperto.it.OrariPrenotazioniService.GiornataPrenotazioneViewModel":{"type":"object","properties":{"Data":{"format":"date-time","type":"string"},"MessaggioOrariNonDisponibili":{"type":"string"},"BloccoPerEvento":{"type":"boolean"},"RedirectPerEvento":{"type":"boolean"},"LinkRedirectEvento":{"type":"string"},"FasceOrarie":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.OrariPrenotazioniService.FasciaOrariaViewModel"}}}},"api.cooperto.it.OrariPrenotazioniService.FasciaOrariaViewModel":{"type":"object","properties":{"CodiceFascia":{"type":"string"},"Etichetta":{"type":"string"},"TipoFascia":{"type":"string"},"IDConfigurazioneAssegnazioneTavoli":{"format":"int32","type":"integer"},"IDTag":{"format":"int32","type":"integer"},"Tag":{"type":"string"},"MinutiPermanenza":{"format":"int32","type":"integer"},"Avviso":{"type":"string"},"MostraFlagPresaVisioneAvviso":{"type":"boolean"},"Slots":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.OrariPrenotazioniService.SlotOrarioViewModel"}}}},"api.cooperto.it.OrariPrenotazioniService.SlotOrarioViewModel":{"type":"object","properties":{"Abilitato":{"type":"boolean"},"Orario":{"type":"string"},"MostraSconto":{"type":"boolean"},"TipoLabelSconto":{"format":"int32","type":"integer"},"Sconto":{"format":"int32","type":"integer"},"IconaSconto":{"type":"string"},"CodiceSconto":{"type":"string"},"MessaggioSconto":{"type":"string"},"IDStatoPrenotazioneDefault":{"format":"int32","type":"integer"},"SlotOltreMezzanotte":{"description":"Indica se lo slot è compreso tra le 00.00 e le 05.00","type":"boolean"}}},"api.cooperto.it.Controllers.PrenotazioniController.RequestCreaPrenotazione":{"required":["CodiceSede","DataPrenotazione","CodiceStato","Pax"],"type":"object","properties":{"CodiceSede":{"type":"string"},"DataPrenotazione":{"format":"date-time","description":"Data e ora della prenotazione in timezone W. Europe Standard Time","type":"string"},"CodiceStato":{"format":"int32","description":"Stato della prenotazione (1 = Da Confermare, 2 = Confermata)","type":"integer"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)","type":"string"},"Email":{"type":"string"},"Pax":{"format":"int32","description":"Numero di persone (numero interno maggiore di 0)","type":"integer"},"Note":{"type":"string"},"ConsensoPrivacy":{"type":"boolean"},"ConsensoMarketing":{"type":"boolean"}}},"api.cooperto.it.Controllers.PrenotazioniController.RequestAggiornaPrenotazione":{"required":["CodicePrenotazione","DataPrenotazione","CodiceStato","Pax"],"type":"object","properties":{"CodicePrenotazione":{"type":"string"},"DataPrenotazione":{"format":"date-time","description":"Data e ora della prenotazione in timezone W. Europe Standard Time","type":"string"},"CodiceStato":{"format":"int32","description":"Stato della prenotazione:\r\nConfermata = 2,\r\nCancellata = 3,\r\nNonAccettata = 4,\r\nClienteIN = 5,\r\nClienteOUT = 6,\r\nListaAttesa = 8,\r\nAnnullataCliente = 9,\r\nNoShow = 10,","type":"integer"},"Pax":{"format":"int32","description":"Numero di persone (numero interno maggiore di 0)","type":"integer"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)\r\nobbligatorio se non c'è una mail specificata","type":"string"},"Email":{"description":"obbligatoria se non c'è un telefono specificato","type":"string"},"Note":{"type":"string"}}},"api.cooperto.it.Controllers.PrenotazioniController.RequestAggiornaStatoPrenotazione":{"required":["CodicePrenotazione","CodiceStato"],"type":"object","properties":{"CodicePrenotazione":{"type":"string"},"CodiceStato":{"format":"int32","description":"Stato della prenotazione:\r\nConfermata = 2,\r\nCancellata = 3,\r\nNonAccettata = 4,\r\nClienteIN = 5,\r\nClienteOUT = 6,\r\nListaAttesa = 8,\r\nAnnullataCliente = 9,\r\nNoShow = 10,","type":"integer"}}},"api.cooperto.it.Controllers.PrenotazioniController.RequestCreaMovimentoPrenotazione":{"required":["CodicePrenotazione","Importo"],"type":"object","properties":{"CodicePrenotazione":{"type":"string"},"Importo":{"format":"double","type":"number"},"Note":{"type":"string"}}},"api.cooperto.it.ResponseElenco[api.cooperto.it.SediViewModel]":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.SediViewModel"}},"total":{"format":"int32","type":"integer"},"pageSize":{"format":"int32","type":"integer"},"nextPage":{"type":"string","readOnly":true}}},"api.cooperto.it.SediViewModel":{"type":"object","properties":{"Nome":{"type":"string"},"CodiceSede":{"type":"string"}}},"api.cooperto.it.Controllers.SediController.OrariSedeViewModel":{"type":"object","properties":{"Orari":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.Controllers.SediController.OrariSedeViewModel.OrarioSede"}},"Eccezioni":{"type":"array","items":{"$ref":"#/definitions/api.cooperto.it.Controllers.SediController.OrariSedeViewModel.Eccezione"}}}},"api.cooperto.it.Controllers.SediController.OrariSedeViewModel.OrarioSede":{"type":"object","properties":{"CodiceGiorno":{"format":"int32","type":"integer"},"Giorno":{"type":"string"},"OraInizio":{"type":"string"},"OraFine":{"type":"string"}}},"api.cooperto.it.Controllers.SediController.OrariSedeViewModel.Eccezione":{"type":"object","properties":{"Tipologia":{"type":"string"},"DataInizio":{"format":"date-time","type":"string"},"DataFine":{"format":"date-time","type":"string"},"MessaggioChiusura":{"type":"string"}}},"api.cooperto.it.Controllers.TavolinuxController.TavolinuxRequestCreaPrenotazione":{"required":["CodiceSedeTavolinux","CodiceStato","DataPrenotazione","Pax"],"type":"object","properties":{"CodiceSedeTavolinux":{"type":"string"},"CodiceStato":{"format":"int32","type":"integer"},"DataPrenotazione":{"format":"date-time","description":"Data e ora della prenotazione in UTC","type":"string"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)","type":"string"},"Email":{"type":"string"},"Pax":{"format":"int32","description":"Numero di persone (numero interno maggiore di 0)","type":"integer"},"TempoPermanenza":{"format":"int32","type":"integer"},"Note":{"type":"string"},"ConsensoPrivacy":{"type":"boolean"},"ConsensoMarketing":{"type":"boolean"}}},"api.cooperto.it.Controllers.TavolinuxController.TavolinuxRequestAggiornaPrenotazione":{"required":["CodicePrenotazione","CodiceSedeTavolinux","CodiceStato","DataPrenotazione","Pax"],"type":"object","properties":{"CodicePrenotazione":{"type":"string"},"CodiceSedeTavolinux":{"type":"string"},"CodiceStato":{"format":"int32","type":"integer"},"DataPrenotazione":{"format":"date-time","description":"Data e ora della prenotazione in UTC","type":"string"},"Nome":{"type":"string"},"Cognome":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)","type":"string"},"Email":{"type":"string"},"Pax":{"format":"int32","description":"Numero di persone (numero interno maggiore di 0)","type":"integer"},"TempoPermanenza":{"format":"int32","type":"integer"},"Note":{"type":"string"},"Elimina":{"description":"Default value ='false. \r\nSe valorizzato a 'true' elimina la prenotazione. \r\nL'operazione NON è reversibile","type":"boolean"}}},"api.cooperto.it.Controllers.TavolinuxController.TavolinuxRequestAggiornaStatoPrenotazione":{"required":["CodicePrenotazione","CodiceStato"],"type":"object","properties":{"CodicePrenotazione":{"type":"string"},"CodiceStato":{"format":"int32","type":"integer"}}},"api.cooperto.it.Controllers.TavolinuxController.TavolinuxRequestAggiornaImportoSpesoPrenotazione":{"required":["CodicePrenotazione","Importo"],"type":"object","properties":{"CodicePrenotazione":{"type":"string"},"Importo":{"format":"double","type":"number"},"Note":{"type":"string"}}},"api.cooperto.it.Controllers.WifiController.RequestWifiLogin":{"required":["codiceSede","codiceContatto"],"type":"object","properties":{"codiceSede":{"type":"string"},"codiceContatto":{"type":"string"}}},"api.cooperto.it.Controllers.XMenuController.EventiViewModel":{"type":"object","properties":{"codice":{"type":"string"}}},"api.cooperto.it.Controllers.XMenuController.RequestCreaEvento":{"required":["codiceSede","codiceEvento","codiceContatto"],"type":"object","properties":{"codiceSede":{"type":"string"},"codiceEvento":{"type":"string"},"codiceContatto":{"type":"string"}}},"api.cooperto.it.Controllers.ZapierController.ZapierRequestContact":{"type":"object","properties":{"contact":{"$ref":"#/definitions/api.cooperto.it.Controllers.ZapierController.ZapierRequestContact.ZapierContact"}}},"api.cooperto.it.Controllers.ZapierController.ZapierRequestContact.ZapierContact":{"type":"object","properties":{"Nome":{"type":"string"},"Cognome":{"type":"string"},"Email":{"type":"string"},"Telefono":{"description":"numero di telefono compreso di prefisso internazionale (es: +39)","type":"string"},"Tags":{"type":"array","items":{"type":"string"}},"DataConsensoPrivacy":{"format":"date-time","type":"string"},"DataConsensoMarketing":{"format":"date-time","type":"string"},"Indirizzo":{"type":"string"},"Citta":{"type":"string"},"Cap":{"type":"string"},"Provincia":{"type":"string"},"Nazione":{"type":"string"},"DataDiNascita":{"format":"date-time","type":"string"}}},"api.cooperto.it.ZapierContactListResponseViewModel":{"type":"object","properties":{"Nome":{"type":"string"},"Cognome":{"type":"string"},"Email":{"type":"string"},"Telefono":{"type":"string"},"Indirizzo":{"type":"string"},"Citta":{"type":"string"},"CAP":{"type":"string"},"Nazione":{"type":"string"},"Provincia":{"type":"string"},"ConsensoPrivacy":{"format":"int32","type":"integer"},"ConsensoMarketing":{"format":"int32","type":"integer"},"NumeroVisite":{"format":"int32","type":"integer"},"CodiceCard":{"type":"string"},"SaldoPuntiCard":{"format":"int32","type":"integer"},"Note":{"type":"string"},"id":{"type":"string"},"DataCreazioneISO":{"type":"string","readOnly":true},"DataDiNascitaISO":{"type":"string","readOnly":true},"DataConsensoPrivacyISO":{"type":"string","readOnly":true},"DataConsensoMarketingISO":{"type":"string","readOnly":true},"DataUltimaVisitaISO":{"type":"string","readOnly":true},"Tags":{"type":"string"}}}}}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "cooperto-mcp",
3
+ "version": "0.1.2",
4
+ "description": "Model Context Protocol (MCP) server for the Cooperto.it API — bookings, contacts/loyalty, queues and venues. Spec-driven: one tool per OpenAPI operation.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Mattia Quercioli",
8
+ "homepage": "https://github.com/bolognesimarco0-hub/cooperto-mcp#readme",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/bolognesimarco0-hub/cooperto-mcp.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/bolognesimarco0-hub/cooperto-mcp/issues"
15
+ },
16
+ "keywords": [
17
+ "mcp",
18
+ "model-context-protocol",
19
+ "cooperto",
20
+ "claude",
21
+ "bookings",
22
+ "loyalty",
23
+ "openapi"
24
+ ],
25
+ "bin": {
26
+ "cooperto-mcp": "dist/index.js"
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "openapi.json",
31
+ "README.md",
32
+ "LICENSE"
33
+ ],
34
+ "scripts": {
35
+ "build": "tsc",
36
+ "start": "node dist/index.js",
37
+ "dev": "node --import tsx src/index.ts",
38
+ "inspect": "npx @modelcontextprotocol/inspector node dist/index.js"
39
+ },
40
+ "dependencies": {
41
+ "@modelcontextprotocol/sdk": "^1.12.0",
42
+ "undici": "^6.26.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^22.0.0",
46
+ "tsx": "^4.19.0",
47
+ "typescript": "^5.6.0"
48
+ }
49
+ }