import { Inject, Injectable, OnApplicationBootstrap } from '@nestjs/common'; import { DocumentLineItem, DocumentLineItemStatusChangedEvent, DocumentStatusType, EventBus, Logger, PhoenixPlugin, PluginCommonModule } from '@phoenix/core'; // Example service for the plugin @Injectable() export class AmplidService { getPluginInfo() { return { name: 'AmplidPlugin', version: '1.0.0', description: '' }; } } // The main plugin class using the PhoenixPlugin decorator @PhoenixPlugin({ imports: [PluginCommonModule], controllers: [], providers: [AmplidService], exports: [AmplidService] }) export class AmplidPlugin implements OnApplicationBootstrap { private customFieldForBestellteMenge = 'bestelltemenge'; //bestellteMenge @Inject(EventBus) private readonly eventBus!: EventBus; private readonly logger = Logger.forContext(this); // Required static init method for Phoenix plugins static init(): typeof AmplidPlugin { console.log('AmplidPlugin initialized'); return AmplidPlugin; } async onApplicationBootstrap() { this.setupEvents(); } setupEvents() { this.eventBus.registerBlockingEventHandler(DocumentLineItemStatusChangedEvent, { id: 'amplid-plugin-document-line-item-status-changed', handler: async (event) => { if (event.newStatus == DocumentStatusType.COMPLETED) { if (!event.dli) { this.logger.error(`DocumentLineItem not found in event`, "AMPLID PLUGIN"); return; } let bestellteMenge = +event.dli.customFields?.[this.customFieldForBestellteMenge]; if (bestellteMenge && bestellteMenge > 0) { if (bestellteMenge == event.dli.quantity && event.dli.openQuantity == 0) { //we are good, we can keep it being completed this.logger.info(`Keeping status as completed for DocumentLineItem ${event.dli.id} because bestellteMenge ${bestellteMenge} is equal to quantity ${event.dli.quantity} and openQuantity ${event.dli.openQuantity}`); } else { //we need to change the status to inwork this.logger.info(`Changing status to inwork for DocumentLineItem ${event.dli.id} because bestellteMenge ${bestellteMenge} is not equal to quantity ${event.dli.quantity} and openQuantity ${event.dli.openQuantity}`); event.dli.status = DocumentStatusType.INWORK; await DocumentLineItem.update(event.dli.id, { status: DocumentStatusType.INWORK }); } } else { this.logger.info(`Keeping status as completed for DocumentLineItem ${event.dli.id} because bestelltemenge ${bestellteMenge} is not set`); } } }, }); } }