From 6a012b75aa88e7d58860beb43bd816330098a24e Mon Sep 17 00:00:00 2001 From: giovanni Date: Tue, 14 Apr 2026 16:52:50 +0700 Subject: [PATCH] adjust collection; adjust migration --- docs/openapi/read-api.json | 2870 ++++++++++++++++- docs/openapi/read-api.yaml | 2028 +++++++++++- docs/postman/read-api.collection.json | 157 +- internal/apikeys/service.go | 4 +- ...2821_create_integration_api_keys.down.sql} | 0 ...082821_create_integration_api_keys.up.sql} | 0 internal/readapi/readapi.go | 448 ++- 7 files changed, 5261 insertions(+), 246 deletions(-) rename internal/database/migrations/{20260414090000_create_integration_api_keys.down.sql => 20260414082821_create_integration_api_keys.down.sql} (100%) rename internal/database/migrations/{20260414090000_create_integration_api_keys.up.sql => 20260414082821_create_integration_api_keys.up.sql} (100%) diff --git a/docs/openapi/read-api.json b/docs/openapi/read-api.json index b047d432..f2f91f7d 100644 --- a/docs/openapi/read-api.json +++ b/docs/openapi/read-api.json @@ -110,7 +110,79 @@ "paths": { "/api/approvals/": { "get": { - "description": "Read access to `/api/approvals/`.", + "description": "Read access to `/api/approvals`.", + "parameters": [ + { + "description": "Approval workflow module name.", + "example": "EXPENSES", + "in": "query", + "name": "module_name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Optional approvable module id.", + "example": 1, + "in": "query", + "name": "module_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Group approval records by step number.", + "example": false, + "in": "query", + "name": "group_step_number", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "approval", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Sort direction by date.", + "example": "DESC", + "in": "query", + "name": "order_by_date", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -159,7 +231,59 @@ }, "/api/closings/": { "get": { - "description": "Read access to `/api/closings/`.", + "description": "Read access to `/api/closings`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "kandang", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Project status filter (1 or 2).", + "example": 1, + "in": "query", + "name": "project_status", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Location id filter.", + "example": 1, + "in": "query", + "name": "location_id", + "required": false, + "schema": { + "type": "integer" + } + } + ], "responses": { "200": { "content": { @@ -202,7 +326,7 @@ ], "summary": "GET api / closings", "tags": [ - "Closings" + "API" ] } }, @@ -219,6 +343,16 @@ "example": "1", "type": "string" } + }, + { + "description": "Optional kandang id filter.", + "example": 1, + "in": "query", + "name": "kandang_id", + "required": false, + "schema": { + "type": "integer" + } } ], "responses": { @@ -433,6 +567,26 @@ "type": "string" } }, + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, { "description": "Search keyword.", "example": "pakan", @@ -797,6 +951,16 @@ "example": "1", "type": "string" } + }, + { + "description": "Product category flag filter (DOC/OVK/PAKAN/PULLET).", + "example": "DOC", + "in": "query", + "name": "flag", + "required": false, + "schema": { + "type": "string" + } } ], "responses": { @@ -1152,6 +1316,16 @@ "example": "1", "type": "string" } + }, + { + "description": "Product category flag filter (DOC/OVK/PAKAN/PULLET).", + "example": "DOC", + "in": "query", + "name": "flag", + "required": false, + "schema": { + "type": "string" + } } ], "responses": { @@ -1202,13 +1376,13 @@ }, "/api/constants/": { "get": { - "description": "Read access to `/api/constants/`.", + "description": "Read access to `/api/constants`.", "responses": { "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedEnvelope" + "$ref": "#/components/schemas/SuccessEnvelope" } } }, @@ -1235,14 +1409,6 @@ "description": "Forbidden" } }, - "security": [ - { - "ApiKeyAuth": [] - }, - { - "BearerAuth": [] - } - ], "summary": "GET api / constants", "tags": [ "API" @@ -1251,7 +1417,79 @@ }, "/api/daily-checklists/": { "get": { - "description": "Read access to `/api/daily-checklists/`.", + "description": "Read access to `/api/daily-checklists`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "kebersihan", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Start date filter (YYYY-MM-DD).", + "example": "2026-01-01", + "in": "query", + "name": "date_from", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "End date filter (YYYY-MM-DD).", + "example": "2026-01-31", + "in": "query", + "name": "date_to", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Checklist status filter.", + "example": "done", + "in": "query", + "name": "status", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Kandang id filter.", + "example": 1, + "in": "query", + "name": "kandang_id", + "required": false, + "schema": { + "type": "integer" + } + } + ], "responses": { "200": { "content": { @@ -1423,6 +1661,98 @@ "/api/daily-checklists/report": { "get": { "description": "Read access to `/api/daily-checklists/report`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Month number (1-12).", + "example": 1, + "in": "query", + "name": "bulan", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Year.", + "example": 2026, + "in": "query", + "name": "tahun", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Area id filter.", + "example": 1, + "in": "query", + "name": "area_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Location id filter.", + "example": 1, + "in": "query", + "name": "location_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Kandang id filter.", + "example": 1, + "in": "query", + "name": "kandang_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Employee id filter.", + "example": 1, + "in": "query", + "name": "employee_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Phase id filter.", + "example": 1, + "in": "query", + "name": "phase_id", + "required": false, + "schema": { + "type": "integer" + } + } + ], "responses": { "200": { "content": { @@ -1472,6 +1802,48 @@ "/api/daily-checklists/summary": { "get": { "description": "Read access to `/api/daily-checklists/summary`.", + "parameters": [ + { + "description": "Start date filter (YYYY-MM-DD).", + "example": "2026-01-01", + "in": "query", + "name": "date_from", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "End date filter (YYYY-MM-DD).", + "example": "2026-01-31", + "in": "query", + "name": "date_to", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Checklist category filter.", + "example": "cleaning", + "in": "query", + "name": "category", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Kandang id filter.", + "example": 1, + "in": "query", + "name": "kandang_id", + "required": false, + "schema": { + "type": "integer" + } + } + ], "responses": { "200": { "content": { @@ -1521,6 +1893,18 @@ "/api/daily-checklists/tasks": { "get": { "description": "Read access to `/api/daily-checklists/tasks`.", + "parameters": [ + { + "description": "Daily checklist id.", + "example": 1, + "in": "query", + "name": "checklist_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], "responses": { "200": { "content": { @@ -1569,7 +1953,129 @@ }, "/api/dashboards/": { "get": { - "description": "Read access to `/api/dashboards/`.", + "description": "Read access to `/api/dashboards`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "farm", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Period start date (YYYY-MM-DD).", + "example": "2026-01-01", + "in": "query", + "name": "start_date", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Period end date (YYYY-MM-DD).", + "example": "2026-01-31", + "in": "query", + "name": "end_date", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Dashboard analysis mode.", + "example": "OVERVIEW", + "in": "query", + "name": "analysis_mode", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Required when analysis_mode is COMPARISON.", + "example": "PREVIOUS_PERIOD", + "in": "query", + "name": "comparison_type", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Metric to compare.", + "example": "egg_mass", + "in": "query", + "name": "metric", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated location ids.", + "example": "1,2", + "in": "query", + "name": "location_ids", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated flock ids.", + "example": "1,2", + "in": "query", + "name": "flock_ids", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated kandang ids.", + "example": "1,2", + "in": "query", + "name": "kandang_ids", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated dashboard sections to include.", + "example": "performance,summary", + "in": "query", + "name": "include", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -1618,7 +2124,39 @@ }, "/api/expenses/": { "get": { - "description": "Read access to `/api/expenses/`.", + "description": "Read access to `/api/expenses`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "operasional", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -1911,7 +2449,109 @@ }, "/api/finance/transactions/": { "get": { - "description": "Read access to `/api/finance/transactions/`.", + "description": "Read access to `/api/finance/transactions`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "invoice", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated bank ids.", + "example": "1,2", + "in": "query", + "name": "bank_ids", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated customer ids.", + "example": "1,2", + "in": "query", + "name": "customer_ids", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated supplier ids.", + "example": "1,2", + "in": "query", + "name": "supplier_ids", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated transaction types.", + "example": "payment,initial_balance", + "in": "query", + "name": "transaction_types", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Sort date basis.", + "example": "created_at", + "in": "query", + "name": "sort_date", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Start date (YYYY-MM-DD).", + "example": "2026-01-01", + "in": "query", + "name": "start_date", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "End date (YYYY-MM-DD).", + "example": "2026-01-31", + "in": "query", + "name": "end_date", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -2021,7 +2661,79 @@ }, "/api/inventory/adjustments/": { "get": { - "description": "Read access to `/api/inventory/adjustments/`.", + "description": "Read access to `/api/inventory/adjustments`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Product id filter.", + "example": 1, + "in": "query", + "name": "product_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Warehouse id filter.", + "example": 1, + "in": "query", + "name": "warehouse_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Transaction type filter.", + "example": "IN", + "in": "query", + "name": "transaction_type", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Transaction subtype filter.", + "example": "ADJUSTMENT", + "in": "query", + "name": "transaction_subtype", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Function code filter.", + "example": "MANUAL_ADJUSTMENT", + "in": "query", + "name": "function_code", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -2131,7 +2843,39 @@ }, "/api/inventory/product-stocks/": { "get": { - "description": "Read access to `/api/inventory/product-stocks/`.", + "description": "Read access to `/api/inventory/product-stocks`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "pakan", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -2241,7 +2985,129 @@ }, "/api/inventory/product-warehouses/": { "get": { - "description": "Read access to `/api/inventory/product-warehouses/`.", + "description": "Read access to `/api/inventory/product-warehouses`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "gudang", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Product id filter.", + "example": 1, + "in": "query", + "name": "product_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Warehouse id filter.", + "example": 1, + "in": "query", + "name": "warehouse_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Location id filter.", + "example": 1, + "in": "query", + "name": "location_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Stock flags filter.", + "example": "DOC", + "in": "query", + "name": "flags", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Kandang id filter.", + "example": 1, + "in": "query", + "name": "kandang_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Show available stock only.", + "example": true, + "in": "query", + "name": "available_only", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Transfer context filter.", + "example": "inventory_transfer", + "in": "query", + "name": "transfer_context", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Stock mode filter.", + "example": "exclude_chickin", + "in": "query", + "name": "stock_mode", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Warehouse stock type filter.", + "example": "incoming", + "in": "query", + "name": "type", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -2351,7 +3217,39 @@ }, "/api/inventory/transfers/": { "get": { - "description": "Read access to `/api/inventory/transfers/`.", + "description": "Read access to `/api/inventory/transfers`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "TRF", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -2461,7 +3359,79 @@ }, "/api/marketing/": { "get": { - "description": "Read access to `/api/marketing/`.", + "description": "Read access to `/api/marketing`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "delivery", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated product ids.", + "example": "1,2", + "in": "query", + "name": "product_ids", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Delivery status filter.", + "example": "DRAFT", + "in": "query", + "name": "status", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Customer id filter.", + "example": 1, + "in": "query", + "name": "customer_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Marketing id filter.", + "example": 1, + "in": "query", + "name": "marketing_id", + "required": false, + "schema": { + "type": "integer" + } + } + ], "responses": { "200": { "content": { @@ -2571,7 +3541,39 @@ }, "/api/master-data/areas/": { "get": { - "description": "Read access to `/api/master-data/areas/`.", + "description": "Read access to `/api/master-data/areas`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "bandung", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -2681,7 +3683,39 @@ }, "/api/master-data/banks/": { "get": { - "description": "Read access to `/api/master-data/banks/`.", + "description": "Read access to `/api/master-data/banks`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "bca", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -2791,7 +3825,39 @@ }, "/api/master-data/config-checklists/": { "get": { - "description": "Read access to `/api/master-data/config-checklists/`.", + "description": "Read access to `/api/master-data/config-checklists`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "harian", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -2901,7 +3967,49 @@ }, "/api/master-data/customers/": { "get": { - "description": "Read access to `/api/master-data/customers/`.", + "description": "Read access to `/api/master-data/customers`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "pt", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Filter customer by marketing relation.", + "example": true, + "in": "query", + "name": "has_marketing", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -3011,7 +4119,59 @@ }, "/api/master-data/employees/": { "get": { - "description": "Read access to `/api/master-data/employees/`.", + "description": "Read access to `/api/master-data/employees`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "andi", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Kandang id filter.", + "example": 1, + "in": "query", + "name": "kandang_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Active status filter.", + "example": true, + "in": "query", + "name": "is_active", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -3121,7 +4281,39 @@ }, "/api/master-data/fcrs/": { "get": { - "description": "Read access to `/api/master-data/fcrs/`.", + "description": "Read access to `/api/master-data/fcrs`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "fcr", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -3231,7 +4423,39 @@ }, "/api/master-data/flocks/": { "get": { - "description": "Read access to `/api/master-data/flocks/`.", + "description": "Read access to `/api/master-data/flocks`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "layer", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -3341,7 +4565,59 @@ }, "/api/master-data/kandang-groups/": { "get": { - "description": "Read access to `/api/master-data/kandang-groups/`.", + "description": "Read access to `/api/master-data/kandang-groups`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "blok", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Location id filter.", + "example": 1, + "in": "query", + "name": "location_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Person in charge id filter.", + "example": 1, + "in": "query", + "name": "pic_id", + "required": false, + "schema": { + "type": "integer" + } + } + ], "responses": { "200": { "content": { @@ -3451,7 +4727,59 @@ }, "/api/master-data/kandangs/": { "get": { - "description": "Read access to `/api/master-data/kandangs/`.", + "description": "Read access to `/api/master-data/kandangs`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "kandang", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Location id filter.", + "example": 1, + "in": "query", + "name": "location_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Person in charge id filter.", + "example": 1, + "in": "query", + "name": "pic_id", + "required": false, + "schema": { + "type": "integer" + } + } + ], "responses": { "200": { "content": { @@ -3561,7 +4889,59 @@ }, "/api/master-data/locations/": { "get": { - "description": "Read access to `/api/master-data/locations/`.", + "description": "Read access to `/api/master-data/locations`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "farm", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Area id filter.", + "example": 1, + "in": "query", + "name": "area_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Filter laying locations only.", + "example": false, + "in": "query", + "name": "has_laying", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -3671,7 +5051,49 @@ }, "/api/master-data/nonstocks/": { "get": { - "description": "Read access to `/api/master-data/nonstocks/`.", + "description": "Read access to `/api/master-data/nonstocks`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "vitamin", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Supplier id filter.", + "example": 1, + "in": "query", + "name": "supplier_id", + "required": false, + "schema": { + "type": "integer" + } + } + ], "responses": { "200": { "content": { @@ -3781,7 +5203,49 @@ }, "/api/master-data/phase-activities/": { "get": { - "description": "Read access to `/api/master-data/phase-activities/`.", + "description": "Read access to `/api/master-data/phase-activities`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "cek pakan", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated phase ids.", + "example": "1,2", + "in": "query", + "name": "phase_ids", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -3891,7 +5355,49 @@ }, "/api/master-data/phases/": { "get": { - "description": "Read access to `/api/master-data/phases/`.", + "description": "Read access to `/api/master-data/phases`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "starter", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Phase category filter.", + "example": "Growing", + "in": "query", + "name": "category", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -4001,7 +5507,39 @@ }, "/api/master-data/product-categories/": { "get": { - "description": "Read access to `/api/master-data/product-categories/`.", + "description": "Read access to `/api/master-data/product-categories`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "pakan", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -4111,7 +5649,49 @@ }, "/api/master-data/production-standards/": { "get": { - "description": "Read access to `/api/master-data/production-standards/`.", + "description": "Read access to `/api/master-data/production-standards`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "standar", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Project category filter.", + "example": "GROWING", + "in": "query", + "name": "project_category", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -4221,7 +5801,69 @@ }, "/api/master-data/products/": { "get": { - "description": "Read access to `/api/master-data/products/`.", + "description": "Read access to `/api/master-data/products`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "jagung", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Product category id filter.", + "example": 1, + "in": "query", + "name": "product_category_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Filter depletion products.", + "example": false, + "in": "query", + "name": "is_depletion", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Include all products regardless of status.", + "example": false, + "in": "query", + "name": "include_all", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -4331,7 +5973,59 @@ }, "/api/master-data/suppliers/": { "get": { - "description": "Read access to `/api/master-data/suppliers/`.", + "description": "Read access to `/api/master-data/suppliers`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "supplier", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Supplier type flag filter.", + "example": "ACTIVE", + "in": "query", + "name": "flag", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Supplier category filter.", + "example": "PAKAN", + "in": "query", + "name": "category", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -4441,7 +6135,39 @@ }, "/api/master-data/uoms/": { "get": { - "description": "Read access to `/api/master-data/uoms/`.", + "description": "Read access to `/api/master-data/uoms`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "kg", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -4551,7 +6277,79 @@ }, "/api/master-data/warehouses/": { "get": { - "description": "Read access to `/api/master-data/warehouses/`.", + "description": "Read access to `/api/master-data/warehouses`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "gudang", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Area id filter.", + "example": 1, + "in": "query", + "name": "area_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Location id filter.", + "example": 1, + "in": "query", + "name": "location_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Filter only active project flock warehouses.", + "example": false, + "in": "query", + "name": "active_project_flock", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Transfer context filter.", + "example": "inventory_transfer", + "in": "query", + "name": "transfer_context", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -4722,7 +6520,129 @@ }, "/api/production/project-flock-kandangs/": { "get": { - "description": "Read access to `/api/production/project-flock-kandangs/`.", + "description": "Read access to `/api/production/project-flock-kandangs`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "kandang", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Return name-with-period projection.", + "example": false, + "in": "query", + "name": "name_with_periode", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Project flock id filter.", + "example": 1, + "in": "query", + "name": "project_flock_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Kandang id filter.", + "example": 1, + "in": "query", + "name": "kandang_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Project category filter.", + "example": "Growing", + "in": "query", + "name": "category", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Area id filter.", + "example": 1, + "in": "query", + "name": "area_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Location id filter.", + "example": 1, + "in": "query", + "name": "location_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Sort field.", + "example": "created_at", + "in": "query", + "name": "sort_by", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Sort order.", + "example": "ASC", + "in": "query", + "name": "sort_order", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Approval step name filter.", + "example": "Pengajuan", + "in": "query", + "name": "step_name", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -4893,7 +6813,129 @@ }, "/api/production/project-flocks/": { "get": { - "description": "Read access to `/api/production/project-flocks/`.", + "description": "Read access to `/api/production/project-flocks`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "flock", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Sort field.", + "example": "created_at", + "in": "query", + "name": "sort_by", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Sort order.", + "example": "asc", + "in": "query", + "name": "sort_order", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Area id filter.", + "example": 1, + "in": "query", + "name": "area_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Location id filter.", + "example": 1, + "in": "query", + "name": "location_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Project period filter.", + "example": 1, + "in": "query", + "name": "period", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Project category filter.", + "example": "Growing", + "in": "query", + "name": "category", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Project status filter.", + "example": "Aktif", + "in": "query", + "name": "status", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated kandang ids.", + "example": "1,2", + "in": "query", + "name": "kandang_id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Transfer context filter.", + "example": "transfer_to_laying", + "in": "query", + "name": "transfer_context", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -4943,12 +6985,54 @@ "/api/production/project-flocks/kandangs/lookup": { "get": { "description": "Read access to `/api/production/project-flocks/kandangs/lookup`.", + "parameters": [ + { + "description": "Project flock id.", + "example": 1, + "in": "query", + "name": "project_flock_id", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Kandang id.", + "example": 1, + "in": "query", + "name": "kandang_id", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Include population value in response.", + "example": false, + "in": "query", + "name": "withpopulation", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Reference date (YYYY-MM-DD).", + "example": "2026-01-01", + "in": "query", + "name": "record_date", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedEnvelope" + "$ref": "#/components/schemas/SuccessEnvelope" } } }, @@ -5113,7 +7197,59 @@ }, "/api/production/recordings/": { "get": { - "description": "Read access to `/api/production/recordings/`.", + "description": "Read access to `/api/production/recordings`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Project flock kandang id filter.", + "example": 1, + "in": "query", + "name": "project_flock_kandang_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "record", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Export mode.", + "example": "excel", + "in": "query", + "name": "export", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -5163,12 +7299,34 @@ "/api/production/recordings/next-day": { "get": { "description": "Read access to `/api/production/recordings/next-day`.", + "parameters": [ + { + "description": "Project flock kandang id.", + "example": 1, + "in": "query", + "name": "project_flock_kandang_id", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Recording date (YYYY-MM-DD).", + "example": "2026-01-01", + "in": "query", + "name": "record_date", + "required": true, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedEnvelope" + "$ref": "#/components/schemas/SuccessEnvelope" } } }, @@ -5272,7 +7430,89 @@ }, "/api/production/transfer_layings/": { "get": { - "description": "Read access to `/api/production/transfer_layings/`.", + "description": "Read access to `/api/production/transfer_layings`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "transfer", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Start date (YYYY-MM-DD).", + "example": "2026-01-01", + "in": "query", + "name": "start_date", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "End date (YYYY-MM-DD).", + "example": "2026-01-31", + "in": "query", + "name": "end_date", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated source flock ids.", + "example": "1,2", + "in": "query", + "name": "flock_source", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated destination flock ids.", + "example": "3,4", + "in": "query", + "name": "flock_destination", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated status values.", + "example": "DRAFT,APPROVED", + "in": "query", + "name": "status", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -5504,7 +7744,79 @@ }, "/api/production/uniformities/": { "get": { - "description": "Read access to `/api/production/uniformities/`.", + "description": "Read access to `/api/production/uniformities`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Project flock kandang id filter.", + "example": 1, + "in": "query", + "name": "project_flock_kandang_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Week number filter.", + "example": 1, + "in": "query", + "name": "week", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Start date (YYYY-MM-DD).", + "example": "2026-01-01", + "in": "query", + "name": "start_date", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "End date (YYYY-MM-DD).", + "example": "2026-01-31", + "in": "query", + "name": "end_date", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Include chart payload.", + "example": false, + "in": "query", + "name": "with_chart", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -5614,7 +7926,139 @@ }, "/api/purchases/": { "get": { - "description": "Read access to `/api/purchases/`.", + "description": "Read access to `/api/purchases`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Supplier id filter.", + "example": 1, + "in": "query", + "name": "supplier_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Area id filter.", + "example": 1, + "in": "query", + "name": "area_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Location id filter.", + "example": 1, + "in": "query", + "name": "location_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Product category id filter.", + "example": "1", + "in": "query", + "name": "product_category_id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Approval status filter.", + "example": "PENDING", + "in": "query", + "name": "approval_status", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "PO date (YYYY-MM-DD).", + "example": "2026-01-01", + "in": "query", + "name": "po_date", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "PO date start (YYYY-MM-DD).", + "example": "2026-01-01", + "in": "query", + "name": "po_date_from", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "PO date end (YYYY-MM-DD).", + "example": "2026-01-31", + "in": "query", + "name": "po_date_to", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Search keyword.", + "example": "PO-", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Created date start (YYYY-MM-DD).", + "example": "2026-01-01", + "in": "query", + "name": "created_from", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Created date end (YYYY-MM-DD).", + "example": "2026-01-31", + "in": "query", + "name": "created_to", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { @@ -5775,6 +8219,16 @@ "schema": { "type": "string" } + }, + { + "description": "Date field filter.", + "example": "TRANS_DATE", + "in": "query", + "name": "filter_by", + "required": false, + "schema": { + "type": "string" + } } ], "responses": { @@ -5876,6 +8330,26 @@ "schema": { "type": "string" } + }, + { + "description": "Date field filter.", + "example": "received_date", + "in": "query", + "name": "filter_by", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Sort order.", + "example": "asc", + "in": "query", + "name": "sort_order", + "required": false, + "schema": { + "type": "string" + } } ], "responses": { @@ -5978,6 +8452,36 @@ "type": "integer" } }, + { + "description": "Kandang id filter.", + "example": 1, + "in": "query", + "name": "kandang_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Project flock kandang id filter.", + "example": 1, + "in": "query", + "name": "project_flock_kandang_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Nonstock id filter.", + "example": 1, + "in": "query", + "name": "nonstock_id", + "required": false, + "schema": { + "type": "integer" + } + }, { "description": "Location id filter.", "example": 1, @@ -6080,8 +8584,8 @@ } }, { - "description": "Daily period filter (YYYY-MM).", - "example": "2026-01", + "description": "Daily period filter (YYYY-MM-DD).", + "example": "2026-01-01", "in": "query", "name": "period", "required": false, @@ -6090,23 +8594,63 @@ } }, { - "description": "Location id filter.", - "example": 1, + "description": "Include unrecorded data.", + "example": false, + "in": "query", + "name": "show_unrecorded", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated area ids.", + "example": "1,2", + "in": "query", + "name": "area_id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated location ids.", + "example": "1,2", "in": "query", "name": "location_id", "required": false, "schema": { - "type": "integer" + "type": "string" } }, { - "description": "Kandang id filter.", - "example": 1, + "description": "Comma separated kandang ids.", + "example": "1,2", "in": "query", "name": "kandang_id", "required": false, "schema": { - "type": "integer" + "type": "string" + } + }, + { + "description": "Minimum body weight filter.", + "example": "1.2", + "in": "query", + "name": "weight_min", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Maximum body weight filter.", + "example": "1.8", + "in": "query", + "name": "weight_max", + "required": false, + "schema": { + "type": "string" } } ], @@ -6180,6 +8724,96 @@ "type": "integer" } }, + { + "description": "Search keyword.", + "example": "SO-", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Customer id filter.", + "example": 1, + "in": "query", + "name": "customer_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Product id filter.", + "example": 1, + "in": "query", + "name": "product_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Warehouse id filter.", + "example": 1, + "in": "query", + "name": "warehouse_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Sales person id filter.", + "example": 1, + "in": "query", + "name": "sales_person_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Area id filter.", + "example": 1, + "in": "query", + "name": "area_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Location id filter.", + "example": 1, + "in": "query", + "name": "location_id", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Marketing type filter.", + "example": "ayam", + "in": "query", + "name": "marketing_type", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Date field filter.", + "example": "so_date", + "in": "query", + "name": "filter_by", + "required": false, + "schema": { + "type": "string" + } + }, { "description": "Period start date (YYYY-MM-DD).", "example": "2026-01-01", @@ -6201,23 +8835,23 @@ } }, { - "description": "Customer id filter.", - "example": 1, + "description": "Sort field.", + "example": "so_date", "in": "query", - "name": "customer_id", + "name": "sort_by", "required": false, "schema": { - "type": "integer" + "type": "string" } }, { - "description": "Location id filter.", - "example": 1, + "description": "Sort order.", + "example": "asc", "in": "query", - "name": "location_id", + "name": "sort_order", "required": false, "schema": { - "type": "integer" + "type": "string" } } ], @@ -6280,6 +8914,26 @@ "example": "1", "type": "string" } + }, + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } } ], "responses": { @@ -6352,6 +9006,46 @@ "type": "integer" } }, + { + "description": "Comma separated area ids.", + "example": "1,2", + "in": "query", + "name": "area_id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated supplier ids.", + "example": "1,2", + "in": "query", + "name": "supplier_id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated product ids.", + "example": "1,2", + "in": "query", + "name": "product_id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated product category ids.", + "example": "1,2", + "in": "query", + "name": "product_category_id", + "required": false, + "schema": { + "type": "string" + } + }, { "description": "Period start date (YYYY-MM-DD).", "example": "2026-01-01", @@ -6373,20 +9067,20 @@ } }, { - "description": "Comma separated supplier ids.", - "example": "1,2", + "description": "Sort field.", + "example": "created_at", "in": "query", - "name": "supplier_id", + "name": "sort_by", "required": false, "schema": { "type": "string" } }, { - "description": "Comma separated area ids.", - "example": "1,2", + "description": "Filter field.", + "example": "received_date", "in": "query", - "name": "area_id", + "name": "filter_by", "required": false, "schema": { "type": "string" @@ -6651,7 +9345,39 @@ }, "/api/users/": { "get": { - "description": "Read access to `/api/users/`.", + "description": "Read access to `/api/users`.", + "parameters": [ + { + "description": "Page number.", + "example": 1, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Page size.", + "example": 10, + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Search keyword.", + "example": "admin", + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "content": { diff --git a/docs/openapi/read-api.yaml b/docs/openapi/read-api.yaml index 01a4e811..7e62562f 100644 --- a/docs/openapi/read-api.yaml +++ b/docs/openapi/read-api.yaml @@ -78,7 +78,57 @@ openapi: 3.1.0 paths: /api/approvals/: get: - description: Read access to `/api/approvals/`. + description: Read access to `/api/approvals`. + parameters: + - description: Approval workflow module name. + example: EXPENSES + in: query + name: module_name + required: true + schema: + type: string + - description: Optional approvable module id. + example: 1 + in: query + name: module_id + required: false + schema: + type: integer + - description: Group approval records by step number. + example: false + in: query + name: group_step_number + required: false + schema: + type: string + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: approval + in: query + name: search + required: false + schema: + type: string + - description: Sort direction by date. + example: DESC + in: query + name: order_by_date + required: false + schema: + type: string responses: "200": content: @@ -106,7 +156,43 @@ paths: - API /api/closings/: get: - description: Read access to `/api/closings/`. + description: Read access to `/api/closings`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: kandang + in: query + name: search + required: false + schema: + type: string + - description: Project status filter (1 or 2). + example: 1 + in: query + name: project_status + required: false + schema: + type: integer + - description: Location id filter. + example: 1 + in: query + name: location_id + required: false + schema: + type: integer responses: "200": content: @@ -131,7 +217,7 @@ paths: - BearerAuth: [] summary: GET api / closings tags: - - Closings + - API /api/closings/{project_flock_id}/{project_flock_kandang_id}/expedition-hpp: get: description: Read access to `/api/closings/:project_flock_id/:project_flock_kandang_id/expedition-hpp`. @@ -322,6 +408,13 @@ paths: schema: example: "1" type: string + - description: Product category flag filter (DOC/OVK/PAKAN/PULLET). + example: DOC + in: query + name: flag + required: false + schema: + type: string responses: "200": content: @@ -473,6 +566,13 @@ paths: schema: example: "1" type: string + - description: Product category flag filter (DOC/OVK/PAKAN/PULLET). + example: DOC + in: query + name: flag + required: false + schema: + type: string responses: "200": content: @@ -509,6 +609,13 @@ paths: schema: example: "1" type: string + - description: Optional kandang id filter. + example: 1 + in: query + name: kandang_id + required: false + schema: + type: integer responses: "200": content: @@ -638,6 +745,20 @@ paths: required: true schema: type: string + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer - description: Search keyword. example: pakan in: query @@ -736,13 +857,13 @@ paths: - Closings /api/constants/: get: - description: Read access to `/api/constants/`. + description: Read access to `/api/constants`. responses: "200": content: application/json: schema: - $ref: '#/components/schemas/PaginatedEnvelope' + $ref: '#/components/schemas/SuccessEnvelope' description: Successful response "401": content: @@ -756,15 +877,62 @@ paths: schema: $ref: '#/components/schemas/ErrorEnvelope' description: Forbidden - security: - - ApiKeyAuth: [] - - BearerAuth: [] summary: GET api / constants tags: - API /api/daily-checklists/: get: - description: Read access to `/api/daily-checklists/`. + description: Read access to `/api/daily-checklists`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: kebersihan + in: query + name: search + required: false + schema: + type: string + - description: Start date filter (YYYY-MM-DD). + example: "2026-01-01" + in: query + name: date_from + required: false + schema: + type: string + - description: End date filter (YYYY-MM-DD). + example: "2026-01-31" + in: query + name: date_to + required: false + schema: + type: string + - description: Checklist status filter. + example: done + in: query + name: status + required: false + schema: + type: string + - description: Kandang id filter. + example: 1 + in: query + name: kandang_id + required: false + schema: + type: integer responses: "200": content: @@ -865,6 +1033,70 @@ paths: /api/daily-checklists/report: get: description: Read access to `/api/daily-checklists/report`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: true + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: true + schema: + type: integer + - description: Month number (1-12). + example: 1 + in: query + name: bulan + required: true + schema: + type: integer + - description: Year. + example: 2026 + in: query + name: tahun + required: true + schema: + type: integer + - description: Area id filter. + example: 1 + in: query + name: area_id + required: false + schema: + type: integer + - description: Location id filter. + example: 1 + in: query + name: location_id + required: false + schema: + type: integer + - description: Kandang id filter. + example: 1 + in: query + name: kandang_id + required: false + schema: + type: integer + - description: Employee id filter. + example: 1 + in: query + name: employee_id + required: false + schema: + type: integer + - description: Phase id filter. + example: 1 + in: query + name: phase_id + required: false + schema: + type: integer responses: "200": content: @@ -893,6 +1125,35 @@ paths: /api/daily-checklists/summary: get: description: Read access to `/api/daily-checklists/summary`. + parameters: + - description: Start date filter (YYYY-MM-DD). + example: "2026-01-01" + in: query + name: date_from + required: true + schema: + type: string + - description: End date filter (YYYY-MM-DD). + example: "2026-01-31" + in: query + name: date_to + required: true + schema: + type: string + - description: Checklist category filter. + example: cleaning + in: query + name: category + required: false + schema: + type: string + - description: Kandang id filter. + example: 1 + in: query + name: kandang_id + required: false + schema: + type: integer responses: "200": content: @@ -921,6 +1182,14 @@ paths: /api/daily-checklists/tasks: get: description: Read access to `/api/daily-checklists/tasks`. + parameters: + - description: Daily checklist id. + example: 1 + in: query + name: checklist_id + required: true + schema: + type: integer responses: "200": content: @@ -948,7 +1217,92 @@ paths: - Daily Checklists /api/dashboards/: get: - description: Read access to `/api/dashboards/`. + description: Read access to `/api/dashboards`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: farm + in: query + name: search + required: false + schema: + type: string + - description: Period start date (YYYY-MM-DD). + example: "2026-01-01" + in: query + name: start_date + required: false + schema: + type: string + - description: Period end date (YYYY-MM-DD). + example: "2026-01-31" + in: query + name: end_date + required: false + schema: + type: string + - description: Dashboard analysis mode. + example: OVERVIEW + in: query + name: analysis_mode + required: false + schema: + type: string + - description: Required when analysis_mode is COMPARISON. + example: PREVIOUS_PERIOD + in: query + name: comparison_type + required: false + schema: + type: string + - description: Metric to compare. + example: egg_mass + in: query + name: metric + required: false + schema: + type: string + - description: Comma separated location ids. + example: 1,2 + in: query + name: location_ids + required: false + schema: + type: string + - description: Comma separated flock ids. + example: 1,2 + in: query + name: flock_ids + required: false + schema: + type: string + - description: Comma separated kandang ids. + example: 1,2 + in: query + name: kandang_ids + required: false + schema: + type: string + - description: Comma separated dashboard sections to include. + example: performance,summary + in: query + name: include + required: false + schema: + type: string responses: "200": content: @@ -976,7 +1330,29 @@ paths: - Dashboards /api/expenses/: get: - description: Read access to `/api/expenses/`. + description: Read access to `/api/expenses`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: operasional + in: query + name: search + required: false + schema: + type: string responses: "200": content: @@ -1148,7 +1524,78 @@ paths: - Finance /api/finance/transactions/: get: - description: Read access to `/api/finance/transactions/`. + description: Read access to `/api/finance/transactions`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: invoice + in: query + name: search + required: false + schema: + type: string + - description: Comma separated bank ids. + example: 1,2 + in: query + name: bank_ids + required: false + schema: + type: string + - description: Comma separated customer ids. + example: 1,2 + in: query + name: customer_ids + required: false + schema: + type: string + - description: Comma separated supplier ids. + example: 1,2 + in: query + name: supplier_ids + required: false + schema: + type: string + - description: Comma separated transaction types. + example: payment,initial_balance + in: query + name: transaction_types + required: false + schema: + type: string + - description: Sort date basis. + example: created_at + in: query + name: sort_date + required: false + schema: + type: string + - description: Start date (YYYY-MM-DD). + example: "2026-01-01" + in: query + name: start_date + required: false + schema: + type: string + - description: End date (YYYY-MM-DD). + example: "2026-01-31" + in: query + name: end_date + required: false + schema: + type: string responses: "200": content: @@ -1212,7 +1659,57 @@ paths: - Finance /api/inventory/adjustments/: get: - description: Read access to `/api/inventory/adjustments/`. + description: Read access to `/api/inventory/adjustments`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Product id filter. + example: 1 + in: query + name: product_id + required: false + schema: + type: integer + - description: Warehouse id filter. + example: 1 + in: query + name: warehouse_id + required: false + schema: + type: integer + - description: Transaction type filter. + example: IN + in: query + name: transaction_type + required: false + schema: + type: string + - description: Transaction subtype filter. + example: ADJUSTMENT + in: query + name: transaction_subtype + required: false + schema: + type: string + - description: Function code filter. + example: MANUAL_ADJUSTMENT + in: query + name: function_code + required: false + schema: + type: string responses: "200": content: @@ -1276,7 +1773,29 @@ paths: - Inventory /api/inventory/product-stocks/: get: - description: Read access to `/api/inventory/product-stocks/`. + description: Read access to `/api/inventory/product-stocks`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: pakan + in: query + name: search + required: false + schema: + type: string responses: "200": content: @@ -1340,7 +1859,92 @@ paths: - Inventory /api/inventory/product-warehouses/: get: - description: Read access to `/api/inventory/product-warehouses/`. + description: Read access to `/api/inventory/product-warehouses`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: gudang + in: query + name: search + required: false + schema: + type: string + - description: Product id filter. + example: 1 + in: query + name: product_id + required: false + schema: + type: integer + - description: Warehouse id filter. + example: 1 + in: query + name: warehouse_id + required: false + schema: + type: integer + - description: Location id filter. + example: 1 + in: query + name: location_id + required: false + schema: + type: integer + - description: Stock flags filter. + example: DOC + in: query + name: flags + required: false + schema: + type: string + - description: Kandang id filter. + example: 1 + in: query + name: kandang_id + required: false + schema: + type: integer + - description: Show available stock only. + example: true + in: query + name: available_only + required: false + schema: + type: string + - description: Transfer context filter. + example: inventory_transfer + in: query + name: transfer_context + required: false + schema: + type: string + - description: Stock mode filter. + example: exclude_chickin + in: query + name: stock_mode + required: false + schema: + type: string + - description: Warehouse stock type filter. + example: incoming + in: query + name: type + required: false + schema: + type: string responses: "200": content: @@ -1404,7 +2008,29 @@ paths: - Inventory /api/inventory/transfers/: get: - description: Read access to `/api/inventory/transfers/`. + description: Read access to `/api/inventory/transfers`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: TRF + in: query + name: search + required: false + schema: + type: string responses: "200": content: @@ -1468,7 +2094,57 @@ paths: - Inventory /api/marketing/: get: - description: Read access to `/api/marketing/`. + description: Read access to `/api/marketing`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: delivery + in: query + name: search + required: false + schema: + type: string + - description: Comma separated product ids. + example: 1,2 + in: query + name: product_ids + required: false + schema: + type: string + - description: Delivery status filter. + example: DRAFT + in: query + name: status + required: false + schema: + type: string + - description: Customer id filter. + example: 1 + in: query + name: customer_id + required: false + schema: + type: integer + - description: Marketing id filter. + example: 1 + in: query + name: marketing_id + required: false + schema: + type: integer responses: "200": content: @@ -1532,7 +2208,29 @@ paths: - Marketing /api/master-data/areas/: get: - description: Read access to `/api/master-data/areas/`. + description: Read access to `/api/master-data/areas`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: bandung + in: query + name: search + required: false + schema: + type: string responses: "200": content: @@ -1596,7 +2294,29 @@ paths: - Master Data /api/master-data/banks/: get: - description: Read access to `/api/master-data/banks/`. + description: Read access to `/api/master-data/banks`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: bca + in: query + name: search + required: false + schema: + type: string responses: "200": content: @@ -1660,7 +2380,29 @@ paths: - Master Data /api/master-data/config-checklists/: get: - description: Read access to `/api/master-data/config-checklists/`. + description: Read access to `/api/master-data/config-checklists`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: harian + in: query + name: search + required: false + schema: + type: string responses: "200": content: @@ -1724,7 +2466,36 @@ paths: - Master Data /api/master-data/customers/: get: - description: Read access to `/api/master-data/customers/`. + description: Read access to `/api/master-data/customers`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: pt + in: query + name: search + required: false + schema: + type: string + - description: Filter customer by marketing relation. + example: true + in: query + name: has_marketing + required: false + schema: + type: string responses: "200": content: @@ -1788,7 +2559,43 @@ paths: - Master Data /api/master-data/employees/: get: - description: Read access to `/api/master-data/employees/`. + description: Read access to `/api/master-data/employees`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: andi + in: query + name: search + required: false + schema: + type: string + - description: Kandang id filter. + example: 1 + in: query + name: kandang_id + required: false + schema: + type: integer + - description: Active status filter. + example: true + in: query + name: is_active + required: false + schema: + type: string responses: "200": content: @@ -1852,7 +2659,29 @@ paths: - Master Data /api/master-data/fcrs/: get: - description: Read access to `/api/master-data/fcrs/`. + description: Read access to `/api/master-data/fcrs`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: fcr + in: query + name: search + required: false + schema: + type: string responses: "200": content: @@ -1916,7 +2745,29 @@ paths: - Master Data /api/master-data/flocks/: get: - description: Read access to `/api/master-data/flocks/`. + description: Read access to `/api/master-data/flocks`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: layer + in: query + name: search + required: false + schema: + type: string responses: "200": content: @@ -1980,7 +2831,43 @@ paths: - Master Data /api/master-data/kandang-groups/: get: - description: Read access to `/api/master-data/kandang-groups/`. + description: Read access to `/api/master-data/kandang-groups`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: blok + in: query + name: search + required: false + schema: + type: string + - description: Location id filter. + example: 1 + in: query + name: location_id + required: false + schema: + type: integer + - description: Person in charge id filter. + example: 1 + in: query + name: pic_id + required: false + schema: + type: integer responses: "200": content: @@ -2044,7 +2931,43 @@ paths: - Master Data /api/master-data/kandangs/: get: - description: Read access to `/api/master-data/kandangs/`. + description: Read access to `/api/master-data/kandangs`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: kandang + in: query + name: search + required: false + schema: + type: string + - description: Location id filter. + example: 1 + in: query + name: location_id + required: false + schema: + type: integer + - description: Person in charge id filter. + example: 1 + in: query + name: pic_id + required: false + schema: + type: integer responses: "200": content: @@ -2108,7 +3031,43 @@ paths: - Master Data /api/master-data/locations/: get: - description: Read access to `/api/master-data/locations/`. + description: Read access to `/api/master-data/locations`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: farm + in: query + name: search + required: false + schema: + type: string + - description: Area id filter. + example: 1 + in: query + name: area_id + required: false + schema: + type: integer + - description: Filter laying locations only. + example: false + in: query + name: has_laying + required: false + schema: + type: string responses: "200": content: @@ -2172,7 +3131,36 @@ paths: - Master Data /api/master-data/nonstocks/: get: - description: Read access to `/api/master-data/nonstocks/`. + description: Read access to `/api/master-data/nonstocks`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: vitamin + in: query + name: search + required: false + schema: + type: string + - description: Supplier id filter. + example: 1 + in: query + name: supplier_id + required: false + schema: + type: integer responses: "200": content: @@ -2236,7 +3224,36 @@ paths: - Master Data /api/master-data/phase-activities/: get: - description: Read access to `/api/master-data/phase-activities/`. + description: Read access to `/api/master-data/phase-activities`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: cek pakan + in: query + name: search + required: false + schema: + type: string + - description: Comma separated phase ids. + example: 1,2 + in: query + name: phase_ids + required: false + schema: + type: string responses: "200": content: @@ -2300,7 +3317,36 @@ paths: - Master Data /api/master-data/phases/: get: - description: Read access to `/api/master-data/phases/`. + description: Read access to `/api/master-data/phases`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: starter + in: query + name: search + required: false + schema: + type: string + - description: Phase category filter. + example: Growing + in: query + name: category + required: false + schema: + type: string responses: "200": content: @@ -2364,7 +3410,29 @@ paths: - Master Data /api/master-data/product-categories/: get: - description: Read access to `/api/master-data/product-categories/`. + description: Read access to `/api/master-data/product-categories`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: pakan + in: query + name: search + required: false + schema: + type: string responses: "200": content: @@ -2428,7 +3496,36 @@ paths: - Master Data /api/master-data/production-standards/: get: - description: Read access to `/api/master-data/production-standards/`. + description: Read access to `/api/master-data/production-standards`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: standar + in: query + name: search + required: false + schema: + type: string + - description: Project category filter. + example: GROWING + in: query + name: project_category + required: false + schema: + type: string responses: "200": content: @@ -2492,7 +3589,50 @@ paths: - Master Data /api/master-data/products/: get: - description: Read access to `/api/master-data/products/`. + description: Read access to `/api/master-data/products`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: jagung + in: query + name: search + required: false + schema: + type: string + - description: Product category id filter. + example: 1 + in: query + name: product_category_id + required: false + schema: + type: integer + - description: Filter depletion products. + example: false + in: query + name: is_depletion + required: false + schema: + type: string + - description: Include all products regardless of status. + example: false + in: query + name: include_all + required: false + schema: + type: string responses: "200": content: @@ -2556,7 +3696,43 @@ paths: - Master Data /api/master-data/suppliers/: get: - description: Read access to `/api/master-data/suppliers/`. + description: Read access to `/api/master-data/suppliers`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: supplier + in: query + name: search + required: false + schema: + type: string + - description: Supplier type flag filter. + example: ACTIVE + in: query + name: flag + required: false + schema: + type: string + - description: Supplier category filter. + example: PAKAN + in: query + name: category + required: false + schema: + type: string responses: "200": content: @@ -2620,7 +3796,29 @@ paths: - Master Data /api/master-data/uoms/: get: - description: Read access to `/api/master-data/uoms/`. + description: Read access to `/api/master-data/uoms`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: kg + in: query + name: search + required: false + schema: + type: string responses: "200": content: @@ -2684,7 +3882,57 @@ paths: - Master Data /api/master-data/warehouses/: get: - description: Read access to `/api/master-data/warehouses/`. + description: Read access to `/api/master-data/warehouses`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: gudang + in: query + name: search + required: false + schema: + type: string + - description: Area id filter. + example: 1 + in: query + name: area_id + required: false + schema: + type: integer + - description: Location id filter. + example: 1 + in: query + name: location_id + required: false + schema: + type: integer + - description: Filter only active project flock warehouses. + example: false + in: query + name: active_project_flock + required: false + schema: + type: string + - description: Transfer context filter. + example: inventory_transfer + in: query + name: transfer_context + required: false + schema: + type: string responses: "200": content: @@ -2784,7 +4032,92 @@ paths: - Production /api/production/project-flock-kandangs/: get: - description: Read access to `/api/production/project-flock-kandangs/`. + description: Read access to `/api/production/project-flock-kandangs`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: kandang + in: query + name: search + required: false + schema: + type: string + - description: Return name-with-period projection. + example: false + in: query + name: name_with_periode + required: false + schema: + type: string + - description: Project flock id filter. + example: 1 + in: query + name: project_flock_id + required: false + schema: + type: integer + - description: Kandang id filter. + example: 1 + in: query + name: kandang_id + required: false + schema: + type: integer + - description: Project category filter. + example: Growing + in: query + name: category + required: false + schema: + type: string + - description: Area id filter. + example: 1 + in: query + name: area_id + required: false + schema: + type: integer + - description: Location id filter. + example: 1 + in: query + name: location_id + required: false + schema: + type: integer + - description: Sort field. + example: created_at + in: query + name: sort_by + required: false + schema: + type: string + - description: Sort order. + example: ASC + in: query + name: sort_order + required: false + schema: + type: string + - description: Approval step name filter. + example: Pengajuan + in: query + name: step_name + required: false + schema: + type: string responses: "200": content: @@ -2884,7 +4217,92 @@ paths: - Production /api/production/project-flocks/: get: - description: Read access to `/api/production/project-flocks/`. + description: Read access to `/api/production/project-flocks`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: flock + in: query + name: search + required: false + schema: + type: string + - description: Sort field. + example: created_at + in: query + name: sort_by + required: false + schema: + type: string + - description: Sort order. + example: asc + in: query + name: sort_order + required: false + schema: + type: string + - description: Area id filter. + example: 1 + in: query + name: area_id + required: false + schema: + type: integer + - description: Location id filter. + example: 1 + in: query + name: location_id + required: false + schema: + type: integer + - description: Project period filter. + example: 1 + in: query + name: period + required: false + schema: + type: integer + - description: Project category filter. + example: Growing + in: query + name: category + required: false + schema: + type: string + - description: Project status filter. + example: Aktif + in: query + name: status + required: false + schema: + type: string + - description: Comma separated kandang ids. + example: 1,2 + in: query + name: kandang_id + required: false + schema: + type: string + - description: Transfer context filter. + example: transfer_to_laying + in: query + name: transfer_context + required: false + schema: + type: string responses: "200": content: @@ -2949,12 +4367,41 @@ paths: /api/production/project-flocks/kandangs/lookup: get: description: Read access to `/api/production/project-flocks/kandangs/lookup`. + parameters: + - description: Project flock id. + example: 1 + in: query + name: project_flock_id + required: true + schema: + type: integer + - description: Kandang id. + example: 1 + in: query + name: kandang_id + required: true + schema: + type: integer + - description: Include population value in response. + example: false + in: query + name: withpopulation + required: false + schema: + type: string + - description: Reference date (YYYY-MM-DD). + example: "2026-01-01" + in: query + name: record_date + required: false + schema: + type: string responses: "200": content: application/json: schema: - $ref: '#/components/schemas/PaginatedEnvelope' + $ref: '#/components/schemas/SuccessEnvelope' description: Successful response "401": content: @@ -3012,7 +4459,43 @@ paths: - Production /api/production/recordings/: get: - description: Read access to `/api/production/recordings/`. + description: Read access to `/api/production/recordings`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Project flock kandang id filter. + example: 1 + in: query + name: project_flock_kandang_id + required: false + schema: + type: integer + - description: Search keyword. + example: record + in: query + name: search + required: false + schema: + type: string + - description: Export mode. + example: excel + in: query + name: export + required: false + schema: + type: string responses: "200": content: @@ -3077,12 +4560,27 @@ paths: /api/production/recordings/next-day: get: description: Read access to `/api/production/recordings/next-day`. + parameters: + - description: Project flock kandang id. + example: 1 + in: query + name: project_flock_kandang_id + required: true + schema: + type: integer + - description: Recording date (YYYY-MM-DD). + example: "2026-01-01" + in: query + name: record_date + required: true + schema: + type: string responses: "200": content: application/json: schema: - $ref: '#/components/schemas/PaginatedEnvelope' + $ref: '#/components/schemas/SuccessEnvelope' description: Successful response "401": content: @@ -3104,7 +4602,64 @@ paths: - Production /api/production/transfer_layings/: get: - description: Read access to `/api/production/transfer_layings/`. + description: Read access to `/api/production/transfer_layings`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: transfer + in: query + name: search + required: false + schema: + type: string + - description: Start date (YYYY-MM-DD). + example: "2026-01-01" + in: query + name: start_date + required: false + schema: + type: string + - description: End date (YYYY-MM-DD). + example: "2026-01-31" + in: query + name: end_date + required: false + schema: + type: string + - description: Comma separated source flock ids. + example: 1,2 + in: query + name: flock_source + required: false + schema: + type: string + - description: Comma separated destination flock ids. + example: 3,4 + in: query + name: flock_destination + required: false + schema: + type: string + - description: Comma separated status values. + example: DRAFT,APPROVED + in: query + name: status + required: false + schema: + type: string responses: "200": content: @@ -3240,7 +4795,57 @@ paths: - Production /api/production/uniformities/: get: - description: Read access to `/api/production/uniformities/`. + description: Read access to `/api/production/uniformities`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Project flock kandang id filter. + example: 1 + in: query + name: project_flock_kandang_id + required: false + schema: + type: integer + - description: Week number filter. + example: 1 + in: query + name: week + required: false + schema: + type: integer + - description: Start date (YYYY-MM-DD). + example: "2026-01-01" + in: query + name: start_date + required: false + schema: + type: string + - description: End date (YYYY-MM-DD). + example: "2026-01-31" + in: query + name: end_date + required: false + schema: + type: string + - description: Include chart payload. + example: false + in: query + name: with_chart + required: false + schema: + type: string responses: "200": content: @@ -3304,7 +4909,99 @@ paths: - Production /api/purchases/: get: - description: Read access to `/api/purchases/`. + description: Read access to `/api/purchases`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Supplier id filter. + example: 1 + in: query + name: supplier_id + required: false + schema: + type: integer + - description: Area id filter. + example: 1 + in: query + name: area_id + required: false + schema: + type: integer + - description: Location id filter. + example: 1 + in: query + name: location_id + required: false + schema: + type: integer + - description: Product category id filter. + example: "1" + in: query + name: product_category_id + required: false + schema: + type: string + - description: Approval status filter. + example: PENDING + in: query + name: approval_status + required: false + schema: + type: string + - description: PO date (YYYY-MM-DD). + example: "2026-01-01" + in: query + name: po_date + required: false + schema: + type: string + - description: PO date start (YYYY-MM-DD). + example: "2026-01-01" + in: query + name: po_date_from + required: false + schema: + type: string + - description: PO date end (YYYY-MM-DD). + example: "2026-01-31" + in: query + name: po_date_to + required: false + schema: + type: string + - description: Search keyword. + example: PO- + in: query + name: search + required: false + schema: + type: string + - description: Created date start (YYYY-MM-DD). + example: "2026-01-01" + in: query + name: created_from + required: false + schema: + type: string + - description: Created date end (YYYY-MM-DD). + example: "2026-01-31" + in: query + name: created_to + required: false + schema: + type: string responses: "200": content: @@ -3405,6 +5102,13 @@ paths: required: false schema: type: string + - description: Date field filter. + example: TRANS_DATE + in: query + name: filter_by + required: false + schema: + type: string responses: "200": content: @@ -3469,6 +5173,20 @@ paths: required: false schema: type: string + - description: Date field filter. + example: received_date + in: query + name: filter_by + required: false + schema: + type: string + - description: Sort order. + example: asc + in: query + name: sort_order + required: false + schema: + type: string responses: "200": content: @@ -3533,6 +5251,27 @@ paths: required: false schema: type: integer + - description: Kandang id filter. + example: 1 + in: query + name: kandang_id + required: false + schema: + type: integer + - description: Project flock kandang id filter. + example: 1 + in: query + name: project_flock_kandang_id + required: false + schema: + type: integer + - description: Nonstock id filter. + example: 1 + in: query + name: nonstock_id + required: false + schema: + type: integer - description: Location id filter. example: 1 in: query @@ -3597,27 +5336,55 @@ paths: required: false schema: type: integer - - description: Daily period filter (YYYY-MM). - example: 2026-01 + - description: Daily period filter (YYYY-MM-DD). + example: "2026-01-01" in: query name: period required: false schema: type: string - - description: Location id filter. - example: 1 + - description: Include unrecorded data. + example: false + in: query + name: show_unrecorded + required: false + schema: + type: string + - description: Comma separated area ids. + example: 1,2 + in: query + name: area_id + required: false + schema: + type: string + - description: Comma separated location ids. + example: 1,2 in: query name: location_id required: false schema: - type: integer - - description: Kandang id filter. - example: 1 + type: string + - description: Comma separated kandang ids. + example: 1,2 in: query name: kandang_id required: false schema: - type: integer + type: string + - description: Minimum body weight filter. + example: "1.2" + in: query + name: weight_min + required: false + schema: + type: string + - description: Maximum body weight filter. + example: "1.8" + in: query + name: weight_max + required: false + schema: + type: string responses: "200": content: @@ -3661,6 +5428,69 @@ paths: required: false schema: type: integer + - description: Search keyword. + example: SO- + in: query + name: search + required: false + schema: + type: string + - description: Customer id filter. + example: 1 + in: query + name: customer_id + required: false + schema: + type: integer + - description: Product id filter. + example: 1 + in: query + name: product_id + required: false + schema: + type: integer + - description: Warehouse id filter. + example: 1 + in: query + name: warehouse_id + required: false + schema: + type: integer + - description: Sales person id filter. + example: 1 + in: query + name: sales_person_id + required: false + schema: + type: integer + - description: Area id filter. + example: 1 + in: query + name: area_id + required: false + schema: + type: integer + - description: Location id filter. + example: 1 + in: query + name: location_id + required: false + schema: + type: integer + - description: Marketing type filter. + example: ayam + in: query + name: marketing_type + required: false + schema: + type: string + - description: Date field filter. + example: so_date + in: query + name: filter_by + required: false + schema: + type: string - description: Period start date (YYYY-MM-DD). example: "2026-01-01" in: query @@ -3675,20 +5505,20 @@ paths: required: false schema: type: string - - description: Customer id filter. - example: 1 + - description: Sort field. + example: so_date in: query - name: customer_id + name: sort_by required: false schema: - type: integer - - description: Location id filter. - example: 1 + type: string + - description: Sort order. + example: asc in: query - name: location_id + name: sort_order required: false schema: - type: integer + type: string responses: "200": content: @@ -3725,6 +5555,20 @@ paths: schema: example: "1" type: string + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer responses: "200": content: @@ -3768,6 +5612,34 @@ paths: required: false schema: type: integer + - description: Comma separated area ids. + example: 1,2 + in: query + name: area_id + required: false + schema: + type: string + - description: Comma separated supplier ids. + example: 1,2 + in: query + name: supplier_id + required: false + schema: + type: string + - description: Comma separated product ids. + example: 1,2 + in: query + name: product_id + required: false + schema: + type: string + - description: Comma separated product category ids. + example: 1,2 + in: query + name: product_category_id + required: false + schema: + type: string - description: Period start date (YYYY-MM-DD). example: "2026-01-01" in: query @@ -3782,17 +5654,17 @@ paths: required: false schema: type: string - - description: Comma separated supplier ids. - example: 1,2 + - description: Sort field. + example: created_at in: query - name: supplier_id + name: sort_by required: false schema: type: string - - description: Comma separated area ids. - example: 1,2 + - description: Filter field. + example: received_date in: query - name: area_id + name: filter_by required: false schema: type: string @@ -3950,7 +5822,29 @@ paths: - SSO /api/users/: get: - description: Read access to `/api/users/`. + description: Read access to `/api/users`. + parameters: + - description: Page number. + example: 1 + in: query + name: page + required: false + schema: + type: integer + - description: Page size. + example: 10 + in: query + name: limit + required: false + schema: + type: integer + - description: Search keyword. + example: admin + in: query + name: search + required: false + schema: + type: string responses: "200": content: diff --git a/docs/postman/read-api.collection.json b/docs/postman/read-api.collection.json index 4b52da17..0ccdba5c 100644 --- a/docs/postman/read-api.collection.json +++ b/docs/postman/read-api.collection.json @@ -6,6 +6,24 @@ "item": [ { "item": [ + { + "item": [ + { + "name": "GET api / constants", + "request": { + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "method": "GET", + "url": "{{base_url}}/api/constants/" + } + } + ], + "name": "API" + }, { "item": [ { @@ -76,27 +94,9 @@ } ], "method": "GET", - "url": "{{base_url}}/api/approvals/" + "url": "{{base_url}}/api/approvals/?module_name=EXPENSES\u0026module_id=1\u0026group_step_number=false\u0026page=1\u0026limit=10\u0026search=approval\u0026order_by_date=DESC" } }, - { - "name": "GET api / constants", - "request": { - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "method": "GET", - "url": "{{base_url}}/api/constants/" - } - } - ], - "name": "API" - }, - { - "item": [ { "name": "GET api / closings", "request": { @@ -107,9 +107,14 @@ } ], "method": "GET", - "url": "{{base_url}}/api/closings/" + "url": "{{base_url}}/api/closings/?page=1\u0026limit=10\u0026search=kandang\u0026project_status=1\u0026location_id={{location_id}}" } - }, + } + ], + "name": "API" + }, + { + "item": [ { "name": "GET api / closings / :projectFlockId", "request": { @@ -120,7 +125,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/closings/{{projectFlockId}}" + "url": "{{base_url}}/api/closings/{{projectFlockId}}?kandang_id={{project_flock_kandang_id}}" } }, { @@ -133,7 +138,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/closings/{{projectFlockId}}/keuangan" + "url": "{{base_url}}/api/closings/{{projectFlockId}}/keuangan?kandang_id={{project_flock_kandang_id}}" } }, { @@ -146,7 +151,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/closings/{{projectFlockId}}/production-data" + "url": "{{base_url}}/api/closings/{{projectFlockId}}/production-data?kandang_id={{project_flock_kandang_id}}" } }, { @@ -159,7 +164,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/closings/{{projectFlockId}}/sapronak?type=incoming" + "url": "{{base_url}}/api/closings/{{projectFlockId}}/sapronak?type=incoming\u0026page=1\u0026limit=10\u0026search=pakan\u0026kandang_id={{project_flock_kandang_id}}" } }, { @@ -172,7 +177,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/closings/{{projectFlockId}}/sapronak/summary?type=incoming" + "url": "{{base_url}}/api/closings/{{projectFlockId}}/sapronak/summary?type=incoming\u0026search=pakan\u0026kandang_id={{project_flock_kandang_id}}" } }, { @@ -237,7 +242,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/closings/{{project_flock_id}}/{{project_flock_kandang_id}}/perhitungan_sapronak" + "url": "{{base_url}}/api/closings/{{project_flock_id}}/{{project_flock_kandang_id}}/perhitungan_sapronak?flag=DOC" } }, { @@ -250,7 +255,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/closings/{{project_flock_id}}/expedition-hpp" + "url": "{{base_url}}/api/closings/{{project_flock_id}}/expedition-hpp?project_flock_kandang_id={{project_flock_kandang_id}}" } }, { @@ -289,7 +294,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/closings/{{project_flock_id}}/perhitungan_sapronak" + "url": "{{base_url}}/api/closings/{{project_flock_id}}/perhitungan_sapronak?flag=DOC" } } ], @@ -307,7 +312,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/daily-checklists/" + "url": "{{base_url}}/api/daily-checklists/?page=1\u0026limit=10\u0026search=kebersihan\u0026date_from=2026-01-01\u0026date_to=2026-01-31\u0026status=done\u0026kandang_id={{idProjectFlockKandang}}" } }, { @@ -346,7 +351,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/daily-checklists/report" + "url": "{{base_url}}/api/daily-checklists/report?page=1\u0026limit=10\u0026bulan=1\u0026tahun=2026\u0026area_id={{area_id}}\u0026location_id={{location_id}}\u0026kandang_id={{idProjectFlockKandang}}\u0026employee_id={{employee_id}}\u0026phase_id={{id}}" } }, { @@ -359,7 +364,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/daily-checklists/summary" + "url": "{{base_url}}/api/daily-checklists/summary?date_from=2026-01-01\u0026date_to=2026-01-31\u0026category=cleaning\u0026kandang_id={{idProjectFlockKandang}}" } }, { @@ -372,7 +377,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/daily-checklists/tasks" + "url": "{{base_url}}/api/daily-checklists/tasks?checklist_id={{idDailyChecklist}}" } } ], @@ -390,7 +395,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/dashboards/" + "url": "{{base_url}}/api/dashboards/?page=1\u0026limit=10\u0026search=farm\u0026start_date=2026-01-01\u0026end_date=2026-01-31\u0026analysis_mode=OVERVIEW\u0026comparison_type=PREVIOUS_PERIOD\u0026metric=egg_mass\u0026location_ids=1,2\u0026flock_ids=1,2\u0026kandang_ids=1,2\u0026include=performance,summary" } } ], @@ -408,7 +413,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/expenses/" + "url": "{{base_url}}/api/expenses/?page=1\u0026limit=10\u0026search=operasional" } }, { @@ -478,7 +483,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/finance/transactions/" + "url": "{{base_url}}/api/finance/transactions/?page=1\u0026limit=10\u0026search=invoice\u0026bank_ids={{bank_id}}\u0026customer_ids=1,2\u0026supplier_ids=1,2\u0026transaction_types=payment,initial_balance\u0026sort_date=created_at\u0026start_date=2026-01-01\u0026end_date=2026-01-31" } }, { @@ -509,7 +514,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/inventory/adjustments/" + "url": "{{base_url}}/api/inventory/adjustments/?page=1\u0026limit=10\u0026product_id={{product_id}}\u0026warehouse_id={{warehouse_id}}\u0026transaction_type=IN\u0026transaction_subtype=ADJUSTMENT\u0026function_code=MANUAL_ADJUSTMENT" } }, { @@ -535,7 +540,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/inventory/product-stocks/" + "url": "{{base_url}}/api/inventory/product-stocks/?page=1\u0026limit=10\u0026search=pakan" } }, { @@ -561,7 +566,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/inventory/product-warehouses/" + "url": "{{base_url}}/api/inventory/product-warehouses/?page=1\u0026limit=10\u0026search=gudang\u0026product_id={{product_id}}\u0026warehouse_id={{warehouse_id}}\u0026location_id={{location_id}}\u0026flags=DOC\u0026kandang_id={{project_flock_kandang_id}}\u0026available_only=true\u0026transfer_context=inventory_transfer\u0026stock_mode=exclude_chickin\u0026type=incoming" } }, { @@ -587,7 +592,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/inventory/transfers/" + "url": "{{base_url}}/api/inventory/transfers/?page=1\u0026limit=10\u0026search=TRF" } }, { @@ -618,7 +623,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/marketing/" + "url": "{{base_url}}/api/marketing/?page=1\u0026limit=10\u0026search=delivery\u0026product_ids=1,2\u0026status=DRAFT\u0026customer_id={{customer_id}}\u0026marketing_id=1" } }, { @@ -649,7 +654,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/areas/" + "url": "{{base_url}}/api/master-data/areas/?page=1\u0026limit=10\u0026search=bandung" } }, { @@ -675,7 +680,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/banks/" + "url": "{{base_url}}/api/master-data/banks/?page=1\u0026limit=10\u0026search=bca" } }, { @@ -701,7 +706,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/config-checklists/" + "url": "{{base_url}}/api/master-data/config-checklists/?page=1\u0026limit=10\u0026search=harian" } }, { @@ -727,7 +732,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/customers/" + "url": "{{base_url}}/api/master-data/customers/?page=1\u0026limit=10\u0026search=pt\u0026has_marketing=true" } }, { @@ -753,7 +758,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/employees/" + "url": "{{base_url}}/api/master-data/employees/?page=1\u0026limit=10\u0026search=andi\u0026kandang_id={{project_flock_kandang_id}}\u0026is_active=true" } }, { @@ -779,7 +784,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/fcrs/" + "url": "{{base_url}}/api/master-data/fcrs/?page=1\u0026limit=10\u0026search=fcr" } }, { @@ -805,7 +810,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/flocks/" + "url": "{{base_url}}/api/master-data/flocks/?page=1\u0026limit=10\u0026search=layer" } }, { @@ -831,7 +836,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/kandang-groups/" + "url": "{{base_url}}/api/master-data/kandang-groups/?page=1\u0026limit=10\u0026search=blok\u0026location_id={{location_id}}\u0026pic_id={{employee_id}}" } }, { @@ -857,7 +862,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/kandangs/" + "url": "{{base_url}}/api/master-data/kandangs/?page=1\u0026limit=10\u0026search=kandang\u0026location_id={{location_id}}\u0026pic_id={{employee_id}}" } }, { @@ -883,7 +888,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/locations/" + "url": "{{base_url}}/api/master-data/locations/?page=1\u0026limit=10\u0026search=farm\u0026area_id={{area_id}}\u0026has_laying=false" } }, { @@ -909,7 +914,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/nonstocks/" + "url": "{{base_url}}/api/master-data/nonstocks/?page=1\u0026limit=10\u0026search=vitamin\u0026supplier_id={{supplier_id}}" } }, { @@ -935,7 +940,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/phase-activities/" + "url": "{{base_url}}/api/master-data/phase-activities/?page=1\u0026limit=10\u0026search=cek pakan\u0026phase_ids=1,2" } }, { @@ -961,7 +966,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/phases/" + "url": "{{base_url}}/api/master-data/phases/?page=1\u0026limit=10\u0026search=starter\u0026category=Growing" } }, { @@ -987,7 +992,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/product-categories/" + "url": "{{base_url}}/api/master-data/product-categories/?page=1\u0026limit=10\u0026search=pakan" } }, { @@ -1013,7 +1018,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/production-standards/" + "url": "{{base_url}}/api/master-data/production-standards/?page=1\u0026limit=10\u0026search=standar\u0026project_category=GROWING" } }, { @@ -1039,7 +1044,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/products/" + "url": "{{base_url}}/api/master-data/products/?page=1\u0026limit=10\u0026search=jagung\u0026product_category_id={{product_category_id}}\u0026is_depletion=false\u0026include_all=false" } }, { @@ -1065,7 +1070,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/suppliers/" + "url": "{{base_url}}/api/master-data/suppliers/?page=1\u0026limit=10\u0026search=supplier\u0026flag=ACTIVE\u0026category=PAKAN" } }, { @@ -1091,7 +1096,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/uoms/" + "url": "{{base_url}}/api/master-data/uoms/?page=1\u0026limit=10\u0026search=kg" } }, { @@ -1117,7 +1122,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/master-data/warehouses/" + "url": "{{base_url}}/api/master-data/warehouses/?page=1\u0026limit=10\u0026search=gudang\u0026area_id={{area_id}}\u0026location_id={{location_id}}\u0026active_project_flock=false\u0026transfer_context=inventory_transfer" } }, { @@ -1161,7 +1166,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/production/project-flock-kandangs/" + "url": "{{base_url}}/api/production/project-flock-kandangs/?page=1\u0026limit=10\u0026search=kandang\u0026name_with_periode=false\u0026project_flock_id={{project_flock_id}}\u0026kandang_id={{project_flock_kandang_id}}\u0026category=Growing\u0026area_id={{area_id}}\u0026location_id={{location_id}}\u0026sort_by=created_at\u0026sort_order=ASC\u0026step_name=Pengajuan" } }, { @@ -1200,7 +1205,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/production/project-flocks/" + "url": "{{base_url}}/api/production/project-flocks/?page=1\u0026limit=10\u0026search=flock\u0026sort_by=created_at\u0026sort_order=asc\u0026area_id={{area_id}}\u0026location_id={{location_id}}\u0026period=1\u0026category=Growing\u0026status=Aktif\u0026kandang_id=1,2\u0026transfer_context=transfer_to_laying" } }, { @@ -1226,7 +1231,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/production/project-flocks/kandangs/lookup" + "url": "{{base_url}}/api/production/project-flocks/kandangs/lookup?project_flock_id={{project_flock_id}}\u0026kandang_id={{project_flock_kandang_id}}\u0026withpopulation=false\u0026record_date=2026-01-01" } }, { @@ -1252,7 +1257,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/production/recordings/" + "url": "{{base_url}}/api/production/recordings/?page=1\u0026limit=10\u0026project_flock_kandang_id={{project_flock_kandang_id}}\u0026search=record\u0026export=excel" } }, { @@ -1278,7 +1283,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/production/recordings/next-day" + "url": "{{base_url}}/api/production/recordings/next-day?project_flock_kandang_id={{project_flock_kandang_id}}\u0026record_date=2026-01-01" } }, { @@ -1291,7 +1296,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/production/transfer_layings/" + "url": "{{base_url}}/api/production/transfer_layings/?page=1\u0026limit=10\u0026search=transfer\u0026start_date=2026-01-01\u0026end_date=2026-01-31\u0026flock_source=1,2\u0026flock_destination=3,4\u0026status=DRAFT,APPROVED" } }, { @@ -1343,7 +1348,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/production/uniformities/" + "url": "{{base_url}}/api/production/uniformities/?page=1\u0026limit=10\u0026project_flock_kandang_id={{project_flock_kandang_id}}\u0026week=1\u0026start_date=2026-01-01\u0026end_date=2026-01-31\u0026with_chart=false" } }, { @@ -1374,7 +1379,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/purchases/" + "url": "{{base_url}}/api/purchases/?page=1\u0026limit=10\u0026supplier_id={{supplier_id}}\u0026area_id={{area_id}}\u0026location_id={{location_id}}\u0026product_category_id=1\u0026approval_status=PENDING\u0026po_date=2026-01-01\u0026po_date_from=2026-01-01\u0026po_date_to=2026-01-31\u0026search=PO-\u0026created_from=2026-01-01\u0026created_to=2026-01-31" } }, { @@ -1405,7 +1410,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/reports/customer-payment?customer_ids={{customer_id}}" + "url": "{{base_url}}/api/reports/customer-payment?page=1\u0026limit=10\u0026start_date=2026-01-01\u0026end_date=2026-01-31\u0026customer_ids={{customer_id}}\u0026filter_by=TRANS_DATE" } }, { @@ -1418,7 +1423,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/reports/debt-supplier?supplier_ids={{supplier_id}}" + "url": "{{base_url}}/api/reports/debt-supplier?page=1\u0026limit=10\u0026start_date=2026-01-01\u0026end_date=2026-01-31\u0026supplier_ids={{supplier_id}}\u0026filter_by=received_date\u0026sort_order=asc" } }, { @@ -1431,7 +1436,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/reports/expense" + "url": "{{base_url}}/api/reports/expense?page=1\u0026limit=10\u0026search=operasional\u0026category=BOP\u0026supplier_id=1\u0026kandang_id=1\u0026project_flock_kandang_id=1\u0026nonstock_id=1\u0026location_id=1\u0026area_id=1\u0026realization_date=2026-01-15" } }, { @@ -1444,7 +1449,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/reports/hpp-per-kandang" + "url": "{{base_url}}/api/reports/hpp-per-kandang?page=1\u0026limit=10\u0026period=2026-01-01\u0026show_unrecorded=false\u0026area_id=1,2\u0026location_id=1,2\u0026kandang_id=1,2\u0026weight_min=1.2\u0026weight_max=1.8" } }, { @@ -1457,7 +1462,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/reports/marketing" + "url": "{{base_url}}/api/reports/marketing?page=1\u0026limit=10\u0026search=SO-\u0026customer_id=1\u0026product_id=1\u0026warehouse_id=1\u0026sales_person_id=1\u0026area_id=1\u0026location_id=1\u0026marketing_type=ayam\u0026filter_by=so_date\u0026start_date=2026-01-01\u0026end_date=2026-01-31\u0026sort_by=so_date\u0026sort_order=asc" } }, { @@ -1470,7 +1475,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/reports/production-result/{{idProjectFlockKandang}}" + "url": "{{base_url}}/api/reports/production-result/{{idProjectFlockKandang}}?page=1\u0026limit=10" } }, { @@ -1483,7 +1488,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/reports/purchase-supplier" + "url": "{{base_url}}/api/reports/purchase-supplier?page=1\u0026limit=10\u0026area_id=1,2\u0026supplier_id=1,2\u0026product_id=1,2\u0026product_category_id=1,2\u0026start_date=2026-01-01\u0026end_date=2026-01-31\u0026sort_by=created_at\u0026filter_by=received_date" } } ], @@ -1501,7 +1506,7 @@ } ], "method": "GET", - "url": "{{base_url}}/api/users/" + "url": "{{base_url}}/api/users/?page=1\u0026limit=10\u0026search=admin" } }, { diff --git a/internal/apikeys/service.go b/internal/apikeys/service.go index 5059b18a..4b6a05a9 100644 --- a/internal/apikeys/service.go +++ b/internal/apikeys/service.go @@ -193,7 +193,7 @@ func randomToken(size int) (string, error) { func canonicalPermissions(perms []string) []string { if len(perms) == 0 { - return nil + return []string{} } seen := make(map[string]struct{}, len(perms)) @@ -214,7 +214,7 @@ func canonicalPermissions(perms []string) []string { func uniqueUint(values []uint) []uint { if len(values) == 0 { - return nil + return []uint{} } seen := make(map[uint]struct{}, len(values)) diff --git a/internal/database/migrations/20260414090000_create_integration_api_keys.down.sql b/internal/database/migrations/20260414082821_create_integration_api_keys.down.sql similarity index 100% rename from internal/database/migrations/20260414090000_create_integration_api_keys.down.sql rename to internal/database/migrations/20260414082821_create_integration_api_keys.down.sql diff --git a/internal/database/migrations/20260414090000_create_integration_api_keys.up.sql b/internal/database/migrations/20260414082821_create_integration_api_keys.up.sql similarity index 100% rename from internal/database/migrations/20260414090000_create_integration_api_keys.up.sql rename to internal/database/migrations/20260414082821_create_integration_api_keys.up.sql diff --git a/internal/readapi/readapi.go b/internal/readapi/readapi.go index ba6651b8..2ae62472 100644 --- a/internal/readapi/readapi.go +++ b/internal/readapi/readapi.go @@ -476,10 +476,11 @@ func buildPostmanURL(route normalizedRoute, meta routeMeta) string { query := make([]string, 0, len(meta.QueryParams)) for _, param := range meta.QueryParams { - if !param.IncludePostman { - continue + value := strings.TrimSpace(param.PostmanValue) + if value == "" && param.Example != nil { + value = fmt.Sprintf("%v", param.Example) } - query = append(query, fmt.Sprintf("%s=%v", param.Name, param.PostmanValue)) + query = append(query, fmt.Sprintf("%s=%v", param.Name, value)) } if len(query) == 0 { @@ -552,31 +553,103 @@ func buildPostmanEnvironment(routes []normalizedRoute) map[string]any { } func describeRoute(route normalizedRoute) routeMeta { + routePath := route.Path + if len(routePath) > 1 { + routePath = strings.TrimSuffix(routePath, "/") + } + meta := routeMeta{ Group: "Dashboard API Key", - Tag: inferTag(route.Path), - Summary: defaultSummary(route.Path), - Description: fmt.Sprintf("Read access to `%s`.", route.Path), + Tag: inferTag(routePath), + Summary: defaultSummary(routePath), + Description: fmt.Sprintf("Read access to `%s`.", routePath), Security: securityAPIOrBearer, - ListStyle: !strings.Contains(route.Path, ":"), + ListStyle: !strings.Contains(routePath, ":"), } switch { - case route.Path == "/healthz" || route.Path == "/readyz" || route.Path == "/api/constants": + case routePath == "/healthz" || routePath == "/readyz" || routePath == "/api/constants": meta.Group = "Public" meta.Security = securityNone meta.ListStyle = false - case strings.HasPrefix(route.Path, "/api/sso/"): + case strings.HasPrefix(routePath, "/api/sso/"): meta.Group = "Internal/OAuth Reference" meta.ListStyle = false - if route.Path == "/api/sso/userinfo" { + if routePath == "/api/sso/userinfo" { meta.Security = securityBearer } else { meta.Security = securityNone } } - switch route.Path { + switch routePath { + case "/api/approvals": + meta.QueryParams = []parameterMeta{ + {Name: "module_name", In: "query", Description: "Approval workflow module name.", Required: true, Example: "EXPENSES", PostmanValue: "EXPENSES"}, + {Name: "module_id", In: "query", Description: "Optional approvable module id.", Example: 1}, + {Name: "group_step_number", In: "query", Description: "Group approval records by step number.", Example: false}, + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "approval"}, + {Name: "order_by_date", In: "query", Description: "Sort direction by date.", Example: "DESC"}, + } + case "/api/daily-checklists": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "kebersihan"}, + {Name: "date_from", In: "query", Description: "Start date filter (YYYY-MM-DD).", Example: "2026-01-01"}, + {Name: "date_to", In: "query", Description: "End date filter (YYYY-MM-DD).", Example: "2026-01-31"}, + {Name: "status", In: "query", Description: "Checklist status filter.", Example: "done"}, + {Name: "kandang_id", In: "query", Description: "Kandang id filter.", Example: 1, PostmanValue: "{{idProjectFlockKandang}}"}, + } + case "/api/daily-checklists/report": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Required: true, Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Required: true, Example: 10}, + {Name: "bulan", In: "query", Description: "Month number (1-12).", Required: true, Example: 1}, + {Name: "tahun", In: "query", Description: "Year.", Required: true, Example: 2026}, + {Name: "area_id", In: "query", Description: "Area id filter.", Example: 1, PostmanValue: "{{area_id}}"}, + {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1, PostmanValue: "{{location_id}}"}, + {Name: "kandang_id", In: "query", Description: "Kandang id filter.", Example: 1, PostmanValue: "{{idProjectFlockKandang}}"}, + {Name: "employee_id", In: "query", Description: "Employee id filter.", Example: 1, PostmanValue: "{{employee_id}}"}, + {Name: "phase_id", In: "query", Description: "Phase id filter.", Example: 1, PostmanValue: "{{id}}"}, + } + case "/api/daily-checklists/summary": + meta.QueryParams = []parameterMeta{ + {Name: "date_from", In: "query", Description: "Start date filter (YYYY-MM-DD).", Required: true, Example: "2026-01-01"}, + {Name: "date_to", In: "query", Description: "End date filter (YYYY-MM-DD).", Required: true, Example: "2026-01-31"}, + {Name: "category", In: "query", Description: "Checklist category filter.", Example: "cleaning"}, + {Name: "kandang_id", In: "query", Description: "Kandang id filter.", Example: 1, PostmanValue: "{{idProjectFlockKandang}}"}, + } + case "/api/daily-checklists/tasks": + meta.QueryParams = []parameterMeta{ + {Name: "checklist_id", In: "query", Description: "Daily checklist id.", Required: true, Example: 1, PostmanValue: "{{idDailyChecklist}}"}, + } + case "/api/closings": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "kandang"}, + {Name: "project_status", In: "query", Description: "Project status filter (1 or 2).", Example: 1}, + {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1, PostmanValue: "{{location_id}}"}, + } + case "/api/closings/:projectFlockId": + meta.ListStyle = false + meta.QueryParams = []parameterMeta{ + {Name: "kandang_id", In: "query", Description: "Optional kandang id filter.", Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, + } + case "/api/closings/:project_flock_id/perhitungan_sapronak", "/api/closings/:project_flock_id/:project_flock_kandang_id/perhitungan_sapronak": + meta.ListStyle = false + meta.QueryParams = []parameterMeta{ + {Name: "flag", In: "query", Description: "Product category flag filter (DOC/OVK/PAKAN/PULLET).", Example: "DOC"}, + } + case "/api/expenses": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "operasional"}, + } case "/api/dashboards": meta.QueryParams = []parameterMeta{ {Name: "page", In: "query", Description: "Page number.", Example: 1}, @@ -592,22 +665,309 @@ func describeRoute(route normalizedRoute) routeMeta { {Name: "kandang_ids", In: "query", Description: "Comma separated kandang ids.", Example: "1,2"}, {Name: "include", In: "query", Description: "Comma separated dashboard sections to include.", Example: "performance,summary"}, } - case "/api/closings/:projectFlockId/sapronak", "/api/closings/:projectFlockId/sapronak/summary": - meta.ListStyle = route.Path == "/api/closings/:projectFlockId/sapronak" + case "/api/closings/:projectFlockId/sapronak": + meta.ListStyle = true meta.QueryParams = []parameterMeta{ - {Name: "type", In: "query", Description: "Required sapronak direction.", Required: true, Example: "incoming", PostmanValue: "incoming", IncludePostman: true}, + {Name: "type", In: "query", Description: "Required sapronak direction.", Required: true, Example: "incoming", PostmanValue: "incoming"}, + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, {Name: "search", In: "query", Description: "Search keyword.", Example: "pakan"}, - {Name: "kandang_id", In: "query", Description: "Optional kandang id filter.", Example: 1}, + {Name: "kandang_id", In: "query", Description: "Optional kandang id filter.", Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, + } + case "/api/closings/:projectFlockId/sapronak/summary": + meta.ListStyle = false + meta.QueryParams = []parameterMeta{ + {Name: "type", In: "query", Description: "Required sapronak direction.", Required: true, Example: "incoming", PostmanValue: "incoming"}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "pakan"}, + {Name: "kandang_id", In: "query", Description: "Optional kandang id filter.", Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, } case "/api/closings/:projectFlockId/production-data", "/api/closings/:projectFlockId/keuangan": meta.ListStyle = false meta.QueryParams = []parameterMeta{ - {Name: "kandang_id", In: "query", Description: "Optional kandang id filter.", Example: 1}, + {Name: "kandang_id", In: "query", Description: "Optional kandang id filter.", Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, } case "/api/closings/:project_flock_id/expedition-hpp": meta.ListStyle = false meta.QueryParams = []parameterMeta{ - {Name: "project_flock_kandang_id", In: "query", Description: "Optional project flock kandang id filter.", Example: 1}, + {Name: "project_flock_kandang_id", In: "query", Description: "Optional project flock kandang id filter.", Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, + } + case "/api/inventory/adjustments": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "product_id", In: "query", Description: "Product id filter.", Example: 1, PostmanValue: "{{product_id}}"}, + {Name: "warehouse_id", In: "query", Description: "Warehouse id filter.", Example: 1, PostmanValue: "{{warehouse_id}}"}, + {Name: "transaction_type", In: "query", Description: "Transaction type filter.", Example: "IN"}, + {Name: "transaction_subtype", In: "query", Description: "Transaction subtype filter.", Example: "ADJUSTMENT"}, + {Name: "function_code", In: "query", Description: "Function code filter.", Example: "MANUAL_ADJUSTMENT"}, + } + case "/api/inventory/product-stocks": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "pakan"}, + } + case "/api/inventory/product-warehouses": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "gudang"}, + {Name: "product_id", In: "query", Description: "Product id filter.", Example: 1, PostmanValue: "{{product_id}}"}, + {Name: "warehouse_id", In: "query", Description: "Warehouse id filter.", Example: 1, PostmanValue: "{{warehouse_id}}"}, + {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1, PostmanValue: "{{location_id}}"}, + {Name: "flags", In: "query", Description: "Stock flags filter.", Example: "DOC"}, + {Name: "kandang_id", In: "query", Description: "Kandang id filter.", Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, + {Name: "available_only", In: "query", Description: "Show available stock only.", Example: true}, + {Name: "transfer_context", In: "query", Description: "Transfer context filter.", Example: "inventory_transfer"}, + {Name: "stock_mode", In: "query", Description: "Stock mode filter.", Example: "exclude_chickin"}, + {Name: "type", In: "query", Description: "Warehouse stock type filter.", Example: "incoming"}, + } + case "/api/inventory/transfers": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "TRF"}, + } + case "/api/marketing": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "delivery"}, + {Name: "product_ids", In: "query", Description: "Comma separated product ids.", Example: "1,2"}, + {Name: "status", In: "query", Description: "Delivery status filter.", Example: "DRAFT"}, + {Name: "customer_id", In: "query", Description: "Customer id filter.", Example: 1, PostmanValue: "{{customer_id}}"}, + {Name: "marketing_id", In: "query", Description: "Marketing id filter.", Example: 1}, + } + case "/api/master-data/areas": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "bandung"}, + } + case "/api/master-data/banks": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "bca"}, + } + case "/api/master-data/config-checklists": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "harian"}, + } + case "/api/master-data/customers": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "pt"}, + {Name: "has_marketing", In: "query", Description: "Filter customer by marketing relation.", Example: true}, + } + case "/api/master-data/employees": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "andi"}, + {Name: "kandang_id", In: "query", Description: "Kandang id filter.", Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, + {Name: "is_active", In: "query", Description: "Active status filter.", Example: true}, + } + case "/api/master-data/fcrs": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "fcr"}, + } + case "/api/master-data/flocks": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "layer"}, + } + case "/api/master-data/kandang-groups": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "blok"}, + {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1, PostmanValue: "{{location_id}}"}, + {Name: "pic_id", In: "query", Description: "Person in charge id filter.", Example: 1, PostmanValue: "{{employee_id}}"}, + } + case "/api/master-data/kandangs": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "kandang"}, + {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1, PostmanValue: "{{location_id}}"}, + {Name: "pic_id", In: "query", Description: "Person in charge id filter.", Example: 1, PostmanValue: "{{employee_id}}"}, + } + case "/api/master-data/locations": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "farm"}, + {Name: "area_id", In: "query", Description: "Area id filter.", Example: 1, PostmanValue: "{{area_id}}"}, + {Name: "has_laying", In: "query", Description: "Filter laying locations only.", Example: false}, + } + case "/api/master-data/nonstocks": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "vitamin"}, + {Name: "supplier_id", In: "query", Description: "Supplier id filter.", Example: 1, PostmanValue: "{{supplier_id}}"}, + } + case "/api/master-data/phase-activities": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "cek pakan"}, + {Name: "phase_ids", In: "query", Description: "Comma separated phase ids.", Example: "1,2"}, + } + case "/api/master-data/phases": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "starter"}, + {Name: "category", In: "query", Description: "Phase category filter.", Example: "Growing"}, + } + case "/api/master-data/product-categories": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "pakan"}, + } + case "/api/master-data/production-standards": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "standar"}, + {Name: "project_category", In: "query", Description: "Project category filter.", Example: "GROWING"}, + } + case "/api/master-data/products": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "jagung"}, + {Name: "product_category_id", In: "query", Description: "Product category id filter.", Example: 1, PostmanValue: "{{product_category_id}}"}, + {Name: "is_depletion", In: "query", Description: "Filter depletion products.", Example: false}, + {Name: "include_all", In: "query", Description: "Include all products regardless of status.", Example: false}, + } + case "/api/master-data/suppliers": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "supplier"}, + {Name: "flag", In: "query", Description: "Supplier type flag filter.", Example: "ACTIVE"}, + {Name: "category", In: "query", Description: "Supplier category filter.", Example: "PAKAN"}, + } + case "/api/master-data/uoms": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "kg"}, + } + case "/api/master-data/warehouses": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "gudang"}, + {Name: "area_id", In: "query", Description: "Area id filter.", Example: 1, PostmanValue: "{{area_id}}"}, + {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1, PostmanValue: "{{location_id}}"}, + {Name: "active_project_flock", In: "query", Description: "Filter only active project flock warehouses.", Example: false}, + {Name: "transfer_context", In: "query", Description: "Transfer context filter.", Example: "inventory_transfer"}, + } + case "/api/production/project-flock-kandangs": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "kandang"}, + {Name: "name_with_periode", In: "query", Description: "Return name-with-period projection.", Example: false}, + {Name: "project_flock_id", In: "query", Description: "Project flock id filter.", Example: 1, PostmanValue: "{{project_flock_id}}"}, + {Name: "kandang_id", In: "query", Description: "Kandang id filter.", Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, + {Name: "category", In: "query", Description: "Project category filter.", Example: "Growing"}, + {Name: "area_id", In: "query", Description: "Area id filter.", Example: 1, PostmanValue: "{{area_id}}"}, + {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1, PostmanValue: "{{location_id}}"}, + {Name: "sort_by", In: "query", Description: "Sort field.", Example: "created_at"}, + {Name: "sort_order", In: "query", Description: "Sort order.", Example: "ASC"}, + {Name: "step_name", In: "query", Description: "Approval step name filter.", Example: "Pengajuan"}, + } + case "/api/production/project-flocks": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "flock"}, + {Name: "sort_by", In: "query", Description: "Sort field.", Example: "created_at"}, + {Name: "sort_order", In: "query", Description: "Sort order.", Example: "asc"}, + {Name: "area_id", In: "query", Description: "Area id filter.", Example: 1, PostmanValue: "{{area_id}}"}, + {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1, PostmanValue: "{{location_id}}"}, + {Name: "period", In: "query", Description: "Project period filter.", Example: 1}, + {Name: "category", In: "query", Description: "Project category filter.", Example: "Growing"}, + {Name: "status", In: "query", Description: "Project status filter.", Example: "Aktif"}, + {Name: "kandang_id", In: "query", Description: "Comma separated kandang ids.", Example: "1,2"}, + {Name: "transfer_context", In: "query", Description: "Transfer context filter.", Example: "transfer_to_laying"}, + } + case "/api/production/project-flocks/kandangs/lookup": + meta.ListStyle = false + meta.QueryParams = []parameterMeta{ + {Name: "project_flock_id", In: "query", Description: "Project flock id.", Required: true, Example: 1, PostmanValue: "{{project_flock_id}}"}, + {Name: "kandang_id", In: "query", Description: "Kandang id.", Required: true, Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, + {Name: "withpopulation", In: "query", Description: "Include population value in response.", Example: false}, + {Name: "record_date", In: "query", Description: "Reference date (YYYY-MM-DD).", Example: "2026-01-01"}, + } + case "/api/production/recordings": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "project_flock_kandang_id", In: "query", Description: "Project flock kandang id filter.", Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "record"}, + {Name: "export", In: "query", Description: "Export mode.", Example: "excel"}, + } + case "/api/production/recordings/next-day": + meta.ListStyle = false + meta.QueryParams = []parameterMeta{ + {Name: "project_flock_kandang_id", In: "query", Description: "Project flock kandang id.", Required: true, Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, + {Name: "record_date", In: "query", Description: "Recording date (YYYY-MM-DD).", Required: true, Example: "2026-01-01"}, + } + case "/api/production/transfer_layings": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "transfer"}, + {Name: "start_date", In: "query", Description: "Start date (YYYY-MM-DD).", Example: "2026-01-01"}, + {Name: "end_date", In: "query", Description: "End date (YYYY-MM-DD).", Example: "2026-01-31"}, + {Name: "flock_source", In: "query", Description: "Comma separated source flock ids.", Example: "1,2"}, + {Name: "flock_destination", In: "query", Description: "Comma separated destination flock ids.", Example: "3,4"}, + {Name: "status", In: "query", Description: "Comma separated status values.", Example: "DRAFT,APPROVED"}, + } + case "/api/production/uniformities": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "project_flock_kandang_id", In: "query", Description: "Project flock kandang id filter.", Example: 1, PostmanValue: "{{project_flock_kandang_id}}"}, + {Name: "week", In: "query", Description: "Week number filter.", Example: 1}, + {Name: "start_date", In: "query", Description: "Start date (YYYY-MM-DD).", Example: "2026-01-01"}, + {Name: "end_date", In: "query", Description: "End date (YYYY-MM-DD).", Example: "2026-01-31"}, + {Name: "with_chart", In: "query", Description: "Include chart payload.", Example: false}, + } + case "/api/purchases": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "supplier_id", In: "query", Description: "Supplier id filter.", Example: 1, PostmanValue: "{{supplier_id}}"}, + {Name: "area_id", In: "query", Description: "Area id filter.", Example: 1, PostmanValue: "{{area_id}}"}, + {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1, PostmanValue: "{{location_id}}"}, + {Name: "product_category_id", In: "query", Description: "Product category id filter.", Example: "1"}, + {Name: "approval_status", In: "query", Description: "Approval status filter.", Example: "PENDING"}, + {Name: "po_date", In: "query", Description: "PO date (YYYY-MM-DD).", Example: "2026-01-01"}, + {Name: "po_date_from", In: "query", Description: "PO date start (YYYY-MM-DD).", Example: "2026-01-01"}, + {Name: "po_date_to", In: "query", Description: "PO date end (YYYY-MM-DD).", Example: "2026-01-31"}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "PO-"}, + {Name: "created_from", In: "query", Description: "Created date start (YYYY-MM-DD).", Example: "2026-01-01"}, + {Name: "created_to", In: "query", Description: "Created date end (YYYY-MM-DD).", Example: "2026-01-31"}, + } + case "/api/users": + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "admin"}, } case "/api/reports/expense": meta.QueryParams = []parameterMeta{ @@ -616,6 +976,9 @@ func describeRoute(route normalizedRoute) routeMeta { {Name: "search", In: "query", Description: "Search keyword.", Example: "operasional"}, {Name: "category", In: "query", Description: "Expense category filter.", Example: "BOP"}, {Name: "supplier_id", In: "query", Description: "Supplier id filter.", Example: 1}, + {Name: "kandang_id", In: "query", Description: "Kandang id filter.", Example: 1}, + {Name: "project_flock_kandang_id", In: "query", Description: "Project flock kandang id filter.", Example: 1}, + {Name: "nonstock_id", In: "query", Description: "Nonstock id filter.", Example: 1}, {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1}, {Name: "area_id", In: "query", Description: "Area id filter.", Example: 1}, {Name: "realization_date", In: "query", Description: "Realization date filter (YYYY-MM-DD).", Example: "2026-01-15"}, @@ -624,19 +987,32 @@ func describeRoute(route normalizedRoute) routeMeta { meta.QueryParams = []parameterMeta{ {Name: "page", In: "query", Description: "Page number.", Example: 1}, {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "search", In: "query", Description: "Search keyword.", Example: "SO-"}, + {Name: "customer_id", In: "query", Description: "Customer id filter.", Example: 1}, + {Name: "product_id", In: "query", Description: "Product id filter.", Example: 1}, + {Name: "warehouse_id", In: "query", Description: "Warehouse id filter.", Example: 1}, + {Name: "sales_person_id", In: "query", Description: "Sales person id filter.", Example: 1}, + {Name: "area_id", In: "query", Description: "Area id filter.", Example: 1}, + {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1}, + {Name: "marketing_type", In: "query", Description: "Marketing type filter.", Example: "ayam"}, + {Name: "filter_by", In: "query", Description: "Date field filter.", Example: "so_date"}, {Name: "start_date", In: "query", Description: "Period start date (YYYY-MM-DD).", Example: "2026-01-01"}, {Name: "end_date", In: "query", Description: "Period end date (YYYY-MM-DD).", Example: "2026-01-31"}, - {Name: "customer_id", In: "query", Description: "Customer id filter.", Example: 1}, - {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1}, + {Name: "sort_by", In: "query", Description: "Sort field.", Example: "so_date"}, + {Name: "sort_order", In: "query", Description: "Sort order.", Example: "asc"}, } case "/api/reports/purchase-supplier": meta.QueryParams = []parameterMeta{ {Name: "page", In: "query", Description: "Page number.", Example: 1}, {Name: "limit", In: "query", Description: "Page size.", Example: 10}, + {Name: "area_id", In: "query", Description: "Comma separated area ids.", Example: "1,2"}, + {Name: "supplier_id", In: "query", Description: "Comma separated supplier ids.", Example: "1,2"}, + {Name: "product_id", In: "query", Description: "Comma separated product ids.", Example: "1,2"}, + {Name: "product_category_id", In: "query", Description: "Comma separated product category ids.", Example: "1,2"}, {Name: "start_date", In: "query", Description: "Period start date (YYYY-MM-DD).", Example: "2026-01-01"}, {Name: "end_date", In: "query", Description: "Period end date (YYYY-MM-DD).", Example: "2026-01-31"}, - {Name: "supplier_id", In: "query", Description: "Comma separated supplier ids.", Example: "1,2"}, - {Name: "area_id", In: "query", Description: "Comma separated area ids.", Example: "1,2"}, + {Name: "sort_by", In: "query", Description: "Sort field.", Example: "created_at"}, + {Name: "filter_by", In: "query", Description: "Filter field.", Example: "received_date"}, } case "/api/reports/debt-supplier": meta.QueryParams = []parameterMeta{ @@ -644,7 +1020,9 @@ func describeRoute(route normalizedRoute) routeMeta { {Name: "limit", In: "query", Description: "Page size.", Example: 10}, {Name: "start_date", In: "query", Description: "Period start date (YYYY-MM-DD).", Example: "2026-01-01"}, {Name: "end_date", In: "query", Description: "Period end date (YYYY-MM-DD).", Example: "2026-01-31"}, - {Name: "supplier_ids", In: "query", Description: "Comma separated supplier ids.", Example: "1,2", PostmanValue: "{{supplier_id}}", IncludePostman: true}, + {Name: "supplier_ids", In: "query", Description: "Comma separated supplier ids.", Example: "1,2", PostmanValue: "{{supplier_id}}"}, + {Name: "filter_by", In: "query", Description: "Date field filter.", Example: "received_date"}, + {Name: "sort_order", In: "query", Description: "Sort order.", Example: "asc"}, } case "/api/reports/customer-payment": meta.QueryParams = []parameterMeta{ @@ -652,34 +1030,46 @@ func describeRoute(route normalizedRoute) routeMeta { {Name: "limit", In: "query", Description: "Page size.", Example: 10}, {Name: "start_date", In: "query", Description: "Period start date (YYYY-MM-DD).", Example: "2026-01-01"}, {Name: "end_date", In: "query", Description: "Period end date (YYYY-MM-DD).", Example: "2026-01-31"}, - {Name: "customer_ids", In: "query", Description: "Comma separated customer ids.", Example: "1,2", PostmanValue: "{{customer_id}}", IncludePostman: true}, + {Name: "customer_ids", In: "query", Description: "Comma separated customer ids.", Example: "1,2", PostmanValue: "{{customer_id}}"}, + {Name: "filter_by", In: "query", Description: "Date field filter.", Example: "TRANS_DATE"}, } case "/api/reports/hpp-per-kandang": meta.QueryParams = []parameterMeta{ {Name: "page", In: "query", Description: "Page number.", Example: 1}, {Name: "limit", In: "query", Description: "Page size.", Example: 10}, - {Name: "period", In: "query", Description: "Daily period filter (YYYY-MM).", Example: "2026-01"}, - {Name: "location_id", In: "query", Description: "Location id filter.", Example: 1}, - {Name: "kandang_id", In: "query", Description: "Kandang id filter.", Example: 1}, + {Name: "period", In: "query", Description: "Daily period filter (YYYY-MM-DD).", Example: "2026-01-01"}, + {Name: "show_unrecorded", In: "query", Description: "Include unrecorded data.", Example: false}, + {Name: "area_id", In: "query", Description: "Comma separated area ids.", Example: "1,2"}, + {Name: "location_id", In: "query", Description: "Comma separated location ids.", Example: "1,2"}, + {Name: "kandang_id", In: "query", Description: "Comma separated kandang ids.", Example: "1,2"}, + {Name: "weight_min", In: "query", Description: "Minimum body weight filter.", Example: "1.2"}, + {Name: "weight_max", In: "query", Description: "Maximum body weight filter.", Example: "1.8"}, + } + case "/api/reports/production-result/:idProjectFlockKandang": + meta.ListStyle = false + meta.QueryParams = []parameterMeta{ + {Name: "page", In: "query", Description: "Page number.", Example: 1}, + {Name: "limit", In: "query", Description: "Page size.", Example: 10}, } case "/api/finance/transactions": meta.QueryParams = []parameterMeta{ {Name: "page", In: "query", Description: "Page number.", Example: 1}, {Name: "limit", In: "query", Description: "Page size.", Example: 10}, {Name: "search", In: "query", Description: "Search keyword.", Example: "invoice"}, - {Name: "bank_ids", In: "query", Description: "Comma separated bank ids.", Example: "1,2", PostmanValue: "{{bank_id}}", IncludePostman: true}, + {Name: "bank_ids", In: "query", Description: "Comma separated bank ids.", Example: "1,2", PostmanValue: "{{bank_id}}"}, {Name: "customer_ids", In: "query", Description: "Comma separated customer ids.", Example: "1,2"}, {Name: "supplier_ids", In: "query", Description: "Comma separated supplier ids.", Example: "1,2"}, {Name: "transaction_types", In: "query", Description: "Comma separated transaction types.", Example: "payment,initial_balance"}, + {Name: "sort_date", In: "query", Description: "Sort date basis.", Example: "created_at"}, {Name: "start_date", In: "query", Description: "Start date (YYYY-MM-DD).", Example: "2026-01-01"}, {Name: "end_date", In: "query", Description: "End date (YYYY-MM-DD).", Example: "2026-01-31"}, } } - if route.Path == "/healthz" { + if routePath == "/healthz" { meta.Summary = "Health check" meta.Description = "Simple liveness probe." - } else if route.Path == "/readyz" { + } else if routePath == "/readyz" { meta.Summary = "Readiness check" meta.Description = "Readiness probe for database and Redis." }