{
	"info": {
		"_postman_id": "cf613ab4-0128-486d-8075-8a87f40dea23",
		"name": "Maintenance - Team Classification & Smart Visit Routing",
		"description": "Collection for testing Team-based routing and smart visit assignment. Includes specialty validation, chiller hard constraints, and geographic/workload scoring.",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"item": [
		{
			"name": "Setup: Team Configuration",
			"item": [
				{
					"name": "1. Create Team (HVAC Alpha)",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Team Created\", function () {",
									"    pm.response.to.have.status(200);",
									"    var jsonData = pm.response.json();",
									"    pm.collectionVariables.set(\"teamId\", jsonData.data.id);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"name\": \"HVAC Alpha\",\n    \"max_daily_visits\": 5\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/v1/maintenance/teams",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"api",
								"v1",
								"maintenance",
								"teams"
							]
						}
					},
					"response": []
				},
				{
					"name": "2. Sync Specialties (Chiller & FCU)",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Specialties Synced\", function () {",
									"    pm.response.to.have.status(200);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"specialty_ids\": [{{chillerTypeId}}, {{fcuTypeId}}]\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/v1/maintenance/teams/{{teamId}}/specialties",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"api",
								"v1",
								"maintenance",
								"teams",
								"{{teamId}}",
								"specialties"
							]
						}
					},
					"response": []
				},
				{
					"name": "3. Add Members",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Members Added\", function () {",
									"    pm.response.to.have.status(200);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"user_ids\": [{{leaderId}}, {{member1Id}}, {{member2Id}}],\n    \"sync\": true\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/v1/maintenance/teams/{{teamId}}/members",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"api",
								"v1",
								"maintenance",
								"teams",
								"{{teamId}}",
								"members"
							]
						}
					},
					"response": []
				},
				{
					"name": "4. Set Team Leader",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Leader Set Successfully\", function () {",
									"    pm.response.to.have.status(200);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/api/v1/maintenance/teams/{{teamId}}/leader/{{leaderId}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"api",
								"v1",
								"maintenance",
								"teams",
								"{{teamId}}",
								"leader",
								"{{leaderId}}"
							]
						}
					},
					"response": []
				}
			]
		},
		{
			"name": "Case 1: Happy Path (Team Dispatch)",
			"item": [
				{
					"name": "1. GET Backlog (Verify Suggestions)",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Team Appears in Suggestions\", function () {",
									"    var jsonData = pm.response.json();",
									"    var suggestions = jsonData.data.data.find(v => v.id == pm.collectionVariables.get(\"visitId\")).suggested_teams;",
									"    pm.expect(suggestions.some(t => t.team_id == pm.collectionVariables.get(\"teamId\"))).to.be.true;",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/api/v1/maintenance/backlog-dispatching/backlog",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"api",
								"v1",
								"maintenance",
								"backlog-dispatching",
								"backlog"
							]
						},
						"description": "Verify 'HVAC Alpha' appears in suggested_teams for a visit containing a Chiller unit."
					},
					"response": []
				},
				{
					"name": "2. Assign Team to Visit",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Visit Assigned to Team\", function () {",
									"    pm.response.to.have.status(200);",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData.data.success).to.be.true;",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"team_id\": {{teamId}}\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/v1/maintenance/visits/{{visitId}}/assign-team",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"api",
								"v1",
								"maintenance",
								"visits",
								"{{visitId}}",
								"assign-team"
							]
						}
					},
					"response": []
				},
				{
					"name": "3. Verify Assignment Details",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status is Scheduled\", function () {",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData.data.status).to.eql(\"scheduled\");",
									"    pm.expect(jsonData.data.technicians.length).to.be.at.least(1);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/api/v1/maintenance/visits/{{visitId}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"api",
								"v1",
								"maintenance",
								"visits",
								"{{visitId}}"
							]
						},
						"description": "Check if visit status changed to scheduled and technicians are assigned."
					},
					"response": []
				}
			]
		},
		{
			"name": "Case 2: Backward Compatibility",
			"item": [
				{
					"name": "1. Standard Individual Dispatch",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Individual Dispatch Successful\", function () {",
									"    pm.response.to.have.status(200);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"technician_id\": {{legacyTechnicianId}},\n    \"scheduled_at\": \"2026-05-10 09:00:00\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/v1/maintenance/visits/{{visitId}}/dispatch",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"api",
								"v1",
								"maintenance",
								"visits",
								"{{visitId}}",
								"dispatch"
							]
						},
						"description": "Ensure the system continues to support individual technician assignment without requiring team membership."
					},
					"response": []
				}
			]
		},
		{
			"name": "Case 3: Edge Cases & Constraints",
			"item": [
				{
					"name": "1. Chiller Violation",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Blocked: Missing Chiller Specialty\", function () {",
									"    pm.response.to.have.status(422);",
									"    pm.expect(pm.response.json().message).to.contain(\"Chiller\");",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"team_id\": {{unqualifiedTeamId}}\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/v1/maintenance/visits/{{visitId}}/assign-team",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"api",
								"v1",
								"maintenance",
								"visits",
								"{{visitId}}",
								"assign-team"
							]
						},
						"description": "Attempt to assign a team without 'Chiller' specialty to a visit containing a Chiller unit."
					},
					"response": []
				},
				{
					"name": "2. Leaderless Team",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Blocked: No Designated Leader\", function () {",
									"    pm.response.to.have.status(422);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"team_id\": {{leaderlessTeamId}}\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/v1/maintenance/visits/{{visitId}}/assign-team",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"api",
								"v1",
								"maintenance",
								"visits",
								"{{visitId}}",
								"assign-team"
							]
						},
						"description": "Attempt to assign a team that has no designated leader."
					},
					"response": []
				},
				{
					"name": "3. Workload Scoring Check",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Workload Data Retrievable\", function () {",
									"    pm.response.to.have.status(200);",
									"    var jsonData = pm.response.json();",
									"    var teamLoad = jsonData.data.find(t => t.team_id == pm.collectionVariables.get(\"teamId\"));",
									"    pm.expect(teamLoad).to.exist;",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/api/v1/maintenance/teams/workload",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"api",
								"v1",
								"maintenance",
								"teams",
								"workload"
							]
						},
						"description": "Check real-time load % and visit counts per team."
					},
					"response": []
				}
			]
		}
	],
	"variable": [
		{
			"key": "baseUrl",
			"value": "https://api.example.com"
		},
		{
			"key": "visitId",
			"value": "1"
		},
		{
			"key": "teamId",
			"value": ""
		},
		{
			"key": "chillerTypeId",
			"value": "1"
		},
		{
			"key": "fcuTypeId",
			"value": "2"
		},
		{
			"key": "leaderId",
			"value": "10"
		},
		{
			"key": "member1Id",
			"value": "11"
		},
		{
			"key": "member2Id",
			"value": "12"
		},
		{
			"key": "legacyTechnicianId",
			"value": "15"
		},
		{
			"key": "unqualifiedTeamId",
			"value": "99"
		},
		{
			"key": "leaderlessTeamId",
			"value": "100"
		}
	]
}
