**## Describe the problem/error/question
**
LDAP Update node rejects `undefined`/`null` values in v2.13.4+, breaking conditional attribute updates. **
**
Previously (older n8n versions): LDAP node accepted empty/`null` values gracefully.
Now (v2.13.4+): Stricter type validation throws `argument must be a string (was: undefined)` when expressions return `undefined`.
Business case: Sync CSV → Active Directory users with logic:
IF office_CSV == department_CSV → clear department field (empty)
ELSE → set department = department_CSV value
****Code generates 3 flags**:
- `shouldDeleteDepartment`: office==dept && deptAD!=“” → DELETE existing value
- `shouldSkipDepartment`: office==dept && deptAD==“” → SKIP (already empty)
- `shouldReplaceDepartment`: office!=dept → REPLACE with new value
**Failing LDAP config**:**
department = {{ shouldSkipDepartment ? undefined : department_CSV }}
→ “argument must be a string (was: undefined)”
****Expected**: Skip attribute when `undefined`. **Actual**: Node crashes.
What is the error message (if any)?
**
Success Branch
Error Branch (1 item)
[
{ “error”: “argument must be a string (was: undefined)”
} ]
AD server error (when trying empty string "" instead):
“00000057: LdapErr: DSID-0C09105D, comment: Error in attribute conversion operation, data 0, v4563 Code: 0x15”
## Please share your workflow
{
“nodes”: [
{
“parameters”: {
“mode”: “runOnceForEachItem”,
“jsCode”: “const previousNode = $(‘Przygotuj listę zmian1’);\nconst previousData = previousNode.item.json;\n\nreturn {\n json: {\n ldapResult: $json,\n imie: previousData[“Imię”] || “Brak”,\n nazwisko: previousData[“Nazwisko”] || “Brak”,\n mail: previousData.mail_CSV || “Brak”,\n userDN: previousData.userDN || “Brak”,\n departmentAction: previousData.departmentAction || “none”,\n changesList: previousData.changesList || \n }\n};”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
2704,
2112
],
“id”: “1bcb8eca-a3af-47c6-8de2-35a1d1ef3ebb”,
“name”: “Połącz dane LDAP z danymi raportu”,
“onError”: “continueErrorOutput”
},
{
“parameters”: {
“executeOnce”: false,
“command”: “type \\sr-01031\public\BSPe\Export\PracownicyRuch2.csv”
},
“id”: “1e91ad14-8631-41c2-bf6f-e5170ffc5f5e”,
“name”: “Execute Command1”,
“type”: “n8n-nodes-base.executeCommand”,
“typeVersion”: 1,
“position”: [
-1744,
1840
]
},
{
“parameters”: {
“jsCode”: “const csv = $input.first().json.csv;\n\nconst rows = csv.trim().split(‘\n’);\nconst headers = rows[0].split(‘;’); \n\nconst parsedRows = rows.slice(1).map(row => {\n const values = row.split(‘;’); \n const obj = {};\n headers.forEach((header, i) => {\n obj[header.trim()] = values[i]?.trim();\n });\n return { json: obj };\n});\n\nreturn parsedRows;\n”
},
“id”: “caca516d-4f76-46a2-b66b-8f6855df47b1”,
“name”: “Parse CSV (Code)1”,
“type”: “n8n-nodes-base.code”,
“typeVersion”: 1,
“position”: [
-1184,
1840
]
},
{
“parameters”: {
“options”: {}
},
“type”: “n8n-nodes-base.splitInBatches”,
“typeVersion”: 3,
“position”: [
16,
1456
],
“id”: “74a119eb-bb3e-49ce-92ad-2b02300eb879”,
“name”: “Loop Over Items1”,
“onError”: “continueErrorOutput”
},
{
“parameters”: {
“jsCode”: “const csvString = $input.first().json.stdout;\n\nreturn [\n {\n json: {\n csv: csvString\n }\n }\n];\n”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
-1520,
1840
],
“id”: “14a94b2e-c43d-4bdf-81ee-3d9108a9c9a7”,
“name”: “Code2”
},
{
“parameters”: {
“conditions”: {
“options”: {
“caseSensitive”: true,
“leftValue”: “”,
“typeValidation”: “loose”,
“version”: 2
},
“conditions”: [
{
“id”: “1bef837d-eaee-4220-8f3b-0af18724143d”,
“leftValue”: “={{ $json.updateNeeded }}”,
“rightValue”: “={{ $json.title_AD }}”,
“operator”: {
“type”: “boolean”,
“operation”: “true”,
“singleValue”: true
}
}
],
“combinator”: “or”
},
“looseTypeValidation”: true,
“options”: {}
},
“type”: “n8n-nodes-base.if”,
“typeVersion”: 2.2,
“position”: [
1248,
1840
],
“id”: “0a71ad59-3ba0-457e-b6f7-9f401d981f16”,
“name”: “If1”,
“retryOnFail”: false,
“onError”: “continueErrorOutput”
},
{
“parameters”: {
“jsCode”: “return $input.all().map(item => {\n // Pracownik\n const emailField = “mail - pracownika”;\n let email = item.json[emailField];\n if (email && typeof email === “string”) {\n email = email.trim().toLowerCase();\n if (email.endsWith(“@ruch.com.plruch.com.pl”)) {\n email = emai@ruch.replace(/@ruc@orlenpaczka.pl\.com\.pl$/, “@orlenpaczka.pl”);\n }\n item.json[emailField] = email;\n\n // Ustal company na podstawie maila pracown@orlenpaczka.plka\n if (email.includes(“@orlenpaczka.pl”)) {\n item.json[“company”] = “ORLE@fincores.pl Paczka”;\n } else if (email.includes(“@fincores.pl”)) {\n item.json[“company”] = “Fincores@uslugilog.plBusiness Solutions”;\n } else if (email.includes(“@uslugilog.pl”)) {\n item.json[“company”] = “Usługi Logistyczne SA”;\n } else {\n item.json[“company”] = “”;\n }\n }\n\n const managerEmailField = “mail - przełożony”;\n let managerEmail = item.json[managerEmailField];\n if (managerEmail && typeof managerEmail === “string”) {\n managerEmail = m@ruch.com.plnagerEmail.trim().toLowerCase();\n if (managerE@ruchail.endsWith(“@ruch.com.pl”)) {\n managerEmail = managerEmail.replace(/@ruch\.com\.pl$/, “@orlenpaczka.pl”);\n }\n item.json[managerEmailField] = managerEmail;\n }\n\n return item;\n});\n”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
-880,
1840
],
“id”: “f232933a-7f31-427b-9346-8acb62cc6413”,
“name”: “Zmiana adresu email1”
},
{
“parameters”: {
“baseDN”: “OU=OU_Users,DC=pl,DC=ruch”,
“searchFor”: “(objectclass=user)”,
“attribute”: “mail”,
“searchText”: “={{ $json[“mail - przełożony”] }}”,
“options”: {}
},
“type”: “n8n-nodes-base.ldap”,
“typeVersion”: 1,
“position”: [
224,
1840
],
“id”: “3919e782-b1d5-4fbb-a313-7c8dd2f7bc8d”,
“name”: “LDAP4”,
“executeOnce”: false,
“alwaysOutputData”: false,
“credentials”: {
“ldap”: {
“id”: “Zxm5Up1NPFt20h6w”,
“name”: “LDAP account”
}
},
“onError”: “continueErrorOutput”
},
{
“parameters”: {
“mode”: “combine”,
“combineBy”: “combineByPosition”,
“numberInputs”: 3,
“options”: {
“clashHandling”: {
“values”: {
“resolveClash”: “addSuffix”
}
},
“includeUnpaired”: true
}
},
“type”: “n8n-nodes-base.merge”,
“typeVersion”: 3.2,
“position”: [
592,
1488
],
“id”: “302335ee-e7fe-4423-8db8-030fe27d6484”,
“name”: “Merge3”
},
{
“parameters”: {
“mode”: “runOnceForEachItem”,
“jsCode”: “const output = {};\n\n// ===== PODSTAWOWE DANE =====\noutput[“Imię”] = item.json[“Imię_1”] || “”;\noutput[“Nazwisko”] = item.json[“Nazwisko_1”] || “”;\n\n// ===== DANE Z CSV (do aktualizacji w AD) =====\noutput[“title_CSV”] = item.json[“Długa nazwa stanowiska_1”] || “”;\noutput[“department_CSV”] = item.json[“Jednostka organizacyjna_1”] || “”;\noutput[“company_CSV”] = item.json[“company_1”] || “”;\noutput[“office_CSV”] = item.json[“Nazwa podobsz. kadr._1”] || “”;\n\nlet pager = item.json[“MPK_1”] || “”;\nif (pager && typeof pager === “string”) {\n pager = pager.trim();\n\n if (pager.startsWith(“O”)) {\n output[“pager_CSV”] = pager;\n } else {\n output[“pager_CSV”] = pager.replace(/^0+/, “”) || “0”;\n }\n} else {\n output[“pager_CSV”] = “”;\n}\n\noutput[“mail_CSV”] = item.json[“mail - pracownika_1”] || “”;\noutput[“manager_CSV”] = item.json[“dn_2”] || item.json[“manager_3”] || “”;\n\n// ===== DN UŻYTKOWNIKA =====\noutput[“userDN”] = item.json[“dn_3”] || “”;\n\n// ===== DANE Z AD (do porównania) =====\noutput[“title_AD”] = item.json[“title_3”] || “”;\noutput[“department_AD”] = item.json[“department_3”] || “”;\noutput[“company_AD”] = item.json[“company_3”] || “”;\noutput[“office_AD”] = item.json[“physicalDeliveryOfficeName_3”] || “”;\noutput[“pager_AD”] = item.json[“pager_3”] || “”;\noutput[“manager_AD”] = item.json[“manager_3”] || “”;\n\n// ===== NORMALIZACJA =====\nconst titleCSV = (output[“title_CSV”] || “”).trim();\nconst deptCSV = (output[“department_CSV”] || “”).trim();\nconst companyCSV = (output[“company_CSV”] || “”).trim();\nconst officeCSV = (output[“office_CSV”] || “”).trim();\nconst pagerCSV = (output[“pager_CSV”] || “”).trim();\nconst managerCSV = (output[“manager_CSV”] || “”).trim();\n\nconst titleAD = (output[“title_AD”] || “”).trim();\nconst deptAD = (output[“department_AD”] || “”).trim();\nconst companyAD = (output[“company_AD”] || “”).trim();\nconst officeAD = (output[“office_AD”] || “”).trim();\nconst pagerAD = (output[“pager_AD”] || “”).trim();\nconst managerAD = (output[“manager_AD”] || “”).trim();\n\n// ===== LOGIKA department / office =====\nconst sameOfficeAndDepartment =\n officeCSV !== “” &&\n officeCSV === deptCSV;\n\n// department ma być usunięty tylko jeśli:\noutput[“shouldDeleteDepartment”] =\n sameOfficeAndDepartment &&\n deptAD !== “”;\n\n// department ma zostać pusty i NIE może być wpisany ponownie:\noutput[“shouldSkipDepartment”] =\n sameOfficeAndDepartment &&\n deptAD === “”;\n\n// department ma być aktualizowany tylko gdy office != department\noutput[“shouldReplaceDepartment”] =\n !sameOfficeAndDepartment &&\n deptCSV !== deptAD;\n\n// pomocnicza akcja tekstowa do raportu / debug\nif (output[“shouldDeleteDepartment”]) {\n output[“departmentAction”] = “delete”;\n} else if (output[“shouldSkipDepartment”]) {\n output[“departmentAction”] = “skip”;\n} else if (output[“shouldReplaceDepartment”]) {\n output[“departmentAction”] = “replace”;\n} else {\n output[“departmentAction”] = “none”;\n}\n\n// wartość department do użycia w replace tylko gdy wolno\noutput[“departmentValue”] =\n output[“shouldReplaceDepartment”] ? output[“department_CSV”] : undefined;\n\n// ===== CZY W OGÓLE JEST CO AKTUALIZOWAĆ =====\nconst titleChanged = titleCSV !== titleAD;\nconst companyChanged = companyCSV !== companyAD;\nconst officeChanged = officeCSV !== officeAD;\nconst pagerChanged = pagerCSV !== pagerAD;\nconst managerChanged = managerCSV !== managerAD;\n\noutput[“updateNeeded”] =\n titleChanged ||\n companyChanged ||\n officeChanged ||\n pagerChanged ||\n managerChanged ||\n output[“shouldDeleteDepartment”] ||\n output[“shouldReplaceDepartment”];\n\nreturn output;”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
896,
1616
],
“id”: “a6f0ca90-ae89-4289-ba1a-b5c0b07f8e9e”,
“name”: “Code3”,
“onError”: “continueErrorOutput”
},
{
“parameters”: {
“nodeDebug”: true,
“baseDN”: “OU=OU_Users,DC=pl,DC=ruch”,
“searchFor”: “(objectclass=user)”,
“attribute”: “mail”,
“searchText”: “={{ $json[“mail - pracownika”] }}”,
“options”: {}
},
“type”: “n8n-nodes-base.ldap”,
“typeVersion”: 1,
“position”: [
480,
1840
],
“id”: “bcd9ba7d-706f-4c12-98f9-578ab6507945”,
“name”: “LDAP5”,
“credentials”: {
“ldap”: {
“id”: “Zxm5Up1NPFt20h6w”,
“name”: “LDAP account”
}
},
“onError”: “continueErrorOutput”
},
{
“parameters”: {
“mode”: “runOnceForEachItem”,
“jsCode”: “const changes = ;\n\nif ($json.title_CSV !== $json.title_AD) {\n changes.push(title: \“${$json.title_AD}\” → \“${$json.title_CSV}\”);\n}\n\nif ($json.departmentAction === “delete”) {\n changes.push(department: \“${$json.department_AD}\” → [USUNIĘTO]);\n} else if ($json.departmentAction === “replace”) {\n changes.push(department: \“${$json.department_AD}\” → \“${$json.department_CSV}\”);\n} else if ($json.departmentAction === “skip”) {\n changes.push(department: pozostaje puste (office = department = \“${$json.office_CSV}\”));\n}\n\nif ($json.company_CSV !== $json.company_AD) {\n changes.push(company: \“${$json.company_AD}\” → \“${$json.company_CSV}\”);\n}\n\nif ($json.office_CSV !== $json.office_AD) {\n changes.push(office: \“${$json.office_AD}\” → \“${$json.office_CSV}\”);\n}\n\nif ($json.pager_CSV !== $json.pager_AD) {\n changes.push(pager: \“${$json.pager_AD}\” → \“${$json.pager_CSV}\”);\n}\n\nif ($json.manager_CSV !== $json.manager_AD) {\n changes.push(manager: \“${$json.manager_AD}\” → \“${$json.manager_CSV}\”);\n}\n\nreturn {\n …item.json,\n changesList: changes\n};”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
1440,
1600
],
“id”: “af42c705-0aec-4e35-9a79-688d7d7bb592”,
“name”: “Przygotuj listę zmian1”,
“onError”: “continueErrorOutput”
},
{
“parameters”: {
“jsCode”: “// Zbierz wszystkie zaktualizowane itemy\nconst allItems = $input.first().json.data || ;\n\nif (allItems.length === 0) {\n return [{\n json: {\n report: “Brak zmian do zaktualizowania.”,\n totalUpdates: 0\n }\n }];\n}\n\nlet report = === RAPORT AKTUALIZACJI AD ===\\n;\nreport += Data: ${new Date().toLocaleString(‘pl-PL’)}\\n;\nreport += Liczba zaktualizowanych użytkowników: ${allItems.length}\\n\\n;\n\nfor (let i = 0; i < allItems.length; i++) {\n const item = allItems[i];\n \n report += ${i + 1}. ${item.imie || \“Brak\”} ${item.nazwisko || \“Brak\”} (${item.mail || \“Brak\”})\\n;\n report += DN: ${item.userDN || \“Brak\”}\\n;\n \n if (item.changesList && item.changesList.length > 0) {\n report += Zmiany:\\n;\n item.changesList.forEach(change => {\n report += - ${change}\\n;\n });\n }\n report += \\n;\n}\n\nreturn [{\n json: {\n report: report,\n totalUpdates: allItems.length\n }\n}];”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
2896,
1312
],
“id”: “a4b018a1-e846-44f6-beb2-fa62ed105efb”,
“name”: “Formatuj raport1”
},
{
“parameters”: {
“toRecipients”: “kacper.kwasiborski@orlenpaczka.pl”,
“subject”: “=Raport aktualizacji danych AD - {{ $now.toFormat(‘dd.LL.yyyy’) }}”,
“bodyContent”: “={{ $json.report }}”,
“additionalFields”: {}
},
“type”: “n8n-nodes-base.microsoftOutlook”,
“typeVersion”: 2,
“position”: [
3152,
1312
],
“id”: “f4ce8617-3e65-40ef-9d8d-a812a118fa62”,
“name”: “Send a message1”,
“webhookId”: “21b5d8db-3a4e-44b6-b494-6faa2340c4fb”,
“credentials”: {
“microsoftOutlookOAuth2Api”: {
“id”: “nAXHYgtrc6NLu55z”,
“name”: “Microsoft Outlook account”
}
}
},
{
“parameters”: {
“jsCode”: “// Mapowanie skrótów biur i działów na pełne nazwy\nconst biuraMapping = {\n “B. Adm i Zakup.”: “Biuro Administracji i Zakupów”,\n “B. Analiz Bizn.”: “Biuro Analiz Biznesowych i Big Data”,\n “B. Bezpieczeń.”: “Biuro Bezpieczeństwa”,\n “B. Market. i Ko”: “Biuro Marketingu i Komunikacji”,\n “B. Obsł.Klienta”: “Biuro Obsługi Klienta”,\n “B. Rach. Podatk”: “Biuro Rachunkowości i Podatków”,\n “B. Sprzedaży”: “Biuro Sprzedaży”,\n “B. Str.Zarz.Pr”: “Biuro Strategii i Zarządzania Projektami”,\n “B. Str. Zarz.Pr”: “Biuro Strategii i Zarządzania Projektami”,\n “B. Wsp.Kl.Klien”: “Biuro Współpracy z Kluczowymi Partnerami”,\n “B.Logist. Kont”: “Biuro Logistyki Kontraktowej”,\n “B.Praw.i Korp.”: “Biuro Prawne i Korporacyjne”,\n “Biuro Finansów”: “Biuro Finansów”,\n “Biuro HR”: “Biuro HR”,\n “Biuro IT”: “Biuro IT”,\n “Biuro Logistyki”: “Biuro Logistyki”,\n “Biuro Sieci OOH”: “Biuro Sieci OOH”,\n “Biuro Sprz.Det.”: “Biuro Sprzedaży Detalicznej”,\n “BiuroSprz.Prasy”: “Biuro Sprzedaży Prasy”,\n “Dz. Ks.Gł.i Spr”: “Dział Księgi Głównej i Sprawozdawczości”,\n “Dz. Należności”: “Dział Należności”,\n “Dz. Zobowiązań”: “Dział Zobowiązań”,\n “Insp.Ochr.Dan.O”: “Inspektor Ochrony Danych Osobowych”,\n “P.Prezesa Zarz.”: “Pion Prezesa Zarządu”,\n “Związki Zawodow”: “Związki Zawodowe”,\n “B. Ws.z Kl.Part”: “Biuro Współpracy z Kluczowymi Partnerami”\n};\n\nconst dzialyMapping = {\n “Biuro Administracji i Zak”: “Biuro Administracji i Zakupów”,\n “Biuro Analiz Biznesowych”: “Biuro Analiz Biznesowych i Big Data”,\n “Biuro Bezpieczeństwa”: “Biuro Bezpieczeństwa”,\n “Biuro Finansów”: “Biuro Finansów”,\n “Biuro HR”: “Biuro HR”,\n “Biuro IT”: “Biuro IT”,\n “Biuro Logistyki”: “Biuro Logistyki”,\n “Biuro Obsługi Klienta”: “Biuro Obsługi Klienta”,\n “Biuro Prawne i Korporacyj”: “Biuro Prawne i Korporacyjne”,\n “Biuro Sprzedaży”: “Biuro Sprzedaży”,\n “Biuro Sprzedaży Detaliczn”: “Biuro Sprzedaży Detalicznej”,\n “Biuro Sprzedaży Prasy”: “Biuro Sprzedaży Prasy”,\n “Biuro Strategii i Zarządz”: “Biuro Strategii i Zarządzania Projektami”,\n “B. Str. Zarz.Pr”: “Biuro Strategii i Zarządzania Projektami”,\n “Biuro Wsparcia”: “Biuro Wsparcia”,\n “Biuro Współpracy z Kluczo”: “Biuro Współpracy z Kluczowymi Partnerami”,\n “Centrum Logistyczne Katow”: “Centrum Logistyczne Katowice”,\n “Centrum Logistyczne Pozna”: “Centrum Logistyczne Poznań”,\n “Centrum Logistyczne Wars”: “Centrum Logistyczne Warszawa”,\n “Centrum Logistyczne Wrocł”: “Centrum Logistyczne Wrocław”,\n “Dział Doskonalenia Sprzed”: “Dział Doskonalenia Sprzedaży”,\n “Dział Polityki Rachunkowe”: “Dział Polityki Rachunkowej”,\n “Dział Sprzedaży Regionaln”: “Dział Sprzedaży Regionalnej”,\n “Dział Sprzedaży Strategic”: “Dział Sprzedaży Strategicznej”,\n “Dział Utrzym Systemów IT”: “Dział Utrzymania Systemów IT”,\n “Dział Utrzym Systemów IT i Wsp. Użytkown”: “Dział Utrzymania Systemów IT i Wsparcia Użytkownika”,\n “Fincores Business Solutio”: “Fincores Business Solutions”,\n “INSPEKTOR OCHRONY DANYCH”: “Inspektor Ochrony Danych”,\n “Oddział Białystok”: “Oddział Białystok”,\n “Oddział Bielsko-Biała”: “Oddział Bielsko-Biała”,\n “Oddział Bydgoszcz”: “Oddział Bydgoszcz”,\n “Oddział Częstochowa”: “Oddział Częstochowa”,\n “Oddział Ełk”: “Oddział Ełk”,\n “Oddział Gdańsk”: “Oddział Gdańsk”,\n “Oddział Gorzów Wielkopols”: “Oddział Gorzów Wielkopolski”,\n “Oddział Kalisz”: “Oddział Kalisz”,\n “Oddział Kielce”: “Oddział Kielce”,\n “Oddział Kraków”: “Oddział Kraków”,\n “Oddział Kraków II”: “Oddział Kraków II”,\n “Oddział Legnica”: “Oddział Legnica”,\n “Oddział Lublin”: “Oddział Lublin”,\n “Oddział Łódź”: “Oddział Łódź”,\n “Oddział Olsztyn”: “Oddział Olsztyn”,\n “Oddział Opole”: “Oddział Opole”,\n “Oddział Radom”: “Oddział Radom”,\n “Oddział Rybnik”: “Oddział Rybnik”,\n “Oddział Rzeszów”: “Oddział Rzeszów”,\n “Oddział Siedlce”: “Oddział Siedlce”,\n “Oddział Stalowa Wola”: “Oddział Stalowa Wola”,\n “Oddział Szczecin”: “Oddział Szczecin”,\n “Oddział Tarnów”: “Oddział Tarnów”,\n “Oddział Toruń”: “Oddział Toruń”,\n “Oddział Wałbrzych”: “Oddział Wałbrzych”,\n “Oddział Zielona Góra”: “Oddział Zielona Góra”,\n “Pion Prezesa Zarządu”: “Pion Prezesa Zarządu”,\n “Region Krakowski”: “Region Krakowski”,\n “Region Poznański”: “Region Poznański”,\n “Region Warszawski”: “Region Warszawski”,\n “Region Wrocławski”: “Region Wrocławski”,\n “Zes. Wsparcia Użytkownika”: “Zespół Wsparcia Użytkownika”,\n “Zespół Administracji”: “Zespół Administracji”,\n “Zespół Administracji Sprz”: “Zespół Administracji Sprzedaży”,\n “Zespół Analiz 1”: “Zespół Analiz 1”,\n “Zespół Analiz 2”: “Zespół Analiz 2”,\n “Zespół Analiz i Testów Sy”: “Zespół Analiz i Testów Systemów”,\n “Zespół Analiz Systemów IT”: “Zespół Analiz Systemów IT”,\n “Zespół Architektury Syste”: “Zespół Architektury Systemów”,\n “Zespół Bezpieczeństwa Sys”: “Zespół Bezpieczeństwa Systemów”,\n “Zespół Contact Center”: “Zespół Contact Center”,\n “Zespół Ekspansji Sieci”: “Zespół Ekspansji Sieci”,\n “Zespół Infrastruktury IT”: “Zespół Infrastruktury IT”,\n “Zespół Inwestycji Sieci”: “Zespół Inwestycji Sieci”,\n “Zespół Kadr i Płac”: “Zespół Kadr i Płac”,\n “Zespół Kontroli Bezpiecze”: “Zespół Kontroli Bezpieczeństwa”,\n “Zespół Kontroli Procesów”: “Zespół Kontroli Procesów Logistycznych”,\n “Zespół Kontrolingu”: “Zespół Kontrolingu”,\n “Zespół Koordynacji Tech.”: “Zespół Koordynacji Technicznej Projektów IT”,\n “Zespół Koordynacji Tech. Projektów IT”: “Zespół Koordynacji Technicznej Projektów IT”,\n “Zespół Koordynacji Technicznej”: “Zespół Koordynacji Technicznej Projektów IT”,\n “Zespół Magazynu Logistyki”: “Zespół Magazynu Logistyki”,\n “Zespół Marketingu”: “Zespół Marketingu”,\n “Zespół Nieruchomości i Pr”: “Zespół Nieruchomości i Projektów Magazynowych”,\n “Zespół Obsługi Klientów K”: “Zespół Obsługi Klientów Kluczowych”,\n “Zespół Obsługi Reklamacji”: “Zespół Obsługi Reklamacji”,\n “Zespół Płynności Finansow”: “Zespół Płynności Finansowej”,\n “Zespół Prenumeraty”: “Zespół Prenumeraty”,\n “Zespół Programistów”: “Zespół Programistów”,\n “Zespół Projektów Operacyj”: “Zespół Projektów Operacyjnych”,\n “Zespół Projektów Rozwojow”: “Zespół Projektów Rozwojowych”,\n “Zespół Rekrutacji, Rozwoj”: “Zespół Rekrutacji, Rozwoju i EB”,\n “Zespół Rozliczeń”: “Zespół Rozliczeń”,\n “Zespół Rozliczeń i Utrzym”: “Zespół Rozliczeń i Utrzymania Sieci”,\n “Zespół Rozwoju Usług PUDO”: “Zespół Rozwoju Usług PUDO”,\n “Zespół Sortowni Centralne”: “Zespół Sortowni Centralnej”,\n “Zespół Sprawozd. Finansow”: “Zespół Sprawozdawczości Finansowej”,\n “Zespół Sprzedaży Międzyn”: “Zespół Sprzedaży Międzynarodowych”,\n “Zespół Sprzedaży Regional”: “Zespół Sprzedaży Regionalnej”,\n “Zespół Sprzedaży Stacjona”: “Zespół Sprzedaży Stacjonarnej”,\n “Zespół Sprzedaży Strategi”: “Zespół Sprzedaży Strategicznej”,\n “Zespół Testów”: “Zespół Testów”,\n “Zespół Transportu”: “Zespół Transportu”,\n “Zespół Utrzymania Sieci”: “Zespół Utrzymania Sieci”,\n “Zespół Utrzymania Systemó”: “Zespół Utrzymania Systemów”,\n “Zespół Współpr. z Platform”: “Zespół Współpracy z Platformami Brokerskimi”,\n “Zespół Zakupów”: “Zespół Zakupów”,\n “Zespół Zobowiązań i Należ”: “Zespół Zobowiązań i Należności”,\n “Zespół Wsparcia Użytkownika”: “Zespół Wsparcia Użytkownika i Monitoringu”,\n “Zes. Wsparcia Użytkownika i Monitoringu”: “Zespół Wsparcia Użytkownika i Monitoringu”,\n “Zespół Sprawozdawczości Finansowej”: “Zespół Sprawozdawczości Finansowej i Podatków”,\n “Zespół Nieruchomości i Projektów Magazyn”: “Zespół Nieruchomości i Projektów Magazynowych”\n};\n\n// Przetwórz wszystkie itemy\nreturn $input.all().map(item => {\n // Rozwiń skrót biura (kolumna “Nazwa podobsz. kadr.”)\n const biuroSkrot = item.json[“Nazwa podobsz. kadr.”];\n if (biuroSkrot && biuraMapping[biuroSkrot]) {\n item.json[“Nazwa podobsz. kadr.”] = biuraMapping[biuroSkrot];\n }\n \n // Rozwiń skrót zespołu/działu (kolumna “Jednostka organiz.”)\n const dzialSkrot = item.json[“Jednostka organizacyjna”];\n if (dzialSkrot && dzialyMapping[dzialSkrot]) {\n item.json[“Jednostka organizacyjna”] = dzialyMapping[dzialSkrot];\n }\n \n return item;\n});”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
-672,
1840
],
“id”: “99cfa2b0-16e3-472e-9043-72c576e22f10”,
“name”: “Rozwiń skróty biur i zespołów1”
},
{
“parameters”: {
“aggregate”: “aggregateAllItemData”,
“options”: {}
},
“type”: “n8n-nodes-base.aggregate”,
“typeVersion”: 1,
“position”: [
1184,
1296
],
“id”: “423caa71-36e8-4e2c-a7e9-9ca5a1bc7b49”,
“name”: “Zbierz wszystkie zmiany1”
},
{
“parameters”: {
“rule”: {
“interval”: [
{
“triggerAtHour”: 4
}
]
}
},
“type”: “n8n-nodes-base.scheduleTrigger”,
“typeVersion”: 1.3,
“position”: [
-2096,
1840
],
“id”: “cb66416f-c55d-4458-ba9d-d9f8f148b5c1”,
“name”: “Schedule Trigger”,
“disabled”: true
},
{
“parameters”: {},
“type”: “n8n-nodes-base.manualTrigger”,
“typeVersion”: 1,
“position”: [
-2112,
1616
],
“id”: “d98ef16e-6c52-4821-b528-b52d24c1af78”,
“name”: “When clicking ‘Execute workflow’”
},
{
“parameters”: {
“operation”: “update”,
“nodeDebug”: true,
“dn”: “={{ $json.userDN }}”,
“attributes”: {
“replace”: [
{
“id”: “=title”,
“value”: “={{ $json.title_CSV }}”
},
{
“id”: “=department”,
“value”: “={{ $json.shouldReplaceDepartment ? $json.department_CSV : “””
},
{
“id”: “company”,
“value”: “={{ $json.company_CSV }}”
},
{
“id”: “physicalDeliveryOfficeName”,
“value”: “={{ $json.office_CSV }}”
},
{
“id”: “pager”,
“value”: “={{ $json.pager_CSV }}”
},
{
“id”: “manager”,
“value”: “={{ $json.manager_CSV }}”
}
]
}
},
“type”: “n8n-nodes-base.ldap”,
“typeVersion”: 1,
“position”: [
2144,
1600
],
“id”: “56111f1a-f43a-4e5a-90df-fb964f5dbe65”,
“name”: “Zaktualizuj dane użytkownika w AD”,
“credentials”: {
“ldap”: {
“id”: “Zxm5Up1NPFt20h6w”,
“name”: “LDAP account”
}
},
“onError”: “continueErrorOutput”
},
{
“parameters”: {
“operation”: “update”,
“nodeDebug”: true,
“dn”: “={{ $json.userDN }}”,
“attributes”: {
“replace”: [
{
“id”: “=title”,
“value”: “={{ $json.title_CSV }}”
},
{
“id”: “company”,
“value”: “={{ $json.company_CSV }}”
},
{
“id”: “physicalDeliveryOfficeName”,
“value”: “={{ $json.office_CSV }}”
},
{
“id”: “pager”,
“value”: “={{ $json.pager_CSV }}”
},
{
“id”: “manager”,
“value”: “={{ $json.manager_CSV }}”
}
],
“delete”: [
{
“id”: “department”,
“value”: “={{ $json.department_AD }}”
}
]
}
},
“type”: “n8n-nodes-base.ldap”,
“typeVersion”: 1,
“position”: [
1984,
1952
],
“id”: “5b44e419-0b71-414f-8861-5b1172d26e25”,
“name”: “Zaktualizuj dane użytkownika w AD i usuń department jeśli == biuro”,
“credentials”: {
“ldap”: {
“id”: “Zxm5Up1NPFt20h6w”,
“name”: “LDAP account”
}
},
“onError”: “continueErrorOutput”
},
{
“parameters”: {
“conditions”: {
“options”: {
“caseSensitive”: true,
“leftValue”: “”,
“typeValidation”: “strict”,
“version”: 3
},
“conditions”: [
{
“id”: “bf8a430d-5916-47d3-a75f-15e04b2953d2”,
“leftValue”: “={{ $json.shouldDeleteDepartment }}”,
“rightValue”: “”,
“operator”: {
“type”: “boolean”,
“operation”: “true”,
“singleValue”: true
}
}
],
“combinator”: “and”
},
“options”: {}
},
“type”: “n8n-nodes-base.if”,
“typeVersion”: 2.3,
“position”: [
1696,
1600
],
“id”: “eb3114fb-170d-46e8-a6ba-52b7d2307ed9”,
“name”: “IF - Obsługa department”
}
],
“connections”: {
“Połącz dane LDAP z danymi raportu”: {
“main”: [
[
{
“node”: “Loop Over Items1”,
“type”: “main”,
“index”: 0
}
]
]
},
“Execute Command1”: {
“main”: [
[
{
“node”: “Code2”,
“type”: “main”,
“index”: 0
}
]
]
},
“Parse CSV (Code)1”: {
“main”: [
[
{
“node”: “Zmiana adresu email1”,
“type”: “main”,
“index”: 0
}
]
]
},
“Loop Over Items1”: {
“main”: [
[
{
“node”: “Zbierz wszystkie zmiany1”,
“type”: “main”,
“index”: 0
}
],
[
{
“node”: “LDAP4”,
“type”: “main”,
“index”: 0
},
{
“node”: “Merge3”,
“type”: “main”,
“index”: 0
},
{
“node”: “LDAP5”,
“type”: “main”,
“index”: 0
}
]
]
},
“Code2”: {
“main”: [
[
{
“node”: “Parse CSV (Code)1”,
“type”: “main”,
“index”: 0
}
]
]
},
“If1”: {
“main”: [
[
{
“node”: “Przygotuj listę zmian1”,
“type”: “main”,
“index”: 0
}
],
[
{
“node”: “Loop Over Items1”,
“type”: “main”,
“index”: 0
}
]
]
},
“Zmiana adresu email1”: {
“main”: [
[
{
“node”: “Rozwiń skróty biur i zespołów1”,
“type”: “main”,
“index”: 0
}
]
]
},
“LDAP4”: {
“main”: [
[
{
“node”: “Merge3”,
“type”: “main”,
“index”: 1
}
]
]
},
“Merge3”: {
“main”: [
[
{
“node”: “Code3”,
“type”: “main”,
“index”: 0
}
]
]
},
“Code3”: {
“main”: [
[
{
“node”: “If1”,
“type”: “main”,
“index”: 0
}
]
]
},
“LDAP5”: {
“main”: [
[
{
“node”: “Merge3”,
“type”: “main”,
“index”: 2
}
]
]
},
“Przygotuj listę zmian1”: {
“main”: [
[
{
“node”: “IF - Obsługa department”,
“type”: “main”,
“index”: 0
}
]
]
},
“Formatuj raport1”: {
“main”: [
[
{
“node”: “Send a message1”,
“type”: “main”,
“index”: 0
}
]
]
},
“Rozwiń skróty biur i zespołów1”: {
“main”: [
[
{
“node”: “Loop Over Items1”,
“type”: “main”,
“index”: 0
}
]
]
},
“Zbierz wszystkie zmiany1”: {
“main”: [
[
{
“node”: “Formatuj raport1”,
“type”: “main”,
“index”: 0
}
]
]
},
“Schedule Trigger”: {
“main”: [
]
},
“When clicking ‘Execute workflow’”: {
“main”: [
[
{
“node”: “Execute Command1”,
“type”: “main”,
“index”: 0
}
]
]
},
“Zaktualizuj dane użytkownika w AD”: {
“main”: [
[
{
“node”: “Połącz dane LDAP z danymi raportu”,
“type”: “main”,
“index”: 0
}
]
]
},
“Zaktualizuj dane użytkownika w AD i usuń department jeśli == biuro”: {
“main”: [
[
{
“node”: “Połącz dane LDAP z danymi raportu”,
“type”: “main”,
“index”: 0
}
]
]
},
“IF - Obsługa department”: {
“main”: [
[
{
“node”: “Zaktualizuj dane użytkownika w AD i usuń department jeśli == biuro”,
“type”: “main”,
“index”: 0
}
],
[
{
“node”: “Zaktualizuj dane użytkownika w AD”,
“type”: “main”,
“index”: 0
}
]
]
}
},
“pinData”: {},
“meta”: {
“templateCredsSetupCompleted”: true,
“instanceId”: “7d45da38ddb2ccc20327f268f365c7d2cbfce2ebd495e52f3e3ee80f386d7301”
}
}
**## Share the output returned by the last node
Failing test case -** User RYSZARD MOZDYNIEWICZ: **
**
{
“Imię”: “RYSZARD”,
“Nazwisko”: “MOZDYNIEWICZ”,
“title_CSV”: “DYREKTOR BIURA BEZPIECZEŃSTWA”,
“department_CSV”: “Biuro Bezpieczeństwa”,
“office_CSV”: “Biuro Bezpieczeństwa”,
“department_AD”: “”,
“shouldDeleteDepartment”: false,
“shouldSkipDepartment”: true,
“shouldReplaceDepartment”: false,
“departmentAction”: “skip”,
“updateNeeded”: true
}
Expected: Update `title`, `company`, etc. **Skip `department` entirely**. **
Actual:** LDAP crashes on `department = undefined`.
**## Information on your n8n setup
- n8n version:** 2.13.4 **
- Database:** SQLite (default) **
- n8n EXECUTIONS_PROCESS setting:** own (default) **
- Running n8n via:** npm **
- Operating system:** Windows Server 2019