Skip to content

Conversation

@vijaykumar7177
Copy link
Contributor

PR Description:

📘 Overview

Duplicate CIs (Configuration Items) in the CMDB cause data redundancy, reporting errors, and incorrect impact analysis.
This project automatically detects potential duplicate CIs during record creation or update, using partial string matching and fuzzy comparison on fields like Name, Serial Number, or Asset Tag.

It can warn the user, flag duplicates, or even prevent save depending on configuration.

🚀 Features

Detects duplicate Configuration Items on insert or update

Matches based on configurable fields (e.g., name, serial_number, asset_tag)

Uses partial/fuzzy matching (e.g., "Laptop123" ≈ "Laptop-123")

Optionally prevents saving duplicate entries

Works on both platform UI and Service Portal

Extendable for custom CI classes (cmdb_ci_computer, cmdb_ci_server, etc.)

Pull Request Checklist

Overview

  • Put an x inside of the square brackets to check each item.
  • I have read and understood the CONTRIBUTING.md guidelines
  • My pull request has a descriptive title that accurately reflects the changes and the description has been filled in above.
  • I've included only files relevant to the changes described in the PR title and description
  • I've created a new branch in my forked repository for this contribution

Code Quality

  • My code is relevant to ServiceNow developers
  • My code snippets expand meaningfully on official ServiceNow documentation (if applicable)
  • I've disclosed use of ES2021 features (if applicable)
  • I've tested my code snippets in a ServiceNow environment (where possible)

Repository Structure Compliance

  • I've placed my code snippet(s) in one of the required top-level categories:
    • Core ServiceNow APIs/
    • Server-Side Components/
    • Client-Side Components/
    • Modern Development/
    • Integration/
    • Specialized Areas/
  • I've used appropriate sub-categories within the top-level categories
  • Each code snippet has its own folder with a descriptive name

Documentation

  • I've included a README.md file for each code snippet
  • The README.md includes:
    • Description of the code snippet functionality
    • Usage instructions or examples
    • Any prerequisites or dependencies
    • (Optional) Screenshots or diagrams if helpful

Restrictions

  • My PR does not include XML exports of ServiceNow records
  • My PR does not contain sensitive information (passwords, API keys, tokens)
  • My PR does not include changes that fall outside the described scope

Duplicate CIs (Configuration Items) in the CMDB cause data redundancy, reporting errors, and incorrect impact analysis.
This project automatically detects potential duplicate CIs during record creation or update, using partial string matching and fuzzy comparison on fields like Name, Serial Number, or Asset Tag.

It can warn the user, flag duplicates, or even prevent save depending on configuration.

🚀 Features

Detects duplicate Configuration Items on insert or update

Matches based on configurable fields (e.g., name, serial_number, asset_tag)

Uses partial/fuzzy matching (e.g., "Laptop123" ≈ "Laptop-123")

Optionally prevents saving duplicate entries

Works on both platform UI and Service Portal

Extendable for custom CI classes (cmdb_ci_computer, cmdb_ci_server, etc.)
var DuplicateCIDetector = Class.create();
DuplicateCIDetector.prototype = {
    initialize: function() {},

    findDuplicates: function(ciName, serialNumber, assetTag, sysId) {
        var duplicates = [];
        var gr = new GlideRecord('cmdb_ci');
        gr.addQuery('active', true);

        // Basic name match (case-insensitive)
        if (ciName) {
            gr.addQuery('name', 'LIKE', ciName);
        }

        // Optional matching by serial or asset tag
        if (serialNumber) {
            gr.addOrCondition('serial_number', serialNumber);
        }
        if (assetTag) {
            gr.addOrCondition('asset_tag', assetTag);
        }

        if (sysId)
            gr.addQuery('sys_id', '!=', sysId); // ignore current record

        gr.query();
        while (gr.next()) {
            duplicates.push({
                name: gr.getValue('name'),
                serial_number: gr.getValue('serial_number'),
                asset_tag: gr.getValue('asset_tag'),
                sys_id: gr.getUniqueValue()
            });
        }

        return duplicates;
    },

    type: 'DuplicateCIDetector'
};
(function executeRule(current, previous /*null when async*/) {
    var detector = new DuplicateCIDetector();
    var duplicates = detector.findDuplicates(
        current.name,
        current.serial_number,
        current.asset_tag,
        current.sys_id
    );

    if (duplicates.length > 0) {
        var message = '⚠️ Potential duplicate CIs detected:\n';
        for (var i = 0; i < duplicates.length; i++) {
            message += '- ' + duplicates[i].name + ' (Serial: ' + duplicates[i].serial_number + ')\n';
        }

        gs.addErrorMessage(message);
        current.setAbortAction(true); // stop record save
    }
})(current, previous);
@rohi-v rohi-v self-assigned this Oct 18, 2025
@rohi-v
Copy link
Contributor

rohi-v commented Oct 18, 2025

Hi @vijaykumar7177

Thank You for your contribution.

We have OOTB CMDB DeDuplication feature to handle cmdb duplicates.

For Hacktoberfest, we’re aiming for high-quality contributions. Once you make additional changes, feel free to re-open this Pull Request or create a new one.

@rohi-v rohi-v closed this Oct 18, 2025
@vijaykumar7177 vijaykumar7177 deleted the duplicate-CI branch October 18, 2025 12:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants