diff --git a/changelog.md b/changelog.md index 8231094..b97feef 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,12 @@ # Changelog +## 2025-01-01 - 1.1.2 - fix(core) +Fix file import paths and remove markdown syntax from README + +- Corrected import paths for getInvoice utility +- Removed markdown syntax from README +- Fixed function parameter usage in encoder class + ## 2024-12-31 - 1.1.1 - fix(documentation) Updated documentation to reflect accurate module description and usage guidance diff --git a/readme.md b/readme.md index ddd64ec..5063cc3 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,3 @@ -```markdown # @fin.cx/xinvoice A module for creating, manipulating, and embedding XML data within PDF files for xinvoice packages. @@ -186,8 +185,6 @@ This class mimics the behavior of extracting XML to a structured `ILetter` objec The entirety of the module facilitates a wide spectrum of invoicing scenarios. From initial creation, embedding, and parsing tasks, to advanced encoding and decoding, every feature is crafted to accommodate complexities inherent in financial document management. By embracing `@fin.cx/xinvoice`, you simplify the handling of xinvoice-standard documents, fostering seamless integration across different financial processes, thus empowering practitioners with robust, flexible tools for VAT invoices in ZUGFeRD compliance or equivalent digital formats. -``` - ## License and Legal Information diff --git a/test/assets/getinvoice.ts b/test/assets/getasset.ts similarity index 84% rename from test/assets/getinvoice.ts rename to test/assets/getasset.ts index 6e3ea09..c3c1842 100644 --- a/test/assets/getinvoice.ts +++ b/test/assets/getasset.ts @@ -15,4 +15,8 @@ export const invoices = { } } } +} + +export const letterObjects = { + letter1: await import('./letter/letter1.js'), } \ No newline at end of file diff --git a/test/assets/letter/letter1.ts b/test/assets/letter/letter1.ts new file mode 100644 index 0000000..71b2932 --- /dev/null +++ b/test/assets/letter/letter1.ts @@ -0,0 +1,211 @@ +import * as tsclass from '@tsclass/tsclass'; + +const fromContact: tsclass.business.IContact = { + name: 'Awesome From Company', + type: 'company', + description: 'a company that does stuff', + address: { + streetName: 'Awesome Street', + houseNumber: '5', + city: 'Bremen', + country: 'Germany', + postalCode: '28359', + }, + vatId: 'DE12345678', + sepaConnection: { + bic: 'BPOTBEB1', + iban: 'BE01234567891616' + }, + email: 'hello@awesome.company', + phone: '+49 421 1234567', + fax: '+49 421 1234568', + +}; + +const toContact: tsclass.business.IContact = { + name: 'Awesome To GmbH', + type: 'company', + customerNumber: 'LL-CLIENT-123', + description: 'a company that does stuff', + address: { + streetName: 'Awesome Street', + houseNumber: '5', + city: 'Bremen', + country: 'Germany', + postalCode: '28359' + }, + vatId: 'BE12345678', +} + +export const demoLetter: tsclass.business.ILetter = { + versionInfo: { + type: 'draft', + version: '1.0.0', + }, + accentColor: null, + content: { + textData: null, + timesheetData: null, + contractData: { + contractDate: Date.now(), + id: 'someid' + }, + invoiceData: { + id: 'LL-INV-48765', + reverseCharge: true, + dueInDays: 30, + billedBy: fromContact, + billedTo: toContact, + status: null, + deliveryDate: new Date().getTime(), + periodOfPerformance: null, + printResult: null, + currency: 'EUR', + notes: [], + type: 'debitnote', + items: [ + { + name: 'Item with 19% VAT', + unitQuantity: 2, + unitNetPrice: 100, + unitType: 'hours', + vatPercentage: 19, + position: 0, + }, + { + name: 'Item with 7% VAT', + unitQuantity: 4, + unitNetPrice: 100, + unitType: 'hours', + vatPercentage: 7, + position: 1, + }, + { + name: 'Item with 7% VAT', + unitQuantity: 3, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 7, + position: 2, + }, + { + name: 'Item with 21% VAT', + unitQuantity: 1, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 21, + position: 3, + }, + { + name: 'Item with 0% VAT', + unitQuantity: 6, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 0, + position: 4, + },{ + name: 'Item with 19% VAT', + unitQuantity: 8, + unitNetPrice: 100, + unitType: 'hours', + vatPercentage: 19, + position: 5, + }, + { + name: 'Item with 7% VAT', + unitQuantity: 9, + unitNetPrice: 100, + unitType: 'hours', + vatPercentage: 7, + position: 6, + }, + { + name: 'Item with 7% VAT', + unitQuantity: 4, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 7, + position: 8, + }, + { + name: 'Item with 21% VAT', + unitQuantity: 3, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 21, + position: 9, + }, + { + name: 'Item with 0% VAT', + unitQuantity: 1, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 0, + position: 10, + }, + { + name: 'Item with 0% VAT', + unitQuantity: 1, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 0, + position: 10, + }, + { + name: 'Item with 0% VAT', + unitQuantity: 1, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 0, + position: 10, + }, + { + name: 'Item with 0% VAT', + unitQuantity: 1, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 0, + position: 10, + }, + { + name: 'Item with 0% VAT', + unitQuantity: 1, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 0, + position: 10, + }, + { + name: 'Item with 0% VAT', + unitQuantity: 1, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 0, + position: 10, + }, + { + name: 'Item with 0% VAT', + unitQuantity: 1, + unitNetPrice: 230, + unitType: 'hours', + vatPercentage: 0, + position: 10, + }, + ], + } + }, + + date: Date.now(), + type: 'invoice', + needsCoverSheet: false, + objectActions: [], + pdf: null, + from: fromContact, + to: toContact, + incidenceId: null, + language: null, + legalContact: null, + logoUrl: null, + pdfAttachments: null, + subject: 'Invoice: LL-INV-48765', +} diff --git a/test/test.ts b/test/test.ts index d0930e0..24e104c 100644 --- a/test/test.ts +++ b/test/test.ts @@ -2,7 +2,7 @@ import { tap, expect } from '@push.rocks/tapbundle'; import * as xinvoice from '../ts/index.js'; -import * as getInvoices from './assets/getinvoice.js'; +import * as getInvoices from './assets/getasset.js'; const test1 = tap.test('XInvoice should correctly embed XML into a PDF', async (tools) => { // lets setup the XInvoice instance diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 348b7aa..db88fe0 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@fin.cx/xinvoice', - version: '1.1.1', + version: '1.1.2', description: 'A TypeScript module for creating, manipulating, and embedding XML data within PDF files specifically tailored for xinvoice packages.' } diff --git a/ts/classes.encoder.ts b/ts/classes.encoder.ts index 156b72f..d12bdbf 100644 --- a/ts/classes.encoder.ts +++ b/ts/classes.encoder.ts @@ -34,7 +34,7 @@ export class ZugferdXmlEncoder { doc.ele('rsm:ExchangedDocumentContext') .ele('ram:TestIndicator') .ele('udt:Indicator') - .txt(this.isDraft() ? 'true' : 'false') + .txt(this.isDraft(letterArg) ? 'true' : 'false') .up() .up() .up(); // @@ -51,7 +51,7 @@ export class ZugferdXmlEncoder { .ele('ram:IssueDateTime') .ele('udt:DateTimeString', { format: '102' }) // Format 'YYYYMMDD' or 'YYYY-MM-DD'? Depending on standard - .txt(this.formatDate(this.letter.date, 'yyyyMMdd')) + .txt(this.formatDate(letterArg.date)) .up() .up(); exchangedDoc.up(); // @@ -136,8 +136,8 @@ export class ZugferdXmlEncoder { const occurrenceEle = actualDeliveryEle.ele('ram:OccurrenceDateTime') .ele('udt:DateTimeString', { format: '102' }); - const deliveryDate = invoice.deliveryDate || this.letter.date; - occurrenceEle.txt(this.formatDate(deliveryDate, 'yyyyMMdd')).up(); + const deliveryDate = invoice.deliveryDate || letterArg.date; + occurrenceEle.txt(this.formatDate(deliveryDate)).up(); actualDeliveryEle.up(); // headerTradeDeliveryEle.up(); // @@ -188,15 +188,15 @@ export class ZugferdXmlEncoder { /** * Helper: Determine if the letter is in draft or final. */ - private isDraft(): boolean { - return this.letter.versionInfo?.type === 'draft'; + private isDraft(letterArg: plugins.tsclass.business.ILetter): boolean { + return letterArg.versionInfo?.type === 'draft'; } /** * Helper: Format date to certain patterns (very minimal example). * e.g. 'yyyyMMdd' => '20231231' */ - private formatDate(timestampMs: number, pattern: 'yyyyMMdd'): string { + private formatDate(timestampMs: number): string { const date = new Date(timestampMs); const yyyy = date.getFullYear(); const mm = String(date.getMonth() + 1).padStart(2, '0');