723 lines
18 KiB
YAML
723 lines
18 KiB
YAML
openapi: 3.0.3
|
|
info:
|
|
title: Walet Inventory API
|
|
version: 1.0.0
|
|
description: API untuk sistem inventory sarang burung walet berbasis lot, traceability, sorting, dan partial sales allocation.
|
|
servers:
|
|
- url: /api/v1
|
|
paths:
|
|
/auth/login:
|
|
post:
|
|
summary: Login
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required: [email, password]
|
|
properties:
|
|
email:
|
|
type: string
|
|
password:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Login success
|
|
/suppliers:
|
|
get:
|
|
summary: List suppliers
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
id: { type: integer }
|
|
code: { type: string }
|
|
name: { type: string }
|
|
phone: { type: string }
|
|
email: { type: string }
|
|
bank_name: { type: string }
|
|
bank_account_number: { type: string }
|
|
address: { type: string }
|
|
post:
|
|
summary: Create supplier
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
code:
|
|
type: string
|
|
name:
|
|
type: string
|
|
phone:
|
|
type: string
|
|
email:
|
|
type: string
|
|
bank_name:
|
|
type: string
|
|
bank_account_number:
|
|
type: string
|
|
address:
|
|
type: string
|
|
responses:
|
|
'201':
|
|
description: Created
|
|
/customers:
|
|
get:
|
|
summary: List customers
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
id: { type: integer }
|
|
code: { type: string }
|
|
name: { type: string }
|
|
phone: { type: string }
|
|
email: { type: string }
|
|
bank_name: { type: string }
|
|
bank_account_number: { type: string }
|
|
address: { type: string }
|
|
post:
|
|
summary: Create customer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
code:
|
|
type: string
|
|
name:
|
|
type: string
|
|
phone:
|
|
type: string
|
|
email:
|
|
type: string
|
|
bank_name:
|
|
type: string
|
|
bank_account_number:
|
|
type: string
|
|
address:
|
|
type: string
|
|
responses:
|
|
'201':
|
|
description: Created
|
|
/item-types:
|
|
get:
|
|
summary: List item types
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/item-grades:
|
|
get:
|
|
summary: List item grades
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/warehouses:
|
|
get:
|
|
summary: List warehouses
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/purchases:
|
|
get:
|
|
summary: List purchases
|
|
parameters:
|
|
- in: query
|
|
name: supplier_id
|
|
schema: { type: integer }
|
|
- in: query
|
|
name: status
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
post:
|
|
summary: Create purchase
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreatePurchaseRequest'
|
|
responses:
|
|
'201':
|
|
description: Created
|
|
/purchases/{id}:
|
|
get:
|
|
summary: Purchase detail
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/receipts:
|
|
get:
|
|
summary: List receipts
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
post:
|
|
summary: Create receipt
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreateReceiptRequest'
|
|
responses:
|
|
'201':
|
|
description: Created
|
|
/receipts/{id}/generate-lots:
|
|
post:
|
|
summary: Generate lots from receipt
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
responses:
|
|
'200':
|
|
description: Lots generated
|
|
/lots:
|
|
get:
|
|
summary: List inventory lots
|
|
parameters:
|
|
- in: query
|
|
name: supplier_id
|
|
schema: { type: integer }
|
|
- in: query
|
|
name: item_type_id
|
|
schema: { type: integer }
|
|
- in: query
|
|
name: item_grade_id
|
|
schema: { type: integer }
|
|
- in: query
|
|
name: warehouse_id
|
|
schema: { type: integer }
|
|
- in: query
|
|
name: status
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/lots/{id}:
|
|
get:
|
|
summary: Lot detail
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/lots/{id}/movements:
|
|
get:
|
|
summary: Lot movement history
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/lots/{id}/trace:
|
|
get:
|
|
summary: Lot traceability detail
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/lots/{id}/hold:
|
|
post:
|
|
summary: Hold lot
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
responses:
|
|
'200':
|
|
description: Lot held
|
|
/lots/{id}/release:
|
|
post:
|
|
summary: Release lot
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
responses:
|
|
'200':
|
|
description: Lot released
|
|
/lots/{id}/transfer:
|
|
post:
|
|
summary: Transfer lot
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
to_warehouse_id:
|
|
type: integer
|
|
to_location_id:
|
|
type: integer
|
|
qty:
|
|
type: number
|
|
notes:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Transfer success
|
|
/sorting-sessions:
|
|
get:
|
|
summary: List sorting sessions
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
post:
|
|
summary: Create sorting session
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreateSortingSessionRequest'
|
|
responses:
|
|
'201':
|
|
description: Created
|
|
/lots/{id}/regrade:
|
|
post:
|
|
summary: Regrade lot
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required: [target_grade_id, qty, reason_id]
|
|
properties:
|
|
target_grade_id:
|
|
type: integer
|
|
qty:
|
|
type: number
|
|
reason_id:
|
|
type: integer
|
|
notes:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Regrade success
|
|
/sales:
|
|
get:
|
|
summary: List sales
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
post:
|
|
summary: Create sales order
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreateSalesRequest'
|
|
responses:
|
|
'201':
|
|
description: Created
|
|
/sales/{id}:
|
|
get:
|
|
summary: Sales detail
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/sales/{id}/allocate:
|
|
post:
|
|
summary: Manual allocate lots to sales lines
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AllocateSalesRequest'
|
|
responses:
|
|
'200':
|
|
description: Allocation success
|
|
/sales/{id}/auto-allocate:
|
|
post:
|
|
summary: Auto allocate by policy
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
policy:
|
|
type: string
|
|
example: FIFO
|
|
responses:
|
|
'200':
|
|
description: Auto allocation success
|
|
/sales/{id}/confirm-picking:
|
|
post:
|
|
summary: Confirm picked quantities
|
|
parameters:
|
|
- $ref: '#/components/parameters/IdParam'
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ConfirmPickingRequest'
|
|
responses:
|
|
'200':
|
|
description: Picking confirmed
|
|
/stock-adjustments:
|
|
get:
|
|
summary: List stock adjustments
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
post:
|
|
summary: Create stock adjustment
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreateStockAdjustmentRequest'
|
|
responses:
|
|
'201':
|
|
description: Created
|
|
/sales-returns:
|
|
post:
|
|
summary: Create sales return
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreateSalesReturnRequest'
|
|
responses:
|
|
'201':
|
|
description: Created
|
|
/purchase-returns:
|
|
post:
|
|
summary: Create purchase return
|
|
responses:
|
|
'201':
|
|
description: Created
|
|
/barcode/lookup/{value}:
|
|
get:
|
|
summary: Lookup lot by barcode or QR value
|
|
parameters:
|
|
- in: path
|
|
name: value
|
|
required: true
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/reports/stock-summary:
|
|
get:
|
|
summary: Stock summary report
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/reports/stock-lots:
|
|
get:
|
|
summary: Stock lots report
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/reports/purchases:
|
|
get:
|
|
summary: Purchases report
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/reports/sales:
|
|
get:
|
|
summary: Sales report
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/reports/margins:
|
|
get:
|
|
summary: Margin report
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/reports/shrinkage:
|
|
get:
|
|
summary: Shrinkage report
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/reports/supplier-quality:
|
|
get:
|
|
summary: Supplier quality report
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
/reports/traceability:
|
|
get:
|
|
summary: Traceability report
|
|
parameters:
|
|
- in: query
|
|
name: sales_id
|
|
schema: { type: integer }
|
|
- in: query
|
|
name: lot_id
|
|
schema: { type: integer }
|
|
responses:
|
|
'200':
|
|
description: OK
|
|
components:
|
|
parameters:
|
|
IdParam:
|
|
in: path
|
|
name: id
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
schemas:
|
|
CreatePurchaseRequest:
|
|
type: object
|
|
required: [supplier_id, purchase_date, lines]
|
|
properties:
|
|
supplier_id:
|
|
type: integer
|
|
purchase_date:
|
|
type: string
|
|
format: date
|
|
supplier_invoice_no:
|
|
type: string
|
|
notes:
|
|
type: string
|
|
lines:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required: [item_type_id, qty_ordered, unit_id, unit_price, classification_status]
|
|
properties:
|
|
item_type_id:
|
|
type: integer
|
|
item_grade_id:
|
|
type: integer
|
|
nullable: true
|
|
qty_ordered:
|
|
type: number
|
|
unit_id:
|
|
type: integer
|
|
unit_price:
|
|
type: number
|
|
classification_status:
|
|
type: string
|
|
CreateReceiptRequest:
|
|
type: object
|
|
required: [purchase_id, supplier_id, receipt_date, lines]
|
|
properties:
|
|
purchase_id:
|
|
type: integer
|
|
supplier_id:
|
|
type: integer
|
|
receipt_date:
|
|
type: string
|
|
format: date
|
|
notes:
|
|
type: string
|
|
lines:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required: [purchase_line_id, item_type_id, qty_received, qty_accepted, unit_id, unit_cost, warehouse_id]
|
|
properties:
|
|
purchase_line_id:
|
|
type: integer
|
|
item_type_id:
|
|
type: integer
|
|
item_grade_id:
|
|
type: integer
|
|
nullable: true
|
|
qty_received:
|
|
type: number
|
|
qty_accepted:
|
|
type: number
|
|
qty_rejected:
|
|
type: number
|
|
unit_id:
|
|
type: integer
|
|
unit_cost:
|
|
type: number
|
|
warehouse_id:
|
|
type: integer
|
|
warehouse_location_id:
|
|
type: integer
|
|
CreateSortingSessionRequest:
|
|
type: object
|
|
required: [source_lot_id, sorting_date, input_qty, results]
|
|
properties:
|
|
source_lot_id:
|
|
type: integer
|
|
sorting_date:
|
|
type: string
|
|
format: date-time
|
|
input_qty:
|
|
type: number
|
|
shrinkage_qty:
|
|
type: number
|
|
notes:
|
|
type: string
|
|
results:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required: [item_type_id, item_grade_id, qty_result, unit_cost]
|
|
properties:
|
|
item_type_id:
|
|
type: integer
|
|
item_grade_id:
|
|
type: integer
|
|
qty_result:
|
|
type: number
|
|
unit_cost:
|
|
type: number
|
|
CreateSalesRequest:
|
|
type: object
|
|
required: [customer_id, sales_date, lines]
|
|
properties:
|
|
customer_id:
|
|
type: integer
|
|
sales_date:
|
|
type: string
|
|
format: date
|
|
notes:
|
|
type: string
|
|
lines:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required: [item_type_id, item_grade_id, qty_sold, unit_id, selling_price]
|
|
properties:
|
|
item_type_id:
|
|
type: integer
|
|
item_grade_id:
|
|
type: integer
|
|
qty_sold:
|
|
type: number
|
|
unit_id:
|
|
type: integer
|
|
selling_price:
|
|
type: number
|
|
AllocateSalesRequest:
|
|
type: object
|
|
required: [lines]
|
|
properties:
|
|
lines:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required: [sales_line_id, allocations]
|
|
properties:
|
|
sales_line_id:
|
|
type: integer
|
|
allocations:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required: [inventory_lot_id, qty_allocated]
|
|
properties:
|
|
inventory_lot_id:
|
|
type: integer
|
|
qty_allocated:
|
|
type: number
|
|
ConfirmPickingRequest:
|
|
type: object
|
|
required: [lines]
|
|
properties:
|
|
lines:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required: [sales_line_id, picked_allocations]
|
|
properties:
|
|
sales_line_id:
|
|
type: integer
|
|
picked_allocations:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required: [inventory_lot_id, qty_picked]
|
|
properties:
|
|
inventory_lot_id:
|
|
type: integer
|
|
qty_picked:
|
|
type: number
|
|
CreateStockAdjustmentRequest:
|
|
type: object
|
|
required: [inventory_lot_id, adjustment_type, reason_id, qty_change]
|
|
properties:
|
|
inventory_lot_id:
|
|
type: integer
|
|
adjustment_type:
|
|
type: string
|
|
reason_id:
|
|
type: integer
|
|
qty_change:
|
|
type: number
|
|
notes:
|
|
type: string
|
|
CreateSalesReturnRequest:
|
|
type: object
|
|
required: [sales_id, customer_id, return_date, lines]
|
|
properties:
|
|
sales_id:
|
|
type: integer
|
|
customer_id:
|
|
type: integer
|
|
return_date:
|
|
type: string
|
|
format: date
|
|
lines:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required: [sales_line_id, item_type_id, item_grade_id, qty_returned]
|
|
properties:
|
|
sales_line_id:
|
|
type: integer
|
|
inventory_lot_id:
|
|
type: integer
|
|
item_type_id:
|
|
type: integer
|
|
item_grade_id:
|
|
type: integer
|
|
qty_returned:
|
|
type: number
|
|
return_condition:
|
|
type: string
|
|
resolution:
|
|
type: string
|
|
notes:
|
|
type: string
|