389 lines
13 KiB
JavaScript
Executable File
389 lines
13 KiB
JavaScript
Executable File
function stahnoutKatalog(data) {
|
|
// převod na JSON string
|
|
const jsonString = JSON.stringify(katalog2JSON(), null, 2);
|
|
|
|
// vytvoření blobu (soubor v paměti)
|
|
const blob = new Blob([jsonString], { type: "application/json" });
|
|
|
|
// vytvoření odkazu
|
|
const url = URL.createObjectURL(blob);
|
|
const a = document.createElement("a");
|
|
|
|
a.href = url;
|
|
a.download = "katalog.json";
|
|
|
|
// simulace kliknutí
|
|
a.click();
|
|
|
|
// úklid
|
|
URL.revokeObjectURL(url);
|
|
}
|
|
|
|
function uuidv4() {
|
|
return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, c =>
|
|
(+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16)
|
|
);
|
|
}
|
|
|
|
function prepocitejCenu(rozmery, vstupniCena, mj) {
|
|
vat = 21
|
|
vatKoeficient = (1 + (vat/100))
|
|
desetinnaMista = 4 // Ucetni vypocet ceny se provadi s presnosti na x desetinnych mist
|
|
|
|
let cena = {
|
|
"bezDPH": vstupniCena.toFixed(desetinnaMista),
|
|
"sDPH": (vstupniCena * vatKoeficient).toFixed(desetinnaMista),
|
|
"ks": -1
|
|
}
|
|
|
|
if (mj == "ks") {
|
|
cena.ks = cena.sDPH
|
|
}
|
|
// MJ = m; cena je s DPH za m
|
|
// pouzije se pouze nejvetsi z rozmeru
|
|
else if (mj == "m") {
|
|
delka = (rozmery.pop()/100).toFixed(desetinnaMista)
|
|
cena.ks = cena.sDPH * delka
|
|
}
|
|
// MJ = m2; cena je s DPH za m2
|
|
// zahazuje se nejmensi ze tri rozmeru
|
|
else if (mj == "m2") {
|
|
obsah = ((rozmery.pop()*rozmery.pop())/10000).toFixed(desetinnaMista)
|
|
cena.ks = cena.sDPH * obsah
|
|
//cena.ks = cena.sDPH/(10000/(rozmery.pop()*rozmery.pop()))
|
|
console.log("Cena " + cena.ks)
|
|
}
|
|
// MJ = m3; cena je s DPH za m3
|
|
else if (mj == "m3") {
|
|
objem = ((rozmery.pop()*rozmery.pop()*rozmery.pop())/1000000).toFixed(desetinnaMista)
|
|
//cena.ks = cena.sDPH/(1000000/(rozmery.pop()*rozmery.pop()*rozmery.pop()))
|
|
cena.ks = cena.sDPH * objem
|
|
}
|
|
return cena
|
|
}
|
|
|
|
function zapniNaElementSortableJS(el) {
|
|
new Sortable(el, {
|
|
group: 'nested',
|
|
animation: 150,
|
|
fallbackOnBody: true,
|
|
filter: ".ignore-elements",
|
|
onMove: function (evt) {
|
|
const dragged = evt.dragged; // element, který se táhne
|
|
const target = evt.to; // element, kam by měl být vložen
|
|
const isPolozka = dragged.classList.contains('polozka'); // např. kategorie mají class 'category'
|
|
const targetIsKatalog = target.classList.contains('katalog'); // produkty mají class 'item'
|
|
// Pokud se snažíme vložit kategorii do produktu, zablokuj
|
|
if (! isPolozka && ! targetIsKatalog) {
|
|
return false; // zakáže přesun
|
|
}
|
|
return true; // jinak povolit
|
|
},
|
|
swapThreshold: 0.65
|
|
});
|
|
}
|
|
|
|
// Rucne vyrobit polozku
|
|
document.addEventListener("click", function(event) {
|
|
if (event.target.id == "nahratKata") {
|
|
document.getElementById("inputFile").click() // Simuluje kliknuti na input>file
|
|
|
|
// zpracování souboru
|
|
document.getElementById("inputFile").addEventListener("change", (e) => {
|
|
const file = e.target.files[0];
|
|
if (!file) return;
|
|
|
|
const reader = new FileReader();
|
|
|
|
reader.onload = () => {
|
|
try {
|
|
const data = JSON.parse(reader.result);
|
|
JSON2Katalog(reader.result)
|
|
} catch (err) {
|
|
console.error("Neplatný JSON");
|
|
}
|
|
};
|
|
|
|
reader.readAsText(file);
|
|
|
|
});
|
|
}
|
|
if (event.target.classList.contains("pridat-polozku")) {
|
|
let kategorie = event.target.closest(".kategorie");
|
|
let seznam = kategorie.querySelector(".polozky");
|
|
let nova = vyrobPolozku("Nova polozka", 100, "m3", "10/10/100");
|
|
seznam.appendChild(nova);
|
|
}
|
|
// Rucne vyrobit kategorii
|
|
if (event.target.classList.contains("pridat-kategorii")) {
|
|
//let katalog = event.target.closest(".katalog");
|
|
let katalog = document.getElementById("katalog")
|
|
let nova = vyrobKategorii("Nova Kategorie");
|
|
katalog.appendChild(nova)
|
|
//event.target.before(nova)
|
|
}
|
|
if (event.target.classList.contains("vymaz-kat")) {
|
|
let potvrzeni = confirm("Opravdu vymazat?")
|
|
if(potvrzeni) {
|
|
event.target.closest(".kategorie").remove()
|
|
}
|
|
}
|
|
if (event.target.classList.contains("vymaz")) {
|
|
let potvrzeni = confirm("Opravdu vymazat?")
|
|
if(potvrzeni) {
|
|
event.target.closest(".polozka").remove()
|
|
}
|
|
}
|
|
if(event.target.classList.contains("ulozit-katalog")) {
|
|
// tady se bude implementovat ulozeni katalogu do XML
|
|
console.log(document.getElementById("katalog"))
|
|
}
|
|
|
|
});
|
|
document.addEventListener("change", function(event) {
|
|
if(event.target.classList.contains("prepocitavaniCeny")) {
|
|
let uuid = event.target.parentElement.id
|
|
|
|
let vstupniCena = Number(document.getElementById("cena-"+uuid).value.replace(/,/,'.'))
|
|
let mj = document.getElementById("mj-"+uuid).value
|
|
let rozmery = document.getElementById("rozmery-"+uuid).value.replace(/,/,'.').split('/').map(Number).sort((x, y) => x - y)
|
|
|
|
cena = prepocitejCenu(rozmery, vstupniCena, mj)
|
|
|
|
document.getElementById("cenadph-"+uuid).value = Math.ceil(cena.sDPH)
|
|
document.getElementById("cenaks-"+uuid).value = Math.ceil(cena.ks)
|
|
|
|
}
|
|
});
|
|
|
|
function vyrobPolozku(nazev, cena, mj, rozmery, cenadph = -1, cenaks = -1) {
|
|
|
|
let uuid = uuidv4()
|
|
let btnDel = document.createElement("button");
|
|
btnDel.className = "vymaz"
|
|
btnDel.textContent = "✗"
|
|
|
|
let nova = document.createElement("div");
|
|
nova.className = "list-group-item nested-2 polozka";
|
|
nova.id = uuid
|
|
nova.appendChild(btnDel)
|
|
|
|
let rozmeryPolozky = document.createElement("input")
|
|
rozmeryPolozky.setAttribute("type", "text")
|
|
rozmeryPolozky.className = "prepocitavaniCeny"
|
|
rozmeryPolozky.value = rozmery
|
|
rozmeryPolozky.id = "rozmery-" + uuid
|
|
|
|
let cenaPolozky = document.createElement("input")
|
|
cenaPolozky.setAttribute("type", "text")
|
|
cenaPolozky.className = "prepocitavaniCeny"
|
|
cenaPolozky.value = cena
|
|
cenaPolozky.id = "cena-" + uuid
|
|
|
|
let cenaPolozkySDPH = document.createElement("input")
|
|
cenaPolozkySDPH.setAttribute("type", "text")
|
|
cenaPolozkySDPH.id = "cenadph-" + uuid
|
|
cenaPolozkySDPH.value = (cena >= 0) ? cenadph : 0
|
|
let cenaPolozkyKs = document.createElement("input")
|
|
cenaPolozkyKs.setAttribute("type", "text")
|
|
cenaPolozkyKs.id = "cenaks-" + uuid
|
|
cenaPolozkyKs.value = (cena >= 0) ? cenaks : 0
|
|
|
|
let mjPolozky = document.createElement("select")
|
|
mjPolozky.id = "mj-" + uuid
|
|
mjPolozky.className = "prepocitavaniCeny"
|
|
let mjMoznosti = [{"klic": "m", "hodnota": "m"}, {"klic": "m2","hodnota": "m²"},{"klic": "m3","hodnota": "m³"},{"klic": "ks","hodnota": "ks"}]
|
|
mjMoznosti.forEach((x, index, array) => {
|
|
var option = document.createElement("option");
|
|
option.value = x.klic
|
|
option.text = x.hodnota
|
|
mjPolozky.appendChild(option);
|
|
});
|
|
mjPolozky.value = mj
|
|
|
|
// nova.appendChild(document.createTextNode(" Nazev "));
|
|
// nova.appendChild(nazevPolozky)
|
|
nova.appendChild(document.createTextNode(" Rozměry "));
|
|
nova.appendChild(rozmeryPolozky)
|
|
nova.appendChild(document.createTextNode(" MJ "));
|
|
nova.appendChild(mjPolozky)
|
|
nova.appendChild(document.createTextNode(" Cena bez DPH "));
|
|
nova.appendChild(cenaPolozky)
|
|
nova.appendChild(document.createTextNode(" Cena s DPH "));
|
|
nova.appendChild(cenaPolozkySDPH)
|
|
nova.appendChild(document.createTextNode(" Cena s DPH/ks "));
|
|
nova.appendChild(cenaPolozkyKs)
|
|
|
|
return nova
|
|
}
|
|
|
|
function nactiKatalogy() {
|
|
url = "/skripty/katalog.php"
|
|
$.ajax({
|
|
type: "POST",
|
|
url: url,
|
|
dataType: "json",
|
|
success: function(x, status, xhr) {
|
|
$("#fileSelect").empty();
|
|
for(i = 0; i < x.length; i++) {
|
|
option = '<option value="'+ x[i] + '">' + x[i] + '</option>';
|
|
$("#fileSelect").append(option)
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function katalog2JSON() {
|
|
let katalog = {}
|
|
$("#katalog").children().each(function(i) {
|
|
let kategorie = $(this).find("input[id^='nazev-']").first().val();
|
|
let produkty = {}
|
|
$(this).find(".polozka").each(function(){
|
|
let polozka = {}
|
|
let nazev = $(this).find("input[id^='nazev-']").first().val()
|
|
polozka["nazev"] = nazev
|
|
polozka["rozmery"] = $(this).find("input[id^='rozmery-']").first().val()
|
|
polozka["cena"] = $(this).find("input[id^='cena-']").first().val()
|
|
polozka["cenadph"] = $(this).find("input[id^='cenadph-']").first().val()
|
|
polozka["cenaks"] = $(this).find("input[id^='cenaks-']").first().val()
|
|
polozka["mj"] = $(this).find("select[id^='mj-'] :selected").val()
|
|
produkty[nazev] = polozka
|
|
})
|
|
katalog[kategorie] = produkty
|
|
})
|
|
|
|
return katalog
|
|
}
|
|
|
|
function ulozitKatalog() {
|
|
data = {"security_token":"jebatceckyhajzel", "akce":"nahraj", "katalog": katalog2JSON()}
|
|
url = "/skripty/katalog.php"
|
|
dataType = "json"
|
|
|
|
$.ajax({
|
|
type: "POST",
|
|
url: url,
|
|
data: JSON.stringify(data),
|
|
dataType: "json",
|
|
contentType: "application/json; charset=utf-8",
|
|
success: function(x, status, xhr) {
|
|
nactiKatalogy();
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function vyrobKategorii(nazev) {
|
|
let uuid = uuidv4()
|
|
let kategorie = document.createElement("div")
|
|
kategorie.className = "list-group-item nested-1 kategorie"
|
|
let nazevKategorie = document.createElement("input")
|
|
nazevKategorie.setAttribute("type", "text")
|
|
nazevKategorie.value = nazev
|
|
nazevKategorie.id = "nazev-" + uuid
|
|
//kategorie.textContent = nazev
|
|
kategorie.appendChild(nazevKategorie)
|
|
let katProdCont = document.createElement("div")
|
|
katProdCont.className = "list-group nested-sortable polozky"
|
|
kategorie.appendChild(katProdCont)
|
|
|
|
let pridavatko = document.createElement("button");
|
|
pridavatko.className = "pridat-polozku"
|
|
pridavatko.textContent = "Pridat Polozku"
|
|
let btnDel = document.createElement("button");
|
|
btnDel.className = "vymaz-kat"
|
|
btnDel.textContent = "Odebrat Kategorii"
|
|
|
|
kategorie.appendChild(btnDel)
|
|
kategorie.appendChild(pridavatko)
|
|
|
|
zapniNaElementSortableJS(katProdCont)
|
|
|
|
return kategorie
|
|
}
|
|
|
|
function vyrobKatalog() {
|
|
let kat = document.createElement("div")
|
|
kat.className = "list-group nested-sortable katalog"
|
|
kat.id = "katalog"
|
|
zapniNaElementSortableJS(kat)
|
|
return kat
|
|
}
|
|
|
|
// Vygenerovat ze vzorovych dat
|
|
// Tady se nepredpoklada dopocitani ceny s DPH a za kus
|
|
// Cena s DPH a za kus bude ulozena v datech predem vyrobeneho katalogu
|
|
let kata = vyrobKatalog()
|
|
|
|
|
|
function naplnitKatalog() {
|
|
let potvrzeni = confirm("Nacist vybrany katalog?\r !! Neulozene zmeny budou ztraceny !!")
|
|
if(! potvrzeni) {
|
|
return
|
|
}
|
|
document.getElementById("katalog").innerHTML=""
|
|
|
|
let katalog;
|
|
data = {"security_token":"jebatceckyhajzel", "akce":"obsah", "soubor": $("#fileSelect :selected").val()}
|
|
url = "/skripty/katalog.php"
|
|
dataType = "json"
|
|
|
|
$.ajax({
|
|
type: "POST",
|
|
url: url,
|
|
data: JSON.stringify(data),
|
|
dataType: "json",
|
|
contentType: "application/json; charset=utf-8",
|
|
success: function(x, status, xhr) {
|
|
JSON2Katalog(x)
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function JSON2Katalog(x) {
|
|
katalog = JSON.parse(x)
|
|
Object.entries(katalog).forEach(([kategorie, produkty]) => {
|
|
let kat = vyrobKategorii(kategorie)
|
|
katProdCont = kat.getElementsByClassName("polozky")[0]
|
|
Object.entries(produkty).forEach(([nazev, data]) => {
|
|
console.log(data.mj)
|
|
let prod = vyrobPolozku(nazev, data.cena, data.mj, data.rozmery, data.cenadph, data.cenaks)
|
|
katProdCont.appendChild(prod)
|
|
});
|
|
kata.appendChild(kat)
|
|
});
|
|
}
|
|
|
|
function vystavitKatalog() {
|
|
let soubor = $("#fileSelect :selected").val()
|
|
let potvrzeni = confirm("Zverejnit katalog " + soubor + " na web ?")
|
|
if(! potvrzeni) {
|
|
return
|
|
}
|
|
|
|
data = {"security_token":"jebatceckyhajzel", "akce":"zverejni", "soubor": soubor}
|
|
//url = "https://drevoprodej-benes.cz/skripty/katalog.php"
|
|
url = "/skripty/katalog.php"
|
|
dataType = "json"
|
|
|
|
$.ajax({
|
|
type: "POST",
|
|
url: url,
|
|
data: JSON.stringify(data),
|
|
dataType: "json",
|
|
contentType: "application/json; charset=utf-8",
|
|
});
|
|
}
|
|
|
|
// ????
|
|
document.getElementById("telo").appendChild(kata)
|
|
|
|
$(document).ready(function () {
|
|
nactiKatalogy()
|
|
});
|
|
|
|
|