{"id":530,"date":"2026-05-29T14:34:24","date_gmt":"2026-05-29T14:34:24","guid":{"rendered":"https:\/\/skpr.no\/?page_id=530"},"modified":"2026-05-29T14:59:55","modified_gmt":"2026-05-29T14:59:55","slug":"lager","status":"publish","type":"page","link":"https:\/\/skpr.no\/en\/lager\/","title":{"rendered":"Lager"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"530\" class=\"elementor elementor-530\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bdc8689 e-flex e-con-boxed e-con e-parent\" data-id=\"bdc8689\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-32df5d4 elementor-widget elementor-widget-html\" data-id=\"32df5d4\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!doctype html>\n<html lang=\"no\">\n<head>\n  <meta charset=\"utf-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>\n  <title>Skibotn Production AS - Lagerprogram<\/title>\n  <style>\n    :root {\n      --bg: #f8fafc;\n      --card: #ffffff;\n      --text: #0f172a;\n      --muted: #64748b;\n      --border: #e2e8f0;\n      --red-bg: #fee2e2;\n      --red-border: #fca5a5;\n      --red-text: #991b1b;\n      --green-bg: #dcfce7;\n      --green-text: #166534;\n      --blue: #2563eb;\n    }\n\n    * { box-sizing: border-box; }\n\n    body {\n      margin: 0;\n      font-family: Arial, Helvetica, sans-serif;\n      background: var(--bg);\n      color: var(--text);\n    }\n\n    .container {\n      max-width: 1400px;\n      margin: 0 auto;\n      padding: 24px;\n    }\n\n    h1 {\n      margin: 0;\n      font-size: 32px;\n    }\n\n    h2 {\n      margin: 0 0 14px;\n      font-size: 22px;\n    }\n\n    p {\n      color: var(--muted);\n    }\n\n    .header {\n      display: flex;\n      justify-content: space-between;\n      gap: 20px;\n      align-items: flex-start;\n      margin-bottom: 20px;\n    }\n\n    .card {\n      background: var(--card);\n      border: 1px solid var(--border);\n      border-radius: 18px;\n      padding: 18px;\n      box-shadow: 0 1px 3px rgba(15, 23, 42, 0.08);\n      margin-bottom: 18px;\n    }\n\n    .info {\n      background: #eff6ff;\n      border-color: #bfdbfe;\n    }\n\n    .stats {\n      display: grid;\n      grid-template-columns: repeat(3, 1fr);\n      gap: 16px;\n      margin-bottom: 18px;\n    }\n\n    .stat-number {\n      font-size: 30px;\n      font-weight: 700;\n      margin-top: 6px;\n    }\n\n    .danger-card {\n      background: #fef2f2;\n      border-color: var(--red-border);\n    }\n\n    .danger-text {\n      color: var(--red-text);\n    }\n\n    .form-grid {\n      display: grid;\n      grid-template-columns: repeat(4, 1fr);\n      gap: 10px;\n    }\n\n    input {\n      width: 100%;\n      padding: 11px;\n      border: 1px solid var(--border);\n      border-radius: 12px;\n      font-size: 14px;\n      background: white;\n    }\n\n    input:focus {\n      outline: 2px solid #bfdbfe;\n      border-color: #60a5fa;\n    }\n\n    button {\n      border: 0;\n      background: var(--blue);\n      color: white;\n      padding: 11px 16px;\n      border-radius: 12px;\n      cursor: pointer;\n      font-weight: 600;\n    }\n\n    button:hover {\n      opacity: 0.9;\n    }\n\n    .secondary {\n      background: #475569;\n    }\n\n    .delete {\n      background: #dc2626;\n      padding: 8px 10px;\n    }\n\n    .toolbar {\n      display: flex;\n      justify-content: space-between;\n      gap: 12px;\n      align-items: center;\n      margin-bottom: 14px;\n    }\n\n    .table-wrap {\n      overflow-x: auto;\n    }\n\n    table {\n      width: 100%;\n      border-collapse: collapse;\n      min-width: 1200px;\n      font-size: 14px;\n    }\n\n    th {\n      text-align: left;\n      background: #f1f5f9;\n      padding: 10px;\n      border-bottom: 1px solid var(--border);\n    }\n\n    td {\n      padding: 8px;\n      border-bottom: 1px solid var(--border);\n      vertical-align: middle;\n    }\n\n    tr.low {\n      background: var(--red-bg);\n      border-left: 4px solid #dc2626;\n    }\n\n    .table-input {\n      min-width: 110px;\n      padding: 8px;\n      border-radius: 9px;\n    }\n\n    .name-input {\n      min-width: 170px;\n      font-weight: 600;\n    }\n\n    .low-input {\n      border-color: #ef4444;\n      background: #fef2f2;\n      color: var(--red-text);\n      font-weight: 700;\n    }\n\n    .badge {\n      display: inline-block;\n      border-radius: 999px;\n      padding: 5px 10px;\n      font-size: 12px;\n      font-weight: 700;\n      white-space: nowrap;\n    }\n\n    .badge-low {\n      background: #dc2626;\n      color: white;\n    }\n\n    .badge-ok {\n      background: var(--green-bg);\n      color: var(--green-text);\n    }\n\n    .actions {\n      display: flex;\n      gap: 8px;\n      flex-wrap: wrap;\n    }\n\n    .small {\n      font-size: 13px;\n      color: var(--muted);\n    }\n\n    @media (max-width: 900px) {\n      .header, .toolbar {\n        flex-direction: column;\n        align-items: stretch;\n      }\n\n      .stats, .form-grid {\n        grid-template-columns: 1fr;\n      }\n\n      .container {\n        padding: 14px;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <main class=\"container\">\n    <section class=\"header\">\n      <div>\n        <h1>Skibotn Production AS<\/h1>\n        <p>Lagerprogram for oversikt over varer, beholdning og lokasjon.<\/p>\n        <p class=\"small\">Lagring: <strong>Lagres lokalt i nettleseren<\/strong><\/p>\n      <\/div>\n      <div>\n        <label>\n          Bruker \/ ansatt\n          <input id=\"brukerNavn\" value=\"Kjell\" \/>\n        <\/label>\n      <\/div>\n    <\/section>\n\n    <section class=\"card info\">\n      <h2>Redigerbar lageroversikt<\/h2>\n      <p>Du kan redigere direkte i tabellen. Varer der antall er lik eller lavere enn minimum blir markert med r\u00f8dt.<\/p>\n    <\/section>\n\n    <section class=\"stats\">\n      <div class=\"card\">\n        <div>\ud83d\udce6 Varer registrert<\/div>\n        <div id=\"statVarer\" class=\"stat-number\">0<\/div>\n      <\/div>\n      <div id=\"lavtKort\" class=\"card\">\n        <div>\ud83d\udea8 Lavt inventar<\/div>\n        <div id=\"statLavt\" class=\"stat-number danger-text\">0<\/div>\n      <\/div>\n      <div class=\"card\">\n        <div>\ud83d\udd22 Totalt antall enheter<\/div>\n        <div id=\"statTotal\" class=\"stat-number\">0<\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"card\">\n      <h2>Legg inn ny vare<\/h2>\n      <div class=\"form-grid\">\n        <input id=\"varenr\" placeholder=\"Varenr\" \/>\n        <input id=\"navn\" placeholder=\"Varenavn *\" \/>\n        <input id=\"kategori\" placeholder=\"Kategori\" \/>\n        <input id=\"lokasjon\" placeholder=\"Lokasjon\" \/>\n        <input id=\"antall\" type=\"number\" min=\"0\" placeholder=\"Antall\" \/>\n        <input id=\"minimum\" type=\"number\" min=\"0\" placeholder=\"Minimum\" \/>\n        <input id=\"leverandor\" placeholder=\"Leverand\u00f8r\" \/>\n        <button onclick=\"leggTilVare()\">\u2795 Legg til vare<\/button>\n      <\/div>\n    <\/section>\n\n    <section class=\"card\">\n      <div class=\"toolbar\">\n        <h2>Lageroversikt<\/h2>\n        <div class=\"actions\">\n          <input id=\"sok\" placeholder=\"S\u00f8k etter vare, kategori, lokasjon eller ansatt\" oninput=\"render()\" \/>\n          <button class=\"secondary\" onclick=\"eksporterCSV()\">\u2b07\ufe0f Eksporter CSV<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"table-wrap\">\n        <table>\n          <thead>\n            <tr>\n              <th>Varenr<\/th>\n              <th>Varenavn<\/th>\n              <th>Kategori<\/th>\n              <th>Antall<\/th>\n              <th>Min.<\/th>\n              <th>Lokasjon<\/th>\n              <th>Leverand\u00f8r<\/th>\n              <th>Oppdatert<\/th>\n              <th>Endret av<\/th>\n              <th>Status<\/th>\n              <th><\/th>\n            <\/tr>\n          <\/thead>\n          <tbody id=\"lagerTabell\"><\/tbody>\n        <\/table>\n      <\/div>\n    <\/section>\n  <\/main>\n\n  <script>\n    const STORAGE_KEY = \"skibotn-production-lager-web-v1\";\n\n    const standardVarer = [\n      {\n        id: 1,\n        varenr: \"SKP-001\",\n        navn: \"Eksempelvare\",\n        kategori: \"Utstyr\",\n        antall: 3,\n        minimum: 5,\n        lokasjon: \"Lager A\",\n        leverandor: \"\",\n        oppdatert: dagensDato(),\n        sistEndretAv: \"System\"\n      }\n    ];\n\n    let varer = lesVarer();\n\n    function dagensDato() {\n      return new Date().toISOString().slice(0, 10);\n    }\n\n    function lagVarenummer() {\n      return \"SKP-\" + String(varer.length + 1).padStart(3, \"0\");\n    }\n\n    function erLavt(vare) {\n      return Number(vare.antall || 0) <= Number(vare.minimum || 0);\n    }\n\n    function lesVarer() {\n      try {\n        const lagret = localStorage.getItem(STORAGE_KEY);\n        if (!lagret) return [...standardVarer];\n        const parsed = JSON.parse(lagret);\n        return Array.isArray(parsed) ? parsed : [...standardVarer];\n      } catch {\n        return [...standardVarer];\n      }\n    }\n\n    function lagre() {\n      localStorage.setItem(STORAGE_KEY, JSON.stringify(varer));\n    }\n\n    function bruker() {\n      return document.getElementById(\"brukerNavn\").value.trim() || \"Ukjent bruker\";\n    }\n\n    function leggTilVare() {\n      const navn = document.getElementById(\"navn\").value.trim();\n      if (!navn) {\n        alert(\"Skriv inn varenavn f\u00f8rst.\");\n        return;\n      }\n\n      const vare = {\n        id: Date.now(),\n        varenr: document.getElementById(\"varenr\").value.trim() || lagVarenummer(),\n        navn,\n        kategori: document.getElementById(\"kategori\").value.trim(),\n        antall: Number(document.getElementById(\"antall\").value || 0),\n        minimum: Number(document.getElementById(\"minimum\").value || 0),\n        lokasjon: document.getElementById(\"lokasjon\").value.trim(),\n        leverandor: document.getElementById(\"leverandor\").value.trim(),\n        oppdatert: dagensDato(),\n        sistEndretAv: bruker()\n      };\n\n      varer.unshift(vare);\n      lagre();\n\n      [\"varenr\", \"navn\", \"kategori\", \"antall\", \"minimum\", \"lokasjon\", \"leverandor\"].forEach(id => {\n        document.getElementById(id).value = \"\";\n      });\n\n      render();\n    }\n\n    function oppdaterFelt(id, felt, verdi) {\n      varer = varer.map(vare => {\n        if (vare.id !== id) return vare;\n\n        const erNummer = felt === \"antall\" || felt === \"minimum\";\n        return {\n          ...vare,\n          [felt]: erNummer ? Number(verdi || 0) : verdi,\n          oppdatert: dagensDato(),\n          sistEndretAv: bruker()\n        };\n      });\n\n      lagre();\n      render();\n    }\n\n    function slettVare(id) {\n      const vare = varer.find(v => v.id === id);\n      if (!vare) return;\n\n      if (confirm(\"Vil du slette \" + vare.navn + \"?\")) {\n        varer = varer.filter(v => v.id !== id);\n        lagre();\n        render();\n      }\n    }\n\n    function filtrerteVarer() {\n      const tekst = document.getElementById(\"sok\").value.trim().toLowerCase();\n      if (!tekst) return varer;\n\n      return varer.filter(v => {\n        return [v.varenr, v.navn, v.kategori, v.lokasjon, v.leverandor, v.sistEndretAv]\n          .join(\" \")\n          .toLowerCase()\n          .includes(tekst);\n      });\n    }\n\n    function escapeHtml(value) {\n      return String(value ?? \"\")\n        .replaceAll(\"&\", \"&amp;\")\n        .replaceAll(\"<\", \"&lt;\")\n        .replaceAll(\">\", \"&gt;\")\n        .replaceAll('\"', \"&quot;\");\n    }\n\n    function render() {\n      const tbody = document.getElementById(\"lagerTabell\");\n      const liste = filtrerteVarer();\n\n      tbody.innerHTML = \"\";\n\n      if (liste.length === 0) {\n        tbody.innerHTML = '<tr><td colspan=\"11\" style=\"text-align:center;padding:24px;color:#64748b;\">Ingen varer funnet.<\/td><\/tr>';\n      } else {\n        for (const vare of liste) {\n          const lavt = erLavt(vare);\n          const tr = document.createElement(\"tr\");\n          tr.className = lavt ? \"low\" : \"\";\n\n          tr.innerHTML = `\n            <td><input class=\"table-input\" value=\"${escapeHtml(vare.varenr)}\" onchange=\"oppdaterFelt(${vare.id}, 'varenr', this.value)\" \/><\/td>\n            <td><input class=\"table-input name-input\" value=\"${escapeHtml(vare.navn)}\" onchange=\"oppdaterFelt(${vare.id}, 'navn', this.value)\" \/><\/td>\n            <td><input class=\"table-input\" value=\"${escapeHtml(vare.kategori)}\" onchange=\"oppdaterFelt(${vare.id}, 'kategori', this.value)\" \/><\/td>\n            <td><input class=\"table-input ${lavt ? \"low-input\" : \"\"}\" type=\"number\" min=\"0\" value=\"${escapeHtml(vare.antall)}\" onchange=\"oppdaterFelt(${vare.id}, 'antall', this.value)\" \/><\/td>\n            <td><input class=\"table-input\" type=\"number\" min=\"0\" value=\"${escapeHtml(vare.minimum)}\" onchange=\"oppdaterFelt(${vare.id}, 'minimum', this.value)\" \/><\/td>\n            <td><input class=\"table-input\" value=\"${escapeHtml(vare.lokasjon)}\" onchange=\"oppdaterFelt(${vare.id}, 'lokasjon', this.value)\" \/><\/td>\n            <td><input class=\"table-input\" value=\"${escapeHtml(vare.leverandor)}\" onchange=\"oppdaterFelt(${vare.id}, 'leverandor', this.value)\" \/><\/td>\n            <td>${escapeHtml(vare.oppdatert)}<\/td>\n            <td>${escapeHtml(vare.sistEndretAv || \"-\")}<\/td>\n            <td>${lavt ? '<span class=\"badge badge-low\">Lavt inventar<\/span>' : '<span class=\"badge badge-ok\">OK<\/span>'}<\/td>\n            <td><button class=\"delete\" onclick=\"slettVare(${vare.id})\">\ud83d\uddd1\ufe0f<\/button><\/td>\n          `;\n\n          tbody.appendChild(tr);\n        }\n      }\n\n      const lavtAntall = varer.filter(erLavt).length;\n      document.getElementById(\"statVarer\").textContent = varer.length;\n      document.getElementById(\"statLavt\").textContent = lavtAntall;\n      document.getElementById(\"statTotal\").textContent = varer.reduce((sum, v) => sum + Number(v.antall || 0), 0);\n      document.getElementById(\"lavtKort\").className = lavtAntall > 0 ? \"card danger-card\" : \"card\";\n    }\n\n    function csvEscape(value) {\n      return '\"' + String(value ?? \"\").replaceAll('\"', '\"\"') + '\"';\n    }\n\n    function eksporterCSV() {\n      const header = [\"Varenr\", \"Varenavn\", \"Kategori\", \"Antall\", \"Minimum\", \"Lokasjon\", \"Leverand\u00f8r\", \"Oppdatert\", \"Sist endret av\", \"Status\"];\n      const rader = varer.map(v => [\n        v.varenr,\n        v.navn,\n        v.kategori,\n        v.antall,\n        v.minimum,\n        v.lokasjon,\n        v.leverandor,\n        v.oppdatert,\n        v.sistEndretAv || \"\",\n        erLavt(v) ? \"Lavt inventar\" : \"OK\"\n      ]);\n\n      const csv = [header, ...rader].map(rad => rad.map(csvEscape).join(\",\")).join(\"\\n\");\n      const blob = new Blob([csv], { type: \"text\/csv;charset=utf-8;\" });\n      const url = URL.createObjectURL(blob);\n      const a = document.createElement(\"a\");\n      a.href = url;\n      a.download = \"skibotn-lageroversikt.csv\";\n      a.click();\n      URL.revokeObjectURL(url);\n    }\n\n    render();\n  <\/script>\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Skibotn Production AS &#8211; Lagerprogram Skibotn Production AS Lagerprogram for oversikt over varer, beholdning og lokasjon. Lagring: Lagres lokalt i nettleseren Bruker \/ ansatt Redigerbar lageroversikt Du kan redigere direkte i tabellen. Varer der antall er lik eller lavere enn minimum blir markert med r\u00f8dt. \ud83d\udce6 Varer registrert 0 \ud83d\udea8 Lavt inventar 0 \ud83d\udd22 Totalt [&hellip;]<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"inline_featured_image":false,"two_page_speed":[],"footnotes":""},"class_list":["post-530","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/skpr.no\/en\/wp-json\/wp\/v2\/pages\/530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/skpr.no\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/skpr.no\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/skpr.no\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/skpr.no\/en\/wp-json\/wp\/v2\/comments?post=530"}],"version-history":[{"count":6,"href":"https:\/\/skpr.no\/en\/wp-json\/wp\/v2\/pages\/530\/revisions"}],"predecessor-version":[{"id":539,"href":"https:\/\/skpr.no\/en\/wp-json\/wp\/v2\/pages\/530\/revisions\/539"}],"wp:attachment":[{"href":"https:\/\/skpr.no\/en\/wp-json\/wp\/v2\/media?parent=530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}