Search

Spare Parts Team Lead

PublishedPublished: 10/31/2026
${titleText}

`); // Reference to the newly injected grid where we will move the tokens let grid = columnOne.querySelector('.job-grid'); // 3. TOKEN GATHERING // SAP 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 rules let jobLocationValue = ""; let countryRegionValue = ""; let regionValue = ""; let jobLevelValue = ""; let employeeGroupValue = ""; // 4. 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 language let propId = generatePropertyId(labelText); let valueEl = el.querySelector('.rtltextaligneligible'); let valueText = valueEl ? valueEl.textContent.trim() : ""; // Populate the business rule variables based on the identified property ID if (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(); }); // 5. DATA FALLBACK: JOB DESCRIPTION PARSING // If 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*([^\n\r]+)/i); if (eg) employeeGroupValue = eg[1].toLowerCase().trim(); } if (!countryRegionValue) { let cr = descText.match(/Country:\s*([^\n\r]+)/i); if (cr) countryRegionValue = cr[1].toLowerCase().trim(); } if (!regionValue) { let rg = descText.match(/Region:\s*([^\n\r]+)/i); if (rg) regionValue = rg[1].toLowerCase().trim(); } if (!jobLevelValue) { let jl = descText.match(/Job Level:\s*([^\n\r]+)/i); // Ensure we don't accidentally grab "Job Experience Level" if (jl && !jl[0].toLowerCase().includes("experience")) { jobLevelValue = jl[1].toUpperCase().trim(); } } } // 6. 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 eligibility let fullLocationLower = (jobLocationValue + " " + countryRegionValue).toLowerCase(); let isUSJob = fullLocationLower.includes("usa") || fullLocationLower.includes("united states") || /\bus\b/.test(fullLocationLower); // Define specifically allowed locations for salary transparency compliance let 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 token let showSalaryRange = isSalaryLocationValid && isJobLevelSalaryEligible && isSalaryPaid; // 7. PHASE 2: UI MANIPULATION & DOM INJECTION // Loop 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 description if (!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 calculations if (["EmployeeGroup", "CountryRegion", "Region", "JobLevel"].includes(customPropertyid)) { el.style.display = 'none'; return; } // Hide the salary token if it failed the business rule check if (customPropertyid === "SalaryRange" && !showSalaryRange) { el.style.display = 'none'; return; } // TEXT OVERRIDES: Force specific terminology on the frontend if (customPropertyid === "SalaryRange" && labelText.toLowerCase().includes("recruitment salary range")) { labelEl.innerText = labelText.replace(/Recruitment Salary Range/ig, "Annual Salary Range"); } // Cleanup messy abbreviations from SAP if (labelText.includes("(Short)")) { labelEl.innerText = labelText.replace(/\(Short\)/g, "(s)"); } // BRUTE FORCE STYLING: Override SAP's native CSS for the Labels labelEl.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 Values let 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 type let 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 MANIPULATION // Wrap 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 layout let nextNode = wrapper.nextSibling; if(nextNode && nextNode.nodeType === 3) nextNode.remove(); } } // Finally, move the fully formatted token element into our custom green grid grid.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 tokens console.error("Erro ao processar o token:", err); } }); // 8. FINAL CLEANUP // Remove the raw text strings from the bottom of the job description that were used as data fallbacks if (descDiv) { let descHtml = descDiv.innerHTML; descHtml = descHtml.replace(/Employee Group:[\s\S]*?(?=
arr.some(keyword => normalized.includes(keyword)); if (contains(["employee group"])) return "EmployeeGroup"; if (contains(["country", "land", "país", "pays", "paese", "kraj", "krajina"])) return "CountryRegion"; if (contains(["region", "región", "région", "регион", "地区"])) return "Region"; if (contains(["posting job location", "job location", "joblokation", "jobsted", "arbeitsort", "ubicación", "site de l'emploi", "lokalizacja", "местоположение", "miesto", "职位地点", "sede di lavoro"])) return "JobLocation"; if (contains(["salary range", "annual recruitment salary", "løninterval", "gehaltsspanne", "przedział wynagrodzenia", "fourchette", "rango salarial", "mzdové rozpätie", "lønramme", "диапазон зарплаты"])) return "SalaryRange"; if (contains(["job experience level", "erfaringsniveau", "erfahrungsniveau", "poziom doświadczenia", "expérience professionnelle", "experiência"])) return "JobExperienceLevel"; if (contains(["posting job level", "job level", "jobniveau", "joblevel", "nivel del puesto", "niveau du poste", "poziom stanowiska", "уровень должности", "úroveň pozície"])) return "JobLevel"; if (contains(["employment type", "ansættelse", "beschäftigungsart", "tipo de emprego", "type d'emploi", "rodzaj zatrudnienia", "тип занятости", "typ pracovného pomeru", "员工类型", "tipologia di impiego", "tipo de empleo"])) return "EmploymentType"; if (contains(["work location type", "arbejdsstedstype", "arbeitsmodell", "tipo de ubicacion", "emplacement de travail", "miejsca pracy", "формат работы", "výkonu práce", "工作地点类型", "modalità di lavoro"])) return "WorkLocationType"; if (contains(["job category", "jobkategori", "stellenkategorie", "categoría", "catégorie", "kategoria", "категория должности", "kategória", "职位类别", "area professionale"])) return "JobCategory"; if (contains(["business unit", "segment", "segmento", "firmaenhed", "unternehmenseinheit", "jednostka biznesowa", "сегмент", "业务板块"])) return "BusinessUnit"; if (contains(["req id", "rek-id", "kennung", "id de solicitud", "identifiant de la demande", "identyfikator", "идентификатор", "id pracovní pozície", "需求 id", "identifikačné", "id posizione", "requisition id", "stellen-id"])) return "ReqID"; if (contains(["ta partner", "partenaire ta"])) return "TAPartner"; // Fallback: If no match, strip spaces and punctuation to create a camelCase-style ID return jobLayoutTokenLabel.replace(/[\s:\(\)\]\[]/g,'');}

The Impact You'll Make

As the Spare Parts Team Lead, you will play a critical role in ensuring customers receive the parts they need on time while helping keep operations running smoothly. Your leadership will directly support order fulfillment, inventory accuracy, and overall customer satisfaction.

In this role, you'll coordinate spare parts kitting activities, identify potential material or BOM issues before they impact deliveries, and help minimize downtime through proactive planning and communication. You'll serve as a key link between Warehouse, Inventory, Production, and Shipping teams.

If you enjoy leading by example, solving operational challenges, and driving continuous improvement in a manufacturing or warehouse environment, this is an opportunity to make a meaningful impact every day.

What You'll Be Doing

  • Lead and support the spare parts kitting process to ensure accurate, complete, and on-time order fulfillment that meets customer delivery commitments.

  • Monitor parts availability, identify shortages or discrepancies, and proactively communicate risks to help prevent delays and operational disruptions.

  • Verify part numbers, quantities, revisions, and kit completeness while maintaining high standards for quality, inventory accuracy, and system transactions.

  • Partner closely with Warehouse, Inventory, Production, and Shipping teams to prioritize work, resolve material concerns, and support department goals.

  • Help improve operational performance by identifying BOM, work instruction, and process improvement opportunities while maintaining safe, organized work areas.

What We're Looking For

  • Experience in warehouse, inventory, kitting, manufacturing, or material-handling operations, including the ability to coordinate and prioritize daily work activities.

  • Strong attention to detail with the ability to accurately read and interpret part numbers, pick lists, BOMs, work orders, labels, and work instructions.

  • Working knowledge of inventory control practices and the ability to learn and use SAP or similar inventory management systems.

  • Effective communication, organization, and problem-solving skills with the ability to collaborate across multiple teams.

What You'll Get from Us

  1. We promote from within and support your learning with mentoring, training, and access to global opportunities.
  2. You'll have flexibility, autonomy, and support to do your best work while maintaining a healthy work-life balance. Your well-being matters to us.
  3. We strive to create an inclusive work environment where people of all backgrounds are respected, and valued for who they are.
  4. You'll receive benefits like annual bonus, paid vacation, pension plans, personal insurance, and more. These vary by country and contract, but they're worth asking about-we think they're pretty great.


Ready to Make a Difference?

If this role excites you, we'd love to hear from you! Apply now to start the conversation and learn more about where your career can go with us.

Our Commitment to Transparency

Salary ranges listed reflect only primary location and currency. For local salary ranges and specific benefits in your preferred hiring location, please ask your Talent Acquisition representative for more information.

The actual salary offer will carefully consider a wide range of factors, including your skills, qualifications, experience, and location. Any benefits listed do not promise or guarantee any particular benefit or specific action. They may depend on country or contract specifics and are subject to change at any time without prior notice.

Want to know more? Please visit our FAQ Page.

All qualified applicants will receive consideration for employment without regard to race, color, religion, sex, sexual orientation, gender identity, national origin, age, disability, veteran status, or other protected category.

Employee Group: Hourly Paid

Country: United States

Region: NAM

Information at a Glance