aboutsummaryrefslogtreecommitdiffstats
path: root/src/wwwroot/scripts/back/bestillinger.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/wwwroot/scripts/back/bestillinger.js')
-rw-r--r--src/wwwroot/scripts/back/bestillinger.js321
1 files changed, 321 insertions, 0 deletions
diff --git a/src/wwwroot/scripts/back/bestillinger.js b/src/wwwroot/scripts/back/bestillinger.js
new file mode 100644
index 0000000..17b56d5
--- /dev/null
+++ b/src/wwwroot/scripts/back/bestillinger.js
@@ -0,0 +1,321 @@
+import Grid from "../grid";
+import {strings} from "../i10n";
+import {$, doc, pageInit, toaster} from "../base";
+import {eyeIcon} from "../icons";
+import {utilites} from "../utilities";
+import {messages} from "../messages";
+import {cancelOrder, captureVippsOrder, getOrderDetails, getOrders, refundOrder} from "../api/order-api";
+import Modal from "bootstrap/js/src/modal";
+
+if (location.pathname.startsWith("/kontoret/bestillinger")) {
+ const ordersLoader = $("#orders-loader");
+ const ordersWrapper = $("#orders-wrapper");
+ const orderInfoModalEl = $("#order-info-modal");
+ const orderInfoModal = new Modal(orderInfoModalEl);
+
+ const grid = new Grid({
+ search: {
+ dataIds: ["orderReference", ["contactInfo", "name"], ["contactInfo", "emailAddress"], ["contactInfo", "phoneNumber"]],
+ },
+ strings: {
+ search: strings.languageSpesific.search,
+ nextPage: strings.languageSpesific.next_page,
+ previousPage: strings.languageSpesific.previous_page,
+ },
+ debug: location.href.includes("localhost"),
+ classes: {
+ table: "table table-bordered mt-3",
+ thead: "table-primary",
+ },
+ columns: [
+ {
+ dataId: "orderReference",
+ minWidth: "150px",
+ columnName: "Referanse",
+ className: "btn-link cursor-pointer",
+ click: (row) => openViewOrderModal(row),
+ },
+ {
+ columnName: "Navn",
+ dataId: ["contactInfo", "name"],
+ minWidth: "200px",
+ },
+ {
+ columnName: "E-postadresse",
+ dataId: ["contactInfo", "emailAddress"],
+ minWidth: "200px",
+ },
+ {
+ columnName: "Telefonnummer",
+ dataId: ["contactInfo", "phoneNumber"],
+ minWidth: "150px",
+ },
+ {
+ dataId: "created",
+ minWidth: "175px",
+ cellValue: (row) => utilites.toReadableDateString(new Date(row.created)),
+ columnName: "Dato",
+ },
+ {
+ minWidth: "150px",
+ columnName: "Status",
+ cellValue: (row) => {
+ const status = doc.createElement("span");
+ switch (row.status) {
+ case 0: {
+ status.innerText = "Pågående";
+ break;
+ }
+ case 1: {
+ status.innerText = "Kansellert";
+ break;
+ }
+ case 2: {
+ status.innerText = "Feilet";
+ status.classList.add("text-danger");
+ break;
+ }
+ case 3: {
+ status.innerText = "Fullført";
+ status.classList.add("text-success");
+ break;
+ }
+ case 4: {
+ status.innerText = "Venter på faktura";
+ break;
+ }
+ case 5: {
+ status.innerText = "Venter på vipps";
+ break;
+ }
+ }
+ return status;
+ },
+ },
+ {
+ columnName: "",
+ width: "40px",
+ minWidth: "40px",
+ cellValue: (row) => {
+ const viewOrder = doc.createElement("button");
+ viewOrder.className = "btn btn-link text-info shadow-none";
+ viewOrder.title = strings.languageSpesific.view + ` "${row.orderReference}"`;
+ viewOrder.innerHTML = eyeIcon();
+ viewOrder.onclick = () => openViewOrderModal(row);
+ return viewOrder;
+ },
+ },
+ ],
+ });
+
+ if (location.pathname.startsWith("/kontoret/bestillinger")) {
+ pageInit(() => {
+ renderProductsView();
+ });
+ }
+
+ function openViewOrderModal({id, orderReference}) {
+ orderInfoModalEl.querySelector(".modal-title").innerText = orderReference;
+ $("#loader").style.display = "";
+ $("#loaded").style.display = "none";
+
+ orderInfoModal.show();
+
+ getOrderDetails(id).then(res => {
+ if (res.ok) {
+ res.json().then(order => {
+ order = utilites.resolveReferences(order);
+ $("#contact-info-name").innerText = order.contactInformation.name;
+ $("#contact-info-emailAddress").innerHTML = `<a href='mailto:${order.contactInformation.emailAddress}'>${order.contactInformation.emailAddress}</a>`;
+ $("#contact-info-phoneNumber").innerHTML = `<a href='tel:${order.contactInformation.phoneNumber}'>${order.contactInformation.phoneNumber}</a>`;
+ $("#order-reference").innerText = order.orderReference;
+ $("#order-date").innerText = new Date(order.orderDate).toLocaleDateString();
+ $("#order-payment-type").innerText = utilites.getOrderPaymentName(order.paymentType);
+ $("#order-status").innerText = utilites.getOrderStatusName(order.status);
+ if (order.comment && order.comment !== "") {
+ $("#order-comment").innerText = order.comment;
+ $("#order-comment").style.display = "inline-block";
+ } else {
+ $("#order-comment").style.display = "none";
+ }
+
+ if (order.paymentType === 0) {
+ if ([
+ "SALE",
+ "RESERVED",
+ ].includes(order.vippsTransactionStatus)) {
+ $("#vipps-order-refund").classList.remove("d-none");
+ $("#vipps-order-refund").onclick = () => {
+ if (confirm("Er du sikker på at du vil refundere ordren " + order.orderReference)) {
+ $("#vipps-order-refund").classList.add("loading");
+ refundOrder(order.id).then(res => {
+ if (res.ok) {
+ toaster.success("Refundert", "Ordren er refundert, og vipps har startet refundering");
+ } else {
+ console.error("Received non-successful status code when submitting refund order command");
+ toaster.error("En feil oppstod", "Prøv å refundere i vipps portalen");
+ }
+ $("#vipps-order-refund").classList.remove("loading");
+ }).catch(err => {
+ $("#vipps-order-refund").classList.remove("loading");
+
+ console.error("refund order NetworkRequest failed");
+ toaster.error("En uventet feil oppstod");
+ console.error(err);
+ });
+ }
+ };
+ }
+
+ if ([
+ "SALE",
+ "RESERVED",
+ ].includes(order.vippsTransactionStatus)) {
+ $("#vipps-order-capture").classList.remove("d-none");
+ $("#vipps-order-capture").onclick = () => {
+ if (confirm("Er du sikker på at du vil fullføre ordren " + order.orderReference)) {
+ $("#vipps-order-capture").classList.add("loading");
+ captureVippsOrder(order.id).then(res => {
+ if (res.ok) {
+ toaster.success("Fullført", "Ordren er fullført, og vipps har registrert transaksjonen");
+ } else {
+ console.error("Received non-successful status code when submitting fulfill order command");
+ toaster.error("En feil oppstod", "Prøv å fullføre i vipps portalen");
+ }
+ $("#vipps-order-capture").classList.remove("loading");
+ }).catch(err => {
+ $("#vipps-order-capture").classList.remove("loading");
+ console.error("fulfill order NetworkRequest failed");
+ toaster.error("En uventet feil oppstod");
+ console.error(err);
+ });
+ }
+ };
+ }
+
+ if ([
+ "SALE",
+ "RESERVED",
+ ].includes(order.vippsTransactionStatus)) {
+ $("#vipps-order-cancel").classList.remove("d-none");
+ $("#vipps-order-cancel").onclick = () => {
+ if (confirm("Er du sikker på at du vil kansellere ordren " + order.orderReference)) {
+ $("#vipps-order-cancel").classList.add("loading");
+ cancelOrder(order.id).then(res => {
+ if (res.ok) {
+ toaster.success("Kansellert", "Ordren er kansellert");
+ } else {
+ console.error("Received non-successful status code when submitting cancel order command");
+ toaster.error("En feil oppstod", "Prøv å kansellere i vipps portalen");
+ }
+ $("#vipps-order-cancel").classList.remove("loading");
+ }).catch(err => {
+ $("#vipps-order-cancel").classList.remove("loading");
+ console.error("cancel order NetworkRequest failed");
+ toaster.error("En uventet feil oppstod");
+ console.error(err);
+ });
+ }
+ };
+ }
+
+
+ switch (order.vippsTransactionStatus) {
+ case "SALE":
+ $("#vipps-status").innerText = "Salg (fullført og overført)";
+ break;
+ case "RESERVED":
+ $("#vipps-status").innerText = "Reservert";
+ break;
+ case "CANCELLED":
+ $("#vipps-status").innerText = "Kansellert";
+ break;
+ case "REJECTED":
+ $("#vipps-status").innerText = "Avslått";
+ break;
+ case "SALE_FAILED":
+ $("#vipps-status").innerText = "Salg feilet";
+ break;
+ case "AUTO_CANCEL":
+ $("#vipps-status").innerText = "Automatisk kansellering";
+ break;
+ case "RESERVE_FAILED":
+ $("#vipps-status").innerText = "Reservering feilet";
+ break;
+ }
+ $("#vipps-link").innerHTML = `<a href='https://portal.vipps.no/61861/transactions/${order.vippsId}' target="_blank">Åpne bestillingen i Vipps-portalen</a>`;
+ $("#vipps-section").classList.remove("d-none");
+ } else {
+ $("#vipps-section").classList.add("d-none");
+ }
+
+ orderInfoModalEl.querySelector(".modal-body").style.display = "";
+
+ const productsBody = orderInfoModalEl.querySelector("tbody");
+ productsBody.innerHTML = "";
+ let productIndex = 1;
+ let totalPrice = 0;
+ for (const product of order.products) {
+ const rowItem = doc.createElement("tr");
+ const nrCell = doc.createElement("td");
+ nrCell.innerText = productIndex.toString();
+ const nameCell = doc.createElement("td");
+ nameCell.innerText = product.name;
+ const countCell = doc.createElement("td");
+ countCell.innerText = product.count;
+ const priceCell = doc.createElement("td");
+ const totalSum = product.payedPrice * product.count;
+ priceCell.innerText = `${product.payedPrice} (totalt: ${totalSum})`;
+
+ rowItem.appendChild(nrCell);
+ rowItem.appendChild(nameCell);
+ rowItem.appendChild(countCell);
+ rowItem.appendChild(priceCell);
+ productsBody.appendChild(rowItem);
+ productIndex++;
+ totalPrice += totalSum;
+ }
+ $("#order-total").innerText = totalPrice;
+ $("#loader").style.display = "none";
+ $("#loaded").style.display = "";
+ orderInfoModal.show();
+ });
+ } else {
+ toaster.error("En feil oppstod", "Kunne ikke hente ordren, prøv igjen snart!");
+ }
+ }).catch(error => {
+ console.error(error);
+ });
+ }
+
+ function renderProductsView() {
+ ordersWrapper.innerHTML = "";
+ ordersWrapper.classList.add("d-none");
+ ordersLoader.classList.remove("d-none");
+
+ getOrders("not-cancelled").then(res => {
+ if (res.ok) {
+ res.json().then(products => {
+ grid.render(ordersWrapper);
+ products = utilites.resolveReferences(products);
+ grid.refresh(products);
+ const queryOrderRef = new URL(location.href).searchParams.get("order");
+ if (queryOrderRef) {
+ const product = products.find(c => c.orderReference === queryOrderRef);
+ openViewOrderModal(product);
+ }
+ });
+ ordersWrapper.classList.remove("d-none");
+ ordersLoader.classList.add("d-none");
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.could_not_retrieve_orders,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ }
+ }).catch(error => {
+ console.error(error);
+ toaster.errorObj(messages.networkRequestFailed);
+ });
+ }
+}