diff --git a/pass/app/Payment.js b/pass/app/Payment.js index 16be80e39ed1e63d5d265ca73377e38ed8e4c707..13f48adf87900671c5fe74564cd0220f68d9222d 100644 --- a/pass/app/Payment.js +++ b/pass/app/Payment.js @@ -115,6 +115,14 @@ class Payment { * @returns {boolean} */ isRefundAllowed() { + if (!config.get("app.zammad.refund_enabled")) { + return false; + } + // Check if Payment is older than 30 days + let minDate = dayjs().add(-30, "days"); + if (this.created_at.isBefore(minDate)) { + return false; + } return this.payment_processor.isRefundSupported(); } diff --git a/pass/app/Zammad.js b/pass/app/Zammad.js index c4f693a0790c19f26bbf4e06919a26c467f02811..cc7dc9ea3e3c675244d1f813bafa0176e2f2a5bd 100644 --- a/pass/app/Zammad.js +++ b/pass/app/Zammad.js @@ -14,7 +14,7 @@ class Zammad { static async CREATE_NOTIFICATION(token_amount, price, payment_method) { // Check if notifications are turned on try { - if (config.get("app.zammad.enabled")) { + if (config.get("app.zammad.notification_enabled")) { let zammad_url = config.get("app.zammad.url") + "/api/v1/ticket_articles"; let zammad_data = { @@ -48,6 +48,55 @@ class Zammad { return false; } } + + /** + * Creates a notification in the configured Zammad instance + * + * @param {string} message + * + * @returns {Promise<boolean>} + */ + static async CREATE_REFUND_TICKET(message, payment_reference_id) { + // Check if notifications are turned on + try { + if (config.get("app.zammad.refund_enabled")) { + let zammad_url = config.get("app.zammad.url") + "/api/v1/tickets"; + let subject = `Erstattung (${payment_reference_id})`; + let zammad_data = { + "title": subject, + "group": "Tokens", + "customer_id": "guess:noreply@metager.de", + "preferences": { "channel_id": 3 }, + "article": { + "type": "note", + "sender": "Customer", + "subject": subject, + "body": message, + "content_type": "text/html", + "internal": false + } + } + return fetch(zammad_url, { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Token ${config.get("app.zammad.api_key")}` + }, + body: JSON.stringify(zammad_data) + }).then(response => { + return true; + }).catch(e => { + console.error(e); + return false; + }) + } else { + return true; + } + } catch (e) { + console.error(e); + return false; + } + } } module.exports = Zammad; \ No newline at end of file diff --git a/pass/config/default.json b/pass/config/default.json index 9c6bac7411c61f32037a8bf4d888cf29a5ef7a8b..ab0ce522288a265a839e80ace8bd892517722348 100644 --- a/pass/config/default.json +++ b/pass/config/default.json @@ -23,7 +23,8 @@ "api_key": "<OSTICKET_API_KEY>" }, "zammad": { - "enabled": false, + "notification_enabled": false, + "refund_enabled": true, "url": "<ZAMMAD_URL>", "api_key": "<ZAMMAD_API_KEY>", "notification_ticket_id": "0" diff --git a/pass/routes/orders/refund.js b/pass/routes/orders/refund.js index a8ad077504935441bb7c1646e9baab5d8432da16..714e38eee3c2905cea1222c747d7d4c05eab8597 100644 --- a/pass/routes/orders/refund.js +++ b/pass/routes/orders/refund.js @@ -3,6 +3,7 @@ var router = express.Router({ mergeParams: true }); const config = require("config"); const Key = require("../../app/Key"); +const Zammad = require("../../app/Zammad"); // Base URL: /key/:key/orders/:order/refund router.use("/", (req, res, next) => { @@ -44,36 +45,16 @@ router.post("/", (req, res, next) => { let message = ejs.render(template, req.data); - // No validation errors. Try to create a new Ticket - return fetch(`${config.get("app.osticket.url")}/api/tickets.json`, { - method: "post", - headers: { - "X-API-Key": config.get("app.osticket.api_key"), - "Content-Type": "application/json", - }, - body: JSON.stringify({ - alert: true, - autorespond: false, - source: "API", - name: "Metzgermeister Unbekannt", - email: "no-reply@metager.de", - subject: `MetaGer Schlüssel: Erstattung (${req.data.order.payment.public_id})`, - message: `data:text/html;charset=utf-8,${message}`, - topicId: 12, // ToDo change topic for english autoresponder - }), + return Zammad.CREATE_REFUND_TICKET(message, req.data.order.payment.public_id).then(success => { + if (success) { + return Key.GET_KEY(req.data.key.key.get_key(), true); + } else { + return Promise.reject("Fehler beim Erstellen der Benachrichtigung,"); + } + }).then((key) => { + key.discharge_key(req.data.order.refund.count, req.data.order.payment_reference.id); + return key.save(); }) - .then(async (response) => { - if (response.status != 201) { - console.error(await response.text()); - return Promise.reject("Fehler beim Erstellen der Benachrichtigung,"); - } else { - return Key.GET_KEY(req.data.key.key.get_key(), true); - } - }) - .then((key) => { - key.discharge_key(req.data.order.refund.count, req.data.order.payment_reference.id); - return key.save(); - }) .then((new_key) => { req.data.key.key = new_key; req.data.order.refund.success = true;