Manufacturing Engineering Intern, Summer 2027

Danfoss
  • Milwaukee, WI
  • Autofill and Review
7 days ago

Job Description

Job Description

Inject the flag directly into the main browser window and the session.window.isSFInternalUser = true;sessionStorage.setItem('SF_Internal_User', 'true');

/

  • JOB PAGE ENHANCEMENT SCRIPT
  • This script intercepts the default SAP SuccessFactors job layout, extracts key job metadata
  • (tokens), evaluates business rules to show/hide specific data (like salary), and rebuilds
  • the UI into a modern, 3-column green grid with custom icons.
  • /document.addEventListener('DOMContentLoaded', function () {
    1. PAGE VALIDATIONEnsure this script only runs on the actual Job Description page, not search or home pages.if (document.querySelector('.job-page')) {let columnOne = document.querySelector('.jobColumnOne');if (!columnOne) return; Exit if the primary content column is missing
      1. TITLE EXTRACTION & REFORMATTINGFind the native job title element, extract its text, and remove the native wrapper.let titleElement = columnOne.querySelector('span[itemprop="title"]');let titleText = titleElement ? titleElement.textContent.trim() : '';

      if (titleElement) {Locate the highest level wrapper SAP generated for the title and remove itlet titleWrapper = titleElement.closest('.joblayouttoken') || titleElement.closest('.inner');if (titleWrapper) titleWrapper.remove();}

      Inject the new custom HTML structure at the very top of the job column.This includes the new H1 title and the empty green container/grid for the tokens.columnOne.insertAdjacentHTML('afterbegin', `

      ${titleText}

      `);

      Reference to the newly injected grid where we will move the tokenslet grid = columnOne.querySelector('.job-grid');

      1. TOKEN GATHERINGSAP dynamically wraps tokens in different ways (.inner, .joblayouttoken, etc.).We find all labels first, then traverse up the DOM to capture the full container for each.let labels = Array.from(columnOne.querySelectorAll('.joblayouttoken-label'));let allTokens = labels.map(label =>label.closest('.inner') || label.closest('.joblayouttoken') || label.parentElement.parentElement);allTokens = [...new Set(allTokens)]; Remove duplicates to prevent processing the same element twice

      Variables to store extracted data for our business ruleslet jobLocationValue = "";let countryRegionValue = "";let regionValue = "";let jobLevelValue = "";let employeeGroupValue = "";

      1. PHASE 1: DATA EXTRACTION (SILENT)Loop through all tokens just to read their values. We do not move or alter them yet.allTokens.forEach(el =>{if(!el) return;let labelEl = el.querySelector('.joblayouttoken-label');if (!labelEl) return;

      let labelText = labelEl.innerText;Use our helper function to normalize the label name regardless of the user's languagelet propId = generatePropertyId(labelText);

      let valueEl = el.querySelector('.rtltextaligneligible');let valueText = valueEl ? valueEl.textContent.trim() : "";

      Populate the business rule variables based on the identified property IDif (propId === "JobLocation") jobLocationValue = valueText;else if (propId === "CountryRegion") countryRegionValue = valueText;else if (propId === "Region") regionValue = valueText;else if (propId === "JobLevel") jobLevelValue = valueText.toUpperCase().trim();else if (propId === "EmployeeGroup") employeeGroupValue = valueText.toLowerCase();});

      1. DATA FALLBACK: JOB DESCRIPTION PARSINGIf SAP failed to generate specific tokens, attempt to regex them directly out of the raw description text.let descDiv = document.querySelector('.job-description') || columnOne.querySelector('[itemprop="description"]');if (descDiv) {let descText = descDiv.innerText || "";if (!employeeGroupValue) {let eg = descText.match(/Employee Group:\s([^]+)/i);if (eg) employeeGroupValue = eg[1].toLowerCase().trim();}if (!countryRegionValue) {let cr = descText.match(/Country:\s([^]+)/i);if (cr) countryRegionValue = cr[1].toLowerCase().trim();}if (!regionValue) {let rg = descText.match(/Region:\s([^]+)/i);if (rg) regionValue = rg[1].toLowerCase().trim();}if (!jobLevelValue) {let jl = descText.match(/Job Level:\s([^]+)/i);Ensure we don't accidentally grab "Job Experience Level"if (jl && !jl[0].toLowerCase().includes("experience")) {jobLevelValue = jl[1].toUpperCase().trim();}}}

      2. BUSINESS RULES EVALUATION (SALARY VISIBILITY)Rule A: Is it a salaried position?let isSalaryPaid = employeeGroupValue.includes('salary');

      Rule B: Is the Job Level eligible? (Hide if PL09 or higher, or if ZZ)let isJobLevelSalaryEligible = true;let plMatch = jobLevelValue.match(/PL(\d+)/);if (jobLevelValue.includes("ZZ")) {isJobLevelSalaryEligible = false;} else if (plMatch && parseInt(plMatch[1], 10) >= 9) {isJobLevelSalaryEligible = false;}

      Combine city/state and country to check geographic eligibilitylet fullLocationLower = (jobLocationValue + " " + countryRegionValue).toLowerCase();let isUSJob = fullLocationLower.includes("usa") || fullLocationLower.includes("united states") || /\bus\b/.test(fullLocationLower);

      Define specifically allowed locations for salary transparency compliancelet allowedUSStates = ["massachusetts", "illinois", "colorado", "minnesota", "new york", "oregon", "ohio", "california", "washington", "nevada", "maryland", "new jersey"];let allowedUSAbbr = ["ma", "il", "co", "mn", "ny", "or", "oh", "ca", "wa", "nv", "md", "nj", "wdc", "dc"];let allowedGlobalCountries = ["canada"];

      let isSalaryLocationValid = false;

      Rule C: Is the location mandated to show salary?if (isUSJob) {isSalaryLocationValid = allowedUSStates.some(state =>fullLocationLower.includes(state)) ||allowedUSAbbr.some(abbr =>new RegExp(\\b${abbr}\\b).test(fullLocationLower));} else {isSalaryLocationValid = allowedGlobalCountries.some(country =>fullLocationLower.includes(country));}

      Final Boolean: All three rules must pass to display the salary range tokenlet showSalaryRange = isSalaryLocationValid && isJobLevelSalaryEligible && isSalaryPaid;

      1. PHASE 2: UI MANIPULATION & DOM INJECTIONLoop through all tokens again. This time, we apply styles, icons, and move them into the new grid.allTokens.forEach(el =>{try {Skip processing if this container accidentally holds the main job descriptionif (!el || el.querySelector('[itemprop="description"]')) return;

      let labelEl = el.querySelector('.joblayouttoken-label');if (!labelEl) return;

      let labelText = labelEl.innerText;let customPropertyid = generatePropertyId(labelText);

      Hide utility tokens that were only needed for backend business logic calculationsif (["EmployeeGroup", "CountryRegion", "Region", "JobLevel"].includes(customPropertyid)) {el.style.display = 'none';return;}

      Hide the salary token if it failed the business rule checkif (customPropertyid === "SalaryRange" && !showSalaryRange) {el.style.display = 'none';return;}

      TEXT OVERRIDES: Force specific terminology on the frontendif (customPropertyid === "SalaryRange" && labelText.toLowerCase().includes("recruitment salary range")) {labelEl.innerText = labelText.replace(/Recruitment Salary Range/ig, "Annual Salary Range");}Cleanup messy abbreviations from SAPif (labelText.includes("(Short)")) {labelEl.innerText = labelText.replace(/(Short)/g, "(s)");}

      BRUTE FORCE STYLING: Override SAP's native CSS for the LabelslabelEl.style.setProperty('font-weight', 'bold', 'important');labelEl.style.setProperty('font-size', '14px', 'important');labelEl.style.setProperty('color', '#303030', 'important');labelEl.style.setProperty('font-family', 'Verdana, Geneva, sans-serif', 'important');

      BRUTE FORCE STYLING: Override SAP's native CSS for the Valueslet valueEl = el.querySelector('.rtltextaligneligible');if (valueEl) {valueEl.style.setProperty('font-weight', 'normal', 'important');valueEl.style.setProperty('font-size', '15px', 'important');valueEl.style.setProperty('color', '#303030', 'important');valueEl.style.setProperty('font-family', 'Verdana, Geneva, sans-serif', 'important');}

      ICON MAPPING: Assign specific Glyphicons or custom image URLs based on the token typelet icon = '';let iconUrl = '';

      switch (customPropertyid) {case 'JobLocation': icon = 'glyphicon-map-marker'; break;case 'BusinessUnit': icon = 'glyphicon-briefcase'; break;case 'JobCategory': icon = 'glyphicon-dashboard'; break;case 'EmploymentType': icon = 'glyphicon-star-empty'; break;case 'ReqID': icon = 'glyphicon-calendar'; break;case 'WorkLocationType': icon = 'glyphicon-paste'; break;case 'JobExperienceLevel': iconUrl = 'https:rmkcdn.successfactors.com/ef55fddb/b4cf3492-3cb2-4e29-a914-3.png'; break;case 'SalaryRange': iconUrl = 'https:rmkcdn.successfactors.com/ef55fddb/3bd06ab1-e5dc-4e72-abcb-3.png'; break;case 'TAPartner': iconUrl = 'https:rmkcdn.successfactors.com/ef55fddb/66a66419-f8c9-4f0e-b94a-6.png'; break;}

      Generate the HTML for the icon (either a span for a font-icon or an img tag)let iconHtml = '';if (icon) {iconHtml = ; } else if (iconUrl) { iconHtml =;}

      SAFE DOM MANIPULATIONWrap the existing token and the new icon inside a flexible flexbox row container.We use DOM traversal (previousElementSibling) to avoid using dynamic ID queries which can fail if SAP injects weird characters.let containerToWrap = labelEl.parentElement;if(containerToWrap) {containerToWrap.insertAdjacentHTML('beforebegin', ${iconHtml});let wrapper = containerToWrap.previousElementSibling;if(wrapper) {wrapper.appendChild(containerToWrap);Clean up residual text nodes (like line breaks) to prevent unwanted spacing in the layoutlet nextNode = wrapper.nextSibling;if(nextNode && nextNode.nodeType === 3) nextNode.remove();}}

      Finally, move the fully formatted token element into our custom green gridgrid.appendChild(el);} catch (err) {If a specific token is malformed by SAP, log the error but allow the loop to continue formatting the rest of the tokensconsole.error("Erro ao processar o token:", err);}});

      1. FINAL CLEANUPRemove the raw text strings from the bottom of the job description that were used as data fallbacksif (descDiv) {let descHtml = descDiv.innerHTML;descHtml = descHtml.replace(/Employee Group:[\s\S]*?(?=Danfoss engineers solutions that increase machine productivity, reduce emissions, lower energy consumption, and enable electrification. Our solutions are used in areas such as refrigeration, air conditioning, heating, power conversion, motor control, industrial machinery, marine, and on- and off-highway equipment. We also provide solutions for data centers, renewable energy, energy storage, heat recovery, as well as contribute to district energy solutions for cities.Our innovative engineering dates back to 1933. Danfoss is family-owned and employs over 39,000 people. We create long-term value for our customers in more than 100 countries with a global footprint of around 100 factories."},"de_DE": { image: "https:rmkcdn.successfactors.com/ef55fddb/7571acdc-3a84-48b1-bac6-4.jpg", description: "Danfoss entwickelt Lösungen, die die Produktivität von Maschinen steigern, Emissionen reduzieren, den Energieverbrauch senken und Elektrifizierung ermöglichen. Unsere Lösungen kommen in Bereichen wie Kälte- und Klimatechnik, Heizung, Energieumwandlung, Motorsteuerung, Industriemaschinen, Schifffahrt sowie in On- und Off-Highway-Anwendungen zum Einsatz. Darüber hinaus bieten wir Lösungen für Rechenzentren, erneuerbare Energien, Energiespeicherung und Wärmerückgewinnung und tragen zu Fernenergielösungen für Städte bei. Unsere innovative Ingenieurskunst reicht bis ins Jahr 1933 zurück. Danfoss ist ein familiengeführtes Unternehmen mit über 39.000 Mitarbeitenden. Wir schaffen langfristigen Mehrwert für unsere Kunden in mehr als 100 Ländern - mit rund 100 Produktionsstätten weltweit." },"sk_SK": { image: "https:rmkcdn.successfactors.com/ef55fddb/7571acdc-3a84-48b1-bac6-4.jpg", description: "Danfoss vyvíja rieenia, ktoré zvyujú produktivitu strojov, zniujú emisie, zniujú spotrebu energie a umoujú elektrifikáciu. Nae rieenia sa pouívajú v oblastiach ako chladenie, klimatizácia, vykurovanie, konverzia energie, riadenie motorov, priemyselné stroje, námorný sektor a cestná aj mimocestná technika. Poskytujeme tie rieenia pre dátové centrá, obnovitené zdroje energie, ukladanie energie, rekuperáciu tepla a prispievame k rieeniam centralizovaného zásobovania energiou pre mestá. Naa inovatívna technická tradícia siaha a do roku 1933. Danfoss je rodinná spolonos s viac ako 39 000 zamestnancami. Vytvárame dlhodobú hodnotu pre naich zákazníkov vo viac ako 100 krajinách a máme pribline 100 výrobných závodov po celom svete." },"pl_PL": { image: "https:rmkcdn.successfactors.com/ef55fddb/7571acdc-3a84-48b1-bac6-4.jpg", description: "Danfoss opracowuje rozwizania, które zwikszaj wydajno maszyn, redukuj emisje, obniaj zuycie energii oraz umoliwiaj elektryfikacj. Nasze rozwizania s wykorzystywane w takich obszarach jak chodnictwo, klimatyzacja, ogrzewanie, przetwarzanie energii, sterowanie silnikami, maszyny przemysowe, sektor morski oraz pojazdy drogowe i pozadrogowe. Oferujemy równie rozwizania dla centrów danych, energii odnawialnej, magazynowania energii i odzysku ciepa oraz wspieramy miejskie systemy ciepownicze. Nasza innowacyjna dziaalno inynieryjna siga 1933 roku. Danfoss jest firm rodzinn i zatrudnia ponad 39 000 pracowników. Tworzymy dugoterminow warto dla naszych klientów w ponad 100 krajach, posiadajc okoo 100 zakadów produkcyjnych na caym wiecie." },"da_DK": { image: "https:rmkcdn.successfactors.com/ef55fddb/7571acdc-3a84-48b1-bac6-4.jpg", description: "Danfoss udvikler løsninger, der øger maskinernes produktivitet, reducerer emissioner, sænker energiforbruget og muliggør elektrificering. Vores løsninger anvendes inden for områder som køling, aircondition, opvarmning, energikonvertering, motorstyring, industrimaskiner, marine samt on- og off-highway udstyr. Vi leverer også løsninger til datacentre, vedvarende energi, energilagring og varmegenvinding samt bidrager til fjernvarmeløsninger til byer. Vores innovative ingeniørarbejde går tilbage til 1933. Danfoss er familieejet og beskæftiger mere end 39.000 medarbejdere. Vi skaber langsigtet værdi for vores kunder i mere end 100 lande med et globalt fodaftryk på omkring 100 fabrikker." },"es_MX": { image: "https:rmkcdn.successfactors.com/ef55fddb/7571acdc-3a84-48b1-bac6-4.jpg", description: "Danfoss desarrolla soluciones que aumentan la productividad de las máquinas, reducen emisiones, disminuyen el consumo de energía y permiten la electrificación. Nuestras soluciones se utilizan en áreas como refrigeración, aire acondicionado, calefacción, conversión de energía, control de motores, maquinaria industrial, sector marino y equipos dentro y fuera de carretera. También ofrecemos soluciones para centros de datos, energías renovables, almacenamiento de energía y recuperación de calor, y contribuimos a soluciones energéticas urbanas. Nuestra ingeniería innovadora se remonta a 1933. Danfoss es una empresa familiar con más de 39,000 empleados. Creamos valor a largo plazo para nuestros clientes en más de 100 países, con una presencia global de alrededor de 100 plantas de producción." },"zh_CN": { image: "https:rmkcdn.successfactors.com/ef55fddb/7571acdc-3a84-48b1-bac6-4.jpg", description: ", ,, 1933,39,000100,100" },"fr_FR": { image: "https:rmkcdn.successfactors.com/ef55fddb/7571acdc-3a84-48b1-bac6-4.jpg", description: "Danfoss développe des solutions qui augmentent la productivité des machines, réduisent les émissions, diminuent la consommation d'énergie et permettent l'électrification. Nos solutions sont utilisées dans des domaines tels que la réfrigération, la climatisation, le chauffage, la conversion d'énergie, le contrôle des moteurs, les machines industrielles, le secteur maritime ainsi que les équipements routiers et tout-terrain. Nous fournissons également des solutions pour les centres de données, les énergies renouvelables, le stockage d'énergie et la récupération de chaleur, et nous contribuons aux solutions énergétiques urbaines. Notre ingénierie innovante remonte à 1933. Danfoss est une entreprise familiale qui emploie plus de 39 000 personnes. Nous créons de la valeur à long terme pour nos clients dans plus de 100 pays, avec une présence mondiale d'environ 100 sites de production." }}};

      /

      • HELPER FUNCTION: String Purifier
      • When someone types "LeanHeat!" or " Lean Heat ", this function removes
      • spaces, punctuation, and makes it lowercase ("leanheat").
      • This makes sure we always match the brand in our database correctly.
      • /function purify(str) {return str.toLowerCase().replace(/[^a-z0-9]/g, '');}

      /

      • MAIN LOGIC: Render Brand Content
      • This function looks at the page, finds the brand name, and draws the image.
      • /function renderBrandContent() {Step 1: Grab every single element currently visible on the pagevar elements = document.querySelectorAll('*');

      Default brand is "standard" in case we don't find anythingvar detectedKey = "standard";

      Step 2: Loop through all elements to find the label "Brand:"for (var i = 0; i

      Clean up the text (e.g., "Lean Heat" ->"leanheat")var cleanValue = purify(rawValue);

      If this clean name exists in our database above, save it as the detected brandif (brandContent[cleanValue]) {detectedKey = cleanValue;}

      Stop searching since we found what we neededbreak;}}

      Step 3: Find out what language the user is viewing the page in (e.g., "en-US" becomes "enUS")var lang = document.documentElement.lang.replace('-', '') || 'en_GB';

      Step 4: Get the specific image and text for the detected Brand AND LanguageFallbacks: If language doesn't exist, use English. If brand doesn't exist, use standard English.var data = brandContent[detectedKey][lang] || brandContent[detectedKey]['en_GB'] || brandContent['standard']['en_GB'];

      Step 5: Check if we haven't already drawn our custom block. If not, draw it!if (!document.querySelector('.custom-brand-display')) {This is the HTML code we will inject into the pageIt uses the classes we styled in the section abovevar contentToInject = `

      ${data.description}

      `;

      Find the "Apply Now" button container...var applyContainer = document.querySelector('.applylink.unify-button-container');...and paste our new HTML block right below itif (applyContainer) applyContainer.insertAdjacentHTML('afterend', contentToInject);}}

      /

      • DYNAMIC LISTENER (MutationObserver)
      • Web pages today often load information slowly or change dynamically without reloading.
      • This "Observer" watches the page continuously. If anything changes, it runs our
      • function again to ensure the image appears even if the page loads slowly.
      • /var observer = new MutationObserver(renderBrandContent);Tell the observer to watch the whole body for any added or removed elementsobserver.observe(document.body, { childList: true, subtree: true });

      Also run it once immediately just in case the page is already fully loadedrenderBrandContent();})();

      (function() {/ ==========================================================================SCRIPT 2: CLEANUP SCRIPT (Element Hider)Since Script 1 added a beautiful new image and description, we don't wantthe user to still see the raw, ugly text that says "Brand: LeanHeat" onthe page. This script finds that old text and makes it invisible.========================================================================== /

      function hideBrandElement() {Find all text-bearing elements on the pagevar allLabels = document.querySelectorAll('.joblayouttoken-label, span, div, p, label');

      Check each element one by oneallLabels.forEach(function(el) {If the element says exactly "Brand:"if (el.textContent && el.textContent.trim() === "Brand:") {Hide the word "Brand:"el.style.display = 'none';

      Hide the value next to it (e.g., the word "LeanHeat")if (el.nextElementSibling) {el.nextElementSibling.style.display = 'none';}

      If they are sitting inside a small container box by themselves, hide the box tooif (el.parentElement && el.parentElement.children.length

Numbers & Facts

LocationMilwaukee, WI

Skills

  • Alternative Energyunmatched
  • CSS (Cascading Style Sheet)unmatched
  • DOM (Document Object Model)unmatched
  • English Languageunmatched
  • HTML (HyperText Markup Language)unmatched
  • HVACunmatched
  • Manufacturing Engineeringunmatched
  • Metadataunmatched
  • Motor Control Systemsunmatched
  • Network Operations Centerunmatched
  • Productivity Managementunmatched
  • Refrigerationunmatched
  • Regular Expressionsunmatched
  • Reporting Dashboardsunmatched
  • SAPunmatched
  • Scripting (Scripting Languages)unmatched
  • User Interface/Experience (UI/UX)unmatched
  • Web Browsersunmatched

Level up your application

Professional resume templates

Browse dozens of recruiter approved resume templates, layouts and formats. Choose your favorite and make it your own in minutes.

Free resume templates

Resume Builder

Improve your existing resume or start from scratch and create a standout, ATS-friendly resume. Add job-specific content, download and apply.

Resume Builder