diff --git a/generated/swagger/oms-api/src/models.ts b/generated/swagger/oms-api/src/models.ts index 56d6d9f20..e2347c00d 100644 --- a/generated/swagger/oms-api/src/models.ts +++ b/generated/swagger/oms-api/src/models.ts @@ -244,14 +244,15 @@ export { ResponseArgsOfIEnumerableOfReceiptDTO } from './models/response-args-of export { GenerateCollectiveReceiptsArgs } from './models/generate-collective-receipts-args'; export { ResponseArgsOfIEnumerableOfString } from './models/response-args-of-ienumerable-of-string'; export { DateRange } from './models/date-range'; +export { ResponseArgsOfString } from './models/response-args-of-string'; +export { ListResponseArgsOfReceiptItemTaskListItemDTO } from './models/list-response-args-of-receipt-item-task-list-item-dto'; +export { ResponseArgsOfIEnumerableOfReceiptItemTaskListItemDTO } from './models/response-args-of-ienumerable-of-receipt-item-task-list-item-dto'; export { ListResponseArgsOfReceiptListItemDTO } from './models/list-response-args-of-receipt-list-item-dto'; export { ResponseArgsOfIEnumerableOfReceiptListItemDTO } from './models/response-args-of-ienumerable-of-receipt-list-item-dto'; export { ReceiptListItemDTO } from './models/receipt-list-item-dto'; export { ListResponseArgsOfReceiptItemListItemDTO } from './models/list-response-args-of-receipt-item-list-item-dto'; export { ResponseArgsOfIEnumerableOfReceiptItemListItemDTO } from './models/response-args-of-ienumerable-of-receipt-item-list-item-dto'; export { ReceiptItemListItemDTO } from './models/receipt-item-list-item-dto'; -export { ListResponseArgsOfReceiptItemTaskListItemDTO } from './models/list-response-args-of-receipt-item-task-list-item-dto'; -export { ResponseArgsOfIEnumerableOfReceiptItemTaskListItemDTO } from './models/response-args-of-ienumerable-of-receipt-item-task-list-item-dto'; export { ResponseArgsOfIEnumerableOfValueTupleOfLongAndReceiptTypeAndEntityDTOContainerOfReceiptDTO } from './models/response-args-of-ienumerable-of-value-tuple-of-long-and-receipt-type-and-entity-dtocontainer-of-receipt-dto'; export { ValueTupleOfLongAndReceiptTypeAndEntityDTOContainerOfReceiptDTO } from './models/value-tuple-of-long-and-receipt-type-and-entity-dtocontainer-of-receipt-dto'; export { ReceiptOrderItemSubsetReferenceValues } from './models/receipt-order-item-subset-reference-values'; diff --git a/generated/swagger/oms-api/src/models/receipt-dto.ts b/generated/swagger/oms-api/src/models/receipt-dto.ts index 5cb51925f..5aece9863 100644 --- a/generated/swagger/oms-api/src/models/receipt-dto.ts +++ b/generated/swagger/oms-api/src/models/receipt-dto.ts @@ -6,6 +6,7 @@ import { EntityDTOContainerOfBranchDTO } from './entity-dtocontainer-of-branch-d import { KeyValueDTOOfStringAndString } from './key-value-dtoof-string-and-string'; import { EntityDTOContainerOfReceiptItemDTO } from './entity-dtocontainer-of-receipt-item-dto'; import { EntityDTOContainerOfLabelDTO } from './entity-dtocontainer-of-label-dto'; +import { LinkedRecordDTO } from './linked-record-dto'; import { EntityDTOContainerOfOrderDTO } from './entity-dtocontainer-of-order-dto'; import { EntityDTOContainerOfPaymentDTO } from './entity-dtocontainer-of-payment-dto'; import { PaymentInfoDTO } from './payment-info-dto'; @@ -57,6 +58,11 @@ export interface ReceiptDTO extends EntityDTOBaseOfReceiptDTOAndIReceipt{ */ label?: EntityDTOContainerOfLabelDTO; + /** + * Verknüpfte Datensätze (readonly) + */ + linkedRecords?: Array; + /** * Bestellung */ diff --git a/generated/swagger/oms-api/src/models/receipt-item-task-list-item-dto.ts b/generated/swagger/oms-api/src/models/receipt-item-task-list-item-dto.ts index 9dec8660c..9e1a37900 100644 --- a/generated/swagger/oms-api/src/models/receipt-item-task-list-item-dto.ts +++ b/generated/swagger/oms-api/src/models/receipt-item-task-list-item-dto.ts @@ -45,11 +45,26 @@ export interface ReceiptItemTaskListItemDTO { */ features?: {[key: string]: string}; + /** + * Details + */ + handlingDetails?: string; + + /** + * Reason / Grund + */ + handlingReason?: string; + /** * Task ID */ id?: number; + /** + * Item condition / Artikelzustand + */ + itemCondition?: string; + /** * Aufgabentyp */ diff --git a/generated/swagger/oms-api/src/models/response-args-of-string.ts b/generated/swagger/oms-api/src/models/response-args-of-string.ts new file mode 100644 index 000000000..d468224e0 --- /dev/null +++ b/generated/swagger/oms-api/src/models/response-args-of-string.ts @@ -0,0 +1,9 @@ +/* tslint:disable */ +import { ResponseArgs } from './response-args'; +export interface ResponseArgsOfString extends ResponseArgs{ + + /** + * Wert + */ + result?: string; +} diff --git a/generated/swagger/oms-api/src/services/receipt.service.ts b/generated/swagger/oms-api/src/services/receipt.service.ts index f7d79bf28..56b7f4424 100644 --- a/generated/swagger/oms-api/src/services/receipt.service.ts +++ b/generated/swagger/oms-api/src/services/receipt.service.ts @@ -16,10 +16,11 @@ import { ResponseArgsOfIEnumerableOfReceiptDTO } from '../models/response-args-o import { GenerateCollectiveReceiptsArgs } from '../models/generate-collective-receipts-args'; import { ResponseArgsOfIEnumerableOfString } from '../models/response-args-of-ienumerable-of-string'; import { DateRange } from '../models/date-range'; -import { ListResponseArgsOfReceiptListItemDTO } from '../models/list-response-args-of-receipt-list-item-dto'; -import { QueryTokenDTO } from '../models/query-token-dto'; -import { ListResponseArgsOfReceiptItemListItemDTO } from '../models/list-response-args-of-receipt-item-list-item-dto'; +import { ResponseArgsOfString } from '../models/response-args-of-string'; import { ListResponseArgsOfReceiptItemTaskListItemDTO } from '../models/list-response-args-of-receipt-item-task-list-item-dto'; +import { QueryTokenDTO } from '../models/query-token-dto'; +import { ListResponseArgsOfReceiptListItemDTO } from '../models/list-response-args-of-receipt-list-item-dto'; +import { ListResponseArgsOfReceiptItemListItemDTO } from '../models/list-response-args-of-receipt-item-list-item-dto'; import { ResponseArgsOfIEnumerableOfValueTupleOfLongAndReceiptTypeAndEntityDTOContainerOfReceiptDTO } from '../models/response-args-of-ienumerable-of-value-tuple-of-long-and-receipt-type-and-entity-dtocontainer-of-receipt-dto'; import { ReceiptOrderItemSubsetReferenceValues } from '../models/receipt-order-item-subset-reference-values'; @Injectable({ @@ -33,6 +34,8 @@ class ReceiptService extends __BaseService { static readonly ReceiptSetReceiptItemTaskToNOKPath = '/receipt/item/task/{taskId}/nok'; static readonly ReceiptGenerateCollectiveReceiptsPath = '/receipt/collectivereceipts'; static readonly ReceiptGenerateCollectiveReceiptsSimulationSummaryPath = '/receipt/collectivereceipts/simulationsummary'; + static readonly ReceiptPostRuecknahmebelegPath = '/ruecknahmebeleg/{receiptId}'; + static readonly ReceiptQueryReceiptItemTasksPath = '/receipt/item/task/s'; static readonly ReceiptQueryReceiptPath = '/receipt/s'; static readonly ReceiptQueryReceiptItemPath = '/receipt/item/s'; static readonly ReceiptCreateShippingNotePath = '/receipt/shippingnote/fromorder'; @@ -40,7 +43,6 @@ class ReceiptService extends __BaseService { static readonly ReceiptCreateInvoicePath = '/receipt/invoice/fromorder'; static readonly ReceiptCreateInvoice2Path = '/receipt/invoice/fromitems'; static readonly ReceiptCreateReturnReceiptPath = '/receipt/return-receipt'; - static readonly ReceiptQueryReceiptItemTasksPath = '/receipt/item/task/s'; static readonly ReceiptReceiptItemTaskCompletedPath = '/receipt/item/task/{taskId}/completed'; static readonly ReceiptGetReceiptsByOrderItemSubsetPath = '/order/orderitem/orderitemsubset/receipts'; @@ -307,6 +309,74 @@ class ReceiptService extends __BaseService { ); } + /** + * @param receiptId undefined + */ + ReceiptPostRuecknahmebelegResponse(receiptId: number): __Observable<__StrictHttpResponse> { + let __params = this.newParams(); + let __headers = new HttpHeaders(); + let __body: any = null; + + let req = new HttpRequest( + 'POST', + this.rootUrl + `/ruecknahmebeleg/${encodeURIComponent(String(receiptId))}`, + __body, + { + headers: __headers, + params: __params, + responseType: 'json' + }); + + return this.http.request(req).pipe( + __filter(_r => _r instanceof HttpResponse), + __map((_r) => { + return _r as __StrictHttpResponse; + }) + ); + } + /** + * @param receiptId undefined + */ + ReceiptPostRuecknahmebeleg(receiptId: number): __Observable { + return this.ReceiptPostRuecknahmebelegResponse(receiptId).pipe( + __map(_r => _r.body as ResponseArgsOfString) + ); + } + + /** + * @param queryToken undefined + */ + ReceiptQueryReceiptItemTasksResponse(queryToken: QueryTokenDTO): __Observable<__StrictHttpResponse> { + let __params = this.newParams(); + let __headers = new HttpHeaders(); + let __body: any = null; + __body = queryToken; + let req = new HttpRequest( + 'POST', + this.rootUrl + `/receipt/item/task/s`, + __body, + { + headers: __headers, + params: __params, + responseType: 'json' + }); + + return this.http.request(req).pipe( + __filter(_r => _r instanceof HttpResponse), + __map((_r) => { + return _r as __StrictHttpResponse; + }) + ); + } + /** + * @param queryToken undefined + */ + ReceiptQueryReceiptItemTasks(queryToken: QueryTokenDTO): __Observable { + return this.ReceiptQueryReceiptItemTasksResponse(queryToken).pipe( + __map(_r => _r.body as ListResponseArgsOfReceiptItemTaskListItemDTO) + ); + } + /** * Belege * @param params The `ReceiptService.ReceiptQueryReceiptParams` containing the following parameters: @@ -647,42 +717,6 @@ class ReceiptService extends __BaseService { ); } - /** - * Suche nach Bestellpostenstatus-Aufgaben - * @param queryToken Suchkriterien - */ - ReceiptQueryReceiptItemTasksResponse(queryToken: QueryTokenDTO): __Observable<__StrictHttpResponse> { - let __params = this.newParams(); - let __headers = new HttpHeaders(); - let __body: any = null; - __body = queryToken; - let req = new HttpRequest( - 'POST', - this.rootUrl + `/receipt/item/task/s`, - __body, - { - headers: __headers, - params: __params, - responseType: 'json' - }); - - return this.http.request(req).pipe( - __filter(_r => _r instanceof HttpResponse), - __map((_r) => { - return _r as __StrictHttpResponse; - }) - ); - } - /** - * Suche nach Bestellpostenstatus-Aufgaben - * @param queryToken Suchkriterien - */ - ReceiptQueryReceiptItemTasks(queryToken: QueryTokenDTO): __Observable { - return this.ReceiptQueryReceiptItemTasksResponse(queryToken).pipe( - __map(_r => _r.body as ListResponseArgsOfReceiptItemTaskListItemDTO) - ); - } - /** * Aufgabe auf erledigt setzen * @param taskId undefined diff --git a/generated/swagger/print-api/src/services/omsprint.service.ts b/generated/swagger/print-api/src/services/omsprint.service.ts index a7c57a092..eba0395d3 100644 --- a/generated/swagger/print-api/src/services/omsprint.service.ts +++ b/generated/swagger/print-api/src/services/omsprint.service.ts @@ -11,6 +11,7 @@ import { ResponseArgs } from '../models/response-args'; import { PrintRequestOfIEnumerableOfLong } from '../models/print-request-of-ienumerable-of-long'; import { PrintRequestOfIEnumerableOfDisplayOrderDTO } from '../models/print-request-of-ienumerable-of-display-order-dto'; import { PrintRequestOfIEnumerableOfPriceQRCodeDTO } from '../models/print-request-of-ienumerable-of-price-qrcode-dto'; +import { PrintRequestOfLong } from '../models/print-request-of-long'; @Injectable({ providedIn: 'root', }) @@ -25,6 +26,8 @@ class OMSPrintService extends __BaseService { static readonly OMSPrintReturnReceiptPath = '/print/return-receipt'; static readonly OMSPrintKleinbetragsrechnungPath = '/print/kleinbetragsrechnung'; static readonly OMSPrintKleinbetragsrechnungPdfPath = '/print/kleinbetragsrechnung/{receiptId}/pdf'; + static readonly OMSPrintTolinoRetourenscheinPath = '/print/tolino-retourenschein'; + static readonly OMSPrintTolinoRetourenscheinPdfPath = '/print/tolino-retourenschein/{receipItemtId}/pdf'; constructor( config: __Configuration, @@ -392,6 +395,78 @@ class OMSPrintService extends __BaseService { __map(_r => _r.body as Blob) ); } + + /** + * Tolino Retourenschein + * @param data Retourenbelegpostion PKs + */ + OMSPrintTolinoRetourenscheinResponse(data: PrintRequestOfLong): __Observable<__StrictHttpResponse> { + let __params = this.newParams(); + let __headers = new HttpHeaders(); + let __body: any = null; + __body = data; + let req = new HttpRequest( + 'POST', + this.rootUrl + `/print/tolino-retourenschein`, + __body, + { + headers: __headers, + params: __params, + responseType: 'json' + }); + + return this.http.request(req).pipe( + __filter(_r => _r instanceof HttpResponse), + __map((_r) => { + return _r as __StrictHttpResponse; + }) + ); + } + /** + * Tolino Retourenschein + * @param data Retourenbelegpostion PKs + */ + OMSPrintTolinoRetourenschein(data: PrintRequestOfLong): __Observable { + return this.OMSPrintTolinoRetourenscheinResponse(data).pipe( + __map(_r => _r.body as ResponseArgs) + ); + } + + /** + * Tolino Retourenschein PDF + * @param receipItemtId Retourenbelegposition PK + */ + OMSPrintTolinoRetourenscheinPdfResponse(receipItemtId: number): __Observable<__StrictHttpResponse> { + let __params = this.newParams(); + let __headers = new HttpHeaders(); + let __body: any = null; + + let req = new HttpRequest( + 'GET', + this.rootUrl + `/print/tolino-retourenschein/${encodeURIComponent(String(receipItemtId))}/pdf`, + __body, + { + headers: __headers, + params: __params, + responseType: 'blob' + }); + + return this.http.request(req).pipe( + __filter(_r => _r instanceof HttpResponse), + __map((_r) => { + return _r as __StrictHttpResponse; + }) + ); + } + /** + * Tolino Retourenschein PDF + * @param receipItemtId Retourenbelegposition PK + */ + OMSPrintTolinoRetourenscheinPdf(receipItemtId: number): __Observable { + return this.OMSPrintTolinoRetourenscheinPdfResponse(receipItemtId).pipe( + __map(_r => _r.body as Blob) + ); + } } module OMSPrintService { diff --git a/libs/common/print/src/lib/services/print.service.spec.ts b/libs/common/print/src/lib/services/print.service.spec.ts index 75c8ab137..d567d0e0f 100644 --- a/libs/common/print/src/lib/services/print.service.spec.ts +++ b/libs/common/print/src/lib/services/print.service.spec.ts @@ -143,7 +143,10 @@ describe('PrintService', () => { it('should fetch printers of the specified type', async () => { // Act - await spectator.service.print(PrinterType.LABEL, mockPrint); + await spectator.service.print({ + printerType: PrinterType.LABEL, + printFn: mockPrint, + }); // Assert expect(printSpy).toHaveBeenCalledWith(PrinterType.LABEL); @@ -151,7 +154,10 @@ describe('PrintService', () => { it('should attempt direct printing on desktop when a printer is selected', async () => { // Act - await spectator.service.print(PrinterType.LABEL, mockPrint); + await spectator.service.print({ + printerType: PrinterType.LABEL, + printFn: mockPrint, + }); // Assert expect(mockPrint).toHaveBeenCalledWith(mockPrinters[1]); @@ -160,10 +166,10 @@ describe('PrintService', () => { it('should return the selected printer after successful direct print', async () => { // Act - const result = await spectator.service.print( - PrinterType.LABEL, - mockPrint, - ); + const result = await spectator.service.print({ + printerType: PrinterType.LABEL, + printFn: mockPrint, + }); // Assert expect(result).toEqual({ printer: mockPrinters[1] }); @@ -175,7 +181,10 @@ describe('PrintService', () => { mockPrint.mockRejectedValueOnce(printError); // Act - await spectator.service.print(PrinterType.LABEL, mockPrint); + await spectator.service.print({ + printerType: PrinterType.LABEL, + printFn: mockPrint, + }); // Assert expect(mockDialogFn).toHaveBeenCalledWith({ @@ -192,7 +201,10 @@ describe('PrintService', () => { platform.ANDROID = true; // Act - await spectator.service.print(PrinterType.LABEL, mockPrint); + await spectator.service.print({ + printerType: PrinterType.LABEL, + printFn: mockPrint, + }); // Assert expect(mockPrint).not.toHaveBeenCalled(); @@ -204,7 +216,10 @@ describe('PrintService', () => { platform.IOS = true; // Act - await spectator.service.print(PrinterType.LABEL, mockPrint); + await spectator.service.print({ + printerType: PrinterType.LABEL, + printFn: mockPrint, + }); // Assert expect(mockPrint).not.toHaveBeenCalled(); @@ -221,7 +236,10 @@ describe('PrintService', () => { printSpy.mockResolvedValueOnce(printersWithoutSelection); // Act - await spectator.service.print(PrinterType.LABEL, mockPrint); + await spectator.service.print({ + printerType: PrinterType.LABEL, + printFn: mockPrint, + }); // Assert expect(mockPrint).not.toHaveBeenCalled(); @@ -233,7 +251,10 @@ describe('PrintService', () => { platform.ANDROID = true; // Force dialog to show // Act - await spectator.service.print(PrinterType.LABEL, mockPrint); + await spectator.service.print({ + printerType: PrinterType.LABEL, + printFn: mockPrint, + }); // Assert expect(mockDialogFn).toHaveBeenCalledWith({ @@ -252,10 +273,10 @@ describe('PrintService', () => { mockDialogClosedObservable.closed = of({ printer: selectedPrinter }); // Act - const result = await spectator.service.print( - PrinterType.LABEL, - mockPrint, - ); + const result = await spectator.service.print({ + printerType: PrinterType.LABEL, + printFn: mockPrint, + }); // Assert expect(result).toEqual({ printer: selectedPrinter }); @@ -267,10 +288,10 @@ describe('PrintService', () => { mockDialogClosedObservable.closed = of(undefined); // Act - const result = await spectator.service.print( - PrinterType.LABEL, - mockPrint, - ); + const result = await spectator.service.print({ + printerType: PrinterType.LABEL, + printFn: mockPrint, + }); // Assert expect(result).toEqual({ printer: undefined }); diff --git a/libs/common/print/src/lib/services/print.service.ts b/libs/common/print/src/lib/services/print.service.ts index 1d4ff7766..9fa2f70c8 100644 --- a/libs/common/print/src/lib/services/print.service.ts +++ b/libs/common/print/src/lib/services/print.service.ts @@ -48,18 +48,27 @@ export class PrintService { } /** - * Initiates a print operation with platform-specific optimizations - * On desktop, attempts to print directly using the default printer if available - * Falls back to showing a printer selection dialog if needed or on mobile devices + * Initiates a print operation with platform-specific optimizations. + * On desktop, attempts to print directly using the default printer if available. + * Falls back to showing a printer selection dialog if needed or on mobile devices. * - * @param printerType The type of printer to use (LABEL or OFFICE) - * @param printFn Function that performs the actual print operation with the selected printer - * @returns Object containing the selected printer or undefined if operation was cancelled + * @param printerType - The type of printer to use (LABEL or OFFICE). + * @param printFn - Function that performs the actual print operation with the selected printer. + * @param directPrint - (Optional) If true, forces direct print without showing the dialog. + * If false, always shows the print dialog. + * If undefined, uses direct print only on non-mobile platforms with a selected printer. + * @returns An object containing the selected printer if the operation was successful, + * or undefined if the operation was cancelled. */ - async print( - printerType: PrinterType, - printFn: (printer: Printer) => Promise, - ): Promise<{ printer?: Printer }> { + async print({ + printerType, + printFn, + directPrint, + }: { + printerType: PrinterType; + printFn: (printer: Printer) => Promise; + directPrint?: boolean | undefined; + }): Promise<{ printer?: Printer }> { // Get the list of printers based on the printer type const printers = await this.printers(printerType); @@ -69,10 +78,12 @@ export class PrintService { // and we can try to print directly to the selected printer. // If it fails, we show the print dialog with the error. const directPrintAllowed = - selectedPrinter && !(this.#platform.ANDROID || this.#platform.IOS); + directPrint === undefined + ? selectedPrinter && !(this.#platform.ANDROID || this.#platform.IOS) + : directPrint; let error: unknown | undefined = undefined; - if (directPrintAllowed) { + if (directPrintAllowed && selectedPrinter) { try { await printFn(selectedPrinter); return { printer: selectedPrinter }; diff --git a/libs/oms/data-access/src/lib/models/task-action-type.ts b/libs/oms/data-access/src/lib/models/task-action-type.ts index ed6793fca..33212e3ec 100644 --- a/libs/oms/data-access/src/lib/models/task-action-type.ts +++ b/libs/oms/data-access/src/lib/models/task-action-type.ts @@ -12,6 +12,7 @@ export type TaskActionTypeType = export interface TaskActionType { type: TaskActionTypeType; taskId: number; + receiptItemId?: number; updateTo?: Exclude; actions?: Array; } diff --git a/libs/oms/data-access/src/lib/services/index.ts b/libs/oms/data-access/src/lib/services/index.ts index f604eeb4c..f7452840e 100644 --- a/libs/oms/data-access/src/lib/services/index.ts +++ b/libs/oms/data-access/src/lib/services/index.ts @@ -4,3 +4,4 @@ export * from './print-receipts.service'; export * from './return-process.service'; export * from './return-search.service'; export * from './return-task-list.service'; +export * from './print-tolino-return-receipt.service'; diff --git a/libs/oms/data-access/src/lib/services/print-receipts.service.spec.ts b/libs/oms/data-access/src/lib/services/print-receipts.service.spec.ts index b0b686033..d42143d76 100644 --- a/libs/oms/data-access/src/lib/services/print-receipts.service.spec.ts +++ b/libs/oms/data-access/src/lib/services/print-receipts.service.spec.ts @@ -35,17 +35,19 @@ describe('PrintReceiptsService', () => { it('should call the print service with the correct parameters', async () => { const mockReturnReceiptIds = [1, 2, 3]; - mockPrintService.print.mockImplementation((printerType, callback) => { - expect(printerType).toBe(PrinterType.LABEL); - const mockPrinter: Printer = { - key: 'mockPrinterKey', - value: 'Mock Printer', - selected: true, - enabled: true, - description: 'Mock printer description', - }; - return callback(mockPrinter); - }); + mockPrintService.print.mockImplementation( + async ({ printerType, printFn }) => { + expect(printerType).toBe(PrinterType.LABEL); + const mockPrinter: Printer = { + key: 'mockPrinterKey', + value: 'Mock Printer', + selected: true, + enabled: true, + description: 'Mock printer description', + }; + return printFn(mockPrinter).then(() => ({ printer: mockPrinter })); + }, + ); mockOmsPrintService.OMSPrintReturnReceipt.mockReturnValue( of({ error: false }), @@ -56,8 +58,10 @@ describe('PrintReceiptsService', () => { }); expect(mockPrintService.print).toHaveBeenCalledWith( - expect.anything(), - expect.any(Function), + expect.objectContaining({ + printerType: PrinterType.LABEL, + printFn: expect.any(Function), + }), ); expect(mockOmsPrintService.OMSPrintReturnReceipt).toHaveBeenCalledWith({ printer: expect.any(String), diff --git a/libs/oms/data-access/src/lib/services/print-receipts.service.ts b/libs/oms/data-access/src/lib/services/print-receipts.service.ts index 86f58eb04..ad02bb95e 100644 --- a/libs/oms/data-access/src/lib/services/print-receipts.service.ts +++ b/libs/oms/data-access/src/lib/services/print-receipts.service.ts @@ -31,13 +31,16 @@ export class PrintReceiptsService { throw new Error('No return receipt IDs provided'); } - return this.#printService.print(PrinterType.LABEL, (printer) => { - return firstValueFrom( - this.#omsPrintService.OMSPrintReturnReceipt({ - printer: printer.key, - data: returnReceiptIds, - }), - ); + return this.#printService.print({ + printerType: PrinterType.LABEL, + printFn: (printer) => { + return firstValueFrom( + this.#omsPrintService.OMSPrintReturnReceipt({ + printer: printer.key, + data: returnReceiptIds, + }), + ); + }, }); } } diff --git a/libs/oms/data-access/src/lib/services/print-tolino-return-receipt.service.spec.ts b/libs/oms/data-access/src/lib/services/print-tolino-return-receipt.service.spec.ts new file mode 100644 index 000000000..84cf7b6a3 --- /dev/null +++ b/libs/oms/data-access/src/lib/services/print-tolino-return-receipt.service.spec.ts @@ -0,0 +1,77 @@ +import { SpectatorService, createServiceFactory } from '@ngneat/spectator/jest'; +import { PrintTolinoReturnReceiptService } from './print-tolino-return-receipt.service'; +import { OMSPrintService } from '@generated/swagger/print-api'; +import { PrintService, Printer, PrinterType } from '@isa/common/print'; +import { of } from 'rxjs'; + +describe('PrintTolinoReturnReceiptService', () => { + let spectator: SpectatorService; + + const createService = createServiceFactory({ + service: PrintTolinoReturnReceiptService, + mocks: [OMSPrintService, PrintService], + }); + + let mockPrintService: jest.Mocked; + let mockOmsPrintService: jest.Mocked; + + beforeEach(() => { + spectator = createService(); + mockPrintService = spectator.inject(PrintService); + mockOmsPrintService = spectator.inject(OMSPrintService); + }); + + it('should be created', () => { + expect(spectator.service).toBeTruthy(); + }); + + describe('printTolinoReturnReceipt', () => { + it('should throw an error if no return receipt ID is provided', async () => { + await expect( + spectator.service.printTolinoReturnReceipt({ + returnReceiptId: undefined as unknown as number, + }), + ).rejects.toThrow('No return receipt ID provided'); + }); + + it('should call the print service with the correct parameters', async () => { + const mockReturnReceiptId = 42; + + mockPrintService.print.mockImplementation( + async ({ printerType, printFn, directPrint }) => { + expect(printerType).toBe(PrinterType.OFFICE); + expect(directPrint).toBe(false); + const mockPrinter: Printer = { + key: 'mockPrinterKey', + value: 'Mock Printer', + selected: true, + enabled: true, + description: 'Mock printer description', + }; + return printFn(mockPrinter).then(() => ({ printer: mockPrinter })); + }, + ); + + mockOmsPrintService.OMSPrintTolinoRetourenschein.mockReturnValue( + of({ error: false }), + ); + + await spectator.service.printTolinoReturnReceipt({ + returnReceiptId: mockReturnReceiptId, + }); + + expect(mockPrintService.print).toHaveBeenCalledWith( + expect.objectContaining({ + printerType: PrinterType.OFFICE, + printFn: expect.any(Function), + }), + ); + expect( + mockOmsPrintService.OMSPrintTolinoRetourenschein, + ).toHaveBeenCalledWith({ + printer: expect.any(String), + data: mockReturnReceiptId, + }); + }); + }); +}); diff --git a/libs/oms/data-access/src/lib/services/print-tolino-return-receipt.service.ts b/libs/oms/data-access/src/lib/services/print-tolino-return-receipt.service.ts new file mode 100644 index 000000000..3ecda5672 --- /dev/null +++ b/libs/oms/data-access/src/lib/services/print-tolino-return-receipt.service.ts @@ -0,0 +1,44 @@ +import { inject, Injectable } from '@angular/core'; +import { OMSPrintService } from '@generated/swagger/print-api'; +import { PrinterType, PrintService } from '@isa/common/print'; +import { firstValueFrom } from 'rxjs'; + +@Injectable({ providedIn: 'root' }) +export class PrintTolinoReturnReceiptService { + #omsPrintService = inject(OMSPrintService); + #printService = inject(PrintService); + + /** + * Prints a Tolino return receipt using the office printer. + * + * @param params - The parameters for printing. + * @param params.returnReceiptId - The unique identifier of the return receipt to print. + * @returns A promise that resolves when the print job is completed. + * @throws {Error} If no return receipt ID is provided. + * + * @example + * await printTolinoReturnReceiptService.printTolinoReturnReceipt({ returnReceiptId: 123 }); + */ + async printTolinoReturnReceipt({ + returnReceiptId, + }: { + returnReceiptId: number; + }) { + if (!returnReceiptId) { + throw new Error('No return receipt ID provided'); + } + + return this.#printService.print({ + printerType: PrinterType.OFFICE, + printFn: (printer) => { + return firstValueFrom( + this.#omsPrintService.OMSPrintTolinoRetourenschein({ + printer: printer.key, + data: returnReceiptId, + }), + ); + }, + directPrint: false, + }); + } +} diff --git a/libs/oms/shared/task-list/src/lib/return-task-list/return-task-list-item/return-task-list-item.component.html b/libs/oms/shared/task-list/src/lib/return-task-list/return-task-list-item/return-task-list-item.component.html index 250053a38..1b5dfe5fc 100644 --- a/libs/oms/shared/task-list/src/lib/return-task-list/return-task-list-item/return-task-list-item.component.html +++ b/libs/oms/shared/task-list/src/lib/return-task-list/return-task-list-item/return-task-list-item.component.html @@ -1,4 +1,5 @@ + +@if (taskActionType === 'UNKNOWN') {
{{ processingComment() }}
- @if (!taskItem?.completed) { - @if (taskActionType !== 'UNKNOWN') { +} @else { +
+
+ {{ processingComment() }} +
+ @if (!taskItem?.completed) { + } @else { + + + Abgeschlossen + } - } @else { - - - Abgeschlossen - - } -
+ +} @if (taskActionType === 'UNKNOWN' && !taskItem?.completed) { -
+