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 = `${order.contactInformation.emailAddress}`;
$("#contact-info-phoneNumber").innerHTML = `${order.contactInformation.phoneNumber}`;
$("#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 = `Åpne bestillingen i Vipps-portalen`;
$("#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);
});
}
}