281 lines
7.9 KiB
YAML
281 lines
7.9 KiB
YAML
openapi: 3.0.3
|
|
info:
|
|
title: Inventory API - Al Rahma Sunday School
|
|
version: 1.0.0
|
|
description: Manage inventory items and movements.
|
|
servers:
|
|
- url: https://alrahmaisgl.org/api/v1
|
|
security:
|
|
- BearerAuth: []
|
|
tags:
|
|
- name: Inventory
|
|
description: Items and movements
|
|
|
|
paths:
|
|
/inventory:
|
|
get:
|
|
tags: [Inventory]
|
|
summary: List inventory items
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
schema: { type: integer, example: 1 }
|
|
- name: per_page
|
|
in: query
|
|
schema: { type: integer, example: 20 }
|
|
- name: type
|
|
in: query
|
|
schema: { type: string, enum: [classroom, book, office, kitchen] }
|
|
- name: school_year
|
|
in: query
|
|
schema: { type: string }
|
|
- name: semester
|
|
in: query
|
|
schema: { type: string }
|
|
responses:
|
|
200:
|
|
description: Paginated items
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedInventoryResponse'
|
|
post:
|
|
tags: [Inventory]
|
|
summary: Create inventory item
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreateInventoryItemRequest'
|
|
responses:
|
|
201:
|
|
description: Inventory item created
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InventoryItemResponse'
|
|
|
|
/inventory/{id}:
|
|
get:
|
|
tags: [Inventory]
|
|
summary: Get inventory item
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema: { type: integer }
|
|
responses:
|
|
200:
|
|
description: Item
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InventoryItemResponse'
|
|
404: { description: Not found }
|
|
put:
|
|
tags: [Inventory]
|
|
summary: Update inventory item
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema: { type: integer }
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UpdateInventoryItemRequest'
|
|
responses:
|
|
200:
|
|
description: Updated item
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InventoryItemResponse'
|
|
delete:
|
|
tags: [Inventory]
|
|
summary: Delete inventory item
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema: { type: integer }
|
|
responses:
|
|
200:
|
|
description: Deleted
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/BasicSuccess'
|
|
|
|
/inventory/movements:
|
|
get:
|
|
tags: [Inventory]
|
|
summary: List inventory movements
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
schema: { type: integer, example: 1 }
|
|
- name: per_page
|
|
in: query
|
|
schema: { type: integer, example: 20 }
|
|
- name: item_id
|
|
in: query
|
|
schema: { type: integer }
|
|
responses:
|
|
200:
|
|
description: Paginated movements
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedMovementsResponse'
|
|
post:
|
|
tags: [Inventory]
|
|
summary: Create inventory movement (adjust quantity)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required: [item_id, qty_change, movement_type]
|
|
properties:
|
|
item_id: { type: integer }
|
|
qty_change: { type: integer, description: "positive for add, negative for remove" }
|
|
movement_type: { type: string, enum: [issue, return, purchase, adjustment, correction] }
|
|
reason: { type: string }
|
|
note: { type: string }
|
|
teacher_id: { type: integer }
|
|
student_id: { type: integer }
|
|
class_section_id: { type: integer }
|
|
responses:
|
|
201:
|
|
description: Movement created and item quantity updated
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status: { type: string }
|
|
message: { type: string }
|
|
data:
|
|
type: object
|
|
properties:
|
|
movement: { $ref: '#/components/schemas/Movement' }
|
|
item: { $ref: '#/components/schemas/InventoryItem' }
|
|
|
|
components:
|
|
securitySchemes:
|
|
BearerAuth:
|
|
type: http
|
|
scheme: bearer
|
|
bearerFormat: JWT
|
|
|
|
schemas:
|
|
BasicSuccess:
|
|
type: object
|
|
properties:
|
|
status: { type: string, example: "success" }
|
|
message: { type: string }
|
|
data: {}
|
|
|
|
InventoryItem:
|
|
type: object
|
|
properties:
|
|
id: { type: integer }
|
|
name: { type: string }
|
|
type: { type: string }
|
|
category_id: { type: integer, nullable: true }
|
|
quantity: { type: integer }
|
|
good_qty: { type: integer }
|
|
condition: { type: string }
|
|
notes: { type: string, nullable: true }
|
|
school_year: { type: string }
|
|
semester: { type: string }
|
|
|
|
Movement:
|
|
type: object
|
|
properties:
|
|
id: { type: integer }
|
|
item_id: { type: integer }
|
|
change: { type: integer }
|
|
reason: { type: string }
|
|
created_at: { type: string, format: date-time }
|
|
|
|
PaginatedInventoryResponse:
|
|
type: object
|
|
properties:
|
|
status: { type: string }
|
|
message: { type: string }
|
|
data:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: array
|
|
items: { $ref: '#/components/schemas/InventoryItem' }
|
|
pagination:
|
|
type: object
|
|
properties:
|
|
current_page: { type: integer }
|
|
per_page: { type: integer }
|
|
total: { type: integer }
|
|
total_pages: { type: integer }
|
|
categories:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
id: { type: integer }
|
|
name: { type: string }
|
|
|
|
PaginatedMovementsResponse:
|
|
type: object
|
|
properties:
|
|
status: { type: string }
|
|
message: { type: string }
|
|
data:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: array
|
|
items: { $ref: '#/components/schemas/Movement' }
|
|
pagination:
|
|
type: object
|
|
properties:
|
|
current_page: { type: integer }
|
|
per_page: { type: integer }
|
|
total: { type: integer }
|
|
total_pages: { type: integer }
|
|
|
|
InventoryItemResponse:
|
|
type: object
|
|
properties:
|
|
status: { type: string }
|
|
message: { type: string }
|
|
data: { $ref: '#/components/schemas/InventoryItem' }
|
|
|
|
CreateInventoryItemRequest:
|
|
type: object
|
|
required: [name, type]
|
|
properties:
|
|
name: { type: string }
|
|
type: { type: string, enum: [classroom, book, office, kitchen] }
|
|
category_id: { type: integer, nullable: true }
|
|
quantity: { type: integer, example: 0 }
|
|
good_qty: { type: integer, example: 0 }
|
|
condition: { type: string, example: good }
|
|
school_year: { type: string }
|
|
semester: { type: string }
|
|
|
|
UpdateInventoryItemRequest:
|
|
type: object
|
|
properties:
|
|
name: { type: string }
|
|
category_id: { type: integer }
|
|
quantity: { type: integer }
|
|
good_qty: { type: integer }
|
|
condition: { type: string }
|
|
notes: { type: string }
|