@bytecodehr/solocomhr-mcp 1.0.0
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/dist/index.d.ts +13 -0
- package/dist/index.js +436 -0
- package/dist/index.js.map +1 -0
- package/dist/solo-client.d.ts +120 -0
- package/dist/solo-client.js +301 -0
- package/dist/solo-client.js.map +1 -0
- package/package.json +29 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Solo.com.hr MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides tools for creating, viewing, deleting, and stornoing invoices
|
|
6
|
+
* and offers via the Solo.com.hr Croatian invoicing API.
|
|
7
|
+
*
|
|
8
|
+
* Requires SOLO_API_TOKEN environment variable.
|
|
9
|
+
*
|
|
10
|
+
* Optional: SOLO_PDF_DIR - if set, solo_download_pdf will save PDFs there.
|
|
11
|
+
* If not set, the tool just returns the PDF URL for the agent to handle.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Solo.com.hr MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides tools for creating, viewing, deleting, and stornoing invoices
|
|
6
|
+
* and offers via the Solo.com.hr Croatian invoicing API.
|
|
7
|
+
*
|
|
8
|
+
* Requires SOLO_API_TOKEN environment variable.
|
|
9
|
+
*
|
|
10
|
+
* Optional: SOLO_PDF_DIR - if set, solo_download_pdf will save PDFs there.
|
|
11
|
+
* If not set, the tool just returns the PDF URL for the agent to handle.
|
|
12
|
+
*/
|
|
13
|
+
import { writeFile, mkdir } from "node:fs/promises";
|
|
14
|
+
import { resolve } from "node:path";
|
|
15
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
16
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
import { SoloClient, INVOICE_TYPES, CUSTOMER_TYPES, PAYMENT_METHODS, UNITS, LANGUAGES, CURRENCIES, STATUSES, TAX_RATES, } from "./solo-client.js";
|
|
19
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
20
|
+
function getClient() {
|
|
21
|
+
const token = process.env.SOLO_API_TOKEN;
|
|
22
|
+
if (!token) {
|
|
23
|
+
throw new Error("SOLO_API_TOKEN environment variable is not set. " +
|
|
24
|
+
"Get your API token from Solo.com.hr Settings after logging in.");
|
|
25
|
+
}
|
|
26
|
+
return new SoloClient(token);
|
|
27
|
+
}
|
|
28
|
+
function formatResponse(data) {
|
|
29
|
+
return JSON.stringify(data, null, 2);
|
|
30
|
+
}
|
|
31
|
+
function buildReferenceTable(map) {
|
|
32
|
+
return Object.entries(map)
|
|
33
|
+
.map(([id, label]) => ` ${id} = ${label}`)
|
|
34
|
+
.join("\n");
|
|
35
|
+
}
|
|
36
|
+
// ── Zod schemas for tool inputs ──────────────────────────────────────
|
|
37
|
+
const serviceItemSchema = z.object({
|
|
38
|
+
opis_usluge: z.string().describe("Description of the service/product (max 500 chars)"),
|
|
39
|
+
cijena: z.string().describe("Price with comma decimal, e.g. '100,00' or '1.234,00'"),
|
|
40
|
+
kolicina: z.string().describe("Quantity, e.g. '1' or '2,5'"),
|
|
41
|
+
popust: z.string().default("0").describe("Discount %, e.g. '0' or '10'"),
|
|
42
|
+
porez_stopa: z
|
|
43
|
+
.enum(["0", "5", "13", "25"])
|
|
44
|
+
.default("25")
|
|
45
|
+
.describe("Tax rate: 0, 5, 13, or 25"),
|
|
46
|
+
jed_mjera: z
|
|
47
|
+
.string()
|
|
48
|
+
.optional()
|
|
49
|
+
.describe("Unit of measure ID (1=kom/pcs, 2=sat/hour, etc.). See solo_reference tool."),
|
|
50
|
+
kpd: z.string().optional().describe("KPD code (required for B2B/B2G customers)"),
|
|
51
|
+
});
|
|
52
|
+
// ── Server setup ─────────────────────────────────────────────────────
|
|
53
|
+
const server = new McpServer({
|
|
54
|
+
name: "solo-mcp",
|
|
55
|
+
version: "1.0.0",
|
|
56
|
+
});
|
|
57
|
+
// ── Tool: Reference data ─────────────────────────────────────────────
|
|
58
|
+
server.tool("solo_reference", "Show Solo API reference data: invoice types, customer types, payment methods, units, languages, currencies, statuses, and tax rates. Use this before creating invoices/offers to look up the correct numeric IDs.", {}, async () => {
|
|
59
|
+
const text = [
|
|
60
|
+
"=== SOLO API REFERENCE DATA ===",
|
|
61
|
+
"",
|
|
62
|
+
"--- Invoice Types (tip_racuna) ---",
|
|
63
|
+
buildReferenceTable(INVOICE_TYPES),
|
|
64
|
+
"",
|
|
65
|
+
"--- Customer Types (tip_kupca) ---",
|
|
66
|
+
buildReferenceTable(CUSTOMER_TYPES),
|
|
67
|
+
"",
|
|
68
|
+
"--- Payment Methods (nacin_placanja) ---",
|
|
69
|
+
buildReferenceTable(PAYMENT_METHODS),
|
|
70
|
+
"",
|
|
71
|
+
"--- Units of Measure (jed_mjera) ---",
|
|
72
|
+
buildReferenceTable(UNITS),
|
|
73
|
+
"",
|
|
74
|
+
"--- Languages ---",
|
|
75
|
+
buildReferenceTable(LANGUAGES),
|
|
76
|
+
"",
|
|
77
|
+
"--- Currencies ---",
|
|
78
|
+
buildReferenceTable(CURRENCIES),
|
|
79
|
+
"",
|
|
80
|
+
"--- Statuses ---",
|
|
81
|
+
buildReferenceTable(STATUSES),
|
|
82
|
+
"",
|
|
83
|
+
`--- Tax Rates ---`,
|
|
84
|
+
` ${TAX_RATES.join("%, ")}%`,
|
|
85
|
+
"",
|
|
86
|
+
"Note: tip_usluge (service type ID) is specific to your Solo account.",
|
|
87
|
+
"Find it under Usluge -> Tipovi usluga after logging into solo.com.hr.",
|
|
88
|
+
].join("\n");
|
|
89
|
+
return { content: [{ type: "text", text }] };
|
|
90
|
+
});
|
|
91
|
+
// ── Tool: Create Invoice ─────────────────────────────────────────────
|
|
92
|
+
server.tool("solo_create_invoice", "Create a new invoice (racun) on Solo.com.hr. Returns the full invoice details including a PDF download URL. The agent can open/download the PDF from that URL. Prices use Croatian format with comma as decimal separator (e.g. '100,00').", {
|
|
93
|
+
tip_usluge: z.number().describe("Service type ID from your Solo account (find under Usluge -> Tipovi usluga)"),
|
|
94
|
+
tip_racuna: z.number().min(1).max(5).describe("Invoice type: 1=R1, 2=R2, 3=no label, 4=Avansni, 5=R"),
|
|
95
|
+
tip_kupca: z.number().min(1).max(5).describe("Customer type: 1=B2C, 2=B2B, 3=B2G, 4=EU, 5=INT"),
|
|
96
|
+
kupac_naziv: z.string().optional().describe("Customer name (required for B2B/B2G, max 100 chars)"),
|
|
97
|
+
kupac_adresa: z.string().optional().describe("Customer address (max 255 chars)"),
|
|
98
|
+
kupac_oib: z.string().optional().describe("Customer tax number/OIB (required for B2B/B2G, max 20 chars)"),
|
|
99
|
+
usluge: z.array(serviceItemSchema).min(1).max(36).describe("Array of services/products on the invoice (1-36 items)"),
|
|
100
|
+
nacin_placanja: z.number().min(1).max(5).describe("Payment method: 1=bank transfer, 2=cash, 3=card, 4=cheque, 5=other"),
|
|
101
|
+
rok_placanja: z.string().optional().describe("Payment due date ISO 8601 (e.g. '2024-12-31')"),
|
|
102
|
+
datum_isporuke: z.string().optional().describe("Delivery date ISO 8601 (e.g. '2024-12-31')"),
|
|
103
|
+
napomene: z.string().optional().describe("Notes visible on invoice (max 1000 chars)"),
|
|
104
|
+
ponavljanje: z.number().optional().describe("Repeat invoice every N days"),
|
|
105
|
+
iban: z.number().min(1).max(2).optional().describe("Which IBAN to use: 1 (first) or 2 (second)"),
|
|
106
|
+
jezik_racuna: z.number().min(1).max(6).optional().describe("Language: 1=HR, 2=EN, 3=DE, 4=FR, 5=IT, 6=ES"),
|
|
107
|
+
valuta_racuna: z.number().optional().describe("Currency ID (14=EUR default, 12=USD, 11=GBP, etc.)"),
|
|
108
|
+
tecaj: z.number().optional().describe("Exchange rate (1 for EUR, multiply factor for others)"),
|
|
109
|
+
status: z.number().optional().describe("Status: 1=open, 2=send, 3=remind, 5=paid"),
|
|
110
|
+
}, async (params) => {
|
|
111
|
+
try {
|
|
112
|
+
const client = getClient();
|
|
113
|
+
const result = await client.createInvoice({
|
|
114
|
+
tip_usluge: params.tip_usluge,
|
|
115
|
+
tip_racuna: params.tip_racuna,
|
|
116
|
+
tip_kupca: params.tip_kupca,
|
|
117
|
+
kupac_naziv: params.kupac_naziv,
|
|
118
|
+
kupac_adresa: params.kupac_adresa,
|
|
119
|
+
kupac_oib: params.kupac_oib,
|
|
120
|
+
usluge: params.usluge.map((s) => ({
|
|
121
|
+
opis_usluge: s.opis_usluge,
|
|
122
|
+
cijena: s.cijena,
|
|
123
|
+
kolicina: s.kolicina,
|
|
124
|
+
popust: s.popust,
|
|
125
|
+
porez_stopa: s.porez_stopa,
|
|
126
|
+
jed_mjera: s.jed_mjera,
|
|
127
|
+
kpd: s.kpd,
|
|
128
|
+
})),
|
|
129
|
+
nacin_placanja: params.nacin_placanja,
|
|
130
|
+
rok_placanja: params.rok_placanja,
|
|
131
|
+
datum_isporuke: params.datum_isporuke,
|
|
132
|
+
napomene: params.napomene,
|
|
133
|
+
ponavljanje: params.ponavljanje,
|
|
134
|
+
iban: params.iban,
|
|
135
|
+
jezik_racuna: params.jezik_racuna,
|
|
136
|
+
valuta_racuna: params.valuta_racuna,
|
|
137
|
+
tecaj: params.tecaj,
|
|
138
|
+
status: params.status,
|
|
139
|
+
});
|
|
140
|
+
if (result.status !== 0) {
|
|
141
|
+
return {
|
|
142
|
+
content: [{ type: "text", text: `Error (${result.status}): ${result.message}` }],
|
|
143
|
+
isError: true,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const racun = result.racun;
|
|
147
|
+
const broj = racun?.broj_racuna || "";
|
|
148
|
+
let summary = `Invoice created successfully!`;
|
|
149
|
+
if (broj)
|
|
150
|
+
summary += `\nInvoice Number: ${broj}`;
|
|
151
|
+
if (racun?.pdf)
|
|
152
|
+
summary += `\nPDF: ${racun.pdf}`;
|
|
153
|
+
if (racun?.bruto_suma)
|
|
154
|
+
summary += `\nTotal (bruto): ${racun.bruto_suma} ${racun.valuta_racuna || "EUR"}`;
|
|
155
|
+
summary += `\n\n${formatResponse(result)}`;
|
|
156
|
+
return { content: [{ type: "text", text: summary }] };
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
return {
|
|
160
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
161
|
+
isError: true,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
// ── Tool: Get Invoice(s) ─────────────────────────────────────────────
|
|
166
|
+
server.tool("solo_get_invoice", "Retrieve a specific invoice by ID, or list the last 1000 invoices. Returns full invoice details with PDF link when fetching by ID.", {
|
|
167
|
+
id: z.string().optional().describe("Invoice ID (hash). Omit to list all invoices."),
|
|
168
|
+
page: z.number().optional().describe("Page number when listing all invoices (1000 per page)"),
|
|
169
|
+
}, async (params) => {
|
|
170
|
+
try {
|
|
171
|
+
const client = getClient();
|
|
172
|
+
const result = await client.getInvoice(params.id, params.page);
|
|
173
|
+
if (result.status !== 0) {
|
|
174
|
+
return {
|
|
175
|
+
content: [{ type: "text", text: `Error (${result.status}): ${result.message}` }],
|
|
176
|
+
isError: true,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
return { content: [{ type: "text", text: formatResponse(result) }] };
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
return {
|
|
183
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
184
|
+
isError: true,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
// ── Tool: Delete Invoice ─────────────────────────────────────────────
|
|
189
|
+
server.tool("solo_delete_invoice", "Delete a non-fiscalized invoice. Fiscalized invoices cannot be deleted - use storno instead.", {
|
|
190
|
+
id: z.string().describe("Invoice ID (hash) to delete"),
|
|
191
|
+
}, async (params) => {
|
|
192
|
+
try {
|
|
193
|
+
const client = getClient();
|
|
194
|
+
const result = await client.deleteInvoice(params.id);
|
|
195
|
+
if (result.status !== 0) {
|
|
196
|
+
return {
|
|
197
|
+
content: [{ type: "text", text: `Error (${result.status}): ${result.message}` }],
|
|
198
|
+
isError: true,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
return { content: [{ type: "text", text: result.message }] };
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
return {
|
|
205
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
206
|
+
isError: true,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// ── Tool: Storno Invoice ─────────────────────────────────────────────
|
|
211
|
+
server.tool("solo_storno_invoice", "Storno (reverse/cancel) an existing invoice. Creates a cancellation record. Cannot storno an already-stornoed invoice.", {
|
|
212
|
+
id: z.string().describe("Invoice ID (hash) to storno"),
|
|
213
|
+
}, async (params) => {
|
|
214
|
+
try {
|
|
215
|
+
const client = getClient();
|
|
216
|
+
const result = await client.stornoInvoice(params.id);
|
|
217
|
+
if (result.status !== 0) {
|
|
218
|
+
return {
|
|
219
|
+
content: [{ type: "text", text: `Error (${result.status}): ${result.message}` }],
|
|
220
|
+
isError: true,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
return { content: [{ type: "text", text: result.message }] };
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
return {
|
|
227
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
228
|
+
isError: true,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
// ── Tool: Create Offer ───────────────────────────────────────────────
|
|
233
|
+
server.tool("solo_create_offer", "Create a new offer/quote (ponuda) on Solo.com.hr. Returns full offer details with a PDF download URL.", {
|
|
234
|
+
tip_usluge: z.number().describe("Service type ID from your Solo account"),
|
|
235
|
+
tip_kupca: z.number().min(1).max(5).describe("Customer type: 1=B2C, 2=B2B, 3=B2G, 4=EU, 5=INT"),
|
|
236
|
+
kupac_naziv: z.string().optional().describe("Customer name (required for B2B/B2G)"),
|
|
237
|
+
kupac_adresa: z.string().optional().describe("Customer address"),
|
|
238
|
+
kupac_oib: z.string().optional().describe("Customer tax number/OIB (required for B2B/B2G)"),
|
|
239
|
+
usluge: z.array(serviceItemSchema).min(1).max(36).describe("Array of services/products (1-36 items)"),
|
|
240
|
+
nacin_placanja: z.number().min(1).max(5).describe("Payment method: 1=bank, 2=cash, 3=card, 4=cheque, 5=other"),
|
|
241
|
+
rok_placanja: z.string().optional().describe("Due date ISO 8601"),
|
|
242
|
+
napomene: z.string().optional().describe("Notes (max 1000 chars)"),
|
|
243
|
+
ponavljanje: z.number().optional().describe("Repeat every N days"),
|
|
244
|
+
iban: z.number().min(1).max(2).optional().describe("Which IBAN: 1 or 2"),
|
|
245
|
+
jezik_ponude: z.number().min(1).max(6).optional().describe("Language: 1=HR, 2=EN, 3=DE, 4=FR, 5=IT, 6=ES"),
|
|
246
|
+
valuta_ponude: z.number().optional().describe("Currency ID (14=EUR default)"),
|
|
247
|
+
tecaj: z.number().optional().describe("Exchange rate"),
|
|
248
|
+
status: z.number().optional().describe("Status: 1=open, 2=send, 5=paid"),
|
|
249
|
+
}, async (params) => {
|
|
250
|
+
try {
|
|
251
|
+
const client = getClient();
|
|
252
|
+
const result = await client.createOffer({
|
|
253
|
+
tip_usluge: params.tip_usluge,
|
|
254
|
+
tip_kupca: params.tip_kupca,
|
|
255
|
+
kupac_naziv: params.kupac_naziv,
|
|
256
|
+
kupac_adresa: params.kupac_adresa,
|
|
257
|
+
kupac_oib: params.kupac_oib,
|
|
258
|
+
usluge: params.usluge.map((s) => ({
|
|
259
|
+
opis_usluge: s.opis_usluge,
|
|
260
|
+
cijena: s.cijena,
|
|
261
|
+
kolicina: s.kolicina,
|
|
262
|
+
popust: s.popust,
|
|
263
|
+
porez_stopa: s.porez_stopa,
|
|
264
|
+
jed_mjera: s.jed_mjera,
|
|
265
|
+
kpd: s.kpd,
|
|
266
|
+
})),
|
|
267
|
+
nacin_placanja: params.nacin_placanja,
|
|
268
|
+
rok_placanja: params.rok_placanja,
|
|
269
|
+
napomene: params.napomene,
|
|
270
|
+
ponavljanje: params.ponavljanje,
|
|
271
|
+
iban: params.iban,
|
|
272
|
+
jezik_ponude: params.jezik_ponude,
|
|
273
|
+
valuta_ponude: params.valuta_ponude,
|
|
274
|
+
tecaj: params.tecaj,
|
|
275
|
+
status: params.status,
|
|
276
|
+
});
|
|
277
|
+
if (result.status !== 0) {
|
|
278
|
+
return {
|
|
279
|
+
content: [{ type: "text", text: `Error (${result.status}): ${result.message}` }],
|
|
280
|
+
isError: true,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
const ponuda = result.ponuda;
|
|
284
|
+
const broj = ponuda?.broj_ponude || "";
|
|
285
|
+
let summary = `Offer created successfully!`;
|
|
286
|
+
if (broj)
|
|
287
|
+
summary += `\nOffer Number: ${broj}`;
|
|
288
|
+
if (ponuda?.pdf)
|
|
289
|
+
summary += `\nPDF: ${ponuda.pdf}`;
|
|
290
|
+
if (ponuda?.bruto_suma)
|
|
291
|
+
summary += `\nTotal (bruto): ${ponuda.bruto_suma} ${ponuda.valuta_ponude || "EUR"}`;
|
|
292
|
+
summary += `\n\n${formatResponse(result)}`;
|
|
293
|
+
return { content: [{ type: "text", text: summary }] };
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
return {
|
|
297
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
298
|
+
isError: true,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
// ── Tool: Get Offer(s) ───────────────────────────────────────────────
|
|
303
|
+
server.tool("solo_get_offer", "Retrieve a specific offer by ID, or list the last 1000 offers.", {
|
|
304
|
+
id: z.string().optional().describe("Offer ID (hash). Omit to list all offers."),
|
|
305
|
+
page: z.number().optional().describe("Page number (1000 per page)"),
|
|
306
|
+
}, async (params) => {
|
|
307
|
+
try {
|
|
308
|
+
const client = getClient();
|
|
309
|
+
const result = await client.getOffer(params.id, params.page);
|
|
310
|
+
if (result.status !== 0) {
|
|
311
|
+
return {
|
|
312
|
+
content: [{ type: "text", text: `Error (${result.status}): ${result.message}` }],
|
|
313
|
+
isError: true,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
return { content: [{ type: "text", text: formatResponse(result) }] };
|
|
317
|
+
}
|
|
318
|
+
catch (err) {
|
|
319
|
+
return {
|
|
320
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
321
|
+
isError: true,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
// ── Tool: Delete Offer ───────────────────────────────────────────────
|
|
326
|
+
server.tool("solo_delete_offer", "Delete an existing offer/quote.", {
|
|
327
|
+
id: z.string().describe("Offer ID (hash) to delete"),
|
|
328
|
+
}, async (params) => {
|
|
329
|
+
try {
|
|
330
|
+
const client = getClient();
|
|
331
|
+
const result = await client.deleteOffer(params.id);
|
|
332
|
+
if (result.status !== 0) {
|
|
333
|
+
return {
|
|
334
|
+
content: [{ type: "text", text: `Error (${result.status}): ${result.message}` }],
|
|
335
|
+
isError: true,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
return { content: [{ type: "text", text: result.message }] };
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
return {
|
|
342
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
343
|
+
isError: true,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
// ── Tool: Download PDF ───────────────────────────────────────────────
|
|
348
|
+
server.tool("solo_download_pdf", "Download a Solo invoice or offer PDF. If SOLO_PDF_DIR is configured, saves the PDF to that directory and returns the path. Otherwise returns the PDF download URL for the user to open in their browser. You can provide a direct PDF URL or an invoice/offer ID to look it up.", {
|
|
349
|
+
pdf_url: z.string().optional().describe("Direct Solo PDF download URL (e.g. https://solo.com.hr/download/...)"),
|
|
350
|
+
invoice_id: z.string().optional().describe("Invoice ID - will fetch the invoice and get its PDF URL"),
|
|
351
|
+
offer_id: z.string().optional().describe("Offer ID - will fetch the offer and get its PDF URL"),
|
|
352
|
+
filename: z.string().optional().describe("Custom filename when saving (e.g. 'racun-001.pdf')"),
|
|
353
|
+
}, async (params) => {
|
|
354
|
+
try {
|
|
355
|
+
if (!params.pdf_url && !params.invoice_id && !params.offer_id) {
|
|
356
|
+
return {
|
|
357
|
+
content: [{ type: "text", text: "Provide one of: pdf_url, invoice_id, or offer_id" }],
|
|
358
|
+
isError: true,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
const client = getClient();
|
|
362
|
+
let pdfUrl = params.pdf_url;
|
|
363
|
+
let autoName = "solo-document.pdf";
|
|
364
|
+
// Resolve PDF URL from invoice ID
|
|
365
|
+
if (!pdfUrl && params.invoice_id) {
|
|
366
|
+
const inv = await client.getInvoice(params.invoice_id);
|
|
367
|
+
if (inv.status !== 0) {
|
|
368
|
+
return {
|
|
369
|
+
content: [{ type: "text", text: `Error fetching invoice: ${inv.message}` }],
|
|
370
|
+
isError: true,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
const racun = inv.racun;
|
|
374
|
+
pdfUrl = racun?.pdf;
|
|
375
|
+
const broj = racun?.broj_racuna;
|
|
376
|
+
if (broj)
|
|
377
|
+
autoName = `racun-${broj.replace(/\//g, "-")}.pdf`;
|
|
378
|
+
}
|
|
379
|
+
// Resolve PDF URL from offer ID
|
|
380
|
+
if (!pdfUrl && params.offer_id) {
|
|
381
|
+
const off = await client.getOffer(params.offer_id);
|
|
382
|
+
if (off.status !== 0) {
|
|
383
|
+
return {
|
|
384
|
+
content: [{ type: "text", text: `Error fetching offer: ${off.message}` }],
|
|
385
|
+
isError: true,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
const ponuda = off.ponuda;
|
|
389
|
+
pdfUrl = ponuda?.pdf;
|
|
390
|
+
const broj = ponuda?.broj_ponude;
|
|
391
|
+
if (broj)
|
|
392
|
+
autoName = `ponuda-${broj.replace(/\//g, "-")}.pdf`;
|
|
393
|
+
}
|
|
394
|
+
if (!pdfUrl) {
|
|
395
|
+
return {
|
|
396
|
+
content: [{ type: "text", text: "Could not find a PDF URL for this document." }],
|
|
397
|
+
isError: true,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
// If SOLO_PDF_DIR is set, download and save to disk
|
|
401
|
+
const pdfDir = process.env.SOLO_PDF_DIR;
|
|
402
|
+
if (pdfDir) {
|
|
403
|
+
await mkdir(pdfDir, { recursive: true });
|
|
404
|
+
const filename = params.filename || autoName;
|
|
405
|
+
const filePath = resolve(pdfDir, filename);
|
|
406
|
+
const buffer = await client.downloadPdf(pdfUrl);
|
|
407
|
+
await writeFile(filePath, Buffer.from(buffer));
|
|
408
|
+
return {
|
|
409
|
+
content: [{ type: "text", text: `PDF saved to: ${filePath}` }],
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
// Otherwise just return the URL
|
|
413
|
+
return {
|
|
414
|
+
content: [{
|
|
415
|
+
type: "text",
|
|
416
|
+
text: `PDF download URL: ${pdfUrl}\n\nOpen this link in a browser to download the PDF.`,
|
|
417
|
+
}],
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
catch (err) {
|
|
421
|
+
return {
|
|
422
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
423
|
+
isError: true,
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
// ── Start ────────────────────────────────────────────────────────────
|
|
428
|
+
async function main() {
|
|
429
|
+
const transport = new StdioServerTransport();
|
|
430
|
+
await server.connect(transport);
|
|
431
|
+
}
|
|
432
|
+
main().catch((err) => {
|
|
433
|
+
console.error("Fatal:", err);
|
|
434
|
+
process.exit(1);
|
|
435
|
+
});
|
|
436
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solo.com.hr API Client
|
|
3
|
+
* REST client for the Croatian invoicing service Solo.
|
|
4
|
+
* API docs: https://solo.com.hr/api-dokumentacija
|
|
5
|
+
*/
|
|
6
|
+
export declare const INVOICE_TYPES: Record<number, string>;
|
|
7
|
+
export declare const CUSTOMER_TYPES: Record<number, string>;
|
|
8
|
+
export declare const PAYMENT_METHODS: Record<number, string>;
|
|
9
|
+
export declare const UNITS: Record<number, string>;
|
|
10
|
+
export declare const LANGUAGES: Record<number, string>;
|
|
11
|
+
export declare const CURRENCIES: Record<number, string>;
|
|
12
|
+
export declare const STATUSES: Record<number, string>;
|
|
13
|
+
export declare const TAX_RATES: readonly [0, 5, 13, 25];
|
|
14
|
+
export interface ServiceItem {
|
|
15
|
+
/** Description of the service/product (max 500 chars) */
|
|
16
|
+
opis_usluge: string;
|
|
17
|
+
/** Price in Croatian format: comma for decimal (e.g. "100,00") */
|
|
18
|
+
cijena: string;
|
|
19
|
+
/** Quantity */
|
|
20
|
+
kolicina: string;
|
|
21
|
+
/** Discount percentage (0-100) */
|
|
22
|
+
popust: string;
|
|
23
|
+
/** Tax rate: 0, 5, 13, or 25 */
|
|
24
|
+
porez_stopa: string;
|
|
25
|
+
/** Unit of measure ID (see UNITS) */
|
|
26
|
+
jed_mjera?: string;
|
|
27
|
+
/** KPD code (required for B2B/B2G) */
|
|
28
|
+
kpd?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface CreateInvoiceParams {
|
|
31
|
+
tip_usluge: number;
|
|
32
|
+
tip_racuna: number;
|
|
33
|
+
tip_kupca: number;
|
|
34
|
+
kupac_naziv?: string;
|
|
35
|
+
kupac_adresa?: string;
|
|
36
|
+
kupac_oib?: string;
|
|
37
|
+
usluge: ServiceItem[];
|
|
38
|
+
nacin_placanja: number;
|
|
39
|
+
rok_placanja?: string;
|
|
40
|
+
datum_isporuke?: string;
|
|
41
|
+
napomene?: string;
|
|
42
|
+
ponavljanje?: number;
|
|
43
|
+
iban?: number;
|
|
44
|
+
jezik_racuna?: number;
|
|
45
|
+
valuta_racuna?: number;
|
|
46
|
+
tecaj?: number;
|
|
47
|
+
status?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface CreateOfferParams {
|
|
50
|
+
tip_usluge: number;
|
|
51
|
+
tip_kupca: number;
|
|
52
|
+
kupac_naziv?: string;
|
|
53
|
+
kupac_adresa?: string;
|
|
54
|
+
kupac_oib?: string;
|
|
55
|
+
usluge: ServiceItem[];
|
|
56
|
+
nacin_placanja: number;
|
|
57
|
+
rok_placanja?: string;
|
|
58
|
+
napomene?: string;
|
|
59
|
+
ponavljanje?: number;
|
|
60
|
+
iban?: number;
|
|
61
|
+
jezik_ponude?: number;
|
|
62
|
+
valuta_ponude?: number;
|
|
63
|
+
tecaj?: number;
|
|
64
|
+
status?: number;
|
|
65
|
+
}
|
|
66
|
+
export interface SoloApiResponse {
|
|
67
|
+
status: number;
|
|
68
|
+
message: string;
|
|
69
|
+
racun?: Record<string, unknown>;
|
|
70
|
+
racuni?: Record<string, unknown>[];
|
|
71
|
+
ponuda?: Record<string, unknown>;
|
|
72
|
+
ponude?: Record<string, unknown>[];
|
|
73
|
+
}
|
|
74
|
+
export declare class SoloClient {
|
|
75
|
+
private token;
|
|
76
|
+
constructor(token: string);
|
|
77
|
+
/**
|
|
78
|
+
* Create a new invoice.
|
|
79
|
+
* POST https://api.solo.com.hr/racun
|
|
80
|
+
*
|
|
81
|
+
* Important: the Solo API expects form-urlencoded body with duplicate
|
|
82
|
+
* `usluga` keys for multiple services. We build the body string manually.
|
|
83
|
+
*/
|
|
84
|
+
createInvoice(params: CreateInvoiceParams): Promise<SoloApiResponse>;
|
|
85
|
+
/**
|
|
86
|
+
* Get one invoice by ID, or list last 1000 invoices.
|
|
87
|
+
* GET https://api.solo.com.hr/racun
|
|
88
|
+
*/
|
|
89
|
+
getInvoice(id?: string, page?: number): Promise<SoloApiResponse>;
|
|
90
|
+
/**
|
|
91
|
+
* Delete a non-fiscalized invoice.
|
|
92
|
+
* DELETE https://api.solo.com.hr/racun
|
|
93
|
+
*/
|
|
94
|
+
deleteInvoice(id: string): Promise<SoloApiResponse>;
|
|
95
|
+
/**
|
|
96
|
+
* Storno (reverse/cancel) an invoice.
|
|
97
|
+
* POST https://api.solo.com.hr/storno
|
|
98
|
+
*/
|
|
99
|
+
stornoInvoice(id: string): Promise<SoloApiResponse>;
|
|
100
|
+
/**
|
|
101
|
+
* Create a new offer/quote.
|
|
102
|
+
* POST https://api.solo.com.hr/ponuda
|
|
103
|
+
*/
|
|
104
|
+
createOffer(params: CreateOfferParams): Promise<SoloApiResponse>;
|
|
105
|
+
/**
|
|
106
|
+
* Get one offer by ID, or list last 1000 offers.
|
|
107
|
+
* GET https://api.solo.com.hr/ponuda
|
|
108
|
+
*/
|
|
109
|
+
getOffer(id?: string, page?: number): Promise<SoloApiResponse>;
|
|
110
|
+
/**
|
|
111
|
+
* Delete an offer.
|
|
112
|
+
* DELETE https://api.solo.com.hr/ponuda
|
|
113
|
+
*/
|
|
114
|
+
deleteOffer(id: string): Promise<SoloApiResponse>;
|
|
115
|
+
/**
|
|
116
|
+
* Download a PDF from a Solo download URL.
|
|
117
|
+
* Returns the raw PDF bytes.
|
|
118
|
+
*/
|
|
119
|
+
downloadPdf(pdfUrl: string): Promise<ArrayBuffer>;
|
|
120
|
+
}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solo.com.hr API Client
|
|
3
|
+
* REST client for the Croatian invoicing service Solo.
|
|
4
|
+
* API docs: https://solo.com.hr/api-dokumentacija
|
|
5
|
+
*/
|
|
6
|
+
const API_BASE = "https://api.solo.com.hr";
|
|
7
|
+
// ── Reference enums ──────────────────────────────────────────────────
|
|
8
|
+
export const INVOICE_TYPES = {
|
|
9
|
+
1: "R1",
|
|
10
|
+
2: "R2",
|
|
11
|
+
3: "bez oznake (no label)",
|
|
12
|
+
4: "Avansni (advance)",
|
|
13
|
+
5: "R",
|
|
14
|
+
};
|
|
15
|
+
export const CUSTOMER_TYPES = {
|
|
16
|
+
1: "B2C - Fizicka osoba (individual)",
|
|
17
|
+
2: "B2B - Poslovni subjekt (business)",
|
|
18
|
+
3: "B2G - Drzava i javna nabava (government)",
|
|
19
|
+
4: "EU - Unutar europske unije (EU)",
|
|
20
|
+
5: "INT - Ostatak svijeta (international)",
|
|
21
|
+
};
|
|
22
|
+
export const PAYMENT_METHODS = {
|
|
23
|
+
1: "Transakcijski racun (bank transfer)",
|
|
24
|
+
2: "Gotovina (cash)",
|
|
25
|
+
3: "Kartice (card)",
|
|
26
|
+
4: "Cek (cheque)",
|
|
27
|
+
5: "Ostalo (other)",
|
|
28
|
+
};
|
|
29
|
+
export const UNITS = {
|
|
30
|
+
1: "kom (pcs)",
|
|
31
|
+
2: "sat (hour)",
|
|
32
|
+
3: "god (year)",
|
|
33
|
+
4: "km",
|
|
34
|
+
5: "lit (liter)",
|
|
35
|
+
6: "kg",
|
|
36
|
+
7: "kWh",
|
|
37
|
+
8: "m3",
|
|
38
|
+
9: "t (ton)",
|
|
39
|
+
10: "m2",
|
|
40
|
+
11: "m",
|
|
41
|
+
12: "dan (day)",
|
|
42
|
+
13: "mj (month)",
|
|
43
|
+
14: "noc (night)",
|
|
44
|
+
15: "kart.",
|
|
45
|
+
16: "rc.",
|
|
46
|
+
17: "par (pair)",
|
|
47
|
+
18: "ml",
|
|
48
|
+
19: "pax",
|
|
49
|
+
20: "soba (room)",
|
|
50
|
+
21: "apt",
|
|
51
|
+
22: "term",
|
|
52
|
+
23: "set",
|
|
53
|
+
24: "pak (pack)",
|
|
54
|
+
25: "bod (point)",
|
|
55
|
+
26: "usl (service)",
|
|
56
|
+
27: "pal (pallet)",
|
|
57
|
+
28: "kont (container)",
|
|
58
|
+
29: "cl. (article)",
|
|
59
|
+
30: "tis. (thousand)",
|
|
60
|
+
31: "sek (second)",
|
|
61
|
+
32: "min (minute)",
|
|
62
|
+
33: "str (page)",
|
|
63
|
+
34: "kpl (complete)",
|
|
64
|
+
35: "psl (shipment)",
|
|
65
|
+
36: "ha (hectare)",
|
|
66
|
+
37: "g (gram)",
|
|
67
|
+
38: "x",
|
|
68
|
+
39: "tj (week)",
|
|
69
|
+
40: "- (none)",
|
|
70
|
+
};
|
|
71
|
+
export const LANGUAGES = {
|
|
72
|
+
1: "Hrvatski (Croatian)",
|
|
73
|
+
2: "Engleski (English)",
|
|
74
|
+
3: "Njemacki (German)",
|
|
75
|
+
4: "Francuski (French)",
|
|
76
|
+
5: "Talijanski (Italian)",
|
|
77
|
+
6: "Spanjolski (Spanish)",
|
|
78
|
+
};
|
|
79
|
+
export const CURRENCIES = {
|
|
80
|
+
2: "AUD",
|
|
81
|
+
3: "CAD",
|
|
82
|
+
4: "CZK",
|
|
83
|
+
5: "DKK",
|
|
84
|
+
6: "HUF",
|
|
85
|
+
7: "JPY",
|
|
86
|
+
8: "NOK",
|
|
87
|
+
9: "SEK",
|
|
88
|
+
10: "CHF",
|
|
89
|
+
11: "GBP",
|
|
90
|
+
12: "USD",
|
|
91
|
+
13: "BAM",
|
|
92
|
+
14: "EUR",
|
|
93
|
+
15: "PLN",
|
|
94
|
+
};
|
|
95
|
+
export const STATUSES = {
|
|
96
|
+
1: "Otvori (open)",
|
|
97
|
+
2: "Posalji (send)",
|
|
98
|
+
3: "Opomeni (remind) - invoices only",
|
|
99
|
+
5: "Placeno (paid)",
|
|
100
|
+
};
|
|
101
|
+
export const TAX_RATES = [0, 5, 13, 25];
|
|
102
|
+
// ── Client ───────────────────────────────────────────────────────────
|
|
103
|
+
export class SoloClient {
|
|
104
|
+
token;
|
|
105
|
+
constructor(token) {
|
|
106
|
+
this.token = token;
|
|
107
|
+
}
|
|
108
|
+
// ── Invoice (Racun) endpoints ────────────────────────────────────
|
|
109
|
+
/**
|
|
110
|
+
* Create a new invoice.
|
|
111
|
+
* POST https://api.solo.com.hr/racun
|
|
112
|
+
*
|
|
113
|
+
* Important: the Solo API expects form-urlencoded body with duplicate
|
|
114
|
+
* `usluga` keys for multiple services. We build the body string manually.
|
|
115
|
+
*/
|
|
116
|
+
async createInvoice(params) {
|
|
117
|
+
const parts = [
|
|
118
|
+
`token=${encodeURIComponent(this.token)}`,
|
|
119
|
+
`tip_usluge=${params.tip_usluge}`,
|
|
120
|
+
`tip_racuna=${params.tip_racuna}`,
|
|
121
|
+
`tip_kupca=${params.tip_kupca}`,
|
|
122
|
+
`nacin_placanja=${params.nacin_placanja}`,
|
|
123
|
+
];
|
|
124
|
+
if (params.kupac_naziv)
|
|
125
|
+
parts.push(`kupac_naziv=${encodeURIComponent(params.kupac_naziv)}`);
|
|
126
|
+
if (params.kupac_adresa)
|
|
127
|
+
parts.push(`kupac_adresa=${encodeURIComponent(params.kupac_adresa)}`);
|
|
128
|
+
if (params.kupac_oib)
|
|
129
|
+
parts.push(`kupac_oib=${encodeURIComponent(params.kupac_oib)}`);
|
|
130
|
+
if (params.rok_placanja)
|
|
131
|
+
parts.push(`rok_placanja=${encodeURIComponent(params.rok_placanja)}`);
|
|
132
|
+
if (params.datum_isporuke)
|
|
133
|
+
parts.push(`datum_isporuke=${encodeURIComponent(params.datum_isporuke)}`);
|
|
134
|
+
if (params.napomene)
|
|
135
|
+
parts.push(`napomene=${encodeURIComponent(params.napomene)}`);
|
|
136
|
+
if (params.ponavljanje !== undefined)
|
|
137
|
+
parts.push(`ponavljanje=${params.ponavljanje}`);
|
|
138
|
+
if (params.iban)
|
|
139
|
+
parts.push(`iban=${params.iban}`);
|
|
140
|
+
if (params.jezik_racuna)
|
|
141
|
+
parts.push(`jezik_racuna=${params.jezik_racuna}`);
|
|
142
|
+
if (params.valuta_racuna)
|
|
143
|
+
parts.push(`valuta_racuna=${params.valuta_racuna}`);
|
|
144
|
+
if (params.tecaj !== undefined)
|
|
145
|
+
parts.push(`tecaj=${params.tecaj}`);
|
|
146
|
+
if (params.status)
|
|
147
|
+
parts.push(`status=${params.status}`);
|
|
148
|
+
// Services must be sent as usluga=1&...&usluga=2&... with duplicate keys
|
|
149
|
+
for (let i = 0; i < params.usluge.length; i++) {
|
|
150
|
+
const idx = i + 1; // 1-indexed
|
|
151
|
+
const svc = params.usluge[i];
|
|
152
|
+
parts.push(`usluga=${idx}`);
|
|
153
|
+
if (svc.kpd)
|
|
154
|
+
parts.push(`kpd_${idx}=${encodeURIComponent(svc.kpd)}`);
|
|
155
|
+
parts.push(`opis_usluge_${idx}=${encodeURIComponent(svc.opis_usluge)}`);
|
|
156
|
+
if (svc.jed_mjera)
|
|
157
|
+
parts.push(`jed_mjera_${idx}=${svc.jed_mjera}`);
|
|
158
|
+
parts.push(`cijena_${idx}=${encodeURIComponent(svc.cijena)}`);
|
|
159
|
+
parts.push(`kolicina_${idx}=${encodeURIComponent(svc.kolicina)}`);
|
|
160
|
+
parts.push(`popust_${idx}=${encodeURIComponent(svc.popust)}`);
|
|
161
|
+
parts.push(`porez_stopa_${idx}=${svc.porez_stopa}`);
|
|
162
|
+
}
|
|
163
|
+
const body = parts.join("&");
|
|
164
|
+
const res = await fetch(`${API_BASE}/racun`, {
|
|
165
|
+
method: "POST",
|
|
166
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
167
|
+
body,
|
|
168
|
+
});
|
|
169
|
+
return (await res.json());
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get one invoice by ID, or list last 1000 invoices.
|
|
173
|
+
* GET https://api.solo.com.hr/racun
|
|
174
|
+
*/
|
|
175
|
+
async getInvoice(id, page) {
|
|
176
|
+
const params = new URLSearchParams({ token: this.token });
|
|
177
|
+
if (id)
|
|
178
|
+
params.set("id", id);
|
|
179
|
+
if (page)
|
|
180
|
+
params.set("stranica", String(page));
|
|
181
|
+
const res = await fetch(`${API_BASE}/racun?${params.toString()}`);
|
|
182
|
+
return (await res.json());
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Delete a non-fiscalized invoice.
|
|
186
|
+
* DELETE https://api.solo.com.hr/racun
|
|
187
|
+
*/
|
|
188
|
+
async deleteInvoice(id) {
|
|
189
|
+
const params = new URLSearchParams({ token: this.token, id });
|
|
190
|
+
const res = await fetch(`${API_BASE}/racun?${params.toString()}`, {
|
|
191
|
+
method: "DELETE",
|
|
192
|
+
});
|
|
193
|
+
return (await res.json());
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Storno (reverse/cancel) an invoice.
|
|
197
|
+
* POST https://api.solo.com.hr/storno
|
|
198
|
+
*/
|
|
199
|
+
async stornoInvoice(id) {
|
|
200
|
+
const body = `token=${encodeURIComponent(this.token)}&id=${encodeURIComponent(id)}`;
|
|
201
|
+
const res = await fetch(`${API_BASE}/storno`, {
|
|
202
|
+
method: "POST",
|
|
203
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
204
|
+
body,
|
|
205
|
+
});
|
|
206
|
+
return (await res.json());
|
|
207
|
+
}
|
|
208
|
+
// ── Offer (Ponuda) endpoints ─────────────────────────────────────
|
|
209
|
+
/**
|
|
210
|
+
* Create a new offer/quote.
|
|
211
|
+
* POST https://api.solo.com.hr/ponuda
|
|
212
|
+
*/
|
|
213
|
+
async createOffer(params) {
|
|
214
|
+
const parts = [
|
|
215
|
+
`token=${encodeURIComponent(this.token)}`,
|
|
216
|
+
`tip_usluge=${params.tip_usluge}`,
|
|
217
|
+
`tip_kupca=${params.tip_kupca}`,
|
|
218
|
+
`nacin_placanja=${params.nacin_placanja}`,
|
|
219
|
+
];
|
|
220
|
+
if (params.kupac_naziv)
|
|
221
|
+
parts.push(`kupac_naziv=${encodeURIComponent(params.kupac_naziv)}`);
|
|
222
|
+
if (params.kupac_adresa)
|
|
223
|
+
parts.push(`kupac_adresa=${encodeURIComponent(params.kupac_adresa)}`);
|
|
224
|
+
if (params.kupac_oib)
|
|
225
|
+
parts.push(`kupac_oib=${encodeURIComponent(params.kupac_oib)}`);
|
|
226
|
+
if (params.rok_placanja)
|
|
227
|
+
parts.push(`rok_placanja=${encodeURIComponent(params.rok_placanja)}`);
|
|
228
|
+
if (params.napomene)
|
|
229
|
+
parts.push(`napomene=${encodeURIComponent(params.napomene)}`);
|
|
230
|
+
if (params.ponavljanje !== undefined)
|
|
231
|
+
parts.push(`ponavljanje=${params.ponavljanje}`);
|
|
232
|
+
if (params.iban)
|
|
233
|
+
parts.push(`iban=${params.iban}`);
|
|
234
|
+
if (params.jezik_ponude)
|
|
235
|
+
parts.push(`jezik_ponude=${params.jezik_ponude}`);
|
|
236
|
+
if (params.valuta_ponude)
|
|
237
|
+
parts.push(`valuta_ponude=${params.valuta_ponude}`);
|
|
238
|
+
if (params.tecaj !== undefined)
|
|
239
|
+
parts.push(`tecaj=${params.tecaj}`);
|
|
240
|
+
if (params.status)
|
|
241
|
+
parts.push(`status=${params.status}`);
|
|
242
|
+
for (let i = 0; i < params.usluge.length; i++) {
|
|
243
|
+
const idx = i + 1;
|
|
244
|
+
const svc = params.usluge[i];
|
|
245
|
+
parts.push(`usluga=${idx}`);
|
|
246
|
+
if (svc.kpd)
|
|
247
|
+
parts.push(`kpd_${idx}=${encodeURIComponent(svc.kpd)}`);
|
|
248
|
+
parts.push(`opis_usluge_${idx}=${encodeURIComponent(svc.opis_usluge)}`);
|
|
249
|
+
if (svc.jed_mjera)
|
|
250
|
+
parts.push(`jed_mjera_${idx}=${svc.jed_mjera}`);
|
|
251
|
+
parts.push(`cijena_${idx}=${encodeURIComponent(svc.cijena)}`);
|
|
252
|
+
parts.push(`kolicina_${idx}=${encodeURIComponent(svc.kolicina)}`);
|
|
253
|
+
parts.push(`popust_${idx}=${encodeURIComponent(svc.popust)}`);
|
|
254
|
+
parts.push(`porez_stopa_${idx}=${svc.porez_stopa}`);
|
|
255
|
+
}
|
|
256
|
+
const body = parts.join("&");
|
|
257
|
+
const res = await fetch(`${API_BASE}/ponuda`, {
|
|
258
|
+
method: "POST",
|
|
259
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
260
|
+
body,
|
|
261
|
+
});
|
|
262
|
+
return (await res.json());
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get one offer by ID, or list last 1000 offers.
|
|
266
|
+
* GET https://api.solo.com.hr/ponuda
|
|
267
|
+
*/
|
|
268
|
+
async getOffer(id, page) {
|
|
269
|
+
const params = new URLSearchParams({ token: this.token });
|
|
270
|
+
if (id)
|
|
271
|
+
params.set("id", id);
|
|
272
|
+
if (page)
|
|
273
|
+
params.set("stranica", String(page));
|
|
274
|
+
const res = await fetch(`${API_BASE}/ponuda?${params.toString()}`);
|
|
275
|
+
return (await res.json());
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Delete an offer.
|
|
279
|
+
* DELETE https://api.solo.com.hr/ponuda
|
|
280
|
+
*/
|
|
281
|
+
async deleteOffer(id) {
|
|
282
|
+
const params = new URLSearchParams({ token: this.token, id });
|
|
283
|
+
const res = await fetch(`${API_BASE}/ponuda?${params.toString()}`, {
|
|
284
|
+
method: "DELETE",
|
|
285
|
+
});
|
|
286
|
+
return (await res.json());
|
|
287
|
+
}
|
|
288
|
+
// ── PDF download ─────────────────────────────────────────────────
|
|
289
|
+
/**
|
|
290
|
+
* Download a PDF from a Solo download URL.
|
|
291
|
+
* Returns the raw PDF bytes.
|
|
292
|
+
*/
|
|
293
|
+
async downloadPdf(pdfUrl) {
|
|
294
|
+
const res = await fetch(pdfUrl);
|
|
295
|
+
if (!res.ok) {
|
|
296
|
+
throw new Error(`Failed to download PDF: ${res.status} ${res.statusText}`);
|
|
297
|
+
}
|
|
298
|
+
return await res.arrayBuffer();
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=solo-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-client.js","sourceRoot":"","sources":["../src/solo-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,QAAQ,GAAG,yBAAyB,CAAC;AAE3C,wEAAwE;AAExE,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,uBAAuB;IAC1B,CAAC,EAAE,mBAAmB;IACtB,CAAC,EAAE,GAAG;CACP,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,CAAC,EAAE,kCAAkC;IACrC,CAAC,EAAE,mCAAmC;IACtC,CAAC,EAAE,0CAA0C;IAC7C,CAAC,EAAE,iCAAiC;IACpC,CAAC,EAAE,uCAAuC;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,CAAC,EAAE,qCAAqC;IACxC,CAAC,EAAE,iBAAiB;IACpB,CAAC,EAAE,gBAAgB;IACnB,CAAC,EAAE,cAAc;IACjB,CAAC,EAAE,gBAAgB;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAA2B;IAC3C,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,SAAS;IACZ,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,aAAa;IACjB,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,aAAa;IACjB,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,aAAa;IACjB,EAAE,EAAE,eAAe;IACnB,EAAE,EAAE,cAAc;IAClB,EAAE,EAAE,kBAAkB;IACtB,EAAE,EAAE,eAAe;IACnB,EAAE,EAAE,iBAAiB;IACrB,EAAE,EAAE,cAAc;IAClB,EAAE,EAAE,cAAc;IAClB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,cAAc;IAClB,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,UAAU;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAA2B;IAC/C,CAAC,EAAE,qBAAqB;IACxB,CAAC,EAAE,oBAAoB;IACvB,CAAC,EAAE,mBAAmB;IACtB,CAAC,EAAE,oBAAoB;IACvB,CAAC,EAAE,sBAAsB;IACzB,CAAC,EAAE,sBAAsB;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAA2B;IAChD,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,KAAK;IACR,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,KAAK;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAA2B;IAC9C,CAAC,EAAE,eAAe;IAClB,CAAC,EAAE,gBAAgB;IACnB,CAAC,EAAE,kCAAkC;IACrC,CAAC,EAAE,gBAAgB;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAU,CAAC;AAoEjD,wEAAwE;AAExE,MAAM,OAAO,UAAU;IACb,KAAK,CAAS;IAEtB,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,oEAAoE;IAEpE;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CAAC,MAA2B;QAC7C,MAAM,KAAK,GAAa;YACtB,SAAS,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACzC,cAAc,MAAM,CAAC,UAAU,EAAE;YACjC,cAAc,MAAM,CAAC,UAAU,EAAE;YACjC,aAAa,MAAM,CAAC,SAAS,EAAE;YAC/B,kBAAkB,MAAM,CAAC,cAAc,EAAE;SAC1C,CAAC;QAEF,IAAI,MAAM,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC5F,IAAI,MAAM,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/F,IAAI,MAAM,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACtF,IAAI,MAAM,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/F,IAAI,MAAM,CAAC,cAAc;YAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACrG,IAAI,MAAM,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,YAAY,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnF,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACtF,IAAI,MAAM,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3E,IAAI,MAAM,CAAC,aAAa;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAEzD,yEAAyE;QACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY;YAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;YAC5B,IAAI,GAAG,CAAC,GAAG;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACxE,IAAI,GAAG,CAAC,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,QAAQ,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI;SACL,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,EAAW,EAAE,IAAa;QACzC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1D,IAAI,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7B,IAAI,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,UAAU,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAE9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,UAAU,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE;YAChE,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,MAAM,IAAI,GAAG,SAAS,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;QAEpF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,SAAS,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI;SACL,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IAC/C,CAAC;IAED,oEAAoE;IAEpE;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,MAAM,KAAK,GAAa;YACtB,SAAS,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACzC,cAAc,MAAM,CAAC,UAAU,EAAE;YACjC,aAAa,MAAM,CAAC,SAAS,EAAE;YAC/B,kBAAkB,MAAM,CAAC,cAAc,EAAE;SAC1C,CAAC;QAEF,IAAI,MAAM,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC5F,IAAI,MAAM,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/F,IAAI,MAAM,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACtF,IAAI,MAAM,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/F,IAAI,MAAM,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,YAAY,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnF,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACtF,IAAI,MAAM,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3E,IAAI,MAAM,CAAC,aAAa;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;YAC5B,IAAI,GAAG,CAAC,GAAG;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACxE,IAAI,GAAG,CAAC,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,SAAS,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI;SACL,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAW,EAAE,IAAa;QACvC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1D,IAAI,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7B,IAAI,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,WAAW,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAE9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,WAAW,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE;YACjE,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IAC/C,CAAC;IAED,oEAAoE;IAEpE;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bytecodehr/solocomhr-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for Solo.com.hr Croatian invoicing API - create, view, delete, storno invoices and offers",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"solo-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"prepublishOnly": "npm run build",
|
|
16
|
+
"start": "node dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"keywords": ["mcp", "solo", "invoice", "croatia", "racun", "ponuda", "fiscalization"],
|
|
19
|
+
"author": "",
|
|
20
|
+
"license": "ISC",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
23
|
+
"zod": "^4.3.6"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "^25.3.0",
|
|
27
|
+
"typescript": "^5.9.3"
|
|
28
|
+
}
|
|
29
|
+
}
|