@fast-white-cat/integration-ksef-direct 0.1.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.
Files changed (140) hide show
  1. package/README.md +36 -0
  2. package/dist/index.js +2 -0
  3. package/dist/index.js.map +7 -0
  4. package/dist/modules/integration_ksef_direct/acl.js +13 -0
  5. package/dist/modules/integration_ksef_direct/acl.js.map +7 -0
  6. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/documents/[id].js +92 -0
  7. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/documents/[id].js.map +7 -0
  8. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/documents.js +105 -0
  9. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/documents.js.map +7 -0
  10. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/health.js +158 -0
  11. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/health.js.map +7 -0
  12. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/received-documents/[id].js +86 -0
  13. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/received-documents/[id].js.map +7 -0
  14. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/received-documents.js +112 -0
  15. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/received-documents.js.map +7 -0
  16. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/seller-info.js +54 -0
  17. package/dist/modules/integration_ksef_direct/api/get/integration-ksef-direct/seller-info.js.map +7 -0
  18. package/dist/modules/integration_ksef_direct/api/post/integration-ksef-direct/documents/[id]/send.js +64 -0
  19. package/dist/modules/integration_ksef_direct/api/post/integration-ksef-direct/documents/[id]/send.js.map +7 -0
  20. package/dist/modules/integration_ksef_direct/api/post/integration-ksef-direct/documents.js +104 -0
  21. package/dist/modules/integration_ksef_direct/api/post/integration-ksef-direct/documents.js.map +7 -0
  22. package/dist/modules/integration_ksef_direct/api/post/integration-ksef-direct/invoice-numbers.js +41 -0
  23. package/dist/modules/integration_ksef_direct/api/post/integration-ksef-direct/invoice-numbers.js.map +7 -0
  24. package/dist/modules/integration_ksef_direct/api/post/integration-ksef-direct/received-documents/fetch.js +172 -0
  25. package/dist/modules/integration_ksef_direct/api/post/integration-ksef-direct/received-documents/fetch.js.map +7 -0
  26. package/dist/modules/integration_ksef_direct/api/post/integration-ksef-direct/received-documents/sync.js +80 -0
  27. package/dist/modules/integration_ksef_direct/api/post/integration-ksef-direct/received-documents/sync.js.map +7 -0
  28. package/dist/modules/integration_ksef_direct/backend/integration-ksef-direct/documents/new/page.js +441 -0
  29. package/dist/modules/integration_ksef_direct/backend/integration-ksef-direct/documents/new/page.js.map +7 -0
  30. package/dist/modules/integration_ksef_direct/backend/integration-ksef-direct/documents/new/page.meta.js +8 -0
  31. package/dist/modules/integration_ksef_direct/backend/integration-ksef-direct/documents/new/page.meta.js.map +7 -0
  32. package/dist/modules/integration_ksef_direct/backend/integration-ksef-direct/documents/page.js +193 -0
  33. package/dist/modules/integration_ksef_direct/backend/integration-ksef-direct/documents/page.js.map +7 -0
  34. package/dist/modules/integration_ksef_direct/backend/integration-ksef-direct/received-documents/page.js +314 -0
  35. package/dist/modules/integration_ksef_direct/backend/integration-ksef-direct/received-documents/page.js.map +7 -0
  36. package/dist/modules/integration_ksef_direct/backend/page.js +154 -0
  37. package/dist/modules/integration_ksef_direct/backend/page.js.map +7 -0
  38. package/dist/modules/integration_ksef_direct/commands/create-ksef-direct-document.js +80 -0
  39. package/dist/modules/integration_ksef_direct/commands/create-ksef-direct-document.js.map +7 -0
  40. package/dist/modules/integration_ksef_direct/commands/enqueue-ksef-direct-document.js +43 -0
  41. package/dist/modules/integration_ksef_direct/commands/enqueue-ksef-direct-document.js.map +7 -0
  42. package/dist/modules/integration_ksef_direct/data/entities.js +224 -0
  43. package/dist/modules/integration_ksef_direct/data/entities.js.map +7 -0
  44. package/dist/modules/integration_ksef_direct/data/validators.js +103 -0
  45. package/dist/modules/integration_ksef_direct/data/validators.js.map +7 -0
  46. package/dist/modules/integration_ksef_direct/di.js +11 -0
  47. package/dist/modules/integration_ksef_direct/di.js.map +7 -0
  48. package/dist/modules/integration_ksef_direct/events.js +21 -0
  49. package/dist/modules/integration_ksef_direct/events.js.map +7 -0
  50. package/dist/modules/integration_ksef_direct/index.js +10 -0
  51. package/dist/modules/integration_ksef_direct/index.js.map +7 -0
  52. package/dist/modules/integration_ksef_direct/integration.js +56 -0
  53. package/dist/modules/integration_ksef_direct/integration.js.map +7 -0
  54. package/dist/modules/integration_ksef_direct/lib/health.js +32 -0
  55. package/dist/modules/integration_ksef_direct/lib/health.js.map +7 -0
  56. package/dist/modules/integration_ksef_direct/lib/invoiceNumberFormat.js +23 -0
  57. package/dist/modules/integration_ksef_direct/lib/invoiceNumberFormat.js.map +7 -0
  58. package/dist/modules/integration_ksef_direct/lib/ksefClient.js +523 -0
  59. package/dist/modules/integration_ksef_direct/lib/ksefClient.js.map +7 -0
  60. package/dist/modules/integration_ksef_direct/lib/ksefCrypto.js +103 -0
  61. package/dist/modules/integration_ksef_direct/lib/ksefCrypto.js.map +7 -0
  62. package/dist/modules/integration_ksef_direct/lib/ksefFa2Xml.js +123 -0
  63. package/dist/modules/integration_ksef_direct/lib/ksefFa2Xml.js.map +7 -0
  64. package/dist/modules/integration_ksef_direct/lib/ksefXmlParser.js +76 -0
  65. package/dist/modules/integration_ksef_direct/lib/ksefXmlParser.js.map +7 -0
  66. package/dist/modules/integration_ksef_direct/migrations/Migration20260519210000_integration_ksef_direct.js +15 -0
  67. package/dist/modules/integration_ksef_direct/migrations/Migration20260519210000_integration_ksef_direct.js.map +7 -0
  68. package/dist/modules/integration_ksef_direct/migrations/Migration20260520120000_ksef_direct_documents.js +17 -0
  69. package/dist/modules/integration_ksef_direct/migrations/Migration20260520120000_ksef_direct_documents.js.map +7 -0
  70. package/dist/modules/integration_ksef_direct/migrations/Migration20260520220000_ksef_direct_send_queue.js +15 -0
  71. package/dist/modules/integration_ksef_direct/migrations/Migration20260520220000_ksef_direct_send_queue.js.map +7 -0
  72. package/dist/modules/integration_ksef_direct/migrations/Migration20260520230000_ksef_direct_seller_per_document.js +17 -0
  73. package/dist/modules/integration_ksef_direct/migrations/Migration20260520230000_ksef_direct_seller_per_document.js.map +7 -0
  74. package/dist/modules/integration_ksef_direct/migrations/Migration20260521120000_ksef_direct_received_documents.js +16 -0
  75. package/dist/modules/integration_ksef_direct/migrations/Migration20260521120000_ksef_direct_received_documents.js.map +7 -0
  76. package/dist/modules/integration_ksef_direct/migrations/Migration20260521130000_ksef_received_download_urls.js +15 -0
  77. package/dist/modules/integration_ksef_direct/migrations/Migration20260521130000_ksef_received_download_urls.js.map +7 -0
  78. package/dist/modules/integration_ksef_direct/setup.js +11 -0
  79. package/dist/modules/integration_ksef_direct/setup.js.map +7 -0
  80. package/dist/modules/integration_ksef_direct/subscribers/auto-enqueue-ksef-document.js +19 -0
  81. package/dist/modules/integration_ksef_direct/subscribers/auto-enqueue-ksef-document.js.map +7 -0
  82. package/dist/modules/integration_ksef_direct/workers/check-ksef-document-status.js +103 -0
  83. package/dist/modules/integration_ksef_direct/workers/check-ksef-document-status.js.map +7 -0
  84. package/dist/modules/integration_ksef_direct/workers/send-ksef-document.js +104 -0
  85. package/dist/modules/integration_ksef_direct/workers/send-ksef-document.js.map +7 -0
  86. package/dist/modules/integration_ksef_direct/workers/sync-received-documents.js +137 -0
  87. package/dist/modules/integration_ksef_direct/workers/sync-received-documents.js.map +7 -0
  88. package/dist/types/declarations.d.js +1 -0
  89. package/dist/types/declarations.d.js.map +7 -0
  90. package/package.json +98 -0
  91. package/src/index.ts +1 -0
  92. package/src/modules/integration_ksef_direct/__tests__/invoiceNumberFormat.test.ts +42 -0
  93. package/src/modules/integration_ksef_direct/__tests__/ksefFa2Xml.test.ts +407 -0
  94. package/src/modules/integration_ksef_direct/__tests__/ksefXmlParser.test.ts +230 -0
  95. package/src/modules/integration_ksef_direct/acl.ts +9 -0
  96. package/src/modules/integration_ksef_direct/api/get/integration-ksef-direct/documents/[id].ts +94 -0
  97. package/src/modules/integration_ksef_direct/api/get/integration-ksef-direct/documents.ts +111 -0
  98. package/src/modules/integration_ksef_direct/api/get/integration-ksef-direct/health.ts +194 -0
  99. package/src/modules/integration_ksef_direct/api/get/integration-ksef-direct/received-documents/[id].ts +88 -0
  100. package/src/modules/integration_ksef_direct/api/get/integration-ksef-direct/received-documents.ts +119 -0
  101. package/src/modules/integration_ksef_direct/api/get/integration-ksef-direct/seller-info.ts +62 -0
  102. package/src/modules/integration_ksef_direct/api/post/integration-ksef-direct/documents/[id]/send.ts +64 -0
  103. package/src/modules/integration_ksef_direct/api/post/integration-ksef-direct/documents.ts +109 -0
  104. package/src/modules/integration_ksef_direct/api/post/integration-ksef-direct/invoice-numbers.ts +40 -0
  105. package/src/modules/integration_ksef_direct/api/post/integration-ksef-direct/received-documents/fetch.ts +185 -0
  106. package/src/modules/integration_ksef_direct/api/post/integration-ksef-direct/received-documents/sync.ts +86 -0
  107. package/src/modules/integration_ksef_direct/backend/integration-ksef-direct/documents/new/page.meta.ts +4 -0
  108. package/src/modules/integration_ksef_direct/backend/integration-ksef-direct/documents/new/page.tsx +470 -0
  109. package/src/modules/integration_ksef_direct/backend/integration-ksef-direct/documents/page.tsx +233 -0
  110. package/src/modules/integration_ksef_direct/backend/integration-ksef-direct/received-documents/page.tsx +415 -0
  111. package/src/modules/integration_ksef_direct/backend/page.tsx +183 -0
  112. package/src/modules/integration_ksef_direct/commands/create-ksef-direct-document.ts +93 -0
  113. package/src/modules/integration_ksef_direct/commands/enqueue-ksef-direct-document.ts +57 -0
  114. package/src/modules/integration_ksef_direct/data/entities.ts +195 -0
  115. package/src/modules/integration_ksef_direct/data/validators.ts +115 -0
  116. package/src/modules/integration_ksef_direct/di.ts +9 -0
  117. package/src/modules/integration_ksef_direct/events.ts +18 -0
  118. package/src/modules/integration_ksef_direct/i18n/en.json +115 -0
  119. package/src/modules/integration_ksef_direct/i18n/pl.json +115 -0
  120. package/src/modules/integration_ksef_direct/index.ts +6 -0
  121. package/src/modules/integration_ksef_direct/integration.ts +54 -0
  122. package/src/modules/integration_ksef_direct/lib/health.ts +43 -0
  123. package/src/modules/integration_ksef_direct/lib/invoiceNumberFormat.ts +23 -0
  124. package/src/modules/integration_ksef_direct/lib/ksefClient.ts +668 -0
  125. package/src/modules/integration_ksef_direct/lib/ksefCrypto.ts +138 -0
  126. package/src/modules/integration_ksef_direct/lib/ksefFa2Xml.ts +147 -0
  127. package/src/modules/integration_ksef_direct/lib/ksefXmlParser.ts +97 -0
  128. package/src/modules/integration_ksef_direct/migrations/.snapshot-open-mercato.json +1028 -0
  129. package/src/modules/integration_ksef_direct/migrations/Migration20260519210000_integration_ksef_direct.ts +15 -0
  130. package/src/modules/integration_ksef_direct/migrations/Migration20260520120000_ksef_direct_documents.ts +17 -0
  131. package/src/modules/integration_ksef_direct/migrations/Migration20260520220000_ksef_direct_send_queue.ts +15 -0
  132. package/src/modules/integration_ksef_direct/migrations/Migration20260520230000_ksef_direct_seller_per_document.ts +17 -0
  133. package/src/modules/integration_ksef_direct/migrations/Migration20260521120000_ksef_direct_received_documents.ts +16 -0
  134. package/src/modules/integration_ksef_direct/migrations/Migration20260521130000_ksef_received_download_urls.ts +15 -0
  135. package/src/modules/integration_ksef_direct/setup.ts +9 -0
  136. package/src/modules/integration_ksef_direct/subscribers/auto-enqueue-ksef-document.ts +21 -0
  137. package/src/modules/integration_ksef_direct/workers/check-ksef-document-status.ts +129 -0
  138. package/src/modules/integration_ksef_direct/workers/send-ksef-document.ts +137 -0
  139. package/src/modules/integration_ksef_direct/workers/sync-received-documents.ts +171 -0
  140. package/src/types/declarations.d.ts +1 -0
@@ -0,0 +1,115 @@
1
+ {
2
+ "integration_ksef_direct.title": "KSeF Direct",
3
+ "integration_ksef_direct.nav.documents": "Sent Documents",
4
+ "integration_ksef_direct.nav.documents_desc": "Outgoing invoices sent to KSeF",
5
+ "integration_ksef_direct.nav.received_documents": "Received Documents",
6
+ "integration_ksef_direct.nav.received_documents_desc": "Invoices received from KSeF",
7
+ "integration_ksef_direct.description": "Direct integration with the Polish KSeF system via official MF API v2 without Exorigo/SmartKSeF middleware.",
8
+ "integration_ksef_direct.health.connected": "Connected",
9
+ "integration_ksef_direct.health.error": "Connection error",
10
+ "integration_ksef_direct.health.unconfigured": "Not configured",
11
+ "integration_ksef_direct.health.checking": "Checking...",
12
+ "integration_ksef_direct.health.check_button": "Check connection",
13
+ "integration_ksef_direct.health.last_checked": "Last check:",
14
+ "integration_ksef_direct.health.environment": "Environment:",
15
+ "integration_ksef_direct.health.rate_limits": "Rate limits:",
16
+ "integration_ksef_direct.health.never": "Never",
17
+ "integration_ksef_direct.credentials.ksef_token": "KSeF Token",
18
+ "integration_ksef_direct.credentials.nip": "NIP",
19
+ "integration_ksef_direct.credentials.environment": "Environment",
20
+ "integration_ksef_direct.credentials.environment.test": "Test",
21
+ "integration_ksef_direct.credentials.environment.production": "Production",
22
+ "integration_ksef_direct.documents.columns.invoiceNumber": "Invoice Number",
23
+ "integration_ksef_direct.documents.columns.buyer": "Buyer",
24
+ "integration_ksef_direct.documents.columns.issueDate": "Issue Date",
25
+ "integration_ksef_direct.documents.columns.grossAmount": "Gross Amount",
26
+ "integration_ksef_direct.documents.columns.source": "Source",
27
+ "integration_ksef_direct.documents.columns.status": "Status",
28
+ "integration_ksef_direct.documents.empty.title": "No KSeF documents yet",
29
+ "integration_ksef_direct.documents.empty.description": "Add your first document manually or configure KSeF sync.",
30
+ "integration_ksef_direct.documents.status.draft": "Draft",
31
+ "integration_ksef_direct.documents.status.queued": "Queued",
32
+ "integration_ksef_direct.documents.status.sending": "Sending",
33
+ "integration_ksef_direct.documents.status.sent": "Sent",
34
+ "integration_ksef_direct.documents.status.failed": "Failed",
35
+ "integration_ksef_direct.documents.source.manual": "Manual",
36
+ "integration_ksef_direct.documents.source.ksef_sync": "KSeF sync",
37
+ "integration_ksef_direct.documents.source.sales_invoice": "Sales invoice",
38
+ "integration_ksef_direct.documents.form.title_new": "New KSeF Document",
39
+ "integration_ksef_direct.documents.form.section.buyer": "Buyer",
40
+ "integration_ksef_direct.documents.form.section.invoice": "Invoice Details",
41
+ "integration_ksef_direct.documents.form.section.summary": "Summary",
42
+ "integration_ksef_direct.documents.form.buyer_nip": "Buyer NIP",
43
+ "integration_ksef_direct.documents.form.buyer_name": "Buyer Name",
44
+ "integration_ksef_direct.documents.form.invoice_number": "Invoice Number",
45
+ "integration_ksef_direct.documents.form.issue_date": "Issue Date",
46
+ "integration_ksef_direct.documents.form.sale_date": "Sale Date",
47
+ "integration_ksef_direct.documents.form.currency": "Currency",
48
+ "integration_ksef_direct.documents.form.net_amount": "Net Amount",
49
+ "integration_ksef_direct.documents.form.vat_amount": "VAT Amount",
50
+ "integration_ksef_direct.documents.form.gross_amount": "Gross Amount",
51
+ "integration_ksef_direct.documents.form.notes": "Notes",
52
+ "integration_ksef_direct.documents.form.section.seller": "Seller",
53
+ "integration_ksef_direct.documents.form.seller_nip": "Seller NIP",
54
+ "integration_ksef_direct.documents.form.seller_nip_placeholder": "KSeF not configured",
55
+ "integration_ksef_direct.documents.form.generate_number": "Generate number",
56
+ "integration_ksef_direct.documents.form.generating": "Generating...",
57
+ "integration_ksef_direct.documents.form.generate_number_error": "Failed to generate invoice number",
58
+ "integration_ksef_direct.documents.form.seller_info_error": "Failed to load seller info",
59
+ "integration_ksef_direct.documents.form.seller_name": "Seller Name",
60
+ "integration_ksef_direct.documents.form.section.seller_address": "Seller Address (optional)",
61
+ "integration_ksef_direct.documents.form.seller_address_l1": "Street and number",
62
+ "integration_ksef_direct.documents.form.seller_city": "City",
63
+ "integration_ksef_direct.documents.form.seller_country": "Country",
64
+ "integration_ksef_direct.documents.form.submit": "Save Document",
65
+ "integration_ksef_direct.documents.form.error": "Failed to save document",
66
+ "integration_ksef_direct.documents.form.success": "Document created successfully.",
67
+ "integration_ksef_direct.documents.form.line_items": "Line Items",
68
+ "integration_ksef_direct.documents.form.line_items.description": "Description",
69
+ "integration_ksef_direct.documents.form.line_items.quantity": "Qty",
70
+ "integration_ksef_direct.documents.form.line_items.unit": "Unit",
71
+ "integration_ksef_direct.documents.form.line_items.unit_net_price": "Net Price",
72
+ "integration_ksef_direct.documents.form.line_items.vat_rate": "VAT",
73
+ "integration_ksef_direct.documents.form.line_items.add": "Add Line",
74
+ "integration_ksef_direct.documents.form.line_items.remove": "Remove line",
75
+ "integration_ksef_direct.documents.list.actions.new": "New Document",
76
+ "integration_ksef_direct.documents.send_button": "Send to KSeF",
77
+ "integration_ksef_direct.documents.retry_button": "Retry send",
78
+ "integration_ksef_direct.documents.send_success": "Document queued for sending",
79
+ "integration_ksef_direct.documents.ksef_reference_number": "KSeF Number",
80
+ "integration_ksef_direct.documents.ksef_processing_reference": "Processing Reference Number",
81
+ "integration_ksef_direct.documents.go_to_settings": "Go to settings",
82
+ "integration_ksef_direct.documents.errors.already_queued": "Document is already queued",
83
+ "integration_ksef_direct.documents.errors.send_failed": "KSeF send failed",
84
+ "integration_ksef_direct.documents.errors.xml_failed": "FA_VAT XML generation failed",
85
+ "integration_ksef_direct.documents.errors.ksef_timeout": "Timeout: KSeF did not confirm the document within 10 minutes",
86
+ "integration_ksef_direct.documents.errors.missing_seller_name": "Seller name is required to send this document to KSeF",
87
+
88
+ "integration_ksef_direct.received_documents.title": "Received Documents",
89
+ "integration_ksef_direct.received_documents.loading": "Loading...",
90
+ "integration_ksef_direct.received_documents.empty": "No received documents found.",
91
+ "integration_ksef_direct.received_documents.cancel": "Cancel",
92
+ "integration_ksef_direct.received_documents.date_from": "Date From",
93
+ "integration_ksef_direct.received_documents.date_to": "Date To",
94
+ "integration_ksef_direct.received_documents.sync_button": "Sync by date range",
95
+ "integration_ksef_direct.received_documents.fetch_button": "Fetch by reference",
96
+ "integration_ksef_direct.received_documents.sync_success": "Sync started. Documents will appear shortly.",
97
+ "integration_ksef_direct.received_documents.fetch_success": "Document fetched successfully.",
98
+ "integration_ksef_direct.received_documents.copy_xml": "Copy XML",
99
+ "integration_ksef_direct.received_documents.xml_copied": "Copied",
100
+ "integration_ksef_direct.received_documents.column.ksef_reference": "KSeF Ref.",
101
+ "integration_ksef_direct.received_documents.column.invoice_number": "Invoice No.",
102
+ "integration_ksef_direct.received_documents.column.seller_nip": "Seller NIP",
103
+ "integration_ksef_direct.received_documents.column.seller_name": "Seller",
104
+ "integration_ksef_direct.received_documents.column.issue_date": "Issue Date",
105
+ "integration_ksef_direct.received_documents.column.gross_amount": "Gross Amount",
106
+ "integration_ksef_direct.received_documents.column.status": "Status",
107
+ "integration_ksef_direct.received_documents.status.pending_download": "Pending Download",
108
+ "integration_ksef_direct.received_documents.status.downloaded": "Downloaded",
109
+ "integration_ksef_direct.received_documents.status.failed": "Failed",
110
+ "integration_ksef_direct.received_documents.dialog_sync.title": "Sync Received Documents",
111
+ "integration_ksef_direct.received_documents.dialog_sync.submit": "Start Sync",
112
+ "integration_ksef_direct.received_documents.dialog_fetch.title": "Fetch Document by KSeF Reference",
113
+ "integration_ksef_direct.received_documents.dialog_fetch.submit": "Fetch",
114
+ "integration_ksef_direct.received_documents.error.no_credentials": "KSeF credentials are not configured for this organization."
115
+ }
@@ -0,0 +1,115 @@
1
+ {
2
+ "integration_ksef_direct.title": "KSeF Direct",
3
+ "integration_ksef_direct.nav.documents": "Wysłane dokumenty",
4
+ "integration_ksef_direct.nav.documents_desc": "Faktury wychodzące wysłane do KSeF",
5
+ "integration_ksef_direct.nav.received_documents": "Odebrane dokumenty",
6
+ "integration_ksef_direct.nav.received_documents_desc": "Faktury odebrane z KSeF",
7
+ "integration_ksef_direct.description": "Bezpośrednia integracja z KSeF przez oficjalne API MF v2 bez pośrednika Exorigo/SmartKSeF.",
8
+ "integration_ksef_direct.health.connected": "Połączono",
9
+ "integration_ksef_direct.health.error": "Błąd połączenia",
10
+ "integration_ksef_direct.health.unconfigured": "Nieskonfigurowano",
11
+ "integration_ksef_direct.health.checking": "Sprawdzanie...",
12
+ "integration_ksef_direct.health.check_button": "Sprawdź połączenie",
13
+ "integration_ksef_direct.health.last_checked": "Ostatni check:",
14
+ "integration_ksef_direct.health.environment": "Środowisko:",
15
+ "integration_ksef_direct.health.rate_limits": "Rate limity:",
16
+ "integration_ksef_direct.health.never": "Nigdy",
17
+ "integration_ksef_direct.credentials.ksef_token": "Token KSeF",
18
+ "integration_ksef_direct.credentials.nip": "NIP",
19
+ "integration_ksef_direct.credentials.environment": "Środowisko",
20
+ "integration_ksef_direct.credentials.environment.test": "Test",
21
+ "integration_ksef_direct.credentials.environment.production": "Produkcja",
22
+ "integration_ksef_direct.documents.columns.invoiceNumber": "Nr faktury",
23
+ "integration_ksef_direct.documents.columns.buyer": "Nabywca",
24
+ "integration_ksef_direct.documents.columns.issueDate": "Data wystawienia",
25
+ "integration_ksef_direct.documents.columns.grossAmount": "Kwota brutto",
26
+ "integration_ksef_direct.documents.columns.source": "Źródło",
27
+ "integration_ksef_direct.documents.columns.status": "Status",
28
+ "integration_ksef_direct.documents.empty.title": "Brak dokumentów KSeF",
29
+ "integration_ksef_direct.documents.empty.description": "Dodaj pierwszy dokument ręcznie lub skonfiguruj synchronizację z KSeF.",
30
+ "integration_ksef_direct.documents.status.draft": "Szkic",
31
+ "integration_ksef_direct.documents.status.queued": "W kolejce",
32
+ "integration_ksef_direct.documents.status.sending": "Wysyłanie",
33
+ "integration_ksef_direct.documents.status.sent": "Wysłane",
34
+ "integration_ksef_direct.documents.status.failed": "Błąd",
35
+ "integration_ksef_direct.documents.source.manual": "Ręcznie",
36
+ "integration_ksef_direct.documents.source.ksef_sync": "Synchronizacja KSeF",
37
+ "integration_ksef_direct.documents.source.sales_invoice": "Faktura sprzedaży",
38
+ "integration_ksef_direct.documents.form.title_new": "Nowy dokument KSeF",
39
+ "integration_ksef_direct.documents.form.section.buyer": "Nabywca",
40
+ "integration_ksef_direct.documents.form.section.invoice": "Szczegóły faktury",
41
+ "integration_ksef_direct.documents.form.section.summary": "Podsumowanie",
42
+ "integration_ksef_direct.documents.form.buyer_nip": "NIP nabywcy",
43
+ "integration_ksef_direct.documents.form.buyer_name": "Nazwa nabywcy",
44
+ "integration_ksef_direct.documents.form.invoice_number": "Numer faktury",
45
+ "integration_ksef_direct.documents.form.issue_date": "Data wystawienia",
46
+ "integration_ksef_direct.documents.form.sale_date": "Data sprzedaży",
47
+ "integration_ksef_direct.documents.form.currency": "Waluta",
48
+ "integration_ksef_direct.documents.form.net_amount": "Kwota netto",
49
+ "integration_ksef_direct.documents.form.vat_amount": "Kwota VAT",
50
+ "integration_ksef_direct.documents.form.gross_amount": "Kwota brutto",
51
+ "integration_ksef_direct.documents.form.notes": "Uwagi",
52
+ "integration_ksef_direct.documents.form.section.seller": "Sprzedawca",
53
+ "integration_ksef_direct.documents.form.seller_nip": "NIP sprzedawcy",
54
+ "integration_ksef_direct.documents.form.seller_nip_placeholder": "Brak konfiguracji KSeF",
55
+ "integration_ksef_direct.documents.form.generate_number": "Generuj numer",
56
+ "integration_ksef_direct.documents.form.generating": "Generowanie...",
57
+ "integration_ksef_direct.documents.form.generate_number_error": "Nie udało się wygenerować numeru",
58
+ "integration_ksef_direct.documents.form.seller_info_error": "Nie udało się pobrać danych sprzedawcy",
59
+ "integration_ksef_direct.documents.form.seller_name": "Nazwa sprzedawcy",
60
+ "integration_ksef_direct.documents.form.section.seller_address": "Adres sprzedawcy (opcjonalny)",
61
+ "integration_ksef_direct.documents.form.seller_address_l1": "Ulica i numer",
62
+ "integration_ksef_direct.documents.form.seller_city": "Miasto",
63
+ "integration_ksef_direct.documents.form.seller_country": "Kraj",
64
+ "integration_ksef_direct.documents.form.submit": "Zapisz dokument",
65
+ "integration_ksef_direct.documents.form.error": "Nie udało się zapisać dokumentu",
66
+ "integration_ksef_direct.documents.form.success": "Dokument został dodany.",
67
+ "integration_ksef_direct.documents.form.line_items": "Pozycje",
68
+ "integration_ksef_direct.documents.form.line_items.description": "Opis",
69
+ "integration_ksef_direct.documents.form.line_items.quantity": "Ilość",
70
+ "integration_ksef_direct.documents.form.line_items.unit": "Jedn.",
71
+ "integration_ksef_direct.documents.form.line_items.unit_net_price": "Cena netto",
72
+ "integration_ksef_direct.documents.form.line_items.vat_rate": "VAT",
73
+ "integration_ksef_direct.documents.form.line_items.add": "Dodaj pozycję",
74
+ "integration_ksef_direct.documents.form.line_items.remove": "Usuń pozycję",
75
+ "integration_ksef_direct.documents.list.actions.new": "Nowy dokument",
76
+ "integration_ksef_direct.documents.send_button": "Wyślij do KSeF",
77
+ "integration_ksef_direct.documents.retry_button": "Ponów wysyłkę",
78
+ "integration_ksef_direct.documents.send_success": "Dokument dodany do kolejki wysyłki",
79
+ "integration_ksef_direct.documents.ksef_reference_number": "Numer KSeF",
80
+ "integration_ksef_direct.documents.ksef_processing_reference": "Numer referencyjny przetwarzania",
81
+ "integration_ksef_direct.documents.go_to_settings": "Przejdź do ustawień",
82
+ "integration_ksef_direct.documents.errors.already_queued": "Dokument jest już w kolejce",
83
+ "integration_ksef_direct.documents.errors.send_failed": "Błąd wysyłki do KSeF",
84
+ "integration_ksef_direct.documents.errors.xml_failed": "Błąd generowania XML FA_VAT",
85
+ "integration_ksef_direct.documents.errors.ksef_timeout": "Timeout: KSeF nie potwierdził dokumentu w ciągu 10 minut",
86
+ "integration_ksef_direct.documents.errors.missing_seller_name": "Nazwa sprzedawcy jest wymagana do wysłania dokumentu do KSeF",
87
+
88
+ "integration_ksef_direct.received_documents.title": "Odebrane dokumenty",
89
+ "integration_ksef_direct.received_documents.loading": "Ładowanie...",
90
+ "integration_ksef_direct.received_documents.empty": "Brak odebranych dokumentów.",
91
+ "integration_ksef_direct.received_documents.cancel": "Anuluj",
92
+ "integration_ksef_direct.received_documents.date_from": "Data od",
93
+ "integration_ksef_direct.received_documents.date_to": "Data do",
94
+ "integration_ksef_direct.received_documents.sync_button": "Synchronizuj zakres dat",
95
+ "integration_ksef_direct.received_documents.fetch_button": "Pobierz po numerze ref.",
96
+ "integration_ksef_direct.received_documents.sync_success": "Synchronizacja rozpoczęta. Dokumenty pojawią się wkrótce.",
97
+ "integration_ksef_direct.received_documents.fetch_success": "Dokument pobrany pomyślnie.",
98
+ "integration_ksef_direct.received_documents.copy_xml": "Kopiuj XML",
99
+ "integration_ksef_direct.received_documents.xml_copied": "Skopiowano",
100
+ "integration_ksef_direct.received_documents.column.ksef_reference": "Numer KSeF",
101
+ "integration_ksef_direct.received_documents.column.invoice_number": "Nr faktury",
102
+ "integration_ksef_direct.received_documents.column.seller_nip": "NIP sprzedawcy",
103
+ "integration_ksef_direct.received_documents.column.seller_name": "Sprzedawca",
104
+ "integration_ksef_direct.received_documents.column.issue_date": "Data wystawienia",
105
+ "integration_ksef_direct.received_documents.column.gross_amount": "Kwota brutto",
106
+ "integration_ksef_direct.received_documents.column.status": "Status",
107
+ "integration_ksef_direct.received_documents.status.pending_download": "Oczekuje na pobranie",
108
+ "integration_ksef_direct.received_documents.status.downloaded": "Pobrano",
109
+ "integration_ksef_direct.received_documents.status.failed": "Błąd",
110
+ "integration_ksef_direct.received_documents.dialog_sync.title": "Synchronizuj odebrane dokumenty",
111
+ "integration_ksef_direct.received_documents.dialog_sync.submit": "Rozpocznij synchronizację",
112
+ "integration_ksef_direct.received_documents.dialog_fetch.title": "Pobierz dokument po numerze KSeF",
113
+ "integration_ksef_direct.received_documents.dialog_fetch.submit": "Pobierz",
114
+ "integration_ksef_direct.received_documents.error.no_credentials": "Dane dostępowe KSeF nie są skonfigurowane dla tej organizacji."
115
+ }
@@ -0,0 +1,6 @@
1
+ export const metadata = {
2
+ id: 'integration_ksef_direct',
3
+ title: 'KSeF Integration',
4
+ description: 'Direct integration with the Polish KSeF system via official MF API v2',
5
+ requires: ['integrations'],
6
+ }
@@ -0,0 +1,54 @@
1
+ import type { IntegrationDefinition } from '@open-mercato/shared/modules/integrations/types'
2
+
3
+ export const integration: IntegrationDefinition = {
4
+ id: 'integration_ksef_direct',
5
+ title: 'KSeF Direct',
6
+ description: 'Direct integration with the Polish National e-Invoice System (KSeF) via official MF REST API v2 — no Exorigo/SmartKSeF middleware required.',
7
+ category: 'fiscal',
8
+ providerKey: 'ksef_direct',
9
+ icon: 'file-text',
10
+ package: '@fast-white-cat/integration-ksef-direct',
11
+ version: '0.1.0',
12
+ author: 'FastWhiteCat',
13
+ company: 'FastWhiteCat',
14
+ license: 'PROPRIETARY',
15
+ tags: ['ksef', 'e-invoicing', 'poland', 'fiscal', 'tax-compliance', 'direct'],
16
+ credentials: {
17
+ fields: [
18
+ {
19
+ key: 'ksef_token',
20
+ label: 'KSeF Token',
21
+ type: 'secret',
22
+ required: true,
23
+ },
24
+ {
25
+ key: 'nip',
26
+ label: 'NIP (Tax Identification Number)',
27
+ type: 'text',
28
+ required: true,
29
+ },
30
+ {
31
+ key: 'environment',
32
+ label: 'Environment',
33
+ type: 'select',
34
+ required: true,
35
+ options: [
36
+ { value: 'test', label: 'Test (api-test.ksef.mf.gov.pl)' },
37
+ { value: 'production', label: 'Production (api.ksef.mf.gov.pl)' },
38
+ ],
39
+ },
40
+ ],
41
+ },
42
+ healthCheck: {
43
+ service: 'ksefDirectHealthChecker',
44
+ },
45
+ apiVersions: [
46
+ {
47
+ id: 'ksef-api-v2',
48
+ label: 'KSeF MF API v2',
49
+ status: 'stable',
50
+ default: true,
51
+ changelog: 'Direct MF KSeF API v2 — challenge/token auth flow',
52
+ },
53
+ ],
54
+ }
@@ -0,0 +1,43 @@
1
+ import { verifyAccess, KsefAuthError, KsefNetworkError } from './ksefClient'
2
+ import type { KsefCredentials } from './ksefClient'
3
+
4
+ export interface HealthCheckResult {
5
+ status: 'healthy' | 'unhealthy'
6
+ message: string
7
+ details: Record<string, unknown>
8
+ checkedAt: Date
9
+ }
10
+
11
+ export const ksefDirectHealthChecker = {
12
+ async check(credentials: Record<string, unknown>): Promise<HealthCheckResult> {
13
+ const typed: KsefCredentials = {
14
+ ksefToken: credentials.ksef_token as string,
15
+ nip: credentials.nip as string,
16
+ environment: credentials.environment as 'test' | 'production',
17
+ }
18
+
19
+ try {
20
+ const rateLimits = await verifyAccess(typed)
21
+ return {
22
+ status: 'healthy',
23
+ message: `Connected to KSeF ${typed.environment} (NIP: ${typed.nip})`,
24
+ details: { environment: typed.environment, nip: typed.nip, rateLimits },
25
+ checkedAt: new Date(),
26
+ }
27
+ } catch (err: unknown) {
28
+ const message = err instanceof Error ? err.message : 'Unknown error'
29
+ const errorCode =
30
+ err instanceof KsefAuthError
31
+ ? err.errorCode
32
+ : err instanceof KsefNetworkError
33
+ ? err.errorCode
34
+ : 'UNKNOWN_ERROR'
35
+ return {
36
+ status: 'unhealthy',
37
+ message: `KSeF connection failed: ${message}`,
38
+ details: { error: message, errorCode },
39
+ checkedAt: new Date(),
40
+ }
41
+ }
42
+ },
43
+ }
@@ -0,0 +1,23 @@
1
+ import { randomBytes } from 'crypto'
2
+
3
+ // Format: FV/{yyyy}/{mm}/{nanoid:8} — extensible to per-tenant configurable format in the future
4
+ const ALPHABET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
5
+ const MAX_VALID = 256 - (256 % ALPHABET.length)
6
+
7
+ function createAlphanumericId(size: number): string {
8
+ let id = ''
9
+ while (id.length < size) {
10
+ const byte = randomBytes(1)[0]
11
+ if (byte >= MAX_VALID) continue
12
+ id += ALPHABET[byte % ALPHABET.length]
13
+ }
14
+ return id
15
+ }
16
+
17
+ export function generateKsefInvoiceNumber(): string {
18
+ const now = new Date()
19
+ const yyyy = String(now.getFullYear())
20
+ const mm = String(now.getMonth() + 1).padStart(2, '0')
21
+ const unique = createAlphanumericId(8)
22
+ return `FV/${yyyy}/${mm}/${unique}`
23
+ }