{"id":28189811,"url":"https://github.com/club-innovate/sysaidado","last_synced_at":"2026-02-26T23:33:34.158Z","repository":{"id":293476661,"uuid":"980255120","full_name":"Club-Innovate/SysAidADO","owner":"Club-Innovate","description":"DRAFT: This project synchronizes SysAid support tickets (Service Requests) into Azure DevOps (ADO) as Bugs","archived":false,"fork":false,"pushed_at":"2025-05-20T02:34:21.000Z","size":24,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-14T23:04:33.884Z","etag":null,"topics":["api-integration","audit-trail","automation","azure-devops","bug-tracking","compliance","delta-sync","devops-tools","hipaa","issue-tracking","logging","phi-redaction","pii-redaction","python","security","service-desk","spacy","sysaid","ticket-sync"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Club-Innovate.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-08T20:35:27.000Z","updated_at":"2025-06-05T01:44:20.000Z","dependencies_parsed_at":"2025-05-15T14:59:41.947Z","dependency_job_id":null,"html_url":"https://github.com/Club-Innovate/SysAidADO","commit_stats":null,"previous_names":["club-innovate/sysaidado"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Club-Innovate/SysAidADO","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Club-Innovate%2FSysAidADO","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Club-Innovate%2FSysAidADO/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Club-Innovate%2FSysAidADO/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Club-Innovate%2FSysAidADO/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Club-Innovate","download_url":"https://codeload.github.com/Club-Innovate/SysAidADO/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Club-Innovate%2FSysAidADO/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259896124,"owners_count":22928330,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-integration","audit-trail","automation","azure-devops","bug-tracking","compliance","delta-sync","devops-tools","hipaa","issue-tracking","logging","phi-redaction","pii-redaction","python","security","service-desk","spacy","sysaid","ticket-sync"],"created_at":"2025-05-16T10:11:19.447Z","updated_at":"2026-02-26T23:33:34.118Z","avatar_url":"https://github.com/Club-Innovate.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🧩 SysAid to Azure DevOps Bug Sync\n\nThis project synchronizes SysAid support tickets (Service Requests) into Azure DevOps (ADO) as **Bugs**, complete with:\n\n- PII/PHI redaction\n- Delta syncing\n- Smart update detection\n- Optional parent linking (to User Stories or Tasks)\n- Full audit trail and logging\n\n---\n\n## 📁 Project Structure\n\n```\nsysaid_to_ado/\n├── ado_api.py                 # ADO bug creation, update, and linking\n├── main.py                    # Orchestrator: fetch, redact, sync\n├── sensitive_data_detector.py # PII/PHI redaction logic\n├── sysaid_api.py              # Simulated + real SysAid API integration\n├── utils.py                   # Logging \u0026 user identity helpers\n├── .env or config.py          # Secrets (not tracked in Git)\n├── last_sync.json             # Delta sync timestamp\n├── logs/\n│   └── sync.log               # Audit trail\n```\n\n---\n\n## 🔐 Security \u0026 HIPAA Compliance\n\n- Redacts fields using regex and SpaCy NER before syncing to ADO\n- Logs each detection/redaction to 'logs/sync.log'\n- Only '\"description\"' field is scanned and cleaned\n- Supports detection of:\n  - SSN, DOB, phone numbers, email\n  - Rx numbers, medical billing info\n  - Names (via NLP)\n  - IP addresses and login data\n\n---\n\n## 🔄 Sync Logic\n\n### On each run:\n1. Fetch **new or updated** SysAid tickets since last run\n2. Redact sensitive '\"description\"' content\n3. If the ticket already exists in ADO:\n   - Compare SysAid's 'update_time' to ADO’s 'System.ChangedDate'\n   - Skip if not newer\n   - Update otherwise (with re-redaction)\n4. If it's new:\n   - Create as ADO **Bug**\n   - Optionally link to parent User Story or Task via 'parent_id'\n\n---\n\n## 🔧 Setup Instructions\n\n### 1. Install Requirements\n\n```bash\npip install -r requirements.txt\npython -m spacy download en_core_web_sm\n```\n\n### 2. Create '.env'\n\n```dotenv\n# Azure DevOps\nADO_ORG=your-ado-org\nADO_PROJECT=your-ado-project\nADO_PAT=your-ado-personal-access-token\nADO_API_VERSION=7.0\n\n# SysAid\nSYSAID_API_TOKEN=your-sysaid-token\nSYSAID_BASE_URL=https://yourcompany.sysaidit.com\n```\n\n\u003e 🔒 Keep this file out of version control.\n\n### 3. Run the Sync\n\n```bash\npython main.py\n```\n\nYou’ll get a summary like:\n\n```\nSync complete.\nCreated: 3, Updated: 2, Failed: 0\n```\n\n---\n\n## 🧪 Sample Ticket Input\n\nExample of a SysAid ticket passed to ADO:\n\n```python\n{\n  \"id\": 101,\n  \"title\": \"Email Service - login failure\",\n  \"description\": \"User John Smith (SSN: 123-45-6789)...\",\n  \"priority\": \"High\",\n  \"status\": \"Open\",\n  \"parent_id\": 872,  # Optional ADO User Story ID\n  \"update_time\": 1714458000000  # Epoch ms\n}\n```\n\n---\n\n## 📎 Parent Linking (Optional)\n\nIf 'ticket[\"parent_id\"]' is provided:\n- Bug will be linked to that work item\n- Duplicate links are automatically avoided\n- Uses 'System.LinkTypes.Hierarchy-Reverse'\n\n---\n\n## 📜 Logs and Auditing\n\n- 'logs/sync.log' contains full run trace\n- Every detection, failure, and update is logged\n- Run identity is captured via 'get_current_user_identity()'\n\n---\n\n## 🛡 Best Practices Followed\n\n- ✅ Secrets kept in '.env' or config.py\n- ✅ Redaction applied before API submission\n- ✅ Updates only occur when needed\n- ✅ JSON Patch structure for ADO\n- ✅ Graceful exception handling\n- ✅ Configurable log file via 'utils.setup_logger()'\n\n---\n\n## 🤝 Contributions\n\nYou're welcome to extend this to:\n\n- Bi-directional syncing\n- Attachment uploads\n- Field mapping UI\n- Secure vault integration for secrets\n\n---\n\n## 📅 Created April 2025\n\nMaintained by: **Hans Esquivel**\nLicense: MIT (or internal)\n\n---\n\n## Contact\n\nPlease open an [issue](https://github.com/club-innovate/sysaidado/issues) or start a [discussion](https://github.com/club-innovate/sysaidado/discussions) if you want to get in touch.\n\n---","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclub-innovate%2Fsysaidado","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclub-innovate%2Fsysaidado","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclub-innovate%2Fsysaidado/lists"}