AJenbo/agcms

View on GitHub
source/javascript/admin/invoice.js

Summary

Maintainability
C
1 day
Test Coverage
import xHttp from "../xHttp.js";
import {genericCallback, reloadCallback, getSelectValue} from "./javascript.js";
import {getAddress, changeZipCode} from "../getAddress.js";

var invoiceLines = [];
var invoiceAmount = 0;
var validemailajaxcall = null;
var lastemail = "";

function redirectToInvoice(data) {
    window.location.href = "/admin/invoices/" + data.id + "/";
}

function copytonew(id) {
    $("loading").style.visibility = "";
    xHttp.request("/admin/invoices/" + id + "/clone/", redirectToInvoice, "POST");
    return false;
}

function addRow() {
    var tr = document.createElement("tr");
    var td = document.createElement("td");
    td.innerHTML =
        "<input name=\"quantitie\" style=\"width:58px;\" class=\"tal\" onkeyup=\"prisUpdate()\" onchange=\"prisUpdate()\" onblur=\"prisUpdate()\" />";
    tr.appendChild(td);
    td = document.createElement("td");
    td.innerHTML =
        "<input name=\"product\" style=\"width:303px;\" onkeyup=\"prisUpdate()\" onchange=\"prisUpdate()\" onblur=\"prisUpdate()\" />";
    tr.appendChild(td);
    td = document.createElement("td");
    td.innerHTML =
        "<input name=\"value\" style=\"width:69px;\" class=\"tal\" onkeyup=\"prisUpdate()\" onchange=\"prisUpdate()\" onblur=\"prisUpdate()\" />";
    tr.appendChild(td);
    td = document.createElement("td");
    td.className = "tal total";
    tr.appendChild(td);
    td = document.createElement("td");
    td.style.border = "0";
    td.style.fontWeight = "bold";
    td.innerHTML =
        "<a href=\"#\" onclick=\"return removeRow(this)\"><img alt=\"X\" src=\"/theme/default/images/admin/cross.png\" height=\"16\" width=\"16\" title=\"Remove Line\" /></a>";
    tr.appendChild(td);
    $("vareTable").appendChild(tr);
}

function numberFormat(number) {
    return number.toFixed(2).toString().replace(/\./, ",");
}

function prisUpdate() {
    invoiceLines = [];
    invoiceAmount = 0;

    var titles = document.getElementsByName("product");
    var values = document.getElementsByName("value");
    var quantities = document.getElementsByName("quantitie");
    var totals = $$(".total");
    var premoms = $("premoms").checked;
    var momssats = parseFloat($("momssats").value);

    var netto = 0;
    var quantity = 0;
    var value = 0;
    var total = 0;

    for (var i = 0; i < quantities.length; i++) {
        quantity = parseInt(quantities[i].value);
        if (isNaN(quantity)) {
            quantity = 0;
        }

        value = parseFloat(parseFloat(values[i].value.replace(/[^-0-9,]/g, "").replace(/,/, ".")).toFixed(2));
        if (isNaN(value)) {
            value = 0;
        }

        total = quantity * value;

        totals[i].innerText = "";
        if (total !== 0) {
            totals[i].innerText = numberFormat(total);
        }

        netto += premoms ? (total / 1.25) : total;

        if (quantity || titles[i].value !== "" || value) {
            invoiceLines.push({quantity, "title": titles[i].value, value});
        }
    }

    $("netto").innerText = numberFormat(netto);

    $("moms").innerText = numberFormat(netto * momssats);

    var fragt = parseFloat($("fragt").value.replace(/[^-0-9,]/g, "").replace(/,/, "."));
    if (isNaN(fragt)) {
        fragt = 0;
    }

    const payamount = parseFloat(fragt + netto + netto * momssats);
    $("payamount").innerText = numberFormat(payamount);
    invoiceAmount = payamount.toFixed(2);

    if (!quantities.length || quantities[quantities.length - 1].value !== "" ||
        titles[titles.length - 1].value !== "" || values[values.length - 1].value !== "") {
        addRow();
    }

    return true;
}

function removeRow(row) {
    $("vareTable").removeChild(row.parentNode.parentNode);
    if ($("vareTable").childNodes.length === 0) {
        addRow();
    }
    prisUpdate();
    return false;
}

function setVisabilityForSendAction(data) {
    $("emaillink").style.display = data.isValid ? "" : "none";
    $("loading").style.visibility = "hidden";
}

function valideMail() {
    if (!$("emaillink")) {
        return;
    }

    if (!$("email").value.match("^[A-z0-9_.-]+@([A-z0-9-]+\\.)+[A-z0-9-]+$")) {
        setVisabilityForSendAction({"isValid": false});
        return;
    }

    if ($("email").value !== lastemail || $("emaillink").style.display === "none") {
        lastemail = $("email").value;
        xHttp.cancel(validemailajaxcall);
        $("loading").style.visibility = "";
        setVisabilityForSendAction({"isValid": false});

        validemailajaxcall = xHttp.request("/admin/addressbook/validEmail/?email=" + encodeURIComponent(lastemail),
                                           setVisabilityForSendAction, "GET");
    }
}

function injectInvoiceAddress(data) {
    if (!data.error) {
        $("navn").value = data.name;
        $("attn").value = data.attn;
        $("adresse").value = data.address1;
        $("postnr").value = data.zipcode;
        changeZipCode(data.zipcode, "land", "by");
        $("postbox").value = data.postbox;
        if (!$("email").value) {
            $("email").value = data.email;
            valideMail();
        }
    }
    $("loading").style.visibility = "hidden";
}

function getInvoiceAddress(tlf) {
    $("loading").style.visibility = "";
    getAddress(tlf, injectInvoiceAddress);
}

function injectInvoiceDeliverAddress(data) {
    if (!data.error) {
        $("postname").value = data.name;
        $("postattn").value = data.attn;
        $("postaddress").value = data.address1;
        $("postaddress2").value = data.address2;
        $("postpostalcode").value = data.zipcode;
        changeZipCode(data.zipcode, "postcountry", "postcity");
        $("postpostbox").value = data.postbox;
    }
    $("loading").style.visibility = "hidden";
}

function getAltAddress(tlf) {
    $("loading").style.visibility = "";
    getAddress(tlf, injectInvoiceDeliverAddress);
}

function reloadPage(date) {
    window.location.reload();
}

function pbsconfirm(id) {
    $("loading").style.visibility = "";
    // TODO save comment
    xHttp.request("/admin/invoices/payments/" + id + "/", reloadPage, "POST");
    return false;
}

function annul(id) {
    $("loading").style.visibility = "";
    // TODO save comment
    xHttp.request("/admin/invoices/payments/" + id + "/", reloadPage, "DELETE");
    return false;
}

function invoiceSaveResponse(date) {
    if (date.status !== window.status || date.type === "lock" || date.type === "cancel" || date.type === "giro" ||
        date.type === "cash") {
        window.location.reload();
    }

    if (date.status !== "new" && $("note") && $("note").value) {
        $$(".note")[0].innerText += "\n" + $("note").value;
        $("note").value = "";
    }

    $("loading").style.visibility = "hidden";
}

function save(id = null, type = null) {
    if (type === "cancel" && !confirm("Are you sure you want to cancel this Invoice?")) {
        return false;
    }

    $("loading").style.visibility = "";

    if (type === null) {
        type = "save";
    }

    var update = {"action": type};
    if (window.status === "new") {
        update.lines = invoiceLines;
        update.shipping = $("fragt").value.replace(/[^-0-9,]/g, "").replace(/,/, ".") || 0;
        update.amount = invoiceAmount;
        update.vat = $("momssats").value;
        update.preVat = $("premoms").checked;
        update.date = $("date").value;
        update.iref = $("iref").value;
        update.eref = $("eref").value;
        update.name = $("navn").value;
        update.attn = $("attn").value;
        update.address = $("adresse").value;
        update.postbox = $("postbox").value;
        update.postcode = $("postnr").value;
        update.city = $("by").value;
        update.country = $("land").value;
        update.email = $("email").value;
        update.phone1 = $("tlf1").value;
        update.phone2 = $("tlf2").value;
        update.hasShippingAddress = $("altpost").checked ? 1 : 0;
        if ($("altpost").checked) {
            update.shippingPhone = $("posttlf").value;
            update.shippingName = $("postname").value;
            update.shippingAttn = $("postattn").value;
            update.shippingAddress = $("postaddress").value;
            update.shippingAddress2 = $("postaddress2").value;
            update.shippingPostbox = $("postpostbox").value;
            update.shippingPostcode = $("postpostalcode").value;
            update.shippingCity = $("postcity").value;
            update.shippingCountry = $("postcountry").value;
        }
    }

    update.note = $("note") ? $("note").value : "";
    update.internalNote = $("internalNote").value;
    update.clerk = getSelectValue("clerk") || ($("clerk") && $("clerk").value) || null;
    update.department = getSelectValue("department") || ($("department") && $("department").value) || null;

    if (type === "giro") {
        update.paydate = $("gdate").value;
    }

    if (type === "cash") {
        update.paydate = $("cdate").value;
    }

    if (id === null) {
        xHttp.request("/admin/invoices/", redirectToInvoice, "POST", update);
        return false;
    }

    xHttp.request("/admin/invoices/" + id + "/", invoiceSaveResponse, "PUT", update);
    return false;
}

function showReminderSendMessage(data) {
    if (!genericCallback(data)) {
        return;
    }

    alert("Em pÄmindelse er blevet sendt til kunden.");
}

function sendReminder(id) {
    xHttp.request("/admin/invoices/" + id + "/email/", showReminderSendMessage, "POST");
    return false;
}

function setShippingAddressVisability(status) {
    var rows = $$(".altpost");
    for (const row of rows) {
        row.style.display = status ? "" : "none";
    }
}

function setPaymentTransferred(id, transferred) {
    xHttp.request("/admin/invoices/payments/" + id + "/", reloadCallback, "PUT", {transferred});
    return false;
}

function confirmPaymentValidate(id) {
    if (!confirm("Mente du '" + id + "'?")) {
        return false;
    }

    return setPaymentTransferred(id, true);
}

export {
    copytonew,
    prisUpdate,
    removeRow,
    valideMail,
    getInvoiceAddress,
    getAltAddress,
    numberFormat,
    reloadPage,
    pbsconfirm,
    annul,
    save,
    sendReminder,
    setShippingAddressVisability,
    setPaymentTransferred,
    confirmPaymentValidate
};