{
	"info": {
		"_postman_id": "a9a1b1c2-d3e4-f5a6-7b8c-9d0e1f2a3b4c",
		"name": "KJPP App Backend API Testing",
		""
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"_collection_link": "https://www.postman.com/collections/a9a1b1c2-d3e4-f5a6-7b8c-9d0e1f2a3b4c"
	},
	"item": [
		{
			"name": "1. Auth (Authentication)",
			"item": [
				{
					"name": "Register User",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"username\": \"newuser_test\",\n    \"password\": \"12345678\",\n    \"role\": \"surveyor\",\n    \"nama_lengkap\": \"Test User Register\",\n    \"email\": \"test.register@example.com\",\n    \"no_telepon\": \"081212345678\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/auth/register",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"auth",
								"register"
							]
						},
						"description": "Registers a new user. Change username/email for successful creation."
					},
					"response": []
				},
				{
					"name": "Login Admin",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"pm.environment.set(\"admin_access_token\", jsonData.access_token);",
									"pm.environment.set(\"admin_user_id\", jsonData.user.id);"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"username\": \"{{admin_username}}\",\n    \"password\": \"{{admin_password}}\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/auth/login",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"auth",
								"login"
							]
						},
						"description": "Logs in as admin and saves access_token and user_id to environment variables."
					},
					"response": []
				},
				{
					"name": "Login Penilai",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"pm.environment.set(\"penilai_access_token\", jsonData.access_token);",
									"pm.environment.set(\"penilai_user_id\", jsonData.user.id);"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"username\": \"{{penilai_username}}\",\n    \"password\": \"{{penilai_password}}\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/auth/login",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"auth",
								"login"
							]
						},
						"description": "Logs in as penilai and saves access_token and user_id to environment variables."
					},
					"response": []
				},
				{
					"name": "Login Surveyor",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"pm.environment.set(\"surveyor_access_token\", jsonData.access_token);",
									"pm.environment.set(\"surveyor_user_id\", jsonData.user.id);"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"username\": \"{{surveyor_username}}\",\n    \"password\": \"{{surveyor_password}}\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/auth/login",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"auth",
								"login"
							]
						},
						"description": "Logs in as surveyor and saves access_token and user_id to environment variables."
					},
					"response": []
				},
				{
					"name": "Login Tim Supervisi",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"pm.environment.set(\"tim_supervisi_access_token\", jsonData.access_token);",
									"pm.environment.set(\"tim_supervisi_user_id\", jsonData.user.id);"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"username\": \"{{tim_supervisi_username}}\",\n    \"password\": \"{{tim_supervisi_password}}\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/auth/login",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"auth",
								"login"
							]
						},
						"description": "Logs in as tim supervisi and saves access_token and user_id to environment variables."
					},
					"response": []
				},
				{
					"name": "Login Klien",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"pm.environment.set(\"klien_access_token\", jsonData.access_token);",
									"pm.environment.set(\"klien_user_id\", jsonData.user.id);"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"username\": \"{{klien_username}}\",\n    \"password\": \"{{klien_password}}\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/auth/login",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"auth",
								"login"
							]
						},
						"description": "Logs in as klien and saves access_token and user_id to environment variables."
					},
					"response": []
				},
				{
					"name": "Login Pengawas Mutu",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"pm.environment.set(\"pengawas_mutu_access_token\", jsonData.access_token);",
									"pm.environment.set(\"pengawas_mutu_user_id\", jsonData.user.id);"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"username\": \"{{pengawas_mutu_username}}\",\n    \"password\": \"{{pengawas_mutu_password}}\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/auth/login",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"auth",
								"login"
							]
						},
						"description": "Logs in as pengawas mutu and saves access_token and user_id to environment variables."
					},
					"response": []
				},
				{
					"name": "Refresh Token",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/auth/refresh-token",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"auth",
								"refresh-token"
							]
						},
						"description": "Refreshes access token using the httpOnly refresh_token cookie."
					},
					"response": []
				},
				{
					"name": "Logout",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/auth/logout",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"auth",
								"logout"
							]
						},
						"description": "Logs out the current user, invalidating tokens in DB and clearing refresh token cookie."
					},
					"response": []
				}
			],
			"description": "Authentication and authorization endpoints."
		},
		{
			"name": "2. Users (User Management)",
			"item": [
				{
					"name": "Get All Users",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/users",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"users"
							]
						},
						"description": "Retrieves a list of all users. Accessible by Admin. Optional query params: role, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get User by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/users/{{admin_user_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"users",
								"{{admin_user_id}}"
							]
						},
						"description": "Retrieves details of a specific user by ID. Accessible by Admin."
					},
					"response": []
				},
				{
					"name": "Create New User",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"new_user_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"username\": \"test_new_user\",\n    \"password\": \"12345678\",\n    \"role\": \"klien\",\n    \"nama_lengkap\": \"Test New Client User\",\n    \"email\": \"test.newclient@example.com\",\n    \"no_telepon\": \"081298765432\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/users",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"users"
							]
						},
						"description": "Creates a new user. Accessible by Admin. Saves new user ID to environment."
					},
					"response": []
				},
				{
					"name": "Update User by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"nama_lengkap\": \"Test New Client User Updated\",\n    \"email\": \"updated.test.newclient@example.com\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/users/{{new_user_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"users",
								"{{new_user_id}}"
							]
						},
						"description": "Updates details of a specific user. Accessible by Admin. Use ID from 'Create New User'."
					},
					"response": []
				},
				{
					"name": "Delete User by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/users/{{new_user_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"users",
								"{{new_user_id}}"
							]
						},
						"description": "Deletes a user by ID. Accessible by Admin. Use ID from 'Create New User'. CAUTION: Deleting users with associated data might fail due to FK constraints."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing users (admin access typically required)."
		},
		{
			"name": "3. Clients (Client Management)",
			"item": [
				{
					"name": "Get All Clients",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/clients",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"clients"
							]
						},
						"description": "Retrieves a list of all clients. Accessible by Admin, Tim Supervisi, Penilai. Optional query params: status_klien, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Client by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/clients/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"clients",
								"1"
							]
						},
						"description": "Retrieves details of a specific client by ID. Accessible by Admin, Tim Supervisi, Penilai."
					},
					"response": []
				},
				{
					"name": "Create New Client",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_client_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"nama_perusahaan\": \"PT Uji Coba Klien\",\n    \"nama_pic\": \"Budi Test\",\n    \"alamat\": \"Jl. Test No. 1, Jakarta\",\n    \"email\": \"budi.test@ujicoba.com\",\n    \"no_telepon\": \"081234567890\",\n    \"status_klien\": \"baru\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/clients",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"clients"
							]
						},
						"description": "Creates a new client. Accessible by Admin, Tim Supervisi. Saves new client ID to environment."
					},
					"response": []
				},
				{
					"name": "Update Client by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"nama_pic\": \"Budi Test, S.E.\",\n    \"status_klien\": \"eksisting\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/clients/{{current_client_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"clients",
								"{{current_client_id}}"
							]
						},
						"description": "Updates details of a specific client. Accessible by Admin, Tim Supervisi."
					},
					"response": []
				},
				{
					"name": "Delete Client by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/clients/{{current_client_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"clients",
								"{{current_client_id}}"
							]
						},
						"description": "Deletes a client by ID. Accessible by Admin. CAUTION: Deleting clients with associated data might fail due to FK constraints."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing clients."
		},
		{
			"name": "4. Jenis Aset (Master Data)",
			"item": [
				{
					"name": "Get All Jenis Aset",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/jenis-aset",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"jenis-aset"
							]
						},
						"description": "Retrieves a list of all asset types. Accessible by most roles. Optional query params: search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Jenis Aset by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/jenis-aset/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"jenis-aset",
								"1"
							]
						},
						"description": "Retrieves details of a specific asset type by ID. Accessible by most roles."
					},
					"response": []
				},
				{
					"name": "Create New Jenis Aset",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"nama_jenis_aset\": \"Lahan Pertanian\",\n    \"deskripsi\": \"Tanah yang digunakan untuk kegiatan pertanian.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/jenis-aset",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"jenis-aset"
							]
						},
						"description": "Creates a new asset type. Accessible by Admin. Note: Requires unique name."
					},
					"response": []
				},
				{
					"name": "Update Jenis Aset by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"deskripsi\": \"Tanah yang secara aktif digunakan untuk kegiatan pertanian dan perkebunan.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/jenis-aset/8",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"jenis-aset",
								"8"
							]
						},
						"description": "Updates details of a specific asset type. Accessible by Admin. Change ID to an existing new asset type if testing creation."
					},
					"response": []
				},
				{
					"name": "Delete Jenis Aset by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/jenis-aset/8",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"jenis-aset",
								"8"
							]
						},
						"description": "Deletes an asset type by ID. Accessible by Admin. CAUTION: Deleting types with associated service requests might fail due to FK constraints."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing master data of asset types."
		},
		{
			"name": "5. Permintaan Jasa (Service Requests)",
			"item": [
				{
					"name": "Get All Permintaan Jasa",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/permintaan-jasa?status=pending",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"permintaan-jasa"
							],
							"query": [
								{
									"key": "status",
									"value": "pending"
								},
								{
									"key": "client_id",
									"value": "3",
									"disabled": true
								},
								{
									"key": "search",
									"value": "lahan",
									"disabled": true
								},
								{
									"key": "start_date",
									"value": "2025-07-05",
									"disabled": true
								},
								{
									"key": "end_date",
									"value": "2025-07-05",
									"disabled": true
								}
							]
						},
						"description": "Retrieves a list of all service requests. Accessible by Admin, Tim Supervisi, Penilai. Optional query params: status, client_id, jenis_aset_id, start_date, end_date, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Permintaan Jasa by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/permintaan-jasa/3",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"permintaan-jasa",
								"3"
							]
						},
						"description": "Retrieves details of a specific service request by ID. Accessible by Admin, Tim Supervisi, Penilai. Use ID from data dummy (e.g., 3 for pending request)."
					},
					"response": []
				},
				{
					"name": "Create New Permintaan Jasa",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_permintaan_jasa_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{klien_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"client_id\": 1,\n    \"tujuan_penilaian\": \"Penilaian Bangunan Gudang Baru\",\n    \"jenis_penilaian\": \"baru\",\n    \"jenis_aset_id\": 3, \n    \"lokasi_aset\": \"Jl. Industri 123, Tangerang\",\n    \"jadwal_diinginkan\": \"2025-08-01\",\n    \"bentuk_laporan_diinginkan\": \"long_report\",\n    \"catatan_klien\": \"Untuk keperluan laporan keuangan.\" \n}"
						},
						"url": {
							"raw": "{{baseUrl}}/permintaan-jasa",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"permintaan-jasa"
							]
						},
						"description": "Creates a new service request. Accessible by Admin, Tim Supervisi, or Klien. Saves new request ID to environment."
					},
					"response": []
				},
				{
					"name": "Update Permintaan Jasa by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"lokasi_aset\": \"Jl. Industri 123, Tangerang (Updated Location)\",\n    \"catatan_klien\": \"Lokasi dikonfirmasi ulang.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/permintaan-jasa/{{current_permintaan_jasa_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"permintaan-jasa",
								"{{current_permintaan_jasa_id}}"
							]
						},
						"description": "Updates details of a specific service request. Accessible by Admin, Tim Supervisi."
					},
					"response": []
				},
				{
					"name": "Update Permintaan Jasa Status",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{tim_supervisi_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"status_permintaan\": \"disetujui\",\n    \"catatan_risiko_klien\": \"Tidak ada risiko setelah verifikasi awal.\",\n    \"is_berisiko_klien\": false,\n    \"kesimpulan_supervisi\": \"Permintaan siap untuk penugasan proyek.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/permintaan-jasa/{{current_permintaan_jasa_id}}/status",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"permintaan-jasa",
								"{{current_permintaan_jasa_id}}",
								"status"
							]
						},
						"description": "Updates the status of a service request. Accessible by Admin, Tim Supervisi. Use ID of a pending request."
					},
					"response": []
				},
				{
					"name": "Delete Permintaan Jasa by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/permintaan-jasa/{{current_permintaan_jasa_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"permintaan-jasa",
								"{{current_permintaan_jasa_id}}"
							]
						},
						"description": "Deletes a service request by ID. Accessible by Admin. CAUTION: Deleting requests linked to projects might fail due to FK constraints."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing service requests."
		},
		{
			"name": "6. Proyek (Project Management)",
			"item": [
				{
					"name": "Get All Proyek",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/proyek",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"proyek"
							]
						},
						"description": "Retrieves a list of all projects. Accessible by Admin, Penilai, Pengawas Mutu, Tim Supervisi. Optional query params: status, penilai_id, pengawas_mutu_id, start_date, end_date, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Proyek by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/proyek/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"proyek",
								"1"
							]
						},
						"description": "Retrieves details of a specific project by ID. Accessible by Admin, Penilai, Pengawas Mutu, Tim Supervisi."
					},
					"response": []
				},
				{
					"name": "Create New Proyek",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_proyek_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"permintaan_jasa_id\": 3, \n    \"nama_proyek\": \"Proyek Penilaian Lahan Cikarang V2\",\n    \"penilai_utama_user_id\": {{penilai_user_id}},\n    \"pengawas_mutu_user_id\": {{pengawas_mutu_user_id}},\n    \"tanggal_mulai\": \"2025-07-20\",\n    \"tanggal_target_selesai\": \"2025-08-05\",\n    \"nomor_instruksi\": \"INST-L-003-NEW\",\n    \"estimasi_hari_kerja\": 10\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/proyek",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"proyek"
							]
						},
						"description": "Creates a new project from an approved service request. Accessible by Admin, Tim Supervisi, Penilai. Saves new project ID to environment. Use a Permintaan Jasa ID that is 'disetujui' (e.g., 3 after updating its status)."
					},
					"response": []
				},
				{
					"name": "Update Proyek by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"nama_proyek\": \"Proyek Penilaian Lahan Cikarang (Updated)\",\n    \"estimasi_hari_kerja\": 15,\n    \"status_proyek\": \"on_survey\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/proyek/{{current_proyek_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"proyek",
								"{{current_proyek_id}}"
							]
						},
						"description": "Updates details of a specific project. Accessible by Admin, Penilai."
					},
					"response": []
				},
				{
					"name": "Update Proyek Status",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{penilai_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"status_proyek\": \"pending_review\",\n    \"tanggal_selesai_aktual\": \"2025-08-04\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/proyek/{{current_proyek_id}}/status",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"proyek",
								"{{current_proyek_id}}",
								"status"
							]
						},
						"description": "Updates the status of a project. Accessible by Admin, Penilai. Use ID of a project (e.g., 1 for initial test)."
					},
					"response": []
				},
				{
					"name": "Delete Proyek by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/proyek/{{current_proyek_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"proyek",
								"{{current_proyek_id}}"
							]
						},
						"description": "Deletes a project by ID. Accessible by Admin. CAUTION: Deleting projects with associated data (assignments, analysis, reports) might fail due to FK constraints."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing appraisal projects."
		},
		{
			"name": "7. Penugasan Survei (Survey Assignments)",
			"item": [
				{
					"name": "Get All Penugasan Survei",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/penugasan-survei",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"penugasan-survei"
							]
						},
						"description": "Retrieves a list of all survey assignments. Accessible by Admin, Penilai, Surveyor, Tim Supervisi. Optional query params: proyek_id, surveyor_id, status, start_date, end_date, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Penugasan Survei by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/penugasan-survei/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"penugasan-survei",
								"1"
							]
						},
						"description": "Retrieves details of a specific survey assignment by ID. Accessible by Admin, Penilai, Surveyor, Tim Supervisi. Use ID from data dummy (e.g., 1)."
					},
					"response": []
				},
				{
					"name": "Create New Penugasan Survei",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_penugasan_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{penilai_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"proyek_id\": 2, \n    \"surveyor_user_id\": {{surveyor_user_id}},\n    \"tanggal_pelaksanaan_survey\": \"2025-07-25\",\n    \"lokasi_survei_detail\": \"Kawasan Industri Pulogadung Blok A2, Area Mesin Produksi V2\",\n    \"instruksi_khusus\": \"Pastikan semua nomor seri mesin tercatat dan foto kondisi terakhir.\",\n    \"is_independen_penilai\": true\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/penugasan-survei",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"penugasan-survei"
							]
						},
						"description": "Creates a new survey assignment. Accessible by Admin, Penilai. Saves new assignment ID to environment. Use a project ID that is 'pending_survey' or 'on_survey' (e.g., 2)."
					},
					"response": []
				},
				{
					"name": "Update Penugasan Survei by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{penilai_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"instruksi_khusus\": \"Pastikan semua nomor seri mesin tercatat, foto kondisi terakhir, dan catat spesifikasi teknis.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/penugasan-survei/{{current_penugasan_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"penugasan-survei",
								"{{current_penugasan_id}}"
							]
						},
						"description": "Updates details of a specific survey assignment. Accessible by Admin, Penilai, Surveyor (for their own task status)."
					},
					"response": []
				},
				{
					"name": "Update Penugasan Survei Status Tugas",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{surveyor_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"status_tugas\": \"diterima\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/penugasan-survei/{{current_penugasan_id}}/status",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"penugasan-survei",
								"{{current_penugasan_id}}",
								"status"
							]
						},
						"description": "Updates the status of a survey task. Accessible by Admin, Penilai, Surveyor (for their own). Use ID of an existing assignment. Try changing status from 'ditugaskan' to 'diterima', then 'dalam_proses', then 'selesai'."
					},
					"response": []
				},
				{
					"name": "Delete Penugasan Survei by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/penugasan-survei/{{current_penugasan_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"penugasan-survei",
								"{{current_penugasan_id}}"
							]
						},
						"description": "Deletes a survey assignment by ID. Accessible by Admin, Penilai. CAUTION: Deleting assignments with associated survey data might fail due to FK constraints."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing survey assignments."
		},
		{
			"name": "8. Data Survei (Field Data)",
			"item": [
				{
					"name": "Get All Data Survei",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{surveyor_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/data-survei",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"data-survei"
							]
						},
						"description": "Retrieves a list of all survey data. Accessible by Admin, Penilai, Surveyor. Optional query params: penugasan_id, status_data, jenis_survei, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Data Survei by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{surveyor_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/data-survei/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"data-survei",
								"1"
							]
						},
						"description": "Retrieves details of specific survey data by ID. Accessible by Admin, Penilai, Surveyor. Use ID from data dummy (e.g., 1)."
					},
					"response": []
				},
				{
					"name": "Create New Data Survei",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_data_survei_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{surveyor_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"penugasan_survei_id\": 2, \n    \"catatan_teknis\": \"Pengumpulan data interior dan eksterior ruko di Jl. Raya Dago.\",\n    \"status_data\": \"draft\",\n    \"jenis_survei\": \"ruko\",\n    \"detail_survei_data\": {\n        \"peruntukan\": \"ruko\",\n        \"tahun_dibangun\": 2020,\n        \"jumlah_lantai\": 3,\n        \"listrik_watt\": 5000,\n        \"kondisi\": \"cukup\",\n        \"mezanine\": true\n    },\n    \"foto_aset_data\": [\n        {\n            \"url_foto\": \"/uploads/foto_aset/ruko-tampak-depan.jpg\",\n            \"keterangan_foto\": \"Tampak depan ruko\",\n            \"latitude\": -6.89045,\n            \"longitude\": 107.61050\n        }\n    ],\n    \"checklist_verifikasi_data\": [\n        {\n            \"item_checklist\": \"Kondisi instalasi listrik ruko\",\n            \"is_checked\": true\n        },\n        {\n            \"item_checklist\": \"Pengecekan drainase area parkir\",\n            \"is_checked\": false,\n            \"catatan\": \"Ada genangan air kecil saat hujan.\"\n        }\n    ]\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/data-survei",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"data-survei"
							]
						},
						"description": "Creates new survey data. Accessible by Surveyor. Saves new data ID to environment. Use a Penugasan Survei ID that doesn't have existing survey data (e.g., 2, which is for 'Proyek Revaluasi Aset Pulogadung')."
					},
					"response": []
				},
				{
					"name": "Update Data Survei by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{surveyor_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"catatan_teknis\": \"Pengumpulan data interior dan eksterior ruko di Jl. Raya Dago (Updated).\",\n    \"status_data\": \"valid\",\n    \"jenis_survei\": \"ruko\",\n    \"detail_survei_data\": {\n        \"peruntukan\": \"ruko\",\n        \"tahun_dibangun\": 2020,\n        \"jumlah_lantai\": 4,\n        \"listrik_watt\": 7700,\n        \"kondisi\": \"baik\",\n        \"mezanine\": true\n    },\n    \"foto_aset_data\": [\n        {\n            \"url_foto\": \"/uploads/foto_aset/ruko-tampak-depan.jpg\",\n            \"keterangan_foto\": \"Tampak depan ruko (updated)\",\n            \"latitude\": -6.89040,\n            \"longitude\": 107.61055\n        }\n    ],\n    \"checklist_verifikasi_data\": [\n        {\n            \"item_checklist\": \"Kondisi instalasi listrik ruko\",\n            \"is_checked\": true\n        },\n        {\n            \"item_checklist\": \"Pengecekan drainase area parkir\",\n            \"is_checked\": true,\n            \"catatan\": \"Drainase sudah diperbaiki.\"\n        }\n    ]\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/data-survei/{{current_data_survei_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"data-survei",
								"{{current_data_survei_id}}"
							]
						},
						"description": "Updates specific survey data. Accessible by Surveyor, Penilai. Use ID from 'Create New Data Survei'. Note: For array-based relations (foto_aset_data, checklist_verifikasi_data), you must resend all items you want to keep."
					},
					"response": []
				},
				{
					"name": "Update Data Survei Status Data",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{penilai_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"status_data\": \"valid\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/data-survei/{{current_data_survei_id}}/status",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"data-survei",
								"{{current_data_survei_id}}",
								"status"
							]
						},
						"description": "Updates the status of survey data. Accessible by Surveyor, Penilai. Use ID of an existing survey data. If status becomes 'valid', associated Penugasan Survei might update to 'selesai'."
					},
					"response": []
				},
				{
					"name": "Delete Data Survei by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/data-survei/{{current_data_survei_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"data-survei",
								"{{current_data_survei_id}}"
							]
						},
						"description": "Deletes survey data by ID. Accessible by Admin, Penilai. Deletes all associated detail data (FotoAset, Checklist, Komentar, specific survey details)."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing collected survey data and their specific details."
		},
		{
			"name": "9. Foto Aset (Asset Photos)",
			"item": [
				{
					"name": "Get All Foto Aset",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/foto-aset",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"foto-aset"
							]
						},
						"description": "Retrieves a list of all asset photos. Accessible by Admin, Penilai, Surveyor. Optional query param: data_survei_id, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Foto Aset by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/foto-aset/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"foto-aset",
								"1"
							]
						},
						"description": "Retrieves details of a specific asset photo by ID. Accessible by Admin, Penilai, Surveyor."
					},
					"response": []
				},
				{
					"name": "Create New Foto Aset",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_foto_aset_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{surveyor_access_token}}"
							}
						],
						"body": {
							"mode": "formdata",
							"formdata": [
								{
									"key": "data_survei_id",
									"value": "1",
									"type": "text",
									"description": "Use an existing Data Survei ID"
								},
								{
									"key": "keterangan_foto",
									"value": "Foto eksterior properti",
									"type": "text"
								},
								{
									"key": "latitude",
									"value": "-6.208700",
									"type": "text"
								},
								{
									"key": "longitude",
									"value": "106.845500",
									"type": "text"
								},
								{
									"key": "foto",
									"type": "file",
									"src": "/path/to/your/image.jpg",
									"description": "Select an image file here"
								}
							]
						},
						"url": {
							"raw": "{{baseUrl}}/foto-aset",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"foto-aset"
							]
						},
						"description": "Uploads a new asset photo. Accessible by Surveyor. Saves new photo ID to environment. **Remember to manually select a file for the 'foto' field.**"
					},
					"response": []
				},
				{
					"name": "Update Foto Aset by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{surveyor_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"keterangan_foto\": \"Foto eksterior properti (Updated)\",\n    \"latitude\": -6.208750\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/foto-aset/{{current_foto_aset_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"foto-aset",
								"{{current_foto_aset_id}}"
							]
						},
						"description": "Updates details of a specific asset photo. Accessible by Surveyor, Admin. File itself cannot be updated via this endpoint."
					},
					"response": []
				},
				{
					"name": "Delete Foto Aset by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/foto-aset/{{current_foto_aset_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"foto-aset",
								"{{current_foto_aset_id}}"
							]
						},
						"description": "Deletes an asset photo by ID, including the physical file. Accessible by Surveyor, Admin."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing asset photos, including file uploads."
		},
		{
			"name": "10. Checklist Verifikasi",
			"item": [
				{
					"name": "Get All Checklist Items",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/checklist-verifikasi",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"checklist-verifikasi"
							]
						},
						"description": "Retrieves a list of all checklist items. Accessible by Admin, Penilai, Surveyor. Optional query params: data_survei_id, is_checked, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Checklist Item by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/checklist-verifikasi/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"checklist-verifikasi",
								"1"
							]
						},
						"description": "Retrieves details of a specific checklist item by ID. Accessible by Admin, Penilai, Surveyor."
					},
					"response": []
				},
				{
					"name": "Create New Checklist Item",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_checklist_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{surveyor_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"data_survei_id\": 1, \n    \"item_checklist\": \"Verifikasi fasilitas listrik\",\n    \"is_checked\": true,\n    \"catatan\": \"Listrik 5500VA, berfungsi baik.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/checklist-verifikasi",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"checklist-verifikasi"
							]
						},
						"description": "Creates a new checklist item. Accessible by Surveyor. Saves new checklist ID to environment."
					},
					"response": []
				},
				{
					"name": "Update Checklist Item by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{surveyor_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"is_checked\": false,\n    \"catatan\": \"Listrik sempat padam saat survei, perlu dicek ulang.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/checklist-verifikasi/{{current_checklist_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"checklist-verifikasi",
								"{{current_checklist_id}}"
							]
						},
						"description": "Updates details of a specific checklist item. Accessible by Surveyor, Penilai."
					},
					"response": []
				},
				{
					"name": "Delete Checklist Item by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/checklist-verifikasi/{{current_checklist_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"checklist-verifikasi",
								"{{current_checklist_id}}"
							]
						},
						"description": "Deletes a checklist item by ID. Accessible by Admin, Penilai, Surveyor."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing verification checklist items."
		},
		{
			"name": "11. Komentar (Internal Collaboration)",
			"item": [
				{
					"name": "Get All Komentar",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/komentar",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"komentar"
							]
						},
						"description": "Retrieves a list of all comments. Accessible by Admin, Penilai, Surveyor, Tim Supervisi. Optional query params: data_survei_id, user_id, jenis_komentar, status_komentar, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Komentar by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/komentar/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"komentar",
								"1"
							]
						},
						"description": "Retrieves details of a specific comment by ID. Accessible by Admin, Penilai, Surveyor, Tim Supervisi."
					},
					"response": []
				},
				{
					"name": "Create New Komentar",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_komentar_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{penilai_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"data_survei_id\": 1, \n    \"komentar_teks\": \"Tolong verifikasi ulang koordinat GPS yang tercatat.\",\n    \"jenis_komentar\": \"revisi_permintaan\",\n    \"status_komentar\": \"aktif\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/komentar",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"komentar"
							]
						},
						"description": "Creates a new comment. Accessible by Penilai, Surveyor, Tim Supervisi. Saves new comment ID to environment. If type is 'revisi_permintaan', associated Data Survei status might change."
					},
					"response": []
				},
				{
					"name": "Update Komentar by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{surveyor_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"status_komentar\": \"teratasi\",\n    \"komentar_teks\": \"Koordinat GPS sudah diverifikasi ulang dan diperbaiki.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/komentar/{{current_komentar_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"komentar",
								"{{current_komentar_id}}"
							]
						},
						"description": "Updates details of a specific comment. Accessible by Admin, and the user who created it. Changing status to 'teratasi' might affect Data Survei status if it's a revision comment."
					},
					"response": []
				},
				{
					"name": "Delete Komentar by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/komentar/{{current_komentar_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"komentar",
								"{{current_komentar_id}}"
							]
						},
						"description": "Deletes a comment by ID. Accessible by Admin, and the user who created it."
					},
					"response": []
				}
			],
			"description": "Endpoints for internal collaboration and comments on survey data."
		},
		{
			"name": "12. Hasil Analisis (Analysis Results)",
			"item": [
				{
					"name": "Get All Hasil Analisis",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/hasil-analisis",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"hasil-analisis"
							]
						},
						"description": "Retrieves a list of all analysis results. Accessible by Admin, Penilai, Pengawas Mutu, Tim Supervisi. Optional query params: proyek_id, analis_id, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Hasil Analisis by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/hasil-analisis/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"hasil-analisis",
								"1"
							]
						},
						"description": "Retrieves details of a specific analysis result by ID. Accessible by Admin, Penilai, Pengawas Mutu, Tim Supervisi."
					},
					"response": []
				},
				{
					"name": "Create New Hasil Analisis",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_hasil_analisis_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{penilai_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"proyek_id\": 2, \n    \"metode_penilaian_digunakan\": \"Pendekatan Pasar & Biaya\",\n    \"ringkasan_nilai\": \"Analisis komprehensif aset mesin berdasarkan nilai pasar dan biaya reproduksi.\",\n    \"nilai_estimasi_akhir\": 4350000000.00,\n    \"catatan_interpretasi\": \"Nilai pasar lebih rendah dari estimasi biaya akibat faktor ekonomi.\",\n    \"data_grafik_json\": { \"years\": [\"2022\", \"2023\", \"2024\"], \"values\": [5000, 4800, 4350] }\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/hasil-analisis",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"hasil-analisis"
							]
						},
						"description": "Creates a new analysis result. Accessible by Admin, Penilai. Saves new analysis ID to environment. Use a project ID that is 'on_analysis' or 'pending_review' (e.g., 2)."
					},
					"response": []
				},
				{
					"name": "Update Hasil Analisis by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{penilai_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"nilai_estimasi_akhir\": 4300000000.00,\n    \"catatan_interpretasi\": \"Nilai final setelah review pengawas mutu.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/hasil-analisis/{{current_hasil_analisis_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"hasil-analisis",
								"{{current_hasil_analisis_id}}"
							]
						},
						"description": "Updates details of a specific analysis result. Accessible by Admin, Penilai."
					},
					"response": []
				},
				{
					"name": "Delete Hasil Analisis by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/hasil-analisis/{{current_hasil_analisis_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"hasil-analisis",
								"{{current_hasil_analisis_id}}"
							]
						},
						"description": "Deletes an analysis result by ID. Accessible by Admin, Penilai. CAUTION: Deleting results with associated reports might fail due to FK constraints."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing analysis results of appraisals."
		},
		{
			"name": "13. Laporan Penilaian (Appraisal Reports)",
			"item": [
				{
					"name": "Get All Laporan Penilaian",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/laporan-penilaian",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"laporan-penilaian"
							]
						},
						"description": "Retrieves a list of all appraisal reports. Accessible by Admin, Penilai, Pengawas Mutu, Tim Supervisi. Optional query params: proyek_id, dibuat_oleh_user_id, start_date, end_date, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Laporan Penilaian by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/laporan-penilaian/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"laporan-penilaian",
								"1"
							]
						},
						"description": "Retrieves details of a specific appraisal report by ID. Accessible by Admin, Penilai, Pengawas Mutu, Tim Supervisi."
					},
					"response": []
				},
				{
					"name": "Create New Laporan Penilaian",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_laporan_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{penilai_access_token}}"
							}
						],
						"body": {
							"mode": "formdata",
							"formdata": [
								{
									"key": "proyek_id",
									"value": "2",
									"type": "text",
									"description": "Use an existing Project ID that has completed analysis (e.g., 2, if its analysis is done)."
								},
								{
									"key": "laporan_pdf",
									"type": "file",
									"src": "/path/to/your/report.pdf",
									"description": "Select a PDF file here."
								},
								{
									"key": "laporan_word",
									"type": "file",
									"src": "/path/to/your/report.docx",
									"description": "Select a Word file here (Optional)."
								},
								{
									"key": "laporan_excel",
									"type": "file",
									"src": "/path/to/your/report.xlsx",
									"description": "Select an Excel file here (Optional)."
								}
							]
						},
						"url": {
							"raw": "{{baseUrl}}/laporan-penilaian",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"laporan-penilaian"
							]
						},
						"description": "Creates a new appraisal report. Accessible by Admin, Penilai. Saves new report ID to environment. **Remember to manually select files.**"
					},
					"response": []
				},
				{
					"name": "Update Laporan Penilaian by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{penilai_access_token}}"
							}
						],
						"body": {
							"mode": "formdata",
							"formdata": [
								{
									"key": "laporan_pdf",
									"type": "file",
									"src": "/path/to/your/new_report.pdf",
									"description": "Select a new PDF file to replace the old one (Optional)."
								},
								{
									"key": "clear_laporan_excel",
									"value": "true",
									"type": "text",
									"description": "Set to 'true' to delete the existing Excel file (Optional)."
								},
								{
									"key": "laporan_word",
									"type": "file",
									"src": "/path/to/your/new_report.docx",
									"description": "Select a new Word file to replace the old one (Optional)."
								}
							]
						},
						"url": {
							"raw": "{{baseUrl}}/laporan-penilaian/{{current_laporan_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"laporan-penilaian",
								"{{current_laporan_id}}"
							]
						},
						"description": "Updates details and/or files of a specific appraisal report. Accessible by Admin, Penilai. **Remember to manually select files.**"
					},
					"response": []
				},
				{
					"name": "Delete Laporan Penilaian by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/laporan-penilaian/{{current_laporan_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"laporan-penilaian",
								"{{current_laporan_id}}"
							]
						},
						"description": "Deletes an appraisal report by ID, including its associated files. Accessible by Admin, Penilai."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing appraisal reports, including file uploads."
		},
		{
			"name": "14. Log Komunikasi (Communication Logs)",
			"item": [
				{
					"name": "Get All Log Komunikasi",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/log-komunikasi",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"log-komunikasi"
							]
						},
						"description": "Retrieves a list of all communication logs. Accessible by Admin, Tim Supervisi, Penilai. Optional query params: client_id, proyek_id, user_id, jenis_komunikasi, start_date, end_date, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Log Komunikasi by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/log-komunikasi/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"log-komunikasi",
								"1"
							]
						},
						"description": "Retrieves details of a specific communication log by ID. Accessible by Admin, Tim Supervisi, Penilai."
					},
					"response": []
				},
				{
					"name": "Create New Log Komunikasi",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_log_komunikasi_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{tim_supervisi_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"client_id\": 1,\n    \"proyek_id\": 1,\n    \"tanggal_pembicaraan\": \"2025-07-12T15:30:00Z\",\n    \"jenis_komunikasi\": \"chat\",\n    \"catatan\": \"Follow up tentang status laporan.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/log-komunikasi",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"log-komunikasi"
							]
						},
						"description": "Creates a new communication log. Accessible by Admin, Tim Supervisi, Penilai. Saves new log ID to environment. Must be associated with a Client or a Project (or both)."
					},
					"response": []
				},
				{
					"name": "Update Log Komunikasi by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Authorization",
								"value": "Bearer {{tim_supervisi_access_token}}"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"catatan\": \"Follow up tentang status laporan. Klien meminta update terkini (Updated).\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/log-komunikasi/{{current_log_komunikasi_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"log-komunikasi",
								"{{current_log_komunikasi_id}}"
							]
						},
						"description": "Updates details of a specific communication log. Accessible by Admin, Tim Supervisi, Penilai."
					},
					"response": []
				},
				{
					"name": "Delete Log Komunikasi by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/log-komunikasi/{{current_log_komunikasi_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"log-komunikasi",
								"{{current_log_komunikasi_id}}"
							]
						},
						"description": "Deletes a communication log by ID. Accessible by Admin, Tim Supervisi."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing communication logs with clients or related to projects."
		},
		{
			"name": "15. Dokumen Pendukung (Supporting Documents)",
			"item": [
				{
					"name": "Get All Dokumen Pendukung",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/dokumen-pendukung",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"dokumen-pendukung"
							]
						},
						"description": "Retrieves a list of all supporting documents. Accessible by Admin, Penilai, Pengawas Mutu, Tim Supervisi, Klien. Optional query params: proyek_id, jenis_dokumen, diunggah_oleh_id, search, limit, page."
					},
					"response": []
				},
				{
					"name": "Get Dokumen Pendukung by ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/dokumen-pendukung/1",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"dokumen-pendukung",
								"1"
							]
						},
						"description": "Retrieves details of a specific supporting document by ID. Accessible by Admin, Penilai, Pengawas Mutu, Tim Supervisi, Klien."
					},
					"response": []
				},
				{
					"name": "Create New Dokumen Pendukung",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var jsonData = pm.response.json();",
									"if (jsonData.success) {",
									"    pm.environment.set(\"current_dokumen_id\", jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{penilai_access_token}}"
							}
						],
						"body": {
							"mode": "formdata",
							"formdata": [
								{
									"key": "proyek_id",
									"value": "1",
									"type": "text",
									"description": "Use an existing Project ID."
								},
								{
									"key": "nama_dokumen",
									"value": "Perjanjian Kerjasama Baru",
									"type": "text"
								},
								{
									"key": "jenis_dokumen",
									"value": "perjanjian_pihak_ketiga",
									"type": "text"
								},
								{
									"key": "dokumen",
									"type": "file",
									"src": "/path/to/your/document.pdf",
									"description": "Select a document file (PDF, Word, Excel, Image)."
								}
							]
						},
						"url": {
							"raw": "{{baseUrl}}/dokumen-pendukung",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"dokumen-pendukung"
							]
						},
						"description": "Uploads a new supporting document. Accessible by Admin, Penilai, Tim Supervisi. Saves new document ID to environment. **Remember to manually select a file.**"
					},
					"response": []
				},
				{
					"name": "Update Dokumen Pendukung by ID",
					"request": {
						"method": "PUT",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{penilai_access_token}}"
							}
						],
						"body": {
							"mode": "formdata",
							"formdata": [
								{
									"key": "nama_dokumen",
									"value": "Perjanjian Kerjasama Terbaru",
									"type": "text"
								},
								{
									"key": "dokumen",
									"type": "file",
									"src": "/path/to/your/new_document.pdf",
									"description": "Select a new document file to replace the old one (Optional)."
								},
								{
									"key": "clear_dokumen",
									"value": "false",
									"type": "text",
									"description": "Set to 'true' to delete the existing document file without replacing it (Optional)."
								}
							]
						},
						"url": {
							"raw": "{{baseUrl}}/dokumen-pendukung/{{current_dokumen_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"dokumen-pendukung",
								"{{current_dokumen_id}}"
							]
						},
						"description": "Updates details and/or file of a specific supporting document. Accessible by Admin, Penilai, Tim Supervisi. **Remember to manually select a file if updating.**"
					},
					"response": []
				},
				{
					"name": "Delete Dokumen Pendukung by ID",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{admin_access_token}}"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/dokumen-pendukung/{{current_dokumen_id}}",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"dokumen-pendukung",
								"{{current_dokumen_id}}"
							]
						},
						"description": "Deletes a supporting document by ID, including its associated file. Accessible by Admin, Penilai, Tim Supervisi."
					},
					"response": []
				}
			],
			"description": "Endpoints for managing supporting documents related to projects."
		}
	],
	"protocolProfileBehavior": {}
}