[
 {
  "method": "GET",
  "path": "/health",
  "tag": "health",
  "summary": "Liveness probe",
  "opId": "health",
  "security": "none",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/ready",
  "tag": "health",
  "summary": "Readiness probe (DB + Redis connectivity)",
  "opId": "ready",
  "security": "none",
  "body": null,
  "params": "",
  "responses": "200,503,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/auth/login",
  "tag": "auth",
  "summary": "Log in and obtain an opaque bearer token",
  "opId": "authLogin",
  "security": "none",
  "body": "LoginRequest",
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/auth/register",
  "tag": "auth",
  "summary": "Self-service storefront signup (buyer + linked customer)",
  "opId": "authRegister",
  "security": "none",
  "body": "inline{account_type,name,email,password,phone,company_name,tax_number,referral_code}",
  "params": "",
  "responses": "201,400,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/auth/forgot-password",
  "tag": "auth",
  "summary": "Request a password reset link (always 200, anti-enumeration)",
  "opId": "authForgotPassword",
  "security": "none",
  "body": "inline{email}",
  "params": "",
  "responses": "200,400"
 },
 {
  "method": "POST",
  "path": "/api/v1/auth/reset-password",
  "tag": "auth",
  "summary": "Consume a reset token and set a new password",
  "opId": "authResetPassword",
  "security": "none",
  "body": "inline{token,password}",
  "params": "",
  "responses": "200,400"
 },
 {
  "method": "POST",
  "path": "/api/v1/auth/logout",
  "tag": "auth",
  "summary": "Revoke the current token",
  "opId": "authLogout",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/auth/me",
  "tag": "auth",
  "summary": "Current user profile (+ linked employee)",
  "opId": "authMe",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401,403"
 },
 {
  "method": "PUT",
  "path": "/api/v1/auth/me",
  "tag": "auth",
  "summary": "Update own profile (name/email/password)",
  "opId": "authUpdateMe",
  "security": "bearer",
  "body": "UpdateProfileRequest",
  "params": "",
  "responses": "200,400,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/products",
  "tag": "products",
  "summary": "List products (paginated)",
  "opId": "listProducts",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None;None:None;query:category_id;query:brand_id;query:in_stock",
  "responses": "200,401,403"
 },
 {
  "method": "POST",
  "path": "/api/v1/products",
  "tag": "products",
  "summary": "Create a product",
  "opId": "createProduct",
  "security": "bearer",
  "body": "ProductInput",
  "params": "",
  "responses": "201,400,401,403,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/products/{id}",
  "tag": "products",
  "summary": "Get a product",
  "opId": "getProduct",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/products/{id}",
  "tag": "products",
  "summary": "Update a product",
  "opId": "updateProduct",
  "security": "bearer",
  "body": "ProductInput",
  "params": "",
  "responses": "200,400,401,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/products/{id}",
  "tag": "products",
  "summary": "Soft-delete a product",
  "opId": "deleteProduct",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,401,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/brands",
  "tag": "products",
  "summary": "List brands",
  "opId": "listBrands",
  "security": "bearer",
  "body": null,
  "params": "query:active",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/v1/brands",
  "tag": "products",
  "summary": "Create a brand",
  "opId": "createBrand",
  "security": "bearer",
  "body": "BrandInput",
  "params": "",
  "responses": "201,400,401,403,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/brands/{id}",
  "tag": "products",
  "summary": "Get a brand",
  "opId": "getBrand",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/brands/{id}",
  "tag": "products",
  "summary": "Update a brand",
  "opId": "updateBrand",
  "security": "bearer",
  "body": "BrandInput",
  "params": "",
  "responses": "200,400,401,404,409"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/brands/{id}",
  "tag": "products",
  "summary": "Delete a brand",
  "opId": "deleteBrand",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,401,404,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/products/{id}/units",
  "tag": "products",
  "summary": "List configured selling units of a product",
  "opId": "listProductUnits",
  "security": "bearer",
  "body": null,
  "params": "query:active",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/products/{id}/units",
  "tag": "products",
  "summary": "Configure a selling unit for a product",
  "opId": "createProductUnit",
  "security": "bearer",
  "body": "ProductUnitInput",
  "params": "",
  "responses": "201,400,401,403,404,409,422"
 },
 {
  "method": "PUT",
  "path": "/api/v1/products/{id}/units/{unitConfigID}",
  "tag": "products",
  "summary": "Update a configured selling unit",
  "opId": "updateProductUnit",
  "security": "bearer",
  "body": "ProductUnitInput",
  "params": "",
  "responses": "200,400,401,404,409,422"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/products/{id}/units/{unitConfigID}",
  "tag": "products",
  "summary": "Remove a configured selling unit",
  "opId": "deleteProductUnit",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,401,404,409,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/products/{id}/barcodes",
  "tag": "products",
  "summary": "List product barcodes",
  "opId": "listProductBarcodes",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/products/{id}/barcodes",
  "tag": "products",
  "summary": "Add a product barcode",
  "opId": "createProductBarcode",
  "security": "bearer",
  "body": "ProductBarcodeInput",
  "params": "",
  "responses": "201,400,401,403,404,409,422"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/products/{id}/barcodes/{barcodeID}",
  "tag": "products",
  "summary": "Remove a product barcode",
  "opId": "deleteProductBarcode",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,401,404,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/barcodes/lookup",
  "tag": "products",
  "summary": "Resolve a scanned barcode to a product and configured unit",
  "opId": "lookupBarcode",
  "security": "none",
  "body": null,
  "params": "query:barcode",
  "responses": "200,404,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/cart",
  "tag": "cart",
  "summary": "Get the current user's cart",
  "opId": "getCart",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/cart",
  "tag": "cart",
  "summary": "Clear the current user's cart",
  "opId": "clearCart",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/cart/items",
  "tag": "cart",
  "summary": "Add a product to the cart by SKU",
  "opId": "addCartItem",
  "security": "bearer",
  "body": "CartAddItemInput",
  "params": "",
  "responses": "200,400,401,404"
 },
 {
  "method": "PATCH",
  "path": "/api/v1/cart/items/{id}",
  "tag": "cart",
  "summary": "Update the quantity of a cart item",
  "opId": "updateCartItem",
  "security": "bearer",
  "body": "CartUpdateQuantityInput",
  "params": "",
  "responses": "200,400,401,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/cart/items/{id}",
  "tag": "cart",
  "summary": "Remove a product from the cart",
  "opId": "removeCartItem",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/distribution/map",
  "tag": "distribution",
  "summary": "Map feed \u2014 warehouses, stores and active shipment positions",
  "opId": "distributionMapFeed",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/shipments/{id}/tracking/latest",
  "tag": "distribution",
  "summary": "Latest known GPS fix for one shipment",
  "opId": "shipmentLatestLocation",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200,401,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/geo/route",
  "tag": "geo",
  "summary": "Driving route between two points (provider-abstracted)",
  "opId": "geoRoute",
  "security": "bearer",
  "body": null,
  "params": "query:from_lat;query:from_lng;query:to_lat;query:to_lng",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/geo/geocode",
  "tag": "geo",
  "summary": "Forward/reverse geocoding (provider-abstracted, off by default)",
  "opId": "geoGeocode",
  "security": "bearer",
  "body": null,
  "params": "query:q;query:point_lat;query:point_lng",
  "responses": "200,400,401,403"
 },
 {
  "method": "POST",
  "path": "/api/v1/cart/checkout",
  "tag": "cart",
  "summary": "Convert the cart into a confirmed e-commerce sales order (reserves stock)",
  "opId": "cartCheckout",
  "security": "bearer",
  "body": "CartCheckoutInput",
  "params": "",
  "responses": "201,400,401,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/categories",
  "tag": "products",
  "summary": "List categories (static, no pagination)",
  "opId": "listCategories",
  "security": "none",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/categories",
  "tag": "products",
  "summary": "Create a category",
  "opId": "createCategory",
  "security": "bearer",
  "body": "CategoryInput",
  "params": "",
  "responses": "201,400,401,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/categories/{id}",
  "tag": "products",
  "summary": "Get a category",
  "opId": "getCategory",
  "security": "none",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/categories/{id}",
  "tag": "products",
  "summary": "Update a category",
  "opId": "updateCategory",
  "security": "bearer",
  "body": "CategoryInput",
  "params": "",
  "responses": "200,400,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/categories/{id}",
  "tag": "products",
  "summary": "Delete a category",
  "opId": "deleteCategory",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/units",
  "tag": "products",
  "summary": "List units (static, no pagination)",
  "opId": "listUnits",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/units",
  "tag": "products",
  "summary": "Create a unit",
  "opId": "createUnit",
  "security": "bearer",
  "body": "UnitInput",
  "params": "",
  "responses": "201,400,409"
 },
 {
  "method": "PUT",
  "path": "/api/v1/units/{id}",
  "tag": "products",
  "summary": "Update a unit",
  "opId": "updateUnit",
  "security": "bearer",
  "body": "UnitInput",
  "params": "",
  "responses": "200,400,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/units/{id}",
  "tag": "products",
  "summary": "Delete a unit",
  "opId": "deleteUnit",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/suppliers",
  "tag": "suppliers",
  "summary": "List suppliers (paginated)",
  "opId": "listSuppliers",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/suppliers",
  "tag": "suppliers",
  "summary": "Create a supplier",
  "opId": "createSupplier",
  "security": "bearer",
  "body": "SupplierInput",
  "params": "",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/suppliers/{id}",
  "tag": "suppliers",
  "summary": "Get a supplier",
  "opId": "getSupplier",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/suppliers/{id}",
  "tag": "suppliers",
  "summary": "Update a supplier",
  "opId": "updateSupplier",
  "security": "bearer",
  "body": "SupplierInput",
  "params": "",
  "responses": "200,400,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/suppliers/{id}",
  "tag": "suppliers",
  "summary": "Soft-delete a supplier",
  "opId": "deleteSupplier",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/customers/me",
  "tag": "customers",
  "summary": "The signed-in caller's own company record",
  "opId": "getMyCustomerProfile",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/customers/me",
  "tag": "customers",
  "summary": "Update the signed-in caller's own company record",
  "opId": "updateMyCustomerProfile",
  "security": "bearer",
  "body": "CustomerProfileInput",
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/customers",
  "tag": "customers",
  "summary": "List customers (paginated)",
  "opId": "listCustomers",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/customers",
  "tag": "customers",
  "summary": "Create a customer",
  "opId": "createCustomer",
  "security": "bearer",
  "body": "CustomerInput",
  "params": "",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/customers/search",
  "tag": "customers",
  "summary": "Lightweight customer search (POS / order entry)",
  "opId": "searchCustomers",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/customers/{id}",
  "tag": "customers",
  "summary": "Get a customer",
  "opId": "getCustomer",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/customers/{id}",
  "tag": "customers",
  "summary": "Update a customer",
  "opId": "updateCustomer",
  "security": "bearer",
  "body": "CustomerInput",
  "params": "",
  "responses": "200,400,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/customers/{id}",
  "tag": "customers",
  "summary": "Soft-delete a customer",
  "opId": "deleteCustomer",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/warehouses",
  "tag": "warehouses",
  "summary": "List warehouses (paginated)",
  "opId": "listWarehouses",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/warehouses",
  "tag": "warehouses",
  "summary": "Create a warehouse",
  "opId": "createWarehouse",
  "security": "bearer",
  "body": "WarehouseInput",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/warehouses/{id}",
  "tag": "warehouses",
  "summary": "Get a warehouse",
  "opId": "getWarehouse",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/warehouses/{id}",
  "tag": "warehouses",
  "summary": "Update a warehouse",
  "opId": "updateWarehouse",
  "security": "bearer",
  "body": "WarehouseInput",
  "params": "",
  "responses": "200,400,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/warehouses/{id}",
  "tag": "warehouses",
  "summary": "Delete a warehouse",
  "opId": "deleteWarehouse",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/warehouses/options",
  "tag": "warehouses",
  "summary": "List slim warehouse options for pickers (any authenticated user)",
  "opId": "listWarehouseOptions",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/inventory/stock",
  "tag": "inventory",
  "summary": "List stock, aggregated by product",
  "opId": "listStock",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/inventory/movements",
  "tag": "inventory",
  "summary": "List stock movements (ledger)",
  "opId": "listStockMovements",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/inventory/stock-in",
  "tag": "inventory",
  "summary": "Manual stock-in",
  "opId": "stockIn",
  "security": "bearer",
  "body": "StockInOutInput",
  "params": "",
  "responses": "201,400,401,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/inventory/stock-out",
  "tag": "inventory",
  "summary": "Manual stock-out (checks availability)",
  "opId": "stockOut",
  "security": "bearer",
  "body": "StockInOutInput",
  "params": "",
  "responses": "201,400,409,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/inventory/transfers",
  "tag": "inventory",
  "summary": "List stock transfers",
  "opId": "listTransfers",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/inventory/transfers",
  "tag": "inventory",
  "summary": "Create a stock transfer (draft only)",
  "opId": "createTransfer",
  "security": "bearer",
  "body": "StockTransferInput",
  "params": "",
  "responses": "201,400,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/inventory/transfers/{id}",
  "tag": "inventory",
  "summary": "Get a stock transfer",
  "opId": "getTransfer",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/inventory/transfers/{id}/approve",
  "tag": "inventory",
  "summary": "Approve a stock transfer and execute stock movements",
  "opId": "approveTransfer",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,400,404,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/inventory/opnames",
  "tag": "inventory",
  "summary": "List stock opnames",
  "opId": "listOpnames",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/inventory/opnames",
  "tag": "inventory",
  "summary": "Create a stock opname (snapshot)",
  "opId": "createOpname",
  "security": "bearer",
  "body": "StockOpnameInput",
  "params": "",
  "responses": "201,400,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/inventory/opnames/{id}",
  "tag": "inventory",
  "summary": "Get a stock opname with items",
  "opId": "getOpname",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/inventory/opnames/{id}",
  "tag": "inventory",
  "summary": "Update physical quantities for a stock opname",
  "opId": "updateOpnamePhysical",
  "security": "bearer",
  "body": "inline{items}",
  "params": "",
  "responses": "200,400,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/inventory/opnames/{id}/finalize",
  "tag": "inventory",
  "summary": "Finalize an in-progress opname",
  "opId": "finalizeOpname",
  "security": "bearer",
  "body": "OpnameFinalizeInput",
  "params": "",
  "responses": "200,409,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-orders",
  "tag": "sales",
  "summary": "List sales orders",
  "opId": "listSalesOrders",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None;query:source_type;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-orders",
  "tag": "sales",
  "summary": "Create a (draft) sales order; reserves stock",
  "opId": "createSalesOrder",
  "security": "bearer",
  "body": "SalesOrderInput",
  "params": "",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-orders/{id}",
  "tag": "sales",
  "summary": "Get a sales order with items",
  "opId": "getSalesOrder",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/sales-orders/{id}",
  "tag": "sales",
  "summary": "Update a draft sales order (release + re-reserve stock)",
  "opId": "updateSalesOrder",
  "security": "bearer",
  "body": "SalesOrderInput",
  "params": "",
  "responses": "200,400,409"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/sales-orders/{id}",
  "tag": "sales",
  "summary": "Delete a draft sales order",
  "opId": "deleteSalesOrder",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,409"
 },
 {
  "method": "PATCH",
  "path": "/api/v1/sales-orders/{id}/status",
  "tag": "sales",
  "summary": "Update a sales order's status via one request (ERP lane)",
  "opId": "updateSalesOrderStatus",
  "security": "bearer",
  "body": "inline{status,note}",
  "params": "",
  "responses": "200,400,404,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-orders/{id}/confirm",
  "tag": "sales",
  "summary": "Confirm a draft sales order",
  "opId": "confirmSalesOrder",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-orders/{id}/cancel",
  "tag": "sales",
  "summary": "Cancel a sales order (releases reservations)",
  "opId": "cancelSalesOrder",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,409"
 },
 {
  "method": "PUT",
  "path": "/api/v1/sales-orders/{id}/notes",
  "tag": "sales",
  "summary": "Replace a sales order's notes (empty string or null clears)",
  "opId": "updateSalesOrderNotes",
  "security": "bearer",
  "body": "inline{notes}",
  "params": "",
  "responses": "200,400,404,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/pos",
  "tag": "sales",
  "summary": "Process a POS transaction (order + stock deduction + auto invoice)",
  "opId": "processPos",
  "security": "bearer",
  "body": "PosRequest",
  "params": "None:None",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/pos/{id}/payment-status",
  "tag": "sales",
  "summary": "Till-side recovery poll for a deferred-gateway (QRIS) POS order",
  "opId": "posPaymentStatus",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,401,403,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-orders/supervisors",
  "tag": "sales",
  "summary": "List active supervisors and approvers for sales order submission",
  "opId": "listSalesOrderSupervisors",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-orders/for-return",
  "tag": "sales",
  "summary": "Resolve one order by SO number for the return flow (own stores only)",
  "opId": "lookupOrderForReturn",
  "security": "bearer",
  "body": null,
  "params": "query:number",
  "responses": "200,401,403,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-orders/me",
  "tag": "sales",
  "summary": "List the current buyer's own e-commerce orders",
  "opId": "listMyOrders",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-orders/me/summary",
  "tag": "sales",
  "summary": "Order count summary by lifecycle status for the authenticated buyer",
  "opId": "getMyOrdersSummary",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/account/addresses",
  "tag": "account",
  "summary": "List the authenticated buyer's saved addresses",
  "opId": "listBuyerAddresses",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/account/addresses",
  "tag": "account",
  "summary": "Create a saved address for the authenticated buyer",
  "opId": "createBuyerAddress",
  "security": "bearer",
  "body": "BuyerAddress",
  "params": "",
  "responses": "201,400,401"
 },
 {
  "method": "PUT",
  "path": "/api/v1/account/addresses/{id}",
  "tag": "account",
  "summary": "Replace a saved address owned by the authenticated buyer",
  "opId": "updateBuyerAddress",
  "security": "bearer",
  "body": "BuyerAddress",
  "params": "",
  "responses": "200,400,401,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/account/addresses/{id}",
  "tag": "account",
  "summary": "Delete a saved address owned by the authenticated buyer",
  "opId": "deleteBuyerAddress",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-orders/me/{id}",
  "tag": "sales",
  "summary": "Get the current buyer's own e-commerce order",
  "opId": "getMyOrder",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-orders/{id}/pay",
  "tag": "sales",
  "summary": "Pay the buyer's own e-commerce order (invoice + payment + stock deduction)",
  "opId": "payCheckout",
  "security": "bearer",
  "body": "PayCheckoutRequest",
  "params": "",
  "responses": "200,400,404,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-orders/{id}/snap-token",
  "tag": "sales",
  "summary": "Issue a Midtrans Snap token for the buyer's own e-commerce order",
  "opId": "snapToken",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404,409,503"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-orders/{id}/payment-status",
  "tag": "sales",
  "summary": "Poll the buyer's own order payment status via Midtrans (missed-webhook recovery)",
  "opId": "snapPaymentStatus",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404,409,503"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-orders/payment-reconciliation",
  "tag": "sales",
  "summary": "Report open Snap invoices stranded past Midtrans' webhook retry horizon",
  "opId": "listStrandedSnapInvoices",
  "security": "bearer",
  "body": null,
  "params": "query:limit",
  "responses": "200,401,403,500"
 },
 {
  "method": "POST",
  "path": "/midtrans/notifications",
  "tag": "sales",
  "summary": "Midtrans Payment Notification webhook alias (public, signature-verified)",
  "opId": "midtransNotificationRootAlias",
  "security": "none",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/midtrans/notifications",
  "tag": "sales",
  "summary": "Midtrans Payment Notification webhook alias (public, signature-verified)",
  "opId": "midtransNotificationApiAlias",
  "security": "none",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/v1/midtrans/notifications",
  "tag": "sales",
  "summary": "Midtrans Payment Notification webhook (public, signature-verified)",
  "opId": "midtransNotification",
  "security": "none",
  "body": "inline{order_id,transaction_id,transaction_status,status_code,gross_amount,payment_type,fraud_status,signature_key}",
  "params": "",
  "responses": "200,401,404,409,503"
 },
 {
  "method": "POST",
  "path": "/api/v1/midtrans/sweep",
  "tag": "sales",
  "summary": "Background Snap sweeper, one pass (token-gated, no identifiers)",
  "opId": "midtransSnapSweep",
  "security": "bearer",
  "body": "inline{limit}",
  "params": "",
  "responses": "200,401,404,422,503"
 },
 {
  "method": "GET",
  "path": "/api/v1/invoices/receivables",
  "tag": "invoices",
  "summary": "List receivables (unpaid/partial/overdue invoices)",
  "opId": "listReceivables",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/invoices/receivables/me",
  "tag": "invoices",
  "summary": "List the authenticated buyer's own receivables (B2B surface)",
  "opId": "myReceivables",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/purchase-orders",
  "tag": "purchasing",
  "summary": "List purchase orders",
  "opId": "listPurchaseOrders",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/purchase-orders",
  "tag": "purchasing",
  "summary": "Create a purchase order",
  "opId": "createPurchaseOrder",
  "security": "bearer",
  "body": "PurchaseOrderInput",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/purchase-orders/{id}",
  "tag": "purchasing",
  "summary": "Get a purchase order with items",
  "opId": "getPurchaseOrder",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/purchase-orders/{id}",
  "tag": "purchasing",
  "summary": "Update a draft purchase order",
  "opId": "updatePurchaseOrder",
  "security": "bearer",
  "body": "PurchaseOrderInput",
  "params": "",
  "responses": "200,400,409"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/purchase-orders/{id}",
  "tag": "purchasing",
  "summary": "Delete a draft purchase order",
  "opId": "deletePurchaseOrder",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/purchase-orders/{id}/print",
  "tag": "purchasing",
  "summary": "Print purchase order document",
  "opId": "printPurchaseOrder",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/purchase-orders/{id}/approve",
  "tag": "purchasing",
  "summary": "Approve a purchase order (draft -> approved)",
  "opId": "approvePurchaseOrder",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/purchase-orders/{id}/cancel",
  "tag": "purchasing",
  "summary": "Cancel a purchase order",
  "opId": "cancelPurchaseOrder",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/purchase-orders/{id}/pay",
  "tag": "purchasing",
  "summary": "Pay supplier debt for a purchase order",
  "opId": "payDebt",
  "security": "bearer",
  "body": "PayDebtInput",
  "params": "None:None",
  "responses": "200,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/purchase-orders/debts",
  "tag": "purchasing",
  "summary": "List supplier debts (POs with remaining balance)",
  "opId": "listSupplierDebts",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/goods-receipts",
  "tag": "purchasing",
  "summary": "List goods receipts",
  "opId": "listGoodsReceipts",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/goods-receipts",
  "tag": "purchasing",
  "summary": "Create a goods receipt (increments stock, updates PO status)",
  "opId": "createGoodsReceipt",
  "security": "bearer",
  "body": "GoodsReceiptInput",
  "params": "",
  "responses": "201,400,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/goods-receipts/{id}",
  "tag": "purchasing",
  "summary": "Get a goods receipt with items",
  "opId": "getGoodsReceipt",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/vouchers",
  "tag": "purchasing",
  "summary": "List vouchers",
  "opId": "listVouchers",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/vouchers",
  "tag": "purchasing",
  "summary": "Create a voucher",
  "opId": "createVoucher",
  "security": "bearer",
  "body": "VoucherInput",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/vouchers/{id}",
  "tag": "purchasing",
  "summary": "Get a voucher",
  "opId": "getVoucher",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/vouchers/{id}",
  "tag": "purchasing",
  "summary": "Update a voucher",
  "opId": "updateVoucher",
  "security": "bearer",
  "body": "VoucherInput",
  "params": "None:None",
  "responses": "200,404,409"
 },
 {
  "method": "PUT",
  "path": "/api/v1/vouchers/{id}/status",
  "tag": "purchasing",
  "summary": "Update voucher status",
  "opId": "updateVoucherStatus",
  "security": "bearer",
  "body": "inline{status}",
  "params": "",
  "responses": "200,404,409"
 },
 {
  "method": "PATCH",
  "path": "/api/v1/vouchers/{id}/status",
  "tag": "purchasing",
  "summary": "Update voucher status",
  "opId": "patchVoucherStatus",
  "security": "bearer",
  "body": "inline{status}",
  "params": "",
  "responses": "200,404,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/vouchers/{id}/print",
  "tag": "purchasing",
  "summary": "Record a voucher print (idempotent audit mark, never blocks reprint)",
  "opId": "printVoucher",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-vouchers",
  "tag": "sales",
  "summary": "List sales/member vouchers",
  "opId": "listSalesVouchers",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;query:status;query:type;query:voucher_number",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-vouchers",
  "tag": "sales",
  "summary": "Create a sales/member voucher",
  "opId": "createSalesVoucher",
  "security": "bearer",
  "body": "SalesVoucherInput",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-vouchers/validate",
  "tag": "sales",
  "summary": "Validate a sales voucher code and compute discount",
  "opId": "validateSalesVoucher",
  "security": "bearer",
  "body": "inline{code,subtotal}",
  "params": "",
  "responses": "200,404,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-vouchers/by-number/{voucher_number}",
  "tag": "sales",
  "summary": "Get a sales voucher by number",
  "opId": "getSalesVoucherByNumber",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-vouchers/{id}",
  "tag": "sales",
  "summary": "Get a sales voucher",
  "opId": "getSalesVoucher",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/sales-vouchers/{id}",
  "tag": "sales",
  "summary": "Update a sales voucher (status transition)",
  "opId": "updateSalesVoucher",
  "security": "bearer",
  "body": "inline{status}",
  "params": "",
  "responses": "200,400,404,409"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/sales-vouchers/{id}",
  "tag": "sales",
  "summary": "Delete (expire) a sales voucher",
  "opId": "deleteSalesVoucher",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,204,404,409"
 },
 {
  "method": "PUT",
  "path": "/api/v1/sales-vouchers/{id}/status",
  "tag": "sales",
  "summary": "Update a sales voucher status",
  "opId": "updateSalesVoucherStatus",
  "security": "bearer",
  "body": "inline{status}",
  "params": "",
  "responses": "200,400,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-targets",
  "tag": "sales",
  "summary": "List tiered sales targets",
  "opId": "listSalesTargets",
  "security": "bearer",
  "body": null,
  "params": "query:period;query:role_level;query:scope_level",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-targets",
  "tag": "sales",
  "summary": "Create sales target",
  "opId": "createSalesTarget",
  "security": "bearer",
  "body": "object",
  "params": "",
  "responses": "201,400,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-targets/summary",
  "tag": "sales",
  "summary": "Sales targets summary by level",
  "opId": "getSalesTargetsSummary",
  "security": "bearer",
  "body": null,
  "params": "query:period",
  "responses": "200,401"
 },
 {
  "method": "PUT",
  "path": "/api/v1/sales-targets/{id}",
  "tag": "sales",
  "summary": "Update sales target",
  "opId": "updateSalesTarget",
  "security": "bearer",
  "body": "object",
  "params": "",
  "responses": "200,400,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/sales-targets/{id}",
  "tag": "sales",
  "summary": "Delete sales target",
  "opId": "deleteSalesTarget",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/delivery-orders",
  "tag": "distribution",
  "summary": "List delivery orders",
  "opId": "listDeliveryOrders",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/delivery-orders",
  "tag": "distribution",
  "summary": "Create a delivery order from a sales order",
  "opId": "createDeliveryOrder",
  "security": "bearer",
  "body": "DeliveryOrderInput",
  "params": "",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/delivery-orders/me",
  "tag": "distribution",
  "summary": "List the authenticated buyer's own delivery orders (B2B surface)",
  "opId": "myDeliveryOrders",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/delivery-orders/{id}",
  "tag": "distribution",
  "summary": "Get a delivery order with items, shipments and dispatches",
  "opId": "getDeliveryOrder",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/delivery-orders/{id}/shipments",
  "tag": "distribution",
  "summary": "Execute a shipment against a delivery order",
  "opId": "createShipment",
  "security": "bearer",
  "body": "ShipmentInput",
  "params": "None:None",
  "responses": "201,400,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/delivery-orders/{id}/dispatch",
  "tag": "distribution",
  "summary": "Assign or reassign fleet/dispatch for a delivery order",
  "opId": "createDispatch",
  "security": "bearer",
  "body": "DispatchInput",
  "params": "None:None",
  "responses": "201,400,404,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/delivery-orders/{id}/deliver",
  "tag": "distribution",
  "summary": "Mark all shipments on a delivery order delivered and complete the DO",
  "opId": "deliverDeliveryOrder",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,400,404,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/lhpp",
  "tag": "distribution",
  "summary": "List LHPP billing sheets (manually maintained, one driver per sheet, may span days)",
  "opId": "listLhpp",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;query:search;query:status",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/lhpp/{id}",
  "tag": "distribution",
  "summary": "LHPP detail with DO items",
  "opId": "getLhpp",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/lhpp/groups/merge",
  "tag": "distribution",
  "summary": "Merge LHPP sheets into one (reversible via split)",
  "opId": "mergeLhppGroups",
  "security": "bearer",
  "body": "inline{group_ids,target_group_id,reason}",
  "params": "None:None",
  "responses": "200,400,404,409,422"
 },
 {
  "method": "PATCH",
  "path": "/api/v1/lhpp/groups/{id}",
  "tag": "distribution",
  "summary": "Re-point a single-DO LHPP sheet at another driver",
  "opId": "updateLhppGroup",
  "security": "bearer",
  "body": "inline{driver_id,reason}",
  "params": "None:None",
  "responses": "200,400,404,409,422"
 },
 {
  "method": "POST",
  "path": "/api/v1/lhpp/groups/{id}/split",
  "tag": "distribution",
  "summary": "Split DOs out of a sheet into a new one",
  "opId": "splitLhppGroup",
  "security": "bearer",
  "body": "inline{do_ids,reason}",
  "params": "None:None",
  "responses": "200,400,404,409,422"
 },
 {
  "method": "POST",
  "path": "/api/v1/lhpp/groups/{id}/void",
  "tag": "distribution",
  "summary": "Void an LHPP sheet, releasing its DOs for re-batching",
  "opId": "voidLhppGroup",
  "security": "bearer",
  "body": "inline{reason}",
  "params": "None:None",
  "responses": "200,400,404,409,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/lhpp/groups/{id}/history",
  "tag": "distribution",
  "summary": "Audit trail for one LHPP sheet, newest first",
  "opId": "getLhppGroupHistory",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/lhpp/{id}/payments",
  "tag": "distribution",
  "summary": "Record an LHPP DO payment (posts to the invoice ledger)",
  "opId": "recordLhppPayment",
  "security": "bearer",
  "body": "inline{do_id,amount,payment_method,notes}",
  "params": "None:None",
  "responses": "200,400,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/lhpp/sales",
  "tag": "distribution",
  "summary": "List Sales LHPP sheets (billing visits grouped by sales rep + visit date)",
  "opId": "listSalesLhpp",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;query:search;query:status",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/lhpp/sales/me",
  "tag": "distribution",
  "summary": "List the caller's own Sales LHPP sheets",
  "opId": "mySalesLhpp",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;query:search;query:status",
  "responses": "200,401,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/lhpp/sales/{id}",
  "tag": "distribution",
  "summary": "Sales LHPP detail with visit/invoice items",
  "opId": "getSalesLhpp",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/lhpp/sales/{id}/payments",
  "tag": "distribution",
  "summary": "Record a payment against an open invoice on a Sales LHPP sheet (posts to the invoice ledger)",
  "opId": "recordSalesLhppPayment",
  "security": "bearer",
  "body": "inline{invoice_id,amount,payment_method,notes}",
  "params": "None:None",
  "responses": "200,400,404,422"
 },
 {
  "method": "POST",
  "path": "/api/v1/shipments/{id}/deliver",
  "tag": "distribution",
  "summary": "Mark a shipment as delivered",
  "opId": "deliverShipment",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,404,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/shipments/{id}/tracking",
  "tag": "distribution",
  "summary": "Shipment tracking summary (latest point, history, real-time availability)",
  "opId": "getShipmentTracking",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/shipments/{id}/tracking/events",
  "tag": "distribution",
  "summary": "Append a shipment tracking event (manual or third-party push)",
  "opId": "recordTrackingEvent",
  "security": "bearer",
  "body": "TrackingEventInput",
  "params": "None:None",
  "responses": "201,400,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/tracking/lookup",
  "tag": "distribution",
  "summary": "Resolve a DO number, shipment number, barcode, or tracking number to shipments",
  "opId": "lookupShipment",
  "security": "bearer",
  "body": null,
  "params": "query:q",
  "responses": "200,400,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/fleet",
  "tag": "distribution",
  "summary": "List fleet vehicles",
  "opId": "listFleet",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/fleet",
  "tag": "distribution",
  "summary": "Register a fleet vehicle",
  "opId": "createVehicle",
  "security": "bearer",
  "body": "VehicleInput",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/fleet/{id}",
  "tag": "distribution",
  "summary": "Get a fleet vehicle",
  "opId": "getVehicle",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/distribution/drivers",
  "tag": "distribution",
  "summary": "List dispatch driver candidates",
  "opId": "listDrivers",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/distribution/drivers",
  "tag": "distribution",
  "summary": "Add a driver candidate",
  "opId": "createDriver",
  "security": "bearer",
  "body": "inline{name}",
  "params": "None:None",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/warehouse-deposits",
  "tag": "distribution",
  "summary": "List warehouse driver deposits",
  "opId": "listWarehouseDeposits",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/v1/warehouse-deposits",
  "tag": "distribution",
  "summary": "Record a Setoran from a checklist of not-yet-deposited cash/giro payments",
  "opId": "createWarehouseDeposit",
  "security": "bearer",
  "body": "inline{warehouse_id,driver_id,payment_ids,deposit_date,notes}",
  "params": "",
  "responses": "201"
 },
 {
  "method": "GET",
  "path": "/api/v1/warehouse-deposits/undeposited-payments",
  "tag": "distribution",
  "summary": "Cash/giro payments not yet claimed by any Setoran (the \"Catat Setoran\" checklist source)",
  "opId": "listUndepositedPayments",
  "security": "bearer",
  "body": null,
  "params": "query:driver_id;query:date;query:search",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/warehouse-deposits/{id}",
  "tag": "distribution",
  "summary": "Get warehouse driver deposit by ID",
  "opId": "getWarehouseDeposit",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/v1/warehouse-deposits/{id}/receive",
  "tag": "distribution",
  "summary": "Kasir Pusat confirms custody of a Setoran (no shift/drawer involved)",
  "opId": "receiveWarehouseDeposit",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/invoices",
  "tag": "invoices",
  "summary": "List invoices",
  "opId": "listInvoices",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/invoices",
  "tag": "invoices",
  "summary": "Create an invoice from a confirmed/delivered sales order",
  "opId": "createInvoice",
  "security": "bearer",
  "body": "inline{sales_order_id}",
  "params": "None:None",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/invoices/me",
  "tag": "invoices",
  "summary": "List the authenticated buyer's own invoices (B2B surface)",
  "opId": "myInvoices",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/invoices/{id}",
  "tag": "invoices",
  "summary": "Get an invoice",
  "opId": "getInvoice",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/invoices/{id}",
  "tag": "invoices",
  "summary": "Delete an invoice",
  "opId": "deleteInvoice",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,404,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/invoices/{id}/print",
  "tag": "invoices",
  "summary": "Print invoice document",
  "opId": "printInvoice",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/invoices/me/{id}/print",
  "tag": "invoices",
  "summary": "Print owned invoice document",
  "opId": "myPrintInvoice",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/invoices/{id}/pay",
  "tag": "invoices",
  "summary": "Pay an invoice",
  "opId": "payInvoice",
  "security": "bearer",
  "body": "PaymentInput",
  "params": "",
  "responses": "200,400,404,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/payments",
  "tag": "invoices",
  "summary": "List payments",
  "opId": "listPayments",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/payments/{id}/verify",
  "tag": "invoices",
  "summary": "Verify (approve/reject) a payment",
  "opId": "verifyPayment",
  "security": "bearer",
  "body": "inline{approved}",
  "params": "None:None",
  "responses": "200,404,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/payments/{id}/proof",
  "tag": "invoices",
  "summary": "Upload a payment proof image (multipart/form-data)",
  "opId": "uploadPaymentProof",
  "security": "bearer",
  "body": "inline{file}",
  "params": "",
  "responses": "201,400,401,403,404,500"
 },
 {
  "method": "POST",
  "path": "/api/v1/payments/{id}/partial",
  "tag": "invoices",
  "summary": "Record an additional (partial) payment against the same payable",
  "opId": "recordPartialPayment",
  "security": "bearer",
  "body": "inline{amount,payment_method,notes}",
  "params": "None:None",
  "responses": "201,400,401,404,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/payments/me",
  "tag": "invoices",
  "summary": "List the authenticated buyer's own payments (B2B surface)",
  "opId": "myPayments",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/cashflows",
  "tag": "cashflows",
  "summary": "List cashflows",
  "opId": "listCashflows",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/cashflows",
  "tag": "cashflows",
  "summary": "Create a manual cashflow entry",
  "opId": "createCashflow",
  "security": "bearer",
  "body": "CashflowInput",
  "params": "",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/cashflows/{id}",
  "tag": "cashflows",
  "summary": "Get a cashflow entry",
  "opId": "getCashflow",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/cashflows/{id}",
  "tag": "cashflows",
  "summary": "Update a cashflow entry",
  "opId": "updateCashflow",
  "security": "bearer",
  "body": "CashflowInput",
  "params": "",
  "responses": "200,400,404,409"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/cashflows/{id}",
  "tag": "cashflows",
  "summary": "Delete a cashflow entry",
  "opId": "deleteCashflow",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,404,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/cashflows/{id}/reverse",
  "tag": "cashflows",
  "summary": "Reverse a generated cashflow",
  "opId": "reverseCashflow",
  "security": "bearer",
  "body": "CashflowReverseInput",
  "params": "None:None",
  "responses": "200,400,404,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/cash-accounts",
  "tag": "cashflows",
  "summary": "List cash accounts",
  "opId": "listCashAccounts",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/cash-accounts",
  "tag": "cashflows",
  "summary": "Create cash account",
  "opId": "createCashAccount",
  "security": "bearer",
  "body": "object",
  "params": "",
  "responses": "201,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/accounts",
  "tag": "cashflows",
  "summary": "List chart of accounts",
  "opId": "listAccounts",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/payment-vouchers",
  "tag": "cashflows",
  "summary": "List payment vouchers",
  "opId": "listPaymentVouchers",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/payment-vouchers",
  "tag": "cashflows",
  "summary": "Create payment voucher",
  "opId": "createPaymentVoucher",
  "security": "bearer",
  "body": "object",
  "params": "None:None",
  "responses": "201,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/payment-vouchers/{id}",
  "tag": "cashflows",
  "summary": "Get payment voucher",
  "opId": "getPaymentVoucher",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/payment-vouchers/{id}/post",
  "tag": "cashflows",
  "summary": "Post payment voucher",
  "opId": "postPaymentVoucher",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/payment-vouchers/{id}/void",
  "tag": "cashflows",
  "summary": "Void payment voucher",
  "opId": "voidPaymentVoucher",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/cashflow-balances",
  "tag": "cashflows",
  "summary": "Cashflow balances",
  "opId": "cashflowBalances",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/cashflow-balances/accounts",
  "tag": "cashflows",
  "summary": "Per-COA-account all-time debit/credit balances (journal lines)",
  "opId": "cashflowAccountBalances",
  "security": "bearer",
  "body": null,
  "params": "query:codes",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/dashboard/kpis",
  "tag": "reports",
  "summary": "Dashboard KPIs",
  "opId": "dashboardKpis",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/dashboard/pos",
  "tag": "reports",
  "summary": "POS home dashboard",
  "opId": "posDashboard",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/dashboard/outlet",
  "tag": "reports",
  "summary": "Kepala toko outlet cockpit",
  "opId": "outletDashboard",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/dashboard/charts",
  "tag": "reports",
  "summary": "Dashboard charts",
  "opId": "dashboardCharts",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/profit-loss",
  "tag": "reports",
  "summary": "Yearly profit-and-loss report",
  "opId": "profitLoss",
  "security": "bearer",
  "body": null,
  "params": "query:year",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/balance-sheet",
  "tag": "reports",
  "summary": "Balance sheet snapshot (assets, liabilities, equity)",
  "opId": "balanceSheet",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/sales",
  "tag": "reports",
  "summary": "Sales report with totals and category/product breakdowns",
  "opId": "salesReport",
  "security": "bearer",
  "body": null,
  "params": "query:year;query:month",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/stock",
  "tag": "reports",
  "summary": "Stock report (quantity, value, per-category value)",
  "opId": "stockReport",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/fakturisasi",
  "tag": "reports",
  "summary": "Fakturisasi / invoice receivable totals",
  "opId": "fakturisasiReport",
  "security": "bearer",
  "body": null,
  "params": "query:year",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/summary",
  "tag": "reports",
  "summary": "POS dashboard summary (KPIs)",
  "opId": "summaryReport",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/analytics",
  "tag": "reports",
  "summary": "Admin analytics data",
  "opId": "getAnalytics",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/receivables",
  "tag": "reports",
  "summary": "Export receivables CSV",
  "opId": "exportReceivables",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/debts",
  "tag": "reports",
  "summary": "Export supplier debts CSV",
  "opId": "exportDebts",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/cashflow",
  "tag": "reports",
  "summary": "Cashflow report (CSV)",
  "opId": "exportCashflow",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/sales-by-customer",
  "tag": "reports",
  "summary": "Sales breakdown by customer",
  "opId": "reportSalesByCustomer",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/sales-by-product",
  "tag": "reports",
  "summary": "Sales breakdown by product",
  "opId": "reportSalesByProduct",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/purchases-by-supplier",
  "tag": "reports",
  "summary": "Purchase breakdown by supplier",
  "opId": "reportPurchasesBySupplier",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/purchases-by-product",
  "tag": "reports",
  "summary": "Purchase breakdown by product",
  "opId": "reportPurchasesByProduct",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/receivables-aging",
  "tag": "reports",
  "summary": "Receivables aging report",
  "opId": "reportReceivablesAging",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/payables-aging",
  "tag": "reports",
  "summary": "Payables aging report",
  "opId": "reportPayablesAging",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/stock-valuation",
  "tag": "reports",
  "summary": "Stock valuation report",
  "opId": "reportStockValuation",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/stock-movements",
  "tag": "reports",
  "summary": "Stock movements history report",
  "opId": "reportStockMovements",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/stock-card",
  "tag": "reports",
  "summary": "Product stock card ledger",
  "opId": "reportStockCard",
  "security": "bearer",
  "body": null,
  "params": "query:product_id;query:warehouse_id;None:None;None:None",
  "responses": "200,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/employees",
  "tag": "hr",
  "summary": "List employees",
  "opId": "listEmployees",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/employees",
  "tag": "hr",
  "summary": "Create an employee",
  "opId": "createEmployee",
  "security": "bearer",
  "body": "EmployeeInput",
  "params": "",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/employees/{id}",
  "tag": "hr",
  "summary": "Get an employee",
  "opId": "getEmployee",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/employees/{id}",
  "tag": "hr",
  "summary": "Update an employee",
  "opId": "updateEmployee",
  "security": "bearer",
  "body": "EmployeeInput",
  "params": "",
  "responses": "200,400,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/employees/{id}",
  "tag": "hr",
  "summary": "Soft-delete an employee",
  "opId": "deleteEmployee",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/hr/attendance",
  "tag": "hr",
  "summary": "List attendance (admin view)",
  "opId": "listAttendance",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/hr/attendance",
  "tag": "hr",
  "summary": "Create/backfill an attendance record (admin)",
  "opId": "createAttendance",
  "security": "bearer",
  "body": "AttendanceInput",
  "params": "",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/hr/attendance/{id}",
  "tag": "hr",
  "summary": "Get attendance detail by ID",
  "opId": "getAttendance",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/hr/attendance/me",
  "tag": "hr",
  "summary": "My attendance (current user)",
  "opId": "myAttendance",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/hr/attendance/clock-in",
  "tag": "hr",
  "summary": "Clock in (self-service)",
  "opId": "clockIn",
  "security": "bearer",
  "body": "ClockInOutInput",
  "params": "",
  "responses": "201,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/hr/attendance/clock-out",
  "tag": "hr",
  "summary": "Clock out (self-service)",
  "opId": "clockOut",
  "security": "bearer",
  "body": "ClockInOutInput",
  "params": "",
  "responses": "200,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/hr/leaves",
  "tag": "hr",
  "summary": "List leave requests",
  "opId": "listLeaves",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/hr/leaves",
  "tag": "hr",
  "summary": "Submit a leave request",
  "opId": "createLeave",
  "security": "bearer",
  "body": "LeaveInput",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/hr/leaves/me",
  "tag": "hr",
  "summary": "My leave requests",
  "opId": "myLeaves",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/hr/leaves/{id}/approve",
  "tag": "hr",
  "summary": "Approve a leave request",
  "opId": "approveLeave",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/hr/leaves/{id}/reject",
  "tag": "hr",
  "summary": "Reject a leave request",
  "opId": "rejectLeave",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/hr/payrolls",
  "tag": "hr",
  "summary": "List payrolls",
  "opId": "listPayrolls",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/hr/payrolls",
  "tag": "hr",
  "summary": "Generate pay slips for a period",
  "opId": "generatePayrolls",
  "security": "bearer",
  "body": "inline{period_month,period_year}",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/hr/payrolls/me",
  "tag": "hr",
  "summary": "My payslips",
  "opId": "myPayslips",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/hr/payrolls/{id}",
  "tag": "hr",
  "summary": "Get payroll by ID",
  "opId": "getPayroll",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/hr/payrolls/{id}/approve",
  "tag": "hr",
  "summary": "Approve a payroll (draft -> approved)",
  "opId": "approvePayroll",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/hr/payrolls/{id}/pay",
  "tag": "hr",
  "summary": "Disburse / pay a payroll (approved -> paid)",
  "opId": "payPayroll",
  "security": "bearer",
  "body": "inline{payment_date,payment_method,account_code,notes}",
  "params": "",
  "responses": "200,404,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/hr/performances",
  "tag": "hr",
  "summary": "List performance reviews",
  "opId": "listPerformances",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/hr/performances",
  "tag": "hr",
  "summary": "Record a performance review",
  "opId": "createPerformance",
  "security": "bearer",
  "body": "PerformanceInput",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/hr/performances/{id}",
  "tag": "hr",
  "summary": "Get performance review by ID",
  "opId": "getPerformance",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/hr/performances/{id}",
  "tag": "hr",
  "summary": "Update performance review",
  "opId": "updatePerformance",
  "security": "bearer",
  "body": "PerformanceInput",
  "params": "None:None",
  "responses": "200,400,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/hr/performances/{id}",
  "tag": "hr",
  "summary": "Delete performance review",
  "opId": "deletePerformance",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "204,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-tracking/visits",
  "tag": "salestracking",
  "summary": "List visits",
  "opId": "listVisits",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-tracking/visits",
  "tag": "salestracking",
  "summary": "Create a visit",
  "opId": "createVisit",
  "security": "bearer",
  "body": "VisitInput",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-tracking/visits/sales-employees",
  "tag": "salestracking",
  "summary": "List sales employees",
  "opId": "listSalesEmployees",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-tracking/visits/me",
  "tag": "salestracking",
  "summary": "My visits",
  "opId": "myVisits",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-tracking/visits/{id}",
  "tag": "salestracking",
  "summary": "Get a visit",
  "opId": "getVisit",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-tracking/visits/{id}/checkin",
  "tag": "salestracking",
  "summary": "Check in to a visit (GPS)",
  "opId": "visitCheckin",
  "security": "bearer",
  "body": "GeoInput",
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-tracking/visits/{id}/checkout",
  "tag": "salestracking",
  "summary": "Check out of a visit (GPS, duration)",
  "opId": "visitCheckout",
  "security": "bearer",
  "body": "GeoInput",
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-tracking/activities",
  "tag": "salestracking",
  "summary": "List sales activities",
  "opId": "listActivities",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-tracking/activities",
  "tag": "salestracking",
  "summary": "Record a sales activity",
  "opId": "createActivity",
  "security": "bearer",
  "body": "ActivityInput",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-tracking/routes",
  "tag": "salestracking",
  "summary": "List routes",
  "opId": "listRoutes",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-tracking/routes",
  "tag": "salestracking",
  "summary": "Create a route",
  "opId": "createRoute",
  "security": "bearer",
  "body": "RouteInput",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-tracking/routes/me",
  "tag": "salestracking",
  "summary": "My routes",
  "opId": "myRoutes",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/sales-tracking/locations/ping",
  "tag": "salestracking",
  "summary": "Bulk location ping (high-frequency; not activity-logged)",
  "opId": "pingLocations",
  "security": "bearer",
  "body": "inline{locations}",
  "params": "",
  "responses": "204,429"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-tracking/locations/current",
  "tag": "salestracking",
  "summary": "Current sales locations (admin/sales)",
  "opId": "currentLocations",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-tracking/locations",
  "tag": "salestracking",
  "summary": "List customer sites (tracking page)",
  "opId": "listCustomerLocations",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;query:city",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/sales-tracking/livemap",
  "tag": "salestracking",
  "summary": "Live map view of sales locations",
  "opId": "livemap",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/users",
  "tag": "users",
  "summary": "List users",
  "opId": "listUsers",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/users",
  "tag": "users",
  "summary": "Create a user",
  "opId": "createUser",
  "security": "bearer",
  "body": "UserInput",
  "params": "",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/users/{id}",
  "tag": "users",
  "summary": "Get a user",
  "opId": "getUser",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/users/{id}",
  "tag": "users",
  "summary": "Update a user",
  "opId": "updateUser",
  "security": "bearer",
  "body": "UserInput",
  "params": "",
  "responses": "200,400,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/users/{id}",
  "tag": "users",
  "summary": "Delete a user",
  "opId": "deleteUser",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/users/{id}/toggle",
  "tag": "users",
  "summary": "Toggle user active status",
  "opId": "toggleUser",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/roles",
  "tag": "users",
  "summary": "List roles",
  "opId": "listRoles",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/roles",
  "tag": "users",
  "summary": "Create a role",
  "opId": "createRole",
  "security": "bearer",
  "body": "RoleInput",
  "params": "",
  "responses": "201,400"
 },
 {
  "method": "PUT",
  "path": "/api/v1/roles/{id}",
  "tag": "users",
  "summary": "Update a role",
  "opId": "updateRole",
  "security": "bearer",
  "body": "RoleInput",
  "params": "",
  "responses": "200,400,404"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/roles/{id}",
  "tag": "users",
  "summary": "Delete a role",
  "opId": "deleteRole",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/activity-logs",
  "tag": "activitylogs",
  "summary": "List activity logs",
  "opId": "listActivityLogs",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/activity-logs",
  "tag": "activitylogs",
  "summary": "Clear activity logs",
  "opId": "clearActivityLogs",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "204,401,403"
 },
 {
  "method": "GET",
  "path": "/api/v1/stores",
  "tag": "stores",
  "summary": "List tenant stores",
  "opId": "listStores",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/v1/stores",
  "tag": "stores",
  "summary": "Create a tenant store",
  "opId": "createStore",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "201"
 },
 {
  "method": "GET",
  "path": "/api/v1/stores/{id}",
  "tag": "stores",
  "summary": "Get a store",
  "opId": "getStore",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200"
 },
 {
  "method": "PUT",
  "path": "/api/v1/stores/{id}",
  "tag": "stores",
  "summary": "Update a store",
  "opId": "updateStore",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/stores/{id}",
  "tag": "stores",
  "summary": "Delete a store (fails when referenced)",
  "opId": "deleteStore",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "204"
 },
 {
  "method": "GET",
  "path": "/api/v1/stores/{id}/users",
  "tag": "stores",
  "summary": "List store user memberships",
  "opId": "listStoreUsers",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/v1/stores/{id}/users",
  "tag": "stores",
  "summary": "Assign a user to the store",
  "opId": "addStoreUser",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "201"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/stores/{id}/users/{userID}",
  "tag": "stores",
  "summary": "Remove a user from the store",
  "opId": "removeStoreUser",
  "security": "bearer",
  "body": null,
  "params": "path:id;path:userID",
  "responses": "204"
 },
 {
  "method": "GET",
  "path": "/api/v1/role-permissions",
  "tag": "roles",
  "summary": "Role-permission matrix (ERP-controlled)",
  "opId": "getRolePermissionMatrix",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "PUT",
  "path": "/api/v1/role-permissions",
  "tag": "roles",
  "summary": "Grant or revoke one role permission override",
  "opId": "setRolePermission",
  "security": "bearer",
  "body": "inline{role,permission,granted}",
  "params": "",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/permissions",
  "tag": "roles",
  "summary": "Permission catalog (grouped keys for ERP editors)",
  "opId": "getPermissions",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/accounting/accounts",
  "tag": "accounting",
  "summary": "List chart-of-accounts",
  "opId": "listAccountingAccounts",
  "security": "bearer",
  "body": null,
  "params": "query:active;query:search",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/accounting/accounts",
  "tag": "accounting",
  "summary": "Create a COA account",
  "opId": "createAccountingAccount",
  "security": "bearer",
  "body": "AccountingAccountInput",
  "params": "",
  "responses": "201,401,422"
 },
 {
  "method": "PUT",
  "path": "/api/v1/accounting/accounts/{id}",
  "tag": "accounting",
  "summary": "Update a COA account",
  "opId": "updateAccountingAccount",
  "security": "bearer",
  "body": "AccountingAccountInput",
  "params": "path:id",
  "responses": "200,401,404,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/accounting/departments",
  "tag": "accounting",
  "summary": "List cost-center departments",
  "opId": "listAccountingDepartments",
  "security": "bearer",
  "body": null,
  "params": "query:active;query:search",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/accounting/departments",
  "tag": "accounting",
  "summary": "Create a department",
  "opId": "createAccountingDepartment",
  "security": "bearer",
  "body": "AccountingDepartmentInput",
  "params": "",
  "responses": "201,401,422"
 },
 {
  "method": "PUT",
  "path": "/api/v1/accounting/departments/{id}",
  "tag": "accounting",
  "summary": "Update a department",
  "opId": "updateAccountingDepartment",
  "security": "bearer",
  "body": "AccountingDepartmentInput",
  "params": "path:id",
  "responses": "200,401,404,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/accounting/journals",
  "tag": "accounting",
  "summary": "List journal entries",
  "opId": "listAccountingJournals",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;query:search;query:status;query:journal_type;query:store_id;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/accounting/journals",
  "tag": "accounting",
  "summary": "Create a draft journal entry",
  "opId": "createAccountingJournal",
  "security": "bearer",
  "body": "AccountingJournalInput",
  "params": "",
  "responses": "201,400,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/accounting/journals/by-source",
  "tag": "accounting",
  "summary": "Drill one upstream document to its auto-drafted journal",
  "opId": "getJournalBySource",
  "security": "bearer",
  "body": null,
  "params": "query:source_type;query:source_id",
  "responses": "200,400,401,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/accounting/journals/{id}",
  "tag": "accounting",
  "summary": "Get a journal entry with lines",
  "opId": "getAccountingJournal",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200,401,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/accounting/journals/{id}",
  "tag": "accounting",
  "summary": "Update a draft journal entry",
  "opId": "updateAccountingJournal",
  "security": "bearer",
  "body": "AccountingJournalInput",
  "params": "path:id",
  "responses": "200,400,401,404,422"
 },
 {
  "method": "DELETE",
  "path": "/api/v1/accounting/journals/{id}",
  "tag": "accounting",
  "summary": "Delete a draft journal entry",
  "opId": "deleteAccountingJournal",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200,401,404,422"
 },
 {
  "method": "POST",
  "path": "/api/v1/accounting/journals/{id}/post",
  "tag": "accounting",
  "summary": "Post a draft journal to the ledger (requires balance)",
  "opId": "postAccountingJournal",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200,401,404,422"
 },
 {
  "method": "POST",
  "path": "/api/v1/accounting/journals/{id}/void",
  "tag": "accounting",
  "summary": "Void a posted journal",
  "opId": "voidAccountingJournal",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200,401,404,422"
 },
 {
  "method": "POST",
  "path": "/api/v1/accounting/journals/{id}/reverse",
  "tag": "accounting",
  "summary": "Reverse a posted journal (mirrored entry)",
  "opId": "reverseAccountingJournal",
  "security": "bearer",
  "body": "inline{reason}",
  "params": "path:id",
  "responses": "200,401,404,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/accounting/ledger",
  "tag": "accounting",
  "summary": "General ledger (posted + reversed entries only)",
  "opId": "accountingLedger",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;query:journal_type;query:store_id;query:account_code;query:account_type;query:search;query:format",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/accounting/advances",
  "tag": "accounting",
  "summary": "List customer deposits / supplier advances",
  "opId": "listAccountingAdvances",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;query:type;query:status;query:search",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/accounting/advances",
  "tag": "accounting",
  "summary": "Receive a deposit / advance (auto-posts the DP journal)",
  "opId": "receiveAccountingAdvance",
  "security": "bearer",
  "body": "AccountingAdvanceReceiveInput",
  "params": "",
  "responses": "201,400,401,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/accounting/advances/{id}",
  "tag": "accounting",
  "summary": "Get an advance with its transactions",
  "opId": "getAccountingAdvance",
  "security": "bearer",
  "body": null,
  "params": "path:id;query:type",
  "responses": "200,401,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/accounting/advances/{id}/allocate",
  "tag": "accounting",
  "summary": "Allocate an advance to an invoice / purchase order",
  "opId": "allocateAccountingAdvance",
  "security": "bearer",
  "body": "inline{amount,invoice_id,purchase_order_id}",
  "params": "path:id;query:type",
  "responses": "200,400,401,404,422"
 },
 {
  "method": "POST",
  "path": "/api/v1/accounting/advances/{id}/refund",
  "tag": "accounting",
  "summary": "Refund the remaining amount of an advance",
  "opId": "refundAccountingAdvance",
  "security": "bearer",
  "body": "inline{amount,cash_account_code}",
  "params": "path:id;query:type",
  "responses": "200,400,401,404,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/trial-balance",
  "tag": "reports",
  "summary": "Trial balance over posted journal lines",
  "opId": "trialBalance",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/health",
  "tag": "reports",
  "summary": "Report engine health check",
  "opId": "reportHealth",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,503"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/definitions",
  "tag": "reports",
  "summary": "List registered report definitions",
  "opId": "listReportDefinitions",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/definitions/{code}",
  "tag": "reports",
  "summary": "Get registered report definition",
  "opId": "getReportDefinition",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/templates",
  "tag": "reports",
  "summary": "List report templates",
  "opId": "listReportTemplates",
  "security": "bearer",
  "body": null,
  "params": "query:report_code;query:status",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/v1/reports/templates",
  "tag": "reports",
  "summary": "Create new report template",
  "opId": "createReportTemplate",
  "security": "bearer",
  "body": "object",
  "params": "",
  "responses": "201"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/templates/{id}",
  "tag": "reports",
  "summary": "Get report template by ID",
  "opId": "getReportTemplate",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/reports/templates/{id}",
  "tag": "reports",
  "summary": "Update report template",
  "opId": "updateReportTemplate",
  "security": "bearer",
  "body": "object",
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/reports/templates/{id}/activate",
  "tag": "reports",
  "summary": "Activate report template version",
  "opId": "activateReportTemplate",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/v1/reports/templates/{id}/duplicate",
  "tag": "reports",
  "summary": "Duplicate report template version",
  "opId": "duplicateReportTemplate",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "201"
 },
 {
  "method": "GET",
  "path": "/api/v1/memberships",
  "tag": "memberships",
  "summary": "List memberships",
  "opId": "listMemberships",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/v1/memberships",
  "tag": "memberships",
  "summary": "Register an existing customer as a member",
  "opId": "createMembership",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "201"
 },
 {
  "method": "GET",
  "path": "/api/v1/memberships/me",
  "tag": "memberships",
  "summary": "Current user's membership (User -> Customer -> Membership)",
  "opId": "myMembership",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/memberships/by-customer/{customerId}",
  "tag": "memberships",
  "summary": "Membership by customer",
  "opId": "membershipByCustomer",
  "security": "bearer",
  "body": null,
  "params": "path:customerId",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/memberships/by-number/{number}",
  "tag": "memberships",
  "summary": "Membership by member number",
  "opId": "membershipByNumber",
  "security": "bearer",
  "body": null,
  "params": "path:number",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/memberships/{id}",
  "tag": "memberships",
  "summary": "Get membership",
  "opId": "getMembership",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200"
 },
 {
  "method": "PUT",
  "path": "/api/v1/memberships/{id}",
  "tag": "memberships",
  "summary": "Update membership tier/status",
  "opId": "updateMembership",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/v1/memberships/{id}/accrue",
  "tag": "memberships",
  "summary": "Accrue points for spend and auto-promote tier (\u00a720 default)",
  "opId": "accrueMembershipPoints",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/memberships/{id}/tier-history",
  "tag": "memberships",
  "summary": "Membership tier audit history (append-only)",
  "opId": "membershipTierHistory",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/memberships/tiers",
  "tag": "memberships",
  "summary": "List database-backed tier configurations (STEP 0, \u00a713.1)",
  "opId": "listMembershipTiers",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "POST",
  "path": "/api/v1/memberships/tiers",
  "tag": "memberships",
  "summary": "Create a tier configuration (audited)",
  "opId": "createMembershipTier",
  "security": "bearer",
  "body": "TierConfigInput",
  "params": "",
  "responses": "201"
 },
 {
  "method": "GET",
  "path": "/api/v1/memberships/tiers/{id}",
  "tag": "memberships",
  "summary": "Get membership tier by id",
  "opId": "getMembershipTier",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200,404"
 },
 {
  "method": "PUT",
  "path": "/api/v1/memberships/tiers/{id}",
  "tag": "memberships",
  "summary": "Update a tier configuration (audited, from/to recorded)",
  "opId": "updateMembershipTier",
  "security": "bearer",
  "body": "TierConfigInput",
  "params": "path:id",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/memberships/tiers/{id}/config-history",
  "tag": "memberships",
  "summary": "Tier configuration audit trail (what a tier is worth, and who changed it). Distinct from /memberships/{id}/tier-history, which is the per-member tier assignment trail.",
  "opId": "membershipTierConfigHistory",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/reports/cashflow-statement",
  "tag": "reports",
  "summary": "Journal-derived cash-flow statement (operating / investing / financing) for a calendar year. Distinct from /reports/cashflow, which is a flat row export over payments, purchase orders and manual entries and has no notion of a section.",
  "opId": "cashflowStatement",
  "security": "bearer",
  "body": null,
  "params": "query:year",
  "responses": "200,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/returns/me",
  "tag": "sales",
  "summary": "List the authenticated buyer's own returns",
  "opId": "myReturns",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/returns",
  "tag": "returns",
  "summary": "List sales returns",
  "opId": "listReturns",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;None:None;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/returns",
  "tag": "returns",
  "summary": "Create a sales return (refund + restock, immutable audit event)",
  "opId": "createReturn",
  "security": "bearer",
  "body": "ReturnInput",
  "params": "None:None",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/returns/{id}",
  "tag": "returns",
  "summary": "Get a sales return with its items",
  "opId": "getReturn",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/cashier/shifts",
  "tag": "cashier",
  "summary": "List cashier shifts",
  "opId": "listCashierShifts",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;query:cashier_id;query:status",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/cashier/shifts",
  "tag": "cashier",
  "summary": "Open a cashier shift with opening cash",
  "opId": "openCashierShift",
  "security": "bearer",
  "body": "CashierShiftOpenInput",
  "params": "None:None",
  "responses": "201,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/cashier/shifts/current",
  "tag": "cashier",
  "summary": "Get the authenticated cashier's open shift",
  "opId": "getCurrentCashierShift",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/cashier/shifts/{id}",
  "tag": "cashier",
  "summary": "Get a cashier shift",
  "opId": "getCashierShift",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/cashier/shifts/{id}/summary",
  "tag": "cashier",
  "summary": "Get shift drawer summary (cash in/out, cash sales, expected cash)",
  "opId": "getCashierShiftSummary",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/cashier/shifts/{id}/cash-in",
  "tag": "cashier",
  "summary": "Record a cash-in drawer entry on an open shift",
  "opId": "cashierCashIn",
  "security": "bearer",
  "body": "DrawerEntryInput",
  "params": "None:None",
  "responses": "201,400,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/cashier/shifts/{id}/cash-out",
  "tag": "cashier",
  "summary": "Record a cash-out drawer entry on an open shift",
  "opId": "cashierCashOut",
  "security": "bearer",
  "body": "DrawerEntryInput",
  "params": "None:None",
  "responses": "201,400,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/cashier/shifts/{id}/close",
  "tag": "cashier",
  "summary": "Close an open shift with counted actual cash (variance computed)",
  "opId": "closeCashierShift",
  "security": "bearer",
  "body": "CashierShiftCloseInput",
  "params": "None:None",
  "responses": "200,400,409"
 },
 {
  "method": "GET",
  "path": "/api/v1/galon",
  "tag": "galon",
  "summary": "List galon transactions",
  "opId": "listGalonTransactions",
  "security": "bearer",
  "body": null,
  "params": "None:None;None:None;query:status;query:type;None:None",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/galon",
  "tag": "galon",
  "summary": "Create a galon transaction (refill/buy/borrow, pickup/delivery)",
  "opId": "createGalonTransaction",
  "security": "bearer",
  "body": "GalonTransactionInput",
  "params": "None:None",
  "responses": "201,400"
 },
 {
  "method": "GET",
  "path": "/api/v1/galon/{id}",
  "tag": "galon",
  "summary": "Get a galon transaction",
  "opId": "getGalonTransaction",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/galon/{id}/complete",
  "tag": "galon",
  "summary": "Complete a pending galon transaction",
  "opId": "completeGalonTransaction",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,404,409"
 },
 {
  "method": "POST",
  "path": "/api/v1/galon/{id}/cancel",
  "tag": "galon",
  "summary": "Cancel a pending galon transaction",
  "opId": "cancelGalonTransaction",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,404"
 },
 {
  "method": "POST",
  "path": "/api/v1/galon/{id}/return",
  "tag": "galon",
  "summary": "Return a borrowed galon and clear the loan (\u00a720",
  "opId": "returnGalonTransaction",
  "security": "bearer",
  "body": null,
  "params": "None:None",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/galon/services",
  "tag": "galon",
  "summary": "Get galon services configuration",
  "opId": "getGalonServices",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/galon/status",
  "tag": "galon",
  "summary": "Get galon status summary",
  "opId": "getGalonStatus",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/galon/units",
  "tag": "galon",
  "summary": "Get galon inventory units",
  "opId": "getGalonUnits",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/galon/by-code/{code}",
  "tag": "galon",
  "summary": "List a physical gallon's recent transactions (barcode tracker)",
  "opId": "getGalonByCode",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/galon/by-code/{code}/info",
  "tag": "galon",
  "summary": "Aggregate tracking info for one physical gallon",
  "opId": "getGalonInfoByCode",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/settings",
  "tag": "settings",
  "summary": "Get store and application settings",
  "opId": "getSettings",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200"
 },
 {
  "method": "PUT",
  "path": "/api/v1/settings",
  "tag": "settings",
  "summary": "Update store and application settings",
  "opId": "updateSettings",
  "security": "bearer",
  "body": "object",
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "POST",
  "path": "/api/v1/uploads",
  "tag": "uploads",
  "summary": "Upload an image (multipart/form-data) and receive its public URL",
  "opId": "uploadFile",
  "security": "bearer",
  "body": "inline{file}",
  "params": "",
  "responses": "201,400,401,500"
 },
 {
  "method": "GET",
  "path": "/api/v1/members",
  "tag": "memberships",
  "summary": "List memberships (stub)",
  "opId": "listMembersStub",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401"
 },
 {
  "method": "GET",
  "path": "/api/v1/members/{id}",
  "tag": "memberships",
  "summary": "Get member (stub)",
  "opId": "getMemberStub",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200"
 },
 {
  "method": "GET",
  "path": "/api/v1/notifications",
  "tag": "system",
  "summary": "List live notifications (ERP/POS only)",
  "opId": "listNotifications",
  "security": "bearer",
  "body": null,
  "params": "",
  "responses": "200,401,403,500"
 },
 {
  "method": "GET",
  "path": "/uploads/{key}",
  "tag": "uploads",
  "summary": "Serve an uploaded object (public images, gated payment proofs)",
  "opId": "serveFile",
  "security": "none",
  "body": null,
  "params": "",
  "responses": "200,401,404"
 },
 {
  "method": "GET",
  "path": "/api/v1/tickets",
  "tag": "tickets",
  "summary": "Daftar tiket kendala dan permohonan dukungan",
  "opId": "listTickets",
  "security": "bearer",
  "body": null,
  "params": "query:page;query:per_page;query:status;query:category;query:priority;query:source_app;query:search",
  "responses": "200,401,403"
 },
 {
  "method": "POST",
  "path": "/api/v1/tickets",
  "tag": "tickets",
  "summary": "Buat tiket kendala / dukungan baru",
  "opId": "createTicket",
  "security": "bearer",
  "body": "inline{title,description,category,priority,source_app,source_path,metadata}",
  "params": "",
  "responses": "201,400,401,422"
 },
 {
  "method": "GET",
  "path": "/api/v1/tickets/{id}",
  "tag": "tickets",
  "summary": "Detail tiket kendala dan riwayat komentar",
  "opId": "getTicket",
  "security": "bearer",
  "body": null,
  "params": "path:id",
  "responses": "200,401,403,404"
 },
 {
  "method": "PATCH",
  "path": "/api/v1/tickets/{id}",
  "tag": "tickets",
  "summary": "Perbarui status, prioritas, atau penugasan tiket",
  "opId": "updateTicket",
  "security": "bearer",
  "body": "inline{status,priority,assigned_to_id}",
  "params": "path:id",
  "responses": "200,401,403,404,422"
 },
 {
  "method": "POST",
  "path": "/api/v1/tickets/{id}/comments",
  "tag": "tickets",
  "summary": "Tambah komentar atau catatan ke tiket",
  "opId": "addTicketComment",
  "security": "bearer",
  "body": "inline{comment,is_internal}",
  "params": "path:id",
  "responses": "201,400,401,403,404"
 }
]