@voyantjs/plugin-smartbill 0.26.6 → 0.26.8

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/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { SmartbillFetch, SmartbillInvoiceBody, SmartbillInvoiceResponse, SmartbillPdfResponse, SmartbillStatusResponse } from "./types.js";
1
+ import type { SmartbillEnvelope, SmartbillEstimateInvoicesResponse, SmartbillFetch, SmartbillInvoiceBody, SmartbillInvoiceResponse, SmartbillPdfResponse, SmartbillSeriesResponse, SmartbillStatusResponse, SmartbillTaxesResponse } from "./types.js";
2
2
  /**
3
3
  * Options for {@link createSmartbillClient}.
4
4
  */
@@ -15,24 +15,35 @@ export interface SmartbillClientOptions {
15
15
  fetch?: SmartbillFetch;
16
16
  }
17
17
  export interface SmartbillClientApi {
18
- /** Create an invoice. Returns the series + number + URL. */
18
+ /** Create an invoice. Returns the live envelope: series + number + URL + status/message. */
19
19
  createInvoice(body: SmartbillInvoiceBody): Promise<SmartbillInvoiceResponse>;
20
20
  /** Create a proforma invoice. */
21
21
  createProforma(body: SmartbillInvoiceBody): Promise<SmartbillInvoiceResponse>;
22
- /** Cancel an invoice by series + number. */
23
- cancelInvoice(companyVatCode: string, seriesName: string, number: string): Promise<{
24
- errorText?: string;
25
- }>;
22
+ /** Cancel an invoice by series + number. Returns the live envelope. */
23
+ cancelInvoice(companyVatCode: string, seriesName: string, number: string): Promise<SmartbillEnvelope>;
24
+ /** Restore a previously cancelled invoice. */
25
+ restoreInvoice(companyVatCode: string, seriesName: string, number: string): Promise<SmartbillEnvelope>;
26
26
  /** Delete an invoice by series + number. */
27
- deleteInvoice(companyVatCode: string, seriesName: string, number: string): Promise<{
28
- errorText?: string;
29
- }>;
30
- /** Reverse an invoice by series + number. */
27
+ deleteInvoice(companyVatCode: string, seriesName: string, number: string): Promise<SmartbillEnvelope>;
28
+ /** Reverse an invoice — issues a credit-note style reversal invoice. */
31
29
  reverseInvoice(companyVatCode: string, seriesName: string, number: string): Promise<SmartbillInvoiceResponse>;
32
- /** Get PDF URL for an invoice. */
30
+ /** Download invoice PDF bytes. */
31
+ viewInvoicePdf(companyVatCode: string, seriesName: string, number: string): Promise<SmartbillPdfResponse>;
32
+ /**
33
+ * Alias for {@link viewInvoicePdf}. Kept for backward compatibility with
34
+ * earlier client versions that only exposed an invoice PDF method.
35
+ */
33
36
  viewPdf(companyVatCode: string, seriesName: string, number: string): Promise<SmartbillPdfResponse>;
37
+ /** Download proforma PDF bytes. */
38
+ viewEstimatePdf(companyVatCode: string, seriesName: string, number: string): Promise<SmartbillPdfResponse>;
34
39
  /** Get payment status for an invoice. */
35
40
  getPaymentStatus(companyVatCode: string, seriesName: string, number: string): Promise<SmartbillStatusResponse>;
41
+ /** List taxes configured on the SmartBill account. */
42
+ listTaxes(): Promise<SmartbillTaxesResponse>;
43
+ /** List document series configured on the SmartBill account. */
44
+ listSeries(): Promise<SmartbillSeriesResponse>;
45
+ /** List invoices created from a proforma (conversion lookup). */
46
+ listEstimateInvoices(companyVatCode: string, seriesName: string, number: string): Promise<SmartbillEstimateInvoicesResponse>;
36
47
  }
37
48
  export declare function createSmartbillClient(options: SmartbillClientOptions): SmartbillClientApi;
38
49
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACxB,MAAM,YAAY,CAAA;AAEnB;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oEAAoE;IACpE,KAAK,CAAC,EAAE,cAAc,CAAA;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;IAC5E,iCAAiC;IACjC,cAAc,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;IAC7E,4CAA4C;IAC5C,aAAa,CACX,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAClC,4CAA4C;IAC5C,aAAa,CACX,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAClC,6CAA6C;IAC7C,cAAc,CACZ,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,wBAAwB,CAAC,CAAA;IACpC,kCAAkC;IAClC,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAClG,yCAAyC;IACzC,gBAAgB,CACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,uBAAuB,CAAC,CAAA;CACpC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,kBAAkB,CAyIzF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iCAAiC,EACjC,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,YAAY,CAAA;AAEnB;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oEAAoE;IACpE,KAAK,CAAC,EAAE,cAAc,CAAA;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,4FAA4F;IAC5F,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;IAC5E,iCAAiC;IACjC,cAAc,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;IAC7E,uEAAuE;IACvE,aAAa,CACX,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC7B,8CAA8C;IAC9C,cAAc,CACZ,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC7B,4CAA4C;IAC5C,aAAa,CACX,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC7B,wEAAwE;IACxE,cAAc,CACZ,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,wBAAwB,CAAC,CAAA;IACpC,kCAAkC;IAClC,cAAc,CACZ,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAChC;;;OAGG;IACH,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAClG,mCAAmC;IACnC,eAAe,CACb,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAChC,yCAAyC;IACzC,gBAAgB,CACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,uBAAuB,CAAC,CAAA;IACnC,sDAAsD;IACtD,SAAS,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAA;IAC5C,gEAAgE;IAChE,UAAU,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAA;IAC9C,iEAAiE;IACjE,oBAAoB,CAClB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iCAAiC,CAAC,CAAA;CAC9C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,kBAAkB,CAqMzF"}
package/dist/client.js CHANGED
@@ -11,7 +11,7 @@ export function createSmartbillClient(options) {
11
11
  Accept: "application/json",
12
12
  };
13
13
  }
14
- async function request(method, path, body) {
14
+ async function request(operation, method, path, body) {
15
15
  if (!fetchImpl) {
16
16
  throw new Error("SmartBill client requires a fetch implementation");
17
17
  }
@@ -23,83 +23,103 @@ export function createSmartbillClient(options) {
23
23
  init.body = JSON.stringify(body);
24
24
  const response = await fetchImpl(`${apiUrl}${path}`, init);
25
25
  let text = "";
26
- let json = null;
26
+ let parsed = null;
27
27
  try {
28
28
  text = await response.text();
29
- json = text ? JSON.parse(text) : null;
29
+ parsed = text ? JSON.parse(text) : null;
30
30
  }
31
31
  catch {
32
- // leave json as null, surface text
32
+ // leave parsed as null, surface text
33
33
  }
34
- return { ok: response.ok, status: response.status, json, text };
34
+ if (!response.ok) {
35
+ throw new Error(`SmartBill ${operation} failed (${response.status}): ${text}`);
36
+ }
37
+ const envelope = (parsed ?? {});
38
+ if (envelope.status === "Error" || envelope.errorText) {
39
+ throw new Error(`SmartBill ${operation} failed: ${envelope.errorText ?? envelope.message ?? "Error"}`);
40
+ }
41
+ return envelope;
35
42
  }
36
- async function createInvoice(body) {
37
- const res = await request("POST", "/invoice", body);
38
- if (!res.ok) {
39
- throw new Error(`SmartBill createInvoice failed (${res.status}): ${res.text}`);
43
+ async function fetchPdf(operation, path) {
44
+ if (!fetchImpl) {
45
+ throw new Error("SmartBill client requires a fetch implementation");
46
+ }
47
+ const response = await fetchImpl(`${apiUrl}${path}`, {
48
+ method: "GET",
49
+ headers: { ...headers(), Accept: "application/pdf" },
50
+ });
51
+ if (!response.ok) {
52
+ const text = await response.text().catch(() => "");
53
+ throw new Error(`SmartBill ${operation} failed (${response.status}): ${text}`);
40
54
  }
41
- return (res.json ?? {});
55
+ const buffer = await response.arrayBuffer();
56
+ const contentType = response.headers?.get("content-type") ?? "application/pdf";
57
+ return { bytes: new Uint8Array(buffer), contentType };
58
+ }
59
+ function pdfQuery(companyVatCode, seriesName, number) {
60
+ return `cif=${encodeURIComponent(companyVatCode)}&seriesname=${encodeURIComponent(seriesName)}&number=${encodeURIComponent(number)}`;
61
+ }
62
+ async function createInvoice(body) {
63
+ return request("createInvoice", "POST", "/invoice", body);
42
64
  }
43
65
  async function createProforma(body) {
44
- const res = await request("POST", "/estimate", body);
45
- if (!res.ok) {
46
- throw new Error(`SmartBill createProforma failed (${res.status}): ${res.text}`);
47
- }
48
- return (res.json ?? {});
66
+ return request("createProforma", "POST", "/estimate", body);
49
67
  }
50
68
  async function cancelInvoice(companyVatCode, seriesName, number) {
51
- const res = await request("PUT", "/invoice/cancel", {
69
+ return request("cancelInvoice", "PUT", "/invoice/cancel", {
70
+ companyVatCode,
71
+ seriesName,
72
+ number,
73
+ });
74
+ }
75
+ async function restoreInvoice(companyVatCode, seriesName, number) {
76
+ return request("restoreInvoice", "PUT", "/invoice/restore", {
52
77
  companyVatCode,
53
78
  seriesName,
54
79
  number,
55
80
  });
56
- if (!res.ok) {
57
- throw new Error(`SmartBill cancelInvoice failed (${res.status}): ${res.text}`);
58
- }
59
- return (res.json ?? {});
60
81
  }
61
82
  async function deleteInvoice(companyVatCode, seriesName, number) {
62
- const query = `cif=${encodeURIComponent(companyVatCode)}&seriesname=${encodeURIComponent(seriesName)}&number=${encodeURIComponent(number)}`;
63
- const res = await request("DELETE", `/invoice?${query}`);
64
- if (!res.ok) {
65
- throw new Error(`SmartBill deleteInvoice failed (${res.status}): ${res.text}`);
66
- }
67
- return (res.json ?? {});
83
+ return request("deleteInvoice", "DELETE", `/invoice?${pdfQuery(companyVatCode, seriesName, number)}`);
68
84
  }
69
85
  async function reverseInvoice(companyVatCode, seriesName, number) {
70
- const res = await request("PUT", "/invoice/reverse", {
86
+ return request("reverseInvoice", "PUT", "/invoice/reverse", {
71
87
  companyVatCode,
72
88
  seriesName,
73
89
  number,
74
90
  });
75
- if (!res.ok) {
76
- throw new Error(`SmartBill reverseInvoice failed (${res.status}): ${res.text}`);
77
- }
78
- return (res.json ?? {});
79
91
  }
80
- async function viewPdf(companyVatCode, seriesName, number) {
81
- const query = `cif=${encodeURIComponent(companyVatCode)}&seriesname=${encodeURIComponent(seriesName)}&number=${encodeURIComponent(number)}`;
82
- const res = await request("GET", `/invoice/pdf?${query}`);
83
- if (!res.ok) {
84
- throw new Error(`SmartBill viewPdf failed (${res.status}): ${res.text}`);
85
- }
86
- return (res.json ?? {});
92
+ async function viewInvoicePdf(companyVatCode, seriesName, number) {
93
+ return fetchPdf("viewInvoicePdf", `/invoice/pdf?${pdfQuery(companyVatCode, seriesName, number)}`);
94
+ }
95
+ async function viewEstimatePdf(companyVatCode, seriesName, number) {
96
+ return fetchPdf("viewEstimatePdf", `/estimate/pdf?${pdfQuery(companyVatCode, seriesName, number)}`);
87
97
  }
88
98
  async function getPaymentStatus(companyVatCode, seriesName, number) {
89
- const query = `cif=${encodeURIComponent(companyVatCode)}&seriesname=${encodeURIComponent(seriesName)}&number=${encodeURIComponent(number)}`;
90
- const res = await request("GET", `/invoice/paymentstatus?${query}`);
91
- if (!res.ok) {
92
- throw new Error(`SmartBill getPaymentStatus failed (${res.status}): ${res.text}`);
93
- }
94
- return (res.json ?? {});
99
+ return request("getPaymentStatus", "GET", `/invoice/paymentstatus?${pdfQuery(companyVatCode, seriesName, number)}`);
100
+ }
101
+ async function listTaxes() {
102
+ return request("listTaxes", "GET", "/tax");
103
+ }
104
+ async function listSeries() {
105
+ return request("listSeries", "GET", "/series");
106
+ }
107
+ async function listEstimateInvoices(companyVatCode, seriesName, number) {
108
+ return request("listEstimateInvoices", "GET", `/estimate/invoices?${pdfQuery(companyVatCode, seriesName, number)}`);
95
109
  }
96
110
  return {
97
111
  createInvoice,
98
112
  createProforma,
99
113
  cancelInvoice,
114
+ restoreInvoice,
100
115
  deleteInvoice,
101
116
  reverseInvoice,
102
- viewPdf,
117
+ viewInvoicePdf,
118
+ viewPdf: viewInvoicePdf,
119
+ viewEstimatePdf,
103
120
  getPaymentStatus,
121
+ listTaxes,
122
+ listSeries,
123
+ listEstimateInvoices,
104
124
  };
105
125
  }
package/dist/index.d.ts CHANGED
@@ -10,5 +10,5 @@ export type { ResolvedSmartbillSyncEventNames, SmartbillSyncRuntime } from "./ru
10
10
  export { createSmartbillSyncRuntime } from "./runtime.js";
11
11
  export type { SmartbillInvoiceSettlementPoller, SmartbillInvoiceSettlementPollerOptions, SmartbillSettlementExternalRef, SmartbillSettlementInvoice, SmartbillSettlementPollerContext, SmartbillSettlementPollerResult, } from "./settlement.js";
12
12
  export { createSmartbillInvoiceSettlementPoller } from "./settlement.js";
13
- export type { SmartbillClient, SmartbillFetch, SmartbillInvoiceBody, SmartbillInvoiceResponse, SmartbillPdfResponse, SmartbillProduct, SmartbillStatusResponse, VoyantInvoiceEvent, } from "./types.js";
13
+ export type { SmartbillClient, SmartbillEnvelope, SmartbillEstimateInvoicesResponse, SmartbillFetch, SmartbillInvoiceBody, SmartbillInvoiceResponse, SmartbillPaymentEntry, SmartbillPdfResponse, SmartbillProduct, SmartbillSeriesResponse, SmartbillStatusResponse, SmartbillTaxesResponse, VoyantInvoiceEvent, } from "./types.js";
14
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,YAAY,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAA;AACnF,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;AACrD,YAAY,EACV,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,+BAA+B,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACzF,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AACzD,YAAY,EACV,gCAAgC,EAChC,uCAAuC,EACvC,8BAA8B,EAC9B,0BAA0B,EAC1B,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,sCAAsC,EAAE,MAAM,iBAAiB,CAAA;AACxE,YAAY,EACV,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,YAAY,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAA;AACnF,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;AACrD,YAAY,EACV,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,+BAA+B,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACzF,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AACzD,YAAY,EACV,gCAAgC,EAChC,uCAAuC,EACvC,8BAA8B,EAC9B,0BAA0B,EAC1B,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,sCAAsC,EAAE,MAAM,iBAAiB,CAAA;AACxE,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,iCAAiC,EACjC,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,YAAY,CAAA"}
package/dist/mock.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { SmartbillFetch, SmartbillInvoiceBody, SmartbillInvoiceResponse } from "./types.js";
1
+ import type { SmartbillFetch, SmartbillInvoiceBody, SmartbillInvoiceResponse, SmartbillPaymentEntry } from "./types.js";
2
2
  export type SmartbillMockDocumentKind = "invoice" | "estimate";
3
3
  export type SmartbillMockDocumentStatus = "issued" | "cancelled" | "deleted" | "reversed" | "restored";
4
4
  export interface SmartbillMockTax {
@@ -21,6 +21,7 @@ export interface SmartbillMockDocument {
21
21
  url: string;
22
22
  total: number;
23
23
  paidAmount: number;
24
+ payments: SmartbillPaymentEntry[];
24
25
  createdAt: string;
25
26
  convertedInvoices: SmartbillInvoiceResponse[];
26
27
  }
@@ -45,7 +46,12 @@ export interface SmartbillMockRequest {
45
46
  export interface SmartbillMockResponse {
46
47
  status: number;
47
48
  headers: Record<string, string>;
48
- body: string;
49
+ /**
50
+ * Serialised body. JSON endpoints emit a UTF-8 string; PDF endpoints
51
+ * emit raw bytes. The HTTP listener writes both as-is; the in-process
52
+ * `fetch` adapter exposes them through the matching Response method.
53
+ */
54
+ body: string | Uint8Array;
49
55
  }
50
56
  export interface SmartbillMockServer {
51
57
  fetch: SmartbillFetch;
@@ -1 +1 @@
1
- {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../src/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAEhG,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,UAAU,CAAA;AAE9D,MAAM,MAAM,2BAA2B,GACnC,QAAQ,GACR,WAAW,GACX,SAAS,GACT,UAAU,GACV,UAAU,CAAA;AAEd,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,yBAAyB,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,yBAAyB,CAAA;IAC/B,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,2BAA2B,CAAA;IACnC,IAAI,EAAE,oBAAoB,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,wBAAwB,EAAE,CAAA;CAC9C;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC1B,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAA;IAC9B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,CAAA;IACrB,aAAa,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAChF,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,0BAA0B,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAA;IACpF,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,aAAa,EAAE,MAAM,qBAAqB,EAAE,CAAA;IAC5C,WAAW,EAAE,CACX,IAAI,EAAE,yBAAyB,EAC/B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,KACX,qBAAqB,GAAG,IAAI,CAAA;IACjC,wBAAwB,EAAE,CAAC,IAAI,EAAE;QAC/B,cAAc,EAAE,MAAM,CAAA;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAC3B,KAAK,wBAAwB,CAAA;CAC/B;AA0CD,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CAwSrB"}
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../src/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EAItB,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,UAAU,CAAA;AAE9D,MAAM,MAAM,2BAA2B,GACnC,QAAQ,GACR,WAAW,GACX,SAAS,GACT,UAAU,GACV,UAAU,CAAA;AAEd,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,yBAAyB,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,yBAAyB,CAAA;IAC/B,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,2BAA2B,CAAA;IACnC,IAAI,EAAE,oBAAoB,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,qBAAqB,EAAE,CAAA;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,wBAAwB,EAAE,CAAA;CAC9C;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC1B,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAA;IAC9B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B;;;;OAIG;IACH,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,CAAA;IACrB,aAAa,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAChF,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,0BAA0B,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAA;IACpF,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,aAAa,EAAE,MAAM,qBAAqB,EAAE,CAAA;IAC5C,WAAW,EAAE,CACX,IAAI,EAAE,yBAAyB,EAC/B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,KACX,qBAAqB,GAAG,IAAI,CAAA;IACjC,wBAAwB,EAAE,CAAC,IAAI,EAAE;QAC/B,cAAc,EAAE,MAAM,CAAA;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAC3B,KAAK,wBAAwB,CAAA;CAC/B;AA0CD,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CA8UrB"}
package/dist/mock.js CHANGED
@@ -35,7 +35,7 @@ export function createSmartbillMockServer(options = {}) {
35
35
  seriesName: args.invoiceSeriesName ?? estimate.body.seriesName,
36
36
  mentions: appendTestMention(estimate.body.mentions, `Converted from proforma ${args.seriesName}-${args.number}`),
37
37
  });
38
- const response = toDocumentResponse(invoice);
38
+ const response = toCreateResponse(invoice);
39
39
  estimate.convertedInvoices.push(response);
40
40
  documents.set(documentKey(estimate.kind, estimate.companyVatCode, estimate.seriesName, estimate.number), estimate);
41
41
  return response;
@@ -46,37 +46,30 @@ export function createSmartbillMockServer(options = {}) {
46
46
  const path = normalizeSmartbillPath(url.pathname);
47
47
  try {
48
48
  if (method === "GET" && path === "/tax")
49
- return json(200, taxes);
49
+ return json(200, taxesEnvelope(taxes));
50
50
  if (method === "GET" && path === "/series")
51
- return json(200, listSeries());
51
+ return json(200, seriesEnvelope(listSeries()));
52
52
  if (method === "POST" && path === "/invoice") {
53
- return json(200, toDocumentResponse(createDocument("invoice", parseBody(request.body))));
53
+ return json(200, toCreateResponse(createDocument("invoice", parseBody(request.body))));
54
54
  }
55
55
  if (method === "POST" && path === "/estimate") {
56
- return json(200, toDocumentResponse(createDocument("estimate", parseBody(request.body))));
56
+ return json(200, toCreateResponse(createDocument("estimate", parseBody(request.body))));
57
57
  }
58
58
  if (method === "GET" && path === "/invoice/pdf") {
59
- return json(200, { url: findByQuery("invoice", url).url });
59
+ return pdf(findByQuery("invoice", url));
60
60
  }
61
61
  if (method === "GET" && path === "/estimate/pdf") {
62
- return json(200, { url: findByQuery("estimate", url).url });
62
+ return pdf(findByQuery("estimate", url));
63
63
  }
64
64
  if (method === "GET" && path === "/estimate/invoices") {
65
- return json(200, { invoices: findByQuery("estimate", url).convertedInvoices });
65
+ return json(200, estimateInvoicesEnvelope(findByQuery("estimate", url)));
66
66
  }
67
67
  if (method === "GET" && path === "/invoice/paymentstatus") {
68
- const invoice = findByQuery("invoice", url);
69
- return json(200, {
70
- status: invoice.status === "cancelled" || invoice.status === "deleted"
71
- ? invoice.status
72
- : paymentStatus(invoice),
73
- paidAmount: invoice.paidAmount,
74
- unpaidAmount: Math.max(0, invoice.total - invoice.paidAmount),
75
- });
68
+ return json(200, paymentStatusEnvelope(findByQuery("invoice", url)));
76
69
  }
77
70
  if (method === "PUT" && path === "/invoice/cancel") {
78
- updateInvoiceStatus(parseBody(request.body), "cancelled");
79
- return json(200, {});
71
+ const invoice = updateInvoiceStatus(parseBody(request.body), "cancelled");
72
+ return json(200, ackEnvelope(`Invoice ${invoice.seriesName}-${invoice.number} cancelled`));
80
73
  }
81
74
  if (method === "PUT" && path === "/invoice/reverse") {
82
75
  const invoice = updateInvoiceStatus(parseBody(request.body), "reversed");
@@ -88,22 +81,20 @@ export function createSmartbillMockServer(options = {}) {
88
81
  })),
89
82
  mentions: appendTestMention(invoice.body.mentions, `Reversal for ${invoice.seriesName}-${invoice.number}`),
90
83
  });
91
- return json(200, toDocumentResponse(reversal));
84
+ return json(200, toCreateResponse(reversal));
92
85
  }
93
86
  if (method === "PUT" && path === "/invoice/restore") {
94
- updateInvoiceStatus(parseBody(request.body), "restored");
95
- return json(200, {});
87
+ const invoice = updateInvoiceStatus(parseBody(request.body), "restored");
88
+ return json(200, ackEnvelope(`Invoice ${invoice.seriesName}-${invoice.number} restored`));
96
89
  }
97
90
  if (method === "DELETE" && path === "/invoice") {
98
- updateByQuery(url, "deleted");
99
- return json(200, {});
91
+ const invoice = updateByQuery(url, "deleted");
92
+ return json(200, ackEnvelope(`Invoice ${invoice.seriesName}-${invoice.number} deleted`));
100
93
  }
101
- return json(404, { errorText: `SmartBill mock endpoint not found: ${method} ${path}` });
94
+ return json(404, errorEnvelope(`SmartBill mock endpoint not found: ${method} ${path}`));
102
95
  }
103
96
  catch (error) {
104
- return json(error instanceof SmartbillMockError ? error.status : 500, {
105
- errorText: error instanceof Error ? error.message : "SmartBill mock failed",
106
- });
97
+ return json(error instanceof SmartbillMockError ? error.status : 500, errorEnvelope(error instanceof Error ? error.message : "SmartBill mock failed"));
107
98
  }
108
99
  }
109
100
  const fetch = async (input, init) => {
@@ -112,11 +103,30 @@ export function createSmartbillMockServer(options = {}) {
112
103
  url: input,
113
104
  body: init.body,
114
105
  });
106
+ const isBinary = response.body instanceof Uint8Array;
107
+ const bytes = isBinary
108
+ ? response.body
109
+ : new TextEncoder().encode(response.body);
110
+ const text = isBinary
111
+ ? new TextDecoder().decode(response.body)
112
+ : response.body;
115
113
  return {
116
114
  ok: response.status >= 200 && response.status < 300,
117
115
  status: response.status,
118
- json: async () => JSON.parse(response.body),
119
- text: async () => response.body,
116
+ json: async () => {
117
+ if (isBinary)
118
+ throw new Error("SmartBill mock response is not JSON");
119
+ return JSON.parse(text);
120
+ },
121
+ text: async () => text,
122
+ arrayBuffer: async () => {
123
+ const copy = new ArrayBuffer(bytes.byteLength);
124
+ new Uint8Array(copy).set(bytes);
125
+ return copy;
126
+ },
127
+ headers: {
128
+ get: (name) => response.headers[name.toLowerCase()] ?? null,
129
+ },
120
130
  };
121
131
  };
122
132
  async function listen(listenOptions = {}) {
@@ -164,6 +174,17 @@ export function createSmartbillMockServer(options = {}) {
164
174
  const number = nextNumber(kind, seriesName);
165
175
  const companyVatCode = body.companyVatCode;
166
176
  const total = totalAmount(body, taxes);
177
+ const paid = paidAmount(body, total);
178
+ const payments = body.payment
179
+ ? [
180
+ {
181
+ type: body.payment.type,
182
+ value: paid,
183
+ paidDate: now().toISOString().slice(0, 10),
184
+ isCash: body.payment.isCash,
185
+ },
186
+ ]
187
+ : [];
167
188
  const document = {
168
189
  kind,
169
190
  companyVatCode,
@@ -176,7 +197,8 @@ export function createSmartbillMockServer(options = {}) {
176
197
  },
177
198
  url: `smartbill-mock://test-document/${kind}/${encodeURIComponent(companyVatCode)}/${encodeURIComponent(seriesName)}/${number}.pdf`,
178
199
  total,
179
- paidAmount: paidAmount(body, total),
200
+ paidAmount: paid,
201
+ payments,
180
202
  createdAt: now().toISOString(),
181
203
  convertedInvoices: [],
182
204
  };
@@ -220,6 +242,20 @@ export function createSmartbillMockServer(options = {}) {
220
242
  const invoice = findByQuery("invoice", url);
221
243
  invoice.status = status;
222
244
  documents.set(documentKey("invoice", invoice.companyVatCode, invoice.seriesName, invoice.number), invoice);
245
+ return invoice;
246
+ }
247
+ function pdf(document) {
248
+ const label = `${document.kind === "estimate" ? "Proforma" : "Invoice"} ${document.seriesName}-${document.number} (TEST)`;
249
+ return {
250
+ status: 200,
251
+ headers: {
252
+ "access-control-allow-origin": "*",
253
+ "content-type": "application/pdf",
254
+ "content-disposition": `inline; filename="${document.seriesName}-${document.number}.pdf"`,
255
+ "x-mock-pdf-url": document.url,
256
+ },
257
+ body: createPlaceholderPdf(label),
258
+ };
223
259
  }
224
260
  reset();
225
261
  return {
@@ -292,20 +328,76 @@ function taxPercentage(lineTaxPercentage, taxes) {
292
328
  function paidAmount(body, total) {
293
329
  return roundMoney(Math.min(total, body.payment?.value ?? 0));
294
330
  }
295
- function paymentStatus(document) {
296
- if (document.paidAmount >= document.total && document.total > 0)
297
- return "paid";
298
- if (document.paidAmount > 0)
299
- return "partially_paid";
300
- return "unpaid";
301
- }
302
- function toDocumentResponse(document) {
331
+ function toCreateResponse(document) {
303
332
  return {
333
+ status: "Ok",
334
+ message: "",
335
+ errorText: "",
304
336
  series: document.seriesName,
305
337
  number: document.number,
306
338
  url: document.url,
307
339
  };
308
340
  }
341
+ function ackEnvelope(message) {
342
+ return { status: "Ok", message, errorText: "" };
343
+ }
344
+ function errorEnvelope(message) {
345
+ return { status: "Error", message: "", errorText: message };
346
+ }
347
+ function taxesEnvelope(taxes) {
348
+ return {
349
+ status: "Ok",
350
+ message: "",
351
+ errorText: "",
352
+ taxes: taxes.map(({ name, percentage }) => ({ name, percentage })),
353
+ };
354
+ }
355
+ function seriesEnvelope(series) {
356
+ return {
357
+ status: "Ok",
358
+ message: "",
359
+ errorText: "",
360
+ list: series.map((item) => ({
361
+ name: item.name,
362
+ nextNumber: item.nextNumber,
363
+ type: item.type === "invoice" ? "f" : "p",
364
+ })),
365
+ };
366
+ }
367
+ function paymentStatusEnvelope(document) {
368
+ const unpaid = Math.max(0, roundMoney(document.total - document.paidAmount));
369
+ return {
370
+ status: "Ok",
371
+ message: paymentStatusMessage(document),
372
+ errorText: "",
373
+ paid: document.total > 0 && document.paidAmount >= document.total,
374
+ invoiceTotalAmount: document.total,
375
+ paidAmount: document.paidAmount,
376
+ unpaidAmount: unpaid,
377
+ payments: document.payments.map((entry) => ({ ...entry })),
378
+ };
379
+ }
380
+ function paymentStatusMessage(document) {
381
+ if (document.status === "cancelled")
382
+ return "Invoice cancelled";
383
+ if (document.status === "deleted")
384
+ return "Invoice deleted";
385
+ if (document.status === "reversed")
386
+ return "Invoice reversed";
387
+ return "";
388
+ }
389
+ function estimateInvoicesEnvelope(estimate) {
390
+ const last = estimate.convertedInvoices[estimate.convertedInvoices.length - 1];
391
+ return {
392
+ status: "Ok",
393
+ message: "",
394
+ errorText: "",
395
+ series: last?.series ?? "",
396
+ number: last?.number ?? "",
397
+ areInvoicesCreated: estimate.convertedInvoices.length > 0,
398
+ invoices: estimate.convertedInvoices.map((invoice) => ({ ...invoice })),
399
+ };
400
+ }
309
401
  function appendTestMention(existing, mention) {
310
402
  return existing ? `${existing}\n${mention}` : mention;
311
403
  }
@@ -319,6 +411,7 @@ function cloneDocument(document) {
319
411
  return {
320
412
  ...document,
321
413
  body: structuredClone(document.body),
414
+ payments: document.payments.map((entry) => ({ ...entry })),
322
415
  convertedInvoices: document.convertedInvoices.map((invoice) => ({ ...invoice })),
323
416
  };
324
417
  }
@@ -339,3 +432,47 @@ async function importNodeHttp() {
339
432
  const specifier = "node:http";
340
433
  return import(specifier);
341
434
  }
435
+ /**
436
+ * Builds a small but well-formed single-page PDF that satisfies SDKs
437
+ * expecting `application/pdf` bytes. The label is rendered on the page
438
+ * so the file is recognisable when opened by hand.
439
+ */
440
+ function createPlaceholderPdf(label) {
441
+ const escapedLabel = label.replace(/[()\\]/g, (m) => `\\${m}`);
442
+ const stream = `BT /F1 18 Tf 72 720 Td (${escapedLabel}) Tj ET`;
443
+ const objects = [
444
+ "<< /Type /Catalog /Pages 2 0 R >>",
445
+ "<< /Type /Pages /Kids [3 0 R] /Count 1 >>",
446
+ "<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>",
447
+ `<< /Length ${stream.length} >>\nstream\n${stream}\nendstream`,
448
+ "<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>",
449
+ ];
450
+ const encoder = new TextEncoder();
451
+ const parts = [];
452
+ parts.push(encoder.encode("%PDF-1.4\n%"));
453
+ // Binary marker: any four bytes >=128 satisfy PDF readers' "this file is binary" probe.
454
+ parts.push(new Uint8Array([0xe2, 0xe3, 0xcf, 0xd3, 0x0a]));
455
+ let length = parts.reduce((sum, p) => sum + p.byteLength, 0);
456
+ const offsets = [];
457
+ for (let i = 0; i < objects.length; i++) {
458
+ offsets.push(length);
459
+ const chunk = encoder.encode(`${i + 1} 0 obj\n${objects[i]}\nendobj\n`);
460
+ parts.push(chunk);
461
+ length += chunk.byteLength;
462
+ }
463
+ const xrefStart = length;
464
+ let xref = `xref\n0 ${objects.length + 1}\n0000000000 65535 f \n`;
465
+ for (const off of offsets) {
466
+ xref += `${String(off).padStart(10, "0")} 00000 n \n`;
467
+ }
468
+ xref += `trailer\n<< /Size ${objects.length + 1} /Root 1 0 R >>\nstartxref\n${xrefStart}\n%%EOF\n`;
469
+ parts.push(encoder.encode(xref));
470
+ const total = parts.reduce((sum, p) => sum + p.byteLength, 0);
471
+ const out = new Uint8Array(total);
472
+ let offset = 0;
473
+ for (const part of parts) {
474
+ out.set(part, offset);
475
+ offset += part.byteLength;
476
+ }
477
+ return out;
478
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,gBAAgB,CAAA;AAGxD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAExF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAGpD,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAChD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CACjD;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,KAAK,EAAE,kBAAkB,KACtB,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAEnD,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB,EAAE,uBAAuB;IAC7F,MAAM,CAAC,EAAE,uBAAuB,CAAA;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,MAAM,CAAC,EAAE,eAAe,CAAA;CACzB;AASD,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAyHvE"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,gBAAgB,CAAA;AAGxD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAExF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAGpD,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAChD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CACjD;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,KAAK,EAAE,kBAAkB,KACtB,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAEnD,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB,EAAE,uBAAuB;IAC7F,MAAM,CAAC,EAAE,uBAAuB,CAAA;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,MAAM,CAAC,EAAE,eAAe,CAAA;CACzB;AASD,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CA8HvE"}
package/dist/plugin.js CHANGED
@@ -94,7 +94,12 @@ export function smartbillPlugin(options) {
94
94
  return;
95
95
  }
96
96
  const status = await client.getPaymentStatus(validatedOptions.companyVatCode, seriesName, number);
97
- logger.info?.(`[smartbill] payment status for ${seriesName}-${number}: ${status.status}`, status);
97
+ const paymentLabel = status.paid
98
+ ? "paid"
99
+ : (status.paidAmount ?? 0) > 0
100
+ ? "partially_paid"
101
+ : "unpaid";
102
+ logger.info?.(`[smartbill] payment status for ${seriesName}-${number}: ${paymentLabel}`, status);
98
103
  }
99
104
  catch (err) {
100
105
  logger.error(`[smartbill] getPaymentStatus on "${eventNames.syncRequested}" failed for ${event.id}`, err);
@@ -1 +1 @@
1
- {"version":3,"file":"settlement.d.ts","sourceRoot":"","sources":["../src/settlement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAGzD,MAAM,WAAW,uCAAwC,SAAQ,sBAAsB;IACrF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,8BAA8B;IAC7C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,0BAA0B,CAAA;IACnC,WAAW,EAAE,8BAA8B,CAAA;CAC5C;AAED,MAAM,WAAW,+BAA+B;IAC9C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAC1C;AAED,MAAM,MAAM,gCAAgC,GAAG,CAC7C,OAAO,EAAE,gCAAgC,KACtC,OAAO,CAAC,+BAA+B,CAAC,CAAA;AAuD7C,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,uCAAuC,GAC/C,gCAAgC,CA0ClC"}
1
+ {"version":3,"file":"settlement.d.ts","sourceRoot":"","sources":["../src/settlement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAGzD,MAAM,WAAW,uCAAwC,SAAQ,sBAAsB;IACrF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,8BAA8B;IAC7C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,0BAA0B,CAAA;IACnC,WAAW,EAAE,8BAA8B,CAAA;CAC5C;AAED,MAAM,WAAW,+BAA+B;IAC9C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAC1C;AAED,MAAM,MAAM,gCAAgC,GAAG,CAC7C,OAAO,EAAE,gCAAgC,KACtC,OAAO,CAAC,+BAA+B,CAAC,CAAA;AAuD7C,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,uCAAuC,GAC/C,gCAAgC,CA2ClC"}
@@ -43,16 +43,17 @@ export function createSmartbillInvoiceSettlementPoller(options) {
43
43
  return { syncError: "SmartBill settlement polling requires seriesName" };
44
44
  }
45
45
  const status = await client.getPaymentStatus(companyVatCode, seriesName, number);
46
+ const paid = status.paid === true;
46
47
  return {
47
48
  externalId: externalRef.externalId ?? null,
48
49
  externalNumber: number,
49
- status: status.status ?? null,
50
+ status: paid ? "paid" : "unpaid",
50
51
  paidAmountCents: toCents(status.paidAmount),
51
52
  unpaidAmountCents: toCents(status.unpaidAmount),
52
- settledAt: status.status === "paid" && typeof status.paidAmount === "number" && status.paidAmount > 0
53
+ settledAt: paid && typeof status.paidAmount === "number" && status.paidAmount > 0
53
54
  ? new Date().toISOString()
54
55
  : null,
55
- syncError: status.errorText ?? null,
56
+ syncError: status.errorText ? status.errorText : null,
56
57
  metadata: {
57
58
  ...(metadata ?? {}),
58
59
  companyVatCode,
package/dist/types.d.ts CHANGED
@@ -68,34 +68,91 @@ export interface SmartbillInvoiceBody {
68
68
  };
69
69
  }
70
70
  /**
71
- * SmartBill API response for invoice creation.
71
+ * Live-API response envelope shared by most SmartBill endpoints.
72
+ *
73
+ * The live API returns `status: "Ok"` on success and `status: "Error"` (or
74
+ * an HTTP non-2xx) on failure. `errorText` carries the machine-readable
75
+ * cause; `message` is a human-readable note.
72
76
  */
73
- export interface SmartbillInvoiceResponse {
77
+ export interface SmartbillEnvelope {
78
+ /** "Ok" on success, "Error" on failure. */
79
+ status?: string;
80
+ message?: string;
81
+ errorText?: string;
82
+ }
83
+ /**
84
+ * SmartBill API response for invoice / estimate creation.
85
+ */
86
+ export interface SmartbillInvoiceResponse extends SmartbillEnvelope {
74
87
  number?: string;
75
88
  series?: string;
76
89
  url?: string;
77
- errorText?: string;
78
90
  }
79
91
  /**
80
- * SmartBill API response for PDF download.
92
+ * SmartBill API response for the PDF endpoints. Live SmartBill responds
93
+ * with raw PDF bytes and `Content-Type: application/pdf`.
81
94
  */
82
95
  export interface SmartbillPdfResponse {
83
- url?: string;
84
- errorText?: string;
96
+ /** Raw PDF bytes returned by SmartBill. */
97
+ bytes: Uint8Array;
98
+ /** Content-Type header from the response. */
99
+ contentType: string;
85
100
  }
86
101
  /**
87
- * SmartBill API response for invoice status.
102
+ * SmartBill API response for `GET /invoice/paymentstatus`.
103
+ *
104
+ * Live shape: the envelope's `status` is `"Ok"` / `"Error"`, while payment
105
+ * state is carried by `paid: boolean` plus the amount fields. `payments`
106
+ * is the per-receipt list. The mock and the live API both populate these.
88
107
  */
89
- export interface SmartbillStatusResponse {
90
- status?: string;
108
+ export interface SmartbillStatusResponse extends SmartbillEnvelope {
109
+ /** True when the invoice has been fully paid. */
110
+ paid?: boolean;
111
+ invoiceTotalAmount?: number;
91
112
  paidAmount?: number;
92
113
  unpaidAmount?: number;
93
- errorText?: string;
114
+ payments?: SmartbillPaymentEntry[];
115
+ }
116
+ export interface SmartbillPaymentEntry {
117
+ type?: string;
118
+ value?: number;
119
+ paidDate?: string;
120
+ [key: string]: unknown;
94
121
  }
95
122
  /**
96
- * Minimal `fetch` shape the SmartBill client depends on. Works with the global
97
- * `fetch` in Node 18+ / Cloudflare Workers / browsers, and is trivially
98
- * stubbable in tests.
123
+ * Response shape for `GET /tax`.
124
+ */
125
+ export interface SmartbillTaxesResponse extends SmartbillEnvelope {
126
+ taxes?: Array<{
127
+ name: string;
128
+ percentage: number;
129
+ }>;
130
+ }
131
+ /**
132
+ * Response shape for `GET /series`. `type` is `"f"` (factură / invoice) or
133
+ * `"p"` (proformă).
134
+ */
135
+ export interface SmartbillSeriesResponse extends SmartbillEnvelope {
136
+ list?: Array<{
137
+ name: string;
138
+ nextNumber: number;
139
+ type: "f" | "p";
140
+ }>;
141
+ }
142
+ /**
143
+ * Response shape for `GET /estimate/invoices` (proforma → invoice
144
+ * conversion lookup).
145
+ */
146
+ export interface SmartbillEstimateInvoicesResponse extends SmartbillEnvelope {
147
+ series?: string;
148
+ number?: string;
149
+ areInvoicesCreated?: boolean;
150
+ invoices?: SmartbillInvoiceResponse[];
151
+ }
152
+ /**
153
+ * Minimal `fetch` shape the SmartBill client depends on. Mirrors the
154
+ * subset of the global `fetch` Response that the client uses, so the
155
+ * global `fetch` and the mock server both fit.
99
156
  */
100
157
  export type SmartbillFetch = (input: string, init: {
101
158
  method: string;
@@ -106,5 +163,9 @@ export type SmartbillFetch = (input: string, init: {
106
163
  status: number;
107
164
  json: () => Promise<unknown>;
108
165
  text: () => Promise<string>;
166
+ arrayBuffer: () => Promise<ArrayBuffer>;
167
+ headers?: {
168
+ get(name: string): string | null;
169
+ };
109
170
  }>;
110
171
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/plugin-smartbill",
3
- "version": "0.26.6",
3
+ "version": "0.26.8",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "zod": "^4.3.6",
40
- "@voyantjs/core": "0.26.6"
40
+ "@voyantjs/core": "0.26.8"
41
41
  },
42
42
  "devDependencies": {
43
43
  "typescript": "^6.0.2",