null

BS8599-1 Large Catering Kit 1

No reviews yet Write a Review
SKU:
REL-429
£64.99 inc. VAT
£54.16 ex. VAT

IN-STOCK

4 people looking at this.
Product added to your cart
Product added to your quote
first aid

Description

BS8599-1:2019 Large Catering Kit in Green Aura3 Box

  • LOW RISK 1 kit per 100 employees.
  • HIGH RISK 1 kit per 25 employees.
  • Box is 100% recycled and recyclable plastic.
  • Compliant to latest BSi standard.
  • All content HSE approved.
  • Ensures best practice is observed.

Our range of Catering Kits is unique! For many years it has been a legal requirement to use only Blue Detectable plasters in food preparation areas. Our kits go above and beyond this requirement by providing you for the first time with a kit where every single product, even the dressings and wipes, are all Blue. With one of our Blue Catering Kits in your workplace, there is no better way to demonstrate to the authorities that you are taking your responsibilities seriously.

AURA3 The latest evolution of our industry leading box.

SUSTAINABLE Now made from 100% recycled and recyclable plastic. Kit information is laser etched directly onto the box, so no is labelling required - helping to reduce our carbon footprint.*

CONVENIENT The single clip closure enables quicker access with one hand in an emergency. Features an integral bracket for secure wall fixing and easy portability. The new design includes a tamper seal tucked neatly under the handle. Contents can be visually monitored by Health and Safety managers in an instant.

OUTSTANDING Aura3 stands out from a distance, enabling quick identification in an emergency, especially in a busy workplace. Embossed and printed iconography help with easy identification across all languages.

All our kits are manufactured and packed in full compliance with the CE regulations.

2x Bandages, Blue Conforming
4x Bandages, Blue Triangular
2x Dressings, Burn
4x Dressings, Blue Eye Pad
4x Dressings, Blue Finger
6x Dressings, Blue HSE Medium
4x Dressings, Blue HSE Large
3x Foil Blankets, Adult
12x Gloves, Blue Pairs
1x Guidance Leaflet
100x Plasters, Blue Assorted
2x Resuscitation Face Shield
1x Shears
3x Tapes, Blue Microporous
40x Wipes, Blue Cleansing

Frequently Asked Questions

 

What standard does this kit comply with? ▼

This large catering first aid kit is fully compliant with BS8599-1:2019, which is the recognised British Standard for workplace first aid (including catering and food-service environments).

Is this first aid kit suited for kitchens and food handling areas? ▼

This first aid kit is made specifically for catering environments. It includes blue detectable plasters, dressings and wipes to meet the food hygiene best practice and reduce contamination risks.

How many people does this catering first aid kit support? ▼

In low risk workplaces, this first aid kit can cover up to 100 employees. In higher risk workplaces, this first aid kit can cover up to 25 persons.

What major items are included in this first aid kit? ▼

This catering first aid kit includes 2 blue conforming bandages; 4 blue triangular bandages; 2 burn dressings; 4 blue eye-pad dressings; 4 blue finger dressings; 6 blue HSE medium dressings; 4 blue HSE large dressings; 3 adult foil blankets; 12 pairs of blue gloves; 100 assorted blue plasters; 2 resuscitation face shields; shears; 3 blue microporous tapes; and 40 blue cleansing wipes.

Can this kit be fixed to a wall or easily transported? ▼

The first aid box has an inbuilt integral bracket for secure wall mounting, and a single clip closure, allowing for fast one hand access in an emergency.

How often should this first aid kit be inspected or restocked? ▼

The first aid supplies should be checked often, especially after any use. Once items have been used or have expired, it is recommended to replace them immediately, for continued compliance with BS8599-1 standards and optimal readiness for emergencies.

 

If you have any further questions about this product feel free to ask a question in our customer question box below, or contact our sales team.

<div><button id="pdfBtn" style="background-color: #ff7a00 !important; color: #fff !important; padding: 12px 22px !important; font-size: 16px !important; font-weight: bold !important; border: none !important; border-radius: 6px !important; cursor: pointer !important; display: inline-block !important; margin: 10px 0 !important;" onclick="createPDF()"> Download PDF </button></div>

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.31/jspdf.plugin.autotable.min.js"></script>

<script type="text/javascript">// <![CDATA[

/* ============================================================

   IMAGE → BASE64

============================================================ */

function loadImageAsBase64(url) {

  return new Promise(resolve => {

    const img = new Image();

    img.crossOrigin = "anonymous";

    img.onload = () => {

      const c = document.createElement("canvas");

      c.width = img.width;

      c.height = img.height;

      c.getContext("2d").drawImage(img, 0, 0);

      resolve({ data: c.toDataURL("image/png"), w: img.width, h: img.height });

    };

    img.onerror = () => resolve({ data: null });

    img.src = url;

  });

}

 

/* ============================================================

   TEXT CLEANING UTILITIES

============================================================ */

function cleanFAQAnswer(text) {

  if (!text) return "";

  text = text.replace(/[\u00A0\u202F\u2007\u2060]/g, " ");

  text = text.replace(/[\u200B-\u200D\uFEFF]/g, "");

  return text.replace(/\s+/g, " ").trim();

}

 

function removeCustomerQA(text) {

  text = text.replace(/questions?\s*\(\d+\)/gi, "");

  text = text.replace(/ask a question[\s\S]*$/gi, "");

  text = text.replace(/download\s*pdf/gi, "");

  text = text.replace(/\b\d{1,2}(st|nd|rd|th)?\s+[A-Za-z]{3,12}\s+\d{4}\b/gi, "");

  text = text.replace(/[A-Z][a-z]+(?:\s+[A-Z][a-z]+){0,2}\s*[-–·]\s*/g, "");

  text = text.replace(/\(\d+\)/g, "");

  text = text.replace(/show more|show less/gi, "");

  text = text.replace(/PDF Instruction Sheet/gi, "");

  text = text.replace(/If you have any further questions about this product feel free to/gi, "");

  return text.trim();

}

 

/* ============================================================

   CLEAN DESCRIPTION

============================================================ */

function cleanDescription(raw) {

  if (!raw) return "";

 

  raw = raw.replace(/%¼/g, "");

  raw = raw.replace(/%\s*¼/g, "");

  raw = raw.replace(/[ \t]+/g, " ");

 

  ["description", "frequently asked questions"].forEach(str => {

    raw = raw.replace(new RegExp(str, "gi"), "");

  });

 

  raw = removeCustomerQA(raw);

 

  // FIX MISSING "INCLUDED" HEADER

  const includedRegex = /(Manikin\s*10 Lung bags\s*Carry bag)/i;

  if (includedRegex.test(raw) && !/Included:/i.test(raw)) {

    raw = raw.replace(includedRegex, "\nIncluded:\n$1");

  }

 

  let lines = raw.split("\n");

 

  // FILTERING LOGIC

  lines = lines.filter(line => {

    let t = line.trim();

    let tLower = t.toLowerCase();

 

    if (t.length === 0) return true;

 

    // 1. DELETE SPACED OUT TEXT

    if (/^(\s*[a-zA-Z]\s+){5,}/.test(t)) return false;

 

    // 2. DELETE QUESTIONS

    const isQuestion = /^(what|how|is|are|do|does|did|can|could|should|would|will|where|why|when|which|who)\s/i.test(tLower);

    if (isQuestion && t.includes("?")) return false;

    if (t.endsWith("?") && t.length > 10 && t.length < 150) return false;

 

    // 3. REMOVE EMPTY BULLETS

    if (t === "•" || t === "-") return false;

 

    return true;

  });

 

  raw = lines.join("\n");

  raw = raw.replace(/\n\s*\n/g, "\n");

 

  return raw.trim();

}

 

function splitInlineBullets(text) {

  text = text.replace(/<br\s*\/?>/gi, "\n");

  text = text.replace(/(^|\s)-\s+(?=[A-Za-z])/g, "\n- ");

  return text;

}

 

function splitBulletFollowedBySentence(text) {

  return text.replace(

    /(-\s+[A-Za-z0-9 ,.'"-]+?)(\s+)([A-Z][a-zA-Z].+)/g,

    "$1\n$3"

  );

}

 

function convertBullets(linesArray) {

  return linesArray.map((line, index) => {

    const trimmed = line.trim();

 

    let isBullet = /^[•\-\*●▪♦►▶]/.test(trimmed);

 

    if (!isBullet && index > 0 && trimmed.length < 100) {

      if (!/[.!?:]$/.test(trimmed)) {

        isBullet = true;

      }

    }

 

    if (trimmed.toLowerCase().includes("included:")) {

      isBullet = false;

    }

 

    return {

      type: isBullet ? "bullet" : "normal",

      text: trimmed.replace(/^[•\-\*●▪♦►▶]\s*/, "")

    };

  });

}

 

/* ============================================================

   CONTENTS/QTY TEXT FALLBACK (FIXES "BIG LIST" ISSUE)

============================================================ */

function normalizeLine(t) {

  return (t || "")

    .replace(/[\u00A0\u202F\u2007\u2060]/g, " ")

    .replace(/[\u200B-\u200D\uFEFF]/g, "")

    .replace(/\s+/g, " ")

    .trim();

}

 

function stripBulletPrefix(t) {

  return normalizeLine(t).replace(/^[•\-\*●▪♦►▶]\s*/, "").trim();

}

 

function isNumberLine(t) {

  const s = normalizeLine(t);

  return /^[0-9]+$/.test(s);

}

 

function isLikelySectionHeading(t) {

  const s = stripBulletPrefix(t);

  if (!s) return true;

 

  if (/bs\s*8599/i.test(s)) return true;

  if (/grab\s*&\s*go\s*bag/i.test(s)) return true;

 

  const hasComma = s.includes(",");

  const hasMeasurement = /\b(mm|cm|ml|l|x)\b/i.test(s);

  const hasDigits = /\d/.test(s);

 

  const wordCount = s.split(" ").filter(Boolean).length;

  const titley = /^[A-Z0-9]/.test(s);

 

  if (!hasComma && !hasDigits && !hasMeasurement && wordCount <= 5 && titley) {

    const obviousItemWords =

      /(gloves|wipes|plasters|shears|tape|blankets|shield|bags|compass|whistle|forceps|torch|ice pack|eye wash|dressing|bandages)/i;

    if (!obviousItemWords.test(s)) return true;

  }

 

  return false;

}

 

function extractContentsFromFlattenedText(descText) {

  const text = descText || "";

  const lines = text.split("\n").map(l => normalizeLine(l)).filter(l => l.length > 0);

 

  const idxContents = lines.findIndex(l => l.toLowerCase() === "contents");

  const idxQuantity = lines.findIndex(l => l.toLowerCase() === "quantity");

 

  if (idxContents === -1 || idxQuantity === -1 || idxQuantity <= idxContents) {

    return { rows: [], cleanedText: descText || "" };

  }

 

  const leftRaw = lines

    .slice(idxContents + 1, idxQuantity)

    .map(stripBulletPrefix)

    .filter(Boolean);

 

  const rightRawAll = lines.slice(idxQuantity + 1).map(stripBulletPrefix).filter(Boolean);

 

  const qty = [];

  for (const l of rightRawAll) {

    if (isNumberLine(l)) qty.push(normalizeLine(l));

    else break;

  }

 

  if (leftRaw.length === 0 || qty.length === 0) {

    return { rows: [], cleanedText: descText || "" };

  }

 

  const rows = [];

  let qi = 0;

 

  for (let i = 0; i < leftRaw.length; i++) {

    const item = leftRaw[i];

 

    if (isLikelySectionHeading(item)) {

      rows.push({ item, qty: "", isSection: true });

      continue;

    }

 

    const q = qi < qty.length ? qty[qi++] : "";

    rows.push({ item, qty: q, isSection: false });

  }

 

  const removeStart = idxContents;

  const removeEnd = idxQuantity + 1 + qty.length;

  const cleanedLines = lines.slice(0, removeStart).concat(lines.slice(removeEnd));

  const cleanedText = cleanedLines.join("\n");

 

  return { rows, cleanedText };

}

 

function rowsToAutoTableBody(rows) {

  return rows.map(r => {

    if (r.isSection || r.qty === "") {

      return [{ content: r.item, colSpan: 2, styles: { fontStyle: "bold" } }];

    }

    return [r.item, r.qty];

  });

}

 

/* ============================================================

   MAIN PDF GENERATOR

============================================================ */

async function createPDF() {

  const { jsPDF } = window.jspdf;

  const pdf = new jsPDF({ lineHeight: 1.5 });

 

  /* ---------------- HEADER ---------------- */

  const logoUrl =

    "https://cdn11.bigcommerce.com/s-4ti9l0ea6w/images/stencil/200x44/jax_first_aid_supplies_logo_1735726362__19967.original.png";

  const logo = await loadImageAsBase64(logoUrl);

 

  if (logo.data) {

    pdf.addImage(logo.data, "PNG", 10, 10, 60, 13);

    pdf.link(10, 10, 60, 13, { url: "https://www.jaxfirstaid.co.uk/" });

  }

 

  pdf.setFontSize(12);

  pdf.text("www.jaxfirstaid.co.uk", 105, 17, { align: "center", url: "https://www.jaxfirstaid.co.uk/" });

  pdf.text("Need Help? 01207 272854", 200, 12, { align: "right" });

  pdf.text("sales@jaxfirstaid.co.uk", 200, 18, { align: "right" });

 

  pdf.setDrawColor(0, 0, 0);

  pdf.setLineWidth(0.3);

  pdf.line(10, 25, 200, 25);

 

  /* ---------------- PRODUCT DATA ---------------- */

  const productName = document.querySelector(".productView-title")?.innerText.trim() || "Product";

  const sku = document.querySelector("[data-product-sku]")?.innerText.trim() || "N/A";

  const productLink = window.location.href;

 

  /* ---------------- MINI BULLET SUMMARY ---------------- */

  let miniBullets = [];

  const summaryNode = document.querySelector(".productView-info") || document.querySelector(".productView-details");

  if (summaryNode) {

    miniBullets = summaryNode.innerText

      .split("\n")

      .map(l => l.trim())

      .filter(l => /^[•\-\*●▪♦►▶]\s*/.test(l));

  }

 

  /* ---------------- IMAGES ---------------- */

  const imgNodes = document.querySelectorAll(".productView-image img, .productView-thumbnail img");

  const images = [];

  for (let img of imgNodes) {

    if (img.src) images.push(await loadImageAsBase64(img.src));

  }

 

  let y = 30;

 

  /* ---------------- MAIN IMAGE ---------------- */

  const main = images[0] || { w: 100, h: 100, data: null };

  const mainW = 90;

  const scale = main.w > 0 ? mainW / main.w : 1;

  const mainH = main.h * scale;

 

  if (main.data) {

    pdf.addImage(main.data, "PNG", 10, y, mainW, mainH);

    pdf.link(10, y, mainW, mainH, { url: productLink });

  }

  pdf.rect(10, y, mainW, mainH);

 

  let imageBottom = y + mainH;

 

  /* ---------------- SMALL THUMBNAILS ---------------- */

  const thumbImages = images.slice(1).slice(0, 5);

  const thumbW = 18;

  const thumbH = 18;

  let thumbX = 10;

  let thumbY = imageBottom;

 

  thumbImages.forEach(im => {

    if (im.data) {

      const s = Math.min(thumbW / im.w, thumbH / im.h);

      const w = im.w * s;

      const h = im.h * s;

      const offX = thumbX + (thumbW - w) / 2;

      const offY = thumbY + (thumbH - h) / 2;

      pdf.addImage(im.data, "PNG", offX, offY, w, h);

      pdf.rect(thumbX, thumbY, thumbW, thumbH);

      pdf.link(thumbX, thumbY, thumbW, thumbH, { url: productLink });

      thumbX += thumbW;

    }

  });

 

  imageBottom = thumbY + thumbH + 10;

 

  /* ---------------- RIGHT COLUMN ---------------- */

  let rX = 110;

  let rY = 35;

 

  pdf.setFontSize(18);

  const titleLines = pdf.splitTextToSize(productName, 90);

  titleLines.forEach(line => {

    pdf.text(line, rX, rY);

    rY += 8;

  });

  rY += 2;

 

  pdf.setFontSize(12);

  pdf.text("SKU: " + sku, rX, rY);

  rY += 8;

 

  pdf.setTextColor(0, 0, 255);

  pdf.textWithLink("(View Product Online)", rX, rY, { url: productLink });

  pdf.setTextColor(0, 0, 0);

  rY += 12;

 

  pdf.setFontSize(14);

  pdf.text("Description:", rX, rY);

  rY += 8;

 

  /* ---------------- MINI BULLETS FIRST ---------------- */

  if (miniBullets.length > 0) {

    pdf.setFontSize(11);

    miniBullets.forEach(b => {

      const txt = "• " + b.replace(/^[•\-\*●▪♦►▶]\s*/, "");

      const wrapped = pdf.splitTextToSize(txt, 90);

      wrapped.forEach(w => {

        pdf.text(w, rX, rY);

        rY += 7;

      });

      rY += 2;

    });

    rY += 6;

  }

 

  /* ---------------- DESCRIPTION (REMOVE CONTENTS/QTY BLOCK FIRST) ---------------- */

  const rawDesc = document.querySelector(".productView-description")?.innerText || "";

 

  // NEW: Extract flattened Contents/Quantity block and remove it from description

  const extracted = extractContentsFromFlattenedText(rawDesc);

  const contentsRows = extracted.rows;

 

  let cleanedDesc = cleanDescription(extracted.cleanedText || "");

  cleanedDesc = splitInlineBullets(cleanedDesc);

  cleanedDesc = splitBulletFollowedBySentence(cleanedDesc);

 

  const descLines = cleanedDesc.split(/\n+/g).map(l => l.trim()).filter(l => l.length > 0);

  const parsed = convertBullets(descLines);

 

  let consumptionIndex = 0;

 

  // --- RENDER RIGHT COLUMN DESCRIPTION ---

  for (let i = 0; i < parsed.length; i++) {

    if (rY > imageBottom - 5) break;

 

    if (parsed[i].text.includes("Included:")) pdf.setFont(undefined, "bold");

    else pdf.setFont(undefined, "normal");

 

    const prefix = parsed[i].type === "bullet" ? "• " : "";

    const wrapped = pdf.splitTextToSize(prefix + parsed[i].text, 90);

 

    wrapped.forEach(w => {

      pdf.text(w, rX, rY);

      rY += 7;

    });

 

    if (parsed[i].type === "normal") rY += 3;

 

    consumptionIndex = i + 1;

  }

 

  /* ---------------- FULL-WIDTH DESCRIPTION ---------------- */

  let remaining = parsed.slice(consumptionIndex);

  let yFW = Math.max(rY, imageBottom) + 10;

 

  remaining.forEach(item => {

    if (yFW > 270) {

      pdf.addPage();

      yFW = 20;

    }

 

    if (item.text.includes("Included:")) pdf.setFont(undefined, "bold");

    else pdf.setFont(undefined, "normal");

 

    const prefix = item.type === "bullet" ? "• " : "";

    const wrapped = pdf.splitTextToSize(prefix + item.text, 190);

 

    wrapped.forEach(w => {

      pdf.text(w, 10, yFW);

      yFW += 7;

    });

 

    if (item.type === "normal") yFW += 4;

  });

 

  /* ---------------- CONTENTS TABLE (REAL TABLE OUTPUT) ---------------- */

  if (contentsRows && contentsRows.length > 0 && typeof pdf.autoTable === "function") {

    yFW += 8;

    if (yFW > 250) { pdf.addPage(); yFW = 20; }

 

    pdf.setFontSize(14);

    pdf.setFont(undefined, "bold");

    pdf.text("Contents:", 10, yFW);

    yFW += 6;

 

    const body = rowsToAutoTableBody(contentsRows);

 

    pdf.setFontSize(10);

    pdf.setFont(undefined, "normal");

 

    pdf.autoTable({

      startY: yFW,

      head: [["Contents", "Quantity"]],

      body,

      theme: "grid",

      styles: { fontSize: 10, cellPadding: 2, overflow: "linebreak", valign: "top" },

      headStyles: { fontStyle: "bold" },

      columnStyles: {

        0: { cellWidth: 160 },

        1: { cellWidth: 30, halign: "right" }

      }

    });

 

    yFW = (pdf.lastAutoTable && pdf.lastAutoTable.finalY ? pdf.lastAutoTable.finalY : yFW) + 10;

  }

 

  /* ---------------- FAQ SECTION ---------------- */

  const faqBlocks = document.querySelectorAll('[onclick*="this.nextElementSibling"]');

 

  if (faqBlocks.length > 0) {

    yFW += 10;

    if (yFW > 270) { pdf.addPage(); yFW = 20; }

 

    pdf.setDrawColor(255, 122, 0);

    pdf.setLineWidth(0.7);

    pdf.line(10, yFW, 200, yFW);

    yFW += 10;

 

    pdf.setFontSize(14);

    pdf.setFont(undefined, "bold");

    pdf.text("Frequently Asked Questions:", 10, yFW);

    yFW += 12;

 

    pdf.setFontSize(11);

 

    faqBlocks.forEach(block => {

      const q = block.querySelector("h3")?.innerText.replace("▼", "").trim();

      let a = block.nextElementSibling?.innerText.trim();

      a = cleanFAQAnswer(a);

 

      if (!q || !a) return;

 

      if (yFW > 260) { pdf.addPage(); yFW = 20; }

 

      pdf.setFont(undefined, "bold");

      const wrappedQ = pdf.splitTextToSize("Q: " + q, 190);

      wrappedQ.forEach(l => { pdf.text(l, 10, yFW); yFW += 6; });

 

      pdf.setFont(undefined, "normal");

      const wrappedA = pdf.splitTextToSize("A: " + a, 190);

      wrappedA.forEach(line => {

        if (yFW > 275) { pdf.addPage(); yFW = 20; }

        pdf.text(line, 10, yFW);

        yFW += 6;

      });

      yFW += 6;

    });

  }

 

  pdf.save(productName.replace(/[^a-z0-9]/gi, "_") + ".pdf");

}

// ]]></script>







first aid supplies
first aid supplies
first aid supplies
first aid supplies
first aid supplies