Title:Project Accounting/Payroll Specialist - Major NYC Infrastructure Projects
Salary:Competitive + overtime/benefits
Why CFS Is Excited To Fill This: - Access to one of NYC's flagship public infrastructure redevelopments: Midtown Bus Terminal and Broadway Bridge
- Proven leadership team with 24+ years' tenure; offers expert mentorship and internal mobility
- Stable, employee-owned company with a track record of supporting long career progression
- Urgent team build-up as project hits critical mobilization; direct visibility with senior management
Key Responsibilities: - Support project accounting, including invoice processing and vendor management (AP focus)
- Manage payroll or project-based timekeeping (role depending on placement)
- Assist with mobilization and office setup for new project phases
- Collaborate closely with project controllers and executive team for training and hand-off
- Contribute to a culture of open communication and process improvement
Must-Have Skills/Experience: - Accounts payable OR payroll processing experience in a construction or project-driven environment (Required)
- Proactive, eager learner comfortable in dynamic project settings (Required)
- Experience with JDE software (Preferred; Inferred, Confidence: 80%)
Preferred Skills: - Prior experience on large-scale construction/engineering projects (Preferred)
Location & Pattern:Manhattan, NY ; office setup in progress
Benefits & Perks: - Employee-owned structure; strong internal growth pathways
- Overtime eligible; medical/benefits package (details at interview)
- PTO (details at interview)
- Mentorship by tenured senior project controller
About the Company:Perini is a nationally recognized leader in large-scale public infrastructure. Employees thrive in a supportive and stable environment - 24+ year tenures are not uncommon. With a proven record of upward mobility, the firm values knowledge-sharing, training, and open communication. Compensation: $70,000.00-$85,000.00
EB-1617242082 document.addEventListener('DOMContentLoaded', () => { const root = document.querySelector('#job_desc'); if (!root) return; // Skip wrapping if we've already done it if (root.dataset.hashtagsWrapped === "1") return; const SKIP = new Set(['SCRIPT','STYLE']); const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { acceptNode(node) { if (!node.nodeValue || !node.nodeValue.match(/#[p{L}p{N}_]+/u)) return NodeFilter.FILTER_REJECT; // Avoid wrapping inside an existing hashtag span let p = node.parentNode; while (p && p !== root) { if (p.nodeType === 1 && p.hasAttribute('data-hashtag')) return NodeFilter.FILTER_REJECT; if (SKIP.has(p.nodeName)) return NodeFilter.FILTER_REJECT; p = p.parentNode; } return NodeFilter.FILTER_ACCEPT; } }); const re = /#[p{L}p{N}_-]+/gu; function wrapTextNode(textNode) { const text = textNode.nodeValue; re.lastIndex = 0; let m, last = 0; const frag = document.createDocumentFragment(); while ((m = re.exec(text)) !== null) { // preceding plain text if (m.index > last) frag.appendChild(document.createTextNode(text.slice(last, m.index))); // hashtag span const span = document.createElement('span'); span.textContent = m[0]; span.setAttribute('data-hashtag', '1'); // idempotence guard span.setAttribute('style', 'font-size:9px;color:#fff'); // requested inline style frag.appendChild(span); last = re.lastIndex; } // trailing plain text if (last < text.length) frag.appendChild(document.createTextNode(text.slice(last))); textNode.parentNode.replaceChild(frag, textNode); } const toProcess = []; let n; while ((n = walker.nextNode())) toProcess.push(n); toProcess.forEach(wrapTextNode); root.dataset.hashtagsWrapped = "1"; });