medusa-invoice
Version:
Generate invoice from Medusa
200 lines • 17.8 kB
JavaScript
;
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;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZy1zbGlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3BhY2tpbmctc2xpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFnRjtBQUNoRiw2Q0FBdUQ7QUFDdkQsMkNBQThDO0FBQzlDLHlEQUFxRDtBQUNyRCxtRUFBK0Q7QUFHL0QseURBQWdFO0FBQ2hFLGdGQUc2QztBQUU3QyxpREFBb0U7QUFFcEUsTUFBcUIsa0JBQW1CLFNBQVEsK0JBQXNCO0lBSXBFLFlBQVksU0FBUztRQUNuQixLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO1FBQzNDLElBQUksQ0FBQyxrQ0FBa0M7WUFDckMsU0FBUyxDQUFDLGtDQUFrQyxDQUFDO0lBQ2pELENBQUM7SUFFTyxxQkFBcUIsQ0FDM0IsMkJBQXdEO1FBRXhELElBQ0UsMkJBQTJCO1lBQzNCLDJCQUEyQixDQUFDLGFBQWEsRUFDekM7WUFDQSxPQUFPLDJCQUEyQixDQUFDLGFBQWEsQ0FBQztTQUNsRDtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxxQkFBcUIsQ0FDM0IsMkJBQXdEO1FBRXhELElBQUksMkJBQTJCLElBQUksMkJBQTJCLENBQUMsUUFBUSxFQUFFO1lBQ3ZFLE9BQU8sMkJBQTJCLENBQUMsUUFBbUMsQ0FBQztTQUN4RTtRQUNELE9BQU8sdUNBQXVCLENBQUMsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYTtRQUN6QixNQUFNLGVBQWUsR0FBdUIsTUFBTSxJQUFJLENBQUMsY0FBYzthQUNsRSxhQUFhLENBQUMsMEJBQVcsQ0FBQzthQUMxQixrQkFBa0IsQ0FBQyxPQUFPLENBQUM7YUFDM0IsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUM7YUFDN0IsTUFBTSxFQUFFLENBQUM7UUFDWixJQUFJLGVBQWUs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