feat(core): Enhance document generation capabilities with improved modular structure and extended translation support.
This commit is contained in:
		
							
								
								
									
										219
									
								
								ts/shared/demoletter.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								ts/shared/demoletter.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,219 @@ | ||||
| import * as tsclass from '@tsclass/tsclass'; | ||||
| import * as interfaces from '../interfaces/index.js'; | ||||
|  | ||||
| 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', | ||||
| } | ||||
|  | ||||
| export const demoDocumentSettings: interfaces.IDocumentSettings = { | ||||
|   enableTopDraftText: true, | ||||
|   enableDefaultHeader: true, | ||||
|   enableDefaultFooter: true, | ||||
|   languageCode: 'DE', | ||||
| }; | ||||
							
								
								
									
										9
									
								
								ts/shared/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								ts/shared/index.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| export const a4Height = 1122; | ||||
| export const a4Width = 794; | ||||
| export const rightMargin = 70; | ||||
| export const leftMargin = 90; | ||||
|  | ||||
| import * as translation from './translation.js'; | ||||
| export { translation }; | ||||
|  | ||||
| export * from './demoletter.js'; | ||||
							
								
								
									
										31
									
								
								ts/shared/translation.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								ts/shared/translation.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| import * as interfaces from '../interfaces/index.js'; | ||||
|  | ||||
| type TTranslationImplementation = { | ||||
|   [key in keyof interfaces.IDeDocumentTranslations]: string; | ||||
| } | ||||
|  | ||||
| export const EN_translations: TTranslationImplementation = { | ||||
|   invoice: 'Invoice', | ||||
|   quantity: 'Quantity', | ||||
| }; | ||||
|  | ||||
| export const DE_translations: TTranslationImplementation = { | ||||
|   invoice: 'Rechnung', | ||||
|   quantity: 'Anzahl', | ||||
| }; | ||||
|  | ||||
| export const languageCodeMap = { | ||||
|   'DE': DE_translations, | ||||
|   'EN': EN_translations, | ||||
| }; | ||||
|  | ||||
| export type TLanguageCode = keyof typeof languageCodeMap; | ||||
|  | ||||
| export const translate = (languageCode: TLanguageCode, key: string, defaultValue: string) => { | ||||
|   const translations = languageCodeMap[languageCode] || EN_translations; | ||||
|   if (translations && translations[key]) { | ||||
|     return translations[key]; | ||||
|   } else { | ||||
|     return defaultValue; | ||||
|   } | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user