{"openapi":"3.0.0","paths":{"/api/v1/tenants":{"get":{"operationId":"TenantController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"status","required":false,"in":"query","description":"Filter by tenant status (e.g. ACTIVE, SUSPENDED)","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TenantEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all tenants","tags":["Tenants"]}},"/api/v1/tenants/{id}":{"get":{"operationId":"TenantController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TenantEntity"}}}]}}}},"404":{"description":"Tenant not found."}},"security":[{"bearer":[]}],"summary":"Get a tenant by ID","tags":["Tenants"]},"patch":{"operationId":"TenantController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TenantEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a tenant","tags":["Tenants"]}},"/api/v1/users":{"post":{"operationId":"UserController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UserEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new user","tags":["Users"]},"get":{"operationId":"UserController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"status","required":false,"in":"query","description":"Filter by user status (e.g. ACTIVE, SUSPENDED)","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UserEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all users","tags":["Users"]}},"/api/v1/users/{id}":{"get":{"operationId":"UserController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UserEntity"}}}]}}}},"404":{"description":"User not found."}},"security":[{"bearer":[]}],"summary":"Get a user by ID","tags":["Users"]},"patch":{"operationId":"UserController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UserEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a user","tags":["Users"]},"delete":{"operationId":"UserController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UserEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a user","tags":["Users"]}},"/api/v1/auth/signin":{"post":{"operationId":"AuthController_signIn_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignInDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LoginResponseDto"}}}]}}}},"201":{"description":""},"401":{"description":"Invalid credentials."},"429":{"description":"Too many login attempts."}},"summary":"User sign in","tags":["Auth"]}},"/api/v1/auth/set-active-branch":{"post":{"operationId":"AuthController_setActiveBranch_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetActiveBranchDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LoginResponseDto"}}}]}}}},"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Set active branch context","tags":["Auth"]}},"/api/v1/auth/session":{"get":{"operationId":"AuthController_getSession_v1","parameters":[],"responses":{"200":{"description":"Return current user info."}},"security":[{"bearer":[]}],"summary":"Get current session info","tags":["Auth"]}},"/api/v1/system-admin/tenants/onboard":{"post":{"operationId":"SystemAdminController_onboardTenant_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardTenantDto"}}}},"responses":{"201":{"description":"Tenant onboarded successfully with branch, roles, and owner."}},"security":[{"bearer":[]}],"summary":"Onboard a new tenant (creates tenant, branch, roles with permissions, and owner user in one transaction)","tags":["System Admin"]}},"/api/v1/system-admin/tenants/{id}":{"delete":{"operationId":"SystemAdminController_removeTenant_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Tenant deleted successfully."}},"security":[{"bearer":[]}],"summary":"Delete a tenant and all its data","tags":["System Admin"]}},"/api/v1/system-admin/users":{"post":{"operationId":"SystemAdminController_createUser_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserAsAdminDto"}}}},"responses":{"201":{"description":"User created successfully."}},"security":[{"bearer":[]}],"summary":"Create a user with explicit tenant context","tags":["System Admin"]}},"/api/v1/system-admin/roles/assign-permissions":{"post":{"operationId":"SystemAdminController_assignPermissionsToRole_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignPermissionToRoleDto"}}}},"responses":{"201":{"description":"Permissions assigned successfully."}},"security":[{"bearer":[]}],"summary":"Assign permissions to a role","tags":["System Admin"]}},"/api/v1/system-admin/users/assign-role":{"post":{"operationId":"SystemAdminController_assignRoleToUser_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignRoleToUserDto"}}}},"responses":{"201":{"description":"Role assigned successfully."}},"security":[{"bearer":[]}],"summary":"Assign a role to a user at a branch","tags":["System Admin"]}},"/api/v1/branches":{"post":{"operationId":"BranchController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBranchDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BranchEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new branch","tags":["Branches"]},"get":{"operationId":"BranchController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"status","required":false,"in":"query","description":"Filter by branch status (e.g. ACTIVE, INACTIVE)","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","description":"Filter by branch type (e.g. RETAIL, WAREHOUSE)","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BranchEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all branches","tags":["Branches"]}},"/api/v1/branches/{id}":{"get":{"operationId":"BranchController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BranchEntity"}}}]}}}},"404":{"description":"Branch not found."}},"security":[{"bearer":[]}],"summary":"Get a branch by ID","tags":["Branches"]},"patch":{"operationId":"BranchController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBranchDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BranchEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a branch","tags":["Branches"]},"delete":{"operationId":"BranchController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BranchEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a branch","tags":["Branches"]}},"/api/v1/roles":{"post":{"operationId":"RoleController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRoleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RoleEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new role","tags":["Roles"]},"get":{"operationId":"RoleController_findAll_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RoleEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all roles","tags":["Roles"]}},"/api/v1/roles/{id}":{"get":{"operationId":"RoleController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RoleEntity"}}}]}}}},"404":{"description":"Role not found."}},"security":[{"bearer":[]}],"summary":"Get a role by ID","tags":["Roles"]},"delete":{"operationId":"RoleController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RoleEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a role","tags":["Roles"]}},"/api/v1/roles/{id}/permissions":{"post":{"operationId":"RoleController_assignPermissions_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignPermissionToRoleDto"}}}},"responses":{"201":{"description":"Permissions assigned."}},"security":[{"bearer":[]}],"summary":"Assign permissions to a role","tags":["Roles"]}},"/api/v1/permissions":{"get":{"operationId":"PermissionController_findAll_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PermissionEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all available system permissions","tags":["Permissions"]}},"/api/v1/categories":{"post":{"operationId":"CategoryController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCategoryDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CategoryEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new category","tags":["Categories"]},"get":{"operationId":"CategoryController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CategoryEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all categories (paginated)","tags":["Categories"]}},"/api/v1/categories/tree":{"get":{"operationId":"CategoryController_findTree_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CategoryEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get category tree (nested children)","tags":["Categories"]}},"/api/v1/categories/{id}":{"get":{"operationId":"CategoryController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CategoryEntity"}}}]}}}},"404":{"description":"Category not found."}},"security":[{"bearer":[]}],"summary":"Get a category by ID","tags":["Categories"]},"patch":{"operationId":"CategoryController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCategoryDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CategoryEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a category","tags":["Categories"]},"delete":{"operationId":"CategoryController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CategoryEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a category","tags":["Categories"]}},"/api/v1/uom-classes":{"post":{"operationId":"UomClassController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUomClassDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UomClassEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UomClassEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new UOM class","tags":["UOM Classes"]},"get":{"operationId":"UomClassController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UomClassEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all UOM classes","tags":["UOM Classes"]}},"/api/v1/uom-classes/{id}":{"get":{"operationId":"UomClassController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UomClassEntity"}}}]}}}},"404":{"description":"UOM class not found."}},"security":[{"bearer":[]}],"summary":"Get a UOM class by ID","tags":["UOM Classes"]},"patch":{"operationId":"UomClassController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUomClassDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UomClassEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a UOM class","tags":["UOM Classes"]},"delete":{"operationId":"UomClassController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UomClassEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a UOM class","tags":["UOM Classes"]}},"/api/v1/uoms":{"post":{"operationId":"UomController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUomDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UomEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UomEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new UOM","tags":["UOMs"]},"get":{"operationId":"UomController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"classId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UomEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all UOMs","tags":["UOMs"]}},"/api/v1/uoms/{id}":{"get":{"operationId":"UomController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UomEntity"}}}]}}}},"404":{"description":"UOM not found."}},"security":[{"bearer":[]}],"summary":"Get a UOM by ID","tags":["UOMs"]},"patch":{"operationId":"UomController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUomDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UomEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a UOM","tags":["UOMs"]},"delete":{"operationId":"UomController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UomEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a UOM","tags":["UOMs"]}},"/api/v1/products":{"post":{"operationId":"ProductController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProductDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ProductEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new product","tags":["Products"]},"get":{"operationId":"ProductController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"categoryId","required":false,"in":"query","description":"Filter by category ID","schema":{"format":"uuid","type":"string"}},{"name":"trackingType","required":false,"in":"query","description":"Filter by tracking type (e.g. STANDARD, SERIALIZED)","schema":{"type":"string"}},{"name":"inStockOnly","required":false,"in":"query","description":"If true, return only products whose total on-hand stock is greater than 0","schema":{"type":"boolean"}},{"name":"locationId","required":false,"in":"query","description":"Scope stock computation to this location (applies to inStockOnly filter and totalOnHand enrichment)","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all products","tags":["Products"]}},"/api/v1/products/{id}":{"get":{"operationId":"ProductController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ProductEntity"}}}]}}}},"404":{"description":"Product not found."}},"security":[{"bearer":[]}],"summary":"Get a product by ID","tags":["Products"]},"patch":{"operationId":"ProductController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProductDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ProductEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a product","tags":["Products"]},"delete":{"operationId":"ProductController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ProductEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a product","tags":["Products"]}},"/api/v1/products/{productId}/variants":{"post":{"operationId":"ProductVariantController_create_v1","parameters":[{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProductVariantDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ProductVariantEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVariantEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new product variant","tags":["Product Variants"]},"get":{"operationId":"ProductVariantController_findAll_v1","parameters":[{"name":"productId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductVariantEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all variants for a product","tags":["Product Variants"]}},"/api/v1/products/{productId}/variants/{id}":{"get":{"operationId":"ProductVariantController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ProductVariantEntity"}}}]}}}},"404":{"description":"Product variant not found."}},"security":[{"bearer":[]}],"summary":"Get a product variant by ID","tags":["Product Variants"]},"patch":{"operationId":"ProductVariantController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProductVariantDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ProductVariantEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a product variant","tags":["Product Variants"]},"delete":{"operationId":"ProductVariantController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ProductVariantEntity"}}}]}}}},"400":{"description":"Cannot delete the last variant of a product."},"404":{"description":"Product variant not found."}},"security":[{"bearer":[]}],"summary":"Delete a product variant","tags":["Product Variants"]}},"/api/v1/locations":{"post":{"operationId":"LocationController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLocationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LocationEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new location","tags":["Locations"]},"get":{"operationId":"LocationController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/LocationEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all locations (paginated)","tags":["Locations"]}},"/api/v1/locations/tree":{"get":{"operationId":"LocationController_findTree_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LocationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get location tree (nested subLocations)","tags":["Locations"]}},"/api/v1/locations/{id}":{"get":{"operationId":"LocationController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LocationEntity"}}}]}}}},"404":{"description":"Location not found."}},"security":[{"bearer":[]}],"summary":"Get a location by ID","tags":["Locations"]},"patch":{"operationId":"LocationController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLocationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LocationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a location","tags":["Locations"]},"delete":{"operationId":"LocationController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LocationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a location","tags":["Locations"]}},"/api/v1/vendors":{"post":{"operationId":"VendorController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVendorDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VendorEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VendorEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new vendor","tags":["Vendors"]},"get":{"operationId":"VendorController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/VendorEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all vendors","tags":["Vendors"]}},"/api/v1/vendors/{id}":{"get":{"operationId":"VendorController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VendorEntity"}}}]}}}},"404":{"description":"Vendor not found."}},"security":[{"bearer":[]}],"summary":"Get a vendor by ID","tags":["Vendors"]},"patch":{"operationId":"VendorController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVendorDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VendorEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a vendor","tags":["Vendors"]},"delete":{"operationId":"VendorController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VendorEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a vendor","tags":["Vendors"]}},"/api/v1/transfer-orders":{"post":{"operationId":"TransferOrderController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTransferOrderDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TransferOrderEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferOrderEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new transfer order","tags":["Transfer Orders"]},"get":{"operationId":"TransferOrderController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TransferOrderEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all transfer orders","tags":["Transfer Orders"]}},"/api/v1/transfer-orders/{id}":{"get":{"operationId":"TransferOrderController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TransferOrderEntity"}}}]}}}},"404":{"description":"Transfer order not found."}},"security":[{"bearer":[]}],"summary":"Get a transfer order by ID","tags":["Transfer Orders"]},"patch":{"operationId":"TransferOrderController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTransferOrderDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TransferOrderEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a transfer order","tags":["Transfer Orders"]},"delete":{"operationId":"TransferOrderController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TransferOrderEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a transfer order","tags":["Transfer Orders"]}},"/api/v1/transfer-orders/{transferOrderId}/lines":{"post":{"operationId":"TransferOrderLineController_create_v1","parameters":[{"name":"transferOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTransferOrderLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TransferOrderLineEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferOrderLineEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new transfer order line","tags":["Transfer Order Lines"]},"get":{"operationId":"TransferOrderLineController_findAll_v1","parameters":[{"name":"transferOrderId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TransferOrderLineEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all lines for a transfer order","tags":["Transfer Order Lines"]}},"/api/v1/transfer-orders/{transferOrderId}/lines/{id}":{"get":{"operationId":"TransferOrderLineController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"transferOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TransferOrderLineEntity"}}}]}}}},"404":{"description":"Transfer order line not found."}},"security":[{"bearer":[]}],"summary":"Get a transfer order line by ID","tags":["Transfer Order Lines"]},"patch":{"operationId":"TransferOrderLineController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"transferOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTransferOrderLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TransferOrderLineEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a transfer order line","tags":["Transfer Order Lines"]},"delete":{"operationId":"TransferOrderLineController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"transferOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TransferOrderLineEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a transfer order line","tags":["Transfer Order Lines"]}},"/api/v1/purchase-requisitions":{"post":{"operationId":"PurchaseRequisitionController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePurchaseRequisitionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PurchaseRequisitionEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRequisitionEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new purchase requisition","tags":["Purchase Requisitions"]},"get":{"operationId":"PurchaseRequisitionController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseRequisitionEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all purchase requisitions","tags":["Purchase Requisitions"]}},"/api/v1/purchase-requisitions/{id}":{"get":{"operationId":"PurchaseRequisitionController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PurchaseRequisitionEntity"}}}]}}}},"404":{"description":"Purchase requisition not found."}},"security":[{"bearer":[]}],"summary":"Get a purchase requisition by ID","tags":["Purchase Requisitions"]},"patch":{"operationId":"PurchaseRequisitionController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePurchaseRequisitionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PurchaseRequisitionEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a purchase requisition","tags":["Purchase Requisitions"]},"delete":{"operationId":"PurchaseRequisitionController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PurchaseRequisitionEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a purchase requisition","tags":["Purchase Requisitions"]}},"/api/v1/purchase-orders":{"post":{"operationId":"PurchaseOrderController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePurchaseOrderDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PurchaseOrderEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseOrderEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new purchase order","tags":["Purchase Orders"]},"get":{"operationId":"PurchaseOrderController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseOrderEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all purchase orders","tags":["Purchase Orders"]}},"/api/v1/purchase-orders/{id}":{"get":{"operationId":"PurchaseOrderController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PurchaseOrderEntity"}}}]}}}},"404":{"description":"Purchase order not found."}},"security":[{"bearer":[]}],"summary":"Get a purchase order by ID","tags":["Purchase Orders"]},"patch":{"operationId":"PurchaseOrderController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePurchaseOrderDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PurchaseOrderEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a purchase order","tags":["Purchase Orders"]},"delete":{"operationId":"PurchaseOrderController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PurchaseOrderEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a purchase order","tags":["Purchase Orders"]}},"/api/v1/goods-received-notes":{"post":{"operationId":"GoodsReceivedNoteController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGoodsReceivedNoteDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/GoodsReceivedNoteEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsReceivedNoteEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new goods received note","tags":["Goods Received Notes"]},"get":{"operationId":"GoodsReceivedNoteController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/GoodsReceivedNoteEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all goods received notes","tags":["Goods Received Notes"]}},"/api/v1/goods-received-notes/{id}":{"get":{"operationId":"GoodsReceivedNoteController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/GoodsReceivedNoteEntity"}}}]}}}},"404":{"description":"Goods received note not found."}},"security":[{"bearer":[]}],"summary":"Get a goods received note by ID","tags":["Goods Received Notes"]},"patch":{"operationId":"GoodsReceivedNoteController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGoodsReceivedNoteDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/GoodsReceivedNoteEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a goods received note","tags":["Goods Received Notes"]},"delete":{"operationId":"GoodsReceivedNoteController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/GoodsReceivedNoteEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a goods received note","tags":["Goods Received Notes"]}},"/api/v1/goods-received-notes/{grnId}/lines":{"post":{"operationId":"GrnLineController_create_v1","parameters":[{"name":"grnId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGrnLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/GrnLineEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrnLineEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new GRN line","tags":["GRN Lines"]},"get":{"operationId":"GrnLineController_findAll_v1","parameters":[{"name":"grnId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/GrnLineEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all lines for a GRN","tags":["GRN Lines"]}},"/api/v1/goods-received-notes/{grnId}/lines/{id}":{"get":{"operationId":"GrnLineController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"grnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/GrnLineEntity"}}}]}}}},"404":{"description":"GRN line not found."}},"security":[{"bearer":[]}],"summary":"Get a GRN line by ID","tags":["GRN Lines"]},"patch":{"operationId":"GrnLineController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"grnId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGrnLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/GrnLineEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a GRN line","tags":["GRN Lines"]},"delete":{"operationId":"GrnLineController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"grnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/GrnLineEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a GRN line","tags":["GRN Lines"]}},"/api/v1/vendor-invoices":{"post":{"operationId":"VendorInvoiceController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVendorInvoiceDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VendorInvoiceEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VendorInvoiceEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new vendor invoice","tags":["Vendor Invoices"]},"get":{"operationId":"VendorInvoiceController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/VendorInvoiceEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all vendor invoices","tags":["Vendor Invoices"]}},"/api/v1/vendor-invoices/{id}":{"get":{"operationId":"VendorInvoiceController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VendorInvoiceEntity"}}}]}}}},"404":{"description":"Vendor invoice not found."}},"security":[{"bearer":[]}],"summary":"Get a vendor invoice by ID","tags":["Vendor Invoices"]},"patch":{"operationId":"VendorInvoiceController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVendorInvoiceDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VendorInvoiceEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a vendor invoice","tags":["Vendor Invoices"]},"delete":{"operationId":"VendorInvoiceController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VendorInvoiceEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a vendor invoice","tags":["Vendor Invoices"]}},"/api/v1/landed-cost-allocations":{"post":{"operationId":"LandedCostAllocationController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLandedCostAllocationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LandedCostAllocationEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandedCostAllocationEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new landed cost allocation","tags":["Landed Cost Allocations"]},"get":{"operationId":"LandedCostAllocationController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/LandedCostAllocationEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all landed cost allocations","tags":["Landed Cost Allocations"]}},"/api/v1/landed-cost-allocations/{id}":{"get":{"operationId":"LandedCostAllocationController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LandedCostAllocationEntity"}}}]}}}},"404":{"description":"Landed cost allocation not found."}},"security":[{"bearer":[]}],"summary":"Get a landed cost allocation by ID","tags":["Landed Cost Allocations"]},"patch":{"operationId":"LandedCostAllocationController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLandedCostAllocationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LandedCostAllocationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a landed cost allocation","tags":["Landed Cost Allocations"]},"delete":{"operationId":"LandedCostAllocationController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LandedCostAllocationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a landed cost allocation","tags":["Landed Cost Allocations"]}},"/api/v1/customers":{"post":{"operationId":"CustomerController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomerDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CustomerEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new customer","tags":["Customers"]},"get":{"operationId":"CustomerController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomerEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Search and list customers (search by phone, name, or email)","tags":["Customers"]}},"/api/v1/customers/{id}":{"get":{"operationId":"CustomerController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CustomerEntity"}}}]}}}},"404":{"description":"Customer not found."}},"security":[{"bearer":[]}],"summary":"Get a customer by ID","tags":["Customers"]},"patch":{"operationId":"CustomerController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomerDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CustomerEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a customer","tags":["Customers"]},"delete":{"operationId":"CustomerController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CustomerEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a customer","tags":["Customers"]}},"/api/v1/customers/{customerId}/loyalty-ledger":{"post":{"operationId":"LoyaltyLedgerController_create_v1","parameters":[{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLoyaltyLedgerDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LoyaltyLedgerEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoyaltyLedgerEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new loyalty ledger entry","tags":["Loyalty Ledger"]},"get":{"operationId":"LoyaltyLedgerController_findAll_v1","parameters":[{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/LoyaltyLedgerEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all loyalty ledger entries for a customer","tags":["Loyalty Ledger"]}},"/api/v1/customers/{customerId}/loyalty-ledger/{id}":{"get":{"operationId":"LoyaltyLedgerController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LoyaltyLedgerEntity"}}}]}}}},"404":{"description":"Loyalty ledger entry not found."}},"security":[{"bearer":[]}],"summary":"Get a loyalty ledger entry by ID","tags":["Loyalty Ledger"]},"patch":{"operationId":"LoyaltyLedgerController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLoyaltyLedgerDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LoyaltyLedgerEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a loyalty ledger entry","tags":["Loyalty Ledger"]},"delete":{"operationId":"LoyaltyLedgerController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/LoyaltyLedgerEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a loyalty ledger entry","tags":["Loyalty Ledger"]}},"/api/v1/customers/{customerId}/interactions":{"post":{"operationId":"CustomerInteractionController_create_v1","parameters":[{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomerInteractionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CustomerInteractionEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerInteractionEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new customer interaction","tags":["Customer Interactions"]},"get":{"operationId":"CustomerInteractionController_findAll_v1","parameters":[{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomerInteractionEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all interactions for a customer","tags":["Customer Interactions"]}},"/api/v1/customers/{customerId}/interactions/{id}":{"get":{"operationId":"CustomerInteractionController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CustomerInteractionEntity"}}}]}}}},"404":{"description":"Customer interaction not found."}},"security":[{"bearer":[]}],"summary":"Get a customer interaction by ID","tags":["Customer Interactions"]},"patch":{"operationId":"CustomerInteractionController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomerInteractionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CustomerInteractionEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a customer interaction","tags":["Customer Interactions"]},"delete":{"operationId":"CustomerInteractionController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CustomerInteractionEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a customer interaction","tags":["Customer Interactions"]}},"/api/v1/sales-orders":{"post":{"operationId":"SalesOrderController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSalesOrderDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new sales order","tags":["Sales Orders"]},"get":{"operationId":"SalesOrderController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"status","required":false,"in":"query","description":"Filter by order status (e.g. DRAFT, CONFIRMED, COMPLETED)","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","description":"Filter by customer ID","schema":{"format":"uuid","type":"string"}},{"name":"dateFrom","required":false,"in":"query","description":"Filter orders from this date (ISO 8601)","schema":{"format":"date-time","type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Filter orders until this date (ISO 8601)","schema":{"format":"date-time","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SalesOrderEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all sales orders","tags":["Sales Orders"]}},"/api/v1/sales-orders/{id}":{"get":{"operationId":"SalesOrderController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderEntity"}}}]}}}},"404":{"description":"Sales order not found."}},"security":[{"bearer":[]}],"summary":"Get a sales order by ID","tags":["Sales Orders"]},"patch":{"operationId":"SalesOrderController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSalesOrderDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a sales order","tags":["Sales Orders"]},"delete":{"operationId":"SalesOrderController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a sales order","tags":["Sales Orders"]}},"/api/v1/sales-orders/{salesOrderId}/lines":{"post":{"operationId":"SalesOrderLineController_create_v1","parameters":[{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSalesOrderLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new sales order line","tags":["Sales Order Lines"]},"get":{"operationId":"SalesOrderLineController_findAll_v1","parameters":[{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SalesOrderLineEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all lines for a sales order","tags":["Sales Order Lines"]}},"/api/v1/sales-orders/{salesOrderId}/lines/{id}":{"get":{"operationId":"SalesOrderLineController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}]}}}},"404":{"description":"Sales order line not found."}},"security":[{"bearer":[]}],"summary":"Get a sales order line by ID","tags":["Sales Order Lines"]},"patch":{"operationId":"SalesOrderLineController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSalesOrderLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a sales order line","tags":["Sales Order Lines"]},"delete":{"operationId":"SalesOrderLineController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a sales order line","tags":["Sales Order Lines"]}},"/api/v1/sales-orders/{salesOrderId}/lines/{id}/fire":{"post":{"operationId":"SalesOrderLineController_fire_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}},"400":{"description":"Line is not in PENDING state."}},"security":[{"bearer":[]}],"summary":"Fire a line (PENDING → FIRED)","tags":["Sales Order Lines"]}},"/api/v1/sales-orders/{salesOrderId}/lines/{id}/ready":{"post":{"operationId":"SalesOrderLineController_ready_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}},"400":{"description":"Line is not in FIRED state."}},"security":[{"bearer":[]}],"summary":"Mark a line ready (FIRED → READY)","tags":["Sales Order Lines"]}},"/api/v1/sales-orders/{salesOrderId}/lines/{id}/serve":{"post":{"operationId":"SalesOrderLineController_serve_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}},"400":{"description":"Line is not in READY state."}},"security":[{"bearer":[]}],"summary":"Mark a line served (READY → SERVED)","tags":["Sales Order Lines"]}},"/api/v1/sales-orders/{salesOrderId}/lines/{id}/void":{"post":{"operationId":"SalesOrderLineController_voidLine_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoidLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}},"400":{"description":"Line is in a terminal state."}},"security":[{"bearer":[]}],"summary":"Void a line with a reason","tags":["Sales Order Lines"]}},"/api/v1/sales-orders/{salesOrderId}/lines/{id}/comp":{"post":{"operationId":"SalesOrderLineController_compLine_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderLineEntity"}}}},"400":{"description":"Line is in a terminal state."}},"security":[{"bearer":[]}],"summary":"Comp a line with a discount reason","tags":["Sales Order Lines"]}},"/api/v1/sales-orders/{salesOrderId}/payments":{"post":{"operationId":"OrderPaymentController_create_v1","parameters":[{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderPaymentDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/OrderPaymentEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderPaymentEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new order payment","tags":["Order Payments"]},"get":{"operationId":"OrderPaymentController_findAll_v1","parameters":[{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/OrderPaymentEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all payments for a sales order","tags":["Order Payments"]}},"/api/v1/sales-orders/{salesOrderId}/payments/{id}":{"get":{"operationId":"OrderPaymentController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/OrderPaymentEntity"}}}]}}}},"404":{"description":"Order payment not found."}},"security":[{"bearer":[]}],"summary":"Get an order payment by ID","tags":["Order Payments"]},"patch":{"operationId":"OrderPaymentController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrderPaymentDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/OrderPaymentEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update an order payment","tags":["Order Payments"]},"delete":{"operationId":"OrderPaymentController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/OrderPaymentEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete an order payment","tags":["Order Payments"]}},"/api/v1/promotion-rules":{"post":{"operationId":"PromotionRuleController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePromotionRuleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PromotionRuleEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromotionRuleEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new promotion rule","tags":["Promotion Rules"]},"get":{"operationId":"PromotionRuleController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PromotionRuleEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all promotion rules","tags":["Promotion Rules"]}},"/api/v1/promotion-rules/{id}":{"get":{"operationId":"PromotionRuleController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PromotionRuleEntity"}}}]}}}},"404":{"description":"Promotion rule not found."}},"security":[{"bearer":[]}],"summary":"Get a promotion rule by ID","tags":["Promotion Rules"]},"patch":{"operationId":"PromotionRuleController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePromotionRuleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PromotionRuleEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a promotion rule","tags":["Promotion Rules"]},"delete":{"operationId":"PromotionRuleController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PromotionRuleEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a promotion rule","tags":["Promotion Rules"]}},"/api/v1/checkout":{"post":{"operationId":"CheckoutController_checkout_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CheckoutResponseDto"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Process a checkout/sale transaction","tags":["Checkout"]}},"/api/v1/checkout/{id}/void":{"post":{"operationId":"CheckoutController_voidSale_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CheckoutResponseDto"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Void/cancel a completed sale","tags":["Checkout"]}},"/api/v1/receipts/{salesOrderId}":{"get":{"operationId":"ReceiptController_getReceipt_v1","parameters":[{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReceiptResponseDto"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get receipt for a completed sale","tags":["Receipts"]}},"/api/v1/refunds":{"post":{"operationId":"RefundController_processReturn_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessReturnDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReturnResponseDto"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Process a return/refund","tags":["Refunds"]}},"/api/v1/refunds/{id}":{"get":{"operationId":"RefundController_getReturn_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReturnResponseDto"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get return details by ID","tags":["Refunds"]}},"/api/v1/refunds/order/{salesOrderId}":{"get":{"operationId":"RefundController_getReturnsByOrder_v1","parameters":[{"name":"salesOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReturnResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"List all returns for a sales order","tags":["Refunds"]}},"/api/v1/pos-registers":{"post":{"operationId":"PosRegisterController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePosRegisterDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PosRegisterEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosRegisterEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new POS register","tags":["POS Registers"]},"get":{"operationId":"PosRegisterController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PosRegisterEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all POS registers","tags":["POS Registers"]}},"/api/v1/pos-registers/{id}":{"get":{"operationId":"PosRegisterController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PosRegisterEntity"}}}]}}}},"404":{"description":"POS register not found."}},"security":[{"bearer":[]}],"summary":"Get a POS register by ID","tags":["POS Registers"]},"patch":{"operationId":"PosRegisterController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePosRegisterDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PosRegisterEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a POS register","tags":["POS Registers"]},"delete":{"operationId":"PosRegisterController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PosRegisterEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a POS register","tags":["POS Registers"]}},"/api/v1/pos-sessions":{"post":{"operationId":"PosSessionController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePosSessionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PosSessionEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSessionEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new POS session","tags":["POS Sessions"]},"get":{"operationId":"PosSessionController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PosSessionEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all POS sessions","tags":["POS Sessions"]}},"/api/v1/pos-sessions/{id}":{"get":{"operationId":"PosSessionController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PosSessionEntity"}}}]}}}},"404":{"description":"POS session not found."}},"security":[{"bearer":[]}],"summary":"Get a POS session by ID","tags":["POS Sessions"]},"patch":{"operationId":"PosSessionController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePosSessionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PosSessionEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a POS session","tags":["POS Sessions"]},"delete":{"operationId":"PosSessionController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PosSessionEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a POS session","tags":["POS Sessions"]}},"/api/v1/pos-sessions/{id}/close":{"post":{"operationId":"PosSessionController_closeSession_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClosePosSessionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/EndOfDaySummaryDto"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndOfDaySummaryDto"}}}}},"security":[{"bearer":[]}],"summary":"Close a POS session with cash count (End of Day)","tags":["POS Sessions"]}},"/api/v1/pos-sessions/{id}/summary":{"get":{"operationId":"PosSessionController_getSessionSummary_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/EndOfDaySummaryDto"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get POS session summary (sales, refunds, payment breakdown)","tags":["POS Sessions"]}},"/api/v1/payment-methods":{"post":{"operationId":"PaymentMethodController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePaymentMethodDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PaymentMethodEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new payment method","tags":["Payment Methods"]},"get":{"operationId":"PaymentMethodController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PaymentMethodEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all payment methods","tags":["Payment Methods"]}},"/api/v1/payment-methods/{id}":{"get":{"operationId":"PaymentMethodController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PaymentMethodEntity"}}}]}}}},"404":{"description":"Payment method not found."}},"security":[{"bearer":[]}],"summary":"Get a payment method by ID","tags":["Payment Methods"]},"patch":{"operationId":"PaymentMethodController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePaymentMethodDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PaymentMethodEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a payment method","tags":["Payment Methods"]},"delete":{"operationId":"PaymentMethodController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PaymentMethodEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a payment method","tags":["Payment Methods"]}},"/api/v1/inventory-ledger":{"post":{"operationId":"InventoryLedgerController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInventoryLedgerDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/InventoryLedgerEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryLedgerEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new inventory ledger entry","tags":["Inventory Ledger"]},"get":{"operationId":"InventoryLedgerController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/InventoryLedgerEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all inventory ledger entries","tags":["Inventory Ledger"]}},"/api/v1/inventory-ledger/expiring":{"get":{"operationId":"InventoryLedgerController_findExpiring_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"days","required":false,"in":"query","description":"Number of days to look ahead for expiring stock","schema":{"minimum":1,"default":30,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/InventoryLedgerEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get stock expiring within N days","tags":["Inventory Ledger"]}},"/api/v1/inventory-ledger/write-off":{"post":{"operationId":"InventoryLedgerController_writeOff_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteOffInventoryDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/InventoryLedgerEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryLedgerEntity"}}}}},"security":[{"bearer":[]}],"summary":"Write off expired or damaged stock","tags":["Inventory Ledger"]}},"/api/v1/inventory-ledger/balance/{variantId}/{locationId}":{"get":{"operationId":"InventoryLedgerController_getBalance_v1","parameters":[{"name":"variantId","required":true,"in":"path","schema":{"type":"string"}},{"name":"locationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns the inventory balance."}},"security":[{"bearer":[]}],"summary":"Get inventory balance for a variant at a location","tags":["Inventory Ledger"]}},"/api/v1/inventory-ledger/{id}":{"get":{"operationId":"InventoryLedgerController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/InventoryLedgerEntity"}}}]}}}},"404":{"description":"Inventory ledger entry not found."}},"security":[{"bearer":[]}],"summary":"Get an inventory ledger entry by ID","tags":["Inventory Ledger"]},"delete":{"operationId":"InventoryLedgerController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/InventoryLedgerEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete an inventory ledger entry","tags":["Inventory Ledger"]}},"/api/v1/exchange-rates":{"post":{"operationId":"ExchangeRateController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExchangeRateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ExchangeRateEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRateEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new exchange rate","tags":["Exchange Rates"]},"get":{"operationId":"ExchangeRateController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ExchangeRateEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all exchange rates","tags":["Exchange Rates"]}},"/api/v1/exchange-rates/{id}":{"get":{"operationId":"ExchangeRateController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ExchangeRateEntity"}}}]}}}},"404":{"description":"Exchange rate not found."}},"security":[{"bearer":[]}],"summary":"Get an exchange rate by ID","tags":["Exchange Rates"]},"patch":{"operationId":"ExchangeRateController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExchangeRateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ExchangeRateEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update an exchange rate","tags":["Exchange Rates"]},"delete":{"operationId":"ExchangeRateController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ExchangeRateEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete an exchange rate","tags":["Exchange Rates"]}},"/api/v1/tax-rates":{"post":{"operationId":"TaxRateController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaxRateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TaxRateEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxRateEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new tax rate","tags":["Tax Rates"]},"get":{"operationId":"TaxRateController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TaxRateEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all tax rates","tags":["Tax Rates"]}},"/api/v1/tax-rates/{id}":{"get":{"operationId":"TaxRateController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TaxRateEntity"}}}]}}}},"404":{"description":"Tax rate not found."}},"security":[{"bearer":[]}],"summary":"Get a tax rate by ID","tags":["Tax Rates"]},"patch":{"operationId":"TaxRateController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTaxRateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TaxRateEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a tax rate","tags":["Tax Rates"]},"delete":{"operationId":"TaxRateController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TaxRateEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a tax rate","tags":["Tax Rates"]}},"/api/v1/accounting-periods":{"post":{"operationId":"AccountingPeriodController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAccountingPeriodDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/AccountingPeriodEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountingPeriodEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new accounting period","tags":["Accounting Periods"]},"get":{"operationId":"AccountingPeriodController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AccountingPeriodEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all accounting periods","tags":["Accounting Periods"]}},"/api/v1/accounting-periods/{id}":{"get":{"operationId":"AccountingPeriodController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/AccountingPeriodEntity"}}}]}}}},"404":{"description":"Accounting period not found."}},"security":[{"bearer":[]}],"summary":"Get an accounting period by ID","tags":["Accounting Periods"]},"patch":{"operationId":"AccountingPeriodController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAccountingPeriodDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/AccountingPeriodEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update an accounting period","tags":["Accounting Periods"]},"delete":{"operationId":"AccountingPeriodController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/AccountingPeriodEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete an accounting period","tags":["Accounting Periods"]}},"/api/v1/chart-of-accounts":{"post":{"operationId":"ChartOfAccountController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateChartOfAccountDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ChartOfAccountEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartOfAccountEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new chart of account","tags":["Chart of Accounts"]},"get":{"operationId":"ChartOfAccountController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ChartOfAccountEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all chart of accounts","tags":["Chart of Accounts"]}},"/api/v1/chart-of-accounts/{id}":{"get":{"operationId":"ChartOfAccountController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ChartOfAccountEntity"}}}]}}}},"404":{"description":"Chart of account not found."}},"security":[{"bearer":[]}],"summary":"Get a chart of account by ID","tags":["Chart of Accounts"]},"patch":{"operationId":"ChartOfAccountController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChartOfAccountDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ChartOfAccountEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a chart of account","tags":["Chart of Accounts"]},"delete":{"operationId":"ChartOfAccountController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ChartOfAccountEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a chart of account","tags":["Chart of Accounts"]}},"/api/v1/journal-entries":{"post":{"operationId":"JournalEntryController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJournalEntryDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/JournalEntryEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalEntryEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new journal entry","tags":["Journal Entries"]},"get":{"operationId":"JournalEntryController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/JournalEntryEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all journal entries","tags":["Journal Entries"]}},"/api/v1/journal-entries/{id}":{"get":{"operationId":"JournalEntryController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/JournalEntryEntity"}}}]}}}},"404":{"description":"Journal entry not found."}},"security":[{"bearer":[]}],"summary":"Get a journal entry by ID","tags":["Journal Entries"]},"patch":{"operationId":"JournalEntryController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateJournalEntryDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/JournalEntryEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a journal entry","tags":["Journal Entries"]},"delete":{"operationId":"JournalEntryController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/JournalEntryEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a journal entry","tags":["Journal Entries"]}},"/api/v1/journal-entries/{journalEntryId}/lines":{"post":{"operationId":"JournalLineController_create_v1","parameters":[{"name":"journalEntryId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJournalLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/JournalLineEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalLineEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new journal line","tags":["Journal Lines"]},"get":{"operationId":"JournalLineController_findAll_v1","parameters":[{"name":"journalEntryId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/JournalLineEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all lines for a journal entry","tags":["Journal Lines"]}},"/api/v1/journal-entries/{journalEntryId}/lines/{id}":{"get":{"operationId":"JournalLineController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"journalEntryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/JournalLineEntity"}}}]}}}},"404":{"description":"Journal line not found."}},"security":[{"bearer":[]}],"summary":"Get a journal line by ID","tags":["Journal Lines"]},"patch":{"operationId":"JournalLineController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"journalEntryId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateJournalLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/JournalLineEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a journal line","tags":["Journal Lines"]},"delete":{"operationId":"JournalLineController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"journalEntryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/JournalLineEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a journal line","tags":["Journal Lines"]}},"/api/v1/bank-statements":{"post":{"operationId":"BankStatementController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBankStatementDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BankStatementEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankStatementEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new bank statement","tags":["Bank Statements"]},"get":{"operationId":"BankStatementController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BankStatementEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all bank statements","tags":["Bank Statements"]}},"/api/v1/bank-statements/{id}":{"get":{"operationId":"BankStatementController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BankStatementEntity"}}}]}}}},"404":{"description":"Bank statement not found."}},"security":[{"bearer":[]}],"summary":"Get a bank statement by ID","tags":["Bank Statements"]},"patch":{"operationId":"BankStatementController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBankStatementDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BankStatementEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a bank statement","tags":["Bank Statements"]},"delete":{"operationId":"BankStatementController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BankStatementEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a bank statement","tags":["Bank Statements"]}},"/api/v1/bank-statements/{bankStatementId}/lines":{"post":{"operationId":"BankStatementLineController_create_v1","parameters":[{"name":"bankStatementId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBankStatementLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BankStatementLineEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankStatementLineEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new bank statement line","tags":["Bank Statement Lines"]},"get":{"operationId":"BankStatementLineController_findAll_v1","parameters":[{"name":"bankStatementId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BankStatementLineEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all lines for a bank statement","tags":["Bank Statement Lines"]}},"/api/v1/bank-statements/{bankStatementId}/lines/{id}":{"get":{"operationId":"BankStatementLineController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"bankStatementId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BankStatementLineEntity"}}}]}}}},"404":{"description":"Bank statement line not found."}},"security":[{"bearer":[]}],"summary":"Get a bank statement line by ID","tags":["Bank Statement Lines"]},"patch":{"operationId":"BankStatementLineController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"bankStatementId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBankStatementLineDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BankStatementLineEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a bank statement line","tags":["Bank Statement Lines"]},"delete":{"operationId":"BankStatementLineController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"bankStatementId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BankStatementLineEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a bank statement line","tags":["Bank Statement Lines"]}},"/api/v1/reconciliation-matches":{"post":{"operationId":"ReconciliationMatchController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReconciliationMatchDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReconciliationMatchEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReconciliationMatchEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new reconciliation match","tags":["Reconciliation Matches"]},"get":{"operationId":"ReconciliationMatchController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ReconciliationMatchEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all reconciliation matches","tags":["Reconciliation Matches"]}},"/api/v1/reconciliation-matches/{id}":{"get":{"operationId":"ReconciliationMatchController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReconciliationMatchEntity"}}}]}}}},"404":{"description":"Reconciliation match not found."}},"security":[{"bearer":[]}],"summary":"Get a reconciliation match by ID","tags":["Reconciliation Matches"]},"patch":{"operationId":"ReconciliationMatchController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateReconciliationMatchDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReconciliationMatchEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a reconciliation match","tags":["Reconciliation Matches"]},"delete":{"operationId":"ReconciliationMatchController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReconciliationMatchEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a reconciliation match","tags":["Reconciliation Matches"]}},"/api/v1/fixed-assets":{"post":{"operationId":"FixedAssetController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFixedAssetDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/FixedAssetEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FixedAssetEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new fixed asset","tags":["Fixed Assets"]},"get":{"operationId":"FixedAssetController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FixedAssetEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all fixed assets","tags":["Fixed Assets"]}},"/api/v1/fixed-assets/{id}":{"get":{"operationId":"FixedAssetController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/FixedAssetEntity"}}}]}}}},"404":{"description":"Fixed asset not found."}},"security":[{"bearer":[]}],"summary":"Get a fixed asset by ID","tags":["Fixed Assets"]},"patch":{"operationId":"FixedAssetController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFixedAssetDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/FixedAssetEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a fixed asset","tags":["Fixed Assets"]},"delete":{"operationId":"FixedAssetController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/FixedAssetEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a fixed asset","tags":["Fixed Assets"]}},"/api/v1/fixed-assets/{fixedAssetId}/depreciation-schedules":{"post":{"operationId":"DepreciationScheduleController_create_v1","parameters":[{"name":"fixedAssetId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDepreciationScheduleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DepreciationScheduleEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepreciationScheduleEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a new depreciation schedule","tags":["Depreciation Schedules"]},"get":{"operationId":"DepreciationScheduleController_findAll_v1","parameters":[{"name":"fixedAssetId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DepreciationScheduleEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all depreciation schedules for a fixed asset","tags":["Depreciation Schedules"]}},"/api/v1/fixed-assets/{fixedAssetId}/depreciation-schedules/{id}":{"get":{"operationId":"DepreciationScheduleController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"fixedAssetId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DepreciationScheduleEntity"}}}]}}}},"404":{"description":"Depreciation schedule not found."}},"security":[{"bearer":[]}],"summary":"Get a depreciation schedule by ID","tags":["Depreciation Schedules"]},"patch":{"operationId":"DepreciationScheduleController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"fixedAssetId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDepreciationScheduleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DepreciationScheduleEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a depreciation schedule","tags":["Depreciation Schedules"]},"delete":{"operationId":"DepreciationScheduleController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"fixedAssetId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DepreciationScheduleEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a depreciation schedule","tags":["Depreciation Schedules"]}},"/api/v1/uploads":{"get":{"operationId":"UploadController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"folder","required":false,"in":"query","schema":{"type":"string"}},{"name":"branchId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UploadResponseDto"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"Get all uploaded files with pagination","tags":["Uploads"]},"post":{"operationId":"UploadController_uploadFile_v1","parameters":[{"name":"folder","required":false,"in":"query","description":"Subfolder to store the file","schema":{"example":"products","type":"string"}},{"name":"branchId","required":false,"in":"query","description":"Branch ID (defaults to user branch)","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UploadResponseDto"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Upload a single file","tags":["Uploads"]}},"/api/v1/uploads/multiple":{"post":{"operationId":"UploadController_uploadFiles_v1","parameters":[{"name":"folder","required":false,"in":"query","schema":{"type":"string"}},{"name":"branchId","required":false,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary"}}},"required":["files"]}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/UploadResponseDto"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UploadResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Upload multiple files (max 10)","tags":["Uploads"]}},"/api/v1/uploads/{id}":{"delete":{"operationId":"UploadController_deleteFile_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Upload record ID","schema":{"type":"string"}}],"responses":{"200":{"description":"File deleted successfully.","content":{"application/json":{"schema":{"properties":{"message":{"type":"string","example":"File deleted successfully"}}}}}}},"security":[{"bearer":[]}],"summary":"Delete an uploaded file by ID","tags":["Uploads"]}},"/api/v1/modifier-groups":{"post":{"operationId":"ModifierGroupController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateModifierGroupDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ModifierGroupEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModifierGroupEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a modifier group","tags":["Modifier Groups"]},"get":{"operationId":"ModifierGroupController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ModifierGroupEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List modifier groups (paginated)","tags":["Modifier Groups"]}},"/api/v1/modifier-groups/{id}":{"get":{"operationId":"ModifierGroupController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ModifierGroupEntity"}}}]}}}},"404":{"description":"Modifier group not found."}},"security":[{"bearer":[]}],"summary":"Get a modifier group by ID","tags":["Modifier Groups"]},"patch":{"operationId":"ModifierGroupController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateModifierGroupDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ModifierGroupEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a modifier group","tags":["Modifier Groups"]},"delete":{"operationId":"ModifierGroupController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ModifierGroupEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a modifier group","tags":["Modifier Groups"]}},"/api/v1/modifier-groups/{id}/products":{"post":{"operationId":"ModifierGroupController_attachToProduct_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachModifierGroupDto"}}}},"responses":{"204":{"description":"Attached."}},"security":[{"bearer":[]}],"summary":"Attach a modifier group to a product","tags":["Modifier Groups"]}},"/api/v1/modifier-groups/{id}/products/{productId}":{"delete":{"operationId":"ModifierGroupController_detachFromProduct_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Detached."}},"security":[{"bearer":[]}],"summary":"Detach a modifier group from a product","tags":["Modifier Groups"]}},"/api/v1/modifier-groups/{groupId}/modifiers":{"post":{"operationId":"ModifierController_create_v1","parameters":[{"name":"groupId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateModifierDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ModifierEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModifierEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a modifier within a group","tags":["Modifiers"]},"get":{"operationId":"ModifierController_findAll_v1","parameters":[{"name":"groupId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ModifierEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"List modifiers in a group","tags":["Modifiers"]}},"/api/v1/modifier-groups/{groupId}/modifiers/{id}":{"get":{"operationId":"ModifierController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ModifierEntity"}}}]}}}},"404":{"description":"Modifier not found."}},"security":[{"bearer":[]}],"summary":"Get a modifier by ID","tags":["Modifiers"]},"patch":{"operationId":"ModifierController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateModifierDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ModifierEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a modifier","tags":["Modifiers"]},"delete":{"operationId":"ModifierController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ModifierEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a modifier","tags":["Modifiers"]}},"/api/v1/recipes":{"post":{"operationId":"RecipeController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRecipeDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RecipeEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipeEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a recipe (with ingredients)","tags":["Recipes"]},"get":{"operationId":"RecipeController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RecipeEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List recipes (paginated)","tags":["Recipes"]}},"/api/v1/recipes/by-variant/{variantId}":{"get":{"operationId":"RecipeController_findByVariant_v1","parameters":[{"name":"variantId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RecipeEntity"}}}]}}}},"404":{"description":"Recipe not found."}},"security":[{"bearer":[]}],"summary":"Get the recipe for a specific variant","tags":["Recipes"]}},"/api/v1/recipes/{id}":{"get":{"operationId":"RecipeController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RecipeEntity"}}}]}}}},"404":{"description":"Recipe not found."}},"security":[{"bearer":[]}],"summary":"Get a recipe by ID","tags":["Recipes"]},"patch":{"operationId":"RecipeController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRecipeDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RecipeEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a recipe (and optionally replace ingredients)","tags":["Recipes"]},"delete":{"operationId":"RecipeController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RecipeEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a recipe","tags":["Recipes"]}},"/api/v1/bundles":{"post":{"operationId":"BundleController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBundleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BundleEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundleEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a bundle (combo) with components","tags":["Bundles"]},"get":{"operationId":"BundleController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BundleEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List bundles (paginated)","tags":["Bundles"]}},"/api/v1/bundles/{id}":{"get":{"operationId":"BundleController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BundleEntity"}}}]}}}},"404":{"description":"Bundle not found."}},"security":[{"bearer":[]}],"summary":"Get a bundle by ID","tags":["Bundles"]},"patch":{"operationId":"BundleController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBundleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BundleEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a bundle (and optionally replace components)","tags":["Bundles"]},"delete":{"operationId":"BundleController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/BundleEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a bundle","tags":["Bundles"]}},"/api/v1/pricing-schedules":{"post":{"operationId":"PricingScheduleController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePricingScheduleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PricingScheduleEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingScheduleEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a pricing schedule (with rules)","tags":["Pricing Schedules"]},"get":{"operationId":"PricingScheduleController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PricingScheduleEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List pricing schedules (paginated)","tags":["Pricing Schedules"]}},"/api/v1/pricing-schedules/{id}":{"get":{"operationId":"PricingScheduleController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PricingScheduleEntity"}}}]}}}},"404":{"description":"Pricing schedule not found."}},"security":[{"bearer":[]}],"summary":"Get a pricing schedule by ID","tags":["Pricing Schedules"]},"patch":{"operationId":"PricingScheduleController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePricingScheduleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PricingScheduleEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a pricing schedule (and optionally replace rules)","tags":["Pricing Schedules"]},"delete":{"operationId":"PricingScheduleController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PricingScheduleEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a pricing schedule","tags":["Pricing Schedules"]}},"/api/v1/dining-zones":{"post":{"operationId":"DiningZoneController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDiningZoneDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiningZoneEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiningZoneEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a dining zone","tags":["Dining Zones"]},"get":{"operationId":"DiningZoneController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DiningZoneEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List dining zones (paginated)","tags":["Dining Zones"]}},"/api/v1/dining-zones/{id}":{"get":{"operationId":"DiningZoneController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiningZoneEntity"}}}]}}}},"404":{"description":"Dining zone not found."}},"security":[{"bearer":[]}],"summary":"Get a dining zone by ID","tags":["Dining Zones"]},"patch":{"operationId":"DiningZoneController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDiningZoneDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiningZoneEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a dining zone","tags":["Dining Zones"]},"delete":{"operationId":"DiningZoneController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiningZoneEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a dining zone","tags":["Dining Zones"]}},"/api/v1/dining-tables":{"post":{"operationId":"DiningTableController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDiningTableDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiningTableEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiningTableEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a dining table","tags":["Dining Tables"]},"get":{"operationId":"DiningTableController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"zoneId","required":false,"in":"query","description":"Filter by zone","schema":{"format":"uuid","type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["AVAILABLE","OCCUPIED","DIRTY","RESERVED"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DiningTableEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List dining tables (paginated)","tags":["Dining Tables"]}},"/api/v1/dining-tables/{id}":{"get":{"operationId":"DiningTableController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiningTableEntity"}}}]}}}},"404":{"description":"Dining table not found."}},"security":[{"bearer":[]}],"summary":"Get a dining table by ID","tags":["Dining Tables"]},"patch":{"operationId":"DiningTableController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDiningTableDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiningTableEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a dining table","tags":["Dining Tables"]},"delete":{"operationId":"DiningTableController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiningTableEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a dining table","tags":["Dining Tables"]}},"/api/v1/dining-tables/{id}/status":{"patch":{"operationId":"DiningTableController_updateStatus_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDiningTableStatusDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiningTableEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Change a dining table status","tags":["Dining Tables"]}},"/api/v1/sections":{"post":{"operationId":"SectionController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSectionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SectionEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a section","tags":["Sections"]},"get":{"operationId":"SectionController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SectionEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List sections (paginated)","tags":["Sections"]}},"/api/v1/sections/{id}":{"get":{"operationId":"SectionController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SectionEntity"}}}]}}}},"404":{"description":"Section not found."}},"security":[{"bearer":[]}],"summary":"Get a section by ID","tags":["Sections"]},"patch":{"operationId":"SectionController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSectionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SectionEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a section","tags":["Sections"]},"delete":{"operationId":"SectionController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SectionEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a section","tags":["Sections"]}},"/api/v1/sections/{id}/tables":{"post":{"operationId":"SectionController_attachTable_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachTableDto"}}}},"responses":{"204":{"description":"Attached."}},"security":[{"bearer":[]}],"summary":"Attach a dining table to this section","tags":["Sections"]}},"/api/v1/sections/{id}/tables/{tableId}":{"delete":{"operationId":"SectionController_detachTable_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"tableId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Detached."}},"security":[{"bearer":[]}],"summary":"Detach a dining table from this section","tags":["Sections"]}},"/api/v1/sections/{id}/assignments":{"post":{"operationId":"SectionController_createAssignment_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSectionAssignmentDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SectionAssignmentEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionAssignmentEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a waiter assignment to this section","tags":["Sections"]},"get":{"operationId":"SectionController_listAssignments_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SectionAssignmentEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"List assignments for this section","tags":["Sections"]}},"/api/v1/sections/assignments/{assignmentId}":{"patch":{"operationId":"SectionController_updateAssignment_v1","parameters":[{"name":"assignmentId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSectionAssignmentDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SectionAssignmentEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update an assignment (notes / endsAt)","tags":["Sections"]}},"/api/v1/sections/assignments/{assignmentId}/end":{"post":{"operationId":"SectionController_endAssignment_v1","parameters":[{"name":"assignmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SectionAssignmentEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionAssignmentEntity"}}}}},"security":[{"bearer":[]}],"summary":"End an assignment (sets endsAt to now)","tags":["Sections"]}},"/api/v1/kitchen-printers":{"post":{"operationId":"KitchenPrinterController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKitchenPrinterDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KitchenPrinterEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KitchenPrinterEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a kitchen printer","tags":["Kitchen Printers"]},"get":{"operationId":"KitchenPrinterController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/KitchenPrinterEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List kitchen printers (paginated)","tags":["Kitchen Printers"]}},"/api/v1/kitchen-printers/{id}":{"get":{"operationId":"KitchenPrinterController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KitchenPrinterEntity"}}}]}}}},"404":{"description":"Kitchen printer not found."}},"security":[{"bearer":[]}],"summary":"Get a kitchen printer by ID","tags":["Kitchen Printers"]},"patch":{"operationId":"KitchenPrinterController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKitchenPrinterDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KitchenPrinterEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a kitchen printer","tags":["Kitchen Printers"]},"delete":{"operationId":"KitchenPrinterController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KitchenPrinterEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a kitchen printer","tags":["Kitchen Printers"]}},"/api/v1/kitchen-printers/{id}/categories":{"post":{"operationId":"KitchenPrinterController_attachCategory_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachCategoryDto"}}}},"responses":{"204":{"description":"Attached."}},"security":[{"bearer":[]}],"summary":"Route a category to this printer","tags":["Kitchen Printers"]}},"/api/v1/kitchen-printers/{id}/categories/{categoryId}":{"delete":{"operationId":"KitchenPrinterController_detachCategory_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"categoryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Detached."}},"security":[{"bearer":[]}],"summary":"Stop routing a category to this printer","tags":["Kitchen Printers"]}},"/api/v1/discount-reasons":{"post":{"operationId":"DiscountReasonController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDiscountReasonDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiscountReasonEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscountReasonEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a discount reason","tags":["Discount Reasons"]},"get":{"operationId":"DiscountReasonController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"activeOnly","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DiscountReasonEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List discount reasons (paginated)","tags":["Discount Reasons"]}},"/api/v1/discount-reasons/{id}":{"get":{"operationId":"DiscountReasonController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiscountReasonEntity"}}}]}}}},"404":{"description":"Discount reason not found."}},"security":[{"bearer":[]}],"summary":"Get a discount reason by ID","tags":["Discount Reasons"]},"patch":{"operationId":"DiscountReasonController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDiscountReasonDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiscountReasonEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a discount reason","tags":["Discount Reasons"]},"delete":{"operationId":"DiscountReasonController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiscountReasonEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a discount reason","tags":["Discount Reasons"]}},"/api/v1/void-reasons":{"post":{"operationId":"VoidReasonController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVoidReasonDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VoidReasonEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoidReasonEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a void reason","tags":["Void Reasons"]},"get":{"operationId":"VoidReasonController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search keyword","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"activeOnly","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/VoidReasonEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List void reasons (paginated)","tags":["Void Reasons"]}},"/api/v1/void-reasons/{id}":{"get":{"operationId":"VoidReasonController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VoidReasonEntity"}}}]}}}},"404":{"description":"Void reason not found."}},"security":[{"bearer":[]}],"summary":"Get a void reason by ID","tags":["Void Reasons"]},"patch":{"operationId":"VoidReasonController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVoidReasonDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VoidReasonEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a void reason","tags":["Void Reasons"]},"delete":{"operationId":"VoidReasonController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/VoidReasonEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a void reason","tags":["Void Reasons"]}},"/api/v1/table-sessions":{"post":{"operationId":"TableSessionController_open_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenTableSessionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TableSessionEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableSessionEntity"}}}}},"security":[{"bearer":[]}],"summary":"Open a new table session (seat guests)","tags":["Table Sessions"]},"get":{"operationId":"TableSessionController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"example":10,"type":"number"}},{"name":"tableId","required":false,"in":"query","description":"Filter by table","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"waiterId","required":false,"in":"query","description":"Filter by waiter","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"sessionState","required":false,"in":"query","schema":{"type":"string","enum":["SEATED","ORDERING","SERVED","PAYMENT_PENDING","CLOSED"]}},{"name":"openOnly","required":false,"in":"query","description":"Only sessions that are still open (no closedAt)","schema":{"example":"true","type":"boolean"}},{"name":"sortBy","required":false,"in":"query","schema":{"example":"openedAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"example":"desc","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TableSessionEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List table sessions (paginated)","tags":["Table Sessions"]}},"/api/v1/table-sessions/{id}":{"get":{"operationId":"TableSessionController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TableSessionEntity"}}}]}}}},"404":{"description":"Table session not found."}},"security":[{"bearer":[]}],"summary":"Get a table session by ID with order + seat allocations","tags":["Table Sessions"]},"patch":{"operationId":"TableSessionController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTableSessionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TableSessionEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update waiter or guest count","tags":["Table Sessions"]}},"/api/v1/table-sessions/{id}/state":{"post":{"operationId":"TableSessionController_transitionState_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSessionStateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TableSessionEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableSessionEntity"}}}}},"security":[{"bearer":[]}],"summary":"Transition session state","tags":["Table Sessions"]}},"/api/v1/table-sessions/{id}/lines":{"post":{"operationId":"TableSessionController_addLine_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddSessionLineDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Add an order line to the session","tags":["Table Sessions"]}},"/api/v1/table-sessions/{id}/seats":{"post":{"operationId":"TableSessionController_allocateSeat_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllocateSeatDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SessionSeatAllocationEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionSeatAllocationEntity"}}}}},"security":[{"bearer":[]}],"summary":"Allocate an order line to a seat","tags":["Table Sessions"]}},"/api/v1/table-sessions/{id}/seats/{allocationId}":{"delete":{"operationId":"TableSessionController_removeAllocation_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"allocationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SessionSeatAllocationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Remove a seat allocation","tags":["Table Sessions"]}},"/api/v1/table-sessions/{id}/checkout":{"post":{"operationId":"TableSessionController_checkout_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSessionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TableSessionEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableSessionEntity"}}}}},"security":[{"bearer":[]}],"summary":"Checkout the session (close + capture payments + free table)","tags":["Table Sessions"]}},"/api/v1/kds/stations":{"post":{"operationId":"KdsStationController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKdsStationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KdsStationEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KdsStationEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a KDS station","tags":["KDS Stations"]},"get":{"operationId":"KdsStationController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"example":10,"type":"number"}},{"name":"search","required":false,"in":"query","schema":{"example":"Hot","type":"string"}},{"name":"locationId","required":false,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"sortBy","required":false,"in":"query","schema":{"example":"name","type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"example":"asc","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/KdsStationEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List KDS stations (paginated)","tags":["KDS Stations"]}},"/api/v1/kds/stations/{id}":{"get":{"operationId":"KdsStationController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KdsStationEntity"}}}]}}}},"404":{"description":"KDS station not found."}},"security":[{"bearer":[]}],"summary":"Get a KDS station by ID","tags":["KDS Stations"]},"patch":{"operationId":"KdsStationController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKdsStationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KdsStationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a KDS station","tags":["KDS Stations"]},"delete":{"operationId":"KdsStationController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KdsStationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Delete a KDS station","tags":["KDS Stations"]}},"/api/v1/kds/fire":{"post":{"operationId":"KdsTicketController_fire_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FireTicketsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Fire pending lines to KDS — pass sessionId (dine-in) or salesOrderId (counter/QSR)","tags":["KDS Tickets"]}},"/api/v1/kds/tickets":{"get":{"operationId":"KdsTicketController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"example":50,"type":"number"}},{"name":"stationId","required":false,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"sessionId","required":false,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["PENDING","PREPARING","READY","EXPEDITED"]}},{"name":"activeOnly","required":false,"in":"query","description":"Only active tickets (not READY)","schema":{"example":"true","type":"boolean"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/KdsTicketEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List KDS tickets (paginated)","tags":["KDS Tickets"]}},"/api/v1/kds/tickets/{id}":{"get":{"operationId":"KdsTicketController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KdsTicketEntity"}}}]}}}},"404":{"description":"KDS ticket not found."}},"security":[{"bearer":[]}],"summary":"Get a KDS ticket by ID","tags":["KDS Tickets"]}},"/api/v1/kds/tickets/{id}/start":{"post":{"operationId":"KdsTicketController_start_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KdsTicketEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KdsTicketEntity"}}}}},"security":[{"bearer":[]}],"summary":"Start preparing (PENDING -> PREPARING)","tags":["KDS Tickets"]}},"/api/v1/kds/tickets/{id}/ready":{"post":{"operationId":"KdsTicketController_markReady_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KdsTicketEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KdsTicketEntity"}}}}},"security":[{"bearer":[]}],"summary":"Bump entire ticket (-> READY, marks all lines + sales lines READY)","tags":["KDS Tickets"]}},"/api/v1/kds/tickets/{id}/recall":{"post":{"operationId":"KdsTicketController_recall_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KdsTicketEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KdsTicketEntity"}}}}},"security":[{"bearer":[]}],"summary":"Recall a bumped ticket (READY -> PREPARING)","tags":["KDS Tickets"]}},"/api/v1/kds/tickets/{id}/expedite":{"post":{"operationId":"KdsTicketController_expedite_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KdsTicketEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KdsTicketEntity"}}}}},"security":[{"bearer":[]}],"summary":"Mark ticket as EXPEDITED","tags":["KDS Tickets"]}},"/api/v1/kds/tickets/lines/{lineId}/ready":{"post":{"operationId":"KdsTicketController_bumpLine_v1","parameters":[{"name":"lineId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/KdsTicketLineEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KdsTicketLineEntity"}}}}},"security":[{"bearer":[]}],"summary":"Bump a single ticket line — auto-promotes ticket if all lines READY","tags":["KDS Tickets"]}},"/api/v1/reservations":{"post":{"operationId":"ReservationController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReservationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReservationEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReservationEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a reservation","tags":["Reservations"]},"get":{"operationId":"ReservationController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"example":10,"type":"number"}},{"name":"search","required":false,"in":"query","schema":{"example":"Jane","type":"string"}},{"name":"locationId","required":false,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"customerId","required":false,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["PENDING","CONFIRMED","SEATED","NO_SHOW","CANCELED","COMPLETED"]}},{"name":"fromDate","required":false,"in":"query","schema":{"example":"2026-05-10T00:00:00Z","type":"string"}},{"name":"toDate","required":false,"in":"query","schema":{"example":"2026-05-11T00:00:00Z","type":"string"}},{"name":"sortBy","required":false,"in":"query","schema":{"example":"reservedAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"example":"asc","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ReservationEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List reservations (paginated)","tags":["Reservations"]}},"/api/v1/reservations/{id}":{"get":{"operationId":"ReservationController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReservationEntity"}}}]}}}},"404":{"description":"Reservation not found."}},"security":[{"bearer":[]}],"summary":"Get a reservation by ID","tags":["Reservations"]},"patch":{"operationId":"ReservationController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateReservationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReservationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a reservation","tags":["Reservations"]},"delete":{"operationId":"ReservationController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReservationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Soft-delete a reservation","tags":["Reservations"]}},"/api/v1/reservations/{id}/confirm":{"post":{"operationId":"ReservationController_confirm_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Confirm a reservation (PENDING -> CONFIRMED, returns conflict warnings)","tags":["Reservations"]}},"/api/v1/reservations/{id}/seat":{"post":{"operationId":"ReservationController_seat_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatReservationDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Seat the reservation — opens a TableSession and links it","tags":["Reservations"]}},"/api/v1/reservations/{id}/cancel":{"post":{"operationId":"ReservationController_cancel_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReservationEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReservationEntity"}}}}},"security":[{"bearer":[]}],"summary":"Cancel a reservation","tags":["Reservations"]}},"/api/v1/reservations/{id}/no-show":{"post":{"operationId":"ReservationController_noShow_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ReservationEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReservationEntity"}}}}},"security":[{"bearer":[]}],"summary":"Mark a reservation as no-show","tags":["Reservations"]}},"/api/v1/waitlist":{"post":{"operationId":"WaitlistController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWaitlistEntryDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/WaitlistEntryEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistEntryEntity"}}}}},"security":[{"bearer":[]}],"summary":"Add a walk-in party to the waitlist","tags":["Waitlist"]},"get":{"operationId":"WaitlistController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"example":20,"type":"number"}},{"name":"search","required":false,"in":"query","schema":{"example":"John","type":"string"}},{"name":"locationId","required":false,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["WAITING","NOTIFIED","SEATED","CANCELED","NO_SHOW"]}},{"name":"activeOnly","required":false,"in":"query","description":"Only active (WAITING / NOTIFIED)","schema":{"example":"true","type":"boolean"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WaitlistEntryEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List waitlist entries (paginated)","tags":["Waitlist"]}},"/api/v1/waitlist/{id}":{"get":{"operationId":"WaitlistController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/WaitlistEntryEntity"}}}]}}}},"404":{"description":"Waitlist entry not found."}},"security":[{"bearer":[]}],"summary":"Get a waitlist entry by ID","tags":["Waitlist"]},"patch":{"operationId":"WaitlistController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWaitlistEntryDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/WaitlistEntryEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a waitlist entry","tags":["Waitlist"]}},"/api/v1/waitlist/{id}/notify":{"post":{"operationId":"WaitlistController_notify_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/WaitlistEntryEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistEntryEntity"}}}}},"security":[{"bearer":[]}],"summary":"Notify the party (WAITING -> NOTIFIED)","tags":["Waitlist"]}},"/api/v1/waitlist/{id}/seat":{"post":{"operationId":"WaitlistController_seat_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatWaitlistDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Seat the party — opens a TableSession and links it","tags":["Waitlist"]}},"/api/v1/waitlist/{id}/cancel":{"post":{"operationId":"WaitlistController_cancel_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/WaitlistEntryEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistEntryEntity"}}}}},"security":[{"bearer":[]}],"summary":"Cancel a waitlist entry","tags":["Waitlist"]}},"/api/v1/waitlist/{id}/no-show":{"post":{"operationId":"WaitlistController_noShow_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/WaitlistEntryEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistEntryEntity"}}}}},"security":[{"bearer":[]}],"summary":"Mark waitlist as no-show","tags":["Waitlist"]}},"/api/v1/tip-pools":{"post":{"operationId":"TipPoolController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTipPoolDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TipPoolEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TipPoolEntity"}}}}},"security":[{"bearer":[]}],"summary":"Create a tip pool — auto-snapshots tips/serviceCharge from sales in window","tags":["Tip Pools"]},"get":{"operationId":"TipPoolController_findAll_v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"example":10,"type":"number"}},{"name":"locationId","required":false,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["OPEN","SETTLED"]}},{"name":"fromDate","required":false,"in":"query","schema":{"example":"2026-05-01T00:00:00Z","type":"string"}},{"name":"toDate","required":false,"in":"query","schema":{"example":"2026-05-31T23:59:59Z","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TipPoolEntity"}},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}}}]}}}}},"security":[{"bearer":[]}],"summary":"List tip pools (paginated)","tags":["Tip Pools"]}},"/api/v1/tip-pools/{id}":{"get":{"operationId":"TipPoolController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TipPoolEntity"}}}]}}}},"404":{"description":"Tip pool not found."}},"security":[{"bearer":[]}],"summary":"Get a tip pool with allocations","tags":["Tip Pools"]},"patch":{"operationId":"TipPoolController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTipPoolDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TipPoolEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update a tip pool (re-snapshots totals if period changed)","tags":["Tip Pools"]},"delete":{"operationId":"TipPoolController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TipPoolEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Soft-delete a tip pool (only OPEN)","tags":["Tip Pools"]}},"/api/v1/tip-pools/{id}/allocations":{"get":{"operationId":"TipPoolController_listAllocations_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TipPoolAllocationEntity"}}}}}},"security":[{"bearer":[]}],"summary":"List allocations for a tip pool","tags":["Tip Pools"]},"post":{"operationId":"TipPoolController_addAllocation_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAllocationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TipPoolAllocationEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TipPoolAllocationEntity"}}}}},"security":[{"bearer":[]}],"summary":"Add an allocation to a tip pool","tags":["Tip Pools"]}},"/api/v1/tip-pools/{id}/allocations/{allocationId}":{"patch":{"operationId":"TipPoolController_updateAllocation_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"allocationId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAllocationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TipPoolAllocationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Update an allocation","tags":["Tip Pools"]},"delete":{"operationId":"TipPoolController_removeAllocation_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"allocationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TipPoolAllocationEntity"}}}]}}}}},"security":[{"bearer":[]}],"summary":"Remove an allocation","tags":["Tip Pools"]}},"/api/v1/tip-pools/{id}/distribute":{"post":{"operationId":"TipPoolController_distribute_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TipPoolEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TipPoolEntity"}}}}},"security":[{"bearer":[]}],"summary":"Auto-fill allocation amounts using the pool distribution method","tags":["Tip Pools"]}},"/api/v1/tip-pools/{id}/settle":{"post":{"operationId":"TipPoolController_settle_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GlobalResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TipPoolEntity"}}}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TipPoolEntity"}}}}},"security":[{"bearer":[]}],"summary":"Settle the pool — finalizes (immutable)","tags":["Tip Pools"]}},"/api/v1/reports/daily-sales":{"get":{"operationId":"ReportController_dailySales_v1","parameters":[{"name":"locationId","required":true,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"date","required":true,"in":"query","description":"YYYY-MM-DD","schema":{"example":"2026-05-06","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Daily sales summary (orders, revenue, tax, tips, payment breakdown)","tags":["Reports"]}},"/api/v1/reports/sales-by-category":{"get":{"operationId":"ReportController_salesByCategory_v1","parameters":[{"name":"locationId","required":true,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"fromDate","required":true,"in":"query","schema":{"example":"2026-05-01T00:00:00Z","type":"string"}},{"name":"toDate","required":true,"in":"query","schema":{"example":"2026-05-31T23:59:59Z","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"example":10,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"bearer":[]}],"summary":"Sales by category over a date range","tags":["Reports"]}},"/api/v1/reports/sales-by-item":{"get":{"operationId":"ReportController_salesByItem_v1","parameters":[{"name":"locationId","required":true,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"fromDate","required":true,"in":"query","schema":{"example":"2026-05-01T00:00:00Z","type":"string"}},{"name":"toDate","required":true,"in":"query","schema":{"example":"2026-05-31T23:59:59Z","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"example":10,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"bearer":[]}],"summary":"Top items by revenue over a date range","tags":["Reports"]}},"/api/v1/reports/sales-by-hour":{"get":{"operationId":"ReportController_salesByHour_v1","parameters":[{"name":"locationId","required":true,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"date","required":true,"in":"query","description":"YYYY-MM-DD","schema":{"example":"2026-05-06","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"bearer":[]}],"summary":"Sales distribution by hour for a given day","tags":["Reports"]}},"/api/v1/reports/server-performance":{"get":{"operationId":"ReportController_serverPerformance_v1","parameters":[{"name":"locationId","required":true,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"fromDate","required":true,"in":"query","schema":{"example":"2026-05-01T00:00:00Z","type":"string"}},{"name":"toDate","required":true,"in":"query","schema":{"example":"2026-05-31T23:59:59Z","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"example":10,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"bearer":[]}],"summary":"Per-server performance over a date range","tags":["Reports"]}},"/api/v1/reports/z-report":{"get":{"operationId":"ReportController_zReport_v1","parameters":[{"name":"locationId","required":true,"in":"query","schema":{"format":"uuid","example":"uuid","type":"string"}},{"name":"date","required":true,"in":"query","description":"YYYY-MM-DD","schema":{"example":"2026-05-06","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"Z-Report — consolidated end-of-day rollup for accounting","tags":["Reports"]}},"/api/v1/counter-orders/{id}":{"get":{"operationId":"CounterOrderController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"404":{"description":"Order not found."}},"security":[{"bearer":[]}],"summary":"Get a counter/takeaway order with lines + KDS tickets","tags":["Counter Orders"]}},"/api/v1/counter-orders/{id}/pickup":{"post":{"operationId":"CounterOrderController_markPickedUp_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Mark order picked up — moves READY lines to SERVED and stamps pickedUpAt","tags":["Counter Orders"]}}},"info":{"title":"VISION POS","description":"The VISION POS Backend API description","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"GlobalResponseDto":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Request successful"},"meta":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}}}},"required":["success","message"]},"TenantEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Grand Hotel Group"},"legalName":{"type":"string","nullable":true,"example":"Grand Hotel Group LLC"},"domain":{"type":"string","nullable":true,"example":"grandhotel.com"},"website":{"type":"string","nullable":true,"example":"https://grandhotel.com"},"logoUrl":{"type":"string","nullable":true,"example":"https://logo.url/logo.png"},"primaryContactName":{"type":"string","nullable":true,"example":"John Doe"},"primaryContactEmail":{"type":"string","nullable":true,"example":"john@grandhotel.com"},"primaryContactPhone":{"type":"string","nullable":true,"example":"+1234567890"},"address":{"type":"string","nullable":true,"example":"123 Main St"},"city":{"type":"string","nullable":true,"example":"New York"},"state":{"type":"string","nullable":true,"example":"NY"},"country":{"type":"string","nullable":true,"example":"USA"},"zipCode":{"type":"string","nullable":true,"example":"10001"},"status":{"type":"string","enum":["ACTIVE","INACTIVE","SUSPENDED","TRIAL"],"example":"ACTIVE"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.362Z"}},"required":["id","name","status","createdAt"]},"UpdateTenantDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"example":"KFC","description":"The name of the tenant"},"legalName":{"type":"string","minLength":1,"maxLength":255,"example":"KFC Corporation","description":"The legal name"},"domain":{"type":"string","minLength":1,"maxLength":255,"example":"kfc.com","description":"The domain"},"website":{"type":"string","minLength":1,"maxLength":255,"example":"https://kfc.com","description":"The website"},"logoUrl":{"type":"string","minLength":1,"maxLength":255,"example":"https://logo.url","description":"The logo URL"},"primaryContactName":{"type":"string","minLength":1,"maxLength":255,"example":"Colonel Sanders","description":"Primary contact name"},"primaryContactEmail":{"type":"string","minLength":1,"maxLength":255,"example":"colonel@kfc.com","description":"Primary contact email"},"primaryContactPhone":{"type":"string","minLength":1,"maxLength":255,"example":"+1234567890","description":"Primary contact phone"},"address":{"type":"string","minLength":1,"maxLength":255,"example":"123 Fried Chicken St","description":"Address"},"city":{"type":"string","minLength":1,"maxLength":255,"example":"Louisville","description":"City"},"state":{"type":"string","minLength":1,"maxLength":255,"example":"Kentucky","description":"State"},"country":{"type":"string","minLength":1,"maxLength":255,"example":"USA","description":"Country"},"zipCode":{"type":"string","minLength":1,"maxLength":255,"example":"40213","description":"Zip code"}}},"UserEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"email":{"type":"string","example":"john@example.com"},"username":{"type":"string","nullable":true,"example":"john_doe"},"fullName":{"type":"string","nullable":true,"example":"John Doe"},"phoneNumber":{"type":"string","nullable":true,"example":"+1234567890"},"avatarUrl":{"type":"string","nullable":true,"example":"https://avatar.url"},"jobTitle":{"type":"string","nullable":true,"example":"Manager"},"status":{"type":"string","enum":["ACTIVE","INACTIVE","LOCKED","PENDING_VERIFICATION"],"example":"ACTIVE"},"lastLoginAt":{"format":"date-time","type":"string","nullable":true,"example":"2026-05-14T05:50:28.412Z"},"loginAttempts":{"type":"number","example":0},"lockoutUntil":{"format":"date-time","type":"string","nullable":true,"example":null},"preferredLanguage":{"type":"string","example":"EN"},"metadata":{"type":"object","additionalProperties":true,"properties":{}},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.413Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.413Z"},"passwordHash":{"type":"string"}},"required":["id","email","status","loginAttempts","preferredLanguage","createdAt","updatedAt","passwordHash"]},"CreateUserDto":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"john@example.com"},"password":{"type":"string","minLength":8,"maxLength":20,"example":"password123"},"username":{"type":"string","minLength":1,"maxLength":255,"example":"john_doe"},"fullName":{"type":"string","minLength":1,"maxLength":255,"example":"John Doe"},"phoneNumber":{"type":"string","nullable":true,"example":"+1234567890"},"avatarUrl":{"type":"string","nullable":true,"minLength":1,"maxLength":255,"example":"https://avatar.url"},"jobTitle":{"type":"string","nullable":true,"minLength":1,"maxLength":255,"example":"Manager"},"roleId":{"type":"string","format":"uuid","example":"uuid"},"branchId":{"type":"string","format":"uuid","example":"uuid"},"preferredLanguage":{"type":"string","minLength":1,"maxLength":255,"example":"EN"}},"required":["email","password","username","fullName"]},"UpdateUserDto":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"john@example.com"},"password":{"type":"string","minLength":8,"maxLength":20,"example":"password123"},"username":{"type":"string","minLength":1,"maxLength":255,"example":"john_doe"},"fullName":{"type":"string","minLength":1,"maxLength":255,"example":"John Doe"},"phoneNumber":{"type":"string","nullable":true,"example":"+1234567890"},"avatarUrl":{"type":"string","nullable":true,"minLength":1,"maxLength":255,"example":"https://avatar.url"},"jobTitle":{"type":"string","nullable":true,"minLength":1,"maxLength":255,"example":"Manager"},"preferredLanguage":{"type":"string","minLength":1,"maxLength":255,"example":"en"}}},"UserInfo":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"email":{"type":"string","example":"john@example.com"},"fullName":{"type":"string","example":"John Doe"},"type":{"enum":["user","system_admin"],"type":"string","example":"user"},"tenantId":{"type":"string","example":"uuid"}},"required":["id","email","fullName","type"]},"BranchAccess":{"type":"object","properties":{"branchId":{"type":"string","nullable":true,"example":"uuid"},"roles":{"example":["admin"],"type":"array","items":{"type":"string"}},"permissions":{"example":["products:read"],"type":"array","items":{"type":"string"}}},"required":["branchId","roles","permissions"]},"LoginResponseDto":{"type":"object","properties":{"access_token":{"type":"string","example":"jwt_token_here"},"user":{"$ref":"#/components/schemas/UserInfo"},"activeBranch":{"type":"string","nullable":true,"example":"uuid"},"access":{"type":"array","items":{"$ref":"#/components/schemas/BranchAccess"}}},"required":["access_token","user","activeBranch","access"]},"SignInDto":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"user@example.com","description":"The email of the user"},"password":{"type":"string","example":"password123","description":"The password of the user"},"type":{"default":"user","enum":["user","system_admin"],"type":"string","description":"The type of authentication. ( user, system_admin )"},"tenantId":{"type":"string","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","description":"The tenant ID (required for user login)"},"branchId":{"type":"string","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174001","description":"The branch ID for context switching"}},"required":["email","password"]},"SetActiveBranchDto":{"type":"object","properties":{"branchId":{"type":"string","nullable":true,"description":"The ID of the branch to set as active. Use null for tenant-wide access.","example":"branch-uuid-here"}},"required":["branchId"]},"OnboardTenantInfoDto":{"type":"object","properties":{"name":{"type":"string","example":"Acme Corporation"},"legalName":{"type":"string","example":"Acme Corp Ltd."},"domain":{"type":"string","example":"acme.com"},"website":{"type":"string","example":"https://acme.com"},"address":{"type":"string","example":"123 Main St"},"city":{"type":"string","example":"New York"},"state":{"type":"string","example":"NY"},"country":{"type":"string","example":"USA"},"zipCode":{"type":"string","example":"10001"}},"required":["name"]},"OnboardBranchInfoDto":{"type":"object","properties":{"name":{"type":"string","example":"Main Branch"},"branchCode":{"type":"string","example":"MB001"},"address":{"type":"string","example":"123 Main St"},"city":{"type":"string","example":"New York"},"phone":{"type":"string","example":"+1234567890"}},"required":["name"]},"OnboardOwnerInfoDto":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"owner@acme.com"},"password":{"type":"string","minLength":8,"maxLength":20,"example":"password123"},"username":{"type":"string","example":"owner_acme"},"fullName":{"type":"string","example":"John Owner"},"phoneNumber":{"type":"string","example":"+1234567890"},"jobTitle":{"type":"string","example":"CEO"}},"required":["email","password","username","fullName"]},"OnboardTenantDto":{"type":"object","properties":{"tenant":{"$ref":"#/components/schemas/OnboardTenantInfoDto"},"branch":{"$ref":"#/components/schemas/OnboardBranchInfoDto"},"owner":{"$ref":"#/components/schemas/OnboardOwnerInfoDto"}},"required":["tenant","branch","owner"]},"CreateUserAsAdminDto":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"john@example.com"},"password":{"type":"string","minLength":8,"maxLength":20,"example":"password123"},"username":{"type":"string","minLength":1,"maxLength":255,"example":"john_doe"},"fullName":{"type":"string","minLength":1,"maxLength":255,"example":"John Doe"},"phoneNumber":{"type":"string","nullable":true,"example":"+1234567890"},"avatarUrl":{"type":"string","nullable":true,"minLength":1,"maxLength":255,"example":"https://avatar.url"},"jobTitle":{"type":"string","nullable":true,"minLength":1,"maxLength":255,"example":"Manager"},"roleId":{"type":"string","format":"uuid","example":"uuid"},"branchId":{"type":"string","format":"uuid","example":"uuid"},"preferredLanguage":{"type":"string","minLength":1,"maxLength":255,"example":"EN"},"tenantId":{"type":"string","format":"uuid","example":"uuid"}},"required":["email","password","username","fullName","tenantId"]},"AssignPermissionToRoleDto":{"type":"object","properties":{"roleId":{"type":"string","format":"uuid","example":"uuid"},"permissionIds":{"example":["uuid1","uuid2"],"type":"array","items":{"type":"string","format":"uuid"}}},"required":["roleId","permissionIds"]},"AssignRoleToUserDto":{"type":"object","properties":{"userId":{"type":"string","format":"uuid","example":"uuid"},"roleId":{"type":"string","format":"uuid","example":"uuid"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"branchId":{"type":"string","format":"uuid","example":"uuid"}},"required":["userId","roleId","tenantId"]},"BranchEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Main Street Branch"},"branchCode":{"type":"string","nullable":true,"example":"BR-001"},"type":{"type":"string","enum":["RETAIL","WAREHOUSE","OFFICE","CLINIC","HOTEL","RESTAURANT"],"example":"RETAIL"},"address":{"type":"string","nullable":true,"example":"456 Main St"},"city":{"type":"string","nullable":true,"example":"San Francisco"},"state":{"type":"string","nullable":true,"example":"CA"},"country":{"type":"string","nullable":true,"example":"USA"},"zipCode":{"type":"string","nullable":true,"example":"94101"},"phone":{"type":"string","nullable":true,"example":"+1987654321"},"email":{"type":"string","nullable":true,"example":"main@branch.com"},"latitude":{"type":"string","nullable":true,"example":"37.7749"},"longitude":{"type":"string","nullable":true,"example":"-122.4194"},"status":{"type":"string","enum":["ACTIVE","INACTIVE","TEMPORARILY_CLOSED","MAINTENANCE"],"example":"ACTIVE"},"openingHours":{"type":"object","example":{"mon":"08:00-18:00"}},"managerId":{"type":"string","nullable":true,"example":"uuid"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.517Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.517Z"}},"required":["id","tenantId","name","type","status","createdAt","updatedAt"]},"CreateBranchDto":{"type":"object","properties":{"name":{"type":"string","example":"Main Branch"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"branchCode":{"type":"string","example":"BR001"},"type":{"type":"string","enum":["RETAIL","WAREHOUSE","OFFICE","CLINIC","HOTEL","RESTAURANT"],"default":"RESTAURANT"},"address":{"type":"string","example":"123 Main St"},"city":{"type":"string","example":"New York"},"state":{"type":"string","example":"NY"},"country":{"type":"string","example":"USA"},"zipCode":{"type":"string","example":"10001"},"phone":{"type":"string","example":"+1234567890"},"email":{"type":"string","example":"branch@example.com"},"latitude":{"type":"string","example":40.7128},"longitude":{"type":"string","example":-74.006},"openingHours":{"type":"object","example":{"mon":"09:00-17:00"}}},"required":["name","tenantId"]},"UpdateBranchDto":{"type":"object","properties":{"name":{"type":"string","example":"Main Branch"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"branchCode":{"type":"string","example":"BR001"},"type":{"type":"string","enum":["RETAIL","WAREHOUSE","OFFICE","CLINIC","HOTEL","RESTAURANT"],"default":"RESTAURANT"},"address":{"type":"string","example":"123 Main St"},"city":{"type":"string","example":"New York"},"state":{"type":"string","example":"NY"},"country":{"type":"string","example":"USA"},"zipCode":{"type":"string","example":"10001"},"phone":{"type":"string","example":"+1234567890"},"email":{"type":"string","example":"branch@example.com"},"latitude":{"type":"string","example":40.7128},"longitude":{"type":"string","example":-74.006},"openingHours":{"type":"object","example":{"mon":"09:00-17:00"}}}},"RoleEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"parentId":{"type":"string","nullable":true,"example":"uuid"},"name":{"type":"string","example":"Store Manager"},"isSystemDefault":{"type":"boolean","example":false}},"required":["id","tenantId","name","isSystemDefault"]},"CreateRoleDto":{"type":"object","properties":{"name":{"type":"string","example":"Admin"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"parentId":{"type":"string","format":"uuid","example":"uuid"},"isSystemDefault":{"type":"boolean","default":false,"example":false}},"required":["name","tenantId"]},"PermissionEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"module":{"type":"string","example":"INVENTORY"},"subject":{"type":"string","example":"PRODUCT"},"action":{"type":"string","example":"READ"},"description":{"type":"string","nullable":true,"example":"Can read products"}},"required":["id","module","subject","action"]},"CategoryEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"parentId":{"type":"string","nullable":true,"example":"uuid"},"name":{"type":"string","example":"Electronics"},"description":{"type":"string","nullable":true,"example":"Electronic devices and accessories"},"sortOrder":{"type":"number","example":0},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.557Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.557Z"}},"required":["id","tenantId","name","sortOrder","createdAt","updatedAt"]},"CreateCategoryDto":{"type":"object","properties":{"name":{"type":"string","example":"Electronics"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"parentId":{"type":"string","format":"uuid","example":"uuid"},"description":{"type":"string","example":"Electronic devices and accessories"},"sortOrder":{"type":"number","minimum":0,"example":0}},"required":["name","tenantId"]},"UpdateCategoryDto":{"type":"object","properties":{"name":{"type":"string","example":"Electronics"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"parentId":{"type":"string","format":"uuid","example":"uuid"},"description":{"type":"string","example":"Electronic devices and accessories"},"sortOrder":{"type":"number","minimum":0,"example":0}}},"UomClassEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Weight"}},"required":["id","tenantId","name"]},"CreateUomClassDto":{"type":"object","properties":{"name":{"type":"string","example":"Weight"},"tenantId":{"type":"string","format":"uuid","example":"uuid"}},"required":["name","tenantId"]},"UpdateUomClassDto":{"type":"object","properties":{"name":{"type":"string","example":"Weight"},"tenantId":{"type":"string","format":"uuid","example":"uuid"}}},"UomEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"classId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Kilogram"},"abbreviation":{"type":"string","example":"kg"},"conversionRateToBase":{"type":"string","example":"1.000000"}},"required":["id","classId","name","abbreviation","conversionRateToBase"]},"CreateUomDto":{"type":"object","properties":{"name":{"type":"string","example":"Kilogram"},"classId":{"type":"string","format":"uuid","example":"uuid"},"abbreviation":{"type":"string","example":"kg"},"conversionRateToBase":{"type":"string","example":"1.000000"}},"required":["name","classId","abbreviation","conversionRateToBase"]},"UpdateUomDto":{"type":"object","properties":{"name":{"type":"string","example":"Kilogram"},"classId":{"type":"string","format":"uuid","example":"uuid"},"abbreviation":{"type":"string","example":"kg"},"conversionRateToBase":{"type":"string","example":"1.000000"}}},"ProductEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"categoryId":{"type":"string","nullable":true,"example":"uuid"},"baseSku":{"type":"string","example":"SKU-IP15"},"name":{"type":"string","example":"iPhone 15"},"basePrice":{"type":"string","example":"999.0000"},"baseUomId":{"type":"string","example":"uuid"},"globalAttributes":{"type":"object","additionalProperties":true,"properties":{}},"imageUrl":{"type":"string","nullable":true,"example":"/uploads/products/iphone15.jpg"},"trackingType":{"type":"string","nullable":true,"example":"STANDARD"},"isTaxable":{"type":"boolean","nullable":true,"example":true},"taxRateId":{"type":"string","nullable":true,"example":"uuid"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.585Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.585Z"},"totalOnHand":{"type":"string","example":"250.0000","description":"Computed on-hand stock across active variants (scoped by locationId when provided). Only populated by list endpoints."}},"required":["id","tenantId","baseSku","name","basePrice","baseUomId","isTaxable","createdAt","updatedAt"]},"CreateProductDto":{"type":"object","properties":{"name":{"type":"string","example":"iPhone 15"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"baseSku":{"type":"string","example":"SKU-IP15"},"basePrice":{"type":"string","example":"999.0000"},"baseUomId":{"type":"string","format":"uuid","example":"uuid"},"categoryId":{"type":"string","format":"uuid","example":"uuid"},"globalAttributes":{"type":"object","example":{}},"imageUrl":{"type":"string","example":"/uploads/products/iphone15.jpg"},"trackingType":{"type":"string","example":"STANDARD"},"isTaxable":{"type":"boolean","example":true},"taxRateId":{"type":"string","format":"uuid","example":"uuid"}},"required":["name","tenantId","baseSku","basePrice","baseUomId"]},"UpdateProductDto":{"type":"object","properties":{"name":{"type":"string","example":"iPhone 15"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"baseSku":{"type":"string","example":"SKU-IP15"},"basePrice":{"type":"string","example":"999.0000"},"baseUomId":{"type":"string","format":"uuid","example":"uuid"},"categoryId":{"type":"string","format":"uuid","example":"uuid"},"globalAttributes":{"type":"object","example":{}},"imageUrl":{"type":"string","example":"/uploads/products/iphone15.jpg"},"trackingType":{"type":"string","example":"STANDARD"},"isTaxable":{"type":"boolean","example":true},"taxRateId":{"type":"string","format":"uuid","example":"uuid"}}},"ProductVariantEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"productId":{"type":"string","example":"uuid"},"variantSku":{"type":"string","example":"SKU-IP15-BLK-128"},"barcode":{"type":"string","nullable":true,"example":"1234567890123"},"matrixOptions":{"type":"object","additionalProperties":true,"example":{"color":"Black","storage":"128GB"}},"priceModifier":{"type":"string","nullable":true,"example":"50.0000"},"imageUrl":{"type":"string","nullable":true,"example":"/uploads/products/iphone15-black.jpg"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.591Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.591Z"}},"required":["id","productId","variantSku","matrixOptions","createdAt","updatedAt"]},"CreateProductVariantDto":{"type":"object","properties":{"variantSku":{"type":"string","example":"SKU-IP15-BLK-128"},"matrixOptions":{"type":"object","example":{"color":"Black","storage":"128GB"}},"barcode":{"type":"string","example":"1234567890123"},"priceModifier":{"type":"string","example":"50.0000"},"imageUrl":{"type":"string","example":"/uploads/products/iphone15-black.jpg"}},"required":["variantSku","matrixOptions"]},"UpdateProductVariantDto":{"type":"object","properties":{"variantSku":{"type":"string","example":"SKU-IP15-BLK-128"},"matrixOptions":{"type":"object","example":{"color":"Black","storage":"128GB"}},"barcode":{"type":"string","example":"1234567890123"},"priceModifier":{"type":"string","example":"50.0000"},"imageUrl":{"type":"string","example":"/uploads/products/iphone15-black.jpg"}}},"LocationEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"parentLocationId":{"type":"string","nullable":true,"example":"uuid"},"name":{"type":"string","example":"Main Warehouse"},"type":{"type":"string","example":"warehouse"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.611Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.611Z"}},"required":["id","tenantId","name","type","createdAt","updatedAt"]},"CreateLocationDto":{"type":"object","properties":{"name":{"type":"string","example":"Main Warehouse"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"parentLocationId":{"type":"string","format":"uuid","example":"uuid"},"type":{"type":"string","example":"warehouse"}},"required":["name","tenantId","type"]},"UpdateLocationDto":{"type":"object","properties":{"name":{"type":"string","example":"Main Warehouse"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"parentLocationId":{"type":"string","format":"uuid","example":"uuid"},"type":{"type":"string","example":"warehouse"}}},"VendorEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Acme Supplies"},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","name","createdAt","updatedAt"]},"CreateVendorDto":{"type":"object","properties":{"name":{"type":"string","example":"Acme Supplies"},"tenantId":{"type":"string","format":"uuid","example":"uuid"}},"required":["name","tenantId"]},"UpdateVendorDto":{"type":"object","properties":{"name":{"type":"string","example":"Acme Supplies"},"tenantId":{"type":"string","format":"uuid","example":"uuid"}}},"TransferOrderEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"sourceLocationId":{"type":"string","example":"uuid"},"transitLocationId":{"type":"string","example":"uuid"},"destinationLocationId":{"type":"string","example":"uuid"},"transferNumber":{"type":"string","example":"TO-2026-0001"},"status":{"type":"string","nullable":true,"example":"DRAFT","enum":["DRAFT","SHIPPED","PARTIALLY_RECEIVED","COMPLETED"]},"shippedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"receivedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdBy":{"type":"string","nullable":true,"example":"uuid"},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.645Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.645Z"}},"required":["id","tenantId","sourceLocationId","transitLocationId","destinationLocationId","transferNumber","createdAt","updatedAt"]},"CreateTransferOrderDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"sourceLocationId":{"type":"string","format":"uuid","example":"uuid"},"transitLocationId":{"type":"string","format":"uuid","example":"uuid"},"destinationLocationId":{"type":"string","format":"uuid","example":"uuid"},"transferNumber":{"type":"string","example":"TO-2026-0001"},"createdBy":{"type":"string","format":"uuid","example":"uuid"}},"required":["tenantId","sourceLocationId","transitLocationId","destinationLocationId","transferNumber"]},"UpdateTransferOrderDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"sourceLocationId":{"type":"string","format":"uuid","example":"uuid"},"transitLocationId":{"type":"string","format":"uuid","example":"uuid"},"destinationLocationId":{"type":"string","format":"uuid","example":"uuid"},"transferNumber":{"type":"string","example":"TO-2026-0001"},"createdBy":{"type":"string","format":"uuid","example":"uuid"}}},"TransferOrderLineEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"transferOrderId":{"type":"string","example":"uuid"},"productId":{"type":"string","example":"uuid"},"requestedQuantity":{"type":"string","example":"10.0000"},"shippedQuantity":{"type":"string","nullable":true,"example":"0.0000"},"receivedQuantity":{"type":"string","nullable":true,"example":"0.0000"},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.649Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.649Z"}},"required":["id","transferOrderId","productId","requestedQuantity","createdAt","updatedAt"]},"CreateTransferOrderLineDto":{"type":"object","properties":{"productId":{"type":"string","format":"uuid","example":"uuid"},"requestedQuantity":{"type":"string","example":"10.0000"},"shippedQuantity":{"type":"string","example":"0.0000"},"receivedQuantity":{"type":"string","example":"0.0000"}},"required":["productId","requestedQuantity"]},"UpdateTransferOrderLineDto":{"type":"object","properties":{"productId":{"type":"string","format":"uuid","example":"uuid"},"requestedQuantity":{"type":"string","example":"10.0000"},"shippedQuantity":{"type":"string","example":"0.0000"},"receivedQuantity":{"type":"string","example":"0.0000"}}},"PurchaseRequisitionEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"requestedBy":{"type":"string","example":"uuid"},"department":{"type":"string","nullable":true,"example":"Engineering"},"justification":{"type":"string","nullable":true,"example":"Urgent restock of office supplies"},"status":{"type":"string","nullable":true,"example":"PENDING_APPROVAL","enum":["PENDING_APPROVAL","APPROVED","REJECTED"]},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.666Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.666Z"}},"required":["id","tenantId","requestedBy","createdAt","updatedAt"]},"CreatePurchaseRequisitionDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"requestedBy":{"type":"string","format":"uuid","example":"uuid"},"department":{"type":"string","example":"Engineering"},"justification":{"type":"string","example":"Urgent restock of office supplies"}},"required":["tenantId","requestedBy"]},"UpdatePurchaseRequisitionDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"requestedBy":{"type":"string","format":"uuid","example":"uuid"},"department":{"type":"string","example":"Engineering"},"justification":{"type":"string","example":"Urgent restock of office supplies"}}},"PurchaseOrderEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"requisitionId":{"type":"string","nullable":true,"example":"uuid"},"vendorId":{"type":"string","example":"uuid"},"poNumber":{"type":"string","example":"PO-2026-0001"},"currency":{"type":"string","example":"USD"},"expectedDeliveryDate":{"format":"date-time","type":"string","nullable":true,"example":"2026-04-15"},"status":{"type":"string","nullable":true,"example":"DRAFT","enum":["DRAFT","ISSUED","PARTIAL_RECEIPT","FULFILLED","CLOSED"]},"totalAmount":{"type":"string","example":"15000.00"},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.671Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.671Z"}},"required":["id","tenantId","vendorId","poNumber","currency","totalAmount","createdAt","updatedAt"]},"CreatePurchaseOrderDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"vendorId":{"type":"string","format":"uuid","example":"uuid"},"poNumber":{"type":"string","example":"PO-2026-0001"},"currency":{"type":"string","minLength":3,"maxLength":3,"example":"USD"},"totalAmount":{"type":"string","example":"15000.00"},"requisitionId":{"type":"string","format":"uuid","example":"uuid"},"expectedDeliveryDate":{"type":"string","example":"2026-04-15"}},"required":["tenantId","vendorId","poNumber","currency","totalAmount"]},"UpdatePurchaseOrderDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"vendorId":{"type":"string","format":"uuid","example":"uuid"},"poNumber":{"type":"string","example":"PO-2026-0001"},"currency":{"type":"string","minLength":3,"maxLength":3,"example":"USD"},"totalAmount":{"type":"string","example":"15000.00"},"requisitionId":{"type":"string","format":"uuid","example":"uuid"},"expectedDeliveryDate":{"type":"string","example":"2026-04-15"}}},"GoodsReceivedNoteEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"purchaseOrderId":{"type":"string","example":"uuid"},"receivingLocationId":{"type":"string","example":"uuid"},"grnNumber":{"type":"string","example":"GRN-2026-0001"},"receivedBy":{"type":"string","nullable":true,"example":"uuid"},"receivedAt":{"format":"date-time","type":"string","nullable":true,"example":"2026-05-14T05:50:28.676Z"},"status":{"type":"string","nullable":true,"example":"INSPECTING","enum":["INSPECTING","ACCEPTED","REJECTED"]},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.676Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.676Z"}},"required":["id","tenantId","purchaseOrderId","receivingLocationId","grnNumber","createdAt","updatedAt"]},"CreateGoodsReceivedNoteDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"purchaseOrderId":{"type":"string","format":"uuid","example":"uuid"},"receivingLocationId":{"type":"string","format":"uuid","example":"uuid"},"grnNumber":{"type":"string","example":"GRN-2026-0001"},"receivedBy":{"type":"string","format":"uuid","example":"uuid"}},"required":["tenantId","purchaseOrderId","receivingLocationId","grnNumber"]},"UpdateGoodsReceivedNoteDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"purchaseOrderId":{"type":"string","format":"uuid","example":"uuid"},"receivingLocationId":{"type":"string","format":"uuid","example":"uuid"},"grnNumber":{"type":"string","example":"GRN-2026-0001"},"receivedBy":{"type":"string","format":"uuid","example":"uuid"}}},"GrnLineEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"grnId":{"type":"string","example":"uuid"},"poLineId":{"type":"string","example":"uuid"},"productId":{"type":"string","example":"uuid"},"receivedQuantity":{"type":"string","example":"100.0000"},"acceptedQuantity":{"type":"string","nullable":true,"example":"95.0000"},"rejectedQuantity":{"type":"string","nullable":true,"example":"5.0000"},"inventoryLedgerPosted":{"type":"boolean","nullable":true,"example":false},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.681Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.681Z"}},"required":["id","grnId","poLineId","productId","receivedQuantity","createdAt","updatedAt"]},"CreateGrnLineDto":{"type":"object","properties":{"poLineId":{"type":"string","format":"uuid","example":"uuid"},"productId":{"type":"string","format":"uuid","example":"uuid"},"receivedQuantity":{"type":"string","example":"100.0000"},"acceptedQuantity":{"type":"string","example":"95.0000"},"rejectedQuantity":{"type":"string","example":"5.0000"},"inventoryLedgerPosted":{"type":"boolean","example":false}},"required":["poLineId","productId","receivedQuantity"]},"UpdateGrnLineDto":{"type":"object","properties":{"poLineId":{"type":"string","format":"uuid","example":"uuid"},"productId":{"type":"string","format":"uuid","example":"uuid"},"receivedQuantity":{"type":"string","example":"100.0000"},"acceptedQuantity":{"type":"string","example":"95.0000"},"rejectedQuantity":{"type":"string","example":"5.0000"},"inventoryLedgerPosted":{"type":"boolean","example":false}}},"VendorInvoiceEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"vendorId":{"type":"string","example":"uuid"},"invoiceNumber":{"type":"string","example":"INV-2026-0001"},"invoiceType":{"type":"string","example":"STANDARD"},"matchedPoId":{"type":"string","nullable":true,"example":"uuid"},"matchedGrnId":{"type":"string","nullable":true,"example":"uuid"},"totalAmount":{"type":"string","example":"15000.00"},"status":{"type":"string","nullable":true,"example":"UNPAID","enum":["UNPAID","PARTIALLY_PAID","PAID"]},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.686Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.686Z"}},"required":["id","tenantId","vendorId","invoiceNumber","invoiceType","totalAmount","createdAt","updatedAt"]},"CreateVendorInvoiceDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"vendorId":{"type":"string","format":"uuid","example":"uuid"},"invoiceNumber":{"type":"string","example":"INV-2026-0001"},"invoiceType":{"type":"string","example":"STANDARD"},"totalAmount":{"type":"string","example":"15000.00"},"matchedPoId":{"type":"string","format":"uuid","example":"uuid"},"matchedGrnId":{"type":"string","format":"uuid","example":"uuid"}},"required":["tenantId","vendorId","invoiceNumber","invoiceType","totalAmount"]},"UpdateVendorInvoiceDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"vendorId":{"type":"string","format":"uuid","example":"uuid"},"invoiceNumber":{"type":"string","example":"INV-2026-0001"},"invoiceType":{"type":"string","example":"STANDARD"},"totalAmount":{"type":"string","example":"15000.00"},"matchedPoId":{"type":"string","format":"uuid","example":"uuid"},"matchedGrnId":{"type":"string","format":"uuid","example":"uuid"}}},"LandedCostAllocationEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"sourceInvoiceId":{"type":"string","example":"uuid"},"targetGrnId":{"type":"string","example":"uuid"},"targetGrnLineId":{"type":"string","example":"uuid"},"allocationMethod":{"type":"string","example":"BY_VALUE"},"allocatedAmount":{"type":"string","example":"500.00"},"glJournalPosted":{"type":"boolean","nullable":true,"example":false},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.690Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.690Z"}},"required":["id","tenantId","sourceInvoiceId","targetGrnId","targetGrnLineId","allocationMethod","allocatedAmount","createdAt","updatedAt"]},"CreateLandedCostAllocationDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"sourceInvoiceId":{"type":"string","format":"uuid","example":"uuid"},"targetGrnId":{"type":"string","format":"uuid","example":"uuid"},"targetGrnLineId":{"type":"string","format":"uuid","example":"uuid"},"allocationMethod":{"type":"string","example":"BY_VALUE"},"allocatedAmount":{"type":"string","example":"500.00"},"glJournalPosted":{"type":"boolean","example":false}},"required":["tenantId","sourceInvoiceId","targetGrnId","targetGrnLineId","allocationMethod","allocatedAmount"]},"UpdateLandedCostAllocationDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"sourceInvoiceId":{"type":"string","format":"uuid","example":"uuid"},"targetGrnId":{"type":"string","format":"uuid","example":"uuid"},"targetGrnLineId":{"type":"string","format":"uuid","example":"uuid"},"allocationMethod":{"type":"string","example":"BY_VALUE"},"allocatedAmount":{"type":"string","example":"500.00"},"glJournalPosted":{"type":"boolean","example":false}}},"CustomerEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"accountType":{"type":"string","nullable":true,"example":"RETAIL"},"name":{"type":"string","example":"Walk-In Customer"},"phone":{"type":"string","nullable":true,"example":"09123456789"},"email":{"type":"string","nullable":true,"example":"customer@example.com"},"hasCreditAccount":{"type":"boolean","nullable":true,"example":false},"maxCreditLimit":{"type":"string","nullable":true,"example":"0.0000"},"currentCreditBalance":{"type":"string","nullable":true,"example":"0.0000"},"paymentTermsDays":{"type":"number","nullable":true,"example":0},"loyaltyTier":{"type":"string","nullable":true,"example":"BRONZE"},"lifetimePointsEarned":{"type":"number","nullable":true,"example":0},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","name","createdAt","updatedAt"]},"CreateCustomerDto":{"type":"object","properties":{"name":{"type":"string","example":"Walk-In Customer"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"phone":{"type":"string","example":"09123456789"},"email":{"type":"string","format":"email","example":"customer@example.com"},"accountType":{"type":"string","example":"RETAIL"},"hasCreditAccount":{"type":"boolean","example":false},"maxCreditLimit":{"type":"string","example":"5000.0000"},"paymentTermsDays":{"type":"number","minimum":0,"example":30},"loyaltyTier":{"type":"string","example":"BRONZE"}},"required":["name","tenantId"]},"UpdateCustomerDto":{"type":"object","properties":{"name":{"type":"string","example":"Walk-In Customer"},"tenantId":{"type":"string","format":"uuid","example":"uuid"},"phone":{"type":"string","example":"09123456789"},"email":{"type":"string","format":"email","example":"customer@example.com"},"accountType":{"type":"string","example":"RETAIL"},"hasCreditAccount":{"type":"boolean","example":false},"maxCreditLimit":{"type":"string","example":"5000.0000"},"paymentTermsDays":{"type":"number","minimum":0,"example":30},"loyaltyTier":{"type":"string","example":"BRONZE"}}},"LoyaltyLedgerEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"customerId":{"type":"string","example":"uuid"},"transactionType":{"type":"string","example":"EARN"},"points":{"type":"number","example":100},"referenceOrderId":{"type":"string","nullable":true,"example":"uuid"},"expiryDate":{"format":"date-time","type":"string","nullable":true,"example":"2026-12-31"},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","customerId","transactionType","points","createdAt","updatedAt"]},"CreateLoyaltyLedgerDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"transactionType":{"type":"string","example":"EARN"},"points":{"type":"number","example":100},"referenceOrderId":{"type":"string","format":"uuid","example":"uuid"},"expiryDate":{"format":"date-time","type":"string","example":"2026-12-31"}},"required":["tenantId","transactionType","points"]},"UpdateLoyaltyLedgerDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"transactionType":{"type":"string","example":"EARN"},"points":{"type":"number","example":100},"referenceOrderId":{"type":"string","format":"uuid","example":"uuid"},"expiryDate":{"format":"date-time","type":"string","example":"2026-12-31"}}},"CustomerInteractionEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"customerId":{"type":"string","example":"uuid"},"agentId":{"type":"string","nullable":true,"example":"uuid"},"interactionChannel":{"type":"string","example":"EMAIL"},"interactionType":{"type":"string","example":"INQUIRY"},"summary":{"type":"string","example":"Customer asked about product availability"},"detailedNotes":{"type":"string","nullable":true,"example":"Detailed notes here..."},"externalReferenceId":{"type":"string","nullable":true,"example":"EXT-REF-001"},"interactionDate":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","customerId","interactionChannel","interactionType","summary","interactionDate","updatedAt"]},"CreateCustomerInteractionDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"agentId":{"type":"string","format":"uuid","example":"uuid"},"interactionChannel":{"type":"string","example":"EMAIL"},"interactionType":{"type":"string","example":"INQUIRY"},"summary":{"type":"string","example":"Customer asked about product availability"},"detailedNotes":{"type":"string","example":"Detailed notes here..."},"externalReferenceId":{"type":"string","example":"EXT-REF-001"}},"required":["tenantId","interactionChannel","interactionType","summary"]},"UpdateCustomerInteractionDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"agentId":{"type":"string","format":"uuid","example":"uuid"},"interactionChannel":{"type":"string","example":"EMAIL"},"interactionType":{"type":"string","example":"INQUIRY"},"summary":{"type":"string","example":"Customer asked about product availability"},"detailedNotes":{"type":"string","example":"Detailed notes here..."},"externalReferenceId":{"type":"string","example":"EXT-REF-001"}}},"SalesOrderEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"customerId":{"type":"string","nullable":true,"example":"uuid"},"locationId":{"type":"string","nullable":true,"example":"uuid"},"orderNumber":{"type":"string","example":"SO-2026-0001"},"salesChannel":{"type":"string","example":"POS"},"serviceType":{"type":"string","nullable":true,"enum":["DINE_IN","TAKEAWAY","DELIVERY","COUNTER"],"example":"DINE_IN"},"idempotencyKey":{"type":"string","nullable":true,"example":"idem-key-001"},"subtotal":{"type":"string","example":"100.0000"},"totalDiscount":{"type":"string","nullable":true,"example":"10.0000"},"discountReasonId":{"type":"string","nullable":true,"example":"uuid"},"totalTax":{"type":"string","nullable":true,"example":"5.0000"},"tipAmount":{"type":"string","example":"5.0000"},"serviceCharge":{"type":"string","example":"3.0000"},"grandTotal":{"type":"string","example":"95.0000"},"status":{"type":"string","nullable":true,"example":"DRAFT","enum":["DRAFT","COMPLETED","ON_HOLD_CREDIT","VOIDED","PARTIALLY_REFUNDED","REFUNDED"]},"pickupNumber":{"type":"string","nullable":true,"example":"A47","description":"Display number for counter pickup"},"pickedUpAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","orderNumber","salesChannel","subtotal","tipAmount","serviceCharge","grandTotal","createdAt","updatedAt"]},"CreateSalesOrderDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"customerId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"orderNumber":{"type":"string","example":"SO-2026-0001"},"salesChannel":{"type":"string","example":"POS"},"idempotencyKey":{"type":"string","example":"idem-key-001"},"subtotal":{"type":"string","example":"100.0000"},"totalDiscount":{"type":"string","example":"10.0000"},"totalTax":{"type":"string","example":"5.0000"},"grandTotal":{"type":"string","example":"95.0000"},"status":{"type":"string","example":"DRAFT","enum":["DRAFT","COMPLETED","ON_HOLD_CREDIT","VOIDED","PARTIALLY_REFUNDED","REFUNDED"]}},"required":["tenantId","orderNumber","salesChannel","subtotal","grandTotal"]},"UpdateSalesOrderDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"customerId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"orderNumber":{"type":"string","example":"SO-2026-0001"},"salesChannel":{"type":"string","example":"POS"},"idempotencyKey":{"type":"string","example":"idem-key-001"},"subtotal":{"type":"string","example":"100.0000"},"totalDiscount":{"type":"string","example":"10.0000"},"totalTax":{"type":"string","example":"5.0000"},"grandTotal":{"type":"string","example":"95.0000"},"status":{"type":"string","example":"DRAFT","enum":["DRAFT","COMPLETED","ON_HOLD_CREDIT","VOIDED","PARTIALLY_REFUNDED","REFUNDED"]}}},"SalesOrderLineEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"salesOrderId":{"type":"string","example":"uuid"},"variantId":{"type":"string","example":"uuid"},"quantity":{"type":"string","example":"2.0000"},"unitPrice":{"type":"string","example":"49.9900"},"lineDiscount":{"type":"string","nullable":true,"example":"0.0000"},"taxRateId":{"type":"string","nullable":true,"example":"uuid"},"taxAmount":{"type":"string","nullable":true,"example":"5.0000"},"appliedPromotionId":{"type":"string","nullable":true,"example":"uuid"},"status":{"type":"string","nullable":true,"enum":["PENDING","FIRED","READY","SERVED","VOIDED","COMPED"],"example":"PENDING"},"firedAt":{"format":"date-time","type":"string","nullable":true,"example":"2026-01-01T00:00:00.000Z"},"voidedAt":{"format":"date-time","type":"string","nullable":true,"example":"2026-01-01T00:00:00.000Z"},"voidReasonId":{"type":"string","nullable":true,"example":"uuid"},"compReasonId":{"type":"string","nullable":true,"example":"uuid"},"courseType":{"type":"string","nullable":true,"example":"MAIN"},"selectedModifiers":{"type":"object","additionalProperties":true,"properties":{},"description":"JSONB array of selected modifiers"},"seatNumber":{"type":"number","nullable":true,"example":1},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","salesOrderId","variantId","quantity","unitPrice","selectedModifiers","createdAt","updatedAt"]},"SelectedModifierDto":{"type":"object","properties":{"modifierId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Bacon"},"priceDelta":{"type":"string","example":"2.0000"}},"required":["modifierId","name","priceDelta"]},"CreateSalesOrderLineDto":{"type":"object","properties":{"variantId":{"type":"string","format":"uuid","example":"uuid"},"quantity":{"type":"string","example":"2.0000"},"unitPrice":{"type":"string","example":"49.9900"},"lineDiscount":{"type":"string","example":"0.0000"},"taxRateId":{"type":"string","format":"uuid","example":"uuid"},"taxAmount":{"type":"string","example":"0.0000"},"appliedPromotionId":{"type":"string","format":"uuid","example":"uuid"},"courseType":{"type":"string","example":"MAIN","description":"Course (APPETIZER, MAIN, DESSERT, etc.)"},"selectedModifiers":{"description":"Snapshot of modifier choices made for this line","type":"array","items":{"$ref":"#/components/schemas/SelectedModifierDto"}},"seatNumber":{"type":"number","minimum":1,"example":1}},"required":["variantId","quantity","unitPrice"]},"UpdateSalesOrderLineDto":{"type":"object","properties":{"variantId":{"type":"string","format":"uuid","example":"uuid"},"quantity":{"type":"string","example":"2.0000"},"unitPrice":{"type":"string","example":"49.9900"},"lineDiscount":{"type":"string","example":"0.0000"},"taxRateId":{"type":"string","format":"uuid","example":"uuid"},"taxAmount":{"type":"string","example":"0.0000"},"appliedPromotionId":{"type":"string","format":"uuid","example":"uuid"},"courseType":{"type":"string","example":"MAIN","description":"Course (APPETIZER, MAIN, DESSERT, etc.)"},"selectedModifiers":{"description":"Snapshot of modifier choices made for this line","type":"array","items":{"$ref":"#/components/schemas/SelectedModifierDto"}},"seatNumber":{"type":"number","minimum":1,"example":1}}},"VoidLineDto":{"type":"object","properties":{"voidReasonId":{"type":"string","format":"uuid","example":"uuid"},"notes":{"type":"string","example":"Customer changed their mind after firing"}},"required":["voidReasonId"]},"CompLineDto":{"type":"object","properties":{"compReasonId":{"type":"string","format":"uuid","example":"uuid"},"notes":{"type":"string","example":"Birthday on the house"}},"required":["compReasonId"]},"OrderPaymentEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"salesOrderId":{"type":"string","example":"uuid"},"paymentMethodId":{"type":"string","example":"uuid"},"posSessionId":{"type":"string","nullable":true,"example":"uuid"},"amount":{"type":"string","example":"100.0000"},"tipAmount":{"type":"string","example":"5.0000"},"transactionReference":{"type":"string","nullable":true,"example":"TXN-12345"},"paymentDate":{"format":"date-time","type":"string","nullable":true,"example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","salesOrderId","paymentMethodId","amount","tipAmount","updatedAt"]},"CreateOrderPaymentDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"paymentMethodId":{"type":"string","format":"uuid","example":"uuid"},"posSessionId":{"type":"string","format":"uuid","example":"uuid"},"amount":{"type":"string","example":"100.0000"},"tipAmount":{"type":"string","example":"5.0000"},"transactionReference":{"type":"string","example":"TXN-12345"}},"required":["tenantId","paymentMethodId","amount"]},"UpdateOrderPaymentDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"paymentMethodId":{"type":"string","format":"uuid","example":"uuid"},"posSessionId":{"type":"string","format":"uuid","example":"uuid"},"amount":{"type":"string","example":"100.0000"},"tipAmount":{"type":"string","example":"5.0000"},"transactionReference":{"type":"string","example":"TXN-12345"}}},"PromotionRuleEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"10% Off Electronics"},"eligibilityCriteria":{"type":"object","example":{"category":"Electronics"}},"rewardAction":{"type":"object","example":{"type":"PERCENTAGE_DISCOUNT","value":10}},"priorityLevel":{"type":"number","nullable":true,"example":0},"isStackable":{"type":"boolean","nullable":true,"example":false},"startDate":{"format":"date-time","type":"string","nullable":true,"example":"2026-01-01T00:00:00.000Z"},"endDate":{"format":"date-time","type":"string","nullable":true,"example":"2026-12-31T00:00:00.000Z"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","name","eligibilityCriteria","rewardAction","createdAt","updatedAt"]},"CreatePromotionRuleDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"10% Off Electronics"},"eligibilityCriteria":{"type":"object","example":{"category":"Electronics"}},"rewardAction":{"type":"object","example":{"type":"PERCENTAGE_DISCOUNT","value":10}},"priorityLevel":{"type":"number","minimum":0,"example":0},"isStackable":{"type":"boolean","example":false},"startDate":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"endDate":{"format":"date-time","type":"string","example":"2026-12-31T00:00:00.000Z"}},"required":["tenantId","name","eligibilityCriteria","rewardAction"]},"UpdatePromotionRuleDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"10% Off Electronics"},"eligibilityCriteria":{"type":"object","example":{"category":"Electronics"}},"rewardAction":{"type":"object","example":{"type":"PERCENTAGE_DISCOUNT","value":10}},"priorityLevel":{"type":"number","minimum":0,"example":0},"isStackable":{"type":"boolean","example":false},"startDate":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"endDate":{"format":"date-time","type":"string","example":"2026-12-31T00:00:00.000Z"}}},"CheckoutResponseDto":{"type":"object","properties":{"orderId":{"type":"string","example":"uuid"},"orderNumber":{"type":"string","example":"SO-20260402-0001"},"grandTotal":{"type":"string","example":"95.0000"},"totalPaid":{"type":"string","example":"100.0000"},"change":{"type":"string","example":"5.0000","description":"Change to return (cash overpayment)"},"status":{"type":"string","example":"COMPLETED"},"lines":{"description":"Order line items","type":"array","items":{"type":"object"}},"payments":{"description":"Payment records","type":"array","items":{"type":"object"}}},"required":["orderId","orderNumber","grandTotal","totalPaid","change","status","lines","payments"]},"CheckoutItemDto":{"type":"object","properties":{"variantId":{"type":"string","format":"uuid","example":"uuid","description":"Product variant ID"},"quantity":{"type":"string","example":"1.0000","description":"Quantity to purchase"},"lineDiscount":{"type":"string","example":"5.0000","description":"Per-line discount amount"}},"required":["variantId","quantity"]},"CheckoutPaymentDto":{"type":"object","properties":{"paymentMethodId":{"type":"string","format":"uuid","example":"uuid","description":"Payment method ID"},"amount":{"type":"string","example":"100.0000","description":"Payment amount (includes any tip)"},"tipAmount":{"type":"string","example":"5.0000","description":"Tip amount included in this payment"},"transactionReference":{"type":"string","example":"TXN-12345","description":"External transaction reference (card, mobile, etc.)"}},"required":["paymentMethodId","amount"]},"CheckoutDto":{"type":"object","properties":{"locationId":{"type":"string","format":"uuid","example":"uuid","description":"Location/store ID"},"salesChannel":{"type":"string","example":"POS","description":"Sales channel (POS, ONLINE)"},"customerId":{"type":"string","format":"uuid","example":"uuid","description":"Customer ID"},"posSessionId":{"type":"string","format":"uuid","example":"uuid","description":"POS session ID"},"serviceType":{"type":"string","enum":["DINE_IN","TAKEAWAY","DELIVERY","COUNTER"],"description":"DINE_IN, TAKEAWAY, DELIVERY, COUNTER"},"lineStatus":{"type":"string","enum":["PENDING","FIRED","READY","SERVED","VOIDED","COMPED"],"description":"Initial line status. Defaults to SERVED (instant retail). Use PENDING for counter/QSR orders that need kitchen prep — fire to KDS afterwards."},"tipAmount":{"type":"string","example":"5.0000","description":"Total tip amount on this order"},"serviceCharge":{"type":"string","example":"3.0000","description":"Service charge added to this order"},"discountReasonId":{"type":"string","format":"uuid","example":"uuid","description":"Discount reason for any order-level discount"},"idempotencyKey":{"type":"string","example":"idem-key-001","description":"Idempotency key to prevent duplicate orders"},"items":{"minItems":1,"description":"Cart items","type":"array","items":{"$ref":"#/components/schemas/CheckoutItemDto"}},"payments":{"minItems":1,"description":"Payments","type":"array","items":{"$ref":"#/components/schemas/CheckoutPaymentDto"}},"tenantId":{"type":"string"}},"required":["locationId","salesChannel","items","payments","tenantId"]},"ReceiptHeaderDto":{"type":"object","properties":{"businessName":{"type":"string","example":"Acme Corp"},"legalName":{"type":"string","nullable":true,"example":"Acme Corporation Ltd."},"logoUrl":{"type":"string","nullable":true,"example":"https://example.com/logo.png"},"address":{"type":"string","nullable":true,"example":"123 Main Street"},"city":{"type":"string","nullable":true,"example":"New York"},"state":{"type":"string","nullable":true,"example":"NY"},"country":{"type":"string","nullable":true,"example":"US"},"zipCode":{"type":"string","nullable":true,"example":"10001"},"phone":{"type":"string","nullable":true,"example":"+1-555-0100"},"email":{"type":"string","nullable":true,"example":"info@acme.com"},"website":{"type":"string","nullable":true,"example":"https://acme.com"}},"required":["businessName"]},"ReceiptOrderInfoDto":{"type":"object","properties":{"receiptNumber":{"type":"string","example":"RCP-20260402-0001"},"orderNumber":{"type":"string","example":"SO-20260402-0001"},"dateTime":{"format":"date-time","type":"string","example":"2026-04-02T10:30:00.000Z"},"salesChannel":{"type":"string","example":"POS"},"locationName":{"type":"string","nullable":true,"example":"Main Store"}},"required":["receiptNumber","orderNumber","dateTime","salesChannel"]},"ReceiptCustomerDto":{"type":"object","properties":{"name":{"type":"string","example":"John Doe"},"phone":{"type":"string","nullable":true,"example":"+1-555-0199"},"email":{"type":"string","nullable":true,"example":"john@example.com"},"loyaltyTier":{"type":"string","nullable":true,"example":"GOLD"},"pointsEarned":{"type":"number","example":95,"description":"Loyalty points earned from this order"}},"required":["name","pointsEarned"]},"ReceiptLineItemDto":{"type":"object","properties":{"productName":{"type":"string","example":"Wireless Mouse"},"variantSku":{"type":"string","example":"WM-BLK-001"},"barcode":{"type":"string","nullable":true,"example":"4901234567890"},"variantOptions":{"type":"object","example":{"color":"Black","size":"Standard"},"description":"Variant options (color, size, etc.)"},"quantity":{"type":"string","example":"2.0000"},"unitPrice":{"type":"string","example":"29.9900"},"lineDiscount":{"type":"string","example":"0.0000"},"taxAmount":{"type":"string","example":"4.2000"},"lineTotal":{"type":"string","example":"64.1800"}},"required":["productName","variantSku","quantity","unitPrice","lineDiscount","taxAmount","lineTotal"]},"ReceiptTaxSummaryLineDto":{"type":"object","properties":{"taxName":{"type":"string","example":"VAT 7%"},"ratePercentage":{"type":"string","example":"0.0700"},"taxableAmount":{"type":"string","example":"59.9800"},"taxAmount":{"type":"string","example":"4.2000"}},"required":["taxName","ratePercentage","taxableAmount","taxAmount"]},"ReceiptTotalsDto":{"type":"object","properties":{"subtotal":{"type":"string","example":"59.9800"},"totalDiscount":{"type":"string","example":"0.0000"},"totalTax":{"type":"string","example":"4.2000"},"grandTotal":{"type":"string","example":"64.1800"}},"required":["subtotal","totalDiscount","totalTax","grandTotal"]},"ReceiptPaymentDto":{"type":"object","properties":{"methodName":{"type":"string","example":"CASH"},"amount":{"type":"string","example":"70.0000"},"transactionReference":{"type":"string","nullable":true,"example":"TXN-12345"},"paymentDate":{"format":"date-time","type":"string","nullable":true,"example":"2026-04-02T10:30:00.000Z"}},"required":["methodName","amount"]},"ReceiptPaymentSummaryDto":{"type":"object","properties":{"payments":{"type":"array","items":{"$ref":"#/components/schemas/ReceiptPaymentDto"}},"totalPaid":{"type":"string","example":"70.0000"},"changeDue":{"type":"string","example":"5.8200"}},"required":["payments","totalPaid","changeDue"]},"ReceiptFooterDto":{"type":"object","properties":{"message":{"type":"string","example":"Thank you for your purchase!"},"returnPolicy":{"type":"string","nullable":true,"example":"Returns accepted within 30 days with receipt."}},"required":["message"]},"ReceiptResponseDto":{"type":"object","properties":{"header":{"$ref":"#/components/schemas/ReceiptHeaderDto"},"orderInfo":{"$ref":"#/components/schemas/ReceiptOrderInfoDto"},"customer":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ReceiptCustomerDto"}]},"lineItems":{"type":"array","items":{"$ref":"#/components/schemas/ReceiptLineItemDto"}},"taxSummary":{"type":"array","items":{"$ref":"#/components/schemas/ReceiptTaxSummaryLineDto"}},"totals":{"$ref":"#/components/schemas/ReceiptTotalsDto"},"paymentSummary":{"$ref":"#/components/schemas/ReceiptPaymentSummaryDto"},"footer":{"$ref":"#/components/schemas/ReceiptFooterDto"}},"required":["header","orderInfo","lineItems","taxSummary","totals","paymentSummary","footer"]},"ReturnLineResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"salesOrderLineId":{"type":"string","example":"uuid"},"variantId":{"type":"string","example":"uuid"},"returnedQuantity":{"type":"string","example":"1.0000"},"unitPrice":{"type":"string","example":"29.9900"},"lineDiscount":{"type":"string","example":"0.0000"},"taxAmount":{"type":"string","example":"2.1000"},"lineRefund":{"type":"string","example":"32.0900"}},"required":["id","salesOrderLineId","variantId","returnedQuantity","unitPrice","lineDiscount","taxAmount","lineRefund"]},"ReturnResponseDto":{"type":"object","properties":{"returnId":{"type":"string","example":"uuid"},"returnNumber":{"type":"string","example":"RET-20260403-0001"},"salesOrderId":{"type":"string","example":"uuid"},"reason":{"type":"string","example":"Defective product"},"refundMethod":{"type":"string","example":"CASH","enum":["ORIGINAL_PAYMENT","STORE_CREDIT","CASH"]},"subtotalRefund":{"type":"string","example":"29.9900"},"taxRefund":{"type":"string","example":"2.1000"},"totalRefund":{"type":"string","example":"32.0900"},"orderStatus":{"type":"string","example":"PARTIALLY_REFUNDED"},"lines":{"type":"array","items":{"$ref":"#/components/schemas/ReturnLineResponseDto"}},"createdAt":{"format":"date-time","type":"string","example":"2026-04-03T10:30:00.000Z"}},"required":["returnId","returnNumber","salesOrderId","reason","refundMethod","subtotalRefund","taxRefund","totalRefund","orderStatus","lines","createdAt"]},"ReturnItemDto":{"type":"object","properties":{"salesOrderLineId":{"type":"string","format":"uuid","example":"uuid","description":"Original sales order line ID"},"returnedQuantity":{"type":"string","example":"1.0000","description":"Quantity to return"}},"required":["salesOrderLineId","returnedQuantity"]},"ProcessReturnDto":{"type":"object","properties":{"salesOrderId":{"type":"string","format":"uuid","example":"uuid","description":"Sales order ID to return against"},"reason":{"type":"string","maxLength":500,"example":"Defective product","description":"Reason for return"},"refundMethod":{"type":"string","example":"CASH","enum":["ORIGINAL_PAYMENT","STORE_CREDIT","CASH"],"description":"How to issue the refund"},"posSessionId":{"type":"string","format":"uuid","example":"uuid","description":"POS session ID"},"items":{"minItems":1,"description":"Items to return","type":"array","items":{"$ref":"#/components/schemas/ReturnItemDto"}},"tenantId":{"type":"string"}},"required":["salesOrderId","reason","refundMethod","items","tenantId"]},"PosRegisterEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"locationId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Register 1"},"macAddress":{"type":"string","nullable":true,"example":"AA:BB:CC:DD:EE:FF"},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","locationId","name","createdAt","updatedAt"]},"CreatePosRegisterDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Register 1"},"macAddress":{"type":"string","example":"AA:BB:CC:DD:EE:FF"}},"required":["tenantId","locationId","name"]},"UpdatePosRegisterDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Register 1"},"macAddress":{"type":"string","example":"AA:BB:CC:DD:EE:FF"}}},"PosSessionEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"registerId":{"type":"string","example":"uuid"},"cashierId":{"type":"string","example":"uuid"},"openedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"closedAt":{"format":"date-time","type":"string","nullable":true,"example":"2026-01-01T23:59:59.000Z"},"openingCashFloat":{"type":"string","example":"500.0000"},"expectedClosingCash":{"type":"string","nullable":true,"example":"1500.0000"},"actualClosingCash":{"type":"string","nullable":true,"example":"1490.0000"},"cashVariance":{"type":"string","nullable":true,"example":"-10.0000"},"status":{"type":"string","nullable":true,"example":"OPEN","enum":["OPEN","CLOSED","AUDITED"]},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","registerId","cashierId","openedAt","openingCashFloat","updatedAt"]},"CreatePosSessionDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"registerId":{"type":"string","format":"uuid","example":"uuid"},"cashierId":{"type":"string","format":"uuid","example":"uuid"},"openingCashFloat":{"type":"string","example":"500.0000"},"expectedClosingCash":{"type":"string","example":"1500.0000"},"actualClosingCash":{"type":"string","example":"1490.0000"},"cashVariance":{"type":"string","example":"-10.0000"},"closedAt":{"format":"date-time","type":"string","example":"2026-01-01T23:59:59.000Z"},"status":{"type":"string","example":"OPEN","enum":["OPEN","CLOSED","AUDITED"]}},"required":["tenantId","registerId","cashierId","openingCashFloat"]},"UpdatePosSessionDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"registerId":{"type":"string","format":"uuid","example":"uuid"},"cashierId":{"type":"string","format":"uuid","example":"uuid"},"openingCashFloat":{"type":"string","example":"500.0000"},"expectedClosingCash":{"type":"string","example":"1500.0000"},"actualClosingCash":{"type":"string","example":"1490.0000"},"cashVariance":{"type":"string","example":"-10.0000"},"closedAt":{"format":"date-time","type":"string","example":"2026-01-01T23:59:59.000Z"},"status":{"type":"string","example":"OPEN","enum":["OPEN","CLOSED","AUDITED"]}}},"PaymentMethodSummaryDto":{"type":"object","properties":{"methodName":{"type":"string","example":"CASH"},"transactionCount":{"type":"number","example":5},"totalAmount":{"type":"string","example":"750.0000"}},"required":["methodName","transactionCount","totalAmount"]},"EndOfDaySummaryDto":{"type":"object","properties":{"sessionId":{"type":"string","example":"uuid"},"registerName":{"type":"string","example":"Register 1"},"cashierName":{"type":"string","nullable":true,"example":"John Doe"},"openedAt":{"format":"date-time","type":"string","example":"2026-04-03T08:00:00.000Z"},"closedAt":{"format":"date-time","type":"string","nullable":true,"example":"2026-04-03T20:00:00.000Z"},"openingCashFloat":{"type":"string","example":"500.0000"},"expectedClosingCash":{"type":"string","example":"1480.0000"},"actualClosingCash":{"type":"string","nullable":true,"example":"1500.0000"},"cashVariance":{"type":"string","nullable":true,"example":"20.0000"},"totalSales":{"type":"string","example":"2500.0000"},"totalRefunds":{"type":"string","example":"120.0000"},"netTotal":{"type":"string","example":"2380.0000"},"salesCount":{"type":"number","example":15},"refundCount":{"type":"number","example":2},"paymentBreakdown":{"type":"array","items":{"$ref":"#/components/schemas/PaymentMethodSummaryDto"}},"status":{"type":"string","example":"CLOSED"}},"required":["sessionId","registerName","openedAt","openingCashFloat","expectedClosingCash","totalSales","totalRefunds","netTotal","salesCount","refundCount","paymentBreakdown","status"]},"ClosePosSessionDto":{"type":"object","properties":{"actualClosingCash":{"type":"string","example":"1500.0000","description":"Physical cash count at end of day"}},"required":["actualClosingCash"]},"PaymentMethodEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Cash"},"glAccountId":{"type":"string","nullable":true,"example":"uuid"},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","name","createdAt","updatedAt"]},"CreatePaymentMethodDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Cash"},"glAccountId":{"type":"string","format":"uuid","example":"uuid"}},"required":["tenantId","name"]},"UpdatePaymentMethodDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Cash"},"glAccountId":{"type":"string","format":"uuid","example":"uuid"}}},"InventoryLedgerEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"locationId":{"type":"string","example":"uuid"},"variantId":{"type":"string","example":"uuid"},"transactionType":{"type":"string","example":"GRN_RECEIPT"},"referenceId":{"type":"string","example":"uuid"},"quantity":{"type":"string","example":"100.0000"},"unitCost":{"type":"string","example":"25.5000"},"serialNumber":{"type":"string","nullable":true,"example":"SN-001"},"batchNumber":{"type":"string","nullable":true,"example":"BATCH-001"},"manufacturingDate":{"format":"date-time","type":"string","nullable":true,"example":"2025-01-01"},"expiryDate":{"format":"date-time","type":"string","nullable":true,"example":"2027-01-01"},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"createdBy":{"type":"string","nullable":true,"example":"uuid"}},"required":["id","tenantId","locationId","variantId","transactionType","referenceId","quantity","unitCost","createdAt"]},"CreateInventoryLedgerDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"variantId":{"type":"string","format":"uuid","example":"uuid"},"transactionType":{"type":"string","example":"GRN_RECEIPT"},"referenceId":{"type":"string","format":"uuid","example":"uuid"},"quantity":{"type":"string","example":"100.0000"},"unitCost":{"type":"string","example":"25.5000"},"serialNumber":{"type":"string","example":"SN-001"},"batchNumber":{"type":"string","example":"BATCH-001"},"manufacturingDate":{"format":"date-time","type":"string","example":"2025-01-01"},"expiryDate":{"format":"date-time","type":"string","example":"2027-01-01"},"createdBy":{"type":"string","format":"uuid","example":"uuid"}},"required":["tenantId","locationId","variantId","transactionType","referenceId","quantity","unitCost"]},"WriteOffInventoryDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"variantId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"quantity":{"type":"string","example":"5.0000","description":"Quantity to write off (positive number, will be deducted)"},"reason":{"type":"string","example":"Expired batch BATCH-001"},"batchNumber":{"type":"string","example":"BATCH-001"},"unitCost":{"type":"string","example":"25.5000"}},"required":["tenantId","variantId","locationId","quantity","reason"]},"ExchangeRateEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"baseCurrency":{"type":"string","example":"USD"},"targetCurrency":{"type":"string","example":"EUR"},"rate":{"type":"string","example":"1.0850"},"effectiveFrom":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"effectiveTo":{"format":"date-time","type":"string","nullable":true,"example":"2026-12-31T00:00:00.000Z"},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","baseCurrency","targetCurrency","rate","effectiveFrom","createdAt","updatedAt"]},"CreateExchangeRateDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"baseCurrency":{"type":"string","example":"USD"},"targetCurrency":{"type":"string","example":"EUR"},"rate":{"type":"string","example":"1.0850"},"effectiveFrom":{"format":"date-time","type":"string","example":"2026-01-01"},"effectiveTo":{"format":"date-time","type":"string","example":"2026-12-31"}},"required":["tenantId","baseCurrency","targetCurrency","rate","effectiveFrom"]},"UpdateExchangeRateDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"baseCurrency":{"type":"string","example":"USD"},"targetCurrency":{"type":"string","example":"EUR"},"rate":{"type":"string","example":"1.0850"},"effectiveFrom":{"format":"date-time","type":"string","example":"2026-01-01"},"effectiveTo":{"format":"date-time","type":"string","example":"2026-12-31"}}},"TaxRateEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"VAT Standard"},"ratePercentage":{"type":"string","example":"15.0000"},"isPriceInclusive":{"type":"boolean","nullable":true,"example":true},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"glLiabilityAccountId":{"type":"string","nullable":true,"example":"uuid"},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.829Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:28.829Z"}},"required":["id","tenantId","name","ratePercentage","createdAt","updatedAt"]},"CreateTaxRateDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"VAT Standard"},"ratePercentage":{"type":"string","example":"15.0000"},"isPriceInclusive":{"type":"boolean","example":true},"glLiabilityAccountId":{"type":"string","format":"uuid","example":"uuid"}},"required":["tenantId","name","ratePercentage"]},"UpdateTaxRateDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"VAT Standard"},"ratePercentage":{"type":"string","example":"15.0000"},"isPriceInclusive":{"type":"boolean","example":true},"glLiabilityAccountId":{"type":"string","format":"uuid","example":"uuid"}}},"AccountingPeriodEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"periodName":{"type":"string","example":"Q1 2026"},"startDate":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"endDate":{"format":"date-time","type":"string","example":"2026-03-31T00:00:00.000Z"},"status":{"type":"string","nullable":true,"example":"OPEN","enum":["OPEN","CLOSED","LOCKED_FOR_AUDIT"]},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","periodName","startDate","endDate","createdAt","updatedAt"]},"CreateAccountingPeriodDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"periodName":{"type":"string","example":"Q1 2026"},"startDate":{"format":"date-time","type":"string","example":"2026-01-01"},"endDate":{"format":"date-time","type":"string","example":"2026-03-31"},"status":{"type":"string","example":"OPEN","enum":["OPEN","CLOSED","LOCKED_FOR_AUDIT"]}},"required":["tenantId","periodName","startDate","endDate"]},"UpdateAccountingPeriodDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"periodName":{"type":"string","example":"Q1 2026"},"startDate":{"format":"date-time","type":"string","example":"2026-01-01"},"endDate":{"format":"date-time","type":"string","example":"2026-03-31"},"status":{"type":"string","example":"OPEN","enum":["OPEN","CLOSED","LOCKED_FOR_AUDIT"]}}},"ChartOfAccountEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"parentAccountId":{"type":"string","nullable":true,"example":"uuid"},"accountCode":{"type":"string","example":"1000"},"accountName":{"type":"string","example":"Cash and Cash Equivalents"},"accountType":{"type":"string","example":"ASSET"},"isReconcilable":{"type":"boolean","nullable":true,"example":true},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","accountCode","accountName","accountType","createdAt","updatedAt"]},"CreateChartOfAccountDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"parentAccountId":{"type":"string","format":"uuid","example":"uuid"},"accountCode":{"type":"string","example":"1000"},"accountName":{"type":"string","example":"Cash and Cash Equivalents"},"accountType":{"type":"string","example":"ASSET"},"isReconcilable":{"type":"boolean","example":true}},"required":["tenantId","accountCode","accountName","accountType"]},"UpdateChartOfAccountDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"parentAccountId":{"type":"string","format":"uuid","example":"uuid"},"accountCode":{"type":"string","example":"1000"},"accountName":{"type":"string","example":"Cash and Cash Equivalents"},"accountType":{"type":"string","example":"ASSET"},"isReconcilable":{"type":"boolean","example":true}}},"JournalEntryEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"periodId":{"type":"string","example":"uuid"},"entryDate":{"format":"date-time","type":"string","example":"2026-01-15T00:00:00.000Z"},"description":{"type":"string","nullable":true,"example":"Monthly payroll entry"},"sourceModule":{"type":"string","nullable":true,"example":"payroll"},"sourceRecordId":{"type":"string","nullable":true,"example":"uuid"},"status":{"type":"string","nullable":true,"example":"DRAFT","enum":["DRAFT","POSTED","VOIDED"]},"postedAt":{"format":"date-time","type":"string","nullable":true,"example":"2026-01-15T00:00:00.000Z"},"postedBy":{"type":"string","nullable":true,"example":"uuid"},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","periodId","entryDate","createdAt","updatedAt"]},"CreateJournalEntryDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"periodId":{"type":"string","format":"uuid","example":"uuid"},"description":{"type":"string","example":"Monthly payroll entry"},"sourceModule":{"type":"string","example":"payroll"},"sourceRecordId":{"type":"string","format":"uuid","example":"uuid"},"status":{"type":"string","example":"DRAFT","enum":["DRAFT","POSTED","VOIDED"]},"postedBy":{"type":"string","format":"uuid","example":"uuid"}},"required":["tenantId","periodId"]},"UpdateJournalEntryDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"periodId":{"type":"string","format":"uuid","example":"uuid"},"description":{"type":"string","example":"Monthly payroll entry"},"sourceModule":{"type":"string","example":"payroll"},"sourceRecordId":{"type":"string","format":"uuid","example":"uuid"},"status":{"type":"string","example":"DRAFT","enum":["DRAFT","POSTED","VOIDED"]},"postedBy":{"type":"string","format":"uuid","example":"uuid"}}},"JournalLineEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"journalEntryId":{"type":"string","example":"uuid"},"accountId":{"type":"string","example":"uuid"},"transactionCurrency":{"type":"string","example":"USD"},"transactionDebit":{"type":"string","nullable":true,"example":"1000.0000"},"transactionCredit":{"type":"string","nullable":true,"example":"0.0000"},"exchangeRate":{"type":"string","nullable":true,"example":"1.0000"},"baseDebit":{"type":"string","nullable":true,"example":"1000.0000"},"baseCredit":{"type":"string","nullable":true,"example":"0.0000"}},"required":["id","journalEntryId","accountId","transactionCurrency"]},"CreateJournalLineDto":{"type":"object","properties":{"accountId":{"type":"string","format":"uuid","example":"uuid"},"transactionCurrency":{"type":"string","example":"USD"},"transactionDebit":{"type":"string","example":"1000.0000"},"transactionCredit":{"type":"string","example":"0.0000"},"exchangeRate":{"type":"string","example":"1.0000"},"baseDebit":{"type":"string","example":"1000.0000"},"baseCredit":{"type":"string","example":"0.0000"}},"required":["accountId","transactionCurrency"]},"UpdateJournalLineDto":{"type":"object","properties":{"accountId":{"type":"string","format":"uuid","example":"uuid"},"transactionCurrency":{"type":"string","example":"USD"},"transactionDebit":{"type":"string","example":"1000.0000"},"transactionCredit":{"type":"string","example":"0.0000"},"exchangeRate":{"type":"string","example":"1.0000"},"baseDebit":{"type":"string","example":"1000.0000"},"baseCredit":{"type":"string","example":"0.0000"}}},"BankStatementEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"glAccountId":{"type":"string","example":"uuid"},"statementDate":{"format":"date-time","type":"string","example":"2026-01-31T00:00:00.000Z"},"openingBalance":{"type":"string","nullable":true,"example":"10000.0000"},"closingBalance":{"type":"string","nullable":true,"example":"12500.0000"},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","glAccountId","statementDate","createdAt","updatedAt"]},"CreateBankStatementDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"glAccountId":{"type":"string","format":"uuid","example":"uuid"},"statementDate":{"format":"date-time","type":"string","example":"2026-01-31"},"openingBalance":{"type":"string","example":"10000.0000"},"closingBalance":{"type":"string","example":"12500.0000"}},"required":["tenantId","glAccountId","statementDate"]},"UpdateBankStatementDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"glAccountId":{"type":"string","format":"uuid","example":"uuid"},"statementDate":{"format":"date-time","type":"string","example":"2026-01-31"},"openingBalance":{"type":"string","example":"10000.0000"},"closingBalance":{"type":"string","example":"12500.0000"}}},"BankStatementLineEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"statementId":{"type":"string","example":"uuid"},"transactionDate":{"format":"date-time","type":"string","example":"2026-01-15T00:00:00.000Z"},"description":{"type":"string","example":"Wire transfer from client"},"referenceNumber":{"type":"string","nullable":true,"example":"REF-001"},"amount":{"type":"string","example":"500.0000"},"status":{"type":"string","nullable":true,"example":"UNMATCHED","enum":["UNMATCHED","MATCHED"]}},"required":["id","statementId","transactionDate","description","amount"]},"CreateBankStatementLineDto":{"type":"object","properties":{"transactionDate":{"format":"date-time","type":"string","example":"2026-01-15"},"description":{"type":"string","example":"Wire transfer from client"},"referenceNumber":{"type":"string","example":"REF-001"},"amount":{"type":"string","example":"500.0000"},"status":{"type":"string","example":"UNMATCHED","enum":["UNMATCHED","MATCHED"]}},"required":["transactionDate","description","amount"]},"UpdateBankStatementLineDto":{"type":"object","properties":{"transactionDate":{"format":"date-time","type":"string","example":"2026-01-15"},"description":{"type":"string","example":"Wire transfer from client"},"referenceNumber":{"type":"string","example":"REF-001"},"amount":{"type":"string","example":"500.0000"},"status":{"type":"string","example":"UNMATCHED","enum":["UNMATCHED","MATCHED"]}}},"ReconciliationMatchEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"statementLineId":{"type":"string","example":"uuid"},"journalLineId":{"type":"string","example":"uuid"},"matchedBy":{"type":"string","nullable":true,"example":"uuid"},"matchedAt":{"format":"date-time","type":"string","example":"2026-01-15T00:00:00.000Z"}},"required":["id","statementLineId","journalLineId","matchedAt"]},"CreateReconciliationMatchDto":{"type":"object","properties":{"statementLineId":{"type":"string","format":"uuid","example":"uuid"},"journalLineId":{"type":"string","format":"uuid","example":"uuid"},"matchedBy":{"type":"string","format":"uuid","example":"uuid"}},"required":["statementLineId","journalLineId"]},"UpdateReconciliationMatchDto":{"type":"object","properties":{"statementLineId":{"type":"string","format":"uuid","example":"uuid"},"journalLineId":{"type":"string","format":"uuid","example":"uuid"},"matchedBy":{"type":"string","format":"uuid","example":"uuid"}}},"FixedAssetEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"assetName":{"type":"string","example":"Office Laptop"},"serialNumber":{"type":"string","nullable":true,"example":"SN-12345"},"assetAccountId":{"type":"string","nullable":true,"example":"uuid"},"depreciationExpenseAccountId":{"type":"string","nullable":true,"example":"uuid"},"accumulatedDepreciationAccountId":{"type":"string","nullable":true,"example":"uuid"},"purchaseDate":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"purchaseCost":{"type":"string","example":"1500.0000"},"salvageValue":{"type":"string","nullable":true,"example":"200.0000"},"usefulLifeMonths":{"type":"number","example":60},"depreciationMethod":{"type":"string","nullable":true,"example":"STRAIGHT_LINE"},"status":{"type":"string","nullable":true,"example":"ACTIVE","enum":["ACTIVE","FULLY_DEPRECIATED","DISPOSED"]},"createdAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-01-01T00:00:00.000Z"}},"required":["id","tenantId","assetName","purchaseDate","purchaseCost","usefulLifeMonths","createdAt","updatedAt"]},"CreateFixedAssetDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"assetName":{"type":"string","example":"Office Laptop"},"serialNumber":{"type":"string","example":"SN-12345"},"assetAccountId":{"type":"string","format":"uuid","example":"uuid"},"depreciationExpenseAccountId":{"type":"string","format":"uuid","example":"uuid"},"accumulatedDepreciationAccountId":{"type":"string","format":"uuid","example":"uuid"},"purchaseDate":{"format":"date-time","type":"string","example":"2026-01-01"},"purchaseCost":{"type":"string","example":"1500.0000"},"salvageValue":{"type":"string","example":"200.0000"},"usefulLifeMonths":{"type":"number","example":60},"depreciationMethod":{"type":"string","example":"STRAIGHT_LINE"},"status":{"type":"string","example":"ACTIVE","enum":["ACTIVE","FULLY_DEPRECIATED","DISPOSED"]}},"required":["tenantId","assetName","purchaseDate","purchaseCost","usefulLifeMonths"]},"UpdateFixedAssetDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"assetName":{"type":"string","example":"Office Laptop"},"serialNumber":{"type":"string","example":"SN-12345"},"assetAccountId":{"type":"string","format":"uuid","example":"uuid"},"depreciationExpenseAccountId":{"type":"string","format":"uuid","example":"uuid"},"accumulatedDepreciationAccountId":{"type":"string","format":"uuid","example":"uuid"},"purchaseDate":{"format":"date-time","type":"string","example":"2026-01-01"},"purchaseCost":{"type":"string","example":"1500.0000"},"salvageValue":{"type":"string","example":"200.0000"},"usefulLifeMonths":{"type":"number","example":60},"depreciationMethod":{"type":"string","example":"STRAIGHT_LINE"},"status":{"type":"string","example":"ACTIVE","enum":["ACTIVE","FULLY_DEPRECIATED","DISPOSED"]}}},"DepreciationScheduleEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"assetId":{"type":"string","example":"uuid"},"scheduledDate":{"format":"date-time","type":"string","example":"2026-02-01T00:00:00.000Z"},"depreciationAmount":{"type":"string","example":"21.67"},"isPosted":{"type":"boolean","nullable":true,"example":false},"postedJournalEntryId":{"type":"string","nullable":true,"example":"uuid"}},"required":["id","assetId","scheduledDate","depreciationAmount"]},"CreateDepreciationScheduleDto":{"type":"object","properties":{"scheduledDate":{"format":"date-time","type":"string","example":"2026-02-01"},"depreciationAmount":{"type":"string","example":"21.67"},"isPosted":{"type":"boolean","example":false},"postedJournalEntryId":{"type":"string","format":"uuid","example":"uuid"}},"required":["scheduledDate","depreciationAmount"]},"UpdateDepreciationScheduleDto":{"type":"object","properties":{"scheduledDate":{"format":"date-time","type":"string","example":"2026-02-01"},"depreciationAmount":{"type":"string","example":"21.67"},"isPosted":{"type":"boolean","example":false},"postedJournalEntryId":{"type":"string","format":"uuid","example":"uuid"}}},"UploadResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"url":{"type":"string","example":"/uploads/tenant-uuid/branch-uuid/products/iphone15-1712345678000-123456789.jpg"},"originalName":{"type":"string","example":"iphone15.jpg"},"filename":{"type":"string","example":"iphone15-1712345678000-123456789.jpg"},"folder":{"type":"string","example":"products"},"mimeType":{"type":"string","example":"image/jpeg"},"size":{"type":"number","example":204800,"description":"File size in bytes"},"createdAt":{"format":"date-time","type":"string","example":"2026-04-06T12:00:00.000Z"}},"required":["id","url","originalName","filename","folder","mimeType","size","createdAt"]},"ModifierGroupEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Choose protein"},"minSelection":{"type":"number","example":0},"maxSelection":{"type":"number","nullable":true,"example":1},"isRequired":{"type":"boolean","example":false},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.125Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.125Z"}},"required":["id","tenantId","name","minSelection","isRequired","createdAt","updatedAt"]},"CreateModifierGroupDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Choose protein"},"minSelection":{"type":"number","minimum":0,"example":0},"maxSelection":{"type":"number","minimum":1,"example":1},"isRequired":{"type":"boolean","example":false}},"required":["tenantId","name"]},"UpdateModifierGroupDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Choose protein"},"minSelection":{"type":"number","minimum":0,"example":0},"maxSelection":{"type":"number","minimum":1,"example":1},"isRequired":{"type":"boolean","example":false}}},"AttachModifierGroupDto":{"type":"object","properties":{"productId":{"type":"string","format":"uuid","example":"uuid"},"sortOrder":{"type":"number","minimum":0,"example":0}},"required":["productId"]},"ModifierEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"modifierGroupId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Bacon"},"priceDelta":{"type":"string","example":"2.0000"},"sortOrder":{"type":"number","example":0},"isDefault":{"type":"boolean","example":false},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.130Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.130Z"}},"required":["id","modifierGroupId","name","priceDelta","sortOrder","isDefault","createdAt","updatedAt"]},"CreateModifierDto":{"type":"object","properties":{"name":{"type":"string","example":"Bacon"},"priceDelta":{"type":"number","example":2},"sortOrder":{"type":"number","minimum":0,"example":0},"isDefault":{"type":"boolean","example":false}},"required":["name"]},"UpdateModifierDto":{"type":"object","properties":{"name":{"type":"string","example":"Bacon"},"priceDelta":{"type":"number","example":2},"sortOrder":{"type":"number","minimum":0,"example":0},"isDefault":{"type":"boolean","example":false}}},"RecipeEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"variantId":{"type":"string","example":"uuid"},"yield":{"type":"string","example":"1.0000"},"notes":{"type":"string","nullable":true,"example":"Mix dry, then wet, then bake."},"isActive":{"type":"boolean","example":true},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.138Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.138Z"}},"required":["id","tenantId","variantId","yield","isActive","createdAt","updatedAt"]},"CreateRecipeIngredientDto":{"type":"object","properties":{"ingredientVariantId":{"type":"string","format":"uuid","example":"uuid"},"quantity":{"type":"number","minimum":0,"example":1.5},"uomId":{"type":"string","format":"uuid","example":"uuid"},"isOptional":{"type":"boolean","example":false},"notes":{"type":"string","example":"Use room-temperature butter"}},"required":["ingredientVariantId","quantity","uomId"]},"CreateRecipeDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"variantId":{"type":"string","format":"uuid","example":"uuid"},"yield":{"type":"number","minimum":0,"example":1},"notes":{"type":"string","example":"Mix everything and bake."},"isActive":{"type":"boolean","example":true},"ingredients":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/CreateRecipeIngredientDto"}}},"required":["tenantId","variantId","ingredients"]},"UpdateRecipeDto":{"type":"object","properties":{"yield":{"type":"number","minimum":0,"example":1},"notes":{"type":"string","example":"Updated notes."},"isActive":{"type":"boolean","example":true},"ingredients":{"description":"When provided, replaces the entire ingredient list with this set.","type":"array","items":{"$ref":"#/components/schemas/CreateRecipeIngredientDto"}}}},"BundleEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"productId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Burger Combo"},"description":{"type":"string","nullable":true,"example":"Burger + fries + drink"},"isActive":{"type":"boolean","example":true},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.147Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.148Z"}},"required":["id","tenantId","productId","name","isActive","createdAt","updatedAt"]},"CreateBundleComponentDto":{"type":"object","properties":{"variantId":{"type":"string","format":"uuid","example":"uuid"},"quantity":{"type":"number","minimum":0,"example":1},"swapGroupId":{"type":"string","example":"side","description":"Components sharing a swapGroupId can be substituted at order time"}},"required":["variantId"]},"CreateBundleDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"productId":{"type":"string","format":"uuid","example":"uuid","description":"The parent product representing this combo SKU"},"name":{"type":"string","example":"Burger Combo"},"description":{"type":"string","example":"Burger + fries + drink"},"isActive":{"type":"boolean","example":true},"components":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/CreateBundleComponentDto"}}},"required":["tenantId","productId","name","components"]},"UpdateBundleDto":{"type":"object","properties":{"name":{"type":"string","example":"Burger Combo"},"description":{"type":"string","example":"Updated description"},"isActive":{"type":"boolean","example":true},"components":{"description":"When provided, replaces the entire component list with this set.","type":"array","items":{"$ref":"#/components/schemas/CreateBundleComponentDto"}}}},"PricingScheduleEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Happy Hour"},"startsAt":{"format":"date-time","type":"string","nullable":true,"example":"2026-05-14T05:50:29.159Z"},"endsAt":{"format":"date-time","type":"string","nullable":true,"example":"2026-05-14T05:50:29.159Z"},"daysOfWeek":{"example":[1,2,3,4,5],"description":"0=Sun … 6=Sat","type":"array","items":{"type":"number"}},"startTime":{"type":"string","nullable":true,"example":"17:00"},"endTime":{"type":"string","nullable":true,"example":"19:00"},"priority":{"type":"number","example":0},"isActive":{"type":"boolean","example":true},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.159Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.159Z"}},"required":["id","tenantId","name","daysOfWeek","priority","isActive","createdAt","updatedAt"]},"CreatePricingRuleDto":{"type":"object","properties":{"variantId":{"type":"string","format":"uuid","example":"uuid"},"categoryId":{"type":"string","format":"uuid","example":"uuid"},"adjustmentType":{"enum":["PERCENT_OFF","AMOUNT_OFF","FIXED_PRICE"],"type":"string"},"adjustmentValue":{"type":"number","example":10}},"required":["adjustmentType","adjustmentValue"]},"CreatePricingScheduleDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Happy Hour"},"startsAt":{"type":"string","example":"2026-01-01T00:00:00Z"},"endsAt":{"type":"string","example":"2026-12-31T23:59:59Z"},"daysOfWeek":{"uniqueItems":true,"example":[1,2,3,4,5],"description":"Days of week, 0=Sun … 6=Sat","type":"array","items":{"type":"number","maximum":6,"minimum":0}},"startTime":{"type":"string","pattern":"/^([01]\\d|2[0-3]):[0-5]\\d$/","example":"17:00","description":"24h HH:MM"},"endTime":{"type":"string","pattern":"/^([01]\\d|2[0-3]):[0-5]\\d$/","example":"19:00","description":"24h HH:MM"},"priority":{"type":"number","example":0},"isActive":{"type":"boolean","example":true},"rules":{"type":"array","items":{"$ref":"#/components/schemas/CreatePricingRuleDto"}}},"required":["tenantId","name"]},"UpdatePricingScheduleDto":{"type":"object","properties":{"name":{"type":"string","example":"Happy Hour"},"startsAt":{"type":"string","example":"2026-01-01T00:00:00Z"},"endsAt":{"type":"string","example":"2026-12-31T23:59:59Z"},"daysOfWeek":{"uniqueItems":true,"example":[1,2,3,4,5],"description":"Days of week, 0=Sun … 6=Sat","type":"array","items":{"type":"number","maximum":6,"minimum":0}},"startTime":{"type":"string","pattern":"/^([01]\\d|2[0-3]):[0-5]\\d$/","example":"17:00","description":"24h HH:MM"},"endTime":{"type":"string","pattern":"/^([01]\\d|2[0-3]):[0-5]\\d$/","example":"19:00","description":"24h HH:MM"},"priority":{"type":"number","example":0},"isActive":{"type":"boolean","example":true},"rules":{"type":"array","items":{"$ref":"#/components/schemas/CreatePricingRuleDto"}}}},"DiningZoneEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Patio"},"layoutSvg":{"type":"string","nullable":true,"example":"<svg>...</svg>"},"sortOrder":{"type":"number","example":0},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.168Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.168Z"}},"required":["id","tenantId","name","sortOrder","createdAt","updatedAt"]},"CreateDiningZoneDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Patio"},"layoutSvg":{"type":"string","example":"<svg>...</svg>"},"sortOrder":{"type":"number","minimum":0,"example":0}},"required":["tenantId","name"]},"UpdateDiningZoneDto":{"type":"object","properties":{"name":{"type":"string","example":"Patio"},"layoutSvg":{"type":"string","example":"<svg>...</svg>"},"sortOrder":{"type":"number","minimum":0,"example":0}}},"DiningTableEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"zoneId":{"type":"string","example":"uuid"},"tableNumber":{"type":"string","example":"T-12"},"maxSeats":{"type":"number","example":4},"posX":{"type":"string","nullable":true,"example":"120.50"},"posY":{"type":"string","nullable":true,"example":"85.00"},"shape":{"type":"string","nullable":true,"example":"RECTANGLE"},"status":{"type":"string","nullable":true,"enum":["AVAILABLE","OCCUPIED","DIRTY","RESERVED"],"example":"AVAILABLE"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.179Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.179Z"}},"required":["id","tenantId","zoneId","tableNumber","maxSeats","createdAt","updatedAt"]},"CreateDiningTableDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"zoneId":{"type":"string","format":"uuid","example":"uuid"},"tableNumber":{"type":"string","example":"T-12"},"maxSeats":{"type":"number","minimum":1,"maximum":50,"example":4},"posX":{"type":"number","example":120.5},"posY":{"type":"number","example":85},"shape":{"type":"string","example":"RECTANGLE"},"status":{"type":"string","enum":["AVAILABLE","OCCUPIED","DIRTY","RESERVED"]}},"required":["tenantId","zoneId","tableNumber","maxSeats"]},"UpdateDiningTableDto":{"type":"object","properties":{"zoneId":{"type":"string","format":"uuid","example":"uuid"},"tableNumber":{"type":"string","example":"T-12"},"maxSeats":{"type":"number","minimum":1,"maximum":50,"example":4},"posX":{"type":"number","example":120.5},"posY":{"type":"number","example":85},"shape":{"type":"string","example":"RECTANGLE"},"status":{"type":"string","enum":["AVAILABLE","OCCUPIED","DIRTY","RESERVED"]}}},"UpdateDiningTableStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["AVAILABLE","OCCUPIED","DIRTY","RESERVED"]}},"required":["status"]},"SectionEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"locationId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Section A"},"color":{"type":"string","nullable":true,"example":"#FF5733"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.196Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.196Z"}},"required":["id","tenantId","locationId","name","createdAt","updatedAt"]},"CreateSectionDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Section A"},"color":{"type":"string","example":"#FF5733"}},"required":["tenantId","locationId","name"]},"UpdateSectionDto":{"type":"object","properties":{"locationId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Section A"},"color":{"type":"string","example":"#FF5733"}}},"AttachTableDto":{"type":"object","properties":{"tableId":{"type":"string","format":"uuid","example":"uuid"}},"required":["tableId"]},"SectionAssignmentEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"sectionId":{"type":"string","example":"uuid"},"userId":{"type":"string","example":"uuid"},"startsAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.197Z"},"endsAt":{"format":"date-time","type":"string","nullable":true,"example":null,"description":"When null, this assignment is currently active"},"notes":{"type":"string","nullable":true,"example":"Lunch shift coverage"},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.197Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.197Z"}},"required":["id","sectionId","userId","startsAt","createdAt","updatedAt"]},"CreateSectionAssignmentDto":{"type":"object","properties":{"userId":{"type":"string","format":"uuid","example":"uuid"},"startsAt":{"type":"string","example":"2026-05-05T11:00:00Z"},"endsAt":{"type":"string","example":"2026-05-05T15:00:00Z","description":"When omitted, the assignment is open-ended (currently active)"},"notes":{"type":"string","example":"Lunch shift coverage"}},"required":["userId","startsAt"]},"UpdateSectionAssignmentDto":{"type":"object","properties":{"endsAt":{"type":"string","example":"2026-05-05T15:00:00Z"},"notes":{"type":"string","example":"Updated notes"}}},"KitchenPrinterEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"locationId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Hot Line Printer"},"ipAddress":{"type":"string","nullable":true,"example":"192.168.1.50"},"port":{"type":"number","nullable":true,"example":9100},"isActive":{"type":"boolean","example":true},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.207Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.208Z"}},"required":["id","tenantId","locationId","name","isActive","createdAt","updatedAt"]},"CreateKitchenPrinterDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Hot Line Printer"},"ipAddress":{"type":"string","example":"192.168.1.50"},"port":{"type":"number","minimum":1,"maximum":65535,"example":9100},"isActive":{"type":"boolean","example":true}},"required":["tenantId","locationId","name"]},"UpdateKitchenPrinterDto":{"type":"object","properties":{"locationId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Hot Line Printer"},"ipAddress":{"type":"string","example":"192.168.1.50"},"port":{"type":"number","minimum":1,"maximum":65535,"example":9100},"isActive":{"type":"boolean","example":true}}},"AttachCategoryDto":{"type":"object","properties":{"categoryId":{"type":"string","format":"uuid","example":"uuid"}},"required":["categoryId"]},"DiscountReasonEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"code":{"type":"string","example":"SENIOR_15"},"name":{"type":"string","example":"Senior citizen 15% off"},"description":{"type":"string","nullable":true,"example":"Applies to customers 65 and older"},"isActive":{"type":"boolean","example":true},"requiresManagerOverride":{"type":"boolean","example":false},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.218Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.218Z"}},"required":["id","tenantId","code","name","isActive","requiresManagerOverride","createdAt","updatedAt"]},"CreateDiscountReasonDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"code":{"type":"string","maxLength":50,"pattern":"/^[A-Z0-9_]+$/","example":"SENIOR_15"},"name":{"type":"string","example":"Senior citizen 15% off"},"description":{"type":"string","example":"Applies to customers 65 and older"},"isActive":{"type":"boolean","example":true},"requiresManagerOverride":{"type":"boolean","example":false}},"required":["tenantId","code","name"]},"UpdateDiscountReasonDto":{"type":"object","properties":{"name":{"type":"string","example":"Senior citizen 15% off"},"description":{"type":"string","example":"Applies to customers 65 and older"},"isActive":{"type":"boolean","example":true},"requiresManagerOverride":{"type":"boolean","example":false}}},"VoidReasonEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"code":{"type":"string","example":"CUSTOMER_CHANGED_MIND"},"name":{"type":"string","example":"Customer changed their mind"},"description":{"type":"string","nullable":true,"example":"Used when the customer modifies their order before service"},"isActive":{"type":"boolean","example":true},"requiresManagerOverride":{"type":"boolean","example":false},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.227Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.227Z"}},"required":["id","tenantId","code","name","isActive","requiresManagerOverride","createdAt","updatedAt"]},"CreateVoidReasonDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"code":{"type":"string","maxLength":50,"pattern":"/^[A-Z0-9_]+$/","example":"CUSTOMER_CHANGED_MIND"},"name":{"type":"string","example":"Customer changed their mind"},"description":{"type":"string","example":"Used when the customer modifies their order before service"},"isActive":{"type":"boolean","example":true},"requiresManagerOverride":{"type":"boolean","example":false}},"required":["tenantId","code","name"]},"UpdateVoidReasonDto":{"type":"object","properties":{"name":{"type":"string","example":"Customer changed their mind"},"description":{"type":"string","example":"Used when the customer modifies their order before service"},"isActive":{"type":"boolean","example":true},"requiresManagerOverride":{"type":"boolean","example":false}}},"TableSessionEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"tableId":{"type":"string","example":"uuid"},"waiterId":{"type":"string","nullable":true,"example":"uuid"},"guestCount":{"type":"number","example":4},"openedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.234Z"},"closedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"salesOrderId":{"type":"string","nullable":true,"example":"uuid"},"sessionState":{"type":"string","nullable":true,"enum":["SEATED","ORDERING","SERVED","PAYMENT_PENDING","CLOSED"],"example":"SEATED"},"posRegisterId":{"type":"string","nullable":true,"example":"uuid"},"openedByPosSessionId":{"type":"string","nullable":true,"example":"uuid"}},"required":["id","tenantId","tableId","guestCount","openedAt"]},"OpenTableSessionDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid","description":"Tenant ID"},"tableId":{"type":"string","format":"uuid","example":"uuid","description":"Dining table to seat at"},"locationId":{"type":"string","format":"uuid","example":"uuid","description":"Location for the underlying SalesOrder (typically the restaurant location)"},"guestCount":{"type":"number","minimum":1,"example":4},"waiterId":{"type":"string","format":"uuid","example":"uuid","description":"Assigned waiter"},"posRegisterId":{"type":"string","format":"uuid","example":"uuid","description":"POS terminal opening this session"},"openedByPosSessionId":{"type":"string","format":"uuid","example":"uuid","description":"Cashier shift (PosSession) under which this is opened"},"salesChannel":{"type":"string","example":"POS","description":"Sales channel for the underlying order (default: POS)"}},"required":["tenantId","tableId","locationId","guestCount"]},"UpdateTableSessionDto":{"type":"object","properties":{"guestCount":{"type":"number","minimum":1,"example":4},"waiterId":{"type":"string","format":"uuid","example":"uuid"}}},"UpdateSessionStateDto":{"type":"object","properties":{"sessionState":{"type":"string","enum":["SEATED","ORDERING","SERVED","PAYMENT_PENDING","CLOSED"]}}},"AddSessionLineDto":{"type":"object","properties":{"variantId":{"type":"string","format":"uuid","example":"uuid","description":"Product variant to add"},"quantity":{"type":"number","minimum":0.0001,"example":1},"unitPrice":{"type":"number","example":9.5,"description":"Unit price at time of order"},"lineDiscount":{"type":"number","example":0},"taxRateId":{"type":"string","format":"uuid","example":"uuid"},"taxAmount":{"type":"number","example":0},"courseType":{"type":"string","example":"STARTER","description":"Course type (STARTER, MAIN, DESSERT, etc.)"},"seatNumber":{"type":"number","minimum":1,"example":1,"description":"Seat number to allocate this line to"},"selectedModifiers":{"description":"Selected modifiers (JSON)","example":[{"modifierId":"uuid","name":"Extra cheese","priceDelta":1.5}],"type":"array","items":{"type":"object"}}},"required":["variantId","quantity","unitPrice"]},"SessionSeatAllocationEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"sessionId":{"type":"string","example":"uuid"},"salesOrderLineId":{"type":"string","example":"uuid"},"seatNumber":{"type":"number","example":1}},"required":["id","sessionId","salesOrderLineId","seatNumber"]},"AllocateSeatDto":{"type":"object","properties":{"salesOrderLineId":{"type":"string","format":"uuid","example":"uuid","description":"Sales order line to allocate"},"seatNumber":{"type":"number","minimum":1,"example":1,"description":"Seat number within the session"}},"required":["salesOrderLineId","seatNumber"]},"CheckoutSessionDto":{"type":"object","properties":{"payments":{"type":"array","items":{"$ref":"#/components/schemas/CheckoutPaymentDto"}},"tipAmount":{"type":"number","example":5,"description":"Total tip amount"},"serviceCharge":{"type":"number","example":2.5,"description":"Service charge"},"discountReasonId":{"type":"string","format":"uuid","example":"uuid","description":"Discount reason if discount applied"},"totalDiscount":{"type":"number","example":0,"description":"Order-level discount amount"}},"required":["payments"]},"KdsStationEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"locationId":{"type":"string","nullable":true,"example":"uuid"},"name":{"type":"string","example":"Hot line"},"displayColor":{"type":"string","nullable":true,"example":"#FF5733"},"routingRules":{"type":"object","description":"Routing rules: { categoryIds: string[] }","example":{"categoryIds":["uuid-1","uuid-2"]}},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.248Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.248Z"}},"required":["id","tenantId","name","routingRules","createdAt","updatedAt"]},"KdsRoutingRulesDto":{"type":"object","properties":{"categoryIds":{"example":["uuid-cat-1","uuid-cat-2"],"description":"Category IDs that route to this station","type":"array","items":{"type":"string","format":"uuid"}}}},"CreateKdsStationDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Hot line"},"displayColor":{"type":"string","example":"#FF5733"},"routingRules":{"$ref":"#/components/schemas/KdsRoutingRulesDto"}},"required":["tenantId","name"]},"UpdateKdsStationDto":{"type":"object","properties":{"locationId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Hot line"},"displayColor":{"type":"string","example":"#FF5733"},"routingRules":{"$ref":"#/components/schemas/KdsRoutingRulesDto"}}},"FireTicketsDto":{"type":"object","properties":{"sessionId":{"type":"string","format":"uuid","example":"uuid","description":"Table session to fire (dine-in flow). Either sessionId or salesOrderId is required."},"salesOrderId":{"type":"string","format":"uuid","example":"uuid","description":"Sales order to fire (counter/QSR flow). Either sessionId or salesOrderId is required."}}},"KdsTicketEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"sessionId":{"type":"string","nullable":true,"example":"uuid","description":"Set for dine-in tickets"},"salesOrderId":{"type":"string","nullable":true,"example":"uuid","description":"Set for counter/QSR tickets (no table session)"},"stationId":{"type":"string","example":"uuid"},"ticketNumber":{"type":"string","example":"KDS-20260506-0001"},"courseType":{"type":"string","nullable":true,"example":"MAIN"},"firedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.258Z"},"startedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"bumpedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"status":{"type":"string","nullable":true,"enum":["PENDING","PREPARING","READY","EXPEDITED"],"example":"PENDING"},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.258Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.258Z"}},"required":["id","tenantId","stationId","ticketNumber","firedAt","createdAt","updatedAt"]},"KdsTicketLineEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"ticketId":{"type":"string","example":"uuid"},"salesOrderLineId":{"type":"string","example":"uuid"},"productName":{"type":"string","example":"Cheeseburger"},"quantity":{"type":"string","example":"1.0000"},"seatNumber":{"type":"number","nullable":true,"example":1},"kitchenModifiers":{"type":"string","nullable":true,"example":"No onions"},"status":{"type":"string","nullable":true,"enum":["PENDING","PREPARING","READY"],"example":"PENDING"},"bumpedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.259Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.259Z"}},"required":["id","ticketId","salesOrderLineId","productName","quantity","createdAt","updatedAt"]},"ReservationEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"locationId":{"type":"string","example":"uuid"},"customerId":{"type":"string","nullable":true,"example":"uuid"},"guestName":{"type":"string","example":"Jane Doe"},"guestPhone":{"type":"string","nullable":true,"example":"+1-555-0100"},"guestEmail":{"type":"string","nullable":true,"example":"jane@example.com"},"partySize":{"type":"number","example":4},"reservedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.270Z"},"estimatedDurationMins":{"type":"number","example":90},"preferredZoneId":{"type":"string","nullable":true,"example":"uuid"},"assignedTableId":{"type":"string","nullable":true,"example":"uuid"},"tableSessionId":{"type":"string","nullable":true,"example":"uuid"},"specialRequests":{"type":"string","nullable":true,"example":"High chair needed"},"notes":{"type":"string","nullable":true,"example":null},"status":{"type":"string","nullable":true,"enum":["PENDING","CONFIRMED","SEATED","NO_SHOW","CANCELED","COMPLETED"],"example":"PENDING"},"seatedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"canceledAt":{"format":"date-time","type":"string","nullable":true,"example":null},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.270Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.270Z"}},"required":["id","tenantId","locationId","guestName","partySize","reservedAt","estimatedDurationMins","createdAt","updatedAt"]},"CreateReservationDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"customerId":{"type":"string","format":"uuid","example":"uuid"},"guestName":{"type":"string","example":"Jane Doe"},"guestPhone":{"type":"string","example":"+1-555-0100"},"guestEmail":{"type":"string","format":"email","example":"jane@example.com"},"partySize":{"type":"number","minimum":1,"example":4},"reservedAt":{"type":"string","example":"2026-05-10T19:00:00Z"},"estimatedDurationMins":{"type":"number","minimum":15,"example":90,"description":"Default 90 minutes"},"preferredZoneId":{"type":"string","format":"uuid","example":"uuid"},"assignedTableId":{"type":"string","format":"uuid","example":"uuid"},"specialRequests":{"type":"string","example":"High chair, window seat"},"notes":{"type":"string","example":"Birthday celebration"}},"required":["tenantId","locationId","guestName","partySize","reservedAt"]},"UpdateReservationDto":{"type":"object","properties":{"locationId":{"type":"string","format":"uuid","example":"uuid"},"customerId":{"type":"string","format":"uuid","example":"uuid"},"guestName":{"type":"string","example":"Jane Doe"},"guestPhone":{"type":"string","example":"+1-555-0100"},"guestEmail":{"type":"string","format":"email","example":"jane@example.com"},"partySize":{"type":"number","minimum":1,"example":4},"reservedAt":{"type":"string","example":"2026-05-10T19:00:00Z"},"estimatedDurationMins":{"type":"number","minimum":15,"example":90,"description":"Default 90 minutes"},"preferredZoneId":{"type":"string","format":"uuid","example":"uuid"},"assignedTableId":{"type":"string","format":"uuid","example":"uuid"},"specialRequests":{"type":"string","example":"High chair, window seat"},"notes":{"type":"string","example":"Birthday celebration"}}},"SeatReservationDto":{"type":"object","properties":{"tableId":{"type":"string","format":"uuid","example":"uuid","description":"Table to seat the party at"},"waiterId":{"type":"string","format":"uuid","example":"uuid"},"guestCount":{"type":"number","minimum":1,"example":4,"description":"Override partySize on session (defaults to reservation party size)"},"posRegisterId":{"type":"string","format":"uuid","example":"uuid"},"openedByPosSessionId":{"type":"string","format":"uuid","example":"uuid"}},"required":["tableId"]},"WaitlistEntryEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"locationId":{"type":"string","example":"uuid"},"customerId":{"type":"string","nullable":true,"example":"uuid"},"guestName":{"type":"string","example":"John Smith"},"guestPhone":{"type":"string","nullable":true,"example":"+1-555-0100"},"partySize":{"type":"number","example":2},"joinedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.282Z"},"estimatedWaitMins":{"type":"number","nullable":true,"example":25},"preferredZoneId":{"type":"string","nullable":true,"example":"uuid"},"assignedTableId":{"type":"string","nullable":true,"example":"uuid"},"tableSessionId":{"type":"string","nullable":true,"example":"uuid"},"notifiedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"seatedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"canceledAt":{"format":"date-time","type":"string","nullable":true,"example":null},"notes":{"type":"string","nullable":true,"example":null},"status":{"type":"string","nullable":true,"enum":["WAITING","NOTIFIED","SEATED","CANCELED","NO_SHOW"],"example":"WAITING"},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.282Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.282Z"}},"required":["id","tenantId","locationId","guestName","partySize","joinedAt","createdAt","updatedAt"]},"CreateWaitlistEntryDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"customerId":{"type":"string","format":"uuid","example":"uuid"},"guestName":{"type":"string","example":"John Smith"},"guestPhone":{"type":"string","example":"+1-555-0100"},"partySize":{"type":"number","minimum":1,"example":2},"estimatedWaitMins":{"type":"number","minimum":0,"example":25},"preferredZoneId":{"type":"string","format":"uuid","example":"uuid"},"notes":{"type":"string","example":"Window seat preferred"}},"required":["tenantId","locationId","guestName","partySize"]},"UpdateWaitlistEntryDto":{"type":"object","properties":{"locationId":{"type":"string","format":"uuid","example":"uuid"},"customerId":{"type":"string","format":"uuid","example":"uuid"},"guestName":{"type":"string","example":"John Smith"},"guestPhone":{"type":"string","example":"+1-555-0100"},"partySize":{"type":"number","minimum":1,"example":2},"estimatedWaitMins":{"type":"number","minimum":0,"example":25},"preferredZoneId":{"type":"string","format":"uuid","example":"uuid"},"notes":{"type":"string","example":"Window seat preferred"}}},"SeatWaitlistDto":{"type":"object","properties":{"tableId":{"type":"string","format":"uuid","example":"uuid"},"waiterId":{"type":"string","format":"uuid","example":"uuid"},"guestCount":{"type":"number","minimum":1,"example":2},"posRegisterId":{"type":"string","format":"uuid","example":"uuid"},"openedByPosSessionId":{"type":"string","format":"uuid","example":"uuid"}},"required":["tableId"]},"TipPoolEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"tenantId":{"type":"string","example":"uuid"},"locationId":{"type":"string","example":"uuid"},"name":{"type":"string","example":"Friday Dinner Pool"},"periodStart":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.293Z"},"periodEnd":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.293Z"},"distributionMethod":{"type":"string","enum":["EQUAL","BY_HOURS","MANUAL"],"example":"BY_HOURS"},"totalTips":{"type":"string","example":"500.0000"},"totalServiceCharge":{"type":"string","example":"120.0000"},"includeServiceCharge":{"type":"boolean","example":false},"serviceChargeShareBps":{"type":"number","example":0},"totalDistributable":{"type":"string","example":"500.0000"},"status":{"type":"string","nullable":true,"enum":["OPEN","SETTLED"],"example":"OPEN"},"settledAt":{"format":"date-time","type":"string","nullable":true,"example":null},"settledBy":{"type":"string","nullable":true,"example":"uuid"},"notes":{"type":"string","nullable":true,"example":null},"deletedAt":{"format":"date-time","type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.293Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.293Z"}},"required":["id","tenantId","locationId","name","periodStart","periodEnd","distributionMethod","totalTips","totalServiceCharge","includeServiceCharge","serviceChargeShareBps","totalDistributable","createdAt","updatedAt"]},"CreateTipPoolDto":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid","example":"uuid"},"locationId":{"type":"string","format":"uuid","example":"uuid"},"name":{"type":"string","example":"Friday Dinner Pool"},"periodStart":{"type":"string","example":"2026-05-06T17:00:00Z"},"periodEnd":{"type":"string","example":"2026-05-06T23:00:00Z"},"distributionMethod":{"type":"string","enum":["EQUAL","BY_HOURS","MANUAL"],"example":"BY_HOURS"},"includeServiceCharge":{"type":"boolean","example":false},"serviceChargeShareBps":{"type":"number","minimum":0,"maximum":10000,"example":5000,"description":"Basis points (5000 = 50%) of service charge that feeds the pool"},"notes":{"type":"string","example":"Closing manager: Alice"}},"required":["tenantId","locationId","name","periodStart","periodEnd","distributionMethod"]},"UpdateTipPoolDto":{"type":"object","properties":{"name":{"type":"string","example":"Friday Dinner Pool"},"periodStart":{"type":"string","example":"2026-05-06T17:00:00Z"},"periodEnd":{"type":"string","example":"2026-05-06T23:00:00Z"},"distributionMethod":{"type":"string","enum":["EQUAL","BY_HOURS","MANUAL"],"example":"BY_HOURS"},"includeServiceCharge":{"type":"boolean","example":false},"serviceChargeShareBps":{"type":"number","minimum":0,"maximum":10000,"example":5000,"description":"Basis points (5000 = 50%) of service charge that feeds the pool"},"notes":{"type":"string","example":"Closing manager: Alice"}}},"TipPoolAllocationEntity":{"type":"object","properties":{"id":{"type":"string","example":"uuid"},"poolId":{"type":"string","example":"uuid"},"userId":{"type":"string","example":"uuid"},"role":{"type":"string","nullable":true,"example":"SERVER"},"hoursWorked":{"type":"string","nullable":true,"example":"8.00"},"weight":{"type":"string","example":"1.0000"},"amount":{"type":"string","example":"125.0000"},"notes":{"type":"string","nullable":true,"example":null},"createdAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.294Z"},"updatedAt":{"format":"date-time","type":"string","example":"2026-05-14T05:50:29.294Z"}},"required":["id","poolId","userId","weight","amount","createdAt","updatedAt"]},"CreateAllocationDto":{"type":"object","properties":{"userId":{"type":"string","format":"uuid","example":"uuid"},"role":{"type":"string","example":"SERVER"},"hoursWorked":{"type":"number","minimum":0,"example":8},"weight":{"type":"number","minimum":0,"example":1},"amount":{"type":"number","minimum":0,"example":0,"description":"Manual amount (used when distributionMethod = MANUAL)"},"notes":{"type":"string","example":null}},"required":["userId"]},"UpdateAllocationDto":{"type":"object","properties":{"role":{"type":"string","example":"SERVER"},"hoursWorked":{"type":"number","minimum":0,"example":8},"weight":{"type":"number","minimum":0,"example":1},"amount":{"type":"number","minimum":0,"example":0},"notes":{"type":"string","example":null}}}}}}