Files
services_core/api.json
T
2026-07-27 16:24:09 +07:00

8895 lines
374 KiB
JSON

{
"openapi": "3.1.0",
"info": {
"title": "Laravel",
"version": "0.0.1"
},
"servers": [
{
"url": "http://localhost/api"
}
],
"security": [
{
"http": []
}
],
"paths": {
"/audit-logs": {
"get": {
"operationId": "auditLog.index",
"tags": [
"AuditLog"
],
"parameters": [
{
"name": "module",
"in": "query",
"description": "Filter berdasarkan nama modul audit.",
"schema": {
"type": [
"string",
"null"
],
"maxLength": 100
}
},
{
"name": "action",
"in": "query",
"description": "Filter berdasarkan nama action audit.",
"schema": {
"type": [
"string",
"null"
],
"maxLength": 100
}
},
{
"name": "user_id",
"in": "query",
"description": "Filter berdasarkan ID user pelaku.",
"schema": {
"type": [
"integer",
"null"
]
}
},
{
"name": "tenant_id",
"in": "query",
"description": "Filter berdasarkan ID tenant.",
"schema": {
"type": [
"integer",
"null"
]
}
},
{
"name": "page",
"in": "query",
"description": "Nomor halaman yang ingin diambil.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1
}
},
{
"name": "per_page",
"in": "query",
"description": "Jumlah data per halaman, maksimal 100.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Data audit log berhasil diambil"
},
"data": {
"type": "string"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/audit-logs/{id}": {
"get": {
"operationId": "auditLog.show",
"tags": [
"AuditLog"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Detail audit log berhasil diambil"
},
"data": {
"$ref": "#/components/schemas/AuditLogResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/login": {
"post": {
"operationId": "auth.login",
"tags": [
"Auth"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"login": {
"type": "string"
},
"password": {
"type": "string"
}
},
"required": [
"login",
"password"
]
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"token": {
"type": "string"
},
"user": {
"anyOf": [
{
"$ref": "#/components/schemas/User"
},
{
"type": "null"
}
]
}
},
"required": [
"success",
"token",
"user"
]
}
}
}
},
"403": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"message": {
"type": "string",
"const": "Akun belum aktif. Silakan verifikasi terlebih dahulu."
}
},
"required": [
"success",
"message"
]
}
}
}
},
"401": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"message": {
"type": "string",
"const": "Username/email atau password salah."
}
},
"required": [
"success",
"message"
]
}
}
}
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
},
"security": []
}
},
"/register": {
"post": {
"operationId": "auth.register",
"tags": [
"Auth"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RegisterRequest"
}
}
}
},
"responses": {
"201": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"message": {
"type": "string",
"const": "Register berhasil, silakan verifikasi kode."
},
"data": {
"type": "object",
"properties": {
"user": {
"$ref": "#/components/schemas/User"
},
"verification": {
"type": "object",
"properties": {
"channel": {
"type": [
"string",
"null"
]
},
"target": {
"type": [
"string",
"null"
]
},
"code": {
"type": "string"
},
"expires_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"channel",
"target",
"code",
"expires_at"
]
}
},
"required": [
"user",
"verification"
]
}
},
"required": [
"success",
"message",
"data"
]
}
}
}
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
},
"security": []
}
},
"/register/verify": {
"post": {
"operationId": "auth.verifyRegistration",
"tags": [
"Auth"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/VerifyRegistrationRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"message": {
"type": "string",
"const": "Verifikasi berhasil, user sudah aktif."
},
"data": {
"$ref": "#/components/schemas/User"
}
},
"required": [
"success",
"message",
"data"
]
}
}
}
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
},
"security": []
}
},
"/register/resend-code": {
"post": {
"operationId": "auth.resendVerificationCode",
"tags": [
"Auth"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ResendVerificationCodeRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"message": {
"type": "string",
"const": "Kode verifikasi baru berhasil dibuat."
},
"data": {
"type": "object",
"properties": {
"verification": {
"type": "object",
"properties": {
"channel": {
"type": [
"string",
"null"
]
},
"target": {
"type": [
"string",
"null"
]
},
"code": {
"type": "string"
},
"expires_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"channel",
"target",
"code",
"expires_at"
]
}
},
"required": [
"verification"
]
}
},
"required": [
"success",
"message",
"data"
]
}
}
}
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
},
"security": []
}
},
"/materials": {
"get": {
"operationId": "material.index",
"tags": [
"Material"
],
"parameters": [
{
"name": "search",
"in": "query",
"description": "Kata kunci untuk mencari barcode atau nama material.",
"schema": {
"type": [
"string",
"null"
],
"maxLength": 255
}
},
{
"name": "user_id",
"in": "query",
"description": "Filter material berdasarkan ID user/teknisi.",
"schema": {
"type": [
"integer",
"null"
]
}
},
{
"name": "type",
"in": "query",
"description": "Filter jenis material.",
"schema": {
"type": [
"string",
"null"
],
"enum": [
"serialized",
"consumable"
]
}
},
{
"name": "status",
"in": "query",
"description": "Filter status material.",
"schema": {
"type": [
"string",
"null"
],
"maxLength": 50
}
},
{
"name": "page",
"in": "query",
"description": "Nomor halaman yang ingin diambil.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1
}
},
{
"name": "per_page",
"in": "query",
"description": "Jumlah data per halaman, maksimal 100.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "List material user berhasil diambil"
},
"data": {
"type": "string"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/materials/assign": {
"post": {
"operationId": "material.assign",
"tags": [
"Material"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssignMaterialRequest"
}
}
}
},
"responses": {
"201": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 201
},
"message": {
"type": "string",
"const": "Material berhasil di-assign"
},
"data": {
"$ref": "#/components/schemas/MaterialResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/materials/transfer": {
"post": {
"operationId": "material.transfer",
"tags": [
"Material"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TransferMaterialRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Material berhasil di-transfer"
},
"data": {
"$ref": "#/components/schemas/MaterialResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/materials/return": {
"post": {
"operationId": "material.return",
"tags": [
"Material"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ReturnMaterialRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Material berhasil direturn"
},
"data": {
"$ref": "#/components/schemas/MaterialResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/materials/user/{user_id}": {
"get": {
"operationId": "material.listByUser",
"tags": [
"Material"
],
"parameters": [
{
"name": "user_id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "List material user berhasil diambil"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/MaterialResource"
}
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/materials/history/{barcode_id}": {
"get": {
"operationId": "material.history",
"tags": [
"Material"
],
"parameters": [
{
"name": "barcode_id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "History material berhasil diambil"
},
"data": {
"type": "string"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/me/menus": {
"get": {
"operationId": "menu.myMenus",
"tags": [
"Menu"
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Menu berhasil diambil"
},
"data": {
"type": "object",
"properties": {
"is_master": {
"type": "boolean"
},
"access_level": {
"type": "string"
},
"tenant_id": {
"type": "string"
},
"menus": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"parent_id": {
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"url": {
"type": "string"
},
"icon": {
"type": "string"
},
"component": {
"type": "string"
},
"sort_order": {
"type": "string"
},
"permissions": {
"type": "string"
},
"children": {
"type": "array",
"items": {}
}
},
"required": [
"id",
"parent_id",
"name",
"slug",
"url",
"icon",
"component",
"sort_order",
"permissions",
"children"
]
}
}
},
"required": [
"is_master",
"access_level",
"tenant_id",
"menus"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/menu-groups": {
"get": {
"operationId": "menu-groups.index",
"tags": [
"MenuGroup"
],
"parameters": [
{
"name": "search",
"in": "query",
"description": "Kata kunci untuk mencari nama atau deskripsi menu group.",
"schema": {
"type": [
"string",
"null"
],
"maxLength": 255
}
},
{
"name": "is_active",
"in": "query",
"description": "Filter status aktif menu group.",
"schema": {
"type": [
"boolean",
"null"
]
}
},
{
"name": "page",
"in": "query",
"description": "Nomor halaman yang ingin diambil.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1
}
},
{
"name": "per_page",
"in": "query",
"description": "Jumlah data per halaman, maksimal 100.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Data Menu Group berhasil diambil"
},
"data": {
"type": "object",
"properties": {
"current_page": {
"type": "integer",
"minimum": 1
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/MenuGroup"
}
},
"first_page_url": {
"type": [
"string",
"null"
]
},
"from": {
"type": [
"integer",
"null"
],
"minimum": 1
},
"last_page_url": {
"type": [
"string",
"null"
]
},
"last_page": {
"type": "integer",
"minimum": 1
},
"links": {
"type": "array",
"description": "Generated paginator links.",
"items": {
"type": "object",
"properties": {
"url": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
},
"active": {
"type": "boolean"
}
},
"required": [
"url",
"label",
"active"
]
}
},
"next_page_url": {
"type": [
"string",
"null"
]
},
"path": {
"type": [
"string",
"null"
],
"description": "Base path for paginator generated URLs."
},
"per_page": {
"type": "integer",
"description": "Number of items shown per page.",
"minimum": 0
},
"prev_page_url": {
"type": [
"string",
"null"
]
},
"to": {
"type": [
"integer",
"null"
],
"description": "Number of the last item in the slice.",
"minimum": 1
},
"total": {
"type": "integer",
"description": "Total number of items being paginated.",
"minimum": 0
}
},
"required": [
"current_page",
"data",
"first_page_url",
"from",
"last_page_url",
"last_page",
"links",
"next_page_url",
"path",
"per_page",
"prev_page_url",
"to",
"total"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"post": {
"operationId": "menu-groups.store",
"tags": [
"MenuGroup"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StoreMenuGroupRequest"
}
}
}
},
"responses": {
"201": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 201
},
"message": {
"type": "string",
"const": "Menu Group berhasil dibuat"
},
"data": {
"$ref": "#/components/schemas/MenuGroupResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/menu-groups/{menu_group}": {
"get": {
"operationId": "menu-groups.show",
"tags": [
"MenuGroup"
],
"parameters": [
{
"name": "menu_group",
"in": "path",
"required": true,
"description": "The menu group ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Detail Menu Group berhasil diambil"
},
"data": {
"$ref": "#/components/schemas/MenuGroupResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
},
"put": {
"operationId": "menu-groups.update",
"tags": [
"MenuGroup"
],
"parameters": [
{
"name": "menu_group",
"in": "path",
"required": true,
"description": "The menu group ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateMenuGroupRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Menu Group berhasil diupdate"
},
"data": {
"$ref": "#/components/schemas/MenuGroupResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"delete": {
"operationId": "menu-groups.destroy",
"tags": [
"MenuGroup"
],
"parameters": [
{
"name": "menu_group",
"in": "path",
"required": true,
"description": "The menu group ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Menu Group berhasil dihapus"
}
},
"required": [
"success",
"code",
"message"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/menu-groups/{menu_group}/menus": {
"get": {
"operationId": "menuGroup.menus",
"tags": [
"MenuGroup"
],
"parameters": [
{
"name": "menu_group",
"in": "path",
"required": true,
"description": "The menu group ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Mapping menu group berhasil diambil"
},
"data": {
"type": "object",
"properties": {
"menu_group_id": {
"type": "integer"
},
"menu_group": {
"$ref": "#/components/schemas/MenuGroupResource"
},
"menus": {
"type": "array",
"items": {
"type": "object",
"properties": {
"menu_id": {
"type": "integer"
},
"parent_id": {
"type": [
"integer",
"null"
]
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"url": {
"type": "string"
},
"icon": {
"type": "string"
},
"component": {
"type": "string"
},
"sort_order": {
"type": "integer"
},
"permissions": {
"type": "object",
"properties": {
"can_view": {
"type": "boolean"
},
"can_create": {
"type": "boolean"
},
"can_update": {
"type": "boolean"
},
"can_delete": {
"type": "boolean"
},
"can_approve": {
"type": "boolean"
},
"can_export": {
"type": "boolean"
}
},
"required": [
"can_view",
"can_create",
"can_update",
"can_delete",
"can_approve",
"can_export"
]
}
},
"required": [
"menu_id",
"parent_id",
"name",
"slug",
"url",
"icon",
"component",
"sort_order",
"permissions"
]
}
}
},
"required": [
"menu_group_id",
"menu_group",
"menus"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
},
"put": {
"operationId": "menuGroup.syncMenus",
"tags": [
"MenuGroup"
],
"parameters": [
{
"name": "menu_group",
"in": "path",
"required": true,
"description": "The menu group ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SyncMenuGroupMenusRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Mapping menu group berhasil disimpan"
},
"data": {
"type": "object",
"properties": {
"menu_group_id": {
"type": "integer"
},
"menu_group": {
"$ref": "#/components/schemas/MenuGroupResource"
},
"menus": {
"type": "array",
"items": {
"type": "object",
"properties": {
"menu_id": {
"type": "integer"
},
"parent_id": {
"type": [
"integer",
"null"
]
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"url": {
"type": "string"
},
"icon": {
"type": "string"
},
"component": {
"type": "string"
},
"sort_order": {
"type": "integer"
},
"permissions": {
"type": "object",
"properties": {
"can_view": {
"type": "boolean"
},
"can_create": {
"type": "boolean"
},
"can_update": {
"type": "boolean"
},
"can_delete": {
"type": "boolean"
},
"can_approve": {
"type": "boolean"
},
"can_export": {
"type": "boolean"
}
},
"required": [
"can_view",
"can_create",
"can_update",
"can_delete",
"can_approve",
"can_export"
]
}
},
"required": [
"menu_id",
"parent_id",
"name",
"slug",
"url",
"icon",
"component",
"sort_order",
"permissions"
]
}
}
},
"required": [
"menu_group_id",
"menu_group",
"menus"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/menu-groups/{menu_group}/available-menus": {
"get": {
"operationId": "menuGroup.availableMenus",
"tags": [
"MenuGroup"
],
"parameters": [
{
"name": "menu_group",
"in": "path",
"required": true,
"description": "The menu group ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Daftar menu tersedia berdasarkan akses user berhasil diambil"
},
"data": {
"type": "object",
"properties": {
"menu_group_id": {
"type": "integer"
},
"menu_group": {
"$ref": "#/components/schemas/MenuGroupResource"
},
"menus": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"properties": {
"menu_id": {
"type": "integer"
},
"parent_id": {
"type": [
"integer",
"null"
]
},
"name": {
"type": "string"
},
"sort_order": {
"type": "integer"
},
"permissions": {
"type": "object",
"properties": {
"can_view": {
"type": "boolean"
},
"can_create": {
"type": "boolean"
},
"can_update": {
"type": "boolean"
},
"can_delete": {
"type": "boolean"
},
"can_approve": {
"type": "boolean"
},
"can_export": {
"type": "boolean"
}
},
"required": [
"can_view",
"can_create",
"can_update",
"can_delete",
"can_approve",
"can_export"
]
}
},
"required": [
"menu_id",
"parent_id",
"name",
"sort_order",
"permissions"
]
}
},
{
"type": "array",
"items": {
"type": "object",
"properties": {
"menu_id": {
"type": "integer"
},
"parent_id": {
"type": [
"integer",
"null"
]
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"url": {
"type": "string"
},
"icon": {
"type": "string"
},
"component": {
"type": "string"
},
"sort_order": {
"type": "integer"
},
"permissions": {
"type": "object",
"properties": {
"can_view": {
"type": "boolean"
},
"can_create": {
"type": "boolean"
},
"can_update": {
"type": "boolean"
},
"can_delete": {
"type": "boolean"
},
"can_approve": {
"type": "boolean"
},
"can_export": {
"type": "boolean"
}
},
"required": [
"can_view",
"can_create",
"can_update",
"can_delete",
"can_approve",
"can_export"
]
}
},
"required": [
"menu_id",
"parent_id",
"name",
"slug",
"url",
"icon",
"component",
"sort_order",
"permissions"
]
}
}
]
}
},
"required": [
"menu_group_id",
"menu_group",
"menus"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
}
}
}
},
"/users/{user}/menu-groups": {
"get": {
"operationId": "menuGroup.userAssignments",
"tags": [
"MenuGroup"
],
"parameters": [
{
"name": "user",
"in": "path",
"required": true,
"description": "The user ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Assignment user menu group berhasil diambil"
},
"data": {
"type": "object",
"properties": {
"user_id": {
"type": "integer"
},
"assignments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"menu_group_id": {
"type": "integer"
},
"menu_group_name": {
"type": "string"
},
"menu_group_is_active": {
"type": "boolean"
},
"tenant_id": {
"type": [
"integer",
"null"
]
},
"tenant_name": {
"type": "string"
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [
"menu_group_id",
"menu_group_name",
"menu_group_is_active",
"tenant_id",
"tenant_name",
"created_at",
"updated_at"
]
}
}
},
"required": [
"user_id",
"assignments"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"403": {
"description": "An error",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Error overview.",
"example": ""
}
},
"required": [
"message"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
},
"put": {
"operationId": "menuGroup.syncUserAssignments",
"tags": [
"MenuGroup"
],
"parameters": [
{
"name": "user",
"in": "path",
"required": true,
"description": "The user ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SyncUserMenuGroupsRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Assignment user menu group berhasil disimpan"
},
"data": {
"type": "object",
"properties": {
"user_id": {
"type": "integer"
},
"assignments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"menu_group_id": {
"type": "integer"
},
"menu_group_name": {
"type": "string"
},
"menu_group_is_active": {
"type": "boolean"
},
"tenant_id": {
"type": [
"integer",
"null"
]
},
"tenant_name": {
"type": "string"
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [
"menu_group_id",
"menu_group_name",
"menu_group_is_active",
"tenant_id",
"tenant_name",
"created_at",
"updated_at"
]
}
}
},
"required": [
"user_id",
"assignments"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"403": {
"description": "An error",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Error overview.",
"example": ""
}
},
"required": [
"message"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/menus": {
"get": {
"operationId": "menus.index",
"tags": [
"MenuList"
],
"parameters": [
{
"name": "search",
"in": "query",
"description": "Kata kunci untuk mencari nama, slug, atau URL menu.",
"schema": {
"type": [
"string",
"null"
],
"maxLength": 255
}
},
{
"name": "is_active",
"in": "query",
"description": "Filter status aktif menu.",
"schema": {
"type": [
"boolean",
"null"
]
}
},
{
"name": "page",
"in": "query",
"description": "Nomor halaman yang ingin diambil.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1
}
},
{
"name": "per_page",
"in": "query",
"description": "Jumlah data per halaman, maksimal 100.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Data Menu List berhasil diambil"
},
"data": {
"type": "object",
"properties": {
"current_page": {
"type": "integer",
"minimum": 1
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/MenuList"
}
},
"first_page_url": {
"type": [
"string",
"null"
]
},
"from": {
"type": [
"integer",
"null"
],
"minimum": 1
},
"last_page_url": {
"type": [
"string",
"null"
]
},
"last_page": {
"type": "integer",
"minimum": 1
},
"links": {
"type": "array",
"description": "Generated paginator links.",
"items": {
"type": "object",
"properties": {
"url": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
},
"active": {
"type": "boolean"
}
},
"required": [
"url",
"label",
"active"
]
}
},
"next_page_url": {
"type": [
"string",
"null"
]
},
"path": {
"type": [
"string",
"null"
],
"description": "Base path for paginator generated URLs."
},
"per_page": {
"type": "integer",
"description": "Number of items shown per page.",
"minimum": 0
},
"prev_page_url": {
"type": [
"string",
"null"
]
},
"to": {
"type": [
"integer",
"null"
],
"description": "Number of the last item in the slice.",
"minimum": 1
},
"total": {
"type": "integer",
"description": "Total number of items being paginated.",
"minimum": 0
}
},
"required": [
"current_page",
"data",
"first_page_url",
"from",
"last_page_url",
"last_page",
"links",
"next_page_url",
"path",
"per_page",
"prev_page_url",
"to",
"total"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"post": {
"operationId": "menus.store",
"tags": [
"MenuList"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StoreMenuListRequest"
}
}
}
},
"responses": {
"201": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 201
},
"message": {
"type": "string",
"const": "Menu List berhasil dibuat"
},
"data": {
"$ref": "#/components/schemas/MenuListResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/menus/{menu_list}": {
"get": {
"operationId": "menus.show",
"tags": [
"MenuList"
],
"parameters": [
{
"name": "menu_list",
"in": "path",
"required": true,
"description": "The menu list ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Detail Menu List berhasil diambil"
},
"data": {
"$ref": "#/components/schemas/MenuListResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
},
"put": {
"operationId": "menus.update",
"tags": [
"MenuList"
],
"parameters": [
{
"name": "menu_list",
"in": "path",
"required": true,
"description": "The menu list ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateMenuListRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Menu List berhasil diupdate"
},
"data": {
"$ref": "#/components/schemas/MenuListResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"delete": {
"operationId": "menus.destroy",
"tags": [
"MenuList"
],
"parameters": [
{
"name": "menu_list",
"in": "path",
"required": true,
"description": "The menu list ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Menu List berhasil dihapus"
}
},
"required": [
"success",
"code",
"message"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/me/profile": {
"get": {
"operationId": "profile.show",
"tags": [
"Profile"
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Profile berhasil diambil"
},
"data": {
"$ref": "#/components/schemas/UserResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
},
"put": {
"operationId": "profile.update",
"tags": [
"Profile"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateProfileRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Profile berhasil diperbarui"
},
"data": {
"$ref": "#/components/schemas/UserResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tenants": {
"get": {
"operationId": "tenants.index",
"tags": [
"Tenant"
],
"parameters": [
{
"name": "search",
"in": "query",
"description": "Kata kunci untuk mencari kode, nama, atau email tenant.",
"schema": {
"type": [
"string",
"null"
],
"maxLength": 255
}
},
{
"name": "status",
"in": "query",
"description": "Filter status tenant.",
"schema": {
"type": [
"string",
"null"
],
"enum": [
"active",
"inactive"
]
}
},
{
"name": "page",
"in": "query",
"description": "Nomor halaman yang ingin diambil.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1
}
},
{
"name": "per_page",
"in": "query",
"description": "Jumlah data per halaman, maksimal 100.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Data Tenant berhasil diambil"
},
"data": {
"type": "object",
"properties": {
"current_page": {
"type": "integer",
"minimum": 1
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Tenant"
}
},
"first_page_url": {
"type": [
"string",
"null"
]
},
"from": {
"type": [
"integer",
"null"
],
"minimum": 1
},
"last_page_url": {
"type": [
"string",
"null"
]
},
"last_page": {
"type": "integer",
"minimum": 1
},
"links": {
"type": "array",
"description": "Generated paginator links.",
"items": {
"type": "object",
"properties": {
"url": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
},
"active": {
"type": "boolean"
}
},
"required": [
"url",
"label",
"active"
]
}
},
"next_page_url": {
"type": [
"string",
"null"
]
},
"path": {
"type": [
"string",
"null"
],
"description": "Base path for paginator generated URLs."
},
"per_page": {
"type": "integer",
"description": "Number of items shown per page.",
"minimum": 0
},
"prev_page_url": {
"type": [
"string",
"null"
]
},
"to": {
"type": [
"integer",
"null"
],
"description": "Number of the last item in the slice.",
"minimum": 1
},
"total": {
"type": "integer",
"description": "Total number of items being paginated.",
"minimum": 0
}
},
"required": [
"current_page",
"data",
"first_page_url",
"from",
"last_page_url",
"last_page",
"links",
"next_page_url",
"path",
"per_page",
"prev_page_url",
"to",
"total"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"post": {
"operationId": "tenants.store",
"tags": [
"Tenant"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StoreTenantRequest"
}
}
}
},
"responses": {
"201": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 201
},
"message": {
"type": "string",
"const": "Tenant berhasil dibuat"
},
"data": {
"$ref": "#/components/schemas/TenantResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tenants/{tenant}": {
"get": {
"operationId": "tenants.show",
"tags": [
"Tenant"
],
"parameters": [
{
"name": "tenant",
"in": "path",
"required": true,
"description": "The tenant ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Detail Tenant berhasil diambil"
},
"data": {
"$ref": "#/components/schemas/TenantResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
},
"put": {
"operationId": "tenants.update",
"tags": [
"Tenant"
],
"parameters": [
{
"name": "tenant",
"in": "path",
"required": true,
"description": "The tenant ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateTenantRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Tenant berhasil diupdate"
},
"data": {
"$ref": "#/components/schemas/TenantResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"delete": {
"operationId": "tenants.destroy",
"tags": [
"Tenant"
],
"parameters": [
{
"name": "tenant",
"in": "path",
"required": true,
"description": "The tenant ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Tenant berhasil dihapus"
}
},
"required": [
"success",
"code",
"message"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/tickets": {
"get": {
"operationId": "tickets.index",
"tags": [
"Ticket"
],
"parameters": [
{
"name": "search",
"in": "query",
"description": "Kata kunci untuk mencari nomor, judul, atau deskripsi ticket.",
"schema": {
"type": [
"string",
"null"
],
"maxLength": 255
}
},
{
"name": "status",
"in": "query",
"description": "Filter berdasarkan status ticket.",
"schema": {
"type": [
"string",
"null"
],
"enum": [
"draft",
"open",
"approved",
"assigned",
"progress",
"pending",
"resolved",
"closed",
"cancelled",
"rejected"
]
}
},
{
"name": "priority",
"in": "query",
"description": "Filter berdasarkan prioritas ticket.",
"schema": {
"type": [
"string",
"null"
],
"enum": [
"low",
"medium",
"high",
"critical"
]
}
},
{
"name": "ticket_type_id",
"in": "query",
"description": "Filter berdasarkan ID tipe ticket.",
"schema": {
"type": [
"integer",
"null"
]
}
},
{
"name": "customer_id",
"in": "query",
"description": "Filter berdasarkan ID customer.",
"schema": {
"type": [
"integer",
"null"
]
}
},
{
"name": "page",
"in": "query",
"description": "Nomor halaman yang ingin diambil.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1
}
},
{
"name": "per_page",
"in": "query",
"description": "Jumlah data per halaman, maksimal 100.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Data Ticket berhasil diambil"
},
"data": {
"type": "object",
"properties": {
"current_page": {
"type": "integer",
"minimum": 1
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Ticket"
}
},
"first_page_url": {
"type": [
"string",
"null"
]
},
"from": {
"type": [
"integer",
"null"
],
"minimum": 1
},
"last_page_url": {
"type": [
"string",
"null"
]
},
"last_page": {
"type": "integer",
"minimum": 1
},
"links": {
"type": "array",
"description": "Generated paginator links.",
"items": {
"type": "object",
"properties": {
"url": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
},
"active": {
"type": "boolean"
}
},
"required": [
"url",
"label",
"active"
]
}
},
"next_page_url": {
"type": [
"string",
"null"
]
},
"path": {
"type": [
"string",
"null"
],
"description": "Base path for paginator generated URLs."
},
"per_page": {
"type": "integer",
"description": "Number of items shown per page.",
"minimum": 0
},
"prev_page_url": {
"type": [
"string",
"null"
]
},
"to": {
"type": [
"integer",
"null"
],
"description": "Number of the last item in the slice.",
"minimum": 1
},
"total": {
"type": "integer",
"description": "Total number of items being paginated.",
"minimum": 0
}
},
"required": [
"current_page",
"data",
"first_page_url",
"from",
"last_page_url",
"last_page",
"links",
"next_page_url",
"path",
"per_page",
"prev_page_url",
"to",
"total"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"post": {
"operationId": "tickets.store",
"tags": [
"Ticket"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StoreTicketRequest"
}
}
}
},
"responses": {
"201": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 201
},
"message": {
"type": "string",
"const": "Ticket berhasil dibuat"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tickets/{ticket}": {
"get": {
"operationId": "tickets.show",
"tags": [
"Ticket"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Success"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
},
"put": {
"operationId": "tickets.update",
"tags": [
"Ticket"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateTicketRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket berhasil diperbarui"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"delete": {
"operationId": "tickets.destroy",
"tags": [
"Ticket"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket berhasil dibatalkan"
}
},
"required": [
"success",
"code",
"message"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/ticket-incident-types": {
"get": {
"operationId": "ticket-incident-types.index",
"tags": [
"TicketIncidentType"
],
"parameters": [
{
"name": "search",
"in": "query",
"description": "Kata kunci untuk mencari nama incident type.",
"schema": {
"type": [
"string",
"null"
],
"maxLength": 255
}
},
{
"name": "is_active",
"in": "query",
"description": "Filter status aktif incident type.",
"schema": {
"type": [
"boolean",
"null"
]
}
},
{
"name": "page",
"in": "query",
"description": "Nomor halaman yang ingin diambil.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1
}
},
{
"name": "per_page",
"in": "query",
"description": "Jumlah data per halaman, maksimal 100.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Data Incident Type berhasil diambil"
},
"data": {
"type": "object",
"properties": {
"current_page": {
"type": "integer",
"minimum": 1
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TicketIncidentType"
}
},
"first_page_url": {
"type": [
"string",
"null"
]
},
"from": {
"type": [
"integer",
"null"
],
"minimum": 1
},
"last_page_url": {
"type": [
"string",
"null"
]
},
"last_page": {
"type": "integer",
"minimum": 1
},
"links": {
"type": "array",
"description": "Generated paginator links.",
"items": {
"type": "object",
"properties": {
"url": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
},
"active": {
"type": "boolean"
}
},
"required": [
"url",
"label",
"active"
]
}
},
"next_page_url": {
"type": [
"string",
"null"
]
},
"path": {
"type": [
"string",
"null"
],
"description": "Base path for paginator generated URLs."
},
"per_page": {
"type": "integer",
"description": "Number of items shown per page.",
"minimum": 0
},
"prev_page_url": {
"type": [
"string",
"null"
]
},
"to": {
"type": [
"integer",
"null"
],
"description": "Number of the last item in the slice.",
"minimum": 1
},
"total": {
"type": "integer",
"description": "Total number of items being paginated.",
"minimum": 0
}
},
"required": [
"current_page",
"data",
"first_page_url",
"from",
"last_page_url",
"last_page",
"links",
"next_page_url",
"path",
"per_page",
"prev_page_url",
"to",
"total"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"post": {
"operationId": "ticket-incident-types.store",
"tags": [
"TicketIncidentType"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StoreTicketIncidentTypeRequest"
}
}
}
},
"responses": {
"201": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 201
},
"message": {
"type": "string",
"const": "Incident Type berhasil dibuat"
},
"data": {
"$ref": "#/components/schemas/TicketIncidentTypeResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/ticket-incident-types/{ticketIncidentType}": {
"get": {
"operationId": "ticket-incident-types.show",
"tags": [
"TicketIncidentType"
],
"parameters": [
{
"name": "ticketIncidentType",
"in": "path",
"required": true,
"description": "The ticket incident type ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Success"
},
"data": {
"$ref": "#/components/schemas/TicketIncidentTypeResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
},
"put": {
"operationId": "ticket-incident-types.update",
"tags": [
"TicketIncidentType"
],
"parameters": [
{
"name": "ticketIncidentType",
"in": "path",
"required": true,
"description": "The ticket incident type ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateTicketIncidentTypeRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Incident Type berhasil diupdate"
},
"data": {
"$ref": "#/components/schemas/TicketIncidentTypeResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"delete": {
"operationId": "ticket-incident-types.destroy",
"tags": [
"TicketIncidentType"
],
"parameters": [
{
"name": "ticketIncidentType",
"in": "path",
"required": true,
"description": "The ticket incident type ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Incident Type berhasil dihapus"
}
},
"required": [
"success",
"code",
"message"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/ticket-types": {
"get": {
"operationId": "ticket-types.index",
"tags": [
"TicketType"
],
"parameters": [
{
"name": "search",
"in": "query",
"description": "Kata kunci untuk mencari kode atau nama tipe ticket.",
"schema": {
"type": [
"string",
"null"
],
"maxLength": 255
}
},
{
"name": "page",
"in": "query",
"description": "Nomor halaman yang ingin diambil.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1
}
},
{
"name": "per_page",
"in": "query",
"description": "Jumlah data per halaman, maksimal 100.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Data Ticket Type berhasil diambil"
},
"data": {
"type": "object",
"properties": {
"current_page": {
"type": "integer",
"minimum": 1
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TicketType"
}
},
"first_page_url": {
"type": [
"string",
"null"
]
},
"from": {
"type": [
"integer",
"null"
],
"minimum": 1
},
"last_page_url": {
"type": [
"string",
"null"
]
},
"last_page": {
"type": "integer",
"minimum": 1
},
"links": {
"type": "array",
"description": "Generated paginator links.",
"items": {
"type": "object",
"properties": {
"url": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
},
"active": {
"type": "boolean"
}
},
"required": [
"url",
"label",
"active"
]
}
},
"next_page_url": {
"type": [
"string",
"null"
]
},
"path": {
"type": [
"string",
"null"
],
"description": "Base path for paginator generated URLs."
},
"per_page": {
"type": "integer",
"description": "Number of items shown per page.",
"minimum": 0
},
"prev_page_url": {
"type": [
"string",
"null"
]
},
"to": {
"type": [
"integer",
"null"
],
"description": "Number of the last item in the slice.",
"minimum": 1
},
"total": {
"type": "integer",
"description": "Total number of items being paginated.",
"minimum": 0
}
},
"required": [
"current_page",
"data",
"first_page_url",
"from",
"last_page_url",
"last_page",
"links",
"next_page_url",
"path",
"per_page",
"prev_page_url",
"to",
"total"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"post": {
"operationId": "ticket-types.store",
"tags": [
"TicketType"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StoreTicketTypeRequest"
}
}
}
},
"responses": {
"201": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 201
},
"message": {
"type": "string",
"const": "Ticket Type berhasil dibuat"
},
"data": {
"$ref": "#/components/schemas/TicketTypeResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/ticket-types/{ticket_type}": {
"get": {
"operationId": "ticket-types.show",
"tags": [
"TicketType"
],
"parameters": [
{
"name": "ticket_type",
"in": "path",
"required": true,
"description": "The ticket type ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Detail Ticket Type berhasil diambil"
},
"data": {
"$ref": "#/components/schemas/TicketTypeResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
},
"put": {
"operationId": "ticket-types.update",
"tags": [
"TicketType"
],
"parameters": [
{
"name": "ticket_type",
"in": "path",
"required": true,
"description": "The ticket type ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateTicketTypeRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket Type berhasil diupdate"
},
"data": {
"$ref": "#/components/schemas/TicketTypeResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"delete": {
"operationId": "ticket-types.destroy",
"tags": [
"TicketType"
],
"parameters": [
{
"name": "ticket_type",
"in": "path",
"required": true,
"description": "The ticket type ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket Type berhasil dihapus"
}
},
"required": [
"success",
"code",
"message"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/tickets/{ticket}/workflow": {
"get": {
"operationId": "ticketWorkflow.history",
"summary": "History Workflow",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Workflow berhasil diambil"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TicketLog"
}
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/tickets/{ticket}/assign": {
"post": {
"operationId": "ticketWorkflow.assign",
"summary": "Assign Teknisi",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssignTicketRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Teknisi berhasil ditugaskan"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tickets/{ticket}/reassign": {
"post": {
"operationId": "ticketWorkflow.reassign",
"summary": "Reassign Teknisi",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ReassignTicketRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Penugasan berhasil diperbarui"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tickets/{ticket}/approve": {
"post": {
"operationId": "ticketWorkflow.approve",
"summary": "Approve",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApproveTicketRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket berhasil disetujui"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tickets/{ticket}/reject": {
"post": {
"operationId": "ticketWorkflow.reject",
"summary": "Reject",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RejectTicketRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket berhasil ditolak"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tickets/{ticket}/start": {
"post": {
"operationId": "ticketWorkflow.start",
"summary": "Start Work",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StartTicketRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Pekerjaan dimulai"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tickets/{ticket}/pending": {
"post": {
"operationId": "ticketWorkflow.pending",
"summary": "Pending",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PendingTicketRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket pending"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tickets/{ticket}/resume": {
"post": {
"operationId": "ticketWorkflow.resume",
"summary": "Resume",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket dilanjutkan"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
},
"/tickets/{ticket}/resolve": {
"post": {
"operationId": "ticketWorkflow.resolve",
"summary": "Resolve",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ResolveTicketRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket berhasil diselesaikan"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tickets/{ticket}/close": {
"post": {
"operationId": "ticketWorkflow.close",
"summary": "Close",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CloseTicketRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket berhasil ditutup"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tickets/{ticket}/cancel": {
"post": {
"operationId": "ticketWorkflow.cancel",
"summary": "Cancel",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CancelTicketRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket berhasil dibatalkan"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/tickets/{ticket}/escalate": {
"post": {
"operationId": "ticketWorkflow.escalate",
"summary": "Escalate",
"tags": [
"TicketWorkflow"
],
"parameters": [
{
"name": "ticket",
"in": "path",
"required": true,
"description": "The ticket ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EscalateTicketRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Ticket berhasil dieskalasi"
},
"data": {
"$ref": "#/components/schemas/TicketResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/users": {
"get": {
"operationId": "users.index",
"tags": [
"User"
],
"parameters": [
{
"name": "search",
"in": "query",
"description": "Kata kunci untuk mencari nama, username, email, atau nomor WhatsApp.",
"schema": {
"type": [
"string",
"null"
],
"maxLength": 255
}
},
{
"name": "status",
"in": "query",
"description": "Filter status akun user.",
"schema": {
"type": [
"string",
"null"
],
"enum": [
"active",
"inactive",
"suspended"
]
}
},
{
"name": "access_level",
"in": "query",
"description": "Filter level akses user.",
"schema": {
"$ref": "#/components/schemas/UserAccessLevel"
}
},
{
"name": "page",
"in": "query",
"description": "Nomor halaman yang ingin diambil.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1
}
},
{
"name": "per_page",
"in": "query",
"description": "Jumlah data per halaman, maksimal 100.",
"schema": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Data User berhasil diambil"
},
"data": {
"type": "object",
"properties": {
"current_page": {
"type": "integer",
"minimum": 1
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/User"
}
},
"first_page_url": {
"type": [
"string",
"null"
]
},
"from": {
"type": [
"integer",
"null"
],
"minimum": 1
},
"last_page_url": {
"type": [
"string",
"null"
]
},
"last_page": {
"type": "integer",
"minimum": 1
},
"links": {
"type": "array",
"description": "Generated paginator links.",
"items": {
"type": "object",
"properties": {
"url": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
},
"active": {
"type": "boolean"
}
},
"required": [
"url",
"label",
"active"
]
}
},
"next_page_url": {
"type": [
"string",
"null"
]
},
"path": {
"type": [
"string",
"null"
],
"description": "Base path for paginator generated URLs."
},
"per_page": {
"type": "integer",
"description": "Number of items shown per page.",
"minimum": 0
},
"prev_page_url": {
"type": [
"string",
"null"
]
},
"to": {
"type": [
"integer",
"null"
],
"description": "Number of the last item in the slice.",
"minimum": 1
},
"total": {
"type": "integer",
"description": "Total number of items being paginated.",
"minimum": 0
}
},
"required": [
"current_page",
"data",
"first_page_url",
"from",
"last_page_url",
"last_page",
"links",
"next_page_url",
"path",
"per_page",
"prev_page_url",
"to",
"total"
]
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"post": {
"operationId": "users.store",
"tags": [
"User"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StoreUserRequest"
}
}
}
},
"responses": {
"201": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 201
},
"message": {
"type": "string",
"const": "User berhasil dibuat"
},
"data": {
"$ref": "#/components/schemas/UserResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/users/{user}": {
"get": {
"operationId": "users.show",
"tags": [
"User"
],
"parameters": [
{
"name": "user",
"in": "path",
"required": true,
"description": "The user ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "Detail User berhasil diambil"
},
"data": {
"$ref": "#/components/schemas/UserResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"403": {
"description": "An error",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Error overview.",
"example": ""
}
},
"required": [
"message"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
},
"put": {
"operationId": "users.update",
"tags": [
"User"
],
"parameters": [
{
"name": "user",
"in": "path",
"required": true,
"description": "The user ID",
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateUserRequest"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "User berhasil diupdate"
},
"data": {
"$ref": "#/components/schemas/UserResource"
}
},
"required": [
"success",
"code",
"message",
"data"
]
}
}
}
},
"403": {
"description": "An error",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Error overview.",
"example": ""
}
},
"required": [
"message"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"delete": {
"operationId": "users.destroy",
"tags": [
"User"
],
"parameters": [
{
"name": "user",
"in": "path",
"required": true,
"description": "The user ID",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer",
"const": 200
},
"message": {
"type": "string",
"const": "User berhasil dihapus"
}
},
"required": [
"success",
"code",
"message"
]
}
}
}
},
"403": {
"description": "An error",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Error overview.",
"example": ""
}
},
"required": [
"message"
]
}
}
}
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"401": {
"$ref": "#/components/responses/AuthenticationException"
}
}
}
}
},
"components": {
"securitySchemes": {
"http": {
"type": "http",
"scheme": "bearer"
}
},
"schemas": {
"ApproveTicketRequest": {
"type": "object",
"properties": {
"notes": {
"type": [
"string",
"null"
],
"maxLength": 1000
}
},
"title": "ApproveTicketRequest"
},
"AssignMaterialRequest": {
"type": "object",
"properties": {
"user_id": {
"type": "integer"
},
"barcode_id": {
"type": "string"
},
"material_name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"serialized",
"consumable"
]
},
"serial_number": {
"type": [
"string",
"null"
]
},
"qty": {
"type": [
"number",
"null"
]
},
"unit": {
"type": [
"string",
"null"
]
}
},
"required": [
"user_id",
"barcode_id",
"material_name",
"type"
],
"title": "AssignMaterialRequest"
},
"AssignTicketRequest": {
"type": "object",
"properties": {
"technicians": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1
},
"leader_id": {
"type": "integer"
}
},
"required": [
"technicians",
"leader_id"
],
"title": "AssignTicketRequest"
},
"AuditLogResource": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"user_id": {
"type": [
"integer",
"null"
]
},
"tenant_id": {
"type": [
"integer",
"null"
]
},
"module": {
"type": "string"
},
"action": {
"type": "string"
},
"table_name": {
"type": [
"string",
"null"
]
},
"record_id": {
"type": [
"integer",
"null"
]
},
"old_values": {
"type": [
"array",
"null"
],
"items": {}
},
"new_values": {
"type": [
"array",
"null"
],
"items": {}
},
"description": {
"type": [
"string",
"null"
]
},
"ip_address": {
"type": [
"string",
"null"
]
},
"created_at": {
"type": "string",
"format": "date-time"
}
},
"required": [
"id",
"user_id",
"tenant_id",
"module",
"action",
"table_name",
"record_id",
"old_values",
"new_values",
"description",
"ip_address",
"created_at"
],
"title": "AuditLogResource"
},
"CancelTicketRequest": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"maxLength": 2000
}
},
"required": [
"reason"
],
"title": "CancelTicketRequest"
},
"CloseTicketRequest": {
"type": "object",
"properties": {
"notes": {
"type": [
"string",
"null"
],
"maxLength": 2000
}
},
"title": "CloseTicketRequest"
},
"EscalateTicketRequest": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"maxLength": 2000
},
"level": {
"type": [
"string",
"null"
],
"enum": [
"L1",
"L2",
"L3",
"NOC"
]
}
},
"required": [
"reason"
],
"title": "EscalateTicketRequest"
},
"MaterialResource": {
"type": "object",
"properties": {
"barcode_id": {
"type": "string",
"description": "universal"
},
"material_name": {
"type": "string"
},
"user_id": {
"type": "string"
},
"type": {
"type": "string",
"description": "detect type model",
"enum": [
"serialized",
"consumable"
]
},
"serial_number": {
"type": "string",
"description": "serialized only"
},
"qty": {
"type": "object",
"description": "consumable only",
"properties": {
"received": {
"type": [
"string",
"null"
]
},
"used": {
"type": [
"string",
"null"
]
},
"remaining": {
"type": [
"string",
"null"
]
},
"unit": {
"type": [
"string",
"null"
]
}
},
"required": [
"received",
"used",
"remaining",
"unit"
]
},
"status": {
"type": [
"string",
"null"
],
"description": "status (beda logic tapi tetap dipakai keduanya)"
},
"assigned_at": {
"type": [
"string",
"null"
],
"description": "optional tracking info"
}
},
"required": [
"barcode_id",
"material_name",
"user_id",
"type",
"status",
"assigned_at"
],
"title": "MaterialResource"
},
"MenuGroup": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"is_active": {
"type": "boolean"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"tenant_id": {
"type": [
"integer",
"null"
]
},
"is_system": {
"type": "boolean"
}
},
"required": [
"id",
"name",
"description",
"is_active",
"created_at",
"updated_at",
"tenant_id",
"is_system"
],
"title": "MenuGroup"
},
"MenuGroupResource": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"tenant_id": {
"type": [
"integer",
"null"
]
},
"name": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"is_system": {
"type": "boolean"
},
"is_active": {
"type": "boolean"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"id",
"tenant_id",
"name",
"description",
"is_system",
"is_active",
"created_at",
"updated_at"
],
"title": "MenuGroupResource"
},
"MenuList": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"parent_id": {
"type": [
"integer",
"null"
]
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"url": {
"type": [
"string",
"null"
]
},
"icon": {
"type": [
"string",
"null"
]
},
"component": {
"type": [
"string",
"null"
]
},
"sort_order": {
"type": "integer"
},
"is_active": {
"type": "boolean"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"id",
"parent_id",
"name",
"slug",
"url",
"icon",
"component",
"sort_order",
"is_active",
"created_at",
"updated_at"
],
"title": "MenuList"
},
"MenuListResource": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"parent_id": {
"type": [
"integer",
"null"
]
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"url": {
"type": [
"string",
"null"
]
},
"icon": {
"type": [
"string",
"null"
]
},
"component": {
"type": [
"string",
"null"
]
},
"sort_order": {
"type": "integer"
},
"is_active": {
"type": "boolean"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"id",
"parent_id",
"name",
"slug",
"url",
"icon",
"component",
"sort_order",
"is_active",
"created_at",
"updated_at"
],
"title": "MenuListResource"
},
"PendingTicketRequest": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"maxLength": 1000
}
},
"required": [
"reason"
],
"title": "PendingTicketRequest"
},
"ReassignTicketRequest": {
"type": "object",
"properties": {
"leader_id": {
"type": "integer"
},
"technicians": {
"type": "array",
"items": {
"type": "integer"
},
"minItems": 1
}
},
"required": [
"leader_id",
"technicians"
],
"title": "ReassignTicketRequest"
},
"RegisterRequest": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 100
},
"username": {
"type": [
"string",
"null"
],
"maxLength": 50
},
"email": {
"type": "string",
"format": "email",
"maxLength": 100
},
"whatsapp_number": {
"type": "string",
"maxLength": 20
},
"password": {
"type": "string",
"minLength": 8,
"maxLength": 100
},
"verification_channel": {
"type": "string",
"enum": [
"email",
"whatsapp"
]
},
"verification_target": {
"type": "string",
"maxLength": 100
}
},
"required": [
"name",
"email",
"whatsapp_number",
"password",
"verification_channel",
"verification_target"
],
"title": "RegisterRequest"
},
"RejectTicketRequest": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"maxLength": 1000
}
},
"required": [
"reason"
],
"title": "RejectTicketRequest"
},
"ResendVerificationCodeRequest": {
"type": "object",
"properties": {
"verification_channel": {
"type": "string",
"enum": [
"email",
"whatsapp"
]
},
"verification_target": {
"type": "string",
"maxLength": 100
}
},
"required": [
"verification_channel",
"verification_target"
],
"title": "ResendVerificationCodeRequest"
},
"ResolveTicketRequest": {
"type": "object",
"properties": {
"notes": {
"type": "string",
"maxLength": 2000
}
},
"required": [
"notes"
],
"title": "ResolveTicketRequest"
},
"ReturnMaterialRequest": {
"type": "object",
"properties": {
"barcode_id": {
"type": "string"
},
"user_id": {
"type": "integer"
}
},
"required": [
"barcode_id",
"user_id"
],
"title": "ReturnMaterialRequest"
},
"StartTicketRequest": {
"type": "object",
"properties": {
"latitude": {
"type": [
"number",
"null"
]
},
"longitude": {
"type": [
"number",
"null"
]
},
"notes": {
"type": [
"string",
"null"
],
"maxLength": 1000
}
},
"title": "StartTicketRequest"
},
"StoreMenuGroupRequest": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 100
},
"description": {
"type": [
"string",
"null"
]
},
"is_active": {
"type": [
"boolean",
"null"
]
}
},
"required": [
"name"
],
"title": "StoreMenuGroupRequest"
},
"StoreMenuListRequest": {
"type": "object",
"properties": {
"parent_id": {
"type": [
"integer",
"null"
]
},
"name": {
"type": "string",
"maxLength": 255
},
"slug": {
"type": "string",
"maxLength": 255
},
"url": {
"type": [
"string",
"null"
],
"maxLength": 255
},
"icon": {
"type": [
"string",
"null"
],
"maxLength": 255
},
"component": {
"type": [
"string",
"null"
],
"maxLength": 255
},
"sort_order": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"is_active": {
"type": [
"boolean",
"null"
]
}
},
"required": [
"name",
"slug"
],
"title": "StoreMenuListRequest"
},
"StoreTenantRequest": {
"type": "object",
"properties": {
"tenant_code": {
"type": "string",
"maxLength": 100
},
"tenant_name": {
"type": "string",
"maxLength": 255
},
"phone": {
"type": [
"string",
"null"
],
"maxLength": 50
},
"email": {
"type": [
"string",
"null"
],
"format": "email",
"maxLength": 255
},
"address": {
"type": [
"string",
"null"
]
},
"status": {
"type": [
"string",
"null"
],
"enum": [
"active",
"inactive"
]
}
},
"required": [
"tenant_code",
"tenant_name"
],
"title": "StoreTenantRequest"
},
"StoreTicketIncidentTypeRequest": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 255
},
"is_active": {
"type": "boolean"
}
},
"required": [
"name"
],
"title": "StoreTicketIncidentTypeRequest"
},
"StoreTicketRequest": {
"type": "object",
"properties": {
"ticket_type_id": {
"type": "integer"
},
"customer_id": {
"type": [
"integer",
"null"
]
},
"title": {
"type": "string",
"maxLength": 255
},
"description": {
"type": [
"string",
"null"
]
},
"priority": {
"type": "string",
"enum": [
"low",
"medium",
"high",
"critical"
]
}
},
"required": [
"ticket_type_id",
"title",
"priority"
],
"title": "StoreTicketRequest"
},
"StoreTicketTypeRequest": {
"type": "object",
"properties": {
"code": {
"type": "string",
"maxLength": 50
},
"name": {
"type": "string",
"maxLength": 100
},
"need_approval": {
"type": [
"boolean",
"null"
]
},
"sla_minutes": {
"type": [
"integer",
"null"
],
"minimum": 1
},
"require_photo": {
"type": [
"boolean",
"null"
]
},
"require_material": {
"type": [
"boolean",
"null"
]
},
"need_customer": {
"type": [
"boolean",
"null"
]
},
"need_incident_type": {
"type": [
"boolean",
"null"
]
}
},
"required": [
"code",
"name"
],
"title": "StoreTicketTypeRequest"
},
"StoreUserRequest": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 255
},
"username": {
"type": [
"string",
"null"
],
"maxLength": 255
},
"email": {
"type": "string",
"format": "email",
"maxLength": 255
},
"whatsapp_number": {
"type": [
"string",
"null"
],
"maxLength": 20
},
"password": {
"type": "string",
"minLength": 8
},
"is_master": {
"type": [
"boolean",
"null"
]
},
"access_level": {
"$ref": "#/components/schemas/UserAccessLevel"
},
"status": {
"type": "string",
"enum": [
"active",
"inactive",
"suspended"
]
},
"user_profile": {
"type": "object",
"properties": {
"nik": {
"type": [
"string",
"null"
],
"maxLength": 30
},
"address": {
"type": [
"string",
"null"
]
},
"provinsi_id": {
"type": [
"integer",
"null"
]
},
"kabupaten_id": {
"type": [
"integer",
"null"
]
},
"kecamatan_id": {
"type": [
"integer",
"null"
]
},
"desa_id": {
"type": [
"integer",
"null"
]
}
}
},
"user_tenants": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"tenant_id": {
"type": "integer"
},
"is_default": {
"type": [
"boolean",
"null"
]
}
}
}
},
"user_menu_groups": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"menu_group_id": {
"type": "integer"
},
"tenant_id": {
"type": [
"integer",
"null"
]
}
}
}
}
},
"required": [
"name",
"email",
"password",
"status"
],
"title": "StoreUserRequest"
},
"SyncMenuGroupMenusRequest": {
"type": "object",
"properties": {
"menus": {
"type": "array",
"items": {
"type": "object",
"properties": {
"menu_id": {
"type": "integer"
},
"can_view": {
"type": [
"boolean",
"null"
]
},
"can_create": {
"type": [
"boolean",
"null"
]
},
"can_update": {
"type": [
"boolean",
"null"
]
},
"can_delete": {
"type": [
"boolean",
"null"
]
},
"can_approve": {
"type": [
"boolean",
"null"
]
},
"can_export": {
"type": [
"boolean",
"null"
]
}
},
"required": [
"menu_id"
]
},
"minItems": 1
}
},
"required": [
"menus"
],
"title": "SyncMenuGroupMenusRequest"
},
"SyncUserMenuGroupsRequest": {
"type": "object",
"properties": {
"assignments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"menu_group_id": {
"type": "integer"
},
"tenant_id": {
"type": [
"integer",
"null"
]
}
},
"required": [
"menu_group_id"
]
},
"minItems": 1
}
},
"required": [
"assignments"
],
"title": "SyncUserMenuGroupsRequest"
},
"Tenant": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"tenant_code": {
"type": "string"
},
"tenant_name": {
"type": "string"
},
"phone": {
"type": [
"string",
"null"
]
},
"email": {
"type": [
"string",
"null"
]
},
"address": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"id",
"tenant_code",
"tenant_name",
"phone",
"email",
"address",
"status",
"created_at",
"updated_at"
],
"title": "Tenant"
},
"TenantResource": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"tenant_code": {
"type": "string"
},
"tenant_name": {
"type": "string"
},
"phone": {
"type": [
"string",
"null"
]
},
"email": {
"type": [
"string",
"null"
]
},
"address": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"id",
"tenant_code",
"tenant_name",
"phone",
"email",
"address",
"status",
"created_at",
"updated_at"
],
"title": "TenantResource"
},
"Ticket": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"ticket_no": {
"type": "string"
},
"ticket_type_id": {
"type": "integer"
},
"tenant_id": {
"type": "integer"
},
"customer_id": {
"type": [
"integer",
"null"
]
},
"title": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"priority": {
"type": "string"
},
"status": {
"type": "string"
},
"sla_minutes": {
"type": [
"integer",
"null"
]
},
"created_by": {
"type": "integer"
},
"approved_by": {
"type": [
"integer",
"null"
]
},
"approved_at": {
"type": [
"string",
"null"
]
},
"rejected_by": {
"type": [
"integer",
"null"
]
},
"rejected_at": {
"type": [
"string",
"null"
]
},
"rejection_reason": {
"type": [
"string",
"null"
]
},
"assigned_at": {
"type": [
"string",
"null"
]
},
"resolved_at": {
"type": [
"string",
"null"
]
},
"closed_at": {
"type": [
"string",
"null"
]
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"id",
"ticket_no",
"ticket_type_id",
"tenant_id",
"customer_id",
"title",
"description",
"priority",
"status",
"sla_minutes",
"created_by",
"approved_by",
"approved_at",
"rejected_by",
"rejected_at",
"rejection_reason",
"assigned_at",
"resolved_at",
"closed_at",
"created_at",
"updated_at"
],
"title": "Ticket"
},
"TicketIncidentType": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"is_active": {
"type": "boolean"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"deleted": {
"type": "string"
},
"deleted_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"id",
"name",
"is_active",
"created_at",
"updated_at",
"deleted",
"deleted_at"
],
"title": "TicketIncidentType"
},
"TicketIncidentTypeResource": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"is_active": {
"type": "boolean"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"id",
"name",
"is_active",
"created_at",
"updated_at"
],
"title": "TicketIncidentTypeResource"
},
"TicketLog": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"ticket_id": {
"type": "integer"
},
"user_id": {
"type": "integer"
},
"activity": {
"type": "string"
},
"notes": {
"type": [
"string",
"null"
]
},
"latitude": {
"type": [
"string",
"null"
]
},
"longitude": {
"type": [
"string",
"null"
]
},
"created_at": {
"type": [
"string",
"null"
]
}
},
"required": [
"id",
"ticket_id",
"user_id",
"activity",
"notes",
"latitude",
"longitude",
"created_at"
],
"title": "TicketLog"
},
"TicketResource": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"ticket_no": {
"type": "string"
},
"ticket_type_id": {
"type": "integer"
},
"customer_id": {
"type": [
"integer",
"null"
]
},
"title": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"priority": {
"type": "string"
},
"status": {
"type": "string"
},
"created_by": {
"type": "integer"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"id",
"ticket_no",
"ticket_type_id",
"customer_id",
"title",
"description",
"priority",
"status",
"created_by",
"created_at",
"updated_at"
],
"title": "TicketResource"
},
"TicketType": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"need_approval": {
"type": "boolean"
},
"sla_minutes": {
"type": [
"integer",
"null"
]
},
"require_photo": {
"type": "boolean"
},
"require_material": {
"type": "boolean"
},
"need_customer": {
"type": "boolean"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"need_incident_type": {
"type": "boolean"
}
},
"required": [
"id",
"code",
"name",
"need_approval",
"sla_minutes",
"require_photo",
"require_material",
"need_customer",
"created_at",
"updated_at",
"need_incident_type"
],
"title": "TicketType"
},
"TicketTypeResource": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"need_approval": {
"type": "boolean"
},
"sla_minutes": {
"type": [
"integer",
"null"
]
},
"require_photo": {
"type": "boolean"
},
"require_material": {
"type": "boolean"
},
"need_customer": {
"type": "boolean"
},
"need_incident_type": {
"type": "boolean"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"id",
"code",
"name",
"need_approval",
"sla_minutes",
"require_photo",
"require_material",
"need_customer",
"need_incident_type",
"created_at",
"updated_at"
],
"title": "TicketTypeResource"
},
"TransferMaterialRequest": {
"type": "object",
"properties": {
"barcode_id": {
"type": "string"
},
"from_user_id": {
"type": "integer"
},
"to_user_id": {
"type": "integer"
}
},
"required": [
"barcode_id",
"from_user_id",
"to_user_id"
],
"title": "TransferMaterialRequest"
},
"UpdateMenuGroupRequest": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 100
},
"description": {
"type": [
"string",
"null"
]
},
"is_active": {
"type": [
"boolean",
"null"
]
}
},
"required": [
"name"
],
"title": "UpdateMenuGroupRequest"
},
"UpdateMenuListRequest": {
"type": "object",
"properties": {
"parent_id": {
"type": [
"integer",
"null"
]
},
"name": {
"type": "string",
"maxLength": 255
},
"slug": {
"type": "string",
"maxLength": 255
},
"url": {
"type": [
"string",
"null"
],
"maxLength": 255
},
"icon": {
"type": [
"string",
"null"
],
"maxLength": 255
},
"component": {
"type": [
"string",
"null"
],
"maxLength": 255
},
"sort_order": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"is_active": {
"type": [
"boolean",
"null"
]
}
},
"required": [
"name",
"slug"
],
"title": "UpdateMenuListRequest"
},
"UpdateProfileRequest": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 255
},
"username": {
"type": [
"string",
"null"
],
"maxLength": 255
},
"email": {
"type": "string",
"format": "email",
"maxLength": 255
},
"whatsapp_number": {
"type": [
"string",
"null"
],
"maxLength": 20
},
"current_password": {
"type": [
"string",
"null"
]
},
"password": {
"type": [
"string",
"null"
],
"minLength": 8
},
"password_confirmation": {
"type": [
"string",
"null"
],
"minLength": 8
},
"user_profile": {
"type": "object",
"properties": {
"nik": {
"type": [
"string",
"null"
],
"maxLength": 30
},
"address": {
"type": [
"string",
"null"
]
},
"provinsi_id": {
"type": [
"integer",
"null"
]
},
"kabupaten_id": {
"type": [
"integer",
"null"
]
},
"kecamatan_id": {
"type": [
"integer",
"null"
]
},
"desa_id": {
"type": [
"integer",
"null"
]
}
}
}
},
"required": [
"name",
"email"
],
"title": "UpdateProfileRequest"
},
"UpdateTenantRequest": {
"type": "object",
"properties": {
"tenant_code": {
"type": "string",
"maxLength": 100
},
"tenant_name": {
"type": "string",
"maxLength": 255
},
"phone": {
"type": [
"string",
"null"
],
"maxLength": 50
},
"email": {
"type": [
"string",
"null"
],
"format": "email",
"maxLength": 255
},
"address": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"active",
"inactive"
]
}
},
"title": "UpdateTenantRequest"
},
"UpdateTicketIncidentTypeRequest": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 255
},
"is_active": {
"type": "boolean"
}
},
"required": [
"name",
"is_active"
],
"title": "UpdateTicketIncidentTypeRequest"
},
"UpdateTicketRequest": {
"type": "object",
"properties": {
"ticket_type_id": {
"type": "integer"
},
"customer_id": {
"type": [
"integer",
"null"
]
},
"title": {
"type": "string",
"maxLength": 255
},
"description": {
"type": [
"string",
"null"
]
},
"priority": {
"type": "string",
"enum": [
"low",
"medium",
"high",
"critical"
]
},
"status": {
"type": "string",
"enum": [
"draft",
"open",
"approved",
"assigned",
"progress",
"pending",
"resolved",
"closed",
"cancelled",
"rejected"
]
}
},
"title": "UpdateTicketRequest"
},
"UpdateTicketTypeRequest": {
"type": "object",
"properties": {
"code": {
"type": "string",
"maxLength": 50
},
"name": {
"type": "string",
"maxLength": 100
},
"need_approval": {
"type": [
"boolean",
"null"
]
},
"sla_minutes": {
"type": [
"integer",
"null"
],
"minimum": 1
},
"require_photo": {
"type": [
"boolean",
"null"
]
},
"require_material": {
"type": [
"boolean",
"null"
]
},
"need_customer": {
"type": [
"boolean",
"null"
]
},
"need_incident_type": {
"type": [
"boolean",
"null"
]
}
},
"required": [
"code",
"name"
],
"title": "UpdateTicketTypeRequest"
},
"UpdateUserRequest": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 255
},
"username": {
"type": [
"string",
"null"
],
"maxLength": 255
},
"email": {
"type": "string",
"format": "email",
"maxLength": 255
},
"whatsapp_number": {
"type": [
"string",
"null"
],
"maxLength": 20
},
"password": {
"type": [
"string",
"null"
],
"minLength": 8
},
"is_master": {
"type": [
"boolean",
"null"
]
},
"access_level": {
"$ref": "#/components/schemas/UserAccessLevel"
},
"status": {
"type": "string",
"enum": [
"active",
"inactive",
"suspended"
]
},
"user_profile": {
"type": "object",
"properties": {
"nik": {
"type": [
"string",
"null"
],
"maxLength": 30
},
"address": {
"type": [
"string",
"null"
]
},
"provinsi_id": {
"type": [
"integer",
"null"
]
},
"kabupaten_id": {
"type": [
"integer",
"null"
]
},
"kecamatan_id": {
"type": [
"integer",
"null"
]
},
"desa_id": {
"type": [
"integer",
"null"
]
}
}
},
"user_tenants": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"tenant_id": {
"type": "integer"
},
"is_default": {
"type": [
"boolean",
"null"
]
}
}
}
},
"user_menu_groups": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"menu_group_id": {
"type": "integer"
},
"tenant_id": {
"type": [
"integer",
"null"
]
}
}
}
}
},
"title": "UpdateUserRequest"
},
"User": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"email": {
"type": "string"
},
"email_verified_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"username": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string"
},
"last_login_at": {
"type": [
"string",
"null"
]
},
"is_master": {
"type": "boolean"
},
"verification_channel": {
"type": [
"string",
"null"
]
},
"verification_target": {
"type": [
"string",
"null"
]
},
"verification_code": {
"type": [
"string",
"null"
]
},
"verification_code_expires_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"verified_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"whatsapp_number": {
"type": [
"string",
"null"
]
},
"deleted_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"access_level": {
"$ref": "#/components/schemas/UserAccessLevel"
}
},
"required": [
"id",
"name",
"email",
"email_verified_at",
"created_at",
"updated_at",
"username",
"status",
"last_login_at",
"is_master",
"verification_channel",
"verification_target",
"verification_code",
"verification_code_expires_at",
"verified_at",
"whatsapp_number",
"deleted_at",
"access_level"
],
"title": "User"
},
"UserAccessLevel": {
"type": "string",
"enum": [
"customer",
"staff",
"tenant_owner",
"master_admin"
],
"title": "UserAccessLevel"
},
"UserResource": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"username": {
"type": [
"string",
"null"
]
},
"email": {
"type": "string"
},
"whatsapp_number": {
"type": [
"string",
"null"
]
},
"is_master": {
"type": "boolean"
},
"access_level": {
"type": "string"
},
"status": {
"type": "string"
},
"verification_channel": {
"type": [
"string",
"null"
]
},
"verification_target": {
"type": [
"string",
"null"
]
},
"verified_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"user_profile": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "integer"
},
"user_id": {
"type": "integer"
},
"nik": {
"type": [
"string",
"null"
]
},
"address": {
"type": [
"string",
"null"
]
},
"provinsi_id": {
"type": [
"integer",
"null"
]
},
"kabupaten_id": {
"type": [
"integer",
"null"
]
},
"kecamatan_id": {
"type": [
"integer",
"null"
]
},
"desa_id": {
"type": [
"integer",
"null"
]
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"required": [
"id",
"user_id",
"nik",
"address",
"provinsi_id",
"kabupaten_id",
"kecamatan_id",
"desa_id",
"created_at",
"updated_at"
]
},
"user_tenants": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"user_id": {
"type": "integer"
},
"tenant_id": {
"type": "integer"
},
"is_default": {
"type": "boolean"
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"tenant": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "integer"
},
"tenant_code": {
"type": "string"
},
"tenant_name": {
"type": "string"
}
},
"required": [
"id",
"tenant_code",
"tenant_name"
]
}
},
"required": [
"id",
"user_id",
"tenant_id",
"is_default",
"created_at",
"updated_at",
"tenant"
]
}
},
"user_menu_groups": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"user_id": {
"type": "integer"
},
"menu_group_id": {
"type": "integer"
},
"tenant_id": {
"type": [
"integer",
"null"
]
},
"created_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"updated_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"menu_group": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"menu_group_name": {
"type": [
"string",
"null"
]
}
},
"required": [
"id",
"name",
"menu_group_name"
]
},
"tenant": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "integer"
},
"tenant_code": {
"type": "string"
},
"tenant_name": {
"type": "string"
}
},
"required": [
"id",
"tenant_code",
"tenant_name"
]
}
},
"required": [
"id",
"user_id",
"menu_group_id",
"tenant_id",
"created_at",
"updated_at",
"menu_group",
"tenant"
]
}
}
},
"required": [
"id",
"name",
"username",
"email",
"whatsapp_number",
"is_master",
"access_level",
"status",
"verification_channel",
"verification_target",
"verified_at",
"created_at",
"updated_at"
],
"title": "UserResource"
},
"VerifyRegistrationRequest": {
"type": "object",
"properties": {
"verification_channel": {
"type": "string",
"enum": [
"email",
"whatsapp"
]
},
"verification_target": {
"type": "string",
"maxLength": 100
},
"verification_code": {
"type": "string"
}
},
"required": [
"verification_channel",
"verification_target",
"verification_code"
],
"title": "VerifyRegistrationRequest"
}
},
"responses": {
"ValidationException": {
"description": "Validation error",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Errors overview."
},
"errors": {
"type": "object",
"description": "A detailed description of each field that failed validation.",
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"required": [
"message",
"errors"
]
}
}
}
},
"AuthenticationException": {
"description": "Unauthenticated",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Error overview."
}
},
"required": [
"message"
]
}
}
}
},
"ModelNotFoundException": {
"description": "Not found",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Error overview."
}
},
"required": [
"message"
]
}
}
}
}
}
}
}