UNPKG

@rsc-labs/medusa-documents

Version:
187 lines (186 loc) 9.72 kB
"use strict"; /* * Copyright 2024 RSC-Labs, https://rsoftcon.com/ * * MIT License * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); const medusa_1 = require("@medusajs/medusa"); const medusa_2 = require("@medusajs/medusa"); const utils_1 = require("@medusajs/utils"); const packing_slip_1 = require("../models/packing-slip"); const document_settings_1 = require("../models/document-settings"); const template_kind_1 = require("./types/template-kind"); const packing_slip_generator_1 = require("./generators/packing-slip-generator"); const constants_1 = require("./types/constants"); class PackingSlipService extends medusa_1.TransactionBaseService { constructor(container) { super(container); this.orderService = container.orderService; this.documentPackingSlipSettingsService = container.documentPackingSlipSettingsService; } calculateFormatNumber(documentPackingSlipSettings) { if (documentPackingSlipSettings && documentPackingSlipSettings.number_format) { return documentPackingSlipSettings.number_format; } return undefined; } calculateTemplateKind(documentPackingSlipSettings) { if (documentPackingSlipSettings && documentPackingSlipSettings.template) { return documentPackingSlipSettings.template; } return template_kind_1.PackingSlipTemplateKind.BASIC; } async getNextNumber() { const lastPackingSlip = await this.activeManager_ .getRepository(packing_slip_1.PackingSlip) .createQueryBuilder('packs') .orderBy('created_at', 'DESC') .getOne(); if (lastPackingSlip !== null && lastPackingSlip !== undefined) { return (parseInt(lastPackingSlip.number) + 1).toString(); } return '1'; } async getLastDocumentSettings() { const documentSettingsRepository = this.activeManager_.getRepository(document_settings_1.DocumentSettings); const lastDocumentSettings = await documentSettingsRepository.createQueryBuilder('documentSettings') .leftJoinAndSelect("documentSettings.store_address", "store_address") .orderBy('documentSettings.created_at', 'DESC') .getOne(); if (lastDocumentSettings === null) { return undefined; } return lastDocumentSettings; } async getPackingSlip(packingSlipId, includeBuffer = false) { if (includeBuffer) { const packingSlip = await this.activeManager_ .getRepository(packing_slip_1.PackingSlip) .createQueryBuilder('packslip') .leftJoinAndSelect("packslip.document_settings", "document_settings") .leftJoinAndSelect("document_settings.store_address", "store_address") .leftJoinAndSelect("packslip.document_packing_slip_settings", "document_packing_slip_settings") .leftJoinAndSelect("packslip.order", "order") .where("packslip.id = :packingSlipId", { packingSlipId: packingSlipId }) .getOne(); if (packingSlip && packingSlip !== null && packingSlip.document_settings) { const order = await this.orderService.retrieveWithTotals(packingSlip.order.id, { relations: ['billing_address', 'shipping_address', 'shipping_methods', 'shipping_methods.shipping_option'] }); const calculatedTemplateKind = this.calculateTemplateKind(packingSlip.document_packing_slip_settings); const buffer = await (0, packing_slip_generator_1.generate)(calculatedTemplateKind, packingSlip.document_settings, packingSlip, order); return { packingSlip: packingSlip, buffer: buffer }; } } const packingSlip = await this.activeManager_ .getRepository(packing_slip_1.PackingSlip) .createQueryBuilder('packslip') .where("packslip.id = :packingSlipId", { packingSlipId: packingSlipId }) .getOne(); if (packingSlip && packingSlip !== null) { return { packingSlip: packingSlip }; } return { packingSlip: undefined, buffer: undefined }; } async create(orderId) { const order = await this.orderService.retrieveWithTotals(orderId, { relations: ['billing_address', 'shipping_address', 'shipping_methods', 'shipping_methods.shipping_option'] }); if (order) { const settings = await this.getLastDocumentSettings(); if (settings) { const packingSlipSettings = await this.documentPackingSlipSettingsService.getLastDocumentPackingSlipSettings(); if (packingSlipSettings) { const calculatedTemplateKind = this.calculateTemplateKind(packingSlipSettings); const [validationPassed, info] = (0, packing_slip_generator_1.validateInputForProvidedKind)(calculatedTemplateKind, settings); if (validationPassed) { const nextNumber = await this.getNextNumber(); const newEntry = this.activeManager_.create(packing_slip_1.PackingSlip); newEntry.number = nextNumber; const packingSlipFormatNumber = this.calculateFormatNumber(packingSlipSettings); newEntry.display_number = packingSlipFormatNumber ? packingSlipFormatNumber.replace(constants_1.PACKING_SLIP_NUMBER_PLACEHOLDER, newEntry.number) : newEntry.number; newEntry.order = order; newEntry.document_settings = settings; newEntry.document_packing_slip_settings = packingSlipSettings; const resultInvoice = await this.activeManager_.getRepository(packing_slip_1.PackingSlip).save(newEntry); const metaDataUpdate = (0, medusa_1.setMetadata)(order, { packing_slip_id: resultInvoice.id }); order.metadata = metaDataUpdate; await this.activeManager_.getRepository(medusa_2.Order).save(order); const buffer = await (0, packing_slip_generator_1.generate)(calculatedTemplateKind, settings, resultInvoice, order); return { packingSlip: newEntry, buffer: buffer }; } else { throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, info); } } else { throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, 'Retrieve packing slip settings failed. Please check if they are set - e.g. if you set template or other settings.'); } } else { throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, 'Retrieve document settings failed. Please check if they are set.'); } } else { throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, 'Cant retrieve order'); } } async generatePreview(templateKind) { const lastOrder = await this.activeManager_.getRepository(medusa_2.Order).find({ skip: 0, take: 1, order: { created_at: "DESC" }, }); if (lastOrder && lastOrder.length > 0) { const lastOrderWithTotals = await this.orderService.retrieveWithTotals(lastOrder[0].id, { relations: ['billing_address', 'shipping_address', 'shipping_methods', 'shipping_methods.shipping_option'] }); const settings = await this.getLastDocumentSettings(); if (settings) { const previewPackingSlip = this.activeManager_.create(packing_slip_1.PackingSlip); const nextNumber = await this.getNextNumber(); previewPackingSlip.number = nextNumber; previewPackingSlip.display_number = nextNumber; previewPackingSlip.created_at = new Date(Date.now()); const [validationPassed, info] = (0, packing_slip_generator_1.validateInputForProvidedKind)(templateKind, settings); if (validationPassed) { const buffer = await (0, packing_slip_generator_1.generate)(templateKind, settings, previewPackingSlip, lastOrderWithTotals); return { packingSlip: previewPackingSlip, buffer: buffer }; } else { throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, info); } } else { throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, 'Document settings are not defined'); } } else { throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, 'You need to have at least one order to see preview'); } } } exports.default = PackingSlipService;