{"openapi":"3.0.0","paths":{"/":{"get":{"operationId":"AppController_getWelcome","parameters":[],"responses":{"200":{"description":"Returns welcome message or HTML page"}},"summary":"API Welcome Message","tags":["Root"]}},"/storage/providers":{"get":{"operationId":"CloudProvidersController_list","parameters":[{"name":"active","required":true,"in":"query","schema":{"type":"boolean"}},{"name":"churchId","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"List cloud storage providers","tags":["Storage - Cloud Providers"]},"post":{"operationId":"CloudProvidersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCloudProviderDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Create cloud provider","tags":["Storage - Cloud Providers"]}},"/storage/providers/{id}":{"get":{"operationId":"CloudProvidersController_getOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get cloud provider details","tags":["Storage - Cloud Providers"]},"patch":{"operationId":"CloudProvidersController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCloudProviderDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Update cloud provider","tags":["Storage - Cloud Providers"]},"delete":{"operationId":"CloudProvidersController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Delete cloud provider","tags":["Storage - Cloud Providers"]}},"/storage/providers/{id}/credentials":{"put":{"operationId":"CloudProvidersController_updateCredentials","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCredentialsDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Update provider credentials","tags":["Storage - Cloud Providers"]}},"/storage/providers/{id}/test":{"post":{"operationId":"CloudProvidersController_testConnection","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Test cloud provider connection","tags":["Storage - Cloud Providers"]}},"/storage/providers/{id}/health":{"get":{"operationId":"CloudProvidersController_health","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get provider health status","tags":["Storage - Cloud Providers"]}},"/storage/providers/{id}/enable":{"post":{"operationId":"CloudProvidersController_enable","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Enable cloud provider","tags":["Storage - Cloud Providers"]}},"/storage/providers/{id}/disable":{"post":{"operationId":"CloudProvidersController_disable","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Disable cloud provider","tags":["Storage - Cloud Providers"]}},"/storage/types":{"get":{"operationId":"StorageTypesController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"List storage types","tags":["Storage - Types & Categories"]},"post":{"operationId":"StorageTypesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStorageTypeDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Create storage type","tags":["Storage - Types & Categories"]}},"/storage/types/{id}":{"get":{"operationId":"StorageTypesController_getOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get storage type details","tags":["Storage - Types & Categories"]},"put":{"operationId":"StorageTypesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStorageTypeDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Update storage type","tags":["Storage - Types & Categories"]},"delete":{"operationId":"StorageTypesController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Delete storage type","tags":["Storage - Types & Categories"]}},"/storage/categories":{"get":{"operationId":"StorageCategoriesController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"List storage categories","tags":["Storage - Types & Categories"]},"post":{"operationId":"StorageCategoriesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStorageCategoryDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Create storage category","tags":["Storage - Types & Categories"]}},"/storage/categories/{id}":{"get":{"operationId":"StorageCategoriesController_getOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get storage category details","tags":["Storage - Types & Categories"]},"put":{"operationId":"StorageCategoriesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStorageCategoryDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Update storage category","tags":["Storage - Types & Categories"]},"delete":{"operationId":"StorageCategoriesController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Delete storage category","tags":["Storage - Types & Categories"]}},"/storage/redundancy":{"get":{"operationId":"StorageRedundancyController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"List redundancy configurations","tags":["Storage - Redundancy"]},"post":{"operationId":"StorageRedundancyController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRedundancyConfigDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Create redundancy configuration","tags":["Storage - Redundancy"]}},"/storage/redundancy/type/{typeId}":{"get":{"operationId":"StorageRedundancyController_getByType","parameters":[{"name":"typeId","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get redundancy config for storage type","tags":["Storage - Redundancy"]}},"/storage/redundancy/{id}":{"put":{"operationId":"StorageRedundancyController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRedundancyConfigDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Update redundancy configuration","tags":["Storage - Redundancy"]},"delete":{"operationId":"StorageRedundancyController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Delete redundancy configuration","tags":["Storage - Redundancy"]}},"/storage/redundancy/{id}/enable":{"post":{"operationId":"StorageRedundancyController_enable","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Enable redundancy for storage type","tags":["Storage - Redundancy"]}},"/storage/redundancy/{id}/disable":{"post":{"operationId":"StorageRedundancyController_disable","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Disable redundancy for storage type","tags":["Storage - Redundancy"]}},"/storage/files/upload":{"post":{"operationId":"StorageFilesController_upload","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file","typeId","relatedEntityType","relatedEntityId"],"properties":{"file":{"type":"string","format":"binary"},"typeId":{"type":"integer","description":"Storage type ID"},"relatedEntityType":{"type":"string","description":"Entity type (activity, member, etc.)"},"relatedEntityId":{"type":"integer","description":"Entity ID"},"description":{"type":"string"},"visibility":{"type":"string","enum":["public","private","internal","restricted"]},"metadata":{"type":"object"}}}}}},"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Upload a file","tags":["Storage - Files"]}},"/storage/files":{"get":{"operationId":"StorageFilesController_list","parameters":[{"name":"page","required":false,"in":"query","description":"Página","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Límite por página","schema":{"default":20,"type":"number"}},{"name":"typeId","required":false,"in":"query","description":"Filtrar por tipo de almacenamiento","schema":{"type":"number"}},{"name":"categoryCode","required":false,"in":"query","description":"Filtrar por código de categoría","schema":{"example":"documents","type":"string"}},{"name":"relatedEntityType","required":false,"in":"query","description":"Filtrar por tipo de entidad relacionada","schema":{"type":"string"}},{"name":"relatedEntityId","required":false,"in":"query","description":"Filtrar por ID de entidad relacionada","schema":{"type":"number"}},{"name":"mimeType","required":false,"in":"query","description":"Filtrar por MIME type","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","description":"Búsqueda por nombre de archivo","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Ordenar por campo","schema":{"default":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Orden","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"refresh","required":false,"in":"query","description":"Forzar re-verificación desde el proveedor","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"List files with filters","tags":["Storage - Files"]}},"/storage/files/deleted":{"get":{"operationId":"StorageFilesController_listDeleted","parameters":[{"name":"page","required":false,"in":"query","description":"Página","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Límite por página","schema":{"default":20,"type":"number"}},{"name":"typeId","required":false,"in":"query","description":"Filtrar por tipo de almacenamiento","schema":{"type":"number"}},{"name":"categoryCode","required":false,"in":"query","description":"Filtrar por código de categoría","schema":{"example":"documents","type":"string"}},{"name":"relatedEntityType","required":false,"in":"query","description":"Filtrar por tipo de entidad relacionada","schema":{"type":"string"}},{"name":"relatedEntityId","required":false,"in":"query","description":"Filtrar por ID de entidad relacionada","schema":{"type":"number"}},{"name":"mimeType","required":false,"in":"query","description":"Filtrar por MIME type","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","description":"Búsqueda por nombre de archivo","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Ordenar por campo","schema":{"default":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Orden","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"refresh","required":false,"in":"query","description":"Forzar re-verificación desde el proveedor","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"List deleted files","tags":["Storage - Files"]}},"/storage/files/broken":{"get":{"operationId":"StorageFilesController_listBroken","parameters":[{"name":"page","required":false,"in":"query","description":"Página","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Límite por página","schema":{"default":20,"type":"number"}},{"name":"typeId","required":false,"in":"query","description":"Filtrar por tipo de almacenamiento","schema":{"type":"number"}},{"name":"categoryCode","required":false,"in":"query","description":"Filtrar por código de categoría","schema":{"example":"documents","type":"string"}},{"name":"relatedEntityType","required":false,"in":"query","description":"Filtrar por tipo de entidad relacionada","schema":{"type":"string"}},{"name":"relatedEntityId","required":false,"in":"query","description":"Filtrar por ID de entidad relacionada","schema":{"type":"number"}},{"name":"mimeType","required":false,"in":"query","description":"Filtrar por MIME type","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","description":"Búsqueda por nombre de archivo","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Ordenar por campo","schema":{"default":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Orden","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"refresh","required":false,"in":"query","description":"Forzar re-verificación desde el proveedor","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"List broken storage records","tags":["Storage - Files"]}},"/storage/files/integrity/audits":{"get":{"operationId":"StorageFilesController_getIntegrityAuditHistory","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get visible storage integrity audit history","tags":["Storage - Files"]}},"/storage/files/{id}/integrity":{"get":{"operationId":"StorageFilesController_getIntegrity","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Check database/storage integrity for a file","tags":["Storage - Files"]}},"/storage/files/{id}":{"get":{"operationId":"StorageFilesController_getOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get file metadata","tags":["Storage - Files"]},"patch":{"operationId":"StorageFilesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFileDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Update file metadata","tags":["Storage - Files"]},"delete":{"operationId":"StorageFilesController_softDelete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Soft delete file","tags":["Storage - Files"]}},"/storage/files/{id}/file":{"get":{"operationId":"StorageFilesController_getFile","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"File content"}},"security":[{"JWT":[]}],"summary":"Download file content","tags":["Storage - Files"]}},"/storage/files/{id}/download":{"get":{"operationId":"StorageFilesController_download","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Download file as attachment","tags":["Storage - Files"]}},"/storage/files/{id}/url":{"get":{"operationId":"StorageFilesController_getUrl","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get file URL","tags":["Storage - Files"]}},"/storage/files/{id}/hard":{"delete":{"operationId":"StorageFilesController_hardDelete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Permanently delete file","tags":["Storage - Files"]}},"/storage/files/{id}/restore":{"post":{"operationId":"StorageFilesController_restore","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Restore deleted file","tags":["Storage - Files"]}},"/storage/files/{id}/reupload":{"post":{"operationId":"StorageFilesController_reupload","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Re-upload missing physical file for an existing storage record","tags":["Storage - Files"]}},"/storage/seed/initialize":{"post":{"operationId":"StorageSeedController_initialize","parameters":[],"responses":{"201":{"description":""}},"tags":["StorageSeed"]}},"/security/statistics":{"get":{"operationId":"SecurityController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistics retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get security module statistics","tags":["Security"]}},"/security/users":{"get":{"operationId":"SecurityUsersController_getUsers","parameters":[{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search term (name, email, username)","schema":{"type":"string"}},{"name":"searchTerm","required":false,"in":"query","description":"Alias for search (frontend compatibility)","schema":{"type":"string"}},{"name":"searchBy","required":false,"in":"query","description":"Field to search by (name, email, username, uid, id)","schema":{"type":"string"}},{"name":"uid","required":false,"in":"query","description":"Filter by exact UID","schema":{"type":"string"}},{"name":"id","required":false,"in":"query","description":"Filter by exact ID","schema":{"type":"number"}},{"name":"profileCode","required":false,"in":"query","description":"Filter by profile code","schema":{"type":"number"}},{"name":"church","required":false,"in":"query","description":"Filter by church","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filter by active status","schema":{"type":"boolean"}},{"name":"blocked","required":false,"in":"query","description":"Filter by blocked status","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Users retrieved successfully"},"403":{"description":"Forbidden"}},"security":[{"JWT":[]}],"summary":"Get users with pagination and search","tags":["Security Users"]},"post":{"operationId":"SecurityUsersController_createUser","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserDto"}}}},"responses":{"201":{"description":"User created successfully"},"400":{"description":"Bad Request"},"409":{"description":"Conflict - Username or email already exists"}},"security":[{"JWT":[]}],"summary":"Create new user","tags":["Security Users"]}},"/security/users/{uid}":{"get":{"operationId":"SecurityUsersController_getUserByUid","parameters":[{"name":"uid","required":true,"in":"path","description":"User UID","schema":{"type":"string"}}],"responses":{"200":{"description":"User found"},"404":{"description":"User not found"}},"security":[{"JWT":[]}],"summary":"Get user by UID","tags":["Security Users"]},"put":{"operationId":"SecurityUsersController_updateUser","parameters":[{"name":"uid","required":true,"in":"path","description":"User UID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserDto"}}}},"responses":{"200":{"description":"User updated successfully"},"403":{"description":"Forbidden"},"404":{"description":"User not found"}},"security":[{"JWT":[]}],"summary":"Update user","tags":["Security Users"]},"delete":{"operationId":"SecurityUsersController_deleteUser","parameters":[{"name":"uid","required":true,"in":"path","description":"User UID","schema":{"type":"string"}}],"responses":{"200":{"description":"User deleted successfully"},"403":{"description":"Cannot delete own account"},"404":{"description":"User not found"}},"security":[{"JWT":[]}],"summary":"Delete user","tags":["Security Users"]}},"/security/users/{uid}/status":{"patch":{"operationId":"SecurityUsersController_changeUserStatus","parameters":[{"name":"uid","required":true,"in":"path","description":"User UID","schema":{"type":"string"}}],"responses":{"200":{"description":"User status changed successfully"},"403":{"description":"Cannot change own status"},"404":{"description":"User not found"}},"security":[{"JWT":[]}],"summary":"Change user status (activate/deactivate)","tags":["Security Users"]}},"/security/users/{uid}/block":{"patch":{"operationId":"SecurityUsersController_blockUser","parameters":[{"name":"uid","required":true,"in":"path","description":"User UID","schema":{"type":"string"}}],"responses":{"200":{"description":"User blocked successfully"}},"security":[{"JWT":[]}],"summary":"Block user","tags":["Security Users"]}},"/security/users/{uid}/unblock":{"patch":{"operationId":"SecurityUsersController_unblockUser","parameters":[{"name":"uid","required":true,"in":"path","description":"User UID","schema":{"type":"string"}}],"responses":{"200":{"description":"User unblocked successfully"}},"security":[{"JWT":[]}],"summary":"Unblock user","tags":["Security Users"]}},"/security/users/check/exists":{"get":{"operationId":"SecurityUsersController_checkUserExists","parameters":[{"name":"field","required":true,"in":"query","description":"Field to check","schema":{"enum":["username","email","uid"],"type":"string"}},{"name":"value","required":true,"in":"query","description":"Value to check","schema":{"type":"string"}}],"responses":{"200":{"description":"Check completed"}},"security":[{"JWT":[]}],"summary":"Check if user exists by field","tags":["Security Users"]}},"/security/profiles":{"get":{"operationId":"ProfilesController_getProfiles","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get all profiles","tags":["Security Profiles"]},"post":{"operationId":"ProfilesController_createProfile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProfileDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Create new profile","tags":["Security Profiles"]}},"/security/profiles/{code}":{"get":{"operationId":"ProfilesController_getProfileByCode","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get profile by code","tags":["Security Profiles"]},"put":{"operationId":"ProfilesController_updateProfile","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Update profile","tags":["Security Profiles"]},"delete":{"operationId":"ProfilesController_deleteProfile","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Delete profile","tags":["Security Profiles"]}},"/security/profiles/{code}/permissions":{"get":{"operationId":"ProfilesController_getPermissionsByProfile","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"number"}},{"name":"onlyAssigned","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get permissions by profile","tags":["Security Profiles"]},"post":{"operationId":"ProfilesController_setProfilePermissions","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Set permissions for profile","tags":["Security Profiles"]}},"/security/profiles/{code}/status":{"patch":{"operationId":"ProfilesController_changeProfileStatus","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Change profile status","tags":["Security Profiles"]}},"/security/permissions":{"get":{"operationId":"PermissionsController_getPermissions","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page (default: 12)","schema":{"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search term to filter by code or description","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get all permissions with optional search","tags":["Security Permissions"]},"post":{"operationId":"PermissionsController_createPermissions","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}},"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"summary":"Create new permissions","tags":["Security Permissions"]}},"/security/permissions/{id}":{"get":{"operationId":"PermissionsController_getPermissionById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Get permission by ID","tags":["Security Permissions"]},"put":{"operationId":"PermissionsController_updatePermission","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Update permission","tags":["Security Permissions"]},"delete":{"operationId":"PermissionsController_deletePermission","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"summary":"Delete permission","tags":["Security Permissions"]}},"/activities":{"post":{"operationId":"ActivitiesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateActivityDto"}}}},"responses":{"201":{"description":"Activity created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityResponseDto"}}}},"400":{"description":"Bad request - validation errors"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden - insufficient permissions"}},"security":[{"bearer":[]}],"summary":"Create a new activity","tags":["Activities"]},"get":{"operationId":"ActivitiesController_findAll","parameters":[{"name":"search","required":false,"in":"query","description":"Search by activity name or description","schema":{"type":"string"}},{"name":"location","required":false,"in":"query","description":"Filter by location","schema":{"type":"string"}},{"name":"activityType","required":false,"in":"query","description":"Filter by activity type","schema":{"type":"string","enum":["1","2","3","4","5","6","7"]}},{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"example":"1","type":"string"}},{"name":"startDateFrom","required":false,"in":"query","description":"Fecha de inicio desde","schema":{"example":"2025-12-01","type":"string"}},{"name":"startDateTo","required":false,"in":"query","description":"Fecha de inicio hasta","schema":{"example":"2025-12-31","type":"string"}},{"name":"organizingMinistryId","required":false,"in":"query","description":"Filtrar por ministerio organizador","schema":{"type":"number"}},{"name":"responsibleUserId","required":false,"in":"query","description":"Filtrar por responsable","schema":{"type":"number"}},{"name":"hasAvailableQuota","required":false,"in":"query","description":"Filter by availability","schema":{"type":"boolean"}},{"name":"isActive","required":false,"in":"query","description":"Filter by active status","schema":{"type":"boolean"}},{"name":"category","required":false,"in":"query","description":"Filtrar por categoría","schema":{"type":"string"}},{"name":"tag","required":false,"in":"query","description":"Filtrar por tag","schema":{"type":"string"}},{"name":"minCost","required":false,"in":"query","description":"Costo mínimo","schema":{"type":"number"}},{"name":"maxCost","required":false,"in":"query","description":"Costo máximo","schema":{"type":"number"}},{"name":"currency","required":false,"in":"query","description":"Filter by currency","schema":{"enum":["DOP","USD","EUR"],"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"minimum":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"minimum":1,"maximum":100,"example":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Campo por el cual ordenar","schema":{"example":"startDate","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Dirección del ordenamiento","schema":{"example":"ASC","type":"string","enum":["ASC","DESC"]}},{"name":"select","required":false,"in":"query","description":"Columnas específicas a retornar (separadas por coma)","schema":{"example":"id,activityName,cost,currency,startDate","type":"string"}}],"responses":{"200":{"description":"Activities retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedActivitiesResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get all activities with filtering and pagination","tags":["Activities"]}},"/activities/reports":{"get":{"operationId":"ActivitiesController_getActivitiesReport","parameters":[{"name":"search","required":false,"in":"query","description":"Buscar por nombre de actividad","schema":{"type":"string"}},{"name":"location","required":false,"in":"query","description":"Filtrar por localidad","schema":{"type":"string"}},{"name":"activityType","required":false,"in":"query","description":"Filtrar por tipo","schema":{"type":"string","enum":["1","2","3","4","5","6","7"]}},{"name":"status","required":false,"in":"query","description":"Filtrar por estado: '0'=Cerrada, '1'=Abierta","schema":{"example":"1","type":"string"}},{"name":"startDateFrom","required":false,"in":"query","description":"Fecha de inicio desde","schema":{"example":"2025-12-01","type":"string"}},{"name":"startDateTo","required":false,"in":"query","description":"Fecha de inicio hasta","schema":{"example":"2025-12-31","type":"string"}},{"name":"organizingMinistryId","required":false,"in":"query","description":"Filtrar por ministerio organizador","schema":{"type":"number"}},{"name":"responsibleUserId","required":false,"in":"query","description":"Filtrar por responsable","schema":{"type":"number"}},{"name":"hasAvailableQuota","required":false,"in":"query","description":"Solo actividades con cupos disponibles","schema":{"type":"boolean"}},{"name":"isActive","required":false,"in":"query","description":"Solo actividades activas","schema":{"type":"boolean"}},{"name":"category","required":false,"in":"query","description":"Filtrar por categoría","schema":{"type":"string"}},{"name":"tag","required":false,"in":"query","description":"Filtrar por tag","schema":{"type":"string"}},{"name":"minCost","required":false,"in":"query","description":"Costo mínimo","schema":{"type":"number"}},{"name":"maxCost","required":false,"in":"query","description":"Costo máximo","schema":{"type":"number"}},{"name":"currency","required":false,"in":"query","description":"Moneda","schema":{"type":"string","enum":["USD","DOP","EUR"]}},{"name":"page","required":false,"in":"query","description":"Número de página para paginación","schema":{"minimum":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Cantidad de registros por página","schema":{"minimum":1,"maximum":100,"example":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Campo por el cual ordenar","schema":{"example":"startDate","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Dirección del ordenamiento","schema":{"example":"ASC","type":"string","enum":["ASC","DESC"]}},{"name":"select","required":false,"in":"query","description":"Columnas específicas a retornar (separadas por coma)","schema":{"example":"id,activityName,cost,currency,startDate","type":"string"}}],"responses":{"200":{"description":"Activities report generated successfully"}},"security":[{"bearer":[]}],"summary":"Get activities report","tags":["Activities"]}},"/activities/{id}/report/pdf":{"get":{"description":"Generates or retrieves a cached PDF report for the activity. Use regenerate=true to force regeneration.","operationId":"ActivitiesController_getActivityReportPDF","parameters":[{"name":"id","required":true,"in":"path","description":"Activity ID","schema":{"type":"number"}},{"name":"regenerate","required":false,"in":"query","description":"Force regeneration of the PDF report even if cached version exists","schema":{"type":"boolean"}},{"name":"includeParticipants","required":false,"in":"query","description":"Include participants list in the report (default: true)","schema":{"type":"boolean"}},{"name":"includeFinancials","required":false,"in":"query","description":"Include financial summary in the report (default: true)","schema":{"type":"boolean"}},{"name":"download","required":false,"in":"query","description":"Force download instead of inline display (default: false)","schema":{"type":"boolean"}}],"responses":{"200":{"description":"PDF report generated/retrieved successfully","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"Activity not found"}},"security":[{"bearer":[]}],"summary":"Get activity report as PDF","tags":["Activities"]}},"/activities/{id}/report/participants/xlsx":{"get":{"description":"Generates an administrative XLSX export with only the participants for the activity.","operationId":"ActivitiesController_getActivityParticipantsXLSX","parameters":[{"name":"id","required":true,"in":"path","description":"Activity ID","schema":{"type":"number"}},{"name":"regenerate","required":false,"in":"query","description":"Force regeneration of the XLSX export even if cached version exists","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Participants XLSX generated successfully","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"Activity not found"}},"security":[{"bearer":[]}],"summary":"Export activity participants as XLSX","tags":["Activities"]}},"/activities/{id}":{"get":{"operationId":"ActivitiesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"Activity ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Activity retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityResponseDto"}}}},"404":{"description":"Activity not found"}},"security":[{"bearer":[]}],"summary":"Get activity by ID","tags":["Activities"]},"put":{"operationId":"ActivitiesController_update","parameters":[{"name":"id","required":true,"in":"path","description":"Activity ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateActivityDto"}}}},"responses":{"200":{"description":"Activity updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityResponseDto"}}}},"400":{"description":"Bad request - validation errors"},"404":{"description":"Activity not found"}},"security":[{"bearer":[]}],"summary":"Update activity","tags":["Activities"]},"delete":{"operationId":"ActivitiesController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"Activity ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Activity deleted successfully"},"400":{"description":"Cannot delete activity with participants"},"404":{"description":"Activity not found"}},"security":[{"bearer":[]}],"summary":"Delete/Cancel activity","tags":["Activities"]}},"/activities/{id}/summary":{"get":{"operationId":"ActivitiesController_getActivitySummary","parameters":[{"name":"id","required":true,"in":"path","description":"Activity ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Activity summary retrieved successfully"},"404":{"description":"Activity not found"}},"security":[{"bearer":[]}],"summary":"Get activity summary with statistics","tags":["Activities"]}},"/activities/{id}/availability":{"get":{"operationId":"ActivitiesController_checkAvailability","parameters":[{"name":"id","required":true,"in":"path","description":"Activity ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Activity availability information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityAvailabilityDto"}}}},"404":{"description":"Activity not found"}},"security":[{"bearer":[]}],"summary":"Check activity availability and quota information","tags":["Activities"]}},"/activities/{id}/reserve-spot":{"post":{"operationId":"ActivitiesController_reserveSpot","parameters":[{"name":"id","required":true,"in":"path","description":"Activity ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Spot reserved successfully"},"400":{"description":"Cannot reserve spot - activity full or closed"},"404":{"description":"Activity not found"}},"security":[{"bearer":[]}],"summary":"Reserve a spot in the activity for a member","tags":["Activities"]}},"/activities/{id}/release-spot":{"post":{"operationId":"ActivitiesController_releaseSpot","parameters":[{"name":"id","required":true,"in":"path","description":"Activity ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Spot released successfully"},"400":{"description":"Cannot release spot"},"404":{"description":"Activity or participant not found"}},"security":[{"bearer":[]}],"summary":"Release a reserved spot in the activity","tags":["Activities"]}},"/activities/{id}/status":{"put":{"operationId":"ActivitiesController_changeStatus","parameters":[{"name":"id","required":true,"in":"path","description":"Activity ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Activity status changed successfully"},"400":{"description":"Invalid status value"},"404":{"description":"Activity not found"}},"security":[{"bearer":[]}],"summary":"Change activity status","tags":["Activities"]}},"/activities/bulk/status":{"put":{"operationId":"ActivitiesController_bulkUpdateStatus","parameters":[],"responses":{"200":{"description":"Activities status updated successfully"},"400":{"description":"Invalid status value"}},"security":[{"bearer":[]}],"summary":"Bulk update activity status","tags":["Activities"]}},"/activities/bulk":{"delete":{"operationId":"ActivitiesController_bulkDelete","parameters":[],"responses":{"200":{"description":"Activities deleted successfully"},"400":{"description":"Cannot delete one or more activities"}},"security":[{"bearer":[]}],"summary":"Bulk delete activities","tags":["Activities"]}},"/activity-participants/register":{"post":{"operationId":"ParticipantsController_registerParticipant","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateParticipantDto"}}}},"responses":{"201":{"description":"Participant registered successfully"},"400":{"description":"Bad request - validation errors or activity full"},"404":{"description":"Activity or member not found"}},"security":[{"bearer":[]}],"summary":"Register participant for activity","tags":["Activity Participants"]}},"/activity-participants/bulk":{"post":{"operationId":"ParticipantsController_bulkRegisterParticipants","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCreateParticipantDto"}}}},"responses":{"201":{"description":"Participants registered successfully"},"400":{"description":"Bad request - validation errors"}},"security":[{"bearer":[]}],"summary":"Register multiple participants for activity","tags":["Activity Participants"]}},"/activity-participants":{"get":{"operationId":"ParticipantsController_getParticipants","parameters":[{"name":"activityId","required":false,"in":"query","description":"Filtrar por actividad","schema":{"type":"number"}},{"name":"search","required":false,"in":"query","description":"Buscar por nombre","schema":{"type":"string"}},{"name":"participationStatus","required":false,"in":"query","description":"Filtrar por estado de participación","schema":{"type":"string","enum":["REGISTERED","CONFIRMED","WAITING","ATTENDED","ABSENT","CANCELLED","WITHDRAWN"]}},{"name":"paymentStatus","required":false,"in":"query","description":"Filtrar por estado de pago","schema":{"enum":["PENDING","PAID","PARTIAL","EXONERATED","REFUNDED","DUE","NOT_APPLICABLE"],"type":"string"}},{"name":"registrationDateFrom","required":false,"in":"query","description":"Fecha de registro desde","schema":{"type":"string"}},{"name":"registrationDateTo","required":false,"in":"query","description":"Fecha de registro hasta","schema":{"type":"string"}},{"name":"confirmed","required":false,"in":"query","description":"Solo participantes confirmados","schema":{"type":"boolean"}},{"name":"attended","required":false,"in":"query","description":"Solo participantes que asistieron","schema":{"type":"boolean"}},{"name":"paymentCompleted","required":false,"in":"query","description":"Solo pagos completados","schema":{"type":"boolean"}},{"name":"onWaitingList","required":false,"in":"query","description":"Solo participantes en lista de espera","schema":{"type":"boolean"}},{"name":"isActive","required":false,"in":"query","description":"Solo participantes activos","schema":{"type":"boolean"}},{"name":"includeCancelled","required":false,"in":"query","description":"Include cancelled participants (status=0)","schema":{"default":false,"type":"boolean"}},{"name":"includeActivity","required":false,"in":"query","description":"Include activity details (reduces payload ~40% if false, default: false)","schema":{"default":false,"type":"boolean"}},{"name":"select","required":false,"in":"query","description":"Specific fields to return (comma-separated). Ex: id,participantName,participationStatus","schema":{"example":"id,participantName,participationStatus,paymentStatus","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Campo de ordenamiento","schema":{"default":"registrationDate","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Dirección de ordenamiento","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"memberName","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"enum":["REGISTERED","CONFIRMED","WAITING","ATTENDED","ABSENT","CANCELLED","WITHDRAWN"],"type":"string"}}],"responses":{"200":{"description":"Participants retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get all participants with filtering","tags":["Activity Participants"]}},"/activity-participants/stats":{"get":{"operationId":"ParticipantsController_getParticipantStats","parameters":[{"name":"activityId","required":false,"in":"query","description":"Filter by activity ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Statistics retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get participant statistics","tags":["Activity Participants"]}},"/activity-participants/{id}":{"get":{"operationId":"ParticipantsController_getParticipantById","parameters":[{"name":"id","required":true,"in":"path","description":"Participant ID","schema":{"type":"integer"}},{"name":"includePayments","required":false,"in":"query","description":"Include payment details calculated from cajas_pagos_recibidos (default: false)","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Participant details retrieved successfully"},"404":{"description":"Participant not found"}},"security":[{"bearer":[]}],"summary":"Get specific participant details","tags":["Activity Participants"]},"put":{"operationId":"ParticipantsController_updateParticipant","parameters":[{"name":"id","required":true,"in":"path","description":"Participant ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateParticipantDto"}}}},"responses":{"200":{"description":"Participant updated successfully"},"400":{"description":"Bad request - validation errors"},"404":{"description":"Participant not found"}},"security":[{"bearer":[]}],"summary":"Update participant information","tags":["Activity Participants"]},"delete":{"operationId":"ParticipantsController_deleteParticipant","parameters":[{"name":"id","required":true,"in":"path","description":"Participant ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Participant deleted successfully"},"404":{"description":"Participant not found"}},"security":[{"bearer":[]}],"summary":"Delete participant record permanently","tags":["Activity Participants"]}},"/activity-participants/{id}/checkin":{"put":{"operationId":"ParticipantsController_checkInParticipant","parameters":[{"name":"id","required":true,"in":"path","description":"Participant ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckInParticipantDto"}}}},"responses":{"200":{"description":"Participant checked in successfully"},"400":{"description":"Cannot check-in participant"},"404":{"description":"Participant not found"}},"security":[{"bearer":[]}],"summary":"Check-in participant to activity","tags":["Activity Participants"]}},"/activity-participants/{id}/checkout":{"put":{"operationId":"ParticipantsController_checkOutParticipant","parameters":[{"name":"id","required":true,"in":"path","description":"Participant ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckOutParticipantDto"}}}},"responses":{"200":{"description":"Participant checked out successfully"},"400":{"description":"Cannot check-out participant"},"404":{"description":"Participant not found"}},"security":[{"bearer":[]}],"summary":"Check-out participant from activity","tags":["Activity Participants"]}},"/activity-participants/{id}/confirm":{"put":{"operationId":"ParticipantsController_confirmParticipant","parameters":[{"name":"id","required":true,"in":"path","description":"Participant ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Participant confirmed successfully"},"400":{"description":"Cannot confirm participant"},"404":{"description":"Participant not found"}},"security":[{"bearer":[]}],"summary":"Confirm participant registration","tags":["Activity Participants"]}},"/activity-participants/bulk/confirm":{"put":{"operationId":"ParticipantsController_bulkConfirmParticipants","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkConfirmParticipantsDto"}}}},"responses":{"200":{"description":"Participants confirmed successfully"},"400":{"description":"Cannot confirm one or more participants"}},"security":[{"bearer":[]}],"summary":"Confirm multiple participants","tags":["Activity Participants"]}},"/activity-participants/bulk/checkin":{"put":{"operationId":"ParticipantsController_bulkCheckInParticipants","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCheckInParticipantsDto"}}}},"responses":{"200":{"description":"Participants checked in successfully"},"400":{"description":"Cannot check-in one or more participants"}},"security":[{"bearer":[]}],"summary":"Bulk check-in participants","tags":["Activity Participants"]}},"/activity-participants/bulk/checkout":{"put":{"operationId":"ParticipantsController_bulkCheckOutParticipants","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCheckOutParticipantsDto"}}}},"responses":{"200":{"description":"Participants checked out successfully"},"400":{"description":"Cannot check-out one or more participants"}},"security":[{"bearer":[]}],"summary":"Bulk check-out participants","tags":["Activity Participants"]}},"/activity-participants/{id}/waiting-list":{"put":{"operationId":"ParticipantsController_moveToWaitingList","parameters":[{"name":"id","required":true,"in":"path","description":"Participant ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Participant moved to waiting list successfully"},"400":{"description":"Cannot move participant to waiting list"}},"security":[{"bearer":[]}],"summary":"Move participant to waiting list","tags":["Activity Participants"]}},"/activity-participants/waiting-list/promote/{activityId}":{"put":{"operationId":"ParticipantsController_promoteFromWaitingList","parameters":[{"name":"activityId","required":true,"in":"path","description":"Activity ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Participant promoted successfully"},"400":{"description":"No participants to promote"}},"security":[{"bearer":[]}],"summary":"Promote next participant from waiting list","tags":["Activity Participants"]}},"/activity-participants/{id}/cancel":{"post":{"operationId":"ParticipantsController_cancelParticipant","parameters":[{"name":"id","required":true,"in":"path","description":"Participant ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveParticipantDto"}}}},"responses":{"200":{"description":"Participant cancelled successfully"},"400":{"description":"Cannot remove participant"},"404":{"description":"Participant not found"}},"security":[{"bearer":[]}],"summary":"Cancel/Remove participant from activity","tags":["Activity Participants"]}},"/activity-participants/{id}/restore":{"post":{"operationId":"ParticipantsController_restoreParticipant","parameters":[{"name":"id","required":true,"in":"path","description":"Participant ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreParticipantDto"}}}},"responses":{"200":{"description":"Participant restored successfully"},"400":{"description":"Cannot restore participant"},"404":{"description":"Participant not found"}},"security":[{"bearer":[]}],"summary":"Restore a cancelled participant registration","tags":["Activity Participants"]}},"/activity-participants/{id}/pdf":{"get":{"operationId":"ParticipantsController_generatePDF","parameters":[{"name":"id","required":true,"in":"path","description":"Participant ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"PDF generated successfully","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"Participant not found"}},"security":[{"bearer":[]}],"summary":"Generate PDF with participant registration details","tags":["Activity Participants"]}},"/activity-participants/{id}/reconcile":{"post":{"operationId":"ParticipantsController_reconcileParticipant","parameters":[{"name":"id","required":true,"in":"path","description":"Participant ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Reconciliation result"},"404":{"description":"Participant not found"}},"security":[{"bearer":[]}],"summary":"Reconcile payment state for a single participant","tags":["Activity Participants"]}},"/activity-participants/activity/{activityId}/reconcile-payments":{"post":{"operationId":"ParticipantsController_reconcileActivity","parameters":[{"name":"activityId","required":true,"in":"path","description":"Activity ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Reconciliation summary"}},"security":[{"bearer":[]}],"summary":"Reconcile all participant payments for an activity","tags":["Activity Participants"]}},"/activity-participants/sync-failures":{"get":{"operationId":"ParticipantsController_getSyncFailures","parameters":[],"responses":{"200":{"description":"List of unresolved sync failures"}},"security":[{"bearer":[]}],"summary":"Get unresolved payment sync failures","tags":["Activity Participants"]}},"/activity-participants/sync-failures/{id}/resolve":{"post":{"operationId":"ParticipantsController_resolveSyncFailure","parameters":[{"name":"id","required":true,"in":"path","description":"Sync failure ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Sync failure resolved"}},"security":[{"bearer":[]}],"summary":"Manually resolve a sync failure","tags":["Activity Participants"]}},"/members":{"get":{"operationId":"MembersController_getMembers","parameters":[{"name":"select","required":false,"in":"query","description":"Columnas especificas a retornar (separadas por coma). Usar nombres de propiedades de la entidad.","schema":{"example":"id,firstName,lastName,email,status","type":"string"}},{"name":"sex","required":false,"in":"query","description":"Sex filter (accepts: MASCULINO/M/1 or FEMENINO/F/0)","schema":{"type":"string","enum":["MALE","FEMALE"]}},{"name":"city","required":false,"in":"query","description":"City filter","schema":{"type":"string"}},{"name":"harvest","required":false,"in":"query","description":"Harvest filter","schema":{"type":"string"}},{"name":"maritalStatus","required":false,"in":"query","description":"Marital status filter","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Status filter","schema":{"type":"string"}},{"name":"church","required":false,"in":"query","description":"Church filter","schema":{"type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"enum":["ASC","DESC"],"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Sort field","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","description":"Search term","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"number"}}],"responses":{"200":{"description":"Members retrieved successfully"},"403":{"description":"Forbidden"}},"security":[{"JWT":[]}],"summary":"Get members with pagination, filters and search","tags":["Members"]},"post":{"operationId":"MembersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMemberDto"}}}},"responses":{"201":{"description":"Member created successfully"},"400":{"description":"Bad Request"},"409":{"description":"Conflict - Identification already exists"}},"security":[{"JWT":[]}],"summary":"Create new member","tags":["Members"]}},"/members/search":{"get":{"operationId":"MembersController_searchMembers","parameters":[{"name":"q","required":true,"in":"query","description":"Search term","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Max results","schema":{"type":"number"}},{"name":"church","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Search results"}},"security":[{"JWT":[]}],"summary":"Search members by name, code or identification (for autocomplete)","tags":["Members"]}},"/members/statistics":{"get":{"operationId":"MembersController_getStatistics","parameters":[{"name":"church","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Statistics retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get members statistics","tags":["Members"]}},"/members/{id}":{"get":{"operationId":"MembersController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Member found"},"404":{"description":"Member not found"}},"security":[{"JWT":[]}],"summary":"Get member by ID","tags":["Members"]},"put":{"operationId":"MembersController_update","parameters":[{"name":"id","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberDto"}}}},"responses":{"200":{"description":"Member updated successfully"},"403":{"description":"Forbidden"},"404":{"description":"Member not found"}},"security":[{"JWT":[]}],"summary":"Update member","tags":["Members"]},"delete":{"operationId":"MembersController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Member deleted successfully"},"403":{"description":"Forbidden"},"404":{"description":"Member not found"}},"security":[{"JWT":[]}],"summary":"Delete member (soft delete)","tags":["Members"]}},"/members/by-code/{code}":{"get":{"operationId":"MembersController_findByCode","parameters":[{"name":"code","required":true,"in":"path","description":"Member code","schema":{"type":"number"}}],"responses":{"200":{"description":"Member found"},"404":{"description":"Member not found"}},"security":[{"JWT":[]}],"summary":"Get member by code","tags":["Members"]}},"/members/by-identification/{identification}":{"get":{"operationId":"MembersController_findByIdentification","parameters":[{"name":"identification","required":true,"in":"path","description":"Member identification","schema":{"type":"string"}}],"responses":{"200":{"description":"Member found"},"404":{"description":"Member not found"}},"security":[{"JWT":[]}],"summary":"Get member by identification","tags":["Members"]}},"/members/export/csv":{"get":{"operationId":"MembersController_exportToCsv","parameters":[{"name":"select","required":false,"in":"query","description":"Columnas especificas a retornar (separadas por coma). Usar nombres de propiedades de la entidad.","schema":{"example":"id,firstName,lastName,email,status","type":"string"}},{"name":"sex","required":false,"in":"query","description":"Sexo (MALE=Masculino, FEMALE=Femenino)","schema":{"type":"string","enum":["MALE","FEMALE"]}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"church","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"CSV data"}},"security":[{"JWT":[]}],"summary":"Export members to CSV","tags":["Members"]}},"/members/reports/summary":{"get":{"operationId":"MembersController_getComprehensiveReport","parameters":[{"name":"church","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Report data retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get comprehensive members report","tags":["Members"]}},"/members/{id}/ministries":{"get":{"operationId":"MembersController_getMemberMinistries","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"responses":{"200":{"description":"Ministerios recuperados exitosamente"}},"security":[{"JWT":[]}],"summary":"Obtener ministerios y grupos de un miembro","tags":["Members"]},"post":{"operationId":"MembersController_addMinistries","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberMinistriesDto"}}}},"responses":{"200":{"description":"Ministerios agregados exitosamente"}},"security":[{"JWT":[]}],"summary":"Agregar ministerios a un miembro","tags":["Members"]},"delete":{"operationId":"MembersController_removeMinistries","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveMemberMinistriesDto"}}}},"responses":{"200":{"description":"Ministerios removidos exitosamente"}},"security":[{"JWT":[]}],"summary":"Remover ministerios de un miembro","tags":["Members"]}},"/members/{id}/ministry-groups":{"get":{"operationId":"MembersController_getMemberMinistryGroups","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"responses":{"200":{"description":"Grupos recuperados exitosamente"}},"security":[{"JWT":[]}],"summary":"Obtener solo los grupos de ministerio de un miembro","tags":["Members"]},"post":{"operationId":"MembersController_addMinistryGroups","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberMinistryGroupsDto"}}}},"responses":{"200":{"description":"Grupos agregados exitosamente"}},"security":[{"JWT":[]}],"summary":"Agregar grupos de ministerio a un miembro","tags":["Members"]},"delete":{"operationId":"MembersController_removeMinistryGroups","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveMemberMinistryGroupsDto"}}}},"responses":{"200":{"description":"Grupos removidos exitosamente"}},"security":[{"JWT":[]}],"summary":"Remover grupos de ministerio de un miembro","tags":["Members"]}},"/members/{id}/ministries/sync":{"put":{"operationId":"MembersController_syncMinistries","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncMemberMinistriesDto"}}}},"responses":{"200":{"description":"Ministerios sincronizados exitosamente"}},"security":[{"JWT":[]}],"summary":"Sincronizar ministerios y grupos (reemplaza todos)","tags":["Members"]}},"/members/{id}/leadership":{"get":{"operationId":"MembersController_getMemberLeaderships","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"responses":{"200":{"description":"Liderazgos recuperados exitosamente"}},"security":[{"JWT":[]}],"summary":"Obtener ministerios donde el miembro es líder","tags":["Members"]}},"/members/{id}/ministry-leadership":{"put":{"operationId":"MembersController_setMinistryLeadership","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetMinistryLeaderDto"}}}},"responses":{"200":{"description":"Liderazgo actualizado exitosamente"}},"security":[{"JWT":[]}],"summary":"Establecer o remover liderazgo de un ministerio","tags":["Members"]}},"/members/{id}/ministry-group-leadership":{"put":{"operationId":"MembersController_setMinistryGroupLeadership","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetMinistryGroupLeaderDto"}}}},"responses":{"200":{"description":"Liderazgo actualizado exitosamente"}},"security":[{"JWT":[]}],"summary":"Establecer o remover liderazgo de un grupo de ministerio","tags":["Members"]}},"/members/{id}/ministries-leadership":{"put":{"operationId":"MembersController_updateMinistriesLeadership","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMinistriesLeadershipDto"}}}},"responses":{"200":{"description":"Liderazgos actualizados exitosamente"}},"security":[{"JWT":[]}],"summary":"Actualizar liderazgo de múltiples ministerios","tags":["Members"]}},"/members/{id}/ministry-groups-leadership":{"put":{"operationId":"MembersController_updateMinistryGroupsLeadership","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMinistryGroupsLeadershipDto"}}}},"responses":{"200":{"description":"Liderazgos actualizados exitosamente"}},"security":[{"JWT":[]}],"summary":"Actualizar liderazgo de múltiples grupos","tags":["Members"]}},"/members/{id}/add-as-leader":{"post":{"operationId":"MembersController_addMemberAsLeader","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberAsLeaderDto"}}}},"responses":{"200":{"description":"Miembro agregado como líder exitosamente"}},"security":[{"JWT":[]}],"summary":"Agregar miembro como líder de ministerios y/o grupos","tags":["Members"]}},"/members/{id}/remove-all-leadership":{"delete":{"operationId":"MembersController_removeAllLeadership","parameters":[{"name":"id","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"responses":{"200":{"description":"Liderazgo removido exitosamente"}},"security":[{"JWT":[]}],"summary":"Remover todo el liderazgo de un miembro","tags":["Members"]}},"/images/upload":{"post":{"operationId":"ImagesController_upload","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateImageDto"}}}},"responses":{"201":{"description":""}},"tags":["Images"]}},"/images/deleted":{"get":{"operationId":"ImagesController_findDeleted","parameters":[],"responses":{"200":{"description":"Lista de imágenes eliminadas"},"403":{"description":"Sin permisos para ver imágenes eliminadas"}},"summary":"Listar imágenes eliminadas (requiere FULL_ACCESS o RESTORE_IMAGE)","tags":["Images"]}},"/images":{"get":{"operationId":"ImagesController_findAll","parameters":[{"name":"page","required":false,"in":"query","description":"Número de página para la paginación","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Número de resultados por página para la paginación","schema":{"example":10,"type":"number"}},{"name":"ownerId","required":false,"in":"query","description":"ID del propietario de la imagen","schema":{"example":123,"type":"number"}},{"name":"ownerType","required":false,"in":"query","description":"Tipo de propietario de la imagen","schema":{"example":"user","type":"string"}},{"name":"type","required":false,"in":"query","description":"Tipo de imagen","schema":{"example":"profile","type":"string"}},{"name":"visibility","required":false,"in":"query","description":"Visibilidad de la imagen","schema":{"example":"public","type":"string"}},{"name":"status","required":false,"in":"query","description":"Estado de la imagen","schema":{"example":"active","type":"string"}},{"name":"search","required":false,"in":"query","description":"Búsqueda por nombre o descripción","schema":{"example":"perfil","type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Campo por el cual ordenar los resultados","schema":{"example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Orden de los resultados","schema":{"example":"DESC","type":"string"}}],"responses":{"200":{"description":""}},"tags":["Images"]}},"/images/{id}":{"get":{"operationId":"ImagesController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Images"]},"patch":{"operationId":"ImagesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateImageDto"}}}},"responses":{"200":{"description":""}},"tags":["Images"]},"delete":{"operationId":"ImagesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Images"]}},"/images/{id}/hard":{"delete":{"operationId":"ImagesController_hardDelete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Images"]}},"/images/{id}/restore":{"post":{"operationId":"ImagesController_restore","parameters":[{"name":"id","required":true,"in":"path","description":"UUID de la imagen","schema":{"type":"string"}}],"responses":{"200":{"description":"Imagen restaurada exitosamente"},"403":{"description":"Sin permisos para restaurar"},"404":{"description":"Imagen no encontrada o archivo físico no existe"}},"summary":"Restaurar una imagen eliminada (requiere FULL_ACCESS o RESTORE_IMAGE)","tags":["Images"]}},"/images/{id}/reupload":{"post":{"description":"Permite subir un nuevo archivo físico cuando el original se perdió, manteniendo todos los metadatos del registro.","operationId":"ImagesController_reuploadFile","parameters":[{"name":"id","required":true,"in":"path","description":"UUID de la imagen","schema":{"type":"string"}}],"responses":{"200":{"description":"Archivo re-subido exitosamente"},"400":{"description":"El archivo físico ya existe o archivo inválido"},"403":{"description":"Sin permisos para re-subir"},"404":{"description":"Imagen no encontrada"}},"summary":"Re-subir archivo físico de una imagen existente (requiere FULL_ACCESS o RESTORE_IMAGE)","tags":["Images"]}},"/images/{id}/set-primary":{"post":{"operationId":"ImagesController_setPrimary","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Establecer imagen como principal","tags":["Images"]}},"/images/{id}/file":{"get":{"description":"Sirve la imagen directamente. Las públicas no requieren auth, las privadas sí.","operationId":"ImagesController_getImageFile","parameters":[{"name":"id","required":true,"in":"path","description":"UUID de la imagen","schema":{"type":"string"}},{"name":"variant","required":false,"in":"query","description":"Variante: thumbnail, small, medium, large","schema":{"type":"string"}}],"responses":{"200":{"description":"Imagen servida correctamente"},"403":{"description":"Sin permisos para acceder a la imagen"},"404":{"description":"Imagen no encontrada"}},"summary":"Obtener archivo de imagen","tags":["Images"]}},"/images/{id}/download":{"get":{"operationId":"ImagesController_download","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Descargar imagen como archivo adjunto","tags":["Images"]}},"/images/{id}/url":{"get":{"operationId":"ImagesController_getUrl","parameters":[{"name":"id","required":true,"in":"path","description":"UUID de la imagen","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Obtener URL de acceso a la imagen","tags":["Images"]}},"/images/{id}/base64":{"get":{"description":"Útil para imágenes pequeñas que se embeben directamente en JSON","operationId":"ImagesController_getBase64","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"variant","required":false,"in":"query","description":"Variante: thumbnail, small, medium, large","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Obtener imagen en Base64","tags":["Images"]}},"/addons":{"post":{"operationId":"AddonsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAddonDto"}}}},"responses":{"201":{"description":"Add-on creado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddonEntity"}}}}},"security":[{"bearer":[]}],"summary":"Crear un add-on del catalogo global","tags":["Addons"]},"get":{"operationId":"AddonsController_findAll","parameters":[{"name":"code","required":false,"in":"query","schema":{"type":"string"}},{"name":"name","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["ACTIVE","INACTIVE"]}},{"name":"category","required":false,"in":"query","schema":{"type":"string","enum":["PRODUCTO","SERVICIO","ACCESO"]}},{"name":"isGlobal","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"activityId","required":false,"in":"query","schema":{"type":"number"}},{"name":"onlyActive","required":false,"in":"query","schema":{"default":true,"type":"boolean"}}],"responses":{"200":{"description":"Catalogo de add-ons","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AddonEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Listar add-ons del catalogo","tags":["Addons"]}},"/addons/{id}":{"get":{"operationId":"AddonsController_findById","parameters":[{"name":"id","required":true,"in":"path","description":"ID del add-on","schema":{"type":"number"}}],"responses":{"200":{"description":"Add-on encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddonEntity"}}}}},"security":[{"bearer":[]}],"summary":"Obtener un add-on por ID","tags":["Addons"]},"patch":{"operationId":"AddonsController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID del add-on","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAddonDto"}}}},"responses":{"200":{"description":"Add-on actualizado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddonEntity"}}}}},"security":[{"bearer":[]}],"summary":"Actualizar un add-on del catalogo","tags":["Addons"]},"delete":{"operationId":"AddonsController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID del add-on","schema":{"type":"number"}}],"responses":{"200":{"description":"Add-on eliminado o desactivado si estaba en uso"}},"security":[{"bearer":[]}],"summary":"Eliminar un add-on del catalogo si no esta en uso","tags":["Addons"]}},"/addons/activity/{activityId}":{"get":{"operationId":"ActivityAddonsController_getResolvedCatalog","parameters":[{"name":"activityId","required":true,"in":"path","description":"ID de la actividad","schema":{"type":"number"}}],"responses":{"200":{"description":"Catalogo resuelto por actividad"}},"security":[{"bearer":[]}],"summary":"Obtener catalogo resuelto de add-ons para una actividad","tags":["Addons"]}},"/addons/activity/{activityId}/config":{"get":{"operationId":"ActivityAddonsController_getConfig","parameters":[{"name":"activityId","required":true,"in":"path","description":"ID de la actividad","schema":{"type":"number"}}],"responses":{"200":{"description":"Configuracion actual de la actividad","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActivityAddonConfigEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener configuracion explicita de add-ons por actividad","tags":["Addons"]},"put":{"operationId":"ActivityAddonsController_upsertConfig","parameters":[{"name":"activityId","required":true,"in":"path","description":"ID de la actividad","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityAddonConfigDto"}}}},"responses":{"200":{"description":"Configuracion guardada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityAddonConfigEntity"}}}}},"security":[{"bearer":[]}],"summary":"Crear o actualizar configuracion de add-on para una actividad","tags":["Addons"]}},"/addons/activity/{activityId}/config/{addonId}":{"delete":{"operationId":"ActivityAddonsController_removeConfig","parameters":[{"name":"activityId","required":true,"in":"path","description":"ID de la actividad","schema":{"type":"number"}},{"name":"addonId","required":true,"in":"path","description":"ID del add-on","schema":{"type":"number"}}],"responses":{"204":{"description":"Configuracion desactivada"}},"security":[{"bearer":[]}],"summary":"Desactivar configuracion de un add-on en una actividad","tags":["Addons"]}},"/addons/activity/{activityId}/quote":{"post":{"operationId":"ActivityAddonsController_quote","parameters":[{"name":"activityId","required":true,"in":"path","description":"ID de la actividad","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddonQuoteRequestDto"}}}},"responses":{"200":{"description":"Cotizacion calculada"}},"security":[{"bearer":[]}],"summary":"Cotizar add-ons seleccionados para una actividad","tags":["Addons"]}},"/addons/sales/participants/{participantId}":{"get":{"operationId":"ParticipantAddonsController_findByParticipant","parameters":[{"name":"participantId","required":true,"in":"path","description":"ID del participante","schema":{"type":"number"}},{"name":"paymentStatus","required":false,"in":"query","schema":{"enum":["PENDING","PAID","CANCELLED","REFUNDED"],"type":"string"}},{"name":"deliveryStatus","required":false,"in":"query","schema":{"enum":["PENDING","DELIVERED"],"type":"string"}}],"responses":{"200":{"description":"Lineas de add-ons del participante","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ParticipantAddonEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Listar add-ons de un participante","tags":["Addons"]}},"/addons/sales/payments/{paymentId}":{"get":{"operationId":"ParticipantAddonsController_findByPayment","parameters":[{"name":"paymentId","required":true,"in":"path","description":"ID del pago","schema":{"type":"number"}}],"responses":{"200":{"description":"Lineas de add-ons vinculadas al pago","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ParticipantAddonEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Listar add-ons vinculados a un pago","tags":["Addons"]}},"/addons/sales/activities/{activityId}":{"get":{"operationId":"ParticipantAddonsController_findByActivity","parameters":[{"name":"activityId","required":true,"in":"path","description":"ID de la actividad","schema":{"type":"number"}},{"name":"paymentStatus","required":false,"in":"query","schema":{"enum":["PENDING","PAID","CANCELLED","REFUNDED"],"type":"string"}},{"name":"deliveryStatus","required":false,"in":"query","schema":{"enum":["PENDING","DELIVERED"],"type":"string"}}],"responses":{"200":{"description":"Lineas de add-ons por actividad","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ParticipantAddonEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Listar add-ons vendidos para una actividad","tags":["Addons"]}},"/addons/sales/activities/{activityId}/summary":{"get":{"operationId":"ParticipantAddonsController_getActivitySummary","parameters":[{"name":"activityId","required":true,"in":"path","description":"ID de la actividad","schema":{"type":"number"}}],"responses":{"200":{"description":"Resumen operativo de add-ons"}},"security":[{"bearer":[]}],"summary":"Obtener resumen operativo de add-ons por actividad","tags":["Addons"]}},"/addons/sales/delivery":{"patch":{"operationId":"ParticipantAddonsController_markAsDelivered","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliverAddonDto"}}}},"responses":{"200":{"description":"Lineas entregadas","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ParticipantAddonEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Marcar add-ons pagados como entregados","tags":["Addons"]}},"/addon-sales/quote":{"post":{"operationId":"AddonSalesController_quote","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteAddonSaleDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cotizar selecciones de add-ons sin persistir","tags":["Addon Sales (Standalone)"]}},"/addon-sales":{"post":{"operationId":"AddonSalesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAddonSaleDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddonSaleEntity"}}}}},"security":[{"bearer":[]}],"summary":"Crear una venta standalone de add-ons","tags":["Addon Sales (Standalone)"]},"get":{"operationId":"AddonSalesController_findAll","parameters":[{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["OPEN","CANCELLED"]}},{"name":"paymentStatus","required":false,"in":"query","schema":{"type":"string","enum":["PENDING","PAID","REFUNDED","CANCELLED"]}},{"name":"deliveryStatus","required":false,"in":"query","description":"Filtrar por estado de entrega de al menos una linea","schema":{"type":"string"}},{"name":"buyerMemberCode","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":false,"in":"query","description":"Fecha desde (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Fecha hasta (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar ventas standalone con paginacion","tags":["Addon Sales (Standalone)"]}},"/addon-sales/reports/summary":{"get":{"operationId":"AddonSalesController_reportSummary","parameters":[{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["OPEN","CANCELLED"]}},{"name":"paymentStatus","required":false,"in":"query","schema":{"type":"string","enum":["PENDING","PAID","REFUNDED","CANCELLED"]}},{"name":"deliveryStatus","required":false,"in":"query","description":"Filtrar por estado de entrega de al menos una linea","schema":{"type":"string"}},{"name":"buyerMemberCode","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":false,"in":"query","description":"Fecha desde (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Fecha hasta (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtener resumen agregado de reportes de ventas standalone","tags":["Addon Sales (Standalone)"]}},"/addon-sales/{id}":{"get":{"operationId":"AddonSalesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la venta","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtener una venta standalone por ID","tags":["Addon Sales (Standalone)"]},"patch":{"operationId":"AddonSalesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAddonSaleDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Editar una venta standalone (solo si esta PENDING)","tags":["Addon Sales (Standalone)"]},"delete":{"operationId":"AddonSalesController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelAddonSaleDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cancelar una venta standalone (solo si no esta pagada)","tags":["Addon Sales (Standalone)"]}},"/addon-sales/{id}/deliveries":{"post":{"operationId":"AddonSalesController_deliver","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliverAddonSaleDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Registrar entrega total/parcial de lineas de una venta pagada","tags":["Addon Sales (Standalone)"]}},"/churches":{"post":{"description":"Registra una nueva iglesia en el sistema","operationId":"ChurchesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateChurchDto"}}}},"responses":{"201":{"description":"Iglesia creada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChurchEntity"}}}},"409":{"description":"Ya existe una iglesia con ese código o ya hay una iglesia principal"}},"security":[{"bearer":[]}],"summary":"Crear una nueva iglesia","tags":["churches"]},"get":{"description":"Obtiene todas las iglesias con filtros opcionales","operationId":"ChurchesController_findAll","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"churchType","required":false,"in":"query","description":"Filtrar por tipo de iglesia","schema":{"enum":["MAIN","BRANCH","CELL_GROUP","MISSION","EXTENSION"],"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filtrar por estado operativo","schema":{"enum":["ACTIVE","INACTIVE","UNDER_CONSTRUCTION","CLOSED","MERGED"],"type":"string"}},{"name":"onlyActive","required":false,"in":"query","description":"Solo iglesias activas (por defecto true)","schema":{"example":true,"type":"boolean"}},{"name":"includeLocation","required":false,"in":"query","description":"Incluir información de ubicación geográfica","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Lista de iglesias obtenida exitosamente (paginada)"}},"security":[{"bearer":[]}],"summary":"Obtener lista de iglesias","tags":["churches"]}},"/churches/search":{"get":{"description":"Busca iglesias por nombre, código, denominación, dirección o pastor","operationId":"ChurchesController_search","parameters":[{"name":"q","required":true,"in":"query","description":"Término de búsqueda","schema":{"type":"string"}},{"name":"includeLocation","required":false,"in":"query","description":"Incluir información de ubicación","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Resultados de búsqueda obtenidos","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChurchEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Buscar iglesias","tags":["churches"]}},"/churches/main":{"get":{"description":"Obtiene la iglesia marcada como principal (sede central)","operationId":"ChurchesController_findMain","parameters":[{"name":"includeLocation","required":false,"in":"query","description":"Incluir información de ubicación","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Iglesia principal obtenida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChurchEntity"}}}},"404":{"description":"No hay iglesia principal configurada"}},"security":[{"bearer":[]}],"summary":"Obtener iglesia principal","tags":["churches"]}},"/churches/hierarchy":{"get":{"description":"Obtiene la estructura jerárquica: principal → sucursales → células","operationId":"ChurchesController_getHierarchy","parameters":[],"responses":{"200":{"description":"Jerarquía obtenida exitosamente"}},"security":[{"bearer":[]}],"summary":"Obtener jerarquía de iglesias","tags":["churches"]}},"/churches/statistics":{"get":{"description":"Obtiene métricas y estadísticas del sistema de iglesias","operationId":"ChurchesController_getStatistics","parameters":[],"responses":{"200":{"description":"Estadísticas obtenidas exitosamente"}},"security":[{"bearer":[]}],"summary":"Obtener estadísticas de iglesias","tags":["churches"]}},"/churches/denomination/{denomination}":{"get":{"description":"Obtiene todas las iglesias de una denominación específica","operationId":"ChurchesController_findByDenomination","parameters":[{"name":"denomination","required":true,"in":"path","description":"Nombre de la denominación","schema":{"example":"Mahanaim","type":"string"}},{"name":"includeLocation","required":false,"in":"query","description":"Incluir información de ubicación","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Iglesias de la denominación obtenidas","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChurchEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener iglesias por denominación","tags":["churches"]}},"/churches/location":{"get":{"description":"Filtra iglesias por país, estado, ciudad o sector","operationId":"ChurchesController_findByLocation","parameters":[{"name":"countryId","required":false,"in":"query","description":"ID del país","schema":{"type":"number"}},{"name":"stateId","required":false,"in":"query","description":"ID del estado","schema":{"type":"number"}},{"name":"cityId","required":false,"in":"query","description":"ID de la ciudad","schema":{"type":"number"}},{"name":"sectorId","required":false,"in":"query","description":"ID del sector","schema":{"type":"number"}}],"responses":{"200":{"description":"Iglesias por ubicación obtenidas","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChurchEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener iglesias por ubicación","tags":["churches"]}},"/churches/nearby":{"get":{"description":"Encuentra iglesias cerca de coordenadas específicas","operationId":"ChurchesController_findNearby","parameters":[{"name":"lat","required":true,"in":"query","description":"Latitud","schema":{"example":18.427551,"type":"number"}},{"name":"lng","required":true,"in":"query","description":"Longitud","schema":{"example":-68.972259,"type":"number"}},{"name":"radius","required":false,"in":"query","description":"Radio en kilómetros (por defecto 10)","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Iglesias cercanas encontradas","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChurchEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Buscar iglesias cercanas","tags":["churches"]}},"/churches/code/{code}":{"get":{"description":"Obtiene una iglesia específica por su código único","operationId":"ChurchesController_findByCode","parameters":[{"name":"code","required":true,"in":"path","description":"Código único de la iglesia","schema":{"example":"MLR","type":"string"}},{"name":"includeLocation","required":false,"in":"query","description":"Incluir información de ubicación","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Iglesia obtenida exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChurchEntity"}}}},"404":{"description":"Iglesia no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener iglesia por código","tags":["churches"]}},"/churches/{id}":{"get":{"description":"Obtiene una iglesia específica por su ID","operationId":"ChurchesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la iglesia","schema":{"type":"number"}},{"name":"includeLocation","required":false,"in":"query","description":"Incluir información de ubicación","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Iglesia obtenida exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChurchEntity"}}}},"404":{"description":"Iglesia no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener iglesia por ID","tags":["churches"]},"patch":{"description":"Actualiza los datos de una iglesia existente","operationId":"ChurchesController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la iglesia","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChurchDto"}}}},"responses":{"200":{"description":"Iglesia actualizada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChurchEntity"}}}},"404":{"description":"Iglesia no encontrada"},"409":{"description":"Conflicto con código existente o restricción de iglesia principal"}},"security":[{"bearer":[]}],"summary":"Actualizar iglesia","tags":["churches"]},"delete":{"description":"Desactiva una iglesia (eliminación suave)","operationId":"ChurchesController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la iglesia","schema":{"type":"number"}}],"responses":{"200":{"description":"Iglesia eliminada exitosamente"},"400":{"description":"No se puede eliminar la iglesia principal"},"404":{"description":"Iglesia no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar iglesia","tags":["churches"]}},"/churches/{id}/location":{"patch":{"description":"Actualiza específicamente la información geográfica de una iglesia","operationId":"ChurchesController_updateLocation","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la iglesia","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChurchLocationUpdateDto"}}}},"responses":{"200":{"description":"Ubicación actualizada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChurchEntity"}}}},"404":{"description":"Iglesia no encontrada"}},"security":[{"bearer":[]}],"summary":"Actualizar ubicación de iglesia","tags":["churches"]}},"/payments":{"post":{"operationId":"PaymentsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInternalPaymentDto"}}}},"responses":{"201":{"description":"Payment created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"400":{"description":"Invalid payment data"},"409":{"description":"External reference already exists"}},"security":[{"bearer":[]}],"summary":"Create a new internal payment","tags":["Payments"]},"get":{"operationId":"PaymentsController_findAll","parameters":[{"name":"location","required":false,"in":"query","description":"Filter by location","schema":{"type":"string"}},{"name":"memberCode","required":false,"in":"query","description":"Filter by member code","schema":{"type":"string"}},{"name":"batchNumber","required":false,"in":"query","description":"Filter by batch number","schema":{"type":"string"}},{"name":"paymentMethod","required":false,"in":"query","description":"Filter by payment method","schema":{"type":"string","enum":["CASH","CREDIT_CARD","DEBIT_CARD","TRANSFER","DEPOSIT","PAYPAL","OTHER","STRIPE","AZUL"]}},{"name":"currency","required":false,"in":"query","description":"Filter by currency","schema":{"type":"string","enum":["USD","DOP","EUR"]}},{"name":"paymentType","required":false,"in":"query","description":"Filter by payment type","schema":{"type":"string","enum":["OFRENDA","DIEZMO","ACTIVIDAD","EDUCACION","MINISTERIO","DONACION","MEMBRESIA","OTRO"]}},{"name":"status","required":false,"in":"query","description":"Filter by payment status","schema":{"type":"string","enum":["PAID","PENDING","PARTIAL","NOT_APPLICABLE","PAID","FAILED","CANCELLED","REFUNDED","PROCESSING"]}},{"name":"minAmount","required":false,"in":"query","description":"Minimum amount","schema":{"type":"number"}},{"name":"maxAmount","required":false,"in":"query","description":"Maximum amount","schema":{"type":"number"}},{"name":"dateFrom","required":false,"in":"query","description":"Date from (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Date to (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"includeAnnulled","required":false,"in":"query","description":"Include annulled payments","schema":{"default":false,"type":"boolean"}},{"name":"isAnnulled","required":false,"in":"query","description":"Filter only annulled payments (alias for backwards compatibility)","schema":{"default":false,"type":"boolean"}},{"name":"externalReference","required":false,"in":"query","description":"Filter by external reference","schema":{"type":"string"}},{"name":"processorId","required":false,"in":"query","description":"Filter by processor ID","schema":{"type":"number"}},{"name":"relatedEntityType","required":false,"in":"query","description":"Filter by related entity type","schema":{"type":"string"}},{"name":"relatedEntityId","required":false,"in":"query","description":"Filter by related entity ID","schema":{"type":"number"}},{"name":"activityId","required":false,"in":"query","description":"Filter by activity ID (filters payments related to participants of this activity)","schema":{"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search text (member name, comment, etc.)","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Sort field","schema":{"default":"paymentDate","type":"string","enum":["paymentDate","amount","memberCode","paymentMethod","status","createdAt","updatedAt"]}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"select","required":false,"in":"query","description":"Specific columns to return (comma-separated)","schema":{"example":"id,memberCode,amount,currency,paymentDate,status","type":"string"}}],"responses":{"200":{"description":"Payments retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get all payments with filtering and pagination","tags":["Payments"]}},"/payments/external":{"post":{"operationId":"PaymentsController_createExternal","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessExternalPaymentDto"}}}},"responses":{"201":{"description":"External payment initiated successfully"},"400":{"description":"Invalid payment data or processor not available"}},"security":[{"bearer":[]}],"summary":"Process payment through external processor","tags":["Payments"]}},"/payments/pay-with-saved-card":{"post":{"operationId":"PaymentsController_payWithSavedCard","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayWithSavedCardDto"}}}},"responses":{"201":{"description":"Payment processed successfully with saved card"},"400":{"description":"Invalid saved card payment data"}},"security":[{"bearer":[]}],"summary":"Process payment using a saved card token","tags":["Payments"]}},"/payments/member/{memberCode}":{"get":{"operationId":"PaymentsController_findByMember","parameters":[{"name":"memberCode","required":true,"in":"path","description":"Member code","schema":{"type":"string"}},{"name":"location","required":false,"in":"query","description":"Filter by location","schema":{"type":"string"}},{"name":"batchNumber","required":false,"in":"query","description":"Filter by batch number","schema":{"type":"string"}},{"name":"paymentMethod","required":false,"in":"query","description":"Filter by payment method","schema":{"type":"string","enum":["CASH","CREDIT_CARD","DEBIT_CARD","TRANSFER","DEPOSIT","PAYPAL","OTHER","STRIPE","AZUL"]}},{"name":"currency","required":false,"in":"query","description":"Filter by currency","schema":{"type":"string","enum":["USD","DOP","EUR"]}},{"name":"paymentType","required":false,"in":"query","description":"Filter by payment type","schema":{"type":"string","enum":["OFRENDA","DIEZMO","ACTIVIDAD","EDUCACION","MINISTERIO","DONACION","MEMBRESIA","OTRO"]}},{"name":"status","required":false,"in":"query","description":"Filter by payment status","schema":{"type":"string","enum":["PAID","PENDING","PARTIAL","NOT_APPLICABLE","PAID","FAILED","CANCELLED","REFUNDED","PROCESSING"]}},{"name":"minAmount","required":false,"in":"query","description":"Minimum amount","schema":{"type":"number"}},{"name":"maxAmount","required":false,"in":"query","description":"Maximum amount","schema":{"type":"number"}},{"name":"dateFrom","required":false,"in":"query","description":"Date from (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Date to (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"includeAnnulled","required":false,"in":"query","description":"Include annulled payments","schema":{"default":false,"type":"boolean"}},{"name":"isAnnulled","required":false,"in":"query","description":"Filter only annulled payments (alias for backwards compatibility)","schema":{"default":false,"type":"boolean"}},{"name":"externalReference","required":false,"in":"query","description":"Filter by external reference","schema":{"type":"string"}},{"name":"processorId","required":false,"in":"query","description":"Filter by processor ID","schema":{"type":"number"}},{"name":"relatedEntityType","required":false,"in":"query","description":"Filter by related entity type","schema":{"type":"string"}},{"name":"relatedEntityId","required":false,"in":"query","description":"Filter by related entity ID","schema":{"type":"number"}},{"name":"activityId","required":false,"in":"query","description":"Filter by activity ID (filters payments related to participants of this activity)","schema":{"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search text (member name, comment, etc.)","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Sort field","schema":{"default":"paymentDate","type":"string","enum":["paymentDate","amount","memberCode","paymentMethod","status","createdAt","updatedAt"]}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"select","required":false,"in":"query","description":"Specific columns to return (comma-separated)","schema":{"example":"id,memberCode,amount,currency,paymentDate,status","type":"string"}}],"responses":{"200":{"description":"Member payments retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get payments by member code","tags":["Payments"]}},"/payments/participant/{participantId}":{"get":{"operationId":"PaymentsController_findByParticipant","parameters":[{"name":"participantId","required":true,"in":"path","description":"Activity participant ID (catalogo_actividades_participantes.id)","schema":{"type":"number"}},{"name":"includeAnnulled","required":false,"in":"query","description":"Include annulled payments","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Participant payments retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get payments by activity participant ID","tags":["Payments"]}},"/payments/entity/{entityType}/{entityId}":{"get":{"operationId":"PaymentsController_findByEntity","parameters":[{"name":"entityType","required":true,"in":"path","description":"Entity type (activity, education, etc.)","schema":{"type":"string"}},{"name":"entityId","required":true,"in":"path","description":"Entity ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Entity payments retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get payments by related entity","tags":["Payments"]}},"/payments/totals":{"get":{"operationId":"PaymentsController_getTotals","parameters":[{"name":"dateFrom","required":true,"in":"query","description":"Start date (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"dateTo","required":true,"in":"query","description":"End date (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"location","required":false,"in":"query","description":"Filter by location","schema":{"type":"string"}}],"responses":{"200":{"description":"Payment totals calculated successfully"}},"security":[{"bearer":[]}],"summary":"Get payment totals by date range","tags":["Payments"]}},"/payments/{id}":{"get":{"operationId":"PaymentsController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Payment found"},"404":{"description":"Payment not found"}},"security":[{"bearer":[]}],"summary":"Get payment by ID","tags":["Payments"]},"patch":{"operationId":"PaymentsController_update","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePaymentDto"}}}},"responses":{"200":{"description":"Payment updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"400":{"description":"Invalid update data"},"404":{"description":"Payment not found"}},"security":[{"bearer":[]}],"summary":"Update payment","tags":["Payments"]}},"/payments/{id}/transactions":{"get":{"operationId":"PaymentsController_getTransactions","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Payment transactions retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get payment transactions","tags":["Payments"]}},"/payments/{id}/status":{"get":{"operationId":"PaymentsController_checkStatus","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Payment status retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Check external payment status","tags":["Payments"]}},"/payments/{id}/reassign":{"patch":{"operationId":"PaymentsController_reassignPayment","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReassignPaymentDto"}}}},"responses":{"200":{"description":"Payment reassigned successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"400":{"description":"Invalid reassignment (different activities, annulled payment, etc.)"},"404":{"description":"Payment or participant not found"}},"security":[{"bearer":[]}],"summary":"Reassign payment to another participant","tags":["Payments"]}},"/payments/{id}/annul":{"patch":{"operationId":"PaymentsController_annul","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Payment annulled successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"400":{"description":"Cannot annul payment or missing required comment"},"404":{"description":"Payment not found"}},"security":[{"bearer":[]}],"summary":"Annul payment","tags":["Payments"]}},"/payments/{id}/refund":{"patch":{"operationId":"PaymentsController_refundInternal","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Payment refunded and credit note generated"},"400":{"description":"Cannot refund payment"},"404":{"description":"Payment not found"}},"security":[{"bearer":[]}],"summary":"Refund payment with credit note (independent of batch status)","tags":["Payments"]},"post":{"operationId":"PaymentsController_refund","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Refund processed successfully"},"400":{"description":"Cannot refund payment"},"404":{"description":"Payment not found"}},"security":[{"bearer":[]}],"summary":"Refund external payment","tags":["Payments"]}},"/payments/{id}/attach-approval":{"patch":{"operationId":"PaymentsController_attachApproval","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachApprovalDto"}}}},"responses":{"200":{"description":"Approval attached successfully"},"400":{"description":"Payment already completed or invalid state"},"404":{"description":"Payment not found"}},"security":[{"bearer":[]}],"summary":"Attach manual approval to pending payment","tags":["Payments"]}},"/payments/{id}/restore":{"patch":{"operationId":"PaymentsController_restore","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Payment restored successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"400":{"description":"Payment is not annulled, missing required comment, or cannot be restored"},"404":{"description":"Payment not found"}},"security":[{"bearer":[]}],"summary":"Restore annulled payment with validation modes","tags":["Payments"]}},"/payments/{id}/validate-restore":{"get":{"operationId":"PaymentsController_validateRestore","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Validation result with available actions"},"404":{"description":"Payment not found"}},"security":[{"bearer":[]}],"summary":"Validate if payment can be restored","tags":["Payments"]}},"/payments/bulk-action":{"post":{"operationId":"PaymentsController_bulkAction","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkPaymentActionDto"}}}},"responses":{"200":{"description":"Bulk action completed"},"400":{"description":"Invalid bulk action data"}},"security":[{"bearer":[]}],"summary":"Perform bulk action on payments","tags":["Payments"]}},"/payments/validate-multiple-payment":{"post":{"description":"Validates that all participants can be paid together in a single transaction. Checks: 1) All participants exist, 2) All have zero previous payments, 3) Total amount matches sum of pending amounts, 4) All belong to same activity.","operationId":"PaymentsController_validateMultiplePayment","parameters":[],"responses":{"200":{"description":"Validation result with details","content":{"application/json":{"schema":{"type":"object","properties":{"isValid":{"type":"boolean"},"participants":{"type":"array"},"totalPending":{"type":"number"},"totalPendingDOP":{"type":"number"},"errors":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Invalid request"}},"security":[{"bearer":[]}],"summary":"Validate multiple participant payment before processing","tags":["Payments"]}},"/payments/webhook/{processorId}":{"post":{"operationId":"PaymentsController_handleWebhook","parameters":[{"name":"processorId","required":true,"in":"path","description":"Payment processor ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Webhook processed successfully"}},"security":[{"bearer":[]}],"summary":"Handle payment processor webhook","tags":["Payments"]}},"/payments/{id}/details":{"get":{"operationId":"PaymentsController_getPaymentDetails","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Payment details retrieved"}},"security":[{"bearer":[]}],"summary":"Obtener detalles completos del pago (alias de GET /payments/:id)","tags":["Payments"]}},"/payments/{id}/print":{"get":{"operationId":"PaymentsController_printPayment","parameters":[{"name":"id","required":true,"in":"path","description":"Payment ID","schema":{"type":"number"}},{"name":"format","required":false,"in":"query","description":"Formato: ticket (default) o carta","schema":{"type":"string"}}],"responses":{"200":{"description":"Payment PDF generated"}},"security":[{"bearer":[]}],"summary":"Imprimir/descargar PDF con datos del pago","tags":["Payments"]}},"/payment-processors":{"post":{"operationId":"ProcessorsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProcessorDto"}}}},"responses":{"201":{"description":"Processor created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentProcessor"}}}},"400":{"description":"Invalid processor configuration"},"409":{"description":"Processor name already exists"}},"security":[{"bearer":[]}],"summary":"Create a new payment processor","tags":["Payment Processors"]},"get":{"operationId":"ProcessorsController_findAll","parameters":[{"name":"type","required":false,"in":"query","description":"Filter by processor type","schema":{"type":"string","enum":["STRIPE","PAYPAL","AZUL","PLACETOPAY","MERCADOPAGO","CUSTOM"]}},{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"type":"string","enum":["ACTIVE","INACTIVE","TESTING","MAINTENANCE"]}},{"name":"isActive","required":false,"in":"query","description":"Filter active only","schema":{"type":"boolean"}},{"name":"currency","required":false,"in":"query","description":"Filter by currency support","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","description":"Search by name or display name","schema":{"type":"string"}}],"responses":{"200":{"description":"Processors retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get all payment processors","tags":["Payment Processors"]}},"/payment-processors/available":{"get":{"operationId":"ProcessorsController_getAvailable","parameters":[{"name":"currency","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Available processors retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get available payment processors for currency","tags":["Payment Processors"]}},"/payment-processors/{id}":{"get":{"operationId":"ProcessorsController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"Processor ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Processor found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentProcessor"}}}},"404":{"description":"Processor not found"}},"security":[{"bearer":[]}],"summary":"Get payment processor by ID","tags":["Payment Processors"]},"patch":{"operationId":"ProcessorsController_update","parameters":[{"name":"id","required":true,"in":"path","description":"Processor ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProcessorDto"}}}},"responses":{"200":{"description":"Processor updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentProcessor"}}}},"400":{"description":"Invalid processor configuration"},"404":{"description":"Processor not found"}},"security":[{"bearer":[]}],"summary":"Update payment processor","tags":["Payment Processors"]},"delete":{"operationId":"ProcessorsController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"Processor ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Processor deleted successfully"},"400":{"description":"Cannot delete processor with existing payments"},"404":{"description":"Processor not found"}},"security":[{"bearer":[]}],"summary":"Delete payment processor","tags":["Payment Processors"]}},"/payment-processors/{id}/test":{"get":{"operationId":"ProcessorsController_testConnection","parameters":[{"name":"id","required":true,"in":"path","description":"Processor ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Connection test completed"}},"security":[{"bearer":[]}],"summary":"Test payment processor connection","tags":["Payment Processors"]}},"/payment-processors/logs/all":{"get":{"description":"Retrieve logs of all communications with payment processors. Sensitive data is automatically masked for PCI compliance.","operationId":"ProcessorsController_getProcessorLogs","parameters":[{"name":"processor","required":false,"in":"query","description":"Filter by processor name (AZUL, PAYPAL, STRIPE)","schema":{"example":"AZUL","type":"string"}},{"name":"logType","required":false,"in":"query","description":"Filter by log type","schema":{"type":"string","enum":["REQUEST","RESPONSE","ERROR","WEBHOOK"]}},{"name":"transactionId","required":false,"in":"query","description":"Filter by transaction ID","schema":{"type":"string"}},{"name":"externalTransactionId","required":false,"in":"query","description":"Filter by external transaction ID (processor)","schema":{"type":"string"}},{"name":"paymentId","required":false,"in":"query","description":"Filter by payment ID","schema":{"type":"number"}},{"name":"churchId","required":false,"in":"query","description":"Filter by church ID","schema":{"type":"number"}},{"name":"success","required":false,"in":"query","description":"Filter by success status","schema":{"type":"boolean"}},{"name":"startDate","required":false,"in":"query","description":"Filter logs from this date (ISO 8601)","schema":{"example":"2024-01-01T00:00:00Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"Filter logs until this date (ISO 8601)","schema":{"example":"2024-12-31T23:59:59Z","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Maximum number of logs to return","schema":{"default":50,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of logs to skip","schema":{"default":0,"type":"number"}}],"responses":{"200":{"description":"Logs retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"logs":{"type":"array","items":{"type":"object"}},"total":{"type":"number"}}}}}}},"security":[{"bearer":[]}],"summary":"Get processor communication logs","tags":["Payment Processors"]}},"/payment-processors/logs/request/{requestId}":{"get":{"description":"Retrieve all logs (request, response, error) for a specific request correlation ID.","operationId":"ProcessorsController_getLogsByRequestId","parameters":[{"name":"requestId","required":true,"in":"path","description":"Request correlation ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Logs retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get all logs for a specific request","tags":["Payment Processors"]}},"/receipts/generate/{paymentId}":{"post":{"operationId":"ReceiptsController_generateReceipt","parameters":[{"name":"paymentId","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":""}},"tags":["Receipts"]}},"/receipts/{id}":{"get":{"operationId":"ReceiptsController_getReceipt","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Receipts"]}},"/receipts/payment/{paymentId}":{"get":{"operationId":"ReceiptsController_getReceiptByPayment","parameters":[{"name":"paymentId","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Receipts"]}},"/receipts/{id}/download":{"get":{"operationId":"ReceiptsController_downloadReceipt","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Receipts"]}},"/receipts/{id}/view":{"get":{"operationId":"ReceiptsController_viewReceipt","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Receipts"]}},"/receipts/{id}/cancel":{"post":{"operationId":"ReceiptsController_cancelReceipt","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":""}},"tags":["Receipts"]}},"/receipts/print/{paymentId}":{"get":{"operationId":"ReceiptsController_printReceiptByPayment","parameters":[{"name":"paymentId","required":true,"in":"path","schema":{"type":"number"}},{"name":"format","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Receipts"]}},"/payments/corrections/unlink":{"post":{"description":"Desvincula un pago de su entidad relacionada. \n    El pago queda marcado como UNLINKED y los montos se recalculan.\n    Requiere permisos: FULL_ACCESS, PAYMENT_CORRECTION, FINANCIAL_ADMIN","operationId":"PaymentCorrectionController_unlinkPayment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlinkPaymentDto"}}}},"responses":{"200":{"description":"Pago desvinculado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionResponseDto"}}}},"400":{"description":"Datos inválidos"},"403":{"description":"Sin permisos"},"404":{"description":"Pago no encontrado"}},"security":[{"bearer":[]}],"summary":"Desvincular pago de su entidad","tags":["Payment Corrections"]}},"/payments/corrections/link":{"post":{"description":"Vincula un pago sin asignar a una entidad específica.\n    Solo funciona con pagos que tienen status UNLINKED.\n    Requiere permisos: FULL_ACCESS, PAYMENT_CORRECTION, FINANCIAL_ADMIN","operationId":"PaymentCorrectionController_linkPayment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkPaymentDto"}}}},"responses":{"200":{"description":"Pago vinculado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionResponseDto"}}}},"400":{"description":"Datos inválidos o pago ya vinculado"},"403":{"description":"Sin permisos"},"404":{"description":"Pago o entidad no encontrada"}},"security":[{"bearer":[]}],"summary":"Vincular pago a una entidad","tags":["Payment Corrections"]}},"/payments/corrections/reassign":{"post":{"description":"Reasigna un pago de una entidad a otra del mismo tipo.\n    Por ejemplo, de un participante de actividad a otro.\n    Requiere permisos: FULL_ACCESS, PAYMENT_CORRECTION, FINANCIAL_ADMIN","operationId":"PaymentCorrectionController_reassignPayment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReassignPaymentDto"}}}},"responses":{"200":{"description":"Pago reasignado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionResponseDto"}}}},"400":{"description":"Datos inválidos"},"403":{"description":"Sin permisos"},"404":{"description":"Pago o entidad no encontrada"}},"security":[{"bearer":[]}],"summary":"Reasignar pago a otra entidad del mismo tipo","tags":["Payment Corrections"]}},"/payments/corrections/transfer":{"post":{"description":"Transfiere un pago a un tipo de entidad diferente.\n    Por ejemplo, de actividad a ofrenda o de diezmo a donación.\n    Requiere permisos: FULL_ACCESS, PAYMENT_CORRECTION, FINANCIAL_ADMIN","operationId":"PaymentCorrectionController_transferPayment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferPaymentDto"}}}},"responses":{"200":{"description":"Pago transferido exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionResponseDto"}}}},"400":{"description":"Datos inválidos"},"403":{"description":"Sin permisos"},"404":{"description":"Pago o entidad no encontrada"}},"security":[{"bearer":[]}],"summary":"Transferir pago a un tipo diferente","tags":["Payment Corrections"]}},"/payments/corrections/history":{"get":{"description":"Consulta el historial de correcciones realizadas con filtros opcionales.","operationId":"PaymentCorrectionController_getCorrectionHistory","parameters":[{"name":"paymentId","required":false,"in":"query","description":"ID del pago para filtrar","schema":{"example":1234,"type":"number"}},{"name":"correctedBy","required":false,"in":"query","description":"Usuario que realizó la corrección","schema":{"example":"admin001","type":"string"}},{"name":"action","required":false,"in":"query","description":"Tipo de acción","schema":{"type":"string","enum":["UNLINK","LINK","REASSIGN","TRANSFER","CHANGE_TYPE"]}},{"name":"dateFrom","required":false,"in":"query","description":"Fecha inicio (formato ISO)","schema":{"example":"2025-01-01","type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Fecha fin (formato ISO)","schema":{"example":"2025-12-31","type":"string"}},{"name":"page","required":false,"in":"query","description":"Número de página","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Elementos por página","schema":{"example":20,"type":"number"}}],"responses":{"200":{"description":"Historial de correcciones"}},"security":[{"bearer":[]}],"summary":"Obtener historial de correcciones","tags":["Payment Corrections"]}},"/payments/corrections/stats":{"get":{"description":"Estadísticas generales de las correcciones realizadas.","operationId":"PaymentCorrectionController_getCorrectionStats","parameters":[],"responses":{"200":{"description":"Estadísticas de correcciones"}},"security":[{"bearer":[]}],"summary":"Obtener estadísticas de correcciones","tags":["Payment Corrections"]}},"/payments/corrections/supported-types":{"get":{"description":"Lista los tipos de entidad que pueden ser corregidos.","operationId":"PaymentCorrectionController_getSupportedTypes","parameters":[],"responses":{"200":{"description":"Lista de tipos soportados"}},"security":[{"bearer":[]}],"summary":"Obtener tipos de entidad soportados","tags":["Payment Corrections"]}},"/payments/corrections/check-permission":{"get":{"description":"Verifica si el usuario actual tiene permisos para realizar correcciones.","operationId":"PaymentCorrectionController_checkPermission","parameters":[],"responses":{"200":{"description":"Estado de permisos"}},"security":[{"bearer":[]}],"summary":"Verificar permisos de corrección","tags":["Payment Corrections"]}},"/currencies":{"post":{"operationId":"CurrenciesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCurrencyDto"}}}},"responses":{"201":{"description":"Currency created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Currency"}}}},"409":{"description":"Currency code already exists"}},"security":[{"bearer":[]}],"summary":"Create a new currency","tags":["Currencies"]},"get":{"operationId":"CurrenciesController_findAll","parameters":[{"name":"status","required":false,"in":"query","schema":{"enum":["ACTIVE","INACTIVE","DEPRECATED"],"type":"string"}},{"name":"isActive","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Currencies retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get all currencies with optional filtering","tags":["Currencies"]}},"/currencies/active":{"get":{"operationId":"CurrenciesController_getActiveCurrencies","parameters":[],"responses":{"200":{"description":"Active currencies retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Currency"}}}}}},"security":[{"bearer":[]}],"summary":"Get all active currencies","tags":["Currencies"]}},"/currencies/base":{"get":{"operationId":"CurrenciesController_getBaseCurrency","parameters":[],"responses":{"200":{"description":"Base currency retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Currency"}}}}},"security":[{"bearer":[]}],"summary":"Get the base currency","tags":["Currencies"]}},"/currencies/code/{code}":{"get":{"operationId":"CurrenciesController_findByCode","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Currency found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Currency"}}}},"404":{"description":"Currency not found"}},"security":[{"bearer":[]}],"summary":"Get currency by code","tags":["Currencies"]}},"/currencies/{id}":{"get":{"operationId":"CurrenciesController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Currency found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Currency"}}}},"404":{"description":"Currency not found"}},"security":[{"bearer":[]}],"summary":"Get currency by ID","tags":["Currencies"]},"patch":{"operationId":"CurrenciesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCurrencyDto"}}}},"responses":{"200":{"description":"Currency updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Currency"}}}},"404":{"description":"Currency not found"},"409":{"description":"Currency code already exists"}},"security":[{"bearer":[]}],"summary":"Update currency","tags":["Currencies"]},"delete":{"operationId":"CurrenciesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Currency deactivated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Currency"}}}},"400":{"description":"Cannot delete base currency"},"404":{"description":"Currency not found"}},"security":[{"bearer":[]}],"summary":"Deactivate currency (soft delete)","tags":["Currencies"]}},"/currencies/{id}/set-base":{"patch":{"operationId":"CurrenciesController_setBaseCurrency","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Base currency set successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Currency"}}}},"400":{"description":"Currency must be active to set as base"},"404":{"description":"Currency not found"}},"security":[{"bearer":[]}],"summary":"Set currency as base currency","tags":["Currencies"]}},"/currencies/seed-defaults":{"post":{"operationId":"CurrenciesController_seedDefaultCurrencies","parameters":[],"responses":{"200":{"description":"Default currencies seeded successfully"}},"security":[{"bearer":[]}],"summary":"Seed default currencies (DOP, USD, EUR)","tags":["Currencies"]}},"/exchange-rates":{"post":{"operationId":"ExchangeRatesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExchangeRateDto"}}}},"responses":{"201":{"description":"Exchange rate created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRate"}}}},"409":{"description":"Exchange rate already exists for this date"}},"security":[{"bearer":[]}],"summary":"Create a new exchange rate","tags":["Exchange Rates"]},"get":{"operationId":"ExchangeRatesController_findAll","parameters":[{"name":"fromCurrency","required":false,"in":"query","schema":{"type":"string"}},{"name":"toCurrency","required":false,"in":"query","schema":{"type":"string"}},{"name":"fromDate","required":false,"in":"query","schema":{"example":"2024-01-01","type":"string"}},{"name":"toDate","required":false,"in":"query","schema":{"example":"2024-12-31","type":"string"}},{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Exchange rates retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get exchange rates with optional filtering","tags":["Exchange Rates"]}},"/exchange-rates/current":{"get":{"operationId":"ExchangeRatesController_getCurrentRates","parameters":[],"responses":{"200":{"description":"Current exchange rates retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExchangeRate"}}}}}},"security":[{"bearer":[]}],"summary":"Get current exchange rates for all currency pairs","tags":["Exchange Rates"]}},"/exchange-rates/current/{fromCurrency}/{toCurrency}":{"get":{"operationId":"ExchangeRatesController_getCurrentRate","parameters":[{"name":"fromCurrency","required":true,"in":"path","schema":{"type":"string"}},{"name":"toCurrency","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Current exchange rate found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRate"}}}},"404":{"description":"Exchange rate not found"}},"security":[{"bearer":[]}],"summary":"Get current exchange rate for specific currency pair","tags":["Exchange Rates"]}},"/exchange-rates/history/{fromCurrency}/{toCurrency}":{"get":{"operationId":"ExchangeRatesController_getHistory","parameters":[{"name":"fromCurrency","required":true,"in":"path","schema":{"type":"string"}},{"name":"toCurrency","required":true,"in":"path","schema":{"type":"string"}},{"name":"fromDate","required":false,"in":"query","schema":{"example":"2024-01-01","type":"string"}},{"name":"toDate","required":false,"in":"query","schema":{"example":"2024-12-31","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"example":30,"type":"number"}}],"responses":{"200":{"description":"Exchange rate history retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExchangeRate"}}}}}},"security":[{"bearer":[]}],"summary":"Get exchange rate history for specific currency pair","tags":["Exchange Rates"]}},"/exchange-rates/convert":{"post":{"operationId":"ExchangeRatesController_convertCurrency","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertCurrencyDto"}}}},"responses":{"200":{"description":"Currency conversion calculated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"fromCurrency":{"type":"string"},"toCurrency":{"type":"string"},"amount":{"type":"number"},"convertedAmount":{"type":"number"},"exchangeRate":{"type":"number"},"date":{"type":"string"}}}}}},"404":{"description":"Exchange rate not found"}},"security":[{"bearer":[]}],"summary":"Convert amount between currencies","tags":["Exchange Rates"]}},"/exchange-rates/{id}":{"get":{"operationId":"ExchangeRatesController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Exchange rate found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRate"}}}},"404":{"description":"Exchange rate not found"}},"security":[{"bearer":[]}],"summary":"Get exchange rate by ID","tags":["Exchange Rates"]},"patch":{"operationId":"ExchangeRatesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExchangeRateDto"}}}},"responses":{"200":{"description":"Exchange rate updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRate"}}}},"404":{"description":"Exchange rate not found"},"409":{"description":"Exchange rate already exists for this date"}},"security":[{"bearer":[]}],"summary":"Update exchange rate","tags":["Exchange Rates"]},"delete":{"operationId":"ExchangeRatesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Exchange rate deleted successfully"},"404":{"description":"Exchange rate not found"}},"security":[{"bearer":[]}],"summary":"Delete exchange rate","tags":["Exchange Rates"]}},"/exchange-rates/seed-defaults":{"post":{"operationId":"ExchangeRatesController_seedDefaultRates","parameters":[],"responses":{"200":{"description":"Default exchange rates seeded successfully"}},"security":[{"bearer":[]}],"summary":"Seed default exchange rates","tags":["Exchange Rates"]}},"/logging":{"get":{"operationId":"LoggingController_getLogs","parameters":[{"name":"type","required":false,"in":"query","schema":{"enum":["request","response","error"],"type":"string"}},{"name":"environment","required":false,"in":"query","description":"Filtrar por ambiente","schema":{"enum":["localhost","dev","production"],"type":"string"}},{"name":"userId","required":false,"in":"query","schema":{"type":"string"}},{"name":"method","required":false,"in":"query","schema":{"type":"string"}},{"name":"url","required":false,"in":"query","schema":{"type":"string"}},{"name":"statusCode","required":false,"in":"query","schema":{"type":"number"}},{"name":"errorType","required":false,"in":"query","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","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,"maximum":100,"default":50,"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get logs with filters","tags":["Logging"]}},"/logging/statistics":{"get":{"operationId":"LoggingController_getStatistics","parameters":[{"name":"startDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get logging statistics","tags":["Logging"]}},"/logging/errors/{id}/resolve":{"patch":{"operationId":"LoggingController_markErrorAsResolved","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Mark error as resolved","tags":["Logging"]}},"/logging/status":{"get":{"operationId":"LoggingController_getConnectionStatus","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get MongoDB connection status","tags":["Logging"]}},"/logging/storage-stats":{"get":{"description":"Returns counts, date ranges and distribution by environment for all log collections","operationId":"LoggingController_getStorageStats","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get storage statistics for logs","tags":["Logging"]}},"/logging/clean/preview":{"post":{"description":"Returns count of logs that would be deleted without actually deleting them. Use this before executing cleanup.","operationId":"LoggingController_previewCleanLogs","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CleanLogsDto"}}}},"responses":{"200":{"description":"Preview of logs to be deleted"}},"security":[{"JWT-auth":[]}],"summary":"Preview logs to be deleted (dry run)","tags":["Logging"]}},"/logging/clean":{"delete":{"description":"Permanently deletes logs within the specified date range. Requires confirm=true. Only available for users with D_LOGS or FULL_ACCESS permissions.","operationId":"LoggingController_cleanLogs","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CleanLogsDto"}}}},"responses":{"200":{"description":"Logs deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CleanLogsResponseDto"}}}},"400":{"description":"Invalid parameters or missing confirmation"},"403":{"description":"Insufficient permissions"}},"security":[{"JWT-auth":[]}],"summary":"Delete logs by date range","tags":["Logging"]}},"/cashflow/cashboxes":{"get":{"operationId":"CashboxesController_findAll","parameters":[],"responses":{"200":{"description":"Lista de cajas","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Cashbox"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener todas las cajas disponibles","tags":["Cashflow - Cajas"]}},"/cashflow/cashboxes/{id}":{"get":{"operationId":"CashboxesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la caja","schema":{"type":"number"}}],"responses":{"200":{"description":"Detalle de la caja","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cashbox"}}}},"404":{"description":"Caja no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener detalle de una caja","tags":["Cashflow - Cajas"]}},"/cashflow/cashboxes/{id}/status":{"get":{"operationId":"CashboxesController_getStatus","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la caja","schema":{"type":"number"}}],"responses":{"200":{"description":"Estado de la caja"},"404":{"description":"Caja no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener estado actual de una caja","tags":["Cashflow - Cajas"]}},"/cashflow/batches/open":{"post":{"operationId":"CashBatchesController_openBatch","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenBatchDto"}}}},"responses":{"201":{"description":"Lote aperturado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CashBatch"}}}},"400":{"description":"Ya tienes un lote abierto o datos inválidos"},"404":{"description":"Caja no encontrada"}},"security":[{"bearer":[]}],"summary":"Aperturar un nuevo lote en una caja","tags":["Cashflow - Lotes"]}},"/cashflow/batches/{id}/close":{"patch":{"operationId":"CashBatchesController_closeBatch","parameters":[{"name":"id","required":true,"in":"path","description":"ID del lote","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloseBatchDto"}}}},"responses":{"200":{"description":"Lote cerrado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CashBatch"}}}},"400":{"description":"El lote ya está cerrado o no puedes cerrarlo"},"404":{"description":"Lote no encontrado"}},"security":[{"bearer":[]}],"summary":"Cerrar un lote","tags":["Cashflow - Lotes"]}},"/cashflow/batches/{id}/approve":{"patch":{"operationId":"CashBatchesController_approveBatch","parameters":[{"name":"id","required":true,"in":"path","description":"ID del lote","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveBatchDto"}}}},"responses":{"200":{"description":"Lote aprobado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CashBatch"}}}},"400":{"description":"El lote no está cerrado o ya fue aprobado"},"403":{"description":"No puedes aprobar tu propio cuadre"},"404":{"description":"Lote no encontrado"}},"security":[{"bearer":[]}],"summary":"Aprobar un cuadre de lote (solo supervisores)","tags":["Cashflow - Lotes"]}},"/cashflow/batches/{id}/reject":{"patch":{"operationId":"CashBatchesController_rejectBatch","parameters":[{"name":"id","required":true,"in":"path","description":"ID del lote","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectBatchDto"}}}},"responses":{"200":{"description":"Lote rechazado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CashBatch"}}}},"400":{"description":"El lote no está cerrado"},"403":{"description":"No puedes rechazar tu propio cuadre"},"404":{"description":"Lote no encontrado"}},"security":[{"bearer":[]}],"summary":"Rechazar un cuadre de lote","tags":["Cashflow - Lotes"]}},"/cashflow/batches/{id}/reopen":{"patch":{"operationId":"CashBatchesController_reopenBatch","parameters":[{"name":"id","required":true,"in":"path","description":"ID del lote","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReopenBatchDto"}}}},"responses":{"200":{"description":"Lote reabierto exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CashBatch"}}}},"400":{"description":"El lote ya está abierto"},"403":{"description":"No tienes permiso para reabrir este lote"},"404":{"description":"Lote no encontrado"}},"security":[{"bearer":[]}],"summary":"Reabrir un lote cerrado","tags":["Cashflow - Lotes"]}},"/cashflow/batches/my-active":{"get":{"operationId":"CashBatchesController_getMyActiveBatch","parameters":[],"responses":{"200":{"description":"Lote activo del usuario","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CashBatch"}}}},"404":{"description":"No tienes un lote activo"}},"security":[{"bearer":[]}],"summary":"Obtener mi lote activo","tags":["Cashflow - Lotes"]}},"/cashflow/batches/pending-approval":{"get":{"operationId":"CashBatchesController_getPendingApproval","parameters":[],"responses":{"200":{"description":"Lista de lotes pendientes","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CashBatch"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener lotes pendientes de aprobación","tags":["Cashflow - Lotes"]}},"/cashflow/batches/{id}":{"get":{"operationId":"CashBatchesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID del lote","schema":{"type":"number"}}],"responses":{"200":{"description":"Detalle del lote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CashBatch"}}}},"404":{"description":"Lote no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener detalle de un lote","tags":["Cashflow - Lotes"]}},"/cashflow/batches":{"get":{"operationId":"CashBatchesController_findAll","parameters":[{"name":"userUid","required":false,"in":"query","description":"Filtrar por usuario (UID)","schema":{"example":"6365377","type":"string"}},{"name":"cashboxId","required":false,"in":"query","description":"Filtrar por caja","schema":{"example":100,"type":"number"}},{"name":"status","required":false,"in":"query","description":"Filtrar por estado","schema":{"example":1,"type":"number","enum":[1,0,2,3,4]}},{"name":"dateFrom","required":false,"in":"query","description":"Fecha desde","schema":{"example":"2026-01-01","type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Fecha hasta","schema":{"example":"2026-01-31","type":"string"}},{"name":"page","required":false,"in":"query","description":"Página","schema":{"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Límite por página","schema":{"default":20,"example":20,"type":"number"}}],"responses":{"200":{"description":"Lista de lotes"}},"security":[{"bearer":[]}],"summary":"Listar lotes con filtros","tags":["Cashflow - Lotes"]}},"/cashflow/settlements/batch/{batchNumber}":{"get":{"operationId":"CashSettlementsController_getSettlementByBatch","parameters":[{"name":"batchNumber","required":true,"in":"path","description":"Número de lote","schema":{"type":"string"}}],"responses":{"200":{"description":"Cuadre del lote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CashSettlement"}}}},"404":{"description":"Cuadre no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener cuadre por número de lote","tags":["Cashflow - Cuadres"]}},"/cashflow/settlements/batch/{batchNumber}/summary":{"get":{"operationId":"CashSettlementsController_getSettlementSummary","parameters":[{"name":"batchNumber","required":true,"in":"path","description":"Número de lote","schema":{"type":"string"}}],"responses":{"200":{"description":"Resumen completo del cuadre"},"404":{"description":"Cuadre no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener resumen completo del cuadre con totales calculados","tags":["Cashflow - Cuadres"]}},"/cashflow/settlements/batch/{batchNumber}/calculate":{"get":{"operationId":"CashSettlementsController_calculateSettlement","parameters":[{"name":"batchNumber","required":true,"in":"path","description":"Número de lote","schema":{"type":"string"}}],"responses":{"200":{"description":"Totales calculados"}},"security":[{"bearer":[]}],"summary":"Recalcular totales del cuadre basado en pagos","tags":["Cashflow - Cuadres"]}},"/cashflow/settlements/batch/{batchNumber}/payments":{"get":{"operationId":"CashSettlementsController_getPaymentsByBatch","parameters":[{"name":"batchNumber","required":true,"in":"path","description":"Número de lote","schema":{"type":"string"}},{"name":"includeAnnulled","required":false,"in":"query","description":"Incluir pagos anulados","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Lista de pagos del lote"}},"security":[{"bearer":[]}],"summary":"Obtener pagos de un lote","tags":["Cashflow - Cuadres"]}},"/cashflow/settlements/pending-approval":{"get":{"deprecated":true,"description":"⚠️ DEPRECATED: Use GET /cashflow/batches/pending-approval en su lugar. Este endpoint será eliminado.","operationId":"CashSettlementsController_getPendingSettlements","parameters":[],"responses":{"200":{"description":"Lista de cuadres pendientes","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CashSettlement"}}}}}},"security":[{"bearer":[]}],"summary":"[DEPRECATED] Obtener cuadres pendientes de aprobación","tags":["Cashflow - Cuadres"]}},"/cashflow/settlements/batch/{batchNumber}/detailed":{"get":{"description":"Retorna el cuadre con información completa: totales por método/moneda, nombres de participantes, conceptos (actividades), y detalles de cada pago individual.","operationId":"CashSettlementsController_getDetailedSettlement","parameters":[{"name":"batchNumber","required":true,"in":"path","description":"Número de lote","schema":{"example":"MLR-2026-001","type":"string"}},{"name":"paymentMethod","required":false,"in":"query","description":"Filtrar por método de pago","schema":{"enum":["CASH","CREDIT_CARD","DEBIT_CARD","TRANSFER","DEPOSIT","PAYPAL","OTHER"],"type":"string"}},{"name":"currency","required":false,"in":"query","description":"Filtrar por moneda (DOP, USD, EUR)","schema":{"type":"string"}},{"name":"activityId","required":false,"in":"query","description":"Filtrar por ID de actividad","schema":{"type":"number"}},{"name":"includeAnnulled","required":false,"in":"query","description":"Incluir pagos anulados","schema":{"type":"boolean"}},{"name":"sortBy","required":false,"in":"query","description":"Campo para ordenar","schema":{"enum":["amount","date","method","concept"],"type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Dirección de ordenamiento","schema":{"enum":["ASC","DESC"],"type":"string"}},{"name":"dateFrom","required":false,"in":"query","description":"Fecha desde (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Fecha hasta (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"amountMin","required":false,"in":"query","description":"Monto mínimo","schema":{"type":"number"}},{"name":"amountMax","required":false,"in":"query","description":"Monto máximo","schema":{"type":"number"}},{"name":"userId","required":false,"in":"query","description":"Filtrar por usuario cajero (UID)","schema":{"type":"string"}},{"name":"paymentStatus","required":false,"in":"query","description":"Filtrar por estado de pago","schema":{"enum":["PAID","PENDING","PARTIAL","NOT_APPLICABLE"],"type":"string"}},{"name":"participantName","required":false,"in":"query","description":"Buscar por nombre de participante (parcial)","schema":{"type":"string"}}],"responses":{"200":{"description":"Cuadre detallado completo","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetailedSettlementResponseDto"}}}},"404":{"description":"Cuadre no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener cuadre detallado con participantes y conceptos","tags":["Cashflow - Cuadres"]}},"/cashflow/settlements/batch/{batchNumber}/detailed/export":{"get":{"description":"Descarga el cuadre detallado con participantes y conceptos en el formato especificado","operationId":"CashSettlementsController_exportDetailedSettlement","parameters":[{"name":"batchNumber","required":true,"in":"path","description":"Número de lote","schema":{"example":"MLR-2026-001","type":"string"}},{"name":"format","required":false,"in":"query","description":"Formato de exportación","schema":{"enum":["xlsx","pdf","csv"],"type":"string"}},{"name":"paymentMethod","required":false,"in":"query","description":"Filtrar por método de pago","schema":{"enum":["CASH","CREDIT_CARD","DEBIT_CARD","TRANSFER","DEPOSIT","PAYPAL","OTHER"],"type":"string"}},{"name":"currency","required":false,"in":"query","description":"Filtrar por moneda (DOP, USD, EUR)","schema":{"type":"string"}},{"name":"activityId","required":false,"in":"query","description":"Filtrar por ID de actividad","schema":{"type":"number"}},{"name":"includeAnnulled","required":false,"in":"query","description":"Incluir pagos anulados","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Archivo descargado","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{},"application/pdf":{},"text/csv":{}}}},"security":[{"bearer":[]}],"summary":"Exportar cuadre detallado a Excel/PDF/CSV","tags":["Cashflow - Cuadres"]}},"/cashflow/settlements/batch/{batchNumber}/dashboard":{"get":{"description":"Retorna un resumen rápido con KPIs principales: totales, promedios, distribución por método, top actividades y estado de discrepancias.","operationId":"CashSettlementsController_getBatchDashboard","parameters":[{"name":"batchNumber","required":true,"in":"path","description":"Número de lote","schema":{"example":"MLR-2026-001","type":"string"}}],"responses":{"200":{"description":"Dashboard del lote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDashboardDto"}}}},"404":{"description":"Lote no encontrado"}},"security":[{"bearer":[]}],"summary":"Dashboard de KPIs del lote","tags":["Cashflow - Cuadres"]}},"/cashflow/settlements/batch/{batchNumber}/discrepancies":{"get":{"description":"Compara automáticamente los totales calculados vs declarados por moneda y método de pago. Clasifica discrepancias por severidad (OK, WARNING, CRITICAL) y genera recomendaciones.","operationId":"CashSettlementsController_validateDiscrepancies","parameters":[{"name":"batchNumber","required":true,"in":"path","description":"Número de lote","schema":{"example":"MLR-2026-001","type":"string"}}],"responses":{"200":{"description":"Resultado de validación de discrepancias","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscrepancyValidationResponseDto"}}}},"404":{"description":"Cuadre no encontrado"}},"security":[{"bearer":[]}],"summary":"Validar discrepancias del cuadre","tags":["Cashflow - Cuadres"]}},"/cashflow/settlements/batch/{batchNumber}/modify":{"patch":{"description":"Permite modificar manualmente los valores de un cuadre ya aprobado. Esta operación queda registrada en auditoría con firma digital. Solo usuarios con FULL_ACCESS o U_SETTLEMENT_MODIFY pueden realizar esta operación.","operationId":"CashSettlementsController_modifyApprovedSettlement","parameters":[{"name":"batchNumber","required":true,"in":"path","description":"Número de lote","schema":{"example":"MLR-2026-001","type":"string"}}],"responses":{"200":{"description":"Cuadre modificado exitosamente"},"400":{"description":"Datos inválidos o cuadre no aprobado"},"403":{"description":"Sin permisos para modificar cuadres aprobados"},"404":{"description":"Cuadre no encontrado"}},"security":[{"bearer":[]}],"summary":"Modificar cuadre aprobado (solo admins)","tags":["Cashflow - Cuadres"]}},"/cashflow/settlements/batch/{batchNumber}/recalculate":{"post":{"description":"Recalcula los totales de un cuadre aprobado basado en los pagos actuales. Útil si se modificaron pagos después de la aprobación. Esta operación queda registrada en auditoría.","operationId":"CashSettlementsController_recalculateApprovedSettlement","parameters":[{"name":"batchNumber","required":true,"in":"path","description":"Número de lote","schema":{"example":"MLR-2026-001","type":"string"}}],"responses":{"200":{"description":"Cuadre recalculado exitosamente"},"400":{"description":"Cuadre no está aprobado"},"403":{"description":"Sin permisos para recalcular cuadres aprobados"},"404":{"description":"Cuadre no encontrado"}},"security":[{"bearer":[]}],"summary":"Recalcular cuadre aprobado (solo admins)","tags":["Cashflow - Cuadres"]}},"/cashflow/reports/dashboard":{"get":{"description":"Estadísticas del día: lotes abiertos, pendientes, aprobados, ingresos, etc.","operationId":"CashReportsController_getDashboard","parameters":[{"name":"location","required":false,"in":"query","schema":{"example":"MLR","type":"string"}},{"name":"dateFrom","required":false,"in":"query","schema":{"example":"2026-04-01","type":"string"}},{"name":"dateTo","required":false,"in":"query","schema":{"example":"2026-04-30","type":"string"}}],"responses":{"200":{"description":"Estadísticas obtenidas exitosamente"}},"security":[{"bearer":[]}],"summary":"Dashboard en tiempo real","tags":["Cashflow - Reports"]}},"/cashflow/reports/revenue":{"get":{"description":"Ingresos totales, promedio y cantidad de pagos por caja en un período","operationId":"CashReportsController_getCashboxRevenue","parameters":[{"name":"cashboxId","required":true,"in":"query","schema":{"example":"100","type":"string"}},{"name":"dateFrom","required":true,"in":"query","schema":{"example":"2026-01-01","type":"string"}},{"name":"dateTo","required":true,"in":"query","schema":{"example":"2026-01-31","type":"string"}}],"responses":{"200":{"description":"Reporte generado exitosamente"}},"security":[{"bearer":[]}],"summary":"Reporte de ingresos por caja","tags":["Cashflow - Reports"]}},"/cashflow/reports/discrepancies":{"get":{"description":"Identifica usuarios con múltiples discrepancias y las clasifica por severidad","operationId":"CashReportsController_analyzeDiscrepancies","parameters":[{"name":"dateFrom","required":true,"in":"query","schema":{"example":"2026-01-01","type":"string"}},{"name":"dateTo","required":true,"in":"query","schema":{"example":"2026-01-31","type":"string"}},{"name":"minOccurrences","required":false,"in":"query","description":"Mínimo de ocurrencias para incluir en el reporte","schema":{"example":3,"type":"number"}}],"responses":{"200":{"description":"Análisis completado"}},"security":[{"bearer":[]}],"summary":"Análisis de discrepancias recurrentes","tags":["Cashflow - Reports"]}},"/cashflow/reports/batches":{"get":{"description":"Lista completa de lotes con totales, pagos y discrepancias","operationId":"CashReportsController_getBatchesReport","parameters":[{"name":"dateFrom","required":true,"in":"query","schema":{"example":"2026-01-01","type":"string"}},{"name":"dateTo","required":true,"in":"query","schema":{"example":"2026-01-31","type":"string"}},{"name":"cashboxId","required":false,"in":"query","schema":{"example":"100","type":"string"}},{"name":"userId","required":false,"in":"query","schema":{"example":"USR001","type":"string"}}],"responses":{"200":{"description":"Reporte generado"}},"security":[{"bearer":[]}],"summary":"Reporte detallado de lotes","tags":["Cashflow - Reports"]}},"/cashflow/reports/export":{"get":{"description":"Descarga el reporte de lotes en el formato especificado","operationId":"CashReportsController_exportReport","parameters":[{"name":"dateFrom","required":true,"in":"query","schema":{"type":"string"}},{"name":"dateTo","required":true,"in":"query","schema":{"type":"string"}},{"name":"format","required":false,"in":"query","schema":{"enum":["xlsx","pdf","csv"],"type":"string"}},{"name":"cashboxId","required":false,"in":"query","schema":{"type":"string"}},{"name":"userId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Archivo descargado","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{},"application/pdf":{},"text/csv":{}}}},"security":[{"bearer":[]}],"summary":"Exportar reporte a Excel/PDF/CSV","tags":["Cashflow - Reports"]}},"/discounts/validate":{"post":{"operationId":"DiscountsController_validate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyDiscountDto"}}}},"responses":{"200":{"description":"Resultado de la validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscountApplicationResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Validar un código de descuento (sin aplicarlo)","tags":["Discounts"]}},"/discounts/promotions":{"post":{"operationId":"PromotionsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePromotionDto"}}}},"responses":{"201":{"description":"Promoción creada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discount"}}}},"400":{"description":"Datos inválidos"},"409":{"description":"El código ya existe"}},"security":[{"bearer":[]}],"summary":"Crear una nueva promoción","tags":["Promotions"]},"get":{"operationId":"PromotionsController_findAll","parameters":[{"name":"kind","required":false,"in":"query","description":"Filtrar por tipo (promotion/voucher)","schema":{"type":"string","enum":["promotion","voucher"]}},{"name":"status","required":false,"in":"query","description":"Filtrar por estado","schema":{"type":"string","enum":["active","inactive","expired","depleted"]}},{"name":"discountType","required":false,"in":"query","description":"Filtrar por tipo de descuento","schema":{"type":"string","enum":["percent","fixed_amount"]}},{"name":"code","required":false,"in":"query","description":"Buscar por código (parcial)","schema":{"type":"string"}},{"name":"name","required":false,"in":"query","description":"Buscar por nombre (parcial)","schema":{"type":"string"}},{"name":"batchId","required":false,"in":"query","description":"Filtrar por batch ID (vouchers)","schema":{"type":"string"}},{"name":"issuedBy","required":false,"in":"query","description":"Filtrar por emisor (vouchers)","schema":{"type":"string"}},{"name":"issuedTo","required":false,"in":"query","description":"Filtrar por destinatario (vouchers)","schema":{"type":"string"}},{"name":"onlyActive","required":false,"in":"query","description":"Solo vigentes (fecha actual entre start y end)","schema":{"type":"boolean"}},{"name":"createdFrom","required":false,"in":"query","description":"Desde fecha de creación","schema":{"type":"string"}},{"name":"createdTo","required":false,"in":"query","description":"Hasta fecha de creación","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Página","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items por página","schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"Lista de promociones"}},"security":[{"bearer":[]}],"summary":"Listar promociones con filtros","tags":["Promotions"]}},"/discounts/promotions/{id}":{"get":{"operationId":"PromotionsController_findById","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la promoción","schema":{"type":"number"}}],"responses":{"200":{"description":"Promoción encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discount"}}}},"404":{"description":"Promoción no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener una promoción por ID","tags":["Promotions"]},"patch":{"operationId":"PromotionsController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la promoción","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePromotionDto"}}}},"responses":{"200":{"description":"Promoción actualizada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discount"}}}},"404":{"description":"Promoción no encontrada"}},"security":[{"bearer":[]}],"summary":"Actualizar una promoción","tags":["Promotions"]},"delete":{"operationId":"PromotionsController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la promoción","schema":{"type":"number"}}],"responses":{"204":{"description":"Promoción eliminada/desactivada"},"404":{"description":"Promoción no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar o desactivar una promoción","tags":["Promotions"]}},"/discounts/promotions/code/{code}":{"get":{"operationId":"PromotionsController_findByCode","parameters":[{"name":"code","required":true,"in":"path","description":"Código de la promoción","schema":{"type":"string"}}],"responses":{"200":{"description":"Promoción encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discount"}}}},"404":{"description":"Promoción no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener una promoción por código","tags":["Promotions"]}},"/discounts/promotions/{id}/activate":{"patch":{"operationId":"PromotionsController_activate","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la promoción","schema":{"type":"number"}}],"responses":{"200":{"description":"Promoción activada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discount"}}}}},"security":[{"bearer":[]}],"summary":"Activar una promoción","tags":["Promotions"]}},"/discounts/promotions/{id}/deactivate":{"patch":{"operationId":"PromotionsController_deactivate","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la promoción","schema":{"type":"number"}}],"responses":{"200":{"description":"Promoción desactivada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discount"}}}}},"security":[{"bearer":[]}],"summary":"Desactivar una promoción","tags":["Promotions"]}},"/discounts/promotions/{id}/usage":{"get":{"operationId":"PromotionsController_getUsageHistory","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la promoción","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Número de página","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items por página","schema":{"type":"number"}}],"responses":{"200":{"description":"Historial de uso"}},"security":[{"bearer":[]}],"summary":"Obtener historial de uso de una promoción","tags":["Promotions"]}},"/discounts/promotions/{id}/stats":{"get":{"operationId":"PromotionsController_getStats","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la promoción","schema":{"type":"number"}}],"responses":{"200":{"description":"Estadísticas de uso"}},"security":[{"bearer":[]}],"summary":"Obtener estadísticas de una promoción","tags":["Promotions"]}},"/discounts/vouchers":{"post":{"operationId":"VouchersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVoucherDto"}}}},"responses":{"201":{"description":"Voucher creado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discount"}}}},"400":{"description":"Datos inválidos"},"409":{"description":"El código ya existe"}},"security":[{"bearer":[]}],"summary":"Crear un voucher individual","tags":["Vouchers"]},"get":{"operationId":"VouchersController_findAll","parameters":[{"name":"kind","required":false,"in":"query","description":"Filtrar por tipo (promotion/voucher)","schema":{"type":"string","enum":["promotion","voucher"]}},{"name":"status","required":false,"in":"query","description":"Filtrar por estado","schema":{"type":"string","enum":["active","inactive","expired","depleted"]}},{"name":"discountType","required":false,"in":"query","description":"Filtrar por tipo de descuento","schema":{"type":"string","enum":["percent","fixed_amount"]}},{"name":"code","required":false,"in":"query","description":"Buscar por código (parcial)","schema":{"type":"string"}},{"name":"name","required":false,"in":"query","description":"Buscar por nombre (parcial)","schema":{"type":"string"}},{"name":"batchId","required":false,"in":"query","description":"Filtrar por batch ID (vouchers)","schema":{"type":"string"}},{"name":"issuedBy","required":false,"in":"query","description":"Filtrar por emisor (vouchers)","schema":{"type":"string"}},{"name":"issuedTo","required":false,"in":"query","description":"Filtrar por destinatario (vouchers)","schema":{"type":"string"}},{"name":"onlyActive","required":false,"in":"query","description":"Solo vigentes (fecha actual entre start y end)","schema":{"type":"boolean"}},{"name":"createdFrom","required":false,"in":"query","description":"Desde fecha de creación","schema":{"type":"string"}},{"name":"createdTo","required":false,"in":"query","description":"Hasta fecha de creación","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Página","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items por página","schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"Lista de vouchers"}},"security":[{"bearer":[]}],"summary":"Listar vouchers con filtros","tags":["Vouchers"]}},"/discounts/vouchers/batch":{"post":{"operationId":"VouchersController_generateBatch","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateVoucherBatchDto"}}}},"responses":{"201":{"description":"Lote de vouchers generado"},"400":{"description":"Datos inválidos"}},"security":[{"bearer":[]}],"summary":"Generar vouchers en lote","tags":["Vouchers"]}},"/discounts/vouchers/{id}":{"get":{"operationId":"VouchersController_findById","parameters":[{"name":"id","required":true,"in":"path","description":"ID del voucher","schema":{"type":"number"}}],"responses":{"200":{"description":"Voucher encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discount"}}}},"404":{"description":"Voucher no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener un voucher por ID","tags":["Vouchers"]},"patch":{"operationId":"VouchersController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID del voucher","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVoucherDto"}}}},"responses":{"200":{"description":"Voucher actualizado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discount"}}}},"404":{"description":"Voucher no encontrado"}},"security":[{"bearer":[]}],"summary":"Actualizar un voucher","tags":["Vouchers"]},"delete":{"operationId":"VouchersController_cancel","parameters":[{"name":"id","required":true,"in":"path","description":"ID del voucher","schema":{"type":"number"}}],"responses":{"200":{"description":"Voucher cancelado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discount"}}}},"404":{"description":"Voucher no encontrado"}},"security":[{"bearer":[]}],"summary":"Cancelar un voucher","tags":["Vouchers"]}},"/discounts/vouchers/code/{code}":{"get":{"operationId":"VouchersController_findByCode","parameters":[{"name":"code","required":true,"in":"path","description":"Código del voucher","schema":{"type":"string"}}],"responses":{"200":{"description":"Voucher encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discount"}}}},"404":{"description":"Voucher no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener un voucher por código","tags":["Vouchers"]}},"/discounts/vouchers/batch/{batchId}":{"get":{"operationId":"VouchersController_findByBatch","parameters":[{"name":"batchId","required":true,"in":"path","description":"ID del batch","schema":{"type":"string"}}],"responses":{"200":{"description":"Vouchers del batch"}},"security":[{"bearer":[]}],"summary":"Obtener vouchers de un batch","tags":["Vouchers"]},"delete":{"operationId":"VouchersController_cancelBatch","parameters":[{"name":"batchId","required":true,"in":"path","description":"ID del batch","schema":{"type":"string"}}],"responses":{"200":{"description":"Vouchers del batch cancelados"}},"security":[{"bearer":[]}],"summary":"Cancelar todos los vouchers de un batch","tags":["Vouchers"]}},"/discounts/vouchers/batch/{batchId}/summary":{"get":{"operationId":"VouchersController_getBatchSummary","parameters":[{"name":"batchId","required":true,"in":"path","description":"ID del batch","schema":{"type":"string"}}],"responses":{"200":{"description":"Resumen del batch"}},"security":[{"bearer":[]}],"summary":"Obtener resumen de un batch","tags":["Vouchers"]}},"/discounts/vouchers/{id}/usage":{"get":{"operationId":"VouchersController_getUsageHistory","parameters":[{"name":"id","required":true,"in":"path","description":"ID del voucher","schema":{"type":"number"}}],"responses":{"200":{"description":"Historial de uso"}},"security":[{"bearer":[]}],"summary":"Obtener historial de uso de un voucher","tags":["Vouchers"]}},"/schooling/formations":{"post":{"operationId":"FormationsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFormationDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Create a new academic formation","tags":["Schooling - Formations"]},"get":{"operationId":"FormationsController_findAll","parameters":[{"name":"search","required":false,"in":"query","description":"Búsqueda por nombre de formación","schema":{"example":"ingenieria","type":"string"}},{"name":"studyType","required":false,"in":"query","description":"Filtrar por tipo de estudio","schema":{"example":"UNIVERSITARIA","type":"string","enum":["PRIMARIA","SECUNDARIA","TECNICO UNIVERSITARIO","TECNICO NO UNIVERSITARIO","TECNOLOGICA","INGENIERIA","UNIVERSITARIO","ESPECIALIZACION","MAESTRIA","DOCTORADO"]}},{"name":"isActive","required":false,"in":"query","description":"Filtrar por estado activo/inactivo","schema":{"example":true,"type":"boolean"}},{"name":"page","required":false,"in":"query","description":"Número de página","schema":{"minimum":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Cantidad de elementos por página","schema":{"minimum":1,"maximum":100,"example":10,"type":"number"}},{"name":"select","required":false,"in":"query","description":"Columnas específicas a devolver (separadas por coma)","schema":{"example":"codigo,nombreFormacion,tipoEstudio","type":"string"}},{"name":"activo","required":false,"in":"query","schema":{}},{"name":"tipoEstudio","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get all academic formations with filters and pagination","tags":["Schooling - Formations"]}},"/schooling/formations/statistics":{"get":{"operationId":"FormationsController_getStatistics","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get formations statistics","tags":["Schooling - Formations"]}},"/schooling/formations/{code}":{"get":{"operationId":"FormationsController_findByCode","parameters":[{"name":"code","required":true,"in":"path","description":"Formation code","schema":{"type":"integer"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get academic formation by code","tags":["Schooling - Formations"]},"put":{"operationId":"FormationsController_update","parameters":[{"name":"code","required":true,"in":"path","description":"Formation code","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFormationDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Update academic formation by code","tags":["Schooling - Formations"]},"delete":{"operationId":"FormationsController_remove","parameters":[{"name":"code","required":true,"in":"path","description":"Formation code","schema":{"type":"integer"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Delete academic formation (hard delete - restricted)","tags":["Schooling - Formations"]}},"/schooling/formations/{code}/deactivate":{"patch":{"operationId":"FormationsController_deactivate","parameters":[{"name":"code","required":true,"in":"path","description":"Formation code","schema":{"type":"integer"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Deactivate academic formation (soft delete)","tags":["Schooling - Formations"]}},"/schooling/formations/member/{memberId}":{"get":{"operationId":"FormationsController_findByMember","parameters":[{"name":"memberId","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Obtener todas las formaciones de un miembro","tags":["Schooling - Formations"]}},"/schooling/formations/assign":{"post":{"operationId":"FormationsController_assignToMember","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignFormationDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Asignar una formación a un miembro","tags":["Schooling - Formations"]}},"/schooling/formations/member/{memberId}/formation/{formationId}":{"patch":{"operationId":"FormationsController_updateMemberFormation","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"number"}},{"name":"formationId","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberFormationDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Actualizar la relación formación-miembro","tags":["Schooling - Formations"]},"delete":{"operationId":"FormationsController_removeFromMember","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"number"}},{"name":"formationId","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Remover una formación de un miembro","tags":["Schooling - Formations"]}},"/schooling/formations/member/{memberId}/primary":{"get":{"operationId":"FormationsController_getPrimaryFormation","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Obtener la formación principal de un miembro","tags":["Schooling - Formations"]}},"/schooling/trades":{"post":{"operationId":"TradesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTradeDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Create a new trade/occupation","tags":["Schooling - Trades"]},"get":{"operationId":"TradesController_findAll","parameters":[{"name":"search","required":false,"in":"query","description":"Búsqueda por nombre del oficio","schema":{"example":"ingeniero","type":"string"}},{"name":"isActive","required":false,"in":"query","description":"Filtrar por estado activo/inactivo","schema":{"example":true,"type":"boolean"}},{"name":"page","required":false,"in":"query","description":"Número de página","schema":{"minimum":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Cantidad de elementos por página","schema":{"minimum":1,"maximum":100,"example":10,"type":"number"}},{"name":"select","required":false,"in":"query","description":"Columnas específicas a devolver (separadas por coma)","schema":{"example":"code,name","type":"string"}},{"name":"activo","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get all trades with filters and pagination","tags":["Schooling - Trades"]}},"/schooling/trades/statistics":{"get":{"operationId":"TradesController_getStatistics","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get trades statistics","tags":["Schooling - Trades"]}},"/schooling/trades/{code}":{"get":{"operationId":"TradesController_findByCode","parameters":[{"name":"code","required":true,"in":"path","description":"Trade code","schema":{"type":"integer"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get trade by code","tags":["Schooling - Trades"]},"put":{"operationId":"TradesController_update","parameters":[{"name":"code","required":true,"in":"path","description":"Trade code","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTradeDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Update trade by code","tags":["Schooling - Trades"]},"delete":{"operationId":"TradesController_remove","parameters":[{"name":"code","required":true,"in":"path","description":"Trade code","schema":{"type":"integer"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Delete trade (hard delete - restricted)","tags":["Schooling - Trades"]}},"/schooling/trades/{code}/deactivate":{"patch":{"operationId":"TradesController_deactivate","parameters":[{"name":"code","required":true,"in":"path","description":"Trade code","schema":{"type":"integer"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Deactivate trade (soft delete)","tags":["Schooling - Trades"]}},"/schooling/trades/member/{memberId}":{"get":{"operationId":"TradesController_findByMember","parameters":[{"name":"memberId","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get all trades for a specific member","tags":["Schooling - Trades"]}},"/schooling/trades/assign":{"post":{"operationId":"TradesController_assignToMember","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignTradeDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Assign trade to member","tags":["Schooling - Trades"]}},"/schooling/trades/member/{memberId}/trade/{tradeId}":{"patch":{"operationId":"TradesController_updateMemberTrade","parameters":[{"name":"memberId","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}},{"name":"tradeId","required":true,"in":"path","description":"Trade ID (code)","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberTradeDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Update member-trade relationship","tags":["Schooling - Trades"]},"delete":{"operationId":"TradesController_removeFromMember","parameters":[{"name":"memberId","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}},{"name":"tradeId","required":true,"in":"path","description":"Trade ID (code)","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Remove trade from member","tags":["Schooling - Trades"]}},"/schooling/trades/member/{memberId}/primary":{"get":{"operationId":"TradesController_getPrimaryTrade","parameters":[{"name":"memberId","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get primary trade for a member","tags":["Schooling - Trades"]}},"/schooling/knowledge-areas":{"post":{"operationId":"KnowledgeAreasController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKnowledgeAreaDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear nueva área de conocimiento","tags":["Knowledge Areas"]},"get":{"operationId":"KnowledgeAreasController_findAll","parameters":[{"name":"search","required":false,"in":"query","description":"Búsqueda por nombre","schema":{"example":"ingenieria","type":"string"}},{"name":"isActive","required":false,"in":"query","description":"Filtrar por estado activo","schema":{"example":true,"type":"boolean"}},{"name":"ids","required":false,"in":"query","description":"Comma-separated IDs","schema":{"example":"1,2,3","type":"string"}},{"name":"page","required":false,"in":"query","description":"Número de página","schema":{"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Cantidad de registros por página","schema":{"default":20,"example":20,"type":"number"}},{"name":"select","required":false,"in":"query","description":"Campos a seleccionar (separados por comas)","schema":{"example":"code,name","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar todas las áreas de conocimiento","tags":["Knowledge Areas"]}},"/schooling/knowledge-areas/statistics":{"get":{"operationId":"KnowledgeAreasController_getStatistics","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtener estadísticas de áreas de conocimiento","tags":["Knowledge Areas"]}},"/schooling/knowledge-areas/{code}":{"get":{"operationId":"KnowledgeAreasController_findOne","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtener área de conocimiento por código","tags":["Knowledge Areas"]},"put":{"operationId":"KnowledgeAreasController_update","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKnowledgeAreaDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualizar área de conocimiento","tags":["Knowledge Areas"]},"delete":{"operationId":"KnowledgeAreasController_remove","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Eliminar área de conocimiento (hard delete - restricted)","tags":["Knowledge Areas"]}},"/schooling/knowledge-areas/{code}/deactivate":{"patch":{"operationId":"KnowledgeAreasController_deactivate","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Desactivar área de conocimiento (soft delete)","tags":["Knowledge Areas"]}},"/schooling/knowledge-areas/member/{memberId}":{"get":{"operationId":"KnowledgeAreasController_findByMember","parameters":[{"name":"memberId","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Obtener todas las áreas de conocimiento de un miembro","tags":["Knowledge Areas"]}},"/schooling/knowledge-areas/assign":{"post":{"operationId":"KnowledgeAreasController_assignToMember","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignKnowledgeAreaDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Asignar un área de conocimiento a un miembro","tags":["Knowledge Areas"]}},"/schooling/knowledge-areas/member/{memberId}/area/{areaCode}":{"patch":{"operationId":"KnowledgeAreasController_updateMemberKnowledgeArea","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"number"}},{"name":"areaCode","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberKnowledgeAreaDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualizar la relación área de conocimiento-miembro","tags":["Knowledge Areas"]},"delete":{"operationId":"KnowledgeAreasController_removeFromMember","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"number"}},{"name":"areaCode","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Remover un área de conocimiento de un miembro","tags":["Knowledge Areas"]}},"/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":"User logged in successfully","content":{"application/json":{"schema":{"type":"object","properties":{"access_token":{"type":"string"},"refresh_token":{"type":"string"},"token_type":{"type":"string","example":"bearer"},"expires_in":{"type":"string"},"user":{"type":"object","properties":{"uid":{"type":"string"},"username":{"type":"string"},"name":{"type":"string"},"lastname":{"type":"string"},"email":{"type":"string"},"profileCode":{"type":"number"},"location":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}}}}}}}}},"401":{"description":"Unauthorized"}},"summary":"User login","tags":["Authentication"]}},"/auth/register":{"post":{"operationId":"AuthController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserDto"}}}},"responses":{"201":{"description":"User registered successfully (awaiting activation)"},"400":{"description":"Bad Request"},"409":{"description":"Conflict - Username or email already exists"}},"summary":"User registration (public)","tags":["Authentication"]}},"/auth/refresh":{"post":{"operationId":"AuthController_refresh","parameters":[],"responses":{"200":{"description":"Token refreshed successfully"},"401":{"description":"Invalid refresh token"}},"summary":"Refresh access token","tags":["Authentication"]}},"/auth/logout":{"post":{"operationId":"AuthController_logout","parameters":[],"responses":{"200":{"description":"User logged out successfully"}},"security":[{"JWT":[]}],"summary":"User logout","tags":["Authentication"]}},"/auth/me":{"post":{"operationId":"AuthController_getProfile","parameters":[],"responses":{"200":{"description":"Current user information"}},"security":[{"JWT":[]}],"summary":"Get current user information","tags":["Authentication"]}},"/auth/validate-token":{"post":{"operationId":"AuthController_validateToken","parameters":[],"responses":{"200":{"description":"Token is valid"},"401":{"description":"Invalid token"}},"security":[{"JWT":[]}],"summary":"Validate current token","tags":["Authentication"]}},"/auth/forgot-password":{"post":{"operationId":"AuthController_forgotPassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordDto"}}}},"responses":{"200":{"description":"If the email exists, a reset link will be sent"}},"summary":"Request password reset email","tags":["Authentication"]}},"/auth/validate-reset-token":{"get":{"operationId":"AuthController_validateResetToken","parameters":[{"name":"token","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Token validation result"}},"summary":"Validate password reset token","tags":["Authentication"]}},"/auth/reset-password":{"post":{"operationId":"AuthController_resetPassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordDto"}}}},"responses":{"200":{"description":"Password reset successful"},"400":{"description":"Passwords do not match"},"401":{"description":"Invalid or expired token"}},"summary":"Reset password with token","tags":["Authentication"]}},"/emails":{"post":{"operationId":"EmailsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEmailDto"}}}},"responses":{"201":{"description":"Email record created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}}}},"security":[{"bearer":[]}],"summary":"Create a new email record","tags":["Emails"]},"get":{"operationId":"EmailsController_findAll","parameters":[{"name":"status","required":false,"in":"query","schema":{"enum":["draft","pending","sent","cancelled"],"type":"string"}},{"name":"type","required":false,"in":"query","schema":{"enum":["transactional","marketing","notification","system"],"type":"string"}},{"name":"deliveryStatus","required":false,"in":"query","schema":{"enum":["pending","sent","delivered","failed","bounced","rejected"],"type":"string"}},{"name":"recipient","required":false,"in":"query","schema":{"type":"string"}},{"name":"dateFrom","required":false,"in":"query","schema":{"format":"date-time","type":"string"}},{"name":"dateTo","required":false,"in":"query","schema":{"format":"date-time","type":"string"}},{"name":"templateId","required":false,"in":"query","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page (default: 20)","schema":{"type":"number"}}],"responses":{"200":{"description":"Emails retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get all emails","tags":["Emails"]}},"/emails/send":{"post":{"operationId":"EmailsController_sendEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmailDto"}}}},"responses":{"201":{"description":"Email sent successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}}},"400":{"description":"Invalid email data"}},"security":[{"bearer":[]}],"summary":"Send email directly","tags":["Emails"]}},"/emails/send/template":{"post":{"operationId":"EmailsController_sendTemplateEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendTemplateEmailDto"}}}},"responses":{"201":{"description":"Template email sent successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}}},"400":{"description":"Template validation failed"},"404":{"description":"Template not found"}},"security":[{"bearer":[]}],"summary":"Send email using template","tags":["Emails"]}},"/emails/send/bulk":{"post":{"operationId":"EmailsController_bulkSendEmails","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSendEmailDto"}}}},"responses":{"201":{"description":"Bulk emails processing completed","content":{"application/json":{"schema":{"type":"object","properties":{"successful":{"type":"array","items":{"$ref":"#/components/schemas/Email"}},"failed":{"type":"array","items":{"type":"object","properties":{"recipient":{"type":"object"},"error":{"type":"string"}}}},"summary":{"type":"object","properties":{"total":{"type":"number"},"sent":{"type":"number"},"failed":{"type":"number"}}}}}}}}},"security":[{"bearer":[]}],"summary":"Send bulk emails","tags":["Emails"]}},"/emails/metrics":{"get":{"operationId":"EmailsController_getMetrics","parameters":[{"name":"dateFrom","required":false,"in":"query","schema":{"format":"date-time","type":"string"}},{"name":"dateTo","required":false,"in":"query","schema":{"format":"date-time","type":"string"}},{"name":"type","required":false,"in":"query","schema":{"enum":["transactional","marketing","notification","system"],"type":"string"}}],"responses":{"200":{"description":"Email metrics retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"totalSent":{"type":"number"},"totalDelivered":{"type":"number"},"totalFailed":{"type":"number"},"totalPending":{"type":"number"},"deliveryRate":{"type":"number"},"failureRate":{"type":"number"}}}}}}},"security":[{"bearer":[]}],"summary":"Get email metrics","tags":["Emails"]}},"/emails/statistics/{period}":{"get":{"operationId":"EmailsController_getStatistics","parameters":[{"name":"period","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Email statistics retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get email statistics by period","tags":["Emails"]}},"/emails/{id}":{"get":{"operationId":"EmailsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Email retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}}},"404":{"description":"Email not found"}},"security":[{"bearer":[]}],"summary":"Get email by ID","tags":["Emails"]},"patch":{"operationId":"EmailsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEmailDto"}}}},"responses":{"200":{"description":"Email updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}}},"404":{"description":"Email not found"}},"security":[{"bearer":[]}],"summary":"Update email","tags":["Emails"]},"delete":{"operationId":"EmailsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Email deleted successfully"},"400":{"description":"Cannot delete sent emails"},"404":{"description":"Email not found"}},"security":[{"bearer":[]}],"summary":"Delete email","tags":["Emails"]}},"/emails/{id}/send-now":{"post":{"operationId":"EmailsController_sendEmailNow","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Email sent successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}}},"400":{"description":"Cannot send emails that are already sent or cancelled"},"404":{"description":"Email not found"}},"security":[{"bearer":[]}],"summary":"Send pending email immediately (manual trigger)","tags":["Emails"]}},"/emails/{id}/cancel":{"post":{"operationId":"EmailsController_cancelEmail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Email cancelled successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}}},"400":{"description":"Cannot cancel sent or already cancelled emails"},"404":{"description":"Email not found"}},"security":[{"bearer":[]}],"summary":"Cancel pending or scheduled email","tags":["Emails"]}},"/emails/{id}/resend":{"post":{"operationId":"EmailsController_resendEmail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Email resent successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}}},"400":{"description":"Can only resend failed emails"},"404":{"description":"Email not found"}},"security":[{"bearer":[]}],"summary":"Resend failed email","tags":["Emails"]}},"/emails/process-scheduled":{"post":{"operationId":"EmailsController_processScheduledEmails","parameters":[],"responses":{"200":{"description":"Scheduled emails processed","content":{"application/json":{"schema":{"type":"object","properties":{"processed":{"type":"number"},"failed":{"type":"number"}}}}}}},"security":[{"bearer":[]}],"summary":"Process scheduled emails (Admin/System only)","tags":["Emails"]}},"/emails/connection/test":{"get":{"operationId":"EmailsController_testConnection","parameters":[],"responses":{"200":{"description":"Connection test completed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}}},"security":[{"bearer":[]}],"summary":"Test email connection","tags":["Emails"]}},"/email-templates":{"post":{"operationId":"EmailTemplatesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEmailTemplateDto"}}}},"responses":{"201":{"description":"Email template created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplate"}}}},"409":{"description":"Template code already exists"}},"security":[{"bearer":[]}],"summary":"Create a new email template","tags":["Email Templates"]},"get":{"operationId":"EmailTemplatesController_findAll","parameters":[{"name":"type","required":false,"in":"query","schema":{"enum":["transactional","marketing","notification","system"],"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"enum":["active","inactive","draft"],"type":"string"}},{"name":"category","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"isDefault","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"language","required":false,"in":"query","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page (default: 20)","schema":{"type":"number"}}],"responses":{"200":{"description":"Email templates retrieved successfully"}},"security":[{"bearer":[]}],"summary":"Get all email templates","tags":["Email Templates"]}},"/email-templates/categories":{"get":{"operationId":"EmailTemplatesController_getCategories","parameters":[],"responses":{"200":{"description":"Template categories retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}}},"security":[{"bearer":[]}],"summary":"Get all template categories","tags":["Email Templates"]}},"/email-templates/default/{type}":{"get":{"operationId":"EmailTemplatesController_getDefaultTemplate","parameters":[{"name":"type","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Default template retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplate"}}}},"404":{"description":"Default template not found for this type"}},"security":[{"bearer":[]}],"summary":"Get default template for a specific type","tags":["Email Templates"]}},"/email-templates/code/{code}":{"get":{"operationId":"EmailTemplatesController_findByCode","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Template retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplate"}}}},"404":{"description":"Template not found"}},"security":[{"bearer":[]}],"summary":"Get template by code","tags":["Email Templates"]}},"/email-templates/{id}":{"get":{"operationId":"EmailTemplatesController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Email template retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplate"}}}},"404":{"description":"Email template not found"}},"security":[{"bearer":[]}],"summary":"Get email template by ID","tags":["Email Templates"]},"patch":{"operationId":"EmailTemplatesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEmailTemplateDto"}}}},"responses":{"200":{"description":"Email template updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplate"}}}},"404":{"description":"Email template not found"},"409":{"description":"Template code already exists"}},"security":[{"bearer":[]}],"summary":"Update email template","tags":["Email Templates"]},"delete":{"operationId":"EmailTemplatesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Email template deactivated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplate"}}}},"400":{"description":"Cannot delete default template"},"404":{"description":"Email template not found"}},"security":[{"bearer":[]}],"summary":"Delete (deactivate) email template","tags":["Email Templates"]}},"/email-templates/{id}/clone":{"post":{"operationId":"EmailTemplatesController_clone","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":"Template cloned successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplate"}}}},"404":{"description":"Source template not found"},"409":{"description":"New template code already exists"}},"security":[{"bearer":[]}],"summary":"Clone an existing template","tags":["Email Templates"]}},"/email-templates/{id}/render":{"post":{"operationId":"EmailTemplatesController_renderTemplate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Template rendered successfully","content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":"string"},"bodyHtml":{"type":"string"},"bodyText":{"type":"string"}}}}}},"404":{"description":"Template not found"}},"security":[{"bearer":[]}],"summary":"Preview template rendering with variables","tags":["Email Templates"]}},"/email-templates/{id}/validate":{"post":{"operationId":"EmailTemplatesController_validateTemplate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Template validation completed","content":{"application/json":{"schema":{"type":"object","properties":{"isValid":{"type":"boolean"},"missingVariables":{"type":"array","items":{"type":"string"}},"invalidVariables":{"type":"array","items":{"type":"string"}}}}}}},"404":{"description":"Template not found"}},"security":[{"bearer":[]}],"summary":"Validate template variables","tags":["Email Templates"]}},"/email-templates/seed-defaults":{"post":{"operationId":"EmailTemplatesController_seedDefaultTemplates","parameters":[],"responses":{"200":{"description":"Default templates seeded successfully"}},"security":[{"bearer":[]}],"summary":"Seed default templates (Admin only)","tags":["Email Templates"]}},"/harvests":{"get":{"operationId":"HarvestsController_getHarvests","parameters":[{"name":"select","required":false,"in":"query","description":"Columnas especificas a retornar (separadas por coma). Usar nombres de propiedades de la entidad.","schema":{"example":"id,firstName,lastName,email,status","type":"string"}},{"name":"number","required":false,"in":"query","description":"Number filter","schema":{"type":"string"}},{"name":"name","required":false,"in":"query","description":"Name filter","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Status filter","schema":{"enum":["ABIERTA","CERRADA"],"type":"string"}},{"name":"location","required":false,"in":"query","description":"Location filter","schema":{"type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"enum":["ASC","DESC"],"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Sort field","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","description":"Search term","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"number"}}],"responses":{"200":{"description":"Harvests retrieved successfully"},"403":{"description":"Forbidden"}},"security":[{"JWT":[]}],"summary":"Get harvests with pagination, filters and search","tags":["Harvests"]},"post":{"operationId":"HarvestsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHarvestDto"}}}},"responses":{"201":{"description":"Harvest created successfully"},"400":{"description":"Bad Request"},"409":{"description":"Conflict - Number already exists"}},"security":[{"JWT":[]}],"summary":"Create new harvest","tags":["Harvests"]}},"/harvests/search":{"get":{"operationId":"HarvestsController_searchHarvests","parameters":[{"name":"q","required":true,"in":"query","description":"Search term","schema":{"type":"string"}},{"name":"church","required":false,"in":"query","description":"Church code (if not provided, uses user's church)","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Max results","schema":{"type":"number"}}],"responses":{"200":{"description":"Search results"}},"security":[{"JWT":[]}],"summary":"Search harvests by number or name (for autocomplete)","tags":["Harvests"]}},"/harvests/statistics":{"get":{"operationId":"HarvestsController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistics retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get harvest statistics","tags":["Harvests"]}},"/harvests/available-members":{"get":{"operationId":"HarvestsController_getAvailableMembers","parameters":[{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"type":"number"}}],"responses":{"200":{"description":"Available members retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get available members for harvest assignment","tags":["Harvests"]}},"/harvests/{id}":{"get":{"operationId":"HarvestsController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"Harvest ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Harvest found"},"404":{"description":"Harvest not found"}},"security":[{"JWT":[]}],"summary":"Get harvest by ID","tags":["Harvests"]},"put":{"operationId":"HarvestsController_update","parameters":[{"name":"id","required":true,"in":"path","description":"Harvest ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHarvestDto"}}}},"responses":{"200":{"description":"Harvest updated successfully"},"403":{"description":"Forbidden"},"404":{"description":"Harvest not found"}},"security":[{"JWT":[]}],"summary":"Update harvest","tags":["Harvests"]},"delete":{"operationId":"HarvestsController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"Harvest ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Harvest deleted successfully"},"403":{"description":"Forbidden"},"404":{"description":"Harvest not found"}},"security":[{"JWT":[]}],"summary":"Delete harvest","tags":["Harvests"]}},"/harvests/by-number/{number}":{"get":{"operationId":"HarvestsController_findByNumber","parameters":[{"name":"number","required":true,"in":"path","description":"Harvest number","schema":{"type":"string"}}],"responses":{"200":{"description":"Harvest found"},"404":{"description":"Harvest not found"}},"security":[{"JWT":[]}],"summary":"Get harvest by number","tags":["Harvests"]}},"/harvests/{id}/members":{"get":{"operationId":"HarvestsController_getHarvestMembers","parameters":[{"name":"id","required":true,"in":"path","description":"Harvest ID","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"type":"number"}},{"name":"source","required":false,"in":"query","description":"Origen de datos. Por defecto: maestro_r1 si la cosecha está abierta, maestro_miembros si está cerrada.","schema":{"enum":["new_believers","members"],"type":"string"}},{"name":"refresh","required":false,"in":"query","description":"Bypass cache and reload members","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Harvest members retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get harvest members","tags":["Harvests"]},"post":{"operationId":"HarvestsController_addMemberToHarvest","parameters":[{"name":"id","required":true,"in":"path","description":"Harvest ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberToHarvestDto"}}}},"responses":{"201":{"description":"Member added to harvest successfully"},"400":{"description":"Bad Request"},"409":{"description":"Conflict - Member already in another harvest"}},"security":[{"JWT":[]}],"summary":"Add member to harvest","tags":["Harvests"]}},"/harvests/{id}/close":{"post":{"operationId":"HarvestsController_closeHarvest","parameters":[{"name":"id","required":true,"in":"path","description":"Harvest ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Harvest closed successfully"},"400":{"description":"Bad Request - Already closed"}},"security":[{"JWT":[]}],"summary":"Close harvest - moves members to main table","tags":["Harvests"]}},"/harvests/{id}/members/multiple":{"post":{"operationId":"HarvestsController_addMultipleMembersToHarvest","parameters":[{"name":"id","required":true,"in":"path","description":"Harvest ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMultipleMembersToHarvestDto"}}}},"responses":{"201":{"description":"Members added to harvest"}},"security":[{"JWT":[]}],"summary":"Add multiple members to harvest","tags":["Harvests"]}},"/harvests/{id}/members/{memberId}":{"put":{"operationId":"HarvestsController_updateHarvestMember","parameters":[{"name":"id","required":true,"in":"path","description":"Harvest ID","schema":{"type":"number"}},{"name":"memberId","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHarvestMemberDto"}}}},"responses":{"200":{"description":"Harvest member updated successfully"}},"security":[{"JWT":[]}],"summary":"Update harvest member","tags":["Harvests"]},"delete":{"operationId":"HarvestsController_removeMemberFromHarvest","parameters":[{"name":"id","required":true,"in":"path","description":"Harvest ID","schema":{"type":"number"}},{"name":"memberId","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Member removed from harvest successfully"}},"security":[{"JWT":[]}],"summary":"Remove member from harvest","tags":["Harvests"]}},"/harvests/export/csv":{"get":{"operationId":"HarvestsController_exportToCsv","parameters":[{"name":"select","required":false,"in":"query","description":"Columnas especificas a retornar (separadas por coma). Usar nombres de propiedades de la entidad.","schema":{"example":"id,firstName,lastName,email,status","type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"church","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"CSV data"}},"security":[{"JWT":[]}],"summary":"Export harvests to CSV","tags":["Harvests"]}},"/harvests/reports/summary":{"get":{"operationId":"HarvestsController_getComprehensiveReport","parameters":[],"responses":{"200":{"description":"Report data retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get comprehensive harvest report","tags":["Harvests"]}},"/ministries":{"post":{"operationId":"MinistriesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMinistryDto"}}}},"responses":{"201":{"description":"Ministry created successfully"},"400":{"description":"Bad request"},"409":{"description":"Ministry name already exists"}},"security":[{"JWT":[]}],"summary":"Create a new ministry","tags":["Ministries"]},"get":{"operationId":"MinistriesController_findAll","parameters":[{"name":"includeMembers","required":false,"in":"query","description":"Include members","schema":{"type":"boolean"}},{"name":"includeGroups","required":false,"in":"query","description":"Include groups","schema":{"type":"boolean"}},{"name":"leaderId","required":false,"in":"query","description":"Filter by leader ID","schema":{"type":"number"}},{"name":"location","required":false,"in":"query","description":"Filter by location","schema":{"type":"string"}},{"name":"name","required":false,"in":"query","description":"Filter by name","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"number"}}],"responses":{"200":{"description":"Ministries retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get all ministries with filtering and pagination","tags":["Ministries"]}},"/ministries/search":{"get":{"operationId":"MinistriesController_search","parameters":[{"name":"q","required":true,"in":"query","description":"Search term","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"type":"number"}},{"name":"includeGroups","required":false,"in":"query","description":"Include groups","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Search results retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Search ministries by term","tags":["Ministries"]}},"/ministries/statistics":{"get":{"operationId":"MinistriesController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistics retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get ministry statistics","tags":["Ministries"]}},"/ministries/location/{location}":{"get":{"operationId":"MinistriesController_findByLocation","parameters":[{"name":"location","required":true,"in":"path","description":"Location code (e.g., MLR, BOG)","schema":{"type":"string"}}],"responses":{"200":{"description":"Ministries by location retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get ministries by location","tags":["Ministries"]}},"/ministries/export/csv":{"get":{"operationId":"MinistriesController_exportToCSV","parameters":[{"name":"name","required":false,"in":"query","description":"Filter by ministry name","schema":{"example":"Jóvenes","type":"string"}},{"name":"location","required":false,"in":"query","description":"Filter by location","schema":{"example":"MLR","type":"string"}},{"name":"leaderId","required":false,"in":"query","description":"Filter by leader ID","schema":{"example":123,"type":"number"}},{"name":"minActiveMembers","required":false,"in":"query","description":"Minimum number of active members","schema":{"example":10,"type":"number"}},{"name":"maxActiveMembers","required":false,"in":"query","description":"Maximum number of active members","schema":{"example":100,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search term for name or description","schema":{"example":"ministerio","type":"string"}},{"name":"includeGroups","required":false,"in":"query","description":"Include groups in the response","schema":{"default":false,"example":true,"type":"boolean"}},{"name":"includeMembers","required":false,"in":"query","description":"Include members in the response","schema":{"default":false,"example":true,"type":"boolean"}},{"name":"sortBy","required":false,"in":"query","description":"Sort by field","schema":{"default":"id","example":"name","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"default":"DESC","example":"ASC","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number for pagination","schema":{"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page","schema":{"default":10,"example":10,"type":"number"}},{"name":"select","required":false,"in":"query","description":"Columnas especificas a retornar (separadas por coma)","schema":{"example":"id,name,location,activeMembers","type":"string"}}],"responses":{"200":{"description":"CSV data retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Export ministries to CSV format","tags":["Ministries"]}},"/ministries/{id}":{"get":{"operationId":"MinistriesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"Ministry ID","schema":{"type":"number"}},{"name":"includeGroups","required":false,"in":"query","description":"Include groups","schema":{"type":"boolean"}},{"name":"includeMembers","required":false,"in":"query","description":"Include members","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Ministry retrieved successfully"},"404":{"description":"Ministry not found"}},"security":[{"JWT":[]}],"summary":"Get ministry by ID","tags":["Ministries"]},"patch":{"operationId":"MinistriesController_update","parameters":[{"name":"id","required":true,"in":"path","description":"Ministry ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMinistryDto"}}}},"responses":{"200":{"description":"Ministry updated successfully"},"404":{"description":"Ministry not found"},"409":{"description":"Ministry name already exists"}},"security":[{"JWT":[]}],"summary":"Update ministry","tags":["Ministries"]},"delete":{"operationId":"MinistriesController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"Ministry ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Ministry deleted successfully"},"400":{"description":"Cannot delete ministry with existing groups or members"},"404":{"description":"Ministry not found"}},"security":[{"JWT":[]}],"summary":"Delete ministry","tags":["Ministries"]}},"/ministries/{id}/reports/summary":{"get":{"operationId":"MinistriesController_getSummaryReport","parameters":[{"name":"id","required":true,"in":"path","description":"Ministry ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Summary report retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get ministry summary report","tags":["Ministries"]}},"/ministry-groups":{"post":{"operationId":"MinistryGroupsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMinistryGroupDto"}}}},"responses":{"201":{"description":"Ministry group created successfully"},"400":{"description":"Bad request"},"409":{"description":"Group name already exists in ministry"}},"security":[{"JWT":[]}],"summary":"Create a new ministry group","tags":["Ministry Groups"]},"get":{"operationId":"MinistryGroupsController_findAll","parameters":[{"name":"ministryId","required":false,"in":"query","description":"Filter by ministry ID","schema":{"example":1,"type":"number"}},{"name":"name","required":false,"in":"query","description":"Filter by group name","schema":{"example":"Alabanza","type":"string"}},{"name":"leaderId","required":false,"in":"query","description":"Filter by leader ID","schema":{"example":123,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search term for group name or description","schema":{"example":"alabanza","type":"string"}},{"name":"includeMinistry","required":false,"in":"query","description":"Include ministry info","schema":{"default":false,"example":true,"type":"boolean"}},{"name":"includeMembers","required":false,"in":"query","description":"Include members","schema":{"default":false,"example":true,"type":"boolean"}},{"name":"sortBy","required":false,"in":"query","description":"Sort by field","schema":{"default":"id","example":"groupName","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"default":"DESC","example":"ASC","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"default":10,"example":10,"type":"number"}},{"name":"groupName","required":false,"in":"query","description":"Filter by group name","schema":{"type":"string"}}],"responses":{"200":{"description":"Ministry groups retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get all ministry groups with filtering and pagination","tags":["Ministry Groups"]}},"/ministry-groups/search":{"get":{"operationId":"MinistryGroupsController_search","parameters":[{"name":"q","required":true,"in":"query","description":"Search term","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"type":"number"}},{"name":"ministryId","required":false,"in":"query","description":"Filter by ministry ID","schema":{"type":"number"}},{"name":"includeMinistry","required":false,"in":"query","description":"Include ministry info","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Search results retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Search ministry groups by term","tags":["Ministry Groups"]}},"/ministry-groups/statistics":{"get":{"operationId":"MinistryGroupsController_getStatistics","parameters":[{"name":"ministryId","required":false,"in":"query","description":"Filter by ministry ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Statistics retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get ministry groups statistics","tags":["Ministry Groups"]}},"/ministry-groups/by-ministry/{ministryId}":{"get":{"operationId":"MinistryGroupsController_findByMinistry","parameters":[{"name":"ministryId","required":true,"in":"path","description":"Ministry ID","schema":{"type":"number"}},{"name":"includeMembers","required":false,"in":"query","description":"Include members","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Groups by ministry retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get groups by ministry ID","tags":["Ministry Groups"]}},"/ministry-groups/export/csv":{"get":{"operationId":"MinistryGroupsController_exportToCSV","parameters":[{"name":"ministryId","required":false,"in":"query","description":"Filter by ministry ID","schema":{"example":1,"type":"number"}},{"name":"name","required":false,"in":"query","description":"Filter by group name","schema":{"example":"Alabanza","type":"string"}},{"name":"leaderId","required":false,"in":"query","description":"Filter by leader ID","schema":{"example":123,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search term for group name or description","schema":{"example":"alabanza","type":"string"}},{"name":"includeMinistry","required":false,"in":"query","description":"Include ministry information in the response","schema":{"default":false,"example":true,"type":"boolean"}},{"name":"includeMembers","required":false,"in":"query","description":"Include members in the response","schema":{"default":false,"example":true,"type":"boolean"}},{"name":"sortBy","required":false,"in":"query","description":"Sort by field","schema":{"default":"id","example":"groupName","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"default":"DESC","example":"ASC","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number for pagination","schema":{"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page","schema":{"default":10,"example":10,"type":"number"}}],"responses":{"200":{"description":"CSV data retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Export ministry groups to CSV format","tags":["Ministry Groups"]}},"/ministry-groups/{id}":{"get":{"operationId":"MinistryGroupsController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"Ministry group ID","schema":{"type":"number"}},{"name":"includeMinistry","required":false,"in":"query","description":"Include ministry info","schema":{"type":"boolean"}},{"name":"includeMembers","required":false,"in":"query","description":"Include members","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Ministry group retrieved successfully"},"404":{"description":"Ministry group not found"}},"security":[{"JWT":[]}],"summary":"Get ministry group by ID","tags":["Ministry Groups"]},"patch":{"operationId":"MinistryGroupsController_update","parameters":[{"name":"id","required":true,"in":"path","description":"Ministry group ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMinistryGroupDto"}}}},"responses":{"200":{"description":"Ministry group updated successfully"},"404":{"description":"Ministry group not found"},"409":{"description":"Group name already exists in ministry"}},"security":[{"JWT":[]}],"summary":"Update ministry group","tags":["Ministry Groups"]},"delete":{"operationId":"MinistryGroupsController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"Ministry group ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Ministry group deleted successfully"},"400":{"description":"Cannot delete group with existing members"},"404":{"description":"Ministry group not found"}},"security":[{"JWT":[]}],"summary":"Delete ministry group","tags":["Ministry Groups"]}},"/ministry-groups/{id}/reports/summary":{"get":{"operationId":"MinistryGroupsController_getSummaryReport","parameters":[{"name":"id","required":true,"in":"path","description":"Ministry group ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Summary report retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get ministry group summary report","tags":["Ministry Groups"]}},"/ministry-members":{"post":{"operationId":"MinistryMembersController_addMemberToMinistry","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberToMinistryDto"}}}},"responses":{"201":{"description":"Member added to ministry successfully"},"400":{"description":"Bad request"},"409":{"description":"Member already belongs to this ministry"}},"security":[{"JWT":[]}],"summary":"Add member to ministry","tags":["Ministry Members"]},"get":{"operationId":"MinistryMembersController_getMinistryMembers","parameters":[{"name":"ministryId","required":false,"in":"query","description":"Filter by ministry ID","schema":{"example":1,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search term","schema":{"example":"juan","type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Sort by field","schema":{"default":"id","example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"default":"DESC","example":"DESC","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"default":10,"example":10,"type":"number"}}],"responses":{"200":{"description":"Ministry members retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get ministry members with filtering and pagination","tags":["Ministry Members"]}},"/ministry-members/{ministryId}":{"get":{"operationId":"MinistryMembersController_getMinistryMembersByMinistry","parameters":[{"name":"ministryId","required":true,"in":"path","description":"Ministry ID","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"type":"number"}}],"responses":{"200":{"description":"Ministry members retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get members of a specific ministry","tags":["Ministry Members"]}},"/ministry-members/{ministryId}/search":{"get":{"operationId":"MinistryMembersController_searchMinistryMembers","parameters":[{"name":"ministryId","required":true,"in":"path","description":"Ministry ID","schema":{"type":"number"}},{"name":"q","required":true,"in":"query","description":"Search term","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"type":"number"}}],"responses":{"200":{"description":"Search results retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Search members in a specific ministry","tags":["Ministry Members"]}},"/ministry-members/{ministryId}/members/{memberId}":{"delete":{"operationId":"MinistryMembersController_removeMemberFromMinistry","parameters":[{"name":"ministryId","required":true,"in":"path","description":"Ministry ID","schema":{"type":"number"}},{"name":"memberId","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Member removed from ministry successfully"},"404":{"description":"Member not found in this ministry"}},"security":[{"JWT":[]}],"summary":"Remove member from ministry","tags":["Ministry Members"]}},"/ministry-members/statistics":{"get":{"operationId":"MinistryMembersController_getMinistryMemberStatistics","parameters":[{"name":"ministryId","required":false,"in":"query","description":"Filter by ministry ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Statistics retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get ministry members statistics","tags":["Ministry Members"]}},"/ministry-members/{ministryId}/member/{memberId}/exists":{"get":{"operationId":"MinistryMembersController_checkMemberExistsInMinistry","parameters":[{"name":"ministryId","required":true,"in":"path","description":"Ministry ID","schema":{"type":"number"}},{"name":"memberId","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Member existence check completed"}},"security":[{"JWT":[]}],"summary":"Check if member exists in ministry","tags":["Ministry Members"]}},"/ministry-group-members":{"post":{"operationId":"MinistryGroupMembersController_addMemberToGroup","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberToGroupDto"}}}},"responses":{"201":{"description":"Member added to group successfully"},"400":{"description":"Bad request"},"409":{"description":"Member already belongs to this group"}},"security":[{"JWT":[]}],"summary":"Add member to ministry group","tags":["Ministry Group Members"]},"get":{"operationId":"MinistryGroupMembersController_getGroupMembers","parameters":[{"name":"ministryId","required":false,"in":"query","description":"Filter by ministry ID","schema":{"example":1,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search term for member names or identification","schema":{"example":"juan","type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Sort by field","schema":{"default":"id","example":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"default":"DESC","example":"DESC","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"default":10,"example":10,"type":"number"}},{"name":"groupId","required":false,"in":"query","description":"Filter by group ID","schema":{"example":2,"type":"number"}}],"responses":{"200":{"description":"Group members retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get group members with filtering and pagination","tags":["Ministry Group Members"]}},"/ministry-group-members/multiple":{"post":{"operationId":"MinistryGroupMembersController_addMultipleMembersToGroup","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMultipleMembersToGroupDto"}}}},"responses":{"201":{"description":"Members added to group successfully"},"400":{"description":"Bad request"}},"security":[{"JWT":[]}],"summary":"Add multiple members to ministry group","tags":["Ministry Group Members"]}},"/ministry-group-members/{groupId}":{"get":{"operationId":"MinistryGroupMembersController_getGroupMembersByGroup","parameters":[{"name":"groupId","required":true,"in":"path","description":"Group ID","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"type":"number"}}],"responses":{"200":{"description":"Group members retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get members of a specific group","tags":["Ministry Group Members"]}},"/ministry-group-members/{groupId}/members/{memberId}":{"delete":{"operationId":"MinistryGroupMembersController_removeMemberFromGroup","parameters":[{"name":"groupId","required":true,"in":"path","description":"Group ID","schema":{"type":"number"}},{"name":"memberId","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Member removed from group successfully"},"404":{"description":"Member not found in this group"}},"security":[{"JWT":[]}],"summary":"Remove member from group","tags":["Ministry Group Members"]}},"/ministry-group-members/record/{recordId}":{"delete":{"operationId":"MinistryGroupMembersController_removeGroupMemberRecord","parameters":[{"name":"recordId","required":true,"in":"path","description":"Group member record ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Member record removed successfully"},"404":{"description":"Member record not found"}},"security":[{"JWT":[]}],"summary":"Remove group member record by ID","tags":["Ministry Group Members"]}},"/ministry-group-members/statistics":{"get":{"operationId":"MinistryGroupMembersController_getGroupMemberStatistics","parameters":[{"name":"groupId","required":false,"in":"query","description":"Filter by group ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Statistics retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get group members statistics","tags":["Ministry Group Members"]}},"/ministry-group-members/{groupId}/member/{memberId}/exists":{"get":{"operationId":"MinistryGroupMembersController_checkMemberExistsInGroup","parameters":[{"name":"groupId","required":true,"in":"path","description":"Group ID","schema":{"type":"number"}},{"name":"memberId","required":true,"in":"path","description":"Member ID","schema":{"type":"number"}},{"name":"ministryId","required":true,"in":"query","description":"Ministry ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Member existence check completed"}},"security":[{"JWT":[]}],"summary":"Check if member exists in group","tags":["Ministry Group Members"]}},"/member-pastoral-notes":{"post":{"operationId":"MemberPastoralNotesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMemberPastoralNoteDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]},"get":{"operationId":"MemberPastoralNotesController_findAll","parameters":[{"name":"page","required":false,"in":"query","description":"Page number for pagination","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page","schema":{"example":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"id","type":"string","enum":["id","date","memberId","user"]}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"example":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"memberId","required":false,"in":"query","description":"Filter by specific member ID","schema":{"example":123,"type":"number"}},{"name":"user","required":false,"in":"query","description":"Filter by user who created the note","schema":{"example":"Pastor John","type":"string"}},{"name":"origin","required":false,"in":"query","description":"Filter by origin","schema":{"example":"COUNSELING","type":"string"}},{"name":"searchTerm","required":false,"in":"query","description":"Search in note content","schema":{"example":"spiritual growth","type":"string"}},{"name":"dateFrom","required":false,"in":"query","description":"Filter notes from this date","schema":{"example":"2025-01-01","type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Filter notes up to this date","schema":{"example":"2025-12-31","type":"string"}},{"name":"ref","required":false,"in":"query","description":"Filter by reference ID","schema":{"example":456,"type":"number"}},{"name":"select","required":false,"in":"query","description":"Specific columns to return (comma-separated)","schema":{"example":"id,memberId,date,note,user","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]}},"/member-pastoral-notes/search":{"get":{"operationId":"MemberPastoralNotesController_search","parameters":[{"name":"term","required":true,"in":"query","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"memberId","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]}},"/member-pastoral-notes/statistics":{"get":{"operationId":"MemberPastoralNotesController_getStatistics","parameters":[{"name":"memberId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]}},"/member-pastoral-notes/export":{"get":{"operationId":"MemberPastoralNotesController_export","parameters":[{"name":"page","required":false,"in":"query","description":"Page number for pagination","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page","schema":{"example":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"example":"id","type":"string","enum":["id","date","memberId","user"]}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"example":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"memberId","required":false,"in":"query","description":"Filter by specific member ID","schema":{"example":123,"type":"number"}},{"name":"user","required":false,"in":"query","description":"Filter by user who created the note","schema":{"example":"Pastor John","type":"string"}},{"name":"origin","required":false,"in":"query","description":"Filter by origin","schema":{"example":"COUNSELING","type":"string"}},{"name":"searchTerm","required":false,"in":"query","description":"Search in note content","schema":{"example":"spiritual growth","type":"string"}},{"name":"dateFrom","required":false,"in":"query","description":"Filter notes from this date","schema":{"example":"2025-01-01","type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Filter notes up to this date","schema":{"example":"2025-12-31","type":"string"}},{"name":"ref","required":false,"in":"query","description":"Filter by reference ID","schema":{"example":456,"type":"number"}},{"name":"select","required":false,"in":"query","description":"Specific columns to return (comma-separated)","schema":{"example":"id,memberId,date,note,user","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]}},"/member-pastoral-notes/member/{memberId}":{"get":{"operationId":"MemberPastoralNotesController_findByMemberId","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]}},"/member-pastoral-notes/member/{memberId}/recent":{"get":{"operationId":"MemberPastoralNotesController_getRecentNotes","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]}},"/member-pastoral-notes/member/{memberId}/count":{"get":{"operationId":"MemberPastoralNotesController_getNotesCount","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]}},"/member-pastoral-notes/member/{memberId}/has-notes":{"get":{"operationId":"MemberPastoralNotesController_memberHasNotes","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]}},"/member-pastoral-notes/{id}":{"get":{"operationId":"MemberPastoralNotesController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]},"patch":{"operationId":"MemberPastoralNotesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberPastoralNoteDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]},"delete":{"operationId":"MemberPastoralNotesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT":[]}],"tags":["Members"]}},"/anniversaries":{"get":{"description":"Retrieve anniversaries by type (birthday, marriage, conversion, baptism, membership) with various filters","operationId":"AnniversariesController_getAnniversaries","parameters":[{"name":"type","required":false,"in":"query","description":"Type of anniversary","schema":{"example":"birthday","type":"string","enum":["birthday","marriage","conversion","baptism","membership"]}},{"name":"date","required":false,"in":"query","description":"Specific date to search for (YYYY-MM-DD format)","schema":{"example":"2024-11-14","type":"string"}},{"name":"month","required":false,"in":"query","description":"Month to filter (1-12)","schema":{"minimum":1,"maximum":12,"example":11,"type":"number"}},{"name":"day","required":false,"in":"query","description":"Day to filter (1-31)","schema":{"minimum":1,"maximum":31,"example":14,"type":"number"}},{"name":"daysAhead","required":false,"in":"query","description":"Number of days ahead to include (for upcoming anniversaries)","schema":{"minimum":0,"maximum":365,"default":0,"type":"number"}},{"name":"church","required":false,"in":"query","description":"Location filter","schema":{"example":"MLR","type":"string"}},{"name":"status","required":false,"in":"query","description":"Member status filter","schema":{"example":"6","type":"string"}},{"name":"searchTerm","required":false,"in":"query","description":"Search term for name","schema":{"example":"Juan","type":"string"}},{"name":"search","required":false,"in":"query","description":"Search term for name (alias for searchTerm)","schema":{"example":"Juan","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number for pagination","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of records per page","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Sort field","schema":{"default":"firstName","example":"firstName","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"default":"ASC","type":"string","enum":["ASC","DESC"]}}],"responses":{"200":{"description":"Paginated list of anniversary members","content":{"application/json":{"schema":{"$ref":"#/components/schemas/"}}}}},"security":[{"JWT":[]}],"summary":"Get anniversaries with filtering and pagination","tags":["Anniversaries"]}},"/anniversaries/today":{"get":{"description":"Retrieve all anniversaries happening today for a specific type","operationId":"AnniversariesController_getTodaysAnniversaries","parameters":[{"name":"type","required":false,"in":"query","description":"Type of anniversary (default: birthday)","schema":{"enum":["birthday","marriage","conversion","baptism","membership"],"type":"string"}}],"responses":{"200":{"description":"List of today's anniversary members","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"JWT":[]}],"summary":"Get today's anniversaries","tags":["Anniversaries"]}},"/anniversaries/upcoming":{"get":{"description":"Retrieve anniversaries happening in the next X days","operationId":"AnniversariesController_getUpcomingAnniversaries","parameters":[{"name":"type","required":false,"in":"query","description":"Type of anniversary","schema":{"default":"birthday","type":"string","enum":["birthday","marriage","conversion","baptism","membership"]}},{"name":"daysAhead","required":false,"in":"query","description":"Number of days ahead to look for upcoming anniversaries","schema":{"minimum":1,"maximum":365,"default":7,"type":"number"}},{"name":"church","required":false,"in":"query","description":"Location filter","schema":{"example":"MLR","type":"string"}},{"name":"activeOnly","required":false,"in":"query","description":"Include only active members","schema":{"default":true,"type":"boolean"}}],"responses":{"200":{"description":"List of upcoming anniversary members ordered by days remaining","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"JWT":[]}],"summary":"Get upcoming anniversaries","tags":["Anniversaries"]}},"/anniversaries/statistics":{"get":{"description":"Comprehensive statistics about anniversaries including counts, demographics, and breakdowns","operationId":"AnniversariesController_getStatistics","parameters":[{"name":"type","required":false,"in":"query","description":"Type of anniversary for statistics","schema":{"default":"birthday","type":"string","enum":["birthday","marriage","conversion","baptism","membership"]}},{"name":"month","required":false,"in":"query","description":"Month to analyze (1-12)","schema":{"minimum":1,"maximum":12,"type":"number"}},{"name":"year","required":false,"in":"query","description":"Year to analyze","schema":{"minimum":1900,"maximum":2100,"type":"number"}},{"name":"church","required":false,"in":"query","description":"Church filter for statistics","schema":{"example":"MLR","type":"string"}},{"name":"includeMonthlyBreakdown","required":false,"in":"query","description":"Include detailed breakdown by month","schema":{"default":true,"type":"boolean"}},{"name":"includeAgeDemographics","required":false,"in":"query","description":"Include age demographics (for birthdays)","schema":{"default":false,"type":"boolean"}},{"name":"topCount","required":false,"in":"query","description":"Number of oldest/newest members to include","schema":{"minimum":1,"maximum":50,"default":10,"type":"number"}}],"responses":{"200":{"description":"Anniversary statistics and analytics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/"}}}}},"security":[{"JWT":[]}],"summary":"Get anniversary statistics","tags":["Anniversaries"]}},"/anniversaries/birthdays/this-month":{"get":{"description":"Retrieve all birthday celebrations for the current month","operationId":"AnniversariesController_getBirthdaysThisMonth","parameters":[{"name":"church","required":true,"in":"query","schema":{"type":"string"}},{"name":"activeOnly","required":false,"in":"query","description":"Include only active members (default: true)","schema":{"type":"boolean"}},{"name":"page","required":true,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"location","required":false,"in":"query","description":"Filter by location","schema":{}}],"responses":{"200":{"description":"Paginated list of birthday members for current month","content":{"application/json":{"schema":{"$ref":"#/components/schemas/"}}}}},"security":[{"JWT":[]}],"summary":"Get birthdays for current month","tags":["Anniversaries"]}},"/anniversaries/marriages/this-month":{"get":{"description":"Retrieve all marriage anniversaries for the current month","operationId":"AnniversariesController_getMarriagesThisMonth","parameters":[{"name":"church","required":true,"in":"query","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"location","required":false,"in":"query","description":"Filter by location","schema":{}}],"responses":{"200":{"description":"Paginated list of marriage anniversary members for current month","content":{"application/json":{"schema":{"$ref":"#/components/schemas/"}}}}},"security":[{"JWT":[]}],"summary":"Get marriage anniversaries for current month","tags":["Anniversaries"]}},"/anniversaries/conversions":{"get":{"description":"Retrieve members with conversion anniversaries with optional filters","operationId":"AnniversariesController_getConversions","parameters":[{"name":"type","required":false,"in":"query","description":"Type of anniversary","schema":{"example":"birthday","type":"string","enum":["birthday","marriage","conversion","baptism","membership"]}},{"name":"date","required":false,"in":"query","description":"Specific date to search for (YYYY-MM-DD format)","schema":{"example":"2024-11-14","type":"string"}},{"name":"month","required":false,"in":"query","description":"Month to filter (1-12)","schema":{"minimum":1,"maximum":12,"example":11,"type":"number"}},{"name":"day","required":false,"in":"query","description":"Day to filter (1-31)","schema":{"minimum":1,"maximum":31,"example":14,"type":"number"}},{"name":"daysAhead","required":false,"in":"query","description":"Number of days ahead to include (for upcoming anniversaries)","schema":{"minimum":0,"maximum":365,"default":0,"type":"number"}},{"name":"church","required":false,"in":"query","description":"Location filter","schema":{"example":"MLR","type":"string"}},{"name":"status","required":false,"in":"query","description":"Member status filter","schema":{"example":"6","type":"string"}},{"name":"searchTerm","required":false,"in":"query","description":"Search term for name","schema":{"example":"Juan","type":"string"}},{"name":"search","required":false,"in":"query","description":"Search term for name (alias for searchTerm)","schema":{"example":"Juan","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number for pagination","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of records per page","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Sort field","schema":{"default":"firstName","example":"firstName","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"default":"ASC","type":"string","enum":["ASC","DESC"]}}],"responses":{"200":{"description":"Paginated list of conversion anniversary members","content":{"application/json":{"schema":{"$ref":"#/components/schemas/"}}}}},"security":[{"JWT":[]}],"summary":"Get conversion anniversaries","tags":["Anniversaries"]}},"/anniversaries/baptisms":{"get":{"description":"Retrieve members with baptism anniversaries with optional filters","operationId":"AnniversariesController_getBaptisms","parameters":[{"name":"type","required":false,"in":"query","description":"Type of anniversary","schema":{"example":"birthday","type":"string","enum":["birthday","marriage","conversion","baptism","membership"]}},{"name":"date","required":false,"in":"query","description":"Specific date to search for (YYYY-MM-DD format)","schema":{"example":"2024-11-14","type":"string"}},{"name":"month","required":false,"in":"query","description":"Month to filter (1-12)","schema":{"minimum":1,"maximum":12,"example":11,"type":"number"}},{"name":"day","required":false,"in":"query","description":"Day to filter (1-31)","schema":{"minimum":1,"maximum":31,"example":14,"type":"number"}},{"name":"daysAhead","required":false,"in":"query","description":"Number of days ahead to include (for upcoming anniversaries)","schema":{"minimum":0,"maximum":365,"default":0,"type":"number"}},{"name":"church","required":false,"in":"query","description":"Location filter","schema":{"example":"MLR","type":"string"}},{"name":"status","required":false,"in":"query","description":"Member status filter","schema":{"example":"6","type":"string"}},{"name":"searchTerm","required":false,"in":"query","description":"Search term for name","schema":{"example":"Juan","type":"string"}},{"name":"search","required":false,"in":"query","description":"Search term for name (alias for searchTerm)","schema":{"example":"Juan","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number for pagination","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of records per page","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Sort field","schema":{"default":"firstName","example":"firstName","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"default":"ASC","type":"string","enum":["ASC","DESC"]}}],"responses":{"200":{"description":"Paginated list of baptism anniversary members","content":{"application/json":{"schema":{"$ref":"#/components/schemas/"}}}}},"security":[{"JWT":[]}],"summary":"Get baptism anniversaries","tags":["Anniversaries"]}},"/anniversaries/memberships":{"get":{"description":"Retrieve members with membership anniversaries with optional filters","operationId":"AnniversariesController_getMemberships","parameters":[{"name":"type","required":false,"in":"query","description":"Type of anniversary","schema":{"example":"birthday","type":"string","enum":["birthday","marriage","conversion","baptism","membership"]}},{"name":"date","required":false,"in":"query","description":"Specific date to search for (YYYY-MM-DD format)","schema":{"example":"2024-11-14","type":"string"}},{"name":"month","required":false,"in":"query","description":"Month to filter (1-12)","schema":{"minimum":1,"maximum":12,"example":11,"type":"number"}},{"name":"day","required":false,"in":"query","description":"Day to filter (1-31)","schema":{"minimum":1,"maximum":31,"example":14,"type":"number"}},{"name":"daysAhead","required":false,"in":"query","description":"Number of days ahead to include (for upcoming anniversaries)","schema":{"minimum":0,"maximum":365,"default":0,"type":"number"}},{"name":"church","required":false,"in":"query","description":"Location filter","schema":{"example":"MLR","type":"string"}},{"name":"status","required":false,"in":"query","description":"Member status filter","schema":{"example":"6","type":"string"}},{"name":"searchTerm","required":false,"in":"query","description":"Search term for name","schema":{"example":"Juan","type":"string"}},{"name":"search","required":false,"in":"query","description":"Search term for name (alias for searchTerm)","schema":{"example":"Juan","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number for pagination","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of records per page","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Sort field","schema":{"default":"firstName","example":"firstName","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"default":"ASC","type":"string","enum":["ASC","DESC"]}}],"responses":{"200":{"description":"Paginated list of membership anniversary members","content":{"application/json":{"schema":{"$ref":"#/components/schemas/"}}}}},"security":[{"JWT":[]}],"summary":"Get membership anniversaries","tags":["Anniversaries"]}},"/anniversaries/export":{"get":{"description":"Export anniversary data with applied filters in CSV format","operationId":"AnniversariesController_exportAnniversaries","parameters":[{"name":"type","required":false,"in":"query","description":"Type of anniversary","schema":{"example":"birthday","type":"string","enum":["birthday","marriage","conversion","baptism","membership"]}},{"name":"date","required":false,"in":"query","description":"Specific date to search for (YYYY-MM-DD format)","schema":{"example":"2024-11-14","type":"string"}},{"name":"month","required":false,"in":"query","description":"Month to filter (1-12)","schema":{"minimum":1,"maximum":12,"example":11,"type":"number"}},{"name":"day","required":false,"in":"query","description":"Day to filter (1-31)","schema":{"minimum":1,"maximum":31,"example":14,"type":"number"}},{"name":"daysAhead","required":false,"in":"query","description":"Number of days ahead to include (for upcoming anniversaries)","schema":{"minimum":0,"maximum":365,"default":0,"type":"number"}},{"name":"church","required":false,"in":"query","description":"Location filter","schema":{"example":"MLR","type":"string"}},{"name":"status","required":false,"in":"query","description":"Member status filter","schema":{"example":"6","type":"string"}},{"name":"searchTerm","required":false,"in":"query","description":"Search term for name","schema":{"example":"Juan","type":"string"}},{"name":"search","required":false,"in":"query","description":"Search term for name (alias for searchTerm)","schema":{"example":"Juan","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number for pagination","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of records per page","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Sort field","schema":{"default":"firstName","example":"firstName","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort direction","schema":{"default":"ASC","type":"string","enum":["ASC","DESC"]}}],"responses":{"200":{"description":"Anniversary data in CSV format","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"JWT":[]}],"summary":"Export anniversaries to CSV format","tags":["Anniversaries"]}},"/anniversaries/dashboard":{"get":{"description":"Get a comprehensive dashboard with today's anniversaries, upcoming events, and quick statistics","operationId":"AnniversariesController_getDashboard","parameters":[{"name":"church","required":true,"in":"query","schema":{"type":"string"}},{"name":"location","required":false,"in":"query","description":"Filter by location","schema":{}}],"responses":{"200":{"description":"Anniversary dashboard data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/"}}}}},"security":[{"JWT":[]}],"summary":"Get anniversary dashboard summary","tags":["Anniversaries"]}},"/networks/new-believers":{"get":{"operationId":"NetworksController_getNewBelievers","parameters":[{"name":"page","required":false,"in":"query","description":"Page number","schema":{"minimum":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"minimum":1,"maximum":100,"example":20,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Search term","schema":{"example":"Juan Pérez","type":"string"}},{"name":"church","required":false,"in":"query","description":"Church filter","schema":{"example":"SGM01","type":"string"}},{"name":"harvestNumber","required":false,"in":"query","description":"Harvest number filter","schema":{"example":"COS2025001","type":"string"}},{"name":"status","required":false,"in":"query","description":"Status filter","schema":{"type":"string","enum":["NUEVO","EN_PROCESO","ENTREVISTA_1","ENTREVISTA_2","ENTREVISTA_3","LISTO_MEMBRESIA","PROCESADO","INACTIVO"]}},{"name":"sex","required":false,"in":"query","description":"Sexo (MALE=Masculino, FEMALE=Femenino)","schema":{"type":"string","enum":["MALE","FEMALE"]}},{"name":"assignedMinister","required":false,"in":"query","description":"Ministro asignado para filtrar","schema":{"example":"Pastor Juan","type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Sort field","schema":{"default":"createdDate","type":"string","enum":["firstName","lastName","conversionDate","createdDate","status"]}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"enum":["ASC","DESC"],"type":"string"}},{"name":"readyForMembership","required":false,"in":"query","description":"Filtrar solo listos para membresía","schema":{"type":"string","enum":["SI","NO"]}},{"name":"isActive","required":false,"in":"query","description":"Filtrar por activos/inactivos","schema":{"type":"string","enum":["1","0"]}},{"name":"select","required":false,"in":"query","description":"Columnas especificas a retornar (separadas por coma)","schema":{"example":"id,firstName,lastName,status,conversionDate","type":"string"}}],"responses":{"200":{"description":"New believers retrieved successfully"},"403":{"description":"Forbidden"}},"security":[{"JWT":[]}],"summary":"Get new believers with pagination, filters and search","tags":["Networks (Redes de Cuidado)"]},"post":{"operationId":"NetworksController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNewBelieverDto"}}}},"responses":{"201":{"description":"New believer created successfully"},"400":{"description":"Bad Request"},"409":{"description":"Conflict - Identification already exists"}},"security":[{"JWT":[]}],"summary":"Create new believer","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/ready-membership":{"get":{"operationId":"NetworksController_getReadyForMembership","parameters":[],"responses":{"200":{"description":"Ready believers retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get new believers ready for membership","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/statistics":{"get":{"operationId":"NetworksController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistics retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get networks statistics","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/by-harvest/{harvestNumber}":{"get":{"operationId":"NetworksController_getNewBelieversByHarvest","parameters":[{"name":"harvestNumber","required":true,"in":"path","description":"Harvest number","schema":{"type":"string"}}],"responses":{"200":{"description":"New believers by harvest retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get new believers by harvest","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/{id}":{"get":{"operationId":"NetworksController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"New believer ID","schema":{"type":"number"}}],"responses":{"200":{"description":"New believer found"},"404":{"description":"New believer not found"}},"security":[{"JWT":[]}],"summary":"Get new believer by ID","tags":["Networks (Redes de Cuidado)"]},"put":{"operationId":"NetworksController_update","parameters":[{"name":"id","required":true,"in":"path","description":"New believer ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNewBelieverDto"}}}},"responses":{"200":{"description":"New believer updated successfully"},"400":{"description":"Cannot update processed believer"},"404":{"description":"New believer not found"}},"security":[{"JWT":[]}],"summary":"Update new believer","tags":["Networks (Redes de Cuidado)"]},"delete":{"operationId":"NetworksController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"New believer ID","schema":{"type":"number"}}],"responses":{"200":{"description":"New believer deleted successfully"},"400":{"description":"Cannot delete processed believer"},"404":{"description":"New believer not found"}},"security":[{"JWT":[]}],"summary":"Delete new believer","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/by-identification/{identification}":{"get":{"operationId":"NetworksController_findByIdentification","parameters":[{"name":"identification","required":true,"in":"path","description":"Identification number","schema":{"type":"string"}}],"responses":{"200":{"description":"New believer found"},"404":{"description":"New believer not found"}},"security":[{"JWT":[]}],"summary":"Get new believer by identification","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/{id}/interview-1":{"patch":{"operationId":"NetworksController_updateInterview1","parameters":[{"name":"id","required":true,"in":"path","description":"New believer ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInterviewDto"}}}},"responses":{"200":{"description":"First interview updated successfully"}},"security":[{"JWT":[]}],"summary":"Update first interview for new believer","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/{id}/interview-2":{"patch":{"operationId":"NetworksController_updateInterview2","parameters":[{"name":"id","required":true,"in":"path","description":"New believer ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInterviewDto"}}}},"responses":{"200":{"description":"Second interview updated successfully"},"400":{"description":"First interview must be completed first"}},"security":[{"JWT":[]}],"summary":"Update second interview for new believer","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/{id}/interview-3":{"patch":{"operationId":"NetworksController_updateInterview3","parameters":[{"name":"id","required":true,"in":"path","description":"New believer ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInterviewDto"}}}},"responses":{"200":{"description":"Third interview updated successfully"},"400":{"description":"Second interview must be completed first"}},"security":[{"JWT":[]}],"summary":"Update third interview for new believer","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/{id}/ready-membership":{"patch":{"operationId":"NetworksController_markReadyForMembership","parameters":[{"name":"id","required":true,"in":"path","description":"New believer ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessToMembershipDto"}}}},"responses":{"200":{"description":"Marked ready for membership successfully"},"400":{"description":"Three interviews must be completed first"}},"security":[{"JWT":[]}],"summary":"Mark new believer as ready for membership","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/{id}/process-membership":{"post":{"operationId":"NetworksController_processToMembership","parameters":[{"name":"id","required":true,"in":"path","description":"New believer ID","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessToMembershipDto"}}}},"responses":{"200":{"description":"Processed to membership successfully"},"400":{"description":"Not ready for membership or already processed"}},"security":[{"JWT":[]}],"summary":"Process new believer to membership","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/bulk-process-membership":{"post":{"operationId":"NetworksController_bulkProcessToMembership","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkProcessToMembershipDto"}}}},"responses":{"200":{"description":"Bulk processing completed"}},"security":[{"JWT":[]}],"summary":"Bulk process new believers to membership","tags":["Networks (Redes de Cuidado)"]}},"/networks/new-believers/export/csv":{"get":{"operationId":"NetworksController_exportToCsv","parameters":[{"name":"page","required":false,"in":"query","description":"Número de página","schema":{"minimum":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Elementos por página","schema":{"minimum":1,"maximum":100,"example":20,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Término de búsqueda (nombre, apellido, identificación)","schema":{"example":"Juan Pérez","type":"string"}},{"name":"church","required":false,"in":"query","description":"Código de iglesia para filtrar","schema":{"example":"SGM01","type":"string"}},{"name":"harvestNumber","required":false,"in":"query","description":"Número de cosecha para filtrar","schema":{"example":"COS2025001","type":"string"}},{"name":"status","required":false,"in":"query","description":"Estado del proceso R1","schema":{"type":"string","enum":["NUEVO","EN_PROCESO","ENTREVISTA_1","ENTREVISTA_2","ENTREVISTA_3","LISTO_MEMBRESIA","PROCESADO","INACTIVO"]}},{"name":"sex","required":false,"in":"query","description":"Sexo (MALE=Masculino, FEMALE=Femenino)","schema":{"type":"string","enum":["MALE","FEMALE"]}},{"name":"assignedMinister","required":false,"in":"query","description":"Ministro asignado para filtrar","schema":{"example":"Pastor Juan","type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Campo por el cual ordenar","schema":{"default":"createdDate","type":"string","enum":["firstName","lastName","conversionDate","createdDate","status"]}},{"name":"sortOrder","required":false,"in":"query","description":"Orden de clasificación","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"readyForMembership","required":false,"in":"query","description":"Filtrar solo listos para membresía","schema":{"type":"string","enum":["SI","NO"]}},{"name":"isActive","required":false,"in":"query","description":"Filtrar por activos/inactivos","schema":{"type":"string","enum":["1","0"]}},{"name":"select","required":false,"in":"query","description":"Columnas especificas a retornar (separadas por coma)","schema":{"example":"id,firstName,lastName,status,conversionDate","type":"string"}}],"responses":{"200":{"description":"CSV data"}},"security":[{"JWT":[]}],"summary":"Export new believers to CSV","tags":["Networks (Redes de Cuidado)"]}},"/networks/reports/summary":{"get":{"operationId":"NetworksController_getComprehensiveReport","parameters":[],"responses":{"200":{"description":"Report data retrieved successfully"}},"security":[{"JWT":[]}],"summary":"Get comprehensive networks report","tags":["Networks (Redes de Cuidado)"]}},"/networks/consolidation-r2":{"post":{"description":"Inicia un proceso de consolidación/discipulado R2 para un miembro","operationId":"ConsolidationR2Controller_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConsolidationR2Dto"}}}},"responses":{"201":{"description":"Consolidación R2 creada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsolidationR2"}}}},"400":{"description":"Datos de entrada inválidos"},"404":{"description":"Miembro no encontrado"}},"security":[{"bearer":[]}],"summary":"Crear nueva consolidación R2","tags":["Networks - Consolidation R2"]},"get":{"description":"Lista paginada de consolidaciones R2 con filtros opcionales","operationId":"ConsolidationR2Controller_findAll","parameters":[{"name":"status","required":false,"in":"query","description":"Filtrar por estado del proceso","schema":{"type":"string","enum":["enrolled","in_progress","evaluation","completed","ready_leadership","promoted_r3","inactive"]}},{"name":"programType","required":false,"in":"query","description":"Filtrar por tipo de programa","schema":{"type":"string","enum":["basic_faith","church_membership","ministry_prep","youth_track","adult_track","couples_track"]}},{"name":"consolidatorId","required":false,"in":"query","description":"ID del consolidador","schema":{"type":"number"}},{"name":"location","required":false,"in":"query","description":"Código de localidad/iglesia","schema":{"type":"string"}},{"name":"startDateFrom","required":false,"in":"query","description":"Fecha de inicio desde (ISO 8601)","schema":{"type":"string"}},{"name":"startDateTo","required":false,"in":"query","description":"Fecha de inicio hasta (ISO 8601)","schema":{"type":"string"}},{"name":"minCompletion","required":false,"in":"query","description":"Completitud mínima requerida","schema":{"minimum":0,"maximum":100,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Buscar en nombre del miembro o consolidador","schema":{"type":"string"}},{"name":"readyForR3","required":false,"in":"query","description":"Solo los listos para promover a R3","schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","description":"Página para paginación","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Elementos por página (1-100)","schema":{"minimum":1,"maximum":100,"default":20,"type":"number"}}],"responses":{"200":{"description":"Lista de consolidaciones R2 obtenida exitosamente","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConsolidationR2"}},"total":{"type":"number","description":"Total de registros"},"page":{"type":"number","description":"Página actual"},"limit":{"type":"number","description":"Elementos por página"}}}}}}},"security":[{"bearer":[]}],"summary":"Obtener todas las consolidaciones R2","tags":["Networks - Consolidation R2"]}},"/networks/consolidation-r2/statistics":{"get":{"description":"Métricas y estadísticas del proceso de consolidación R2","operationId":"ConsolidationR2Controller_getStatistics","parameters":[{"name":"status","required":false,"in":"query","description":"Filtrar por estado del proceso","schema":{"type":"string","enum":["enrolled","in_progress","evaluation","completed","ready_leadership","promoted_r3","inactive"]}},{"name":"programType","required":false,"in":"query","description":"Filtrar por tipo de programa","schema":{"type":"string","enum":["basic_faith","church_membership","ministry_prep","youth_track","adult_track","couples_track"]}},{"name":"consolidatorId","required":false,"in":"query","description":"ID del consolidador","schema":{"type":"number"}},{"name":"location","required":false,"in":"query","description":"Código de localidad/iglesia","schema":{"type":"string"}},{"name":"startDateFrom","required":false,"in":"query","description":"Fecha de inicio desde (ISO 8601)","schema":{"type":"string"}},{"name":"startDateTo","required":false,"in":"query","description":"Fecha de inicio hasta (ISO 8601)","schema":{"type":"string"}},{"name":"minCompletion","required":false,"in":"query","description":"Completitud mínima requerida","schema":{"minimum":0,"maximum":100,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Buscar en nombre del miembro o consolidador","schema":{"type":"string"}},{"name":"readyForR3","required":false,"in":"query","description":"Solo los listos para promover a R3","schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","description":"Página para paginación","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Elementos por página (1-100)","schema":{"minimum":1,"maximum":100,"default":20,"type":"number"}}],"responses":{"200":{"description":"Estadísticas obtenidas exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsolidationR2StatisticsDto"}}}}},"security":[{"bearer":[]}],"summary":"Obtener estadísticas de consolidación R2","tags":["Networks - Consolidation R2"]}},"/networks/consolidation-r2/mentor/{mentorId}/dashboard":{"get":{"description":"Panel de control para mentores con sus mentees R2","operationId":"ConsolidationR2Controller_getMentorDashboard","parameters":[{"name":"mentorId","required":true,"in":"path","description":"ID del mentor","schema":{"type":"number"}}],"responses":{"200":{"description":"Dashboard del mentor obtenido exitosamente","content":{"application/json":{"schema":{"type":"object","properties":{"activeMentees":{"type":"array","items":{"$ref":"#/components/schemas/ConsolidationR2"}},"completedMentees":{"type":"array","items":{"$ref":"#/components/schemas/ConsolidationR2"}},"readyForPromotion":{"type":"array","items":{"$ref":"#/components/schemas/ConsolidationR2"}},"totalMentees":{"type":"number"},"averageProgress":{"type":"number"}}}}}}},"security":[{"bearer":[]}],"summary":"Dashboard del mentor para R2","tags":["Networks - Consolidation R2"]}},"/networks/consolidation-r2/member/{memberId}":{"get":{"description":"Historial de consolidaciones R2 de un miembro específico","operationId":"ConsolidationR2Controller_findByMemberId","parameters":[{"name":"memberId","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"responses":{"200":{"description":"Consolidaciones del miembro obtenidas exitosamente","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConsolidationR2"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener consolidaciones R2 por miembro","tags":["Networks - Consolidation R2"]}},"/networks/consolidation-r2/{id}":{"get":{"description":"Detalles completos de una consolidación R2 específica","operationId":"ConsolidationR2Controller_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la consolidación R2","schema":{"type":"number"}}],"responses":{"200":{"description":"Consolidación R2 obtenida exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsolidationR2"}}}},"404":{"description":"Consolidación R2 no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener consolidación R2 por ID","tags":["Networks - Consolidation R2"]},"patch":{"description":"Actualiza los datos de una consolidación R2 existente","operationId":"ConsolidationR2Controller_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la consolidación R2","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConsolidationR2Dto"}}}},"responses":{"200":{"description":"Consolidación R2 actualizada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsolidationR2"}}}},"404":{"description":"Consolidación R2 no encontrada"}},"security":[{"bearer":[]}],"summary":"Actualizar consolidación R2","tags":["Networks - Consolidation R2"]},"delete":{"description":"Elimina una consolidación R2 (solo si no ha sido promovida a R3)","operationId":"ConsolidationR2Controller_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la consolidación R2","schema":{"type":"number"}}],"responses":{"200":{"description":"Consolidación R2 eliminada exitosamente"},"400":{"description":"No se puede eliminar una consolidación promovida a R3"},"404":{"description":"Consolidación R2 no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar consolidación R2","tags":["Networks - Consolidation R2"]}},"/networks/consolidation-r2/{id}/progress":{"patch":{"description":"Actualiza el porcentaje de progreso y sesiones completadas","operationId":"ConsolidationR2Controller_updateProgress","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la consolidación R2","schema":{"type":"number"}},{"name":"progressPercentage","required":true,"in":"query","description":"Porcentaje de progreso (0-100)","schema":{"type":"number"}},{"name":"sessionsCompleted","required":false,"in":"query","description":"Sesiones completadas","schema":{"type":"number"}}],"responses":{"200":{"description":"Progreso actualizado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsolidationR2"}}}}},"security":[{"bearer":[]}],"summary":"Actualizar progreso de consolidación R2","tags":["Networks - Consolidation R2"]}},"/networks/consolidation-r2/{id}/spiritual-gifts":{"post":{"description":"Añade un don espiritual identificado a la consolidación R2","operationId":"ConsolidationR2Controller_addSpiritualGift","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la consolidación R2","schema":{"type":"number"}}],"responses":{"200":{"description":"Don espiritual agregado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsolidationR2"}}}}},"security":[{"bearer":[]}],"summary":"Agregar don espiritual","tags":["Networks - Consolidation R2"]}},"/networks/consolidation-r2/{id}/ministry-interests":{"post":{"description":"Añade un interés ministerial identificado a la consolidación R2","operationId":"ConsolidationR2Controller_addMinistryInterest","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la consolidación R2","schema":{"type":"number"}}],"responses":{"200":{"description":"Interés ministerial agregado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsolidationR2"}}}}},"security":[{"bearer":[]}],"summary":"Agregar interés ministerial","tags":["Networks - Consolidation R2"]}},"/networks/consolidation-r2/{id}/promote-to-r3":{"post":{"description":"Promueve un miembro consolidado R2 al proceso de liderazgo R3","operationId":"ConsolidationR2Controller_promoteToR3","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la consolidación R2","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoteToR3Dto"}}}},"responses":{"200":{"description":"Promoción a R3 exitosa","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"r3Data":{"type":"object","description":"Datos para crear el registro R3"}}}}}},"400":{"description":"Miembro no elegible para promoción"}},"security":[{"bearer":[]}],"summary":"Promover a R3","tags":["Networks - Consolidation R2"]}},"/networks/leadership-r3":{"post":{"description":"Inicia un proceso de desarrollo de liderazgo R3 para un miembro","operationId":"LeadershipR3Controller_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLeadershipR3Dto"}}}},"responses":{"201":{"description":"Liderazgo R3 creado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadershipR3"}}}},"400":{"description":"Datos de entrada inválidos"},"404":{"description":"Miembro no encontrado"}},"security":[{"bearer":[]}],"summary":"Crear nuevo liderazgo R3","tags":["Networks - Leadership R3"]},"get":{"description":"Lista paginada de liderazgos R3 con filtros opcionales","operationId":"LeadershipR3Controller_findAll","parameters":[{"name":"status","required":false,"in":"query","description":"Filtrar por estado del liderazgo","schema":{"type":"string","enum":["enrolled","leadership_training","cell_leader_prep","cell_leader","ministry_leader","pastor_track","certified_leader","active","inactive"]}},{"name":"track","required":false,"in":"query","description":"Filtrar por pista de liderazgo","schema":{"type":"string","enum":["cell_leadership","youth_ministry","worship_ministry","teaching_ministry","pastoral_ministry","ministry_leadership","pastoral_leadership","evangelism_leadership","administration","evangelism","counseling"]}},{"name":"mentorId","required":false,"in":"query","description":"ID del mentor","schema":{"type":"number"}},{"name":"minLevel","required":false,"in":"query","description":"Nivel mínimo de liderazgo","schema":{"minimum":1,"maximum":6,"type":"number"}},{"name":"currentCertification","required":false,"in":"query","description":"Filtrar por certificación actual","schema":{"type":"string","enum":["basic_leader","cell_leader","ministry_coordinator","ministry_leader","department_head","associate_pastor","senior_pastor","senior_leader"]}},{"name":"location","required":false,"in":"query","description":"Código de localidad/iglesia","schema":{"type":"string"}},{"name":"minTrainingProgress","required":false,"in":"query","description":"Mínimo progreso de entrenamiento (0-100)","schema":{"minimum":0,"maximum":100,"type":"number"}},{"name":"readyForCertification","required":false,"in":"query","description":"Solo los listos para certificación","schema":{"type":"boolean"}},{"name":"activeLeaders","required":false,"in":"query","description":"Solo los activos en liderazgo","schema":{"type":"boolean"}},{"name":"search","required":false,"in":"query","description":"Buscar en nombre del miembro o mentor","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Página para paginación","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Elementos por página (1-100)","schema":{"minimum":1,"maximum":100,"default":20,"type":"number"}}],"responses":{"200":{"description":"Lista de liderazgos R3 obtenida exitosamente","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/LeadershipR3"}},"total":{"type":"number","description":"Total de registros"},"page":{"type":"number","description":"Página actual"},"limit":{"type":"number","description":"Elementos por página"}}}}}}},"security":[{"bearer":[]}],"summary":"Obtener todos los liderazgos R3","tags":["Networks - Leadership R3"]}},"/networks/leadership-r3/statistics":{"get":{"description":"Métricas y estadísticas del proceso de desarrollo de liderazgo R3","operationId":"LeadershipR3Controller_getStatistics","parameters":[{"name":"status","required":false,"in":"query","description":"Filtrar por estado del liderazgo","schema":{"type":"string","enum":["enrolled","leadership_training","cell_leader_prep","cell_leader","ministry_leader","pastor_track","certified_leader","active","inactive"]}},{"name":"track","required":false,"in":"query","description":"Filtrar por pista de liderazgo","schema":{"type":"string","enum":["cell_leadership","youth_ministry","worship_ministry","teaching_ministry","pastoral_ministry","ministry_leadership","pastoral_leadership","evangelism_leadership","administration","evangelism","counseling"]}},{"name":"mentorId","required":false,"in":"query","description":"ID del mentor","schema":{"type":"number"}},{"name":"minLevel","required":false,"in":"query","description":"Nivel mínimo de liderazgo","schema":{"minimum":1,"maximum":6,"type":"number"}},{"name":"currentCertification","required":false,"in":"query","description":"Filtrar por certificación actual","schema":{"type":"string","enum":["basic_leader","cell_leader","ministry_coordinator","ministry_leader","department_head","associate_pastor","senior_pastor","senior_leader"]}},{"name":"location","required":false,"in":"query","description":"Código de localidad/iglesia","schema":{"type":"string"}},{"name":"minTrainingProgress","required":false,"in":"query","description":"Mínimo progreso de entrenamiento (0-100)","schema":{"minimum":0,"maximum":100,"type":"number"}},{"name":"readyForCertification","required":false,"in":"query","description":"Solo los listos para certificación","schema":{"type":"boolean"}},{"name":"activeLeaders","required":false,"in":"query","description":"Solo los activos en liderazgo","schema":{"type":"boolean"}},{"name":"search","required":false,"in":"query","description":"Buscar en nombre del miembro o mentor","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Página para paginación","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Elementos por página (1-100)","schema":{"minimum":1,"maximum":100,"default":20,"type":"number"}}],"responses":{"200":{"description":"Estadísticas obtenidas exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadershipR3StatisticsDto"}}}}},"security":[{"bearer":[]}],"summary":"Obtener estadísticas de liderazgo R3","tags":["Networks - Leadership R3"]}},"/networks/leadership-r3/mentor/{mentorId}/dashboard":{"get":{"description":"Panel de control para mentores con sus líderes R3","operationId":"LeadershipR3Controller_getMentorDashboard","parameters":[{"name":"mentorId","required":true,"in":"path","description":"ID del mentor","schema":{"type":"number"}}],"responses":{"200":{"description":"Dashboard del mentor obtenido exitosamente","content":{"application/json":{"schema":{"type":"object","properties":{"activeMentees":{"type":"array","items":{"$ref":"#/components/schemas/LeadershipR3"}},"readyForPromotion":{"type":"array","items":{"$ref":"#/components/schemas/LeadershipR3"}},"topPerformers":{"type":"array","items":{"$ref":"#/components/schemas/LeadershipR3"}},"totalMentees":{"type":"number"},"averagePerformance":{"type":"number"}}}}}}},"security":[{"bearer":[]}],"summary":"Dashboard del mentor para R3","tags":["Networks - Leadership R3"]}},"/networks/leadership-r3/member/{memberId}":{"get":{"description":"Historial de liderazgos R3 de un miembro específico","operationId":"LeadershipR3Controller_findByMemberId","parameters":[{"name":"memberId","required":true,"in":"path","description":"ID del miembro","schema":{"type":"number"}}],"responses":{"200":{"description":"Liderazgos del miembro obtenidos exitosamente","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeadershipR3"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener liderazgos R3 por miembro","tags":["Networks - Leadership R3"]}},"/networks/leadership-r3/{id}":{"get":{"description":"Detalles completos de un liderazgo R3 específico","operationId":"LeadershipR3Controller_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID del liderazgo R3","schema":{"type":"number"}}],"responses":{"200":{"description":"Liderazgo R3 obtenido exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadershipR3"}}}},"404":{"description":"Liderazgo R3 no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener liderazgo R3 por ID","tags":["Networks - Leadership R3"]},"patch":{"description":"Actualiza los datos de un liderazgo R3 existente","operationId":"LeadershipR3Controller_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID del liderazgo R3","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLeadershipR3Dto"}}}},"responses":{"200":{"description":"Liderazgo R3 actualizado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadershipR3"}}}},"404":{"description":"Liderazgo R3 no encontrado"}},"security":[{"bearer":[]}],"summary":"Actualizar liderazgo R3","tags":["Networks - Leadership R3"]},"delete":{"description":"Elimina un liderazgo R3 (solo si no está liderando activamente)","operationId":"LeadershipR3Controller_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID del liderazgo R3","schema":{"type":"number"}}],"responses":{"200":{"description":"Liderazgo R3 eliminado exitosamente"},"400":{"description":"No se puede eliminar un líder activo"},"404":{"description":"Liderazgo R3 no encontrado"}},"security":[{"bearer":[]}],"summary":"Eliminar liderazgo R3","tags":["Networks - Leadership R3"]}},"/networks/leadership-r3/{id}/training-modules/complete":{"post":{"description":"Marca un módulo de entrenamiento como completado","operationId":"LeadershipR3Controller_completeTrainingModule","parameters":[{"name":"id","required":true,"in":"path","description":"ID del liderazgo R3","schema":{"type":"number"}}],"responses":{"200":{"description":"Módulo de entrenamiento completado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadershipR3"}}}}},"security":[{"bearer":[]}],"summary":"Completar módulo de entrenamiento","tags":["Networks - Leadership R3"]}},"/networks/leadership-r3/practical-assignments":{"post":{"description":"Añade una nueva asignación práctica al proceso de liderazgo R3","operationId":"LeadershipR3Controller_addPracticalAssignment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPracticalAssignmentDto"}}}},"responses":{"200":{"description":"Asignación práctica agregada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadershipR3"}}}}},"security":[{"bearer":[]}],"summary":"Agregar asignación práctica","tags":["Networks - Leadership R3"]}},"/networks/leadership-r3/{id}/practical-assignments/{assignmentId}":{"patch":{"description":"Actualiza los datos de una asignación práctica específica","operationId":"LeadershipR3Controller_updatePracticalAssignment","parameters":[{"name":"id","required":true,"in":"path","description":"ID del liderazgo R3","schema":{"type":"number"}},{"name":"assignmentId","required":true,"in":"path","description":"ID de la asignación práctica","schema":{"type":"string"}}],"responses":{"200":{"description":"Asignación práctica actualizada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadershipR3"}}}}},"security":[{"bearer":[]}],"summary":"Actualizar asignación práctica","tags":["Networks - Leadership R3"]}},"/networks/leadership-r3/mentor-evaluations":{"post":{"description":"Añade una nueva evaluación del mentor al proceso de liderazgo R3","operationId":"LeadershipR3Controller_addMentorEvaluation","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMentorEvaluationDto"}}}},"responses":{"200":{"description":"Evaluación del mentor agregada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadershipR3"}}}}},"security":[{"bearer":[]}],"summary":"Agregar evaluación del mentor","tags":["Networks - Leadership R3"]}},"/networks/leadership-r3/{id}/promote-level":{"post":{"description":"Promociona a un líder R3 al siguiente nivel de liderazgo","operationId":"LeadershipR3Controller_promoteLevel","parameters":[{"name":"id","required":true,"in":"path","description":"ID del liderazgo R3","schema":{"type":"number"}}],"responses":{"200":{"description":"Nivel de liderazgo promovido exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadershipR3"}}}},"400":{"description":"Líder no elegible para promoción"}},"security":[{"bearer":[]}],"summary":"Promover nivel de liderazgo","tags":["Networks - Leadership R3"]}},"/networks/leadership-r3/{id}/leadership-metrics":{"patch":{"description":"Actualiza las métricas de personas mentoreando y células liderando","operationId":"LeadershipR3Controller_updateLeadershipMetrics","parameters":[{"name":"id","required":true,"in":"path","description":"ID del liderazgo R3","schema":{"type":"number"}}],"responses":{"200":{"description":"Métricas de liderazgo actualizadas exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadershipR3"}}}}},"security":[{"bearer":[]}],"summary":"Actualizar métricas de liderazgo","tags":["Networks - Leadership R3"]}},"/dashboard/summary":{"get":{"description":"Devuelve KPIs ligeros para /dashboard. La respuesta se filtra según los permisos del usuario y se cachea en Redis con fallback a memoria para evitar lecturas repetidas sobre la base de datos.","operationId":"DashboardController_getSummary","parameters":[{"name":"location","required":false,"in":"query","description":"Localidad a consultar. Solo se respeta para usuarios con FULL_ACCESS; los demás usuarios quedan limitados a su localidad.","schema":{"example":"MLR","type":"string"}}],"responses":{"200":{"description":"Resumen del dashboard obtenido exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardSummaryDto"}}}}},"security":[{"bearer":[]}],"summary":"Resumen dinámico de la pantalla principal","tags":["Dashboard"]}},"/discipleship/courses":{"post":{"operationId":"DiscipleshipCoursesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDiscipleshipCourseDto"}}}},"responses":{"201":{"description":"Curso creado exitosamente."},"400":{"description":"Datos de entrada inválidos."}},"security":[{"bearer":[]}],"summary":"Crear un nuevo curso de discipulado","tags":["Discipleship Courses"]},"get":{"operationId":"DiscipleshipCoursesController_findAll","parameters":[{"name":"search","required":false,"in":"query","description":"Buscar por código o nombre","schema":{"type":"string"}},{"name":"nivel","required":false,"in":"query","description":"Filtrar por nivel","schema":{"type":"string","enum":["BASICO","INTERMEDIO","AVANZADO","ESPECIALIDAD"]}},{"name":"tipoCurso","required":false,"in":"query","description":"Filtrar por tipo","schema":{"type":"string","enum":["S","E","ES","T"]}},{"name":"facilitadorId","required":false,"in":"query","description":"Filtrar por facilitador","schema":{"type":"number"}},{"name":"activo","required":false,"in":"query","description":"Solo cursos activos","schema":{"type":"boolean"}},{"name":"conCosto","required":false,"in":"query","description":"Con costo","schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","description":"Página","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Elementos por página","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"select","required":false,"in":"query","description":"Columnas específicas a retornar (separadas por coma)","schema":{"example":"id,codigo,nombre,level,status","type":"string"}}],"responses":{"200":{"description":"Lista de cursos obtenida exitosamente."}},"security":[{"bearer":[]}],"summary":"Obtener lista de cursos con filtros","tags":["Discipleship Courses"]}},"/discipleship/courses/{id}":{"get":{"operationId":"DiscipleshipCoursesController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Curso encontrado exitosamente."},"404":{"description":"Curso no encontrado."}},"security":[{"bearer":[]}],"summary":"Obtener un curso específico por ID","tags":["Discipleship Courses"]},"patch":{"operationId":"DiscipleshipCoursesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDiscipleshipCourseDto"}}}},"responses":{"200":{"description":"Curso actualizado exitosamente."},"404":{"description":"Curso no encontrado."}},"security":[{"bearer":[]}],"summary":"Actualizar información de un curso","tags":["Discipleship Courses"]},"delete":{"operationId":"DiscipleshipCoursesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Curso eliminado exitosamente."},"404":{"description":"Curso no encontrado."}},"security":[{"bearer":[]}],"summary":"Eliminar un curso","tags":["Discipleship Courses"]}},"/discipleship/courses/{id}/students":{"get":{"operationId":"DiscipleshipCoursesController_getStudents","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Lista de estudiantes obtenida exitosamente."}},"security":[{"bearer":[]}],"summary":"Obtener estudiantes inscritos en un curso","tags":["Discipleship Courses"]}},"/discipleship/courses/{id}/financial-summary":{"get":{"operationId":"DiscipleshipCoursesController_getFinancialSummary","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Resumen financiero obtenido exitosamente."}},"security":[{"bearer":[]}],"summary":"Obtener resumen financiero del curso","tags":["Discipleship Courses"]}},"/discipleship/courses/{id}/duplicate":{"post":{"operationId":"DiscipleshipCoursesController_duplicate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":"Curso duplicado exitosamente."},"404":{"description":"Curso no encontrado."}},"security":[{"bearer":[]}],"summary":"Duplicar un curso existente","tags":["Discipleship Courses"]}},"/discipleship/courses/{id}/status":{"patch":{"operationId":"DiscipleshipCoursesController_updateStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Estado actualizado exitosamente."}},"security":[{"bearer":[]}],"summary":"Cambiar estado del curso","tags":["Discipleship Courses"]}},"/discipleship/enrollments":{"post":{"operationId":"DiscipleshipEnrollmentsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDiscipleshipEnrollmentDto"}}}},"responses":{"201":{"description":"Inscripción creada exitosamente."},"400":{"description":"Datos de entrada inválidos."},"409":{"description":"El estudiante ya está inscrito en este curso."}},"security":[{"bearer":[]}],"summary":"Crear nueva inscripción a curso","tags":["Discipleship Enrollments"]},"get":{"operationId":"DiscipleshipEnrollmentsController_findAll","parameters":[{"name":"search","required":false,"in":"query","description":"Buscar por nombre de estudiante","schema":{"type":"string"}},{"name":"courseId","required":false,"in":"query","description":"Filtrar por curso","schema":{"type":"number"}},{"name":"periodId","required":false,"in":"query","description":"Filtrar por período","schema":{"type":"number"}},{"name":"studentType","required":false,"in":"query","description":"Filtrar por tipo de estudiante","schema":{"type":"string","enum":["MIEMBRO","NUEVO_CREYENTE","VISITANTE","EX_MIEMBRO"]}},{"name":"status","required":false,"in":"query","description":"Filtrar por estado","schema":{"type":"string","enum":["INSCRITO","CONFIRMADO","EN_PROGRESO","APROBADO","REPROBADO","RETIRADO","CANCELADO","TRANSFERIDO"]}},{"name":"memberId","required":false,"in":"query","description":"Filtrar por miembro","schema":{"type":"number"}},{"name":"active","required":false,"in":"query","description":"Solo inscripciones activas","schema":{"type":"boolean"}},{"name":"pendingCertificate","required":false,"in":"query","description":"Solo inscripciones con certificado pendiente","schema":{"type":"boolean"}},{"name":"minGrade","required":false,"in":"query","description":"Nota mínima","schema":{"type":"number"}},{"name":"minAttendance","required":false,"in":"query","description":"Asistencia mínima","schema":{"type":"number"}},{"name":"enrollmentDateFrom","required":false,"in":"query","description":"Fecha de inscripción desde","schema":{"format":"date-time","type":"string"}},{"name":"enrollmentDateTo","required":false,"in":"query","description":"Fecha de inscripción hasta","schema":{"format":"date-time","type":"string"}},{"name":"page","required":false,"in":"query","description":"Página","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Elementos por página","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"select","required":false,"in":"query","description":"Columnas especificas a retornar (separadas por coma)","schema":{"example":"id,studentName,courseName,status,grade,attendance","type":"string"}}],"responses":{"200":{"description":"Lista de inscripciones obtenida exitosamente."}},"security":[{"bearer":[]}],"summary":"Obtener lista de inscripciones con filtros","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/{id}":{"get":{"operationId":"DiscipleshipEnrollmentsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Inscripción encontrada exitosamente."},"404":{"description":"Inscripción no encontrada."}},"security":[{"bearer":[]}],"summary":"Obtener inscripción específica por ID","tags":["Discipleship Enrollments"]},"patch":{"operationId":"DiscipleshipEnrollmentsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDiscipleshipEnrollmentDto"}}}},"responses":{"200":{"description":"Inscripción actualizada exitosamente."},"404":{"description":"Inscripción no encontrada."}},"security":[{"bearer":[]}],"summary":"Actualizar inscripción","tags":["Discipleship Enrollments"]},"delete":{"operationId":"DiscipleshipEnrollmentsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Inscripción eliminada exitosamente."},"404":{"description":"Inscripción no encontrada."}},"security":[{"bearer":[]}],"summary":"Eliminar inscripción","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/{id}/progress":{"get":{"operationId":"DiscipleshipEnrollmentsController_getProgress","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Progreso obtenido exitosamente."}},"security":[{"bearer":[]}],"summary":"Obtener progreso del estudiante en el curso","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/{id}/financial-status":{"get":{"operationId":"DiscipleshipEnrollmentsController_getFinancialStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Estado financiero obtenido exitosamente."}},"security":[{"bearer":[]}],"summary":"Obtener estado financiero de la inscripción","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/{id}/payment":{"post":{"operationId":"DiscipleshipEnrollmentsController_makePayment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Pago registrado exitosamente."},"400":{"description":"Datos de pago inválidos."}},"security":[{"bearer":[]}],"summary":"Registrar pago para inscripción","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/{id}/scholarship":{"post":{"operationId":"DiscipleshipEnrollmentsController_applyScholarship","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Beca aplicada exitosamente."},"400":{"description":"Porcentaje de beca inválido."}},"security":[{"bearer":[]}],"summary":"Aplicar beca a inscripción","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/{id}/status":{"patch":{"operationId":"DiscipleshipEnrollmentsController_updateStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Estado actualizado exitosamente."}},"security":[{"bearer":[]}],"summary":"Cambiar estado de inscripción","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/students/list":{"get":{"operationId":"DiscipleshipEnrollmentsController_findAllWithStudents","parameters":[{"name":"search","required":false,"in":"query","description":"Buscar por nombre de estudiante","schema":{"type":"string"}},{"name":"courseId","required":false,"in":"query","description":"Filtrar por curso","schema":{"type":"number"}},{"name":"periodId","required":false,"in":"query","description":"Filtrar por período","schema":{"type":"number"}},{"name":"studentType","required":false,"in":"query","description":"Filtrar por tipo de estudiante","schema":{"type":"string","enum":["MIEMBRO","NUEVO_CREYENTE","VISITANTE","EX_MIEMBRO"]}},{"name":"status","required":false,"in":"query","description":"Filtrar por estado","schema":{"type":"string","enum":["INSCRITO","CONFIRMADO","EN_PROGRESO","APROBADO","REPROBADO","RETIRADO","CANCELADO","TRANSFERIDO"]}},{"name":"memberId","required":false,"in":"query","description":"Filtrar por miembro","schema":{"type":"number"}},{"name":"active","required":false,"in":"query","description":"Solo inscripciones activas","schema":{"type":"boolean"}},{"name":"pendingCertificate","required":false,"in":"query","description":"Solo inscripciones con certificado pendiente","schema":{"type":"boolean"}},{"name":"minGrade","required":false,"in":"query","description":"Nota mínima","schema":{"type":"number"}},{"name":"minAttendance","required":false,"in":"query","description":"Asistencia mínima","schema":{"type":"number"}},{"name":"enrollmentDateFrom","required":false,"in":"query","description":"Fecha de inscripción desde","schema":{"format":"date-time","type":"string"}},{"name":"enrollmentDateTo","required":false,"in":"query","description":"Fecha de inscripción hasta","schema":{"format":"date-time","type":"string"}},{"name":"page","required":false,"in":"query","description":"Página","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Elementos por página","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"select","required":false,"in":"query","description":"Columnas especificas a retornar (separadas por coma)","schema":{"example":"id,studentName,courseName,status,grade,attendance","type":"string"}}],"responses":{"200":{"description":"Lista de inscripciones con estudiantes obtenida exitosamente.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EnrollmentWithStudentDto"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener inscripciones con información unificada de estudiantes","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/{id}/student":{"get":{"operationId":"DiscipleshipEnrollmentsController_getStudentInfo","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Información del estudiante obtenida exitosamente.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentInfoDto"}}}},"404":{"description":"Inscripción no encontrada."}},"security":[{"bearer":[]}],"summary":"Obtener información del estudiante de una inscripción","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/{id}/with-student":{"get":{"operationId":"DiscipleshipEnrollmentsController_findOneWithStudent","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Inscripción con estudiante obtenida exitosamente.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollmentWithStudentDto"}}}},"404":{"description":"Inscripción no encontrada."}},"security":[{"bearer":[]}],"summary":"Obtener inscripción con información completa del estudiante","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/course/{courseId}/students":{"get":{"operationId":"DiscipleshipEnrollmentsController_getStudentsByCourse","parameters":[{"name":"courseId","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Lista de estudiantes obtenida exitosamente.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StudentSummaryDto"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener lista de estudiantes únicos de un curso","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/course/{courseId}/validate-student-type/{studentType}":{"get":{"operationId":"DiscipleshipEnrollmentsController_validateStudentType","parameters":[{"name":"courseId","required":true,"in":"path","schema":{"type":"number"}},{"name":"studentType","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Validación realizada exitosamente."}},"security":[{"bearer":[]}],"summary":"Validar si un tipo de estudiante puede inscribirse en un curso","tags":["Discipleship Enrollments"]}},"/discipleship/enrollments/with-validation":{"post":{"operationId":"DiscipleshipEnrollmentsController_createWithValidation","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDiscipleshipEnrollmentDto"}}}},"responses":{"201":{"description":"Inscripción creada exitosamente.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollmentWithStudentDto"}}}},"400":{"description":"Tipo de estudiante no permitido o datos inválidos."},"409":{"description":"El estudiante ya está inscrito en este curso."}},"security":[{"bearer":[]}],"summary":"Crear inscripción con validación de tipo de estudiante","tags":["Discipleship Enrollments"]}},"/discipleship/auto-grading/calculate":{"post":{"description":"Calcula y actualiza automáticamente las calificaciones finales para todos los estudiantes de un curso específico","operationId":"AutoGradingController_calculateGrades","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoGradeRequestDto"}}}},"responses":{"200":{"description":"Calificaciones calculadas exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoGradeResultDto"}}}},"400":{"description":"Parámetros inválidos o criterios de calificación incorrectos"},"404":{"description":"Curso o período no encontrado"}},"security":[{"bearer":[]}],"summary":"Calcular calificaciones automáticamente","tags":["Auto Grading"]}},"/discipleship/auto-grading/stats/{courseId}/{period}":{"get":{"description":"Obtiene estadísticas detalladas sobre el estado de las calificaciones de un curso","operationId":"AutoGradingController_getCourseStats","parameters":[{"name":"courseId","required":true,"in":"path","description":"ID del curso","schema":{"type":"string"}},{"name":"period","required":true,"in":"path","description":"Período académico","schema":{"type":"string"}}],"responses":{"200":{"description":"Estadísticas obtenidas exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GradeStatsDto"}}}}},"security":[{"bearer":[]}],"summary":"Obtener estadísticas de calificaciones","tags":["Auto Grading"]}},"/discipleship/auto-grading/simulate":{"post":{"description":"Simula el cálculo de calificaciones sin guardar cambios (modo dry-run)","operationId":"AutoGradingController_simulateGradeCalculation","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoGradeRequestDto"}}}},"responses":{"200":{"description":"Simulación completada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoGradeResultDto"}}}}},"security":[{"bearer":[]}],"summary":"Simular cálculo de calificaciones","tags":["Auto Grading"]}},"/discipleship/auto-grading/process-tmp-notes/{courseId}/{period}":{"post":{"description":"Procesa automáticamente las notas temporales que están pendientes de aprobación","operationId":"AutoGradingController_processPendingTmpNotes","parameters":[{"name":"courseId","required":true,"in":"path","description":"ID del curso","schema":{"type":"string"}},{"name":"period","required":true,"in":"path","description":"Período académico","schema":{"type":"string"}}],"responses":{"200":{"description":"Notas temporales procesadas exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessTmpNotesResultDto"}}}}},"security":[{"bearer":[]}],"summary":"Procesar notas temporales pendientes","tags":["Auto Grading"]}},"/discipleship/auto-grading/validate-grades":{"post":{"description":"Valida y calcula el promedio de calificaciones para un estudiante específico sin guardar cambios","operationId":"AutoGradingController_validateStudentGrades","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GradeValidationDto"}}}},"responses":{"200":{"description":"Validación completada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GradeValidationResultDto"}}}}},"security":[{"bearer":[]}],"summary":"Validar calificaciones de un estudiante","tags":["Auto Grading"]}},"/discipleship/auto-grading/criteria/default":{"get":{"description":"Obtiene los criterios de calificación por defecto utilizados por el sistema","operationId":"AutoGradingController_getDefaultCriteria","parameters":[],"responses":{"200":{"description":"Criterios obtenidos exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GradingCriteriaDto"}}}}},"security":[{"bearer":[]}],"summary":"Obtener criterios de calificación por defecto","tags":["Auto Grading"]}},"/discipleship/auto-grading/recalculate-all/{courseId}/{period}":{"post":{"description":"Fuerza el recálculo de todas las calificaciones de un curso, incluso las que ya están calculadas","operationId":"AutoGradingController_forceRecalculateAll","parameters":[{"name":"courseId","required":true,"in":"path","description":"ID del curso","schema":{"type":"string"}},{"name":"period","required":true,"in":"path","description":"Período académico","schema":{"type":"string"}},{"name":"confirm","required":true,"in":"query","description":"Confirmación requerida (true)","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GradingCriteriaDto"}}}},"responses":{"200":{"description":"Recálculo completado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoGradeResultDto"}}}}},"security":[{"bearer":[]}],"summary":"Recalcular todas las calificaciones","tags":["Auto Grading"]}},"/reports/generate":{"post":{"description":"Genera un reporte basado en los módulos y filtros especificados","operationId":"ReportsController_generateReport","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReportDto"}}}},"responses":{"200":{"description":"Reporte generado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportResponseDto"}}}},"400":{"description":"Parámetros inválidos"},"403":{"description":"Sin permisos para generar reportes"}},"security":[{"bearer":[]}],"summary":"Generar reporte personalizado","tags":["Reports"]}},"/reports/dashboard":{"get":{"description":"Obtiene el dashboard ejecutivo con KPIs principales y métricas cruzadas","operationId":"ReportsController_getDashboard","parameters":[{"name":"includeProjections","required":false,"in":"query","description":"Incluir proyecciones futuras","schema":{"type":"boolean"}},{"name":"detailLevel","required":false,"in":"query","description":"Nivel de detalle del dashboard","schema":{"enum":["basic","detailed","comprehensive"],"type":"string"}}],"responses":{"200":{"description":"Dashboard obtenido exitosamente"}},"security":[{"bearer":[]}],"summary":"Dashboard ejecutivo","tags":["Reports"]}},"/reports/kpis":{"get":{"description":"Obtiene KPIs de uno o múltiples módulos","operationId":"ReportsController_getKPIs","parameters":[{"name":"includeComparison","required":false,"in":"query","description":"Incluir comparación con período anterior","schema":{"type":"boolean"}},{"name":"endDate","required":false,"in":"query","description":"Fecha fin (ISO format)","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Fecha inicio (ISO format)","schema":{"type":"string"}},{"name":"modules","required":false,"in":"query","description":"Módulos separados por coma (ej: members,payments)","schema":{}}],"responses":{"200":{"description":"KPIs obtenidos exitosamente","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KPIResponse"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener KPIs","tags":["Reports"]}},"/reports/modules/capabilities":{"get":{"description":"Obtiene las capacidades de reporte de todos los módulos disponibles","operationId":"ReportsController_getModuleCapabilities","parameters":[],"responses":{"200":{"description":"Capacidades obtenidas exitosamente"}},"security":[{"bearer":[]}],"summary":"Capacidades de módulos","tags":["Reports"]}},"/reports/modules/{moduleName}/reports":{"get":{"description":"Obtiene la lista de reportes disponibles para un módulo específico","operationId":"ReportsController_getAvailableReportsForModule","parameters":[{"name":"moduleName","required":true,"in":"path","description":"Nombre del módulo","schema":{"example":"members","type":"string"}}],"responses":{"200":{"description":"Lista de reportes obtenida exitosamente"},"404":{"description":"Módulo no encontrado"}},"security":[{"bearer":[]}],"summary":"Reportes disponibles por módulo","tags":["Reports"]}},"/reports/modules/{moduleName}/reports/{reportKey}/validate":{"get":{"description":"Valida si un reporte específico está disponible para un módulo","operationId":"ReportsController_validateReportAvailability","parameters":[{"name":"moduleName","required":true,"in":"path","description":"Nombre del módulo","schema":{"type":"string"}},{"name":"reportKey","required":true,"in":"path","description":"Clave del reporte","schema":{"type":"string"}}],"responses":{"200":{"description":"Validación completada"}},"security":[{"bearer":[]}],"summary":"Validar disponibilidad de reporte","tags":["Reports"]}},"/reports/schedule":{"post":{"description":"Programa un reporte para ejecutarse automáticamente","operationId":"ReportsController_scheduleReport","parameters":[],"responses":{"201":{"description":"Reporte programado exitosamente"}},"security":[{"bearer":[]}],"summary":"Programar reporte automático","tags":["Reports"]}},"/reports/exports/{exportId}/status":{"get":{"description":"Obtiene el estado de una exportación en progreso","operationId":"ReportsController_getExportStatus","parameters":[{"name":"exportId","required":true,"in":"path","description":"ID de la exportación","schema":{"type":"string"}}],"responses":{"200":{"description":"Estado obtenido exitosamente"}},"security":[{"bearer":[]}],"summary":"Estado de exportación","tags":["Reports"]}},"/reports/exports/{exportId}/download":{"get":{"description":"Descarga un archivo de exportación generado","operationId":"ReportsController_downloadExport","parameters":[{"name":"exportId","required":true,"in":"path","description":"ID de la exportación","schema":{"type":"string"}}],"responses":{"200":{"description":"Archivo descargado exitosamente"}},"security":[{"bearer":[]}],"summary":"Descargar exportación","tags":["Reports"]}},"/health":{"get":{"description":"Returns basic health status of the API. No authentication required.","operationId":"HealthController_getSimpleHealth","parameters":[],"responses":{"200":{"description":"API is healthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleHealthDto"}}}}},"summary":"Simple health check","tags":["Health"]},"options":{"description":"Returns information about available HTTP methods and endpoint capabilities for CORS and API discovery","operationId":"HealthController_getOptions","parameters":[],"responses":{"200":{"description":"Available options and methods retrieved successfully"}},"summary":"Get available HTTP methods and options","tags":["Health"]}},"/health/info":{"get":{"description":"Returns comprehensive information about the API including configuration, modules, and system metrics","operationId":"HealthController_getSystemInfo","parameters":[],"responses":{"200":{"description":"System information retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthOptionsDto"}}}}},"security":[{"X-API-Key":[]}],"summary":"Get system information and configuration","tags":["Health"]}},"/health/system":{"get":{"description":"Returns detailed health status of all system modules","operationId":"HealthController_getSystemHealth","parameters":[],"responses":{"200":{"description":"System health status retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemHealthDto"}}}}},"security":[{"X-API-Key":[]}],"summary":"Comprehensive system health check","tags":["Health"]}},"/health/module/{moduleName}":{"get":{"description":"Returns health status of a specific module","operationId":"HealthController_getModuleHealth","parameters":[{"name":"moduleName","required":true,"in":"path","description":"Name of the module to check","schema":{"example":"database","type":"string"}}],"responses":{"200":{"description":"Module health status retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleHealthDto"}}}},"404":{"description":"Module not found"}},"security":[{"X-API-Key":[]}],"summary":"Check specific module health","tags":["Health"]}},"/localities/countries":{"post":{"description":"Crea un nuevo país en el sistema de localidades","operationId":"CountriesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCountryDto"}}}},"responses":{"201":{"description":"País creado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryEntity"}}}},"409":{"description":"Ya existe un país con ese código"}},"security":[{"bearer":[]}],"summary":"Crear un nuevo país","tags":["localities/countries"]},"get":{"description":"Obtiene todos los países del catálogo con soporte para paginación y filtros avanzados","operationId":"CountriesController_findAll","parameters":[{"name":"page","required":false,"in":"query","description":"Número de página","schema":{"minimum":1,"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Registros por página","schema":{"minimum":1,"default":10,"example":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Campo por el cual ordenar","schema":{"default":"name","example":"name","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Orden ascendente o descendente","schema":{"default":"ASC","example":"ASC","type":"string","enum":["ASC","DESC"]}},{"name":"search","required":false,"in":"query","description":"Búsqueda por nombre, código o nacionalidad","schema":{"example":"República","type":"string"}},{"name":"isActive","required":false,"in":"query","description":"Filtrar por estado activo","schema":{"example":true,"type":"boolean"}},{"name":"includeStates","required":false,"in":"query","description":"Incluir relaciones de estados","schema":{"default":false,"example":false,"type":"boolean"}}],"responses":{"200":{"description":"Lista de países obtenida exitosamente"}},"security":[{"bearer":[]}],"summary":"Obtener lista de países con paginación","tags":["localities/countries"]}},"/localities/countries/search":{"get":{"description":"Busca países por nombre, nacionalidad o código","operationId":"CountriesController_search","parameters":[{"name":"q","required":true,"in":"query","description":"Término de búsqueda","schema":{"type":"string"}}],"responses":{"200":{"description":"Resultados de búsqueda obtenidos","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CountryEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Buscar países","tags":["localities/countries"]}},"/localities/countries/popular":{"get":{"description":"Obtiene los países más utilizados ordenados por prioridad","operationId":"CountriesController_getPopular","parameters":[{"name":"limit","required":false,"in":"query","description":"Límite de resultados (por defecto 10)","schema":{"type":"number"}}],"responses":{"200":{"description":"Países populares obtenidos","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CountryEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener países populares","tags":["localities/countries"]}},"/localities/countries/{code}":{"get":{"description":"Obtiene un país específico por su código","operationId":"CountriesController_findOne","parameters":[{"name":"code","required":true,"in":"path","description":"Código del país (ej: 0001, 0002)","schema":{"example":"0001","type":"string"}}],"responses":{"200":{"description":"País obtenido exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryEntity"}}}},"404":{"description":"País no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener país por código","tags":["localities/countries"]},"patch":{"description":"Actualiza los datos de un país existente","operationId":"CountriesController_update","parameters":[{"name":"code","required":true,"in":"path","description":"Código del país","schema":{"example":"0001","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCountryDto"}}}},"responses":{"200":{"description":"País actualizado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryEntity"}}}},"404":{"description":"País no encontrado"}},"security":[{"bearer":[]}],"summary":"Actualizar país","tags":["localities/countries"]},"delete":{"description":"Elimina un país del catálogo","operationId":"CountriesController_remove","parameters":[{"name":"code","required":true,"in":"path","description":"Código del país","schema":{"example":"0001","type":"string"}}],"responses":{"200":{"description":"País eliminado exitosamente"},"404":{"description":"País no encontrado"}},"security":[{"bearer":[]}],"summary":"Eliminar país","tags":["localities/countries"]}},"/localities/states":{"post":{"description":"Crea un nuevo estado o provincia en el sistema de localidades","operationId":"StatesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStateDto"}}}},"responses":{"201":{"description":"Estado creado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StateEntity"}}}},"409":{"description":"Ya existe un estado con ese código en el país"}},"security":[{"bearer":[]}],"summary":"Crear un nuevo estado/provincia","tags":["localities/states"]},"get":{"description":"Obtiene todos los estados con soporte para paginación y filtros avanzados","operationId":"StatesController_findAll","parameters":[{"name":"page","required":false,"in":"query","description":"Número de página","schema":{"minimum":1,"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Registros por página","schema":{"minimum":1,"default":10,"example":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Campo por el cual ordenar","schema":{"default":"name","example":"name","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Orden ascendente o descendente","schema":{"default":"ASC","example":"ASC","type":"string","enum":["ASC","DESC"]}},{"name":"search","required":false,"in":"query","description":"Búsqueda por nombre, código o abreviación","schema":{"example":"Romana","type":"string"}},{"name":"countryCode","required":false,"in":"query","description":"Filtrar por código de país","schema":{"example":"0001","type":"string"}},{"name":"isActive","required":false,"in":"query","description":"Filtrar por estado activo","schema":{"example":true,"type":"boolean"}},{"name":"includeCountry","required":false,"in":"query","description":"Incluir relación con país","schema":{"default":false,"example":false,"type":"boolean"}},{"name":"includeCities","required":false,"in":"query","description":"Incluir relación con ciudades","schema":{"default":false,"example":false,"type":"boolean"}},{"name":"select","required":false,"in":"query","description":"Columnas específicas a retornar (separadas por coma)","schema":{"example":"id,name,code,countryCode","type":"string"}}],"responses":{"200":{"description":"Lista de estados obtenida exitosamente"}},"security":[{"bearer":[]}],"summary":"Obtener lista de estados con paginación","tags":["localities/states"]}},"/localities/states/search":{"get":{"description":"Busca estados por nombre, código o abreviación","operationId":"StatesController_search","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"countryCode","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Resultados de búsqueda obtenidos","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StateEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Buscar estados","tags":["localities/states"]}},"/localities/states/country/{countryCode}":{"get":{"description":"Obtiene todos los estados de un país específico","operationId":"StatesController_findByCountry","parameters":[{"name":"countryCode","required":true,"in":"path","description":"Código del país","schema":{"example":"0001","type":"string"}},{"name":"includeCities","required":true,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Estados obtenidos exitosamente","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StateEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener estados por país","tags":["localities/states"]}},"/localities/states/{id}":{"get":{"description":"Obtiene un estado específico por su ID","operationId":"StatesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID del estado","schema":{"type":"number"}},{"name":"includeCities","required":true,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Estado obtenido exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StateEntity"}}}},"404":{"description":"Estado no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener estado por ID","tags":["localities/states"]},"patch":{"description":"Actualiza los datos de un estado existente","operationId":"StatesController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID del estado","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStateDto"}}}},"responses":{"200":{"description":"Estado actualizado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StateEntity"}}}},"404":{"description":"Estado no encontrado"}},"security":[{"bearer":[]}],"summary":"Actualizar estado","tags":["localities/states"]},"delete":{"description":"Elimina un estado del catálogo","operationId":"StatesController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID del estado","schema":{"type":"number"}}],"responses":{"200":{"description":"Estado eliminado exitosamente"},"404":{"description":"Estado no encontrado"}},"security":[{"bearer":[]}],"summary":"Eliminar estado","tags":["localities/states"]}},"/localities/cities":{"post":{"description":"Crea una nueva ciudad en el sistema de localidades","operationId":"CitiesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCityDto"}}}},"responses":{"201":{"description":"Ciudad creada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityEntity"}}}},"409":{"description":"Ya existe una ciudad con ese código en el estado"}},"security":[{"bearer":[]}],"summary":"Crear una nueva ciudad","tags":["localities/cities"]},"get":{"description":"Obtiene todas las ciudades con soporte para paginación y filtros avanzados","operationId":"CitiesController_findAll","parameters":[{"name":"page","required":false,"in":"query","description":"Número de página","schema":{"minimum":1,"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Registros por página","schema":{"minimum":1,"default":10,"example":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Campo por el cual ordenar","schema":{"default":"name","example":"name","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Orden ascendente o descendente","schema":{"default":"ASC","example":"ASC","type":"string","enum":["ASC","DESC"]}},{"name":"search","required":false,"in":"query","description":"Búsqueda por nombre o nombre completo","schema":{"example":"Santo","type":"string"}},{"name":"stateId","required":false,"in":"query","description":"Filtrar por ID de estado","schema":{"example":1,"type":"number"}},{"name":"countryCode","required":false,"in":"query","description":"Filtrar por código de país","schema":{"example":"0001","type":"string"}},{"name":"isCapital","required":false,"in":"query","description":"Filtrar solo capitales","schema":{"example":true,"type":"boolean"}},{"name":"isActive","required":false,"in":"query","description":"Filtrar por estado activo","schema":{"example":true,"type":"boolean"}},{"name":"includeState","required":false,"in":"query","description":"Incluir relación con estado","schema":{"default":false,"example":false,"type":"boolean"}},{"name":"includeSectors","required":false,"in":"query","description":"Incluir relación con sectores","schema":{"default":false,"example":false,"type":"boolean"}},{"name":"select","required":false,"in":"query","description":"Columnas específicas a retornar (separadas por coma)","schema":{"example":"id,name,stateId,isCapital","type":"string"}}],"responses":{"200":{"description":"Lista de ciudades obtenida exitosamente"}},"security":[{"bearer":[]}],"summary":"Obtener lista de ciudades con paginación","tags":["localities/cities"]}},"/localities/cities/search":{"get":{"description":"Busca ciudades por nombre o nombre completo","operationId":"CitiesController_search","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"stateId","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Resultados de búsqueda obtenidos","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CityEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Buscar ciudades","tags":["localities/cities"]}},"/localities/cities/capitals":{"get":{"description":"Obtiene todas las ciudades que son capitales de estado/provincia","operationId":"CitiesController_findCapitals","parameters":[{"name":"stateId","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Capitales obtenidas exitosamente","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CityEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener ciudades capitales","tags":["localities/cities"]}},"/localities/cities/state/{stateId}":{"get":{"description":"Obtiene todas las ciudades de un estado específico","operationId":"CitiesController_findByState","parameters":[{"name":"stateId","required":true,"in":"path","description":"ID del estado","schema":{"type":"number"}},{"name":"includeSectors","required":true,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Ciudades obtenidas exitosamente","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CityEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener ciudades por estado","tags":["localities/cities"]}},"/localities/cities/code/{code}":{"get":{"description":"Obtiene una ciudad específica por su código","operationId":"CitiesController_findByCode","parameters":[{"name":"code","required":true,"in":"path","description":"Código de la ciudad","schema":{"type":"number"}}],"responses":{"200":{"description":"Ciudad obtenida exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityEntity"}}}},"404":{"description":"Ciudad no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener ciudad por código","tags":["localities/cities"]}},"/localities/cities/{id}":{"get":{"description":"Obtiene una ciudad específica por su ID","operationId":"CitiesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la ciudad","schema":{"type":"number"}},{"name":"includeSectors","required":true,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Ciudad obtenida exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityEntity"}}}},"404":{"description":"Ciudad no encontrada"}},"security":[{"bearer":[]}],"summary":"Obtener ciudad por ID","tags":["localities/cities"]},"patch":{"description":"Actualiza los datos de una ciudad existente","operationId":"CitiesController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la ciudad","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCityDto"}}}},"responses":{"200":{"description":"Ciudad actualizada exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityEntity"}}}},"404":{"description":"Ciudad no encontrada"}},"security":[{"bearer":[]}],"summary":"Actualizar ciudad","tags":["localities/cities"]},"delete":{"description":"Elimina una ciudad del catálogo","operationId":"CitiesController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la ciudad","schema":{"type":"number"}}],"responses":{"200":{"description":"Ciudad eliminada exitosamente"},"404":{"description":"Ciudad no encontrada"}},"security":[{"bearer":[]}],"summary":"Eliminar ciudad","tags":["localities/cities"]}},"/localities/sectors":{"post":{"description":"Crea un nuevo sector en el sistema de localidades","operationId":"SectorsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSectorDto"}}}},"responses":{"201":{"description":"Sector creado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectorEntity"}}}},"409":{"description":"Ya existe un sector con ese código en la ciudad"}},"security":[{"bearer":[]}],"summary":"Crear un nuevo sector","tags":["localities/sectors"]},"get":{"description":"Obtiene todos los sectores con soporte para paginación y filtros avanzados","operationId":"SectorsController_findAll","parameters":[{"name":"page","required":false,"in":"query","description":"Número de página","schema":{"minimum":1,"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Registros por página","schema":{"minimum":1,"default":10,"example":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Campo por el cual ordenar","schema":{"default":"name","example":"name","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Orden ascendente o descendente","schema":{"default":"ASC","example":"ASC","type":"string","enum":["ASC","DESC"]}},{"name":"search","required":false,"in":"query","description":"Búsqueda por nombre o zona","schema":{"example":"Centro","type":"string"}},{"name":"cityCode","required":false,"in":"query","description":"Filtrar por código de ciudad","schema":{"example":1,"type":"number"}},{"name":"stateId","required":false,"in":"query","description":"Filtrar por ID de estado","schema":{"example":1,"type":"number"}},{"name":"countryCode","required":false,"in":"query","description":"Filtrar por código de país","schema":{"example":"0001","type":"string"}},{"name":"zone","required":false,"in":"query","description":"Filtrar por zona específica","schema":{"example":"Zona Colonial","type":"string"}},{"name":"isActive","required":false,"in":"query","description":"Filtrar por estado activo","schema":{"example":true,"type":"boolean"}},{"name":"includeCity","required":false,"in":"query","description":"Incluir relación con ciudad","schema":{"default":false,"example":false,"type":"boolean"}},{"name":"includeAll","required":false,"in":"query","description":"Incluir relación completa (ciudad, estado, país)","schema":{"default":false,"example":false,"type":"boolean"}},{"name":"select","required":false,"in":"query","description":"Columnas específicas a retornar (separadas por coma)","schema":{"example":"id,name,cityCode,zone","type":"string"}}],"responses":{"200":{"description":"Lista de sectores obtenida exitosamente"}},"security":[{"bearer":[]}],"summary":"Obtener lista de sectores con paginación","tags":["localities/sectors"]}},"/localities/sectors/search":{"get":{"description":"Busca sectores por nombre o zona","operationId":"SectorsController_search","parameters":[{"name":"q","required":true,"in":"query","description":"Término de búsqueda","schema":{"type":"string"}},{"name":"cityId","required":false,"in":"query","description":"ID de la ciudad para filtrar búsqueda","schema":{"type":"number"}}],"responses":{"200":{"description":"Resultados de búsqueda obtenidos","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SectorEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Buscar sectores","tags":["localities/sectors"]}},"/localities/sectors/city/{cityId}":{"get":{"description":"Obtiene todos los sectores de una ciudad específica","operationId":"SectorsController_findByCity","parameters":[{"name":"cityId","required":true,"in":"path","description":"ID de la ciudad","schema":{"type":"number"}}],"responses":{"200":{"description":"Sectores de la ciudad obtenidos exitosamente","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SectorEntity"}}}}}},"security":[{"bearer":[]}],"summary":"Obtener sectores por ciudad","tags":["localities/sectors"]}},"/localities/sectors/{id}":{"get":{"description":"Obtiene un sector específico por su ID","operationId":"SectorsController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID del sector","schema":{"type":"number"}}],"responses":{"200":{"description":"Sector obtenido exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectorEntity"}}}},"404":{"description":"Sector no encontrado"}},"security":[{"bearer":[]}],"summary":"Obtener sector por ID","tags":["localities/sectors"]},"patch":{"description":"Actualiza los datos de un sector existente","operationId":"SectorsController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ID del sector","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSectorDto"}}}},"responses":{"200":{"description":"Sector actualizado exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectorEntity"}}}},"404":{"description":"Sector no encontrado"},"409":{"description":"Conflicto con código existente"}},"security":[{"bearer":[]}],"summary":"Actualizar sector","tags":["localities/sectors"]},"delete":{"description":"Desactiva un sector (eliminación suave)","operationId":"SectorsController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID del sector","schema":{"type":"number"}}],"responses":{"200":{"description":"Sector eliminado exitosamente"},"404":{"description":"Sector no encontrado"}},"security":[{"bearer":[]}],"summary":"Eliminar sector","tags":["localities/sectors"]}}},"info":{"title":"SGM API v2.1","description":"Sistema de Gestión de Membresía - API RESTful","version":"2.1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"JWT":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Enter JWT token"},"X-API-Key":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API Key for authentication"}},"schemas":{"CreateCloudProviderDto":{"type":"object","properties":{}},"UpdateCloudProviderDto":{"type":"object","properties":{}},"UpdateCredentialsDto":{"type":"object","properties":{}},"CreateStorageTypeDto":{"type":"object","properties":{}},"UpdateStorageTypeDto":{"type":"object","properties":{}},"CreateStorageCategoryDto":{"type":"object","properties":{}},"UpdateStorageCategoryDto":{"type":"object","properties":{}},"CreateRedundancyConfigDto":{"type":"object","properties":{}},"UpdateRedundancyConfigDto":{"type":"object","properties":{}},"UpdateFileDto":{"type":"object","properties":{"description":{"type":"string","description":"Nueva descripción"},"visibility":{"type":"string","description":"Nueva visibilidad","enum":["public","private","internal","restricted"]},"metadata":{"type":"object","description":"Metadata adicional"}}},"CreateUserDto":{"type":"object","properties":{"username":{"type":"string","description":"Username for the new user","example":"john.doe"},"email":{"type":"string","description":"Email address","example":"john.doe@example.com"},"password":{"type":"string","description":"Password for the new user","example":"password123","minLength":6},"name":{"type":"string","description":"First name","example":"John"},"lastname":{"type":"string","description":"Last name","example":"Doe"},"church":{"type":"string","description":"Church/Location ID","example":"MAH01"},"profileCode":{"type":"number","description":"Profile code","example":100,"default":100},"status":{"type":"boolean","description":"User status (active/inactive)","example":false,"default":false}},"required":["username","email","password","church"]},"UpdateUserDto":{"type":"object","properties":{"name":{"type":"string","description":"First name","example":"John"},"lastname":{"type":"string","description":"Last name","example":"Doe"},"email":{"type":"string","description":"Email address","example":"john.doe@example.com"},"username":{"type":"string","description":"Username","example":"john.doe"},"password":{"type":"string","description":"New password","minLength":6},"status":{"type":"boolean","description":"User status (active/inactive)","example":true},"church":{"type":"string","description":"Church/Location ID","example":"MAH01"},"profileCode":{"type":"number","description":"Profile code","example":100}}},"CreateProfileDto":{"type":"object","properties":{"code":{"type":"number","description":"Código del perfil","example":101},"name":{"type":"string","description":"Nombre del perfil","example":"Administrador"},"description":{"type":"string","description":"Descripción del perfil","example":"Perfil con permisos de administrador"},"status":{"type":"boolean","description":"Estado del perfil","example":true,"default":true}},"required":["code","name"]},"UpdateProfileDto":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del perfil","example":"Administrador"},"description":{"type":"string","description":"Descripción del perfil","example":"Perfil con permisos de administrador"},"status":{"type":"boolean","description":"Estado del perfil","example":true}}},"ActivityScheduleDto":{"type":"object","properties":{"day":{"type":"string","description":"Día de la sesión","example":"Monday o 2026-01-23"},"dateFrom":{"type":"string","description":"Fecha desde (alternativa a day)","example":"2026-01-23"},"dateTo":{"type":"string","description":"Fecha hasta (alternativa a day)","example":"2026-01-23"},"startTime":{"type":"string","description":"Hora de inicio","example":"09:00"},"endTime":{"type":"string","description":"Hora de fin","example":"12:00"},"topic":{"type":"string","description":"Tema de la sesión"},"facilitator":{"type":"string","description":"Facilitador de la sesión"},"location":{"type":"string","description":"Ubicación específica de la sesión"}},"required":["day","startTime","endTime"]},"ActivitySchedulesDto":{"type":"object","properties":{"sessions":{"description":"Sesiones de la actividad","type":"array","items":{"$ref":"#/components/schemas/ActivityScheduleDto"}},"timezone":{"type":"string","description":"Zona horaria","example":"America/Santo_Domingo"},"duration":{"type":"number","description":"Duración total en minutos"}}},"ActivityRequirementsDto":{"type":"object","properties":{"minimumAge":{"type":"number","description":"Edad mínima requerida"},"maximumAge":{"type":"number","description":"Edad máxima permitida"},"membershipRequired":{"type":"boolean","description":"Membresía requerida"},"specialSkills":{"description":"Habilidades especiales requeridas","example":["swimming","hiking"],"type":"array","items":{"type":"string"}},"documents":{"description":"Documentos requeridos","example":["ID copy","medical certificate"],"type":"array","items":{"type":"string"}},"prerequisites":{"description":"Prerrequisitos de cursos","type":"array","items":{"type":"string"}},"healthRequirements":{"description":"Requisitos de salud","type":"array","items":{"type":"string"}},"equipmentRequired":{"description":"Equipo requerido","type":"array","items":{"type":"string"}}}},"ActivitySettingsDto":{"type":"object","properties":{"allowWaitingList":{"type":"boolean","description":"Permitir lista de espera"},"autoConfirmRegistration":{"type":"boolean","description":"Confirmar registro automáticamente"},"requiresApproval":{"type":"boolean","description":"Requiere aprobación manual"},"allowCancellation":{"type":"boolean","description":"Permitir cancelaciones"},"cancellationDeadline":{"type":"string","description":"Fecha límite para cancelaciones"},"refundPolicy":{"type":"string","description":"Política de reembolso","enum":["full","partial","none"],"example":"partial"},"partialRefundPercentage":{"type":"number","description":"Porcentaje de reembolso parcial"},"allowPartialPayments":{"type":"boolean","description":"Permitir pagos parciales"}}},"CreateActivityDto":{"type":"object","properties":{"church":{"type":"string","description":"Localidad donde se realiza la actividad","example":"MLR","maxLength":5},"name":{"type":"string","description":"Nombre de la actividad","example":"Conferencia de Liderazgo 2025"},"type":{"type":"string","description":"Tipo de actividad","enum":["1","2","3","4","5","6","7"],"example":"7"},"startDate":{"type":"string","description":"Fecha y hora de inicio","example":"2025-12-01T09:00:00Z"},"endDate":{"type":"string","description":"Fecha y hora de finalización","example":"2025-12-03T17:00:00Z"},"schedules":{"description":"Horarios detallados de la actividad","allOf":[{"$ref":"#/components/schemas/ActivitySchedulesDto"}]},"description":{"type":"string","description":"Descripción detallada de la actividad","example":"Conferencia de tres días enfocada en el desarrollo de líderes cristianos..."},"currency":{"type":"string","description":"Moneda del costo","enum":["USD","DOP","EUR"],"default":"USD"},"cost":{"type":"number","description":"Costo de participación","example":150,"minimum":0},"maxQuota":{"type":"number","description":"Cupo máximo de participantes","example":50,"minimum":1},"locationPlace":{"type":"string","description":"Lugar específico del evento","example":"Auditorio Principal, Iglesia Manantiales"},"registrationDeadline":{"type":"string","description":"Fecha límite para inscripciones","example":"2025-11-25T23:59:59Z"},"requirements":{"description":"Requisitos para participación","allOf":[{"$ref":"#/components/schemas/ActivityRequirementsDto"}]},"activitySettings":{"description":"Configuraciones especiales","allOf":[{"$ref":"#/components/schemas/ActivitySettingsDto"}]},"categories":{"description":"Categorías de la actividad","example":["conferencia","liderazgo","capacitación"],"type":"array","items":{"type":"string"}},"tags":{"description":"Tags para búsqueda","example":["leadership","training","2025"],"type":"array","items":{"type":"string"}},"organizingMinistryId":{"type":"number","description":"ID del ministerio organizador"},"responsibleUserId":{"type":"number","description":"ID del usuario responsable"}},"required":["church","name","type","startDate","endDate","description","responsibleUserId"]},"ActivityResponseDto":{"type":"object","properties":{"id":{"type":"number","description":"ID de la actividad"},"location":{"type":"string","description":"Localidad"},"activityName":{"type":"string","description":"Nombre de la actividad"},"activityType":{"type":"string","description":"Tipo de actividad","enum":["1","2","3","4","5","6","7"]},"startDate":{"format":"date-time","type":"string","description":"Fecha de inicio"},"endDate":{"format":"date-time","type":"string","description":"Fecha de finalización"},"schedules":{"type":"object","description":"Horarios detallados"},"description":{"type":"string","description":"Descripción"},"currency":{"type":"string","description":"Moneda","enum":["USD","DOP","EUR"]},"cost":{"type":"number","description":"Costo"},"maxQuota":{"type":"number","description":"Cupo máximo"},"currentQuota":{"type":"number","description":"Cupo actual"},"status":{"type":"string","description":"Estado: '0'=Cerrada, '1'=Abierta","example":"1"},"locationPlace":{"type":"string","description":"Lugar específico"},"isActive":{"type":"boolean","description":"Está activa"},"registrationDeadline":{"format":"date-time","type":"string","description":"Fecha límite de inscripciones"},"requirements":{"type":"object","description":"Requisitos"},"activitySettings":{"type":"object","description":"Configuraciones"},"categories":{"description":"Categorías","type":"array","items":{"type":"string"}},"tags":{"description":"Tags","type":"array","items":{"type":"string"}},"organizingMinistryId":{"type":"number","description":"ID del ministerio organizador"},"responsibleUserId":{"type":"number","description":"ID del usuario responsable"},"createdBy":{"type":"string","description":"Usuario que creó"},"createdAt":{"format":"date-time","type":"string","description":"Fecha de creación"},"updatedBy":{"type":"string","description":"Usuario que actualizó"},"updatedAt":{"format":"date-time","type":"string","description":"Fecha de actualización"},"availableQuota":{"type":"number","description":"Cupos disponibles"},"hasAvailableQuota":{"type":"boolean","description":"Hay cupos disponibles"},"occupancyPercentage":{"type":"number","description":"Porcentaje de ocupación"},"durationInDays":{"type":"number","description":"Duración en días"},"isUpcoming":{"type":"boolean","description":"Está por venir"},"isInProgress":{"type":"boolean","description":"Está en progreso"},"isPast":{"type":"boolean","description":"Ya terminó"},"isRegistrationOpen":{"type":"boolean","description":"Inscripciones abiertas"},"daysUntilStart":{"type":"number","description":"Días hasta inicio"}},"required":["id","location","activityName","activityType","startDate","endDate","description","currency","cost","currentQuota","status","isActive","responsibleUserId","createdBy","createdAt","updatedBy","updatedAt","hasAvailableQuota","occupancyPercentage","durationInDays","isUpcoming","isInProgress","isPast","isRegistrationOpen","daysUntilStart"]},"PaginatedActivitiesResponseDto":{"type":"object","properties":{"data":{"description":"Lista de actividades","type":"array","items":{"$ref":"#/components/schemas/ActivityResponseDto"}},"total":{"type":"number","description":"Total de registros"},"page":{"type":"number","description":"Página actual"},"limit":{"type":"number","description":"Registros por página"},"totalPages":{"type":"number","description":"Total de páginas"},"hasPreviousPage":{"type":"boolean","description":"Tiene página anterior"},"hasNextPage":{"type":"boolean","description":"Tiene página siguiente"}},"required":["data","total","page","limit","totalPages","hasPreviousPage","hasNextPage"]},"ActivityAvailabilityDto":{"type":"object","properties":{"activityId":{"type":"number","description":"ID de la actividad"},"activityName":{"type":"string","description":"Nombre de la actividad"},"maxQuota":{"type":"number","description":"Cupo máximo"},"currentQuota":{"type":"number","description":"Cupo actual"},"availableQuota":{"type":"number","description":"Cupos disponibles"},"hasAvailableQuota":{"type":"boolean","description":"Hay cupos disponibles"},"occupancyPercentage":{"type":"number","description":"Porcentaje de ocupación"},"allowWaitingList":{"type":"boolean","description":"Permite lista de espera"},"waitingListCount":{"type":"number","description":"Número de personas en lista de espera"},"isRegistrationOpen":{"type":"boolean","description":"Inscripciones abiertas"},"registrationDeadline":{"format":"date-time","type":"string","description":"Fecha límite de inscripciones"},"daysUntilRegistrationDeadline":{"type":"number","description":"Días restantes para inscripción"}},"required":["activityId","activityName","maxQuota","currentQuota","availableQuota","hasAvailableQuota","occupancyPercentage","allowWaitingList","waitingListCount","isRegistrationOpen","registrationDeadline","daysUntilRegistrationDeadline"]},"UpdateActivityDto":{"type":"object","properties":{"church":{"type":"string","description":"Localidad donde se realiza la actividad","example":"MLR","maxLength":5},"name":{"type":"string","description":"Nombre de la actividad","example":"Conferencia de Liderazgo 2025"},"type":{"type":"string","description":"Tipo de actividad","enum":["1","2","3","4","5","6","7"],"example":"7"},"startDate":{"type":"string","description":"Fecha y hora de inicio","example":"2025-12-01T09:00:00Z"},"endDate":{"type":"string","description":"Fecha y hora de finalización","example":"2025-12-03T17:00:00Z"},"schedules":{"description":"Horarios detallados de la actividad","allOf":[{"$ref":"#/components/schemas/ActivitySchedulesDto"}]},"description":{"type":"string","description":"Descripción detallada de la actividad","example":"Conferencia de tres días enfocada en el desarrollo de líderes cristianos..."},"currency":{"type":"string","description":"Moneda del costo","enum":["USD","DOP","EUR"],"default":"USD"},"cost":{"type":"number","description":"Costo de participación","example":150,"minimum":0},"maxQuota":{"type":"number","description":"Cupo máximo de participantes","example":50,"minimum":1},"locationPlace":{"type":"string","description":"Lugar específico del evento","example":"Auditorio Principal, Iglesia Manantiales"},"registrationDeadline":{"type":"string","description":"Fecha límite para inscripciones","example":"2025-11-25T23:59:59Z"},"requirements":{"description":"Requisitos para participación","allOf":[{"$ref":"#/components/schemas/ActivityRequirementsDto"}]},"activitySettings":{"description":"Configuraciones especiales","allOf":[{"$ref":"#/components/schemas/ActivitySettingsDto"}]},"categories":{"description":"Categorías de la actividad","example":["conferencia","liderazgo","capacitación"],"type":"array","items":{"type":"string"}},"tags":{"description":"Tags para búsqueda","example":["leadership","training","2025"],"type":"array","items":{"type":"string"}},"organizingMinistryId":{"type":"number","description":"ID del ministerio organizador"},"responsibleUserId":{"type":"number","description":"ID del usuario responsable"}}},"AddonSelectionDto":{"type":"object","properties":{"addonId":{"type":"number","example":1},"quantity":{"type":"number","example":2,"default":1}},"required":["addonId","quantity"]},"EmergencyContactDto":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del contacto de emergencia","example":"Juan Pérez"},"phone":{"type":"string","description":"Teléfono del contacto","example":"809-555-0123"},"relationship":{"type":"string","description":"Relación con el participante","example":"padre"}},"required":["name","phone","relationship"]},"ParticipantAdditionalInfoDto":{"type":"object","properties":{"emergencyContact":{"description":"Contacto de emergencia","allOf":[{"$ref":"#/components/schemas/EmergencyContactDto"}]},"dietaryRestrictions":{"description":"Restricciones dietéticas","example":["vegetarian","gluten-free"],"type":"array","items":{"type":"string"}},"medicalInfo":{"type":"string","description":"Información médica importante","example":"Alérgico a mariscos"},"transportationNeeds":{"type":"string","description":"Necesidades de transporte","example":"bus"},"roomingPreferences":{"type":"string","description":"Preferencias de alojamiento","example":"single"},"specialRequests":{"type":"string","description":"Solicitudes especiales","example":"Necesita silla accesible"},"groupPreferences":{"description":"Preferencias de grupo","type":"array","items":{"type":"string"}},"previousExperience":{"type":"boolean","description":"Tiene experiencia previa en actividades similares"},"skillLevel":{"type":"string","description":"Nivel de habilidad","enum":["beginner","intermediate","advanced"]},"equipmentProvided":{"description":"Equipo que puede proporcionar","type":"array","items":{"type":"string"}},"additionalDocuments":{"description":"Documentos adicionales proporcionados","type":"array","items":{"type":"string"}}}},"NotificationPreferencesDto":{"type":"object","properties":{"email":{"type":"boolean","description":"Recibir notificaciones por email","default":true},"sms":{"type":"boolean","description":"Recibir notificaciones por SMS","default":false},"push":{"type":"boolean","description":"Recibir notificaciones push","default":true},"reminders":{"type":"boolean","description":"Recibir recordatorios","default":true},"updates":{"type":"boolean","description":"Recibir actualizaciones de la actividad","default":true},"marketing":{"type":"boolean","description":"Recibir material de marketing","default":false}}},"CreateParticipantDto":{"type":"object","properties":{"activityId":{"type":"number","description":"ID de la actividad"},"memberId":{"type":"number","description":"ID del miembro participante (requerido para actividades de membresía)"},"participantName":{"type":"string","description":"Nombre completo del participante (requerido si no se proporciona memberId)","example":"Juan Pérez"},"participantEmail":{"type":"string","description":"Email del participante (opcional, recomendado para notificaciones)","example":"juan.perez@example.com"},"participantPhone":{"type":"string","description":"Teléfono del participante","example":"809-555-0123"},"participantIdentification":{"type":"string","description":"Identificación/cédula del participante (opcional, usado para verificación de duplicados)","example":"001-1234567-8"},"paymentDeadline":{"type":"string","description":"Fecha límite de pago personalizada","example":"2025-12-15T23:59:59Z"},"totalAmount":{"type":"number","description":"Monto total personalizado (override del costo de actividad)"},"addons":{"description":"Add-ons seleccionados durante el registro","type":"array","items":{"$ref":"#/components/schemas/AddonSelectionDto"}},"comment":{"type":"string","description":"Comentarios sobre la inscripción"},"schedules":{"type":"string","description":"Horarios de la actividad (JSON string)","example":"[{\"from\":\"2025-12-12\",\"to\":\"2025-12-13\",\"houre\":\"\"}]"},"additionalInfo":{"description":"Información adicional del participante","allOf":[{"$ref":"#/components/schemas/ParticipantAdditionalInfoDto"}]},"notificationPreferences":{"description":"Preferencias de notificación","allOf":[{"$ref":"#/components/schemas/NotificationPreferencesDto"}]}},"required":["activityId"]},"BulkCreateParticipantDto":{"type":"object","properties":{"activityId":{"type":"number","description":"ID de la actividad"},"memberIds":{"description":"Lista de IDs de miembros para registrar","example":[1,2,3,4,5],"type":"array","items":{"type":"number"}},"paymentDeadline":{"type":"string","description":"Fecha límite de pago para todos"},"totalAmount":{"type":"number","description":"Monto total personalizado para todos"},"addons":{"description":"Add-ons a registrar para todos los participantes del lote","type":"array","items":{"$ref":"#/components/schemas/AddonSelectionDto"}},"comment":{"type":"string","description":"Comentarios para todos los registros"}},"required":["activityId","memberIds"]},"UpdateParticipantDto":{"type":"object","properties":{"participationStatus":{"type":"string","description":"Estado de participación","enum":["REGISTERED","CONFIRMED","WAITING","ATTENDED","ABSENT","CANCELLED","WITHDRAWN"]},"paymentStatus":{"type":"string","description":"Estado de pago","enum":["PENDING","PAID","PARTIAL","EXONERATED","REFUNDED","DUE","NOT_APPLICABLE"]},"totalAmount":{"type":"number","description":"Monto total"},"paidAmount":{"type":"number","description":"Monto pagado"},"pendingAmountValue":{"type":"number","description":"Monto pendiente"},"paymentDeadline":{"type":"string","description":"Fecha límite de pago"},"paymentReference":{"type":"string","description":"Referencia de pago"},"comment":{"type":"string","description":"Comentarios"},"additionalInfo":{"description":"Información adicional","allOf":[{"$ref":"#/components/schemas/ParticipantAdditionalInfoDto"}]},"notificationPreferences":{"description":"Preferencias de notificación","allOf":[{"$ref":"#/components/schemas/NotificationPreferencesDto"}]},"evaluationScore":{"type":"number","description":"Puntuación de evaluación (1-10)"},"evaluationComments":{"type":"string","description":"Comentarios de evaluación"},"certificateIssued":{"type":"string","description":"Certificado emitido"},"isActive":{"type":"boolean","description":"Participante activo"},"status":{"type":"string","description":"Estado legacy (0=cancelado, 1=activo)","example":"1"}}},"CheckInParticipantDto":{"type":"object","properties":{"comment":{"type":"string","description":"Comentarios del check-in"}}},"CheckOutParticipantDto":{"type":"object","properties":{"comment":{"type":"string","description":"Comentarios del check-out"},"evaluationScore":{"type":"number","description":"Puntuación de evaluación (1-10)"},"evaluationComments":{"type":"string","description":"Comentarios de evaluación"}}},"BulkConfirmParticipantsDto":{"type":"object","properties":{"participantIds":{"description":"IDs de participantes para la acción masiva","type":"array","items":{"type":"number"}},"comment":{"type":"string","description":"Comentario para la acción masiva"},"confirmedAt":{"type":"string","description":"Fecha de confirmación personalizada"}},"required":["participantIds"]},"BulkCheckInParticipantsDto":{"type":"object","properties":{"participantIds":{"description":"IDs de participantes para la acción masiva","type":"array","items":{"type":"number"}},"comment":{"type":"string","description":"Comentario para la acción masiva"},"checkedInAt":{"type":"string","description":"Fecha de check-in personalizada"}},"required":["participantIds"]},"BulkCheckOutParticipantsDto":{"type":"object","properties":{"participantIds":{"description":"IDs de participantes para la acción masiva","type":"array","items":{"type":"number"}},"comment":{"type":"string","description":"Comentario para la acción masiva"},"checkedOutAt":{"type":"string","description":"Fecha de check-out personalizada"}},"required":["participantIds"]},"RemoveParticipantDto":{"type":"object","properties":{"activityId":{"type":"number","description":"ID de la actividad"},"reason":{"type":"string","description":"Motivo de la cancelación","default":"Cancelado por administrador"},"notifyMember":{"type":"boolean","description":"Notificar al miembro","default":false}}},"RestoreParticipantDto":{"type":"object","properties":{"reason":{"type":"string","description":"Reason for restoring the participant","example":"Payment issue resolved, restoring registration","maxLength":500},"forceWaitingList":{"type":"boolean","description":"Force participant to waiting list even if quota is available","example":false,"default":false}}},"CreateMemberDto":{"type":"object","properties":{"documentType":{"type":"string","description":"Tipo de documento de identificación (ID_CARD=Cédula, PASSPORT=Pasaporte, RNC, NOT_SPECIFIED)","enum":["ID_CARD","PASSPORT","RNC","NOT_SPECIFIED"],"default":"ID_CARD"},"sex":{"type":"string","description":"Sexo (MALE=Masculino, FEMALE=Femenino)","enum":["MALE","FEMALE"]},"maritalStatus":{"type":"string","description":"Estado civil (SINGLE, MARRIED, DIVORCED, WIDOWER, COMMON_LAW_MARRIAGE)","enum":["SINGLE","MARRIED","DIVORCED","WIDOWER","COMMON_LAW_MARRIAGE"],"default":"SINGLE"}}},"UpdateMemberDto":{"type":"object","properties":{}},"AddMemberMinistriesDto":{"type":"object","properties":{"ministryIds":{"description":"IDs de ministerios a agregar","example":[1,3,5],"type":"array","items":{"type":"number"}}},"required":["ministryIds"]},"AddMemberMinistryGroupsDto":{"type":"object","properties":{"groupIds":{"description":"IDs de grupos de ministerio a agregar","example":[2,4,6],"type":"array","items":{"type":"number"}}},"required":["groupIds"]},"RemoveMemberMinistriesDto":{"type":"object","properties":{"ministryIds":{"description":"IDs de ministerios a remover","example":[1,3],"type":"array","items":{"type":"number"}}},"required":["ministryIds"]},"RemoveMemberMinistryGroupsDto":{"type":"object","properties":{"groupIds":{"description":"IDs de grupos de ministerio a remover","example":[2,4],"type":"array","items":{"type":"number"}}},"required":["groupIds"]},"SyncMemberMinistriesDto":{"type":"object","properties":{"ministryIds":{"description":"IDs de ministerios a sincronizar (reemplaza todos los existentes)","example":[1,3,5,7],"type":"array","items":{"type":"number"}},"groupIds":{"description":"IDs de grupos de ministerio a sincronizar (reemplaza todos los existentes)","example":[2,4,6],"type":"array","items":{"type":"number"}}}},"SetMinistryLeaderDto":{"type":"object","properties":{"ministryId":{"type":"number","description":"ID del ministerio","example":1},"isLeader":{"type":"boolean","description":"Si el miembro es líder del ministerio","example":true}},"required":["ministryId","isLeader"]},"SetMinistryGroupLeaderDto":{"type":"object","properties":{"groupId":{"type":"number","description":"ID del grupo de ministerio","example":1},"isLeader":{"type":"boolean","description":"Si el miembro es líder del grupo","example":true}},"required":["groupId","isLeader"]},"UpdateMinistriesLeadershipDto":{"type":"object","properties":{"ministries":{"description":"Array de ministerios con su estado de liderazgo","example":[{"ministryId":1,"isLeader":true},{"ministryId":2,"isLeader":false}],"type":"array","items":{"$ref":"#/components/schemas/SetMinistryLeaderDto"}}},"required":["ministries"]},"UpdateMinistryGroupsLeadershipDto":{"type":"object","properties":{"groups":{"description":"Array de grupos con su estado de liderazgo","example":[{"groupId":1,"isLeader":true},{"groupId":2,"isLeader":false}],"type":"array","items":{"$ref":"#/components/schemas/SetMinistryGroupLeaderDto"}}},"required":["groups"]},"AddMemberAsLeaderDto":{"type":"object","properties":{"ministryIds":{"description":"IDs de los ministerios donde será líder","example":[1,3,5],"type":"array","items":{"type":"number"}},"groupIds":{"description":"IDs de los grupos de ministerio donde será líder","example":[2,4],"type":"array","items":{"type":"number"}}}},"CreateImageDto":{"type":"object","properties":{"ownerId":{"type":"number","description":"ID del propietario de la imagen","example":123},"ownerType":{"type":"string","description":"Tipo de propietario de la imagen","example":"user"},"type":{"type":"string","description":"Tipo de imagen","example":"profile"},"visibility":{"type":"string","description":"Visibilidad de la imagen","example":"public"},"description":{"type":"string","description":"Descripción de la imagen","example":"Foto de perfil del usuario"},"tags":{"description":"Etiquetas asociadas a la imagen","example":["perfil","usuario"],"type":"array","items":{"type":"string"}},"allowedRoles":{"description":"Roles permitidos para acceder a la imagen","example":["admin","editor"],"type":"array","items":{"type":"string"}},"allowedUsers":{"description":"Usuarios permitidos para acceder a la imagen","example":["user1","user2"],"type":"array","items":{"type":"string"}},"isPrimary":{"type":"boolean","description":"Indica si la imagen es la principal","example":true},"sortOrder":{"type":"number","description":"Orden de clasificación de la imagen","example":1},"notes":{"type":"string","description":"Notas adicionales sobre la imagen","example":"Imagen tomada en la sesión de fotos de verano"}},"required":["ownerType","type"]},"UpdateImageDto":{"type":"object","properties":{"status":{"type":"string","description":"Estado de la imagen","example":"active"},"visibility":{"type":"string","description":"Visibilidad de la imagen","example":"public"}}},"CreateAddonDto":{"type":"object","properties":{"code":{"type":"string","example":"KIT-CAMP-2026"},"name":{"type":"string","example":"Kit de Campamento"},"description":{"type":"string"},"category":{"type":"string","enum":["PRODUCTO","SERVICIO","ACCESO"]},"basePrice":{"type":"number","example":1500},"currency":{"type":"string","example":"DOP","default":"DOP"},"hasStock":{"type":"boolean","default":false},"stockQty":{"type":"number","example":100},"imageUrl":{"type":"string"},"isGlobal":{"type":"boolean","default":true},"activityIds":{"description":"Actividades a vincular al crear/actualizar el add-on","type":"array","items":{"type":"number"}},"status":{"type":"string","enum":["ACTIVE","INACTIVE"],"default":"ACTIVE"}},"required":["name","basePrice"]},"AddonEntity":{"type":"object","properties":{"id":{"type":"number"},"code":{"type":"string","example":"KIT-CAMP-2026"},"name":{"type":"string","example":"Kit de Campamento"},"description":{"type":"string"},"category":{"type":"string","enum":["PRODUCTO","SERVICIO","ACCESO"]},"basePrice":{"type":"number","example":1500},"currency":{"type":"string","example":"DOP"},"hasStock":{"type":"boolean","default":false},"stockQty":{"type":"number"},"imageUrl":{"type":"string"},"isGlobal":{"type":"boolean","default":true},"status":{"type":"string","enum":["ACTIVE","INACTIVE"],"default":"ACTIVE"},"createdBy":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedBy":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","code","name","basePrice","currency","hasStock","isGlobal","status","createdAt","updatedAt"]},"UpdateAddonDto":{"type":"object","properties":{"code":{"type":"string","example":"KIT-CAMP-2026"},"name":{"type":"string","example":"Kit de Campamento"},"description":{"type":"string"},"category":{"type":"string","enum":["PRODUCTO","SERVICIO","ACCESO"]},"basePrice":{"type":"number","example":1500},"currency":{"type":"string","example":"DOP","default":"DOP"},"hasStock":{"type":"boolean","default":false},"stockQty":{"type":"number","example":100},"imageUrl":{"type":"string"},"isGlobal":{"type":"boolean","default":true},"activityIds":{"description":"Actividades a vincular al crear/actualizar el add-on","type":"array","items":{"type":"number"}},"status":{"type":"string","enum":["ACTIVE","INACTIVE"],"default":"ACTIVE"}}},"ActivityAddonConfigEntity":{"type":"object","properties":{"id":{"type":"number"},"activityId":{"type":"number"},"addonId":{"type":"number"},"customPrice":{"type":"number"},"bundlePrice":{"type":"number"},"maxQtyPerParticipant":{"type":"number","default":1},"displayOrder":{"type":"number","default":0},"isActive":{"type":"boolean","default":true},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","activityId","addonId","maxQtyPerParticipant","displayOrder","isActive","createdAt","updatedAt"]},"ActivityAddonConfigDto":{"type":"object","properties":{"addonId":{"type":"number","example":1},"customPrice":{"type":"number","example":1200},"bundlePrice":{"type":"number","example":1000},"maxQtyPerParticipant":{"type":"number","example":2,"default":1},"displayOrder":{"type":"number","example":0},"isActive":{"type":"boolean","default":true}},"required":["addonId"]},"AddonQuoteRequestDto":{"type":"object","properties":{"selections":{"type":"array","items":{"$ref":"#/components/schemas/AddonSelectionDto"}}},"required":["selections"]},"ParticipantAddonEntity":{"type":"object","properties":{"id":{"type":"number"},"participantId":{"type":"number"},"activityId":{"type":"number"},"addonId":{"type":"number"},"paymentId":{"type":"number"},"quantity":{"type":"number","default":1},"unitPrice":{"type":"number"},"totalPrice":{"type":"number"},"currency":{"type":"string","example":"DOP"},"pricingMode":{"type":"string","enum":["BASE","CUSTOM","BUNDLE"],"default":"BASE"},"paymentStatus":{"type":"string","enum":["PENDING","PAID","CANCELLED","REFUNDED"],"default":"PENDING"},"deliveryStatus":{"type":"string","enum":["PENDING","DELIVERED"],"default":"PENDING"},"deliveredAt":{"format":"date-time","type":"string"},"deliveredBy":{"type":"string"},"notes":{"type":"string"},"createdBy":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedBy":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","participantId","activityId","addonId","quantity","unitPrice","totalPrice","currency","pricingMode","paymentStatus","deliveryStatus","createdAt","updatedAt"]},"DeliverAddonDto":{"type":"object","properties":{"participantAddonIds":{"example":[1,2,3],"type":"array","items":{"type":"number"}},"notes":{"type":"string"}},"required":["participantAddonIds"]},"QuoteAddonSaleDto":{"type":"object","properties":{"selections":{"type":"array","items":{"$ref":"#/components/schemas/AddonSelectionDto"}}},"required":["selections"]},"CreateAddonSaleDto":{"type":"object","properties":{"selections":{"description":"Add-ons a vender","type":"array","items":{"$ref":"#/components/schemas/AddonSelectionDto"}},"buyerMemberCode":{"type":"string","description":"Codigo del miembro comprador (opcional)"},"buyerName":{"type":"string","description":"Nombre del comprador (no miembro)"},"buyerEmail":{"type":"string"},"buyerPhone":{"type":"string"},"notes":{"type":"string","description":"Notas internas de la venta"}},"required":["selections"]},"AddonSaleEntity":{"type":"object","properties":{"id":{"type":"number"},"churchId":{"type":"number"},"saleNumber":{"type":"string"},"buyerMemberCode":{"type":"string"},"buyerName":{"type":"string"},"buyerEmail":{"type":"string"},"buyerPhone":{"type":"string"},"currency":{"type":"string","example":"DOP"},"subtotal":{"type":"number"},"discountTotal":{"type":"number"},"total":{"type":"number"},"paidAmount":{"type":"number"},"paymentStatus":{"type":"string","enum":["PENDING","PAID","REFUNDED","CANCELLED"],"default":"PENDING"},"paymentId":{"type":"number"},"status":{"type":"string","enum":["OPEN","CANCELLED"],"default":"OPEN"},"cancelledAt":{"format":"date-time","type":"string"},"cancelledBy":{"type":"string"},"cancellationReason":{"type":"string"},"notes":{"type":"string"},"createdBy":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedBy":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","churchId","saleNumber","currency","subtotal","discountTotal","total","paidAmount","paymentStatus","status","createdAt","updatedAt"]},"UpdateAddonSaleDto":{"type":"object","properties":{"selections":{"description":"Reemplaza las lineas de la venta. Solo permitido si la venta no esta pagada.","type":"array","items":{"$ref":"#/components/schemas/AddonSelectionDto"}},"buyerMemberCode":{"type":"string"},"buyerName":{"type":"string"},"buyerEmail":{"type":"string"},"buyerPhone":{"type":"string"},"notes":{"type":"string"}}},"CancelAddonSaleDto":{"type":"object","properties":{"reason":{"type":"string","description":"Razon de la cancelacion"}},"required":["reason"]},"DeliverAddonSaleLineDto":{"type":"object","properties":{"lineId":{"type":"number","description":"ID de la linea a entregar"},"quantity":{"type":"number","description":"Cantidad a entregar (si parcial). Por defecto entrega todo lo restante."},"notes":{"type":"string"}},"required":["lineId"]},"DeliverAddonSaleDto":{"type":"object","properties":{"lines":{"type":"array","items":{"$ref":"#/components/schemas/DeliverAddonSaleLineDto"}},"generalNotes":{"type":"string"}},"required":["lines"]},"SocialMediaDto":{"type":"object","properties":{"facebook":{"type":"string","description":"URL de Facebook","example":"https://facebook.com/mahanaim"},"instagram":{"type":"string","description":"URL de Instagram","example":"https://instagram.com/mahanaim"},"youtube":{"type":"string","description":"URL de YouTube","example":"https://youtube.com/mahanaim"},"tiktok":{"type":"string","description":"URL de TikTok","example":"https://tiktok.com/@mahanaim"},"twitter":{"type":"string","description":"URL de Twitter","example":"https://twitter.com/mahanaim"}}},"MinistryConfigDto":{"type":"object","properties":{"hasYouthMinistry":{"type":"boolean","description":"Tiene ministerio juvenil","example":true},"hasChildrenMinistry":{"type":"boolean","description":"Tiene ministerio de niños","example":true},"hasWomenMinistry":{"type":"boolean","description":"Tiene ministerio de mujeres","example":true},"hasMenMinistry":{"type":"boolean","description":"Tiene ministerio de hombres","example":true},"hasWorshipTeam":{"type":"boolean","description":"Tiene equipo de alabanza","example":true},"hasNetworkSystem":{"type":"boolean","description":"Usa sistema de redes (R1, R2, R3)","example":true},"allowsOnlineServices":{"type":"boolean","description":"Permite servicios en línea","example":true},"allowsOnlineGiving":{"type":"boolean","description":"Permite ofrendas en línea","example":true}}},"CreateChurchDto":{"type":"object","properties":{"code":{"type":"string","description":"Código único de la iglesia","example":"MLR","maxLength":10},"name":{"type":"string","description":"Nombre de la iglesia","example":"Mahanaim La Romana","maxLength":150},"fullName":{"type":"string","description":"Nombre completo oficial","example":"Iglesia Cristiana Mahanaim La Romana","maxLength":200},"denomination":{"type":"string","description":"Denominación o red de iglesias","example":"Mahanaim","maxLength":50,"default":"Mahanaim"},"address":{"type":"string","description":"Dirección completa","example":"C/ Castillo Márquez #74, esq. Fray Juan de Utrera, La Romana"},"phone":{"type":"string","description":"Teléfono principal","example":"+1-809-555-0123","maxLength":20},"email":{"type":"string","description":"Email institucional","example":"info@mahanaim.org","maxLength":100},"website":{"type":"string","description":"Sitio web oficial","example":"https://mahanaim.org","maxLength":100},"countryId":{"type":"string","description":"ID del país donde se ubica (código de 4 dígitos)","example":"0001"},"stateId":{"type":"number","description":"ID del estado/provincia donde se ubica","example":13},"cityId":{"type":"number","description":"ID de la ciudad donde se ubica","example":1},"sectorId":{"type":"number","description":"ID del sector donde se ubica","example":1025},"latitude":{"type":"number","description":"Latitud geográfica","example":18.427551},"longitude":{"type":"number","description":"Longitud geográfica","example":-68.972259},"postalCode":{"type":"string","description":"Código postal","example":"22000","maxLength":20},"foundingDate":{"type":"string","description":"Fecha de fundación","example":"1985-06-15"},"seniorPastor":{"type":"string","description":"Nombre del pastor principal","example":"Pastor Juan Pérez","maxLength":100},"assistantPastor":{"type":"string","description":"Nombre del pastor asistente","example":"Pastor María García","maxLength":100},"capacity":{"type":"number","description":"Capacidad del templo","example":500},"averageAttendance":{"type":"number","description":"Asistencia promedio","example":350,"default":0},"churchType":{"type":"string","description":"Tipo de iglesia","enum":["MAIN","BRANCH","CELL_GROUP","MISSION","EXTENSION"],"example":"BRANCH","default":"BRANCH"},"status":{"type":"string","description":"Estado operativo","enum":["ACTIVE","INACTIVE","UNDER_CONSTRUCTION","CLOSED","MERGED"],"example":"ACTIVE","default":"ACTIVE"},"isActive":{"type":"boolean","description":"Iglesia activa en el sistema","example":true,"default":true},"displayOrder":{"type":"number","description":"Orden de visualización","example":1,"default":0},"timezone":{"type":"string","description":"Zona horaria","example":"America/Santo_Domingo","maxLength":50,"default":"America/Santo_Domingo"},"currencyCode":{"type":"string","description":"Código de moneda","example":"DOP","maxLength":3,"default":"DOP"},"languageCode":{"type":"string","description":"Código de idioma","example":"es-DO","maxLength":5,"default":"es-DO"},"socialMedia":{"description":"Redes sociales de la iglesia","allOf":[{"$ref":"#/components/schemas/SocialMediaDto"}]},"ministryConfig":{"description":"Configuración ministerial","allOf":[{"$ref":"#/components/schemas/MinistryConfigDto"}]}},"required":["code","name"]},"ChurchEntity":{"type":"object","properties":{}},"UpdateChurchDto":{"type":"object","properties":{}},"ChurchLocationUpdateDto":{"type":"object","properties":{"countryId":{"type":"string","description":"ID del país (código de 4 dígitos)","example":"0001"},"stateId":{"type":"number","description":"ID del estado"},"cityId":{"type":"number","description":"ID de la ciudad"},"sectorId":{"type":"number","description":"ID del sector"},"address":{"type":"string","description":"Dirección completa"},"latitude":{"type":"number","description":"Latitud"},"longitude":{"type":"number","description":"Longitud"},"postalCode":{"type":"string","description":"Código postal"}}},"PaymentType":{"type":"string","enum":["OFRENDA","DIEZMO","ACTIVIDAD","EDUCACION","MINISTERIO","DONACION","MEMBRESIA","OTRO"],"description":"Payment type - determines which cashbox will be used"},"CustomerInfoDto":{"type":"object","properties":{"name":{"type":"string","description":"Customer name"},"email":{"type":"string","description":"Customer email"},"phone":{"type":"string","description":"Customer phone"},"identification":{"type":"string","description":"Customer identification"},"address":{"type":"string","description":"Customer address"}}},"CreateInternalPaymentDto":{"type":"object","properties":{"location":{"type":"string","description":"Payment location (church code)","default":"MLR"},"church":{"type":"string","description":"Church code (alias for location)","default":"MLR"},"batchNumber":{"type":"number","description":"Batch number for grouping payments"},"memberCode":{"type":"string","description":"Member code"},"participantId":{"type":"number","description":"Participant ID for activity/event payments"},"addonSelections":{"description":"Add-ons nuevos seleccionados durante el pago de actividad","type":"array","items":{"$ref":"#/components/schemas/AddonSelectionDto"}},"participantAddonIds":{"description":"IDs de lineas participant_addons pendientes que se desean liquidar","type":"array","items":{"type":"number"}},"origin":{"type":"string","description":"Payment origin"},"internalReference":{"type":"string","description":"Internal reference"},"externalReference":{"type":"string","description":"External reference"},"bankAccount":{"type":"string","description":"Bank account for transfers"},"paymentMethod":{"type":"string","description":"Payment method","example":"EFECTIVO"},"currency":{"type":"string","description":"Currency","example":"DOP","default":"DOP"},"amount":{"type":"number","description":"Payment amount","example":1000.5},"discount":{"type":"number","description":"Discount applied","default":0},"discountCode":{"type":"string","description":"Single discount code to apply. Use discountCodes for multiple codes.","example":"VERANO2026"},"discountCodes":{"description":"Multiple discount codes to apply (if stacking is enabled). Max 5 codes.","example":["VERANO2026","VCH-ABC123"],"type":"array","items":{"type":"string"}},"comment":{"type":"string","description":"Payment comment"},"paymentDate":{"type":"string","description":"Payment date"},"receivedBy":{"type":"string","description":"Received by user"},"cardFinalNumber":{"type":"string","description":"Last 4 digits of card number (from Veriphone voucher). Required for CREDIT_CARD/DEBIT_CARD payments.","example":"4532"},"approval":{"type":"string","description":"Approval/Authorization code from card processor (from Veriphone voucher). Required for CREDIT_CARD/DEBIT_CARD payments.","example":"123456"},"paypalEmail":{"type":"string","description":"PayPal email address. Required for PAYPAL payments.","example":"user@example.com"},"paymentType":{"description":"Payment type - determines which cashbox will be used","example":"OFRENDA","allOf":[{"$ref":"#/components/schemas/PaymentType"}]},"processorId":{"type":"number","description":"Payment processor ID for external payments"},"relatedEntityType":{"type":"string","description":"Related entity type (activity, education, etc.)"},"relatedEntityId":{"type":"number","description":"Related entity ID"},"customerInfo":{"description":"Customer information for external payments","allOf":[{"$ref":"#/components/schemas/CustomerInfoDto"}]},"metadata":{"type":"object","description":"Additional metadata"},"successUrl":{"type":"string","description":"Success URL for external payment redirect"},"cancelUrl":{"type":"string","description":"Cancel URL for external payment redirect"},"webhookUrl":{"type":"string","description":"Webhook URL for payment notifications"},"isAnnulled":{"type":"number","description":"Mark as annulled (0=no, 1=yes)","default":0},"status":{"type":"string","description":"Payment status","example":"COMPLETADO"},"annulledReason":{"type":"string","description":"Reason for annulment if annulled"},"annulledDate":{"type":"string","description":"Date of annulment (YYYY-MM-DD)"}},"required":["paymentMethod","currency","amount","paymentType"]},"Payment":{"type":"object","properties":{}},"CreatePaymentDto":{"type":"object","properties":{"location":{"type":"string","description":"Payment location (church code)","default":"MLR"},"church":{"type":"string","description":"Church code (alias for location)","default":"MLR"},"batchNumber":{"type":"number","description":"Batch number for grouping payments"},"memberCode":{"type":"string","description":"Member code"},"participantId":{"type":"number","description":"Participant ID for activity/event payments"},"addonSelections":{"description":"Add-ons nuevos seleccionados durante el pago de actividad","type":"array","items":{"$ref":"#/components/schemas/AddonSelectionDto"}},"participantAddonIds":{"description":"IDs de lineas participant_addons pendientes que se desean liquidar","type":"array","items":{"type":"number"}},"origin":{"type":"string","description":"Payment origin"},"internalReference":{"type":"string","description":"Internal reference"},"externalReference":{"type":"string","description":"External reference"},"bankAccount":{"type":"string","description":"Bank account for transfers"},"paymentMethod":{"type":"string","description":"Payment method","example":"EFECTIVO"},"currency":{"type":"string","description":"Currency","example":"DOP","default":"DOP"},"amount":{"type":"number","description":"Payment amount","example":1000.5},"discount":{"type":"number","description":"Discount applied","default":0},"discountCode":{"type":"string","description":"Single discount code to apply. Use discountCodes for multiple codes.","example":"VERANO2026"},"discountCodes":{"description":"Multiple discount codes to apply (if stacking is enabled). Max 5 codes.","example":["VERANO2026","VCH-ABC123"],"type":"array","items":{"type":"string"}},"comment":{"type":"string","description":"Payment comment"},"paymentDate":{"type":"string","description":"Payment date"},"receivedBy":{"type":"string","description":"Received by user"},"cardFinalNumber":{"type":"string","description":"Last 4 digits of card number (from Veriphone voucher). Required for CREDIT_CARD/DEBIT_CARD payments.","example":"4532"},"approval":{"type":"string","description":"Approval/Authorization code from card processor (from Veriphone voucher). Required for CREDIT_CARD/DEBIT_CARD payments.","example":"123456"},"paypalEmail":{"type":"string","description":"PayPal email address. Required for PAYPAL payments.","example":"user@example.com"},"paymentType":{"description":"Payment type - determines which cashbox will be used","example":"OFRENDA","allOf":[{"$ref":"#/components/schemas/PaymentType"}]},"processorId":{"type":"number","description":"Payment processor ID for external payments"},"relatedEntityType":{"type":"string","description":"Related entity type (activity, education, etc.)"},"relatedEntityId":{"type":"number","description":"Related entity ID"},"customerInfo":{"description":"Customer information for external payments","allOf":[{"$ref":"#/components/schemas/CustomerInfoDto"}]},"metadata":{"type":"object","description":"Additional metadata"},"successUrl":{"type":"string","description":"Success URL for external payment redirect"},"cancelUrl":{"type":"string","description":"Cancel URL for external payment redirect"},"webhookUrl":{"type":"string","description":"Webhook URL for payment notifications"}},"required":["paymentMethod","currency","amount","paymentType"]},"CardTokenDto":{"type":"object","properties":{"token":{"type":"string","description":"Tokenized card data from Azul.js or similar tokenization service","example":"tok_abc123xyz789"},"last4":{"type":"string","description":"Last 4 digits for display purposes only","example":"1111"},"cardBrand":{"type":"string","description":"Card brand (VISA, MASTERCARD, AMEX, etc)","example":"VISA"}},"required":["token"]},"DirectCardDataDto":{"type":"object","properties":{"cardNumber":{"type":"string","description":"Card number (13-19 digits)","example":"4111111111111111"},"cardHolder":{"type":"string","description":"Cardholder name as shown on card","example":"JUAN PEREZ"},"expirationMonth":{"type":"string","description":"Expiration month (01-12)","example":"12"},"expirationYear":{"type":"string","description":"Expiration year (2 or 4 digits)","example":"27"},"cvv":{"type":"string","description":"Card verification code (3-4 digits)","example":"123"}},"required":["cardNumber","cardHolder","expirationMonth","expirationYear","cvv"]},"ProcessExternalPaymentDto":{"type":"object","properties":{"processorId":{"type":"number","description":"Payment processor ID"},"paymentData":{"description":"Base payment data","allOf":[{"$ref":"#/components/schemas/CreatePaymentDto"}]},"returnUrls":{"type":"object","description":"Return URLs for payment flow"},"cardToken":{"description":"Tokenized card data (RECOMMENDED - use when tokenization is available)","allOf":[{"$ref":"#/components/schemas/CardTokenDto"}]},"cardData":{"description":"Direct card data (FALLBACK ONLY - requires PCI compliance)","allOf":[{"$ref":"#/components/schemas/DirectCardDataDto"}]},"processingType":{"type":"string","description":"Payment processing type: hosted (redirect to payment page), direct (immediate processing with card data), online_payment (alias for direct)","enum":["hosted","direct","online_payment"],"example":"hosted"},"saveCard":{"type":"boolean","description":"Whether to save card token for future use. Only works for registered members (memberCode exists in maestro_miembros). Ignored for external/guest users.","default":false},"participantIds":{"description":"Array of participant IDs for multiple payment (activity registrations). If provided, the payment will be distributed among all participants. Total amount must match the sum of pending amounts. All participants must have ZERO previous payments (no partial payments allowed).","example":[123,124,125],"type":"array","items":{"type":"number"}},"processorOptions":{"type":"object","description":"Additional processor-specific options"}},"required":["processorId","paymentData"]},"PayWithSavedCardDto":{"type":"object","properties":{"savedMethodId":{"type":"number","description":"Saved payment method ID"},"amount":{"type":"number","description":"Payment amount","example":1000.5},"currency":{"type":"string","description":"Currency","example":"DOP","default":"DOP"},"cvv":{"type":"string","description":"Card verification code","example":"123"},"comment":{"type":"string","description":"Payment description/comment"},"location":{"type":"string","description":"Payment location (church code)"},"church":{"type":"string","description":"Church code (alias for location)"},"memberCode":{"type":"string","description":"Member code"},"paymentType":{"type":"string","description":"Payment type"},"relatedEntityType":{"type":"string","description":"Related entity type"},"relatedEntityId":{"type":"number","description":"Related entity id"},"participantId":{"type":"number","description":"Participant ID for activity payments"},"addonSelections":{"description":"Add-ons nuevos seleccionados durante el pago con tarjeta guardada","type":"array","items":{"$ref":"#/components/schemas/AddonSelectionDto"}},"participantAddonIds":{"description":"IDs de lineas participant_addons pendientes que se desean liquidar","type":"array","items":{"type":"number"}}},"required":["savedMethodId","amount","currency","cvv"]},"UpdatePaymentDto":{"type":"object","properties":{"location":{"type":"string","description":"Payment location (church code)","default":"MLR"},"church":{"type":"string","description":"Church code (alias for location)","default":"MLR"},"batchNumber":{"type":"number","description":"Batch number for grouping payments"},"memberCode":{"type":"string","description":"Member code"},"participantId":{"type":"number","description":"Participant ID for activity/event payments"},"addonSelections":{"description":"Add-ons nuevos seleccionados durante el pago de actividad","type":"array","items":{"$ref":"#/components/schemas/AddonSelectionDto"}},"participantAddonIds":{"description":"IDs de lineas participant_addons pendientes que se desean liquidar","type":"array","items":{"type":"number"}},"origin":{"type":"string","description":"Payment origin"},"internalReference":{"type":"string","description":"Internal reference"},"externalReference":{"type":"string","description":"External reference"},"bankAccount":{"type":"string","description":"Bank account for transfers"},"paymentMethod":{"type":"string","description":"Payment method","example":"EFECTIVO"},"currency":{"type":"string","description":"Currency","example":"DOP","default":"DOP"},"amount":{"type":"number","description":"Payment amount","example":1000.5},"discount":{"type":"number","description":"Discount applied","default":0},"discountCode":{"type":"string","description":"Single discount code to apply. Use discountCodes for multiple codes.","example":"VERANO2026"},"discountCodes":{"description":"Multiple discount codes to apply (if stacking is enabled). Max 5 codes.","example":["VERANO2026","VCH-ABC123"],"type":"array","items":{"type":"string"}},"comment":{"type":"string","description":"Update comment"},"paymentDate":{"type":"string","description":"Payment date"},"receivedBy":{"type":"string","description":"Received by user"},"cardFinalNumber":{"type":"string","description":"Last 4 digits of card number (from Veriphone voucher). Required for CREDIT_CARD/DEBIT_CARD payments.","example":"4532"},"approval":{"type":"string","description":"Approval/Authorization code from card processor (from Veriphone voucher). Required for CREDIT_CARD/DEBIT_CARD payments.","example":"123456"},"paypalEmail":{"type":"string","description":"PayPal email address. Required for PAYPAL payments.","example":"user@example.com"},"paymentType":{"description":"Payment type - determines which cashbox will be used","example":"OFRENDA","allOf":[{"$ref":"#/components/schemas/PaymentType"}]},"processorId":{"type":"number","description":"Payment processor ID for external payments"},"relatedEntityType":{"type":"string","description":"Related entity type (activity, education, etc.)"},"relatedEntityId":{"type":"number","description":"Related entity ID"},"customerInfo":{"description":"Customer information for external payments","allOf":[{"$ref":"#/components/schemas/CustomerInfoDto"}]},"metadata":{"type":"object","description":"Additional metadata"},"successUrl":{"type":"string","description":"Success URL for external payment redirect"},"cancelUrl":{"type":"string","description":"Cancel URL for external payment redirect"},"webhookUrl":{"type":"string","description":"Webhook URL for payment notifications"},"isAnnulled":{"type":"number","description":"Mark/unmark as annulled (0=no, 1=yes)","default":0},"status":{"type":"string","description":"Payment status update","example":"COMPLETADO"},"annulledReason":{"type":"string","description":"Reason for annulment if annulled"},"annulledDate":{"type":"string","description":"Date of annulment (YYYY-MM-DD)"},"updatedBy":{"type":"string","description":"Updated by user"}}},"ReassignPaymentDto":{"type":"object","properties":{"paymentId":{"type":"number","description":"ID del pago a reasignar","example":1234},"fromEntityId":{"type":"number","description":"ID de la entidad origen actual","example":100},"toEntityId":{"type":"number","description":"ID de la entidad destino","example":200},"reason":{"type":"string","description":"Razón de la reasignación","example":"Pago realizado por familiar de otro participante","minLength":10,"maxLength":500}},"required":["paymentId","fromEntityId","toEntityId","reason"]},"AttachApprovalDto":{"type":"object","properties":{"approvalCode":{"type":"string","description":"Authorization/approval code from external payment","example":"AUTH123456"},"reference":{"type":"string","description":"Transaction reference or RRN number","example":"123456789012"},"last4":{"type":"string","description":"Last 4 digits of card used","example":"1111"},"transactionDate":{"type":"string","description":"Transaction date from external system","example":"2026-01-04T10:30:00Z"},"notes":{"type":"string","description":"Additional notes or comments"}},"required":["approvalCode","last4"]},"BulkPaymentActionDto":{"type":"object","properties":{"paymentIds":{"description":"Payment IDs to process","type":"array","items":{"type":"number"}},"action":{"type":"string","description":"Action to perform","enum":["annul","restore","export"]},"reason":{"type":"string","description":"Reason for the action (required for annul and restore actions, min 5 characters)","minLength":5,"maxLength":500},"performedBy":{"type":"string","description":"Performed by user"}}},"CreateProcessorDto":{"type":"object","properties":{"name":{"type":"string","description":"Processor name","example":"stripe-main"},"type":{"type":"string","description":"Processor type","enum":["STRIPE","PAYPAL","AZUL","PLACETOPAY","MERCADOPAGO","CUSTOM"],"example":"STRIPE"},"displayName":{"type":"string","description":"Display name for UI","example":"Stripe Payments"},"description":{"type":"string","description":"Processor description"},"status":{"type":"string","description":"Processor status","enum":["ACTIVE","INACTIVE","TESTING","MAINTENANCE"],"default":"ACTIVE"},"isActive":{"type":"boolean","description":"Is processor active","default":true},"isTestMode":{"type":"boolean","description":"Is test mode enabled","default":false},"supportedCurrencies":{"description":"Supported currencies","default":["USD","DOP"],"type":"array","items":{"type":"string"}},"feePercentage":{"type":"number","description":"Fee percentage (0.0-1.0)","default":0},"fixedFee":{"type":"number","description":"Fixed fee amount","default":0},"minAmount":{"type":"number","description":"Minimum payment amount","default":0},"maxAmount":{"type":"number","description":"Maximum payment amount"},"configuration":{"type":"object","description":"Processor configuration (API keys, etc.)"},"webhookUrl":{"type":"string","description":"Webhook URL"},"apiBaseUrl":{"type":"string","description":"API base URL"},"successUrlTemplate":{"type":"string","description":"Success URL template"},"cancelUrlTemplate":{"type":"string","description":"Cancel URL template"},"logoUrl":{"type":"string","description":"Logo URL"},"sortOrder":{"type":"number","description":"Sort order for UI","default":0}},"required":["name","type","displayName"]},"PaymentProcessor":{"type":"object","properties":{}},"UpdateProcessorDto":{"type":"object","properties":{"displayName":{"type":"string","description":"Processor display name"},"description":{"type":"string","description":"Processor description"},"status":{"type":"string","description":"Processor status","enum":["ACTIVE","INACTIVE","TESTING","MAINTENANCE"]},"isActive":{"type":"boolean","description":"Is processor active"},"isTestMode":{"type":"boolean","description":"Is test mode enabled"},"supportedCurrencies":{"description":"Supported currencies","type":"array","items":{"type":"string"}},"feePercentage":{"type":"number","description":"Fee percentage (0.0-1.0)"},"fixedFee":{"type":"number","description":"Fixed fee amount"},"minAmount":{"type":"number","description":"Minimum payment amount"},"maxAmount":{"type":"number","description":"Maximum payment amount"},"configuration":{"type":"object","description":"Processor configuration"},"webhookUrl":{"type":"string","description":"Webhook URL"},"apiBaseUrl":{"type":"string","description":"API base URL"},"successUrlTemplate":{"type":"string","description":"Success URL template"},"cancelUrlTemplate":{"type":"string","description":"Cancel URL template"},"logoUrl":{"type":"string","description":"Logo URL"},"sortOrder":{"type":"number","description":"Sort order for UI"}}},"UnlinkPaymentDto":{"type":"object","properties":{"paymentId":{"type":"number","description":"ID del pago a desvincular","example":1234},"reason":{"type":"string","description":"Razón de la desvinculación","example":"Pago asignado incorrectamente al participante","minLength":10,"maxLength":500}},"required":["paymentId","reason"]},"CorrectionResponseDto":{"type":"object","properties":{"success":{"type":"boolean","description":"Indica si la operación fue exitosa","example":true},"message":{"type":"string","description":"Mensaje descriptivo del resultado","example":"Pago desvinculado exitosamente"},"paymentId":{"type":"number","description":"ID del pago afectado","example":1234},"action":{"type":"string","description":"Acción realizada","enum":["UNLINK","LINK","REASSIGN","TRANSFER","CHANGE_TYPE"],"example":"UNLINK"},"previousState":{"type":"object","description":"Estado anterior del pago"},"newState":{"type":"object","description":"Nuevo estado del pago"},"recalculatedAmounts":{"description":"Montos recalculados (si aplica)","type":"array","items":{"type":"string"}}},"required":["success","message","paymentId","action"]},"LinkPaymentDto":{"type":"object","properties":{"paymentId":{"type":"number","description":"ID del pago a vincular","example":1234},"targetEntityType":{"type":"string","description":"Tipo de entidad destino","enum":["ACTIVITY_PARTICIPANT","DISCIPLESHIP_ENROLLMENT","COURSE_ENROLLMENT","TITHE","OFFERING","DONATION","MEMBERSHIP","MINISTRY","ADDON_SALE","UNLINKED"],"example":"ACTIVITY_PARTICIPANT"},"targetEntityId":{"type":"number","description":"ID de la entidad destino","example":5678},"reason":{"type":"string","description":"Razón de la vinculación","example":"Pago correspondiente a inscripción del participante","minLength":10,"maxLength":500}},"required":["paymentId","targetEntityType","targetEntityId","reason"]},"TransferPaymentDto":{"type":"object","properties":{"paymentId":{"type":"number","description":"ID del pago a transferir","example":1234},"newEntityType":{"type":"string","description":"Nuevo tipo de entidad","enum":["ACTIVITY_PARTICIPANT","DISCIPLESHIP_ENROLLMENT","COURSE_ENROLLMENT","TITHE","OFFERING","DONATION","MEMBERSHIP","MINISTRY","ADDON_SALE","UNLINKED"],"example":"OFFERING"},"newEntityId":{"type":"number","description":"ID de la nueva entidad (opcional para ofrendas/diezmos)","example":5678},"reason":{"type":"string","description":"Razón de la transferencia","example":"Pago fue registrado como actividad pero era ofrenda","minLength":10,"maxLength":500}},"required":["paymentId","newEntityType","reason"]},"CreateCurrencyDto":{"type":"object","properties":{}},"Currency":{"type":"object","properties":{}},"UpdateCurrencyDto":{"type":"object","properties":{}},"CreateExchangeRateDto":{"type":"object","properties":{}},"ExchangeRate":{"type":"object","properties":{}},"ConvertCurrencyDto":{"type":"object","properties":{"amount":{"type":"number","example":100,"description":"Amount to convert"},"fromCurrency":{"type":"string","example":"USD","description":"Source currency code"},"toCurrency":{"type":"string","example":"DOP","description":"Target currency code"},"date":{"type":"string","example":"2024-01-15","description":"Date for the conversion (optional, uses current date if not provided)"}},"required":["amount","fromCurrency","toCurrency"]},"UpdateExchangeRateDto":{"type":"object","properties":{}},"CleanLogsDto":{"type":"object","properties":{"startDate":{"type":"string","description":"Fecha de inicio del rango a eliminar (inclusive)","example":"2025-01-01"},"endDate":{"type":"string","description":"Fecha de fin del rango a eliminar (inclusive)","example":"2025-01-31"},"type":{"type":"string","enum":["request","response","error"],"description":"Tipo de log a eliminar. Si no se especifica, elimina todos los tipos"},"environment":{"type":"string","enum":["localhost","dev","production"],"description":"Ambiente específico a limpiar. Si no se especifica, limpia todos"},"confirm":{"type":"boolean","description":"Confirmación explícita para eliminar logs. Debe ser true","default":false}},"required":["startDate","endDate"]},"CleanLogsResponseDto":{"type":"object","properties":{}},"Cashbox":{"type":"object","properties":{"id":{"type":"number","description":"ID único de la caja"},"name":{"type":"string","description":"Nombre de la caja","example":"LIBRERIA"},"currentBatchNumber":{"type":"string","description":"Lote activo actual","nullable":true},"status":{"type":"string","description":"Estado de la caja","example":"1"}},"required":["id","name","currentBatchNumber","status"]},"OpenBatchDto":{"type":"object","properties":{"cashboxId":{"type":"number","description":"ID de la caja a aperturar","example":100},"initialFund":{"type":"number","description":"Fondo inicial de caja","example":500,"default":0},"notes":{"type":"string","description":"Anotaciones de apertura","example":"Apertura turno matutino"}},"required":["cashboxId"]},"CashBatch":{"type":"object","properties":{"id":{"type":"number","description":"ID único del lote"},"batch":{"type":"string","description":"Número de lote","example":"200151"},"uid":{"type":"string","description":"UID único del lote"},"cashBoxId":{"type":"number","description":"ID de la caja"},"userUid":{"type":"string","description":"UID del usuario responsable"},"status":{"type":"number","description":"Estado del lote","enum":[1,0,2,3,4],"example":1},"openDate":{"type":"string","description":"Fecha de apertura"},"openBy":{"type":"string","description":"Usuario que aperturó"},"closeDate":{"type":"string","description":"Fecha de cierre","nullable":true},"closeBy":{"type":"string","description":"Usuario que cerró","nullable":true},"reopenBy":{"type":"string","description":"Usuario que reabrió","nullable":true},"reopenDate":{"type":"string","description":"Fecha de reapertura","nullable":true},"approvedBy":{"type":"string","description":"Usuario que aprobó","nullable":true},"approvedDate":{"type":"string","description":"Fecha de aprobación","nullable":true}},"required":["id","batch","uid","cashBoxId","userUid","status","openDate","openBy","closeDate","closeBy","reopenBy","reopenDate","approvedBy","approvedDate"]},"CloseBatchDto":{"type":"object","properties":{"notes":{"type":"string","description":"Anotaciones de cierre","example":"Cierre sin novedades"}}},"ApproveBatchDto":{"type":"object","properties":{"approvalNotes":{"type":"string","description":"Comentarios de aprobación","example":"Cuadre correcto"}}},"RejectBatchDto":{"type":"object","properties":{"reason":{"type":"string","description":"Razón de rechazo","example":"Diferencia en efectivo no justificada"}},"required":["reason"]},"ReopenBatchDto":{"type":"object","properties":{"reason":{"type":"string","description":"Razón de reapertura","example":"Corrección de error de cálculo"}},"required":["reason"]},"CashSettlement":{"type":"object","properties":{"id":{"type":"number","description":"ID único del cuadre"},"location":{"type":"string","description":"Código de localidad"},"username":{"type":"string","description":"Usuario operador"},"cashboxId":{"type":"number","description":"Número de caja"},"batchNumber":{"type":"string","description":"Número de lote - matches cajas_lotes.batch (VARCHAR)"},"initialFund":{"type":"number","description":"Fondo inicial de caja"},"totalCash":{"type":"number","description":"Total en caja DOP"},"totalCashUsd":{"type":"number","description":"Total en caja USD"},"totalCashEur":{"type":"number","description":"Total en caja EUR"},"cashDop":{"type":"number","description":"Efectivo DOP"},"cashUsd":{"type":"number","description":"Efectivo USD"},"cashEur":{"type":"number","description":"Efectivo EUR"},"creditCardDop":{"type":"number","description":"Tarjeta crédito DOP"},"creditCardUsd":{"type":"number","description":"Tarjeta crédito USD"},"creditCardEur":{"type":"number","description":"Tarjeta crédito EUR"},"debitCardDop":{"type":"number","description":"Tarjeta débito DOP"},"debitCardUsd":{"type":"number","description":"Tarjeta débito USD"},"debitCardEur":{"type":"number","description":"Tarjeta débito EUR"},"transferDop":{"type":"number","description":"Transferencias DOP"},"transferUsd":{"type":"number","description":"Transferencias USD"},"transferEur":{"type":"number","description":"Transferencias EUR"},"depositDop":{"type":"number","description":"Depósitos DOP"},"depositUsd":{"type":"number","description":"Depósitos USD"},"depositEur":{"type":"number","description":"Depósitos EUR"},"paypalDop":{"type":"number","description":"PayPal DOP"},"paypalUsd":{"type":"number","description":"PayPal USD"},"paypalEur":{"type":"number","description":"PayPal EUR"},"discountDop":{"type":"number","description":"Descuentos DOP"},"discountUsd":{"type":"number","description":"Descuentos USD"},"discountEur":{"type":"number","description":"Descuentos EUR"},"paymentsReceived":{"type":"number","description":"Cantidad de pagos recibidos"},"origin":{"type":"string","description":"Origen del cuadre"},"status":{"type":"string","description":"Estado del cuadre"},"openDate":{"type":"string","description":"Fecha de apertura"},"openBy":{"type":"string","description":"Usuario que aperturó"},"closeDate":{"type":"string","description":"Fecha de cierre"},"closeBy":{"type":"string","description":"Usuario que cerró"},"approvedDate":{"type":"string","description":"Fecha de aprobación"},"approvedBy":{"type":"string","description":"Usuario que aprobó"},"reopenDate":{"type":"string","description":"Fecha de reapertura"},"reopenBy":{"type":"string","description":"Usuario que reabrió"},"notes":{"type":"string","description":"Anotaciones del cuadre"}},"required":["id","location","username","cashboxId","batchNumber","initialFund","totalCash","totalCashUsd","totalCashEur","cashDop","cashUsd","cashEur","creditCardDop","creditCardUsd","creditCardEur","debitCardDop","debitCardUsd","debitCardEur","transferDop","transferUsd","transferEur","depositDop","depositUsd","depositEur","paypalDop","paypalUsd","paypalEur","discountDop","discountUsd","discountEur","paymentsReceived","origin","status","openDate","openBy","closeDate","closeBy","approvedDate","approvedBy","reopenDate","reopenBy","notes"]},"SettlementSummaryByCurrencyDto":{"type":"object","properties":{"currency":{"type":"string","description":"Código de moneda","example":"DOP"},"count":{"type":"number","description":"Cantidad de pagos en esta moneda","example":100},"total":{"type":"number","description":"Total en esta moneda","example":150000},"totalDiscount":{"type":"number","description":"Total de descuentos en esta moneda","example":5000},"byMethod":{"type":"object","description":"Desglose por método de pago"}},"required":["currency","count","total","totalDiscount","byMethod"]},"SettlementSummaryByMethodDto":{"type":"object","properties":{"method":{"type":"string","description":"Método de pago","enum":["CASH","CREDIT_CARD","DEBIT_CARD","TRANSFER","DEPOSIT","PAYPAL","OTHER"],"example":"CASH"},"count":{"type":"number","description":"Cantidad de pagos con este método","example":25},"totals":{"type":"object","description":"Totales por moneda"},"totalInDOP":{"type":"number","description":"Total general convertido a DOP (para ordenamiento)","example":75000}},"required":["method","count","totals","totalInDOP"]},"SettlementSummaryByConceptDto":{"type":"object","properties":{"concept":{"type":"string","description":"Nombre del concepto (actividad)","example":"Retiro de Jóvenes 2026"},"activityId":{"type":"number","description":"ID de la actividad (si aplica)","example":45,"nullable":true},"count":{"type":"number","description":"Cantidad de pagos para este concepto","example":15},"uniqueParticipants":{"type":"number","description":"Cantidad de participantes únicos","example":15},"totals":{"type":"object","description":"Totales por moneda"}},"required":["concept","activityId","count","uniqueParticipants","totals"]},"PaymentDetailDto":{"type":"object","properties":{"paymentId":{"type":"number","description":"ID único del pago","example":12345},"paymentDate":{"format":"date-time","type":"string","description":"Fecha del pago","example":"2026-01-15"},"paymentMethod":{"type":"string","description":"Método de pago normalizado","enum":["CASH","CREDIT_CARD","DEBIT_CARD","TRANSFER","DEPOSIT","PAYPAL","OTHER"],"example":"CASH"},"currency":{"type":"string","description":"Moneda","example":"DOP"},"amount":{"type":"number","description":"Monto del pago","example":1500},"discount":{"type":"number","description":"Descuento aplicado","example":100},"internalReference":{"type":"string","description":"Referencia interna","example":"REF-001"},"externalReference":{"type":"string","description":"Referencia externa/bancaria","example":"TRF-12345"},"participantName":{"type":"string","description":"Nombre del participante (cuando aplica)","example":"Juan Pérez","nullable":true},"memberCode":{"type":"string","description":"Código del miembro (cuando aplica)","example":"MBR-001","nullable":true},"concept":{"type":"string","description":"Concepto del pago (ej: nombre de actividad)","example":"Retiro de Jóvenes 2026"},"relatedEntityType":{"type":"string","description":"Tipo de entidad relacionada","example":"ACTIVITY_PARTICIPANT","nullable":true},"relatedEntityId":{"type":"number","description":"ID de la entidad relacionada","example":567,"nullable":true},"paymentStatus":{"type":"string","description":"Estado del pago","example":"PAID"},"comment":{"type":"string","description":"Comentario del pago","example":"Pago parcial acordado"}},"required":["paymentId","paymentDate","paymentMethod","currency","amount","participantName","memberCode","concept","relatedEntityType","relatedEntityId"]},"DetailedSettlementResponseDto":{"type":"object","properties":{"batchNumber":{"type":"string","description":"Número de lote","example":"MLR-2026-001"},"batchOpenDate":{"format":"date-time","type":"string","description":"Fecha de apertura del lote"},"batchCloseDate":{"format":"date-time","type":"string","description":"Fecha de cierre del lote","nullable":true},"batchStatus":{"type":"string","description":"Estado del lote","example":"CLOSED"},"totalPayments":{"type":"number","description":"Total de pagos en el lote","example":150},"uniqueParticipants":{"type":"number","description":"Total de participantes únicos","example":120},"summaryByCurrency":{"description":"Resumen general por moneda","type":"array","items":{"$ref":"#/components/schemas/SettlementSummaryByCurrencyDto"}},"summaryByMethod":{"description":"Resumen por método de pago","type":"array","items":{"$ref":"#/components/schemas/SettlementSummaryByMethodDto"}},"summaryByConcept":{"description":"Resumen por concepto (actividad)","type":"array","items":{"$ref":"#/components/schemas/SettlementSummaryByConceptDto"}},"paymentDetails":{"description":"Detalle de cada pago individual","type":"array","items":{"$ref":"#/components/schemas/PaymentDetailDto"}},"metadata":{"type":"object","description":"Metadatos del cuadre"}},"required":["batchNumber","batchOpenDate","batchCloseDate","batchStatus","totalPayments","uniqueParticipants","summaryByCurrency","summaryByMethod","summaryByConcept","paymentDetails","metadata"]},"BatchDashboardDto":{"type":"object","properties":{"batchNumber":{"type":"string","description":"Número de lote","example":"MLR-2026-001"},"status":{"type":"string","description":"Estado del lote"},"openDate":{"format":"date-time","type":"string","description":"Fecha de apertura"},"closeDate":{"format":"date-time","type":"string","description":"Fecha de cierre","nullable":true},"userId":{"type":"string","description":"Usuario cajero"},"cashboxId":{"type":"string","description":"Caja asignada"},"kpis":{"type":"object","description":"KPIs principales"},"distributionByMethod":{"description":"Distribución por método de pago","type":"array","items":{"type":"string"}},"topActivities":{"description":"Top 5 actividades por ingresos","type":"array","items":{"type":"string"}},"discrepancyStatus":{"type":"object","description":"Estado de discrepancias"}},"required":["batchNumber","status","openDate","closeDate","userId","cashboxId","kpis","distributionByMethod","topActivities","discrepancyStatus"]},"DiscrepancyDetailDto":{"type":"object","properties":{"currency":{"type":"string","description":"Moneda afectada","example":"DOP"},"calculatedTotal":{"type":"number","description":"Total calculado del sistema","example":15000},"declaredTotal":{"type":"number","description":"Total declarado por el cajero","example":14500},"difference":{"type":"number","description":"Diferencia (declarado - calculado)","example":-500},"differencePercentage":{"type":"number","description":"Porcentaje de diferencia","example":3.33},"severity":{"type":"string","description":"Severidad de la discrepancia"},"explanation":{"type":"string","description":"Explicación de la discrepancia"}},"required":["currency","calculatedTotal","declaredTotal","difference","differencePercentage","severity","explanation"]},"DiscrepancyValidationResponseDto":{"type":"object","properties":{"batchNumber":{"type":"string","description":"Número de lote"},"validatedAt":{"format":"date-time","type":"string","description":"Fecha de validación"},"hasDiscrepancies":{"type":"boolean","description":"¿Tiene discrepancias?"},"overallSeverity":{"type":"string","description":"Severidad general"},"summary":{"type":"object","description":"Resumen de totales"},"detailsByCurrency":{"description":"Detalle por moneda","type":"array","items":{"$ref":"#/components/schemas/DiscrepancyDetailDto"}},"detailsByMethod":{"description":"Detalle por método de pago","type":"array","items":{"type":"string"}},"recommendations":{"description":"Recomendaciones","type":"array","items":{"type":"string"}}},"required":["batchNumber","validatedAt","hasDiscrepancies","overallSeverity","summary","detailsByCurrency","detailsByMethod","recommendations"]},"ApplyDiscountDto":{"type":"object","properties":{"code":{"type":"string","description":"Código del descuento a aplicar","example":"VERANO2026"},"amount":{"type":"number","description":"Monto sobre el cual aplicar el descuento","example":500},"paymentType":{"type":"string","description":"Tipo de pago","example":"ACTIVIDAD"},"memberCode":{"type":"string","description":"Código del miembro","example":"M001"},"church":{"type":"string","description":"Código de la iglesia","example":"MLR"},"currency":{"type":"string","description":"Moneda del pago","example":"DOP"},"activityId":{"type":"number","description":"ID de la actividad (si aplica)"},"productId":{"type":"number","description":"ID del producto (si aplica)"},"courseId":{"type":"number","description":"ID del curso (si aplica)"},"quantity":{"type":"number","description":"Cantidad de items","default":1},"addonsAmount":{"type":"number","description":"Fase 10 (add-ons): monto total de add-ons asociados al pago. Si el descuento tiene appliesToAddons=true, este monto se suma a la base del descuento y el resultado se prorratea entre matricula y add-ons.","example":150}},"required":["code","amount","paymentType"]},"DiscountApplicationResponseDto":{"type":"object","properties":{"valid":{"type":"boolean","description":"¿El descuento es válido?"},"discountId":{"type":"number","description":"ID del descuento"},"code":{"type":"string","description":"Código del descuento"},"name":{"type":"string","description":"Nombre del descuento"},"discountType":{"type":"string","description":"Tipo de descuento (percent/fixed_amount)"},"originalValue":{"type":"number","description":"Valor original (% o monto)"},"discountAmount":{"type":"number","description":"Monto calculado del descuento"},"originalAmount":{"type":"number","description":"Monto original"},"finalAmount":{"type":"number","description":"Monto final después del descuento"},"message":{"type":"string","description":"Mensaje descriptivo"},"warnings":{"description":"Advertencias","type":"array","items":{"type":"string"}},"errorCode":{"type":"string","description":"Código de error (si no es válido)"}},"required":["valid","message"]},"PaymentTypeConditionsDto":{"type":"object","properties":{"include":{"description":"Tipos de pago permitidos","example":["ACTIVIDAD","EDUCACION"],"type":"array","items":{"type":"string"}},"exclude":{"description":"Tipos de pago excluidos","example":["DIEZMO"],"type":"array","items":{"type":"string"}}}},"EntityConditionsDto":{"type":"object","properties":{"activities":{"description":"IDs de actividades","example":[1,2,3],"type":"array","items":{"type":"string"}},"products":{"description":"IDs de productos","example":[10,20],"type":"array","items":{"type":"string"}},"courses":{"description":"IDs de cursos","example":[5,6],"type":"array","items":{"type":"string"}},"memberships":{"description":"IDs de tipos de membresía","example":[1],"type":"array","items":{"type":"string"}}}},"MemberConditionsDto":{"type":"object","properties":{"type":{"type":"string","description":"Tipo de restricción","enum":["all","specific","groups"],"example":"all"},"codes":{"description":"Códigos de miembros específicos","example":["M001","M002"],"type":"array","items":{"type":"string"}},"groups":{"description":"Grupos/ministerios","example":["LIDERES","JOVENES"],"type":"array","items":{"type":"string"}},"memberOnly":{"type":"boolean","description":"Solo miembros registrados","example":true},"newBelieverOnly":{"type":"boolean","description":"Solo nuevos creyentes","example":false},"minMembershipDays":{"type":"number","description":"Mínimo días como miembro","example":90}}},"ChurchConditionsDto":{"type":"object","properties":{"include":{"description":"Códigos de iglesias permitidas","example":["MLR","STI"],"type":"array","items":{"type":"string"}},"exclude":{"description":"Códigos de iglesias excluidas","example":["TEST"],"type":"array","items":{"type":"string"}}}},"QuantityConditionsDto":{"type":"object","properties":{"minItems":{"type":"number","description":"Mínimo de items","example":3},"maxItems":{"type":"number","description":"Máximo de items","example":10}}},"DiscountConditionsDto":{"type":"object","properties":{"scope":{"type":"string","description":"Alcance: global (aplica a todo) o specific (según reglas)","enum":["global","specific"],"default":"global"},"minAmount":{"type":"number","description":"Monto mínimo para aplicar","example":100},"maxAmount":{"type":"number","description":"Monto máximo para aplicar","example":10000},"paymentTypes":{"description":"Condiciones de tipos de pago","allOf":[{"$ref":"#/components/schemas/PaymentTypeConditionsDto"}]},"entities":{"description":"Condiciones de entidades específicas","allOf":[{"$ref":"#/components/schemas/EntityConditionsDto"}]},"members":{"description":"Condiciones de miembros","allOf":[{"$ref":"#/components/schemas/MemberConditionsDto"}]},"churches":{"description":"Condiciones de iglesias","allOf":[{"$ref":"#/components/schemas/ChurchConditionsDto"}]},"quantity":{"description":"Condiciones de cantidad","allOf":[{"$ref":"#/components/schemas/QuantityConditionsDto"}]},"stackable":{"type":"boolean","description":"Combinable con otros descuentos","default":false},"customRules":{"type":"object","description":"Reglas personalizadas (JSON libre)"}}},"CreatePromotionDto":{"type":"object","properties":{"code":{"type":"string","description":"Código único del descuento (se genera automáticamente si no se proporciona)","example":"VERANO2026"},"name":{"type":"string","description":"Nombre descriptivo (usa el código si no se proporciona)","example":"Promoción de Verano"},"description":{"type":"string","description":"Descripción detallada"},"discountType":{"type":"string","description":"Tipo de descuento","enum":["percent","fixed_amount"],"example":"percent"},"value":{"type":"number","description":"Valor del descuento (porcentaje 0-100 o monto fijo)","example":20},"currency":{"type":"string","description":"Moneda del valor (requerido para fixed_amount)","example":"DOP","default":"DOP"},"isMultiCurrency":{"type":"boolean","description":"Si true, el descuento fixed_amount se convierte automáticamente a la moneda del pago","default":false},"maxDiscountAmount":{"type":"number","description":"Monto máximo de descuento (solo para porcentajes)","example":500},"startDate":{"type":"string","description":"Fecha de inicio de vigencia","example":"2026-06-01"},"endDate":{"type":"string","description":"Fecha de fin de vigencia","example":"2026-08-31"},"conditions":{"description":"Condiciones de aplicación","allOf":[{"$ref":"#/components/schemas/DiscountConditionsDto"}]},"maxUsesTotal":{"type":"number","description":"Límite máximo de usos totales","example":100},"maxUsesPerMember":{"type":"number","description":"Límite máximo de usos por miembro","example":1}},"required":["discountType","value"]},"Discount":{"type":"object","properties":{"id":{"type":"number","description":"ID único del descuento"},"code":{"type":"string","description":"Código único del descuento"},"name":{"type":"string","description":"Nombre descriptivo"},"description":{"type":"string","description":"Descripción detallada"},"kind":{"type":"string","description":"Tipo: promotion o voucher","enum":["promotion","voucher"]},"discountType":{"type":"string","description":"Tipo de descuento: percent o fixed_amount","enum":["percent","fixed_amount"]},"value":{"type":"number","description":"Valor del descuento (porcentaje o monto fijo)"},"currency":{"type":"string","description":"Moneda del valor (relevante para fixed_amount)","example":"DOP"},"isMultiCurrency":{"type":"boolean","description":"Si true, fixed_amount se convierte a la moneda del pago automáticamente"},"maxDiscountAmount":{"type":"number","description":"Monto máximo de descuento (para porcentajes)"},"startDate":{"format":"date-time","type":"string","description":"Fecha de inicio de vigencia"},"endDate":{"format":"date-time","type":"string","description":"Fecha de fin de vigencia"},"maxUsesTotal":{"type":"number","description":"Límite máximo de usos totales"},"maxUsesPerMember":{"type":"number","description":"Límite máximo de usos por miembro"},"currentUses":{"type":"number","description":"Contador de usos actuales"},"originalBalance":{"type":"number","description":"Balance original del voucher"},"currentBalance":{"type":"number","description":"Balance actual del voucher"},"issuedTo":{"type":"string","description":"Miembro para quien fue emitido el voucher"},"issuedBy":{"type":"string","description":"Usuario que emitió el voucher"},"batchId":{"type":"string","description":"ID del lote de generación (vouchers batch)"},"redeemedBy":{"type":"string","description":"Miembro que redimió el voucher"},"redeemedAt":{"format":"date-time","type":"string","description":"Fecha de redención del voucher"},"conditions":{"type":"object","description":"Condiciones de aplicación (JSON)"},"appliesToAddons":{"type":"boolean","description":"Fase 10: si true, el monto de add-ons se suma a la base del descuento y se prorratea entre matricula y add-ons.","default":false},"status":{"type":"string","description":"Estado del descuento","enum":["active","inactive","expired","depleted"]},"createdBy":{"type":"string","description":"Usuario que creó el registro"},"updatedBy":{"type":"string","description":"Usuario que actualizó el registro"}},"required":["id","code","name","kind","discountType","value","currentUses","conditions","appliesToAddons","status"]},"UpdatePromotionDto":{"type":"object","properties":{"name":{"type":"string","description":"Nombre descriptivo (usa el código si no se proporciona)","example":"Promoción de Verano"},"description":{"type":"string","description":"Descripción detallada"},"discountType":{"type":"string","description":"Tipo de descuento","enum":["percent","fixed_amount"],"example":"percent"},"value":{"type":"number","description":"Valor del descuento (porcentaje 0-100 o monto fijo)","example":20},"currency":{"type":"string","description":"Moneda del valor (requerido para fixed_amount)","example":"DOP","default":"DOP"},"isMultiCurrency":{"type":"boolean","description":"Si true, el descuento fixed_amount se convierte automáticamente a la moneda del pago","default":false},"maxDiscountAmount":{"type":"number","description":"Monto máximo de descuento (solo para porcentajes)","example":500},"startDate":{"type":"string","description":"Fecha de inicio de vigencia","example":"2026-06-01"},"endDate":{"type":"string","description":"Fecha de fin de vigencia","example":"2026-08-31"},"conditions":{"description":"Condiciones de aplicación","allOf":[{"$ref":"#/components/schemas/DiscountConditionsDto"}]},"maxUsesTotal":{"type":"number","description":"Límite máximo de usos totales","example":100},"maxUsesPerMember":{"type":"number","description":"Límite máximo de usos por miembro","example":1}}},"CreateVoucherDto":{"type":"object","properties":{"code":{"type":"string","description":"Código único (se genera automáticamente si no se proporciona)","example":"REGALO-ABC123"},"name":{"type":"string","description":"Nombre descriptivo","example":"Vale de Regalo"},"description":{"type":"string","description":"Descripción"},"value":{"type":"number","description":"Valor/Balance del voucher","example":500},"currency":{"type":"string","description":"Moneda del voucher","example":"DOP","default":"DOP"},"isMultiCurrency":{"type":"boolean","description":"Si true, el voucher se convierte automáticamente a la moneda del pago","default":false},"issuedTo":{"type":"string","description":"Miembro para quien se emite (código)"},"endDate":{"type":"string","description":"Fecha de expiración","example":"2026-12-31"},"conditions":{"description":"Condiciones de aplicación","allOf":[{"$ref":"#/components/schemas/DiscountConditionsDto"}]}},"required":["name","value"]},"GenerateVoucherBatchDto":{"type":"object","properties":{"count":{"type":"number","description":"Cantidad de vouchers a generar","example":50},"value":{"type":"number","description":"Valor de cada voucher","example":500},"currency":{"type":"string","description":"Moneda del voucher","example":"DOP","default":"DOP"},"isMultiCurrency":{"type":"boolean","description":"Si true, se convierte a la moneda del pago","default":false},"prefix":{"type":"string","description":"Prefijo para los códigos","example":"REGALO"},"name":{"type":"string","description":"Nombre base para los vouchers","example":"Vale de Regalo"},"description":{"type":"string","description":"Descripción"},"endDate":{"type":"string","description":"Fecha de expiración","example":"2026-12-31"},"conditions":{"description":"Condiciones de aplicación","allOf":[{"$ref":"#/components/schemas/DiscountConditionsDto"}]}},"required":["count","value","name"]},"UpdateVoucherDto":{"type":"object","properties":{"name":{"type":"string","description":"Nombre descriptivo","example":"Vale de Regalo"},"description":{"type":"string","description":"Descripción"},"currency":{"type":"string","description":"Moneda del voucher","example":"DOP","default":"DOP"},"isMultiCurrency":{"type":"boolean","description":"Si true, el voucher se convierte automáticamente a la moneda del pago","default":false},"issuedTo":{"type":"string","description":"Miembro para quien se emite (código)"},"endDate":{"type":"string","description":"Fecha de expiración","example":"2026-12-31"},"conditions":{"description":"Condiciones de aplicación","allOf":[{"$ref":"#/components/schemas/DiscountConditionsDto"}]}}},"CreateFormationDto":{"type":"object","properties":{"code":{"type":"integer","description":"Código único de la formación","example":1},"name":{"type":"string","description":"Nombre de la formación académica","example":"INGENIERÍA DE SISTEMAS","maxLength":80},"studyType":{"type":"string","description":"Tipo de estudio","example":"UNIVERSITARIA","enum":["PRIMARIA","SECUNDARIA","TECNICO UNIVERSITARIO","TECNICO NO UNIVERSITARIO","TECNOLOGICA","INGENIERIA","UNIVERSITARIO","ESPECIALIZACION","MAESTRIA","DOCTORADO"]},"activo":{"type":"boolean","description":"Estado activo/inactivo","example":true,"default":true}},"required":["code","name","studyType"]},"UpdateFormationDto":{"type":"object","properties":{"code":{"type":"integer","description":"Código único de la formación","example":1},"name":{"type":"string","description":"Nombre de la formación académica","example":"INGENIERÍA DE SISTEMAS","maxLength":80},"studyType":{"type":"string","description":"Tipo de estudio","example":"UNIVERSITARIA","enum":["PRIMARIA","SECUNDARIA","TECNICO UNIVERSITARIO","TECNICO NO UNIVERSITARIO","TECNOLOGICA","INGENIERIA","UNIVERSITARIO","ESPECIALIZACION","MAESTRIA","DOCTORADO"]},"activo":{"type":"boolean","description":"Estado activo/inactivo","example":true,"default":true}}},"AssignFormationDto":{"type":"object","properties":{"memberId":{"type":"number","example":123,"description":"ID del miembro"},"formationCode":{"type":"number","example":8,"description":"Código de la formación académica (del catálogo)"},"status":{"type":"string","enum":["EN_CURSO","COMPLETADO","INCOMPLETO"],"example":"COMPLETADO","description":"Estado de la formación"},"institution":{"type":"string","example":"Universidad Autónoma de Santo Domingo","description":"Institución educativa"},"startDate":{"type":"string","example":"2015-01-15","description":"Fecha de inicio de la formación (formato YYYY-MM-DD)"},"endDate":{"type":"string","example":"2019-12-20","description":"Fecha de finalización de la formación (formato YYYY-MM-DD)"},"isPrimary":{"type":"boolean","example":false,"description":"Marcar como formación principal del miembro"}},"required":["memberId","formationCode"]},"UpdateMemberFormationDto":{"type":"object","properties":{"status":{"type":"string","enum":["EN_CURSO","COMPLETADO","INCOMPLETO"],"description":"Actualizar estado de la formación"},"institution":{"type":"string","description":"Actualizar institución educativa"},"startDate":{"type":"string","description":"Actualizar fecha de inicio"},"endDate":{"type":"string","description":"Actualizar fecha de finalización"},"isPrimary":{"type":"boolean","description":"Actualizar flag de formación principal"}}},"CreateTradeDto":{"type":"object","properties":{"code":{"type":"integer","description":"Código único del oficio","example":1},"name":{"type":"string","description":"Nombre del oficio","example":"INGENIERO","maxLength":25},"isActive":{"type":"boolean","description":"Estado activo/inactivo","example":true,"default":true}},"required":["code","name"]},"UpdateTradeDto":{"type":"object","properties":{"code":{"type":"integer","description":"Código único del oficio","example":1},"name":{"type":"string","description":"Nombre del oficio","example":"INGENIERO","maxLength":25},"isActive":{"type":"boolean","description":"Estado activo/inactivo","example":true,"default":true}}},"AssignTradeDto":{"type":"object","properties":{"memberId":{"type":"number","example":123,"description":"ID del miembro"},"tradeCode":{"type":"number","example":5,"description":"Código del oficio (del catálogo)"},"proficiencyLevel":{"type":"string","enum":["BASICO","INTERMEDIO","AVANZADO","EXPERTO"],"example":"INTERMEDIO","description":"Nivel de dominio en el oficio"},"yearsExperience":{"type":"number","example":5,"description":"Años de experiencia en el oficio","minimum":0,"maximum":80},"certifications":{"type":"string","example":"Certificado de electricista, Curso OSHA","description":"Certificaciones relevantes separadas por comas"},"isPrimary":{"type":"boolean","example":false,"description":"Marcar como oficio principal del miembro"}},"required":["memberId","tradeCode"]},"UpdateMemberTradeDto":{"type":"object","properties":{"proficiencyLevel":{"type":"string","enum":["BASICO","INTERMEDIO","AVANZADO","EXPERTO"],"description":"Actualizar nivel de dominio"},"yearsExperience":{"type":"number","description":"Actualizar años de experiencia","minimum":0,"maximum":80},"certifications":{"type":"string","description":"Actualizar certificaciones"},"isPrimary":{"type":"boolean","description":"Actualizar flag de oficio principal"}}},"CreateKnowledgeAreaDto":{"type":"object","properties":{"name":{"type":"string","example":"Ingeniería de Software","description":"Nombre del área de conocimiento"},"description":{"type":"string","example":"Desarrollo, arquitectura y diseño de software","description":"Descripción del área"},"isActive":{"type":"boolean","example":true,"description":"Indica si el área está activa","default":true}},"required":["name"]},"UpdateKnowledgeAreaDto":{"type":"object","properties":{"name":{"type":"string","example":"Ingeniería de Software","description":"Nombre del área de conocimiento"},"description":{"type":"string","example":"Desarrollo, arquitectura y diseño de software","description":"Descripción del área"},"isActive":{"type":"boolean","example":true,"description":"Indica si el área está activa","default":true}}},"AssignKnowledgeAreaDto":{"type":"object","properties":{"memberId":{"type":"number","example":123,"description":"ID del miembro"},"areaCode":{"type":"number","example":5,"description":"Código del área de conocimiento (del catálogo)"},"proficiencyLevel":{"type":"string","enum":["BASICO","INTERMEDIO","AVANZADO","EXPERTO"],"example":"AVANZADO","description":"Nivel de dominio en el área"},"yearsExperience":{"type":"number","example":8,"description":"Años de experiencia en el área","minimum":0,"maximum":80},"certifications":{"type":"string","example":"AWS Solutions Architect, Scrum Master","description":"Certificaciones relevantes separadas por comas"}},"required":["memberId","areaCode"]},"UpdateMemberKnowledgeAreaDto":{"type":"object","properties":{"proficiencyLevel":{"type":"string","enum":["BASICO","INTERMEDIO","AVANZADO","EXPERTO"],"description":"Actualizar nivel de dominio"},"yearsExperience":{"type":"number","description":"Actualizar años de experiencia","minimum":0,"maximum":80},"certifications":{"type":"string","description":"Actualizar certificaciones"}}},"LoginDto":{"type":"object","properties":{"username":{"type":"string","description":"Username for authentication","example":"john.doe"},"password":{"type":"string","description":"Password for authentication","example":"password123","minLength":4}},"required":["username","password"]},"ForgotPasswordDto":{"type":"object","properties":{"email":{"type":"string","example":"usuario@ejemplo.com","description":"Email del usuario que solicita restablecer contraseña"}},"required":["email"]},"ResetPasswordDto":{"type":"object","properties":{"token":{"type":"string","example":"abc123token","description":"Token de restablecimiento enviado por email"},"newPassword":{"type":"string","example":"NuevaContraseña123!","description":"Nueva contraseña (mínimo 8 caracteres, debe incluir mayúscula, minúscula y número)"},"confirmPassword":{"type":"string","example":"NuevaContraseña123!","description":"Confirmación de la nueva contraseña"}},"required":["token","newPassword","confirmPassword"]},"CreateEmailDto":{"type":"object","properties":{"type":{"type":"string","enum":["transactional","marketing","notification","system"],"example":"transactional"},"recipientEmail":{"type":"string","example":"john@example.com","description":"Recipient email address"},"recipientName":{"type":"string","example":"John Doe","description":"Recipient name"},"senderEmail":{"type":"string","example":"admin@church.com","description":"Sender email address"},"senderName":{"type":"string","example":"Church Admin","description":"Sender name"},"subject":{"type":"string","example":"Welcome to our church!","description":"Email subject"},"bodyHtml":{"type":"string","example":"<p>Welcome message...</p>","description":"HTML email body"},"bodyText":{"type":"string","example":"Welcome message...","description":"Plain text email body"},"ccEmails":{"description":"CC email addresses","type":"array","items":{"type":"string"}},"bccEmails":{"description":"BCC email addresses","type":"array","items":{"type":"string"}},"priority":{"type":"string","enum":["low","normal","high","urgent"],"example":"normal"},"templateId":{"type":"number","example":1,"description":"Template ID"},"templateVariables":{"type":"object","example":{"name":"John","date":"2024-11-17"},"description":"Template variables"},"scheduledAt":{"type":"string","example":"2024-11-20T10:30:00Z","description":"Schedule send time"}},"required":["type","recipientEmail","senderEmail","subject","bodyHtml"]},"Email":{"type":"object","properties":{"id":{"type":"number","example":1,"description":"Unique identifier for the email"},"type":{"type":"string","enum":["transactional","marketing","notification","system"],"example":"transactional"},"recipientEmail":{"type":"string","example":"member@church.com","description":"Recipient email address"},"recipientName":{"type":"string","example":"Juan Pérez","description":"Recipient name"},"senderEmail":{"type":"string","example":"iglesia@sgm.com","description":"Sender email address"},"senderName":{"type":"string","example":"Iglesia SGM","description":"Sender name"},"subject":{"type":"string","example":"Bienvenido a la iglesia","description":"Email subject"},"bodyHtml":{"type":"string","description":"Email body in HTML format"},"bodyText":{"type":"string","description":"Email body in plain text format"},"ccEmails":{"description":"CC email addresses","type":"array","items":{"type":"string"}},"bccEmails":{"description":"BCC email addresses","type":"array","items":{"type":"string"}},"priority":{"type":"string","enum":["low","normal","high","urgent"],"example":"normal"},"status":{"type":"string","enum":["draft","pending","sent","cancelled"],"example":"pending"},"deliveryStatus":{"type":"string","enum":["pending","sent","delivered","failed","bounced","rejected"],"example":"pending"},"templateId":{"type":"number","description":"Associated template ID"},"templateVariables":{"type":"object","description":"Variables used for template rendering"},"sentAt":{"format":"date-time","type":"string","description":"When the email was sent"},"scheduledAt":{"format":"date-time","type":"string","description":"When the email is scheduled to be sent"},"deliveredAt":{"format":"date-time","type":"string","description":"When the email was delivered"},"openedAt":{"format":"date-time","type":"string","description":"When the email was first opened"},"clickedAt":{"format":"date-time","type":"string","description":"When links in the email were first clicked"},"externalId":{"type":"string","description":"External provider message ID"},"deliveryAttempts":{"type":"number","description":"Number of delivery attempts"},"retryCount":{"type":"number","description":"Number of retry attempts"},"error":{"type":"string","description":"Error message if delivery failed"},"createdBy":{"type":"string","description":"User who created the email"},"updatedBy":{"type":"string","description":"User who last updated the email"},"createdAt":{"format":"date-time","type":"string","description":"Creation timestamp"},"updatedAt":{"format":"date-time","type":"string","description":"Last update timestamp"},"deletedAt":{"format":"date-time","type":"string","description":"Deletion timestamp"}},"required":["id","type","recipientEmail","recipientName","senderEmail","senderName","subject","bodyHtml","bodyText","ccEmails","bccEmails","priority","status","deliveryStatus","templateId","templateVariables","sentAt","scheduledAt","deliveredAt","openedAt","clickedAt","externalId","deliveryAttempts","retryCount","error","createdBy","updatedBy","createdAt","updatedAt","deletedAt"]},"SendEmailDto":{"type":"object","properties":{"type":{"type":"string","enum":["transactional","marketing","notification","system"],"example":"transactional"},"recipientEmail":{"type":"string","example":"member@church.com","description":"Recipient email address"},"recipientName":{"type":"string","example":"Juan Pérez","description":"Recipient name"},"senderEmail":{"type":"string","example":"iglesia@sgm.com","description":"Sender email address"},"senderName":{"type":"string","example":"Iglesia SGM","description":"Sender name"},"subject":{"type":"string","example":"Bienvenido a la iglesia","description":"Email subject"},"bodyHtml":{"type":"string","description":"Email body in HTML format"},"bodyText":{"type":"string","description":"Email body in plain text format"},"ccEmails":{"description":"CC email addresses","type":"array","items":{"type":"string"}},"bccEmails":{"description":"BCC email addresses","type":"array","items":{"type":"string"}},"priority":{"type":"string","enum":["low","normal","high","urgent"],"example":"normal"},"scheduledAt":{"type":"string","description":"When the email is scheduled to be sent"}},"required":["recipientEmail","senderEmail","subject","bodyHtml"]},"SendTemplateEmailDto":{"type":"object","properties":{"templateCode":{"type":"string","example":"welcome-new-member","description":"Template code to use"},"recipientEmail":{"type":"string","example":"john@example.com","description":"Recipient email address"},"recipientName":{"type":"string","example":"John Doe","description":"Recipient name"},"senderEmail":{"type":"string","example":"admin@church.com","description":"Override sender email"},"senderName":{"type":"string","example":"Church Admin","description":"Override sender name"},"variables":{"type":"object","example":{"memberName":"John Doe","churchName":"First Baptist Church"},"description":"Template variables"},"language":{"type":"string","example":"es","description":"Language for localized template"},"ccEmails":{"description":"CC email addresses","type":"array","items":{"type":"string"}},"bccEmails":{"description":"BCC email addresses","type":"array","items":{"type":"string"}},"priority":{"type":"string","enum":["low","normal","high","urgent"],"example":"normal"},"scheduledAt":{"type":"string","example":"2024-11-20T10:30:00Z","description":"Schedule send time"}},"required":["templateCode","recipientEmail","variables"]},"BulkRecipientDto":{"type":"object","properties":{"email":{"type":"string","example":"john@example.com","description":"Recipient email address"},"name":{"type":"string","example":"John Doe","description":"Recipient name"},"templateData":{"type":"object","example":{"memberName":"John Doe","membershipDate":"2024-01-15"},"description":"Recipient-specific template variables"},"entityId":{"type":"number","example":123,"description":"Related entity ID for this recipient"}},"required":["email","templateData"]},"BulkSendEmailDto":{"type":"object","properties":{"templateCode":{"type":"string","example":"monthly-newsletter","description":"Template code to use"},"recipients":{"description":"Array of recipients with their data","example":[{"email":"john@example.com","name":"John Doe","templateData":{"memberName":"John Doe"},"entityId":123}],"type":"array","items":{"$ref":"#/components/schemas/BulkRecipientDto"}},"commonData":{"type":"object","example":{"churchName":"First Baptist Church","month":"November"},"description":"Common template variables for all recipients"},"language":{"type":"string","example":"es","description":"Language for localized template"},"priority":{"type":"string","enum":["low","normal","high","urgent"],"example":"normal"},"type":{"type":"string","enum":["transactional","marketing","notification","system"],"example":"marketing"},"entityType":{"type":"string","example":"member","description":"Related entity type"},"scheduledAt":{"type":"string","example":"2024-11-20T10:30:00Z","description":"Schedule send time for all emails"},"senderEmail":{"type":"string","example":"admin@church.com","description":"Override sender email"},"senderName":{"type":"string","example":"Church Admin","description":"Override sender name"},"batchSize":{"type":"number","example":50,"description":"Batch size for sending (to avoid rate limits)"},"batchDelay":{"type":"number","example":5000,"description":"Delay between batches in milliseconds"}},"required":["templateCode","recipients"]},"UpdateEmailDto":{"type":"object","properties":{"type":{"type":"string","enum":["transactional","marketing","notification","system"],"example":"transactional"},"recipientEmail":{"type":"string","example":"john@example.com","description":"Recipient email address"},"recipientName":{"type":"string","example":"John Doe","description":"Recipient name"},"senderEmail":{"type":"string","example":"admin@church.com","description":"Sender email address"},"senderName":{"type":"string","example":"Church Admin","description":"Sender name"},"subject":{"type":"string","example":"Welcome to our church!","description":"Email subject"},"bodyHtml":{"type":"string","example":"<p>Welcome message...</p>","description":"HTML email body"},"bodyText":{"type":"string","example":"Welcome message...","description":"Plain text email body"},"ccEmails":{"description":"CC email addresses","type":"array","items":{"type":"string"}},"bccEmails":{"description":"BCC email addresses","type":"array","items":{"type":"string"}},"priority":{"type":"string","enum":["low","normal","high","urgent"],"example":"normal"},"templateId":{"type":"number","example":1,"description":"Template ID"},"templateVariables":{"type":"object","example":{"name":"John","date":"2024-11-17"},"description":"Template variables"},"scheduledAt":{"type":"string","example":"2024-11-20T10:30:00Z","description":"Schedule send time"},"status":{"type":"string","enum":["draft","pending","sent","cancelled"],"example":"sent"},"errorMessage":{"type":"string","example":"SMTP error: Connection timeout","description":"Error message"},"externalId":{"type":"string","example":"msg_1234567890","description":"External provider message ID"},"provider":{"type":"string","example":"mailgun","description":"Email provider used"},"providerData":{"type":"object","example":{"messageId":"abc123"},"description":"Provider metadata"},"sentAt":{"type":"string","example":"2024-11-17T10:30:00Z","description":"When email was sent"},"deliveredAt":{"type":"string","example":"2024-11-17T10:32:00Z","description":"When email was delivered"},"openedAt":{"type":"string","example":"2024-11-17T10:35:00Z","description":"When email was opened"},"clickedAt":{"type":"string","example":"2024-11-17T10:40:00Z","description":"When email link was clicked"}}},"CreateEmailTemplateDto":{"type":"object","properties":{"code":{"type":"string","example":"welcome-new-member","description":"Unique template code"},"name":{"type":"string","example":"Welcome New Member","description":"Template display name"},"description":{"type":"string","example":"Template for welcoming new church members","description":"Template description"},"type":{"type":"string","enum":["transactional","marketing","notification","system"],"example":"transactional"},"subjectTemplate":{"type":"string","example":"Welcome to {{churchName}}, {{memberName}}!","description":"Email subject template"},"bodyHtmlTemplate":{"type":"string","example":"<h1>Welcome {{memberName}}</h1><p>...</p>","description":"HTML body template"},"bodyTextTemplate":{"type":"string","example":"Welcome {{memberName}}...","description":"Plain text body template"},"variablesSchema":{"type":"object","example":{"memberName":{"type":"string","required":true,"description":"Member full name"},"churchName":{"type":"string","required":false,"default":"Our Church"}},"description":"Template variables schema"},"defaultSenderEmail":{"type":"string","example":"admin@church.com","description":"Default sender email"},"defaultSenderName":{"type":"string","example":"Church Admin","description":"Default sender name"},"status":{"type":"string","enum":["active","inactive","draft"],"example":"active"},"isDefault":{"type":"boolean","example":true,"description":"Is this the default template for this type"},"category":{"type":"string","example":"category-membership","description":"Template category for organization"},"supportedLanguages":{"example":["es","en"],"description":"Supported languages","type":"array","items":{"type":"string"}},"defaultLanguage":{"type":"string","example":"es","description":"Default language"},"localizations":{"type":"object","example":{"en":{"subject":"Welcome to {{churchName}}, {{memberName}}!","bodyHtml":"<h1>Welcome {{memberName}}</h1>","bodyText":"Welcome {{memberName}}"}},"description":"Localized templates"}},"required":["code","name","subjectTemplate","bodyHtmlTemplate"]},"EmailTemplate":{"type":"object","properties":{"id":{"type":"number","example":1,"description":"Template ID"},"code":{"type":"string","example":"welcome-new-member","description":"Unique template code"},"name":{"type":"string","example":"Welcome New Member","description":"Template display name"},"description":{"type":"string","example":"Template for welcoming new church members","description":"Template description"},"type":{"type":"string","enum":["transactional","marketing","notification","system"],"example":"transactional"},"subjectTemplate":{"type":"string","example":"Welcome to {{churchName}}, {{memberName}}!","description":"Email subject template"},"bodyHtmlTemplate":{"type":"string","example":"<h1>Welcome {{memberName}}</h1><p>...</p>","description":"HTML body template"},"bodyTextTemplate":{"type":"string","example":"Welcome {{memberName}}...","description":"Plain text body template"},"variablesSchema":{"type":"object","example":{"memberName":{"type":"string","required":true,"description":"Member full name"},"churchName":{"type":"string","required":false,"default":"Our Church"}},"description":"Template variables schema"},"defaultSenderEmail":{"type":"string","example":"admin@church.com","description":"Default sender email"},"defaultSenderName":{"type":"string","example":"Church Admin","description":"Default sender name"},"status":{"type":"string","enum":["active","inactive","draft"],"example":"active"},"isDefault":{"type":"boolean","example":true,"description":"Is this the default template for this type"},"version":{"type":"number","example":1,"description":"Template version number"},"category":{"type":"string","example":"category-membership","description":"Template category for organization"},"supportedLanguages":{"example":["es","en"],"description":"Supported languages","type":"array","items":{"type":"string"}},"defaultLanguage":{"type":"string","example":"es","description":"Default language"},"localizations":{"type":"object","example":{"en":{"subject":"Welcome to {{churchName}}, {{memberName}}!","bodyHtml":"<h1>Welcome {{memberName}}</h1>","bodyText":"Welcome {{memberName}}"}},"description":"Localized templates"},"createdBy":{"type":"string","example":"user123","description":"User who created the template"},"updatedBy":{"type":"string","example":"user456","description":"User who last updated the template"},"createdAt":{"format":"date-time","type":"string","example":"2024-11-17T10:30:00Z","description":"Creation timestamp"},"updatedAt":{"format":"date-time","type":"string","example":"2024-11-17T10:35:00Z","description":"Last update timestamp"}},"required":["id","code","name","description","type","subjectTemplate","bodyHtmlTemplate","bodyTextTemplate","variablesSchema","defaultSenderEmail","defaultSenderName","status","isDefault","version","category","supportedLanguages","defaultLanguage","localizations","createdBy","updatedBy","createdAt","updatedAt"]},"UpdateEmailTemplateDto":{"type":"object","properties":{"code":{"type":"string","example":"welcome-new-member","description":"Unique template code"},"name":{"type":"string","example":"Welcome New Member","description":"Template display name"},"description":{"type":"string","example":"Template for welcoming new church members","description":"Template description"},"type":{"type":"string","enum":["transactional","marketing","notification","system"],"example":"transactional"},"subjectTemplate":{"type":"string","example":"Welcome to {{churchName}}, {{memberName}}!","description":"Email subject template"},"bodyHtmlTemplate":{"type":"string","example":"<h1>Welcome {{memberName}}</h1><p>...</p>","description":"HTML body template"},"bodyTextTemplate":{"type":"string","example":"Welcome {{memberName}}...","description":"Plain text body template"},"variablesSchema":{"type":"object","example":{"memberName":{"type":"string","required":true,"description":"Member full name"},"churchName":{"type":"string","required":false,"default":"Our Church"}},"description":"Template variables schema"},"defaultSenderEmail":{"type":"string","example":"admin@church.com","description":"Default sender email"},"defaultSenderName":{"type":"string","example":"Church Admin","description":"Default sender name"},"status":{"type":"string","enum":["active","inactive","draft"],"example":"active"},"isDefault":{"type":"boolean","example":true,"description":"Is this the default template for this type"},"category":{"type":"string","example":"category-membership","description":"Template category for organization"},"supportedLanguages":{"example":["es","en"],"description":"Supported languages","type":"array","items":{"type":"string"}},"defaultLanguage":{"type":"string","example":"es","description":"Default language"},"localizations":{"type":"object","example":{"en":{"subject":"Welcome to {{churchName}}, {{memberName}}!","bodyHtml":"<h1>Welcome {{memberName}}</h1>","bodyText":"Welcome {{memberName}}"}},"description":"Localized templates"},"version":{"type":"number","example":2,"description":"Template version number"}}},"CreateHarvestDto":{"type":"object","properties":{}},"UpdateHarvestDto":{"type":"object","properties":{}},"AddMemberToHarvestDto":{"type":"object","properties":{}},"AddMultipleMembersToHarvestDto":{"type":"object","properties":{}},"UpdateHarvestMemberDto":{"type":"object","properties":{}},"CreateMinistryDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the ministry","example":"Ministerio de Jóvenes","maxLength":60},"description":{"type":"string","description":"Ministry description","example":"Ministerio dedicado al trabajo con jóvenes de la iglesia"},"leaderId":{"type":"number","description":"ID of the ministry leader","example":123},"secretaryId":{"type":"number","description":"ID of the ministry secretary","example":456},"location":{"type":"string","description":"Ministry location code","example":"MLR","default":"MLR","maxLength":5},"activeMembers":{"type":"number","description":"Number of active members","example":50}},"required":["name","location"]},"UpdateMinistryDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the ministry","example":"Ministerio de Jóvenes","maxLength":60},"description":{"type":"string","description":"Ministry description","example":"Ministerio dedicado al trabajo con jóvenes de la iglesia"},"leaderId":{"type":"number","description":"ID of the ministry leader","example":123},"secretaryId":{"type":"number","description":"ID of the ministry secretary","example":456},"location":{"type":"string","description":"Ministry location code","example":"MLR","default":"MLR","maxLength":5},"activeMembers":{"type":"number","description":"Number of active members","example":50}}},"CreateMinistryGroupDto":{"type":"object","properties":{"ministryId":{"type":"number","description":"ID of the ministry this group belongs to","example":1},"name":{"type":"string","description":"Name of the ministry group","example":"Grupo de Alabanza Jóvenes","maxLength":255},"description":{"type":"string","description":"Group description","example":"Grupo dedicado a la alabanza y adoración en el ministerio de jóvenes"},"leaderId":{"type":"number","description":"ID of the group leader","example":123},"secretaryId":{"type":"number","description":"ID of the group secretary","example":123}},"required":["ministryId","name"]},"UpdateMinistryGroupDto":{"type":"object","properties":{"ministryId":{"type":"number","description":"ID of the ministry this group belongs to","example":1},"name":{"type":"string","description":"Name of the ministry group","example":"Grupo de Alabanza Jóvenes","maxLength":255},"description":{"type":"string","description":"Group description","example":"Grupo dedicado a la alabanza y adoración en el ministerio de jóvenes"},"leaderId":{"type":"number","description":"ID of the group leader","example":123},"secretaryId":{"type":"number","description":"ID of the group secretary","example":123},"groupId":{"type":"number","description":"Group ID (for internal use)","example":1}}},"AddMemberToMinistryDto":{"type":"object","properties":{"ministryId":{"type":"number","description":"ID of the ministry","example":1},"memberId":{"type":"number","description":"ID of the member to add","example":123}},"required":["ministryId","memberId"]},"AddMemberToGroupDto":{"type":"object","properties":{"ministryId":{"type":"number","description":"ID of the ministry","example":1},"groupId":{"type":"number","description":"ID of the group","example":2},"memberId":{"type":"number","description":"ID of the member to add","example":123}},"required":["ministryId","groupId","memberId"]},"AddMultipleMembersToGroupDto":{"type":"object","properties":{"ministryId":{"type":"number","description":"ID of the ministry","example":1},"groupId":{"type":"number","description":"ID of the group","example":2},"memberIds":{"description":"Array of member IDs to add","example":[123,456,789],"type":"array","items":{"type":"number"}}},"required":["ministryId","groupId","memberIds"]},"CreateMemberPastoralNoteDto":{"type":"object","properties":{"memberId":{"type":"number","description":"Member ID (maestro_miembros.ID)","example":123},"note":{"type":"string","description":"Pastoral note content","example":"Member showed great spiritual growth during counseling session."},"user":{"type":"string","description":"User who created the note (auto-populated from session)","example":"pastor@church.com"},"origin":{"type":"string","description":"Origin of the note","enum":["COUNSELING","VISIT","PHONE_CALL","MEETING","DISCIPLESHIP","PRAYER_REQUEST","FOLLOW_UP","SPECIAL_EVENT","OTHER"],"example":"COUNSELING"},"ref":{"type":"number","description":"Reference ID","example":456},"date":{"type":"string","description":"Date of the note (will default to current date)","example":"2025-11-14"}},"required":["memberId","note","origin"]},"UpdateMemberPastoralNoteDto":{"type":"object","properties":{"memberId":{"type":"number","description":"Member ID (maestro_miembros.ID)","example":123},"note":{"type":"string","description":"Pastoral note content","example":"Member showed great spiritual growth during counseling session."},"user":{"type":"string","description":"User who created the note (auto-populated from session)","example":"pastor@church.com"},"origin":{"type":"string","description":"Origin of the note","enum":["COUNSELING","VISIT","PHONE_CALL","MEETING","DISCIPLESHIP","PRAYER_REQUEST","FOLLOW_UP","SPECIAL_EVENT","OTHER"],"example":"COUNSELING"},"ref":{"type":"number","description":"Reference ID","example":456},"date":{"type":"string","description":"Date of the note (will default to current date)","example":"2025-11-14"}}},"CreateNewBelieverDto":{"type":"object","properties":{"church":{"type":"string","description":"Código de iglesia","example":"SGM01","maxLength":5},"harvestNumber":{"type":"string","description":"Número de cosecha asociada","example":"COS2025001"},"firstName":{"type":"string","description":"Nombres del nuevo creyente","example":"Juan Carlos","maxLength":150},"lastName":{"type":"string","description":"Apellidos del nuevo creyente","example":"Pérez García","maxLength":150},"identification":{"type":"string","description":"Número de identificación/cédula","example":"00112345678","maxLength":30},"documentType":{"type":"string","description":"Tipo de documento de identificación","example":"ID_CARD","maxLength":20},"sex":{"type":"string","description":"Sexo (MALE=Masculino, FEMALE=Femenino)","example":"MALE","enum":["MALE","FEMALE"]},"maritalStatus":{"type":"string","description":"Estado civil","example":"SINGLE","maxLength":20},"nationality":{"type":"string","description":"Código de nacionalidad","example":"0001","maxLength":6},"birthDate":{"type":"string","description":"Fecha de nacimiento (timestamp o fecha)","example":"1990-05-15"},"email":{"type":"string","description":"Correo electrónico","example":"juan.perez@email.com"},"homePhone":{"type":"string","description":"Teléfono de casa","example":"809-555-1234","maxLength":15},"cellPhone":{"type":"string","description":"Teléfono celular","example":"809-555-1234","maxLength":15},"address":{"type":"string","description":"Dirección completa"},"sector":{"type":"string","description":"Sector","maxLength":40},"houseNumber":{"type":"string","description":"Número de casa","maxLength":5},"city":{"type":"string","description":"Ciudad","maxLength":255},"workplace":{"type":"string","description":"Lugar de trabajo","maxLength":250},"workPhone":{"type":"string","description":"Teléfono de trabajo","maxLength":15},"workAddress":{"type":"string","description":"Dirección de trabajo","maxLength":250},"memberType":{"type":"string","description":"Tipo de miembro esperado al procesar a membresía","maxLength":20},"conversionDate":{"type":"string","description":"Fecha de conversión (timestamp o fecha)"},"baptismDate":{"type":"string","description":"Fecha de bautismo vinculada a la cosecha"},"conversionPlace":{"type":"string","description":"Lugar donde se convirtió","maxLength":250},"howCameToChurch":{"type":"string","description":"Cómo llegó a la iglesia","maxLength":200},"whoInvited":{"type":"string","description":"Quién lo trajo a la iglesia","maxLength":200},"wasChristian":{"type":"string","description":"Si fue cristiano antes","enum":["SI","NO",""]},"previousChurch":{"type":"string","description":"Iglesia anterior si aplica","maxLength":200},"receivedBy":{"type":"string","description":"Persona que recibió al nuevo creyente","maxLength":200},"assignedMinister":{"type":"string","description":"Ministro de redes asignado","maxLength":100},"assignedMinisterId":{"type":"integer","description":"ID del ministro asignado"},"spouse":{"type":"string","description":"Cónyuge","maxLength":200},"children":{"type":"integer","description":"Cantidad de hijos"},"baptized":{"type":"string","description":"Si ya fue bautizado","enum":["SI","NO",""]},"familyContactName":{"type":"string","description":"Nombre de contacto familiar","maxLength":150},"familyContactPhone":{"type":"string","description":"Teléfono de contacto familiar","maxLength":15},"status":{"type":"string","description":"Estado del proceso R1","enum":["NUEVO","EN_PROCESO","ENTREVISTA_1","ENTREVISTA_2","ENTREVISTA_3","LISTO_MEMBRESIA","PROCESADO","INACTIVO"],"default":"NUEVO"},"isActive":{"type":"string","description":"Si está activo en el proceso","enum":["1","0"]},"additionalNotes":{"type":"string","description":"Notas adicionales del proceso"},"createdBy":{"type":"string","description":"Usuario que crea el registro","maxLength":100}},"required":["firstName","lastName"]},"UpdateNewBelieverDto":{"type":"object","properties":{"church":{"type":"string","description":"Código de iglesia","example":"SGM01","maxLength":5},"harvestNumber":{"type":"string","description":"Número de cosecha asociada","example":"COS2025001"},"firstName":{"type":"string","description":"Nombres del nuevo creyente","example":"Juan Carlos","maxLength":150},"lastName":{"type":"string","description":"Apellidos del nuevo creyente","example":"Pérez García","maxLength":150},"identification":{"type":"string","description":"Número de identificación/cédula","example":"00112345678","maxLength":30},"documentType":{"type":"string","description":"Tipo de documento de identificación","example":"ID_CARD","maxLength":20},"sex":{"type":"string","description":"Sexo (MALE=Masculino, FEMALE=Femenino)","example":"MALE","enum":["MALE","FEMALE"]},"maritalStatus":{"type":"string","description":"Estado civil","example":"SINGLE","maxLength":20},"nationality":{"type":"string","description":"Código de nacionalidad","example":"0001","maxLength":6},"birthDate":{"type":"string","description":"Fecha de nacimiento (timestamp o fecha)","example":"1990-05-15"},"email":{"type":"string","description":"Correo electrónico","example":"juan.perez@email.com"},"homePhone":{"type":"string","description":"Teléfono de casa","example":"809-555-1234","maxLength":15},"cellPhone":{"type":"string","description":"Teléfono celular","example":"809-555-1234","maxLength":15},"address":{"type":"string","description":"Dirección completa"},"sector":{"type":"string","description":"Sector","maxLength":40},"houseNumber":{"type":"string","description":"Número de casa","maxLength":5},"city":{"type":"string","description":"Ciudad","maxLength":255},"workplace":{"type":"string","description":"Lugar de trabajo","maxLength":250},"workPhone":{"type":"string","description":"Teléfono de trabajo","maxLength":15},"workAddress":{"type":"string","description":"Dirección de trabajo","maxLength":250},"memberType":{"type":"string","description":"Tipo de miembro esperado al procesar a membresía","maxLength":20},"conversionDate":{"type":"string","description":"Fecha de conversión (timestamp o fecha)"},"baptismDate":{"type":"string","description":"Fecha de bautismo vinculada a la cosecha"},"conversionPlace":{"type":"string","description":"Lugar donde se convirtió","maxLength":250},"howCameToChurch":{"type":"string","description":"Cómo llegó a la iglesia","maxLength":200},"whoInvited":{"type":"string","description":"Quién lo trajo a la iglesia","maxLength":200},"wasChristian":{"type":"string","description":"Si fue cristiano antes","enum":["SI","NO",""]},"previousChurch":{"type":"string","description":"Iglesia anterior si aplica","maxLength":200},"receivedBy":{"type":"string","description":"Persona que recibió al nuevo creyente","maxLength":200},"assignedMinister":{"type":"string","description":"Ministro de redes asignado","maxLength":100},"assignedMinisterId":{"type":"integer","description":"ID del ministro asignado"},"spouse":{"type":"string","description":"Cónyuge","maxLength":200},"children":{"type":"integer","description":"Cantidad de hijos"},"baptized":{"type":"string","description":"Si ya fue bautizado","enum":["SI","NO",""]},"familyContactName":{"type":"string","description":"Nombre de contacto familiar","maxLength":150},"familyContactPhone":{"type":"string","description":"Teléfono de contacto familiar","maxLength":15},"status":{"type":"string","description":"Estado del proceso R1","enum":["NUEVO","EN_PROCESO","ENTREVISTA_1","ENTREVISTA_2","ENTREVISTA_3","LISTO_MEMBRESIA","PROCESADO","INACTIVO"],"default":"NUEVO"},"isActive":{"type":"string","description":"Si está activo en el proceso","enum":["1","0"]},"additionalNotes":{"type":"string","description":"Notas adicionales del proceso"},"createdBy":{"type":"string","description":"Usuario que crea el registro","maxLength":100},"updatedBy":{"type":"string","description":"Usuario que actualiza el registro","maxLength":100}}},"UpdateInterviewDto":{"type":"object","properties":{"interviewDate":{"type":"string","description":"Fecha de la entrevista","example":"2025-11-16T10:30:00.000Z"},"comments":{"type":"string","description":"Comentarios de la entrevista"},"updatedBy":{"type":"string","description":"Usuario que registra la entrevista","maxLength":100}},"required":["interviewDate"]},"ProcessToMembershipDto":{"type":"object","properties":{"comments":{"type":"string","description":"Comentarios del procesamiento"},"processedBy":{"type":"string","description":"Usuario que procesa a membresía","maxLength":100}}},"BulkProcessToMembershipDto":{"type":"object","properties":{"newBelieverIds":{"description":"IDs de los nuevos creyentes a procesar","example":[1,2,3,4,5],"type":"array","items":{"type":"number"}},"comments":{"type":"string","description":"Comentarios del procesamiento masivo"},"processedBy":{"type":"string","description":"Usuario que procesa a membresía","maxLength":100}},"required":["newBelieverIds"]},"CreateConsolidationR2Dto":{"type":"object","properties":{"memberId":{"type":"number","description":"ID del miembro a inscribir en R2","example":45001},"programId":{"type":"number","description":"ID del programa de consolidación","example":5},"programName":{"type":"string","description":"Nombre personalizado del programa","example":"Fundamentos de Fe 2025-A","maxLength":150},"programType":{"type":"string","enum":["basic_faith","church_membership","ministry_prep","youth_track","adult_track","couples_track"],"description":"Tipo de programa de consolidación","example":"basic_faith"},"consolidatorId":{"type":"number","description":"ID del miembro consolidador asignado","example":30001},"startDate":{"type":"string","description":"Fecha de inicio del programa (ISO 8601)","example":"2025-01-15"},"durationWeeks":{"type":"number","description":"Duración en semanas (1-52)","example":12,"minimum":1,"maximum":52},"totalSessions":{"type":"number","description":"Total de sesiones programadas","example":12,"minimum":0},"ministryInterests":{"description":"Áreas de interés ministerial del candidato","example":["niños","jovenes","musica"],"type":"array","items":{"type":"string"}},"location":{"type":"string","description":"Código de localidad/iglesia","example":"SGM01","maxLength":10},"initialNotes":{"type":"string","description":"Notas iniciales sobre el candidato"}},"required":["memberId","programType"]},"ConsolidationR2":{"type":"object","properties":{"id":{"type":"number","description":"ID único del registro R2"},"memberId":{"type":"number","description":"ID del miembro en maestro_miembros","example":45001},"programId":{"type":"number","description":"ID del programa de consolidación","example":5},"programName":{"type":"string","description":"Nombre del programa","example":"Fundamentos de Fe 2025"},"programType":{"type":"string","enum":["basic_faith","church_membership","ministry_prep","youth_track","adult_track","couples_track"],"description":"Tipo de programa de consolidación"},"consolidatorId":{"type":"number","description":"ID del miembro consolidador asignado","example":30001},"status":{"type":"string","enum":["enrolled","in_progress","evaluation","completed","ready_leadership","promoted_r3","inactive"],"description":"Estado actual en el proceso R2"},"startDate":{"format":"date-time","type":"string","description":"Fecha de inicio del programa"},"expectedEndDate":{"format":"date-time","type":"string","description":"Fecha esperada de finalización"},"actualEndDate":{"format":"date-time","type":"string","description":"Fecha real de finalización"},"durationWeeks":{"type":"number","description":"Duración en semanas del programa","example":12},"currentWeek":{"type":"number","description":"Semana actual del programa","example":6},"completionPercentage":{"type":"number","description":"Porcentaje de completitud","example":45.5},"attendanceSessions":{"type":"number","description":"Número de sesiones asistidas","example":8},"totalSessions":{"type":"number","description":"Total de sesiones del programa","example":12},"evaluationScore":{"type":"number","description":"Puntuación de evaluación final","example":85.5},"spiritualGiftsIdentified":{"description":"Dones espirituales identificados","example":["enseñanza","evangelismo"],"type":"array","items":{"type":"string"}},"ministryInterests":{"description":"Áreas de interés ministerial","example":["niños","jovenes","musica"],"type":"array","items":{"type":"string"}},"consolidatorNotes":{"type":"string","description":"Notas del consolidador sobre el progreso"},"participantFeedback":{"type":"string","description":"Retroalimentación del participante"},"challengesFaced":{"description":"Desafíos enfrentados durante el proceso","type":"array","items":{"type":"string"}},"nextStepsRecommended":{"type":"string","description":"Próximos pasos recomendados"},"readyForR3Date":{"format":"date-time","type":"string","description":"Fecha cuando fue marcado como listo para R3"},"promotedToR3Date":{"format":"date-time","type":"string","description":"Fecha de promoción a R3"},"location":{"type":"string","description":"Código de localidad/iglesia","example":"SGM01"},"createdBy":{"type":"string","description":"Usuario que creó el registro"},"createdAt":{"format":"date-time","type":"string","description":"Fecha de creación del registro"},"updatedBy":{"type":"string","description":"Usuario que actualizó por última vez"},"updatedAt":{"format":"date-time","type":"string","description":"Fecha de última actualización"},"isReadyForR3":{"type":"boolean","description":"Si está listo para promover a R3"},"progressPercentage":{"type":"number","description":"Progreso en porcentaje basado en semana actual"},"attendanceRate":{"type":"number","description":"Tasa de asistencia en porcentaje"},"displayStatus":{"type":"string","description":"Estado legible del proceso"},"timeInProgram":{"type":"string","description":"Tiempo transcurrido en el programa"},"canPromoteToR3":{"type":"boolean","description":"Si puede ser promovido a R3"}},"required":["id","memberId","programId","programName","programType","consolidatorId","status","startDate","expectedEndDate","actualEndDate","durationWeeks","currentWeek","completionPercentage","attendanceSessions","totalSessions","evaluationScore","spiritualGiftsIdentified","ministryInterests","consolidatorNotes","participantFeedback","challengesFaced","nextStepsRecommended","readyForR3Date","promotedToR3Date","location","createdBy","createdAt","updatedBy","updatedAt","isReadyForR3","progressPercentage","attendanceRate","displayStatus","timeInProgram","canPromoteToR3"]},"ConsolidationR2StatisticsDto":{"type":"object","properties":{"totalRecords":{"type":"number","description":"Total de registros R2"},"activeInProcess":{"type":"number","description":"Registros activos en proceso"},"completed":{"type":"number","description":"Registros completados"},"readyForR3":{"type":"number","description":"Registros listos para R3"},"averageCompletion":{"type":"number","description":"Promedio de completitud"},"r3PromotionRate":{"type":"number","description":"Tasa de promoción a R3"},"byStatus":{"type":"object","description":"Estadísticas por estado"},"byProgramType":{"type":"object","description":"Estadísticas por tipo de programa"},"topConsolidators":{"description":"Top 5 consolidadores por cantidad","type":"array","items":{"type":"string"}}},"required":["totalRecords","activeInProcess","completed","readyForR3","averageCompletion","r3PromotionRate","byStatus","byProgramType","topConsolidators"]},"UpdateConsolidationR2Dto":{"type":"object","properties":{"status":{"type":"string","enum":["enrolled","in_progress","evaluation","completed","ready_leadership","promoted_r3","inactive"],"description":"Estado actual en el proceso R2"},"consolidatorId":{"type":"number","description":"ID del consolidador asignado"},"currentWeek":{"type":"number","description":"Semana actual del programa (1-52)","minimum":1,"maximum":52},"completionPercentage":{"type":"number","description":"Porcentaje de completitud (0-100)","minimum":0,"maximum":100},"attendanceSessions":{"type":"number","description":"Número de sesiones asistidas","minimum":0},"evaluationScore":{"type":"number","description":"Puntuación de evaluación (0-100)","minimum":0,"maximum":100},"spiritualGiftsIdentified":{"description":"Dones espirituales identificados","type":"array","items":{"type":"string"}},"ministryInterests":{"description":"Áreas de interés ministerial actualizadas","type":"array","items":{"type":"string"}},"consolidatorNotes":{"type":"string","description":"Notas del consolidador sobre el progreso"},"participantFeedback":{"type":"string","description":"Retroalimentación del participante"},"challengesFaced":{"description":"Desafíos enfrentados durante el proceso","type":"array","items":{"type":"string"}},"nextStepsRecommended":{"type":"string","description":"Próximos pasos recomendados"},"actualEndDate":{"type":"string","description":"Fecha de finalización del programa"}}},"PromoteToR3Dto":{"type":"object","properties":{"r2Id":{"type":"number","description":"ID del registro R2 a promover","example":123},"promotionComments":{"type":"string","description":"Comentarios sobre la promoción"},"promotionDate":{"type":"string","description":"Fecha de promoción (por defecto hoy)"},"mentorId":{"type":"number","description":"ID del mentor a asignar en R3"},"recommendedTrack":{"type":"string","description":"Pista de liderazgo recomendada para R3","example":"cell_leadership"}},"required":["r2Id"]},"CreateLeadershipR3Dto":{"type":"object","properties":{"memberId":{"type":"number","description":"ID del miembro a inscribir en R3","example":45001},"r2Id":{"type":"number","description":"ID del registro R2 completado","example":123},"track":{"type":"string","enum":["cell_leadership","youth_ministry","worship_ministry","teaching_ministry","pastoral_ministry","ministry_leadership","pastoral_leadership","evangelism_leadership","administration","evangelism","counseling"],"description":"Pista de liderazgo escogida","example":"cell_leadership"},"targetCertification":{"type":"string","enum":["basic_leader","cell_leader","ministry_coordinator","ministry_leader","department_head","associate_pastor","senior_pastor","senior_leader"],"description":"Certificación objetivo","example":"cell_leader"},"mentorId":{"type":"number","description":"ID del mentor asignado","example":25001},"startDate":{"type":"string","description":"Fecha de inicio en R3 (ISO 8601)","example":"2025-02-01"},"expectedCertificationDate":{"type":"string","description":"Fecha esperada de certificación","example":"2026-02-01"},"trainingModulesTotal":{"description":"Módulos de entrenamiento requeridos para el track","example":["predicacion_basica","liderazgo_celular","discipulado_personal"],"type":"array","items":{"type":"string"}},"location":{"type":"string","description":"Código de localidad/iglesia","example":"SGM01","maxLength":10},"initialMentorNotes":{"type":"string","description":"Notas iniciales del mentor"}},"required":["memberId","track"]},"LeadershipR3":{"type":"object","properties":{"id":{"type":"number","description":"ID único del registro R3"},"memberId":{"type":"number","description":"ID del miembro en maestro_miembros","example":45001},"r2Id":{"type":"number","description":"ID del registro R2 que completó","example":123},"track":{"type":"string","enum":["cell_leadership","youth_ministry","worship_ministry","teaching_ministry","pastoral_ministry","ministry_leadership","pastoral_leadership","evangelism_leadership","administration","evangelism","counseling"],"description":"Pista de liderazgo escogida"},"status":{"type":"string","enum":["enrolled","leadership_training","cell_leader_prep","cell_leader","ministry_leader","pastor_track","certified_leader","active","inactive"],"description":"Estado actual en el proceso R3"},"currentLevel":{"type":"number","description":"Nivel actual de liderazgo (1-6)","example":3},"targetCertification":{"type":"string","enum":["basic_leader","cell_leader","ministry_coordinator","ministry_leader","department_head","associate_pastor","senior_pastor","senior_leader"],"description":"Certificación objetivo"},"currentCertification":{"type":"string","enum":["basic_leader","cell_leader","ministry_coordinator","ministry_leader","department_head","associate_pastor","senior_pastor","senior_leader"],"description":"Certificación actual obtenida"},"mentorId":{"type":"number","description":"ID del mentor/líder supervisor","example":25001},"startDate":{"format":"date-time","type":"string","description":"Fecha de inicio en R3"},"expectedCertificationDate":{"format":"date-time","type":"string","description":"Fecha esperada de certificación"},"actualCertificationDate":{"format":"date-time","type":"string","description":"Fecha real de certificación"},"trainingModulesCompleted":{"description":"Módulos de entrenamiento completados","example":["predicacion_basica","liderazgo_celular"],"type":"array","items":{"type":"string"}},"trainingModulesTotal":{"description":"Total de módulos requeridos para el track","type":"array","items":{"type":"string"}},"practicalAssignments":{"description":"Asignaciones prácticas completadas","type":"array","items":{"type":"string"}},"leadershipResponsibilities":{"description":"Responsabilidades actuales de liderazgo","type":"array","items":{"type":"string"}},"peopleMentoring":{"type":"number","description":"Cantidad de personas que está mentoreando","example":3},"cellsLeading":{"type":"number","description":"Cantidad de células que está liderando","example":1},"ministryInvolvement":{"description":"Ministerios en los que está involucrado","type":"array","items":{"type":"string"}},"spiritualCompetencies":{"description":"Competencias espirituales evaluadas","type":"array","items":{"type":"string"}},"leadershipSkills":{"description":"Habilidades de liderazgo evaluadas","type":"array","items":{"type":"string"}},"mentorEvaluations":{"description":"Evaluaciones del mentor","type":"array","items":{"type":"string"}},"conferenceAttendance":{"description":"Conferencias y eventos de liderazgo asistidos","type":"array","items":{"type":"string"}},"booksRead":{"description":"Libros de liderazgo y crecimiento completados","type":"array","items":{"type":"string"}},"currentGoals":{"description":"Metas actuales de desarrollo","type":"array","items":{"type":"string"}},"performanceMetrics":{"description":"Métricas de rendimiento en liderazgo","type":"array","items":{"type":"string"}},"mentorNotes":{"type":"string","description":"Notas del mentor sobre el desarrollo"},"selfAssessment":{"type":"string","description":"Auto-evaluación del líder en desarrollo"},"nextPromotionTarget":{"type":"string","description":"Próximo objetivo de promoción"},"overallPerformanceScore":{"type":"number","description":"Puntuación general de rendimiento","example":85.5},"readyForCertification":{"type":"boolean","description":"Si está listo para certificación (manual override)"},"trainingProgressOverride":{"type":"number","description":"Progreso de entrenamiento manual (override del cálculo automático)"},"location":{"type":"string","description":"Código de localidad/iglesia","example":"SGM01"},"createdBy":{"type":"string","description":"Usuario que creó el registro"},"createdAt":{"format":"date-time","type":"string","description":"Fecha de creación del registro"},"updatedBy":{"type":"string","description":"Usuario que actualizó por última vez"},"updatedAt":{"format":"date-time","type":"string","description":"Fecha de última actualización"},"trainingProgress":{"type":"number","description":"Progreso de entrenamiento en porcentaje"},"isReadyForCertification":{"type":"boolean","description":"Si está listo para certificación"},"displayStatus":{"type":"string","description":"Estado legible del liderazgo"},"timeInLeadership":{"type":"string","description":"Tiempo en liderazgo"},"averageMentorScore":{"type":"number","description":"Evaluación promedio del mentor"},"canPromoteToNextLevel":{"type":"boolean","description":"Si puede ser promovido al siguiente nivel"},"nextCertificationGoal":{"type":"string","description":"Próxima meta de certificación"}},"required":["id","memberId","r2Id","track","status","currentLevel","targetCertification","currentCertification","mentorId","startDate","expectedCertificationDate","actualCertificationDate","trainingModulesCompleted","trainingModulesTotal","practicalAssignments","leadershipResponsibilities","peopleMentoring","cellsLeading","ministryInvolvement","spiritualCompetencies","leadershipSkills","mentorEvaluations","conferenceAttendance","booksRead","currentGoals","performanceMetrics","mentorNotes","selfAssessment","nextPromotionTarget","overallPerformanceScore","readyForCertification","trainingProgressOverride","location","createdBy","createdAt","updatedBy","updatedAt","trainingProgress","isReadyForCertification","displayStatus","timeInLeadership","averageMentorScore","canPromoteToNextLevel","nextCertificationGoal"]},"LeadershipR3StatisticsDto":{"type":"object","properties":{"totalRecords":{"type":"number","description":"Total de registros R3"},"activeLeaders":{"type":"number","description":"Líderes activos"},"certifiedLeaders":{"type":"number","description":"Líderes certificados"},"activeCellLeaders":{"type":"number","description":"Líderes de célula activos"},"totalBeingMentored":{"type":"number","description":"Total de personas siendo mentoreadas"},"totalCellsLed":{"type":"number","description":"Total de células siendo lideradas"},"averageTrainingProgress":{"type":"number","description":"Promedio de progreso de entrenamiento"},"certificationRate":{"type":"number","description":"Tasa de certificación"},"byStatus":{"type":"object","description":"Estadísticas por estado"},"byTrack":{"type":"object","description":"Estadísticas por track de liderazgo"},"byLevel":{"type":"object","description":"Estadísticas por nivel"},"topMentors":{"description":"Top 5 mentores por cantidad de mentees","type":"array","items":{"type":"string"}}},"required":["totalRecords","activeLeaders","certifiedLeaders","activeCellLeaders","totalBeingMentored","totalCellsLed","averageTrainingProgress","certificationRate","byStatus","byTrack","byLevel","topMentors"]},"UpdateLeadershipR3Dto":{"type":"object","properties":{"status":{"type":"string","enum":["enrolled","leadership_training","cell_leader_prep","cell_leader","ministry_leader","pastor_track","certified_leader","active","inactive"],"description":"Estado actual en el proceso R3"},"currentLevel":{"type":"number","description":"Nivel actual de liderazgo (1-6)","minimum":1,"maximum":6},"currentCertification":{"type":"string","enum":["basic_leader","cell_leader","ministry_coordinator","ministry_leader","department_head","associate_pastor","senior_pastor","senior_leader"],"description":"Certificación actual obtenida"},"mentorId":{"type":"number","description":"ID del mentor supervisor"},"trainingModulesCompleted":{"description":"Módulos de entrenamiento completados","type":"array","items":{"type":"string"}},"peopleMentoring":{"type":"number","description":"Cantidad de personas que está mentoreando","minimum":0},"cellsLeading":{"type":"number","description":"Cantidad de células que está liderando","minimum":0},"mentorNotes":{"type":"string","description":"Notas del mentor sobre el desarrollo"},"selfAssessment":{"type":"string","description":"Auto-evaluación del líder"},"nextPromotionTarget":{"type":"string","description":"Próximo objetivo de promoción"},"actualCertificationDate":{"type":"string","description":"Fecha real de certificación"}}},"PracticalAssignmentDto":{"type":"object","properties":{"assignmentId":{"type":"string","description":"ID único de la asignación","example":"PRED_001"},"title":{"type":"string","description":"Título de la asignación","example":"Primera Predicación en Célula"},"completedDate":{"type":"string","description":"Fecha de completitud"},"score":{"type":"number","description":"Puntuación obtenida (0-100)","minimum":0,"maximum":100},"feedback":{"type":"string","description":"Retroalimentación del evaluador"}},"required":["assignmentId","title"]},"AddPracticalAssignmentDto":{"type":"object","properties":{"r3Id":{"type":"number","description":"ID del registro R3","example":456},"assignment":{"description":"Datos de la asignación práctica","allOf":[{"$ref":"#/components/schemas/PracticalAssignmentDto"}]}},"required":["r3Id","assignment"]},"MentorEvaluationDto":{"type":"object","properties":{"evaluationDate":{"type":"string","description":"Fecha de la evaluación"},"overallScore":{"type":"number","description":"Puntuación general (0-100)","minimum":0,"maximum":100},"strengths":{"description":"Fortalezas identificadas","example":["Comunicación efectiva","Liderazgo natural"],"type":"array","items":{"type":"string"}},"areasForGrowth":{"description":"Áreas para crecimiento","example":["Gestión del tiempo","Delegación"],"type":"array","items":{"type":"string"}},"recommendations":{"type":"string","description":"Recomendaciones del mentor"},"readyForPromotion":{"type":"boolean","description":"Si está listo para promoción"}},"required":["evaluationDate","overallScore","strengths","areasForGrowth","recommendations","readyForPromotion"]},"AddMentorEvaluationDto":{"type":"object","properties":{"r3Id":{"type":"number","description":"ID del registro R3","example":456},"evaluation":{"description":"Datos de la evaluación del mentor","allOf":[{"$ref":"#/components/schemas/MentorEvaluationDto"}]}},"required":["r3Id","evaluation"]},"DashboardCacheMetadataDto":{"type":"object","properties":{"hit":{"type":"boolean","example":false},"store":{"type":"string","example":"redis","enum":["redis","memory","none"]},"ttlSeconds":{"type":"number","example":90},"key":{"type":"string","example":"dashboard:summary:v1:MLR:abc123"}},"required":["hit","store","ttlSeconds","key"]},"DashboardMetadataDto":{"type":"object","properties":{"generatedAt":{"type":"string","example":"2026-04-12T13:10:00.000Z"},"location":{"type":"string","example":"MLR"},"cache":{"$ref":"#/components/schemas/DashboardCacheMetadataDto"}},"required":["generatedAt","location","cache"]},"DashboardMoneyAmountDto":{"type":"object","properties":{"currency":{"type":"string","example":"DOP","enum":["DOP","USD","EUR"]},"amount":{"type":"number","example":12500.5}},"required":["currency","amount"]},"DashboardTrendDto":{"type":"object","properties":{"direction":{"type":"string","example":"up","enum":["up","down","stable"]},"value":{"type":"number","example":12},"label":{"type":"string","example":"12 nuevos este mes"}},"required":["direction","value","label"]},"DashboardCardDto":{"type":"object","properties":{"key":{"type":"string","example":"activeMembers"},"label":{"type":"string","example":"Miembros activos"},"value":{"type":"number","example":1240},"format":{"type":"string","example":"number","enum":["number","currency"]},"currency":{"type":"string","example":"DOP"},"amounts":{"type":"array","items":{"$ref":"#/components/schemas/DashboardMoneyAmountDto"}},"subtitle":{"type":"string","example":"18 nuevos este mes"},"trend":{"$ref":"#/components/schemas/DashboardTrendDto"},"requiredPermission":{"type":"string","example":"R_MEMBERS"}},"required":["key","label","value","format","requiredPermission"]},"DashboardAlertDto":{"type":"object","properties":{"key":{"type":"string","example":"pendingSettlements"},"type":{"type":"string","example":"warning","enum":["info","warning","danger"]},"label":{"type":"string","example":"Hay cuadres pendientes de aprobación"},"value":{"type":"string","example":"3 pendientes"}},"required":["key","type","label","value"]},"DashboardSummaryDto":{"type":"object","properties":{"metadata":{"$ref":"#/components/schemas/DashboardMetadataDto"},"cards":{"type":"array","items":{"$ref":"#/components/schemas/DashboardCardDto"}},"alerts":{"type":"array","items":{"$ref":"#/components/schemas/DashboardAlertDto"}}},"required":["metadata","cards","alerts"]},"CreateDiscipleshipCourseDto":{"type":"object","properties":{"codigo":{"type":"string","description":"Código único del curso","example":"DISC001"},"nombre":{"type":"string","description":"Nombre del curso","example":"Fundamentos de la Fe"},"descripcion":{"type":"string","description":"Descripción detallada del curso"},"tema":{"type":"string","description":"Tema del curso"},"level":{"type":"string","enum":["BASICO","INTERMEDIO","AVANZADO","ESPECIALIDAD"],"description":"Nivel del curso"},"type":{"type":"string","enum":["S","E","ES","T"],"description":"Tipo de curso"},"durationWeeks":{"type":"number","description":"Duración en semanas","minimum":1,"maximum":52},"maxCapacity":{"type":"number","description":"Capacidad máxima de estudiantes","minimum":1},"aula":{"type":"string","description":"Aula donde se imparte"},"minAttendancePercentage":{"type":"number","description":"Porcentaje mínimo de asistencia (0-100)","minimum":0,"maximum":100},"minPassingGrade":{"type":"number","description":"Nota mínima para aprobar (0-100)","minimum":0,"maximum":100},"facilitator1Id":{"type":"number","description":"ID del facilitador principal"},"facilitator1Type":{"type":"string","description":"Tipo del facilitador principal","enum":["member","user"]},"facilitator2Id":{"type":"number","description":"ID del facilitador secundario"},"facilitator2Type":{"type":"string","description":"Tipo del facilitador secundario","enum":["member","user"]},"prerequisiteId":{"type":"number","description":"ID del curso prerequisito"},"nextCourseId":{"type":"number","description":"ID del siguiente curso en secuencia"},"requiresCertificate":{"type":"boolean","description":"Requiere certificado previo"},"generatesCertificate":{"type":"boolean","description":"Genera certificado al completar"},"hasPracticalComponent":{"type":"boolean","description":"Tiene componente práctico"},"hasMidtermExam":{"type":"boolean","description":"Tiene examen parcial"},"hasFinalExam":{"type":"boolean","description":"Tiene examen final"},"autoReenrollFlag":{"type":"string","description":"Configuración de re-matriculación","enum":["A","M","N"]},"schedule":{"description":"Horarios del curso","type":"array","items":{"type":"string"}},"materials":{"description":"Materiales del curso","type":"array","items":{"type":"string"}}},"required":["codigo","nombre","level","type","durationWeeks","maxCapacity"]},"UpdateDiscipleshipCourseDto":{"type":"object","properties":{"nombre":{"type":"string","description":"Nombre del curso"},"descripcion":{"type":"string","description":"Descripción detallada del curso"},"nivel":{"type":"string","enum":["BASICO","INTERMEDIO","AVANZADO","ESPECIALIDAD"],"description":"Nivel del curso"},"tipoCurso":{"type":"string","enum":["S","E","ES","T"],"description":"Tipo de curso"},"duracionSemanas":{"type":"number","description":"Duración en semanas"},"horasPorSesion":{"type":"number","description":"Horas por sesión"},"sesionesPorSemana":{"type":"number","description":"Sesiones por semana"},"capacidadMaxima":{"type":"number","description":"Capacidad máxima de estudiantes"},"capacidadMinima":{"type":"number","description":"Capacidad mínima de estudiantes"},"notaMinimaAprobacion":{"type":"number","description":"Nota mínima para aprobar (0-100)"},"asistenciaMinimaRequerida":{"type":"number","description":"Asistencia mínima requerida (0-100)"},"facilitador1Id":{"type":"number","description":"ID del facilitador principal"},"facilitador2Id":{"type":"number","description":"ID del facilitador secundario"},"permiteInscripcionAutomatica":{"type":"boolean","description":"Permite inscripción automática"},"requiereEntrevista":{"type":"boolean","description":"Requiere entrevista previa"},"tieneCosto":{"type":"boolean","description":"Tiene costo asociado"},"costo":{"type":"number","description":"Costo del curso"},"observaciones":{"type":"string","description":"Observaciones adicionales"}}},"CreateDiscipleshipEnrollmentDto":{"type":"object","properties":{"courseId":{"type":"number","description":"ID del curso"},"periodId":{"type":"number","description":"ID del período"},"studentType":{"type":"string","enum":["MIEMBRO","NUEVO_CREYENTE","VISITANTE","EX_MIEMBRO"],"description":"Tipo de estudiante"},"memberId":{"type":"number","description":"ID del miembro (si es miembro)"},"newBelieverId":{"type":"number","description":"ID del nuevo creyente (si es nuevo creyente)"},"studentName":{"type":"string","description":"Nombre del estudiante externo"},"studentEmail":{"type":"string","description":"Email del estudiante externo"},"studentPhone":{"type":"string","description":"Teléfono del estudiante externo"},"studentIdentification":{"type":"string","description":"Identificación del estudiante externo"},"studentBirthDate":{"format":"date-time","type":"string","description":"Fecha de nacimiento del estudiante externo"},"studentSex":{"type":"string","description":"Género del estudiante externo"},"studentAddress":{"type":"string","description":"Dirección del estudiante externo"},"enrollmentDate":{"format":"date-time","type":"string","description":"Fecha de inscripción"},"enrollmentObservations":{"type":"string","description":"Observaciones de la inscripción"}},"required":["courseId","periodId","studentType"]},"UpdateDiscipleshipEnrollmentDto":{"type":"object","properties":{"status":{"type":"string","enum":["INSCRITO","CONFIRMADO","EN_PROGRESO","APROBADO","REPROBADO","RETIRADO","CANCELADO","TRANSFERIDO"],"description":"Estado de la inscripción"},"enrollmentObservations":{"type":"string","description":"Observaciones de la inscripción"},"finalGrade":{"type":"number","description":"Nota final (0-100)"},"completionDate":{"format":"date-time","type":"string","description":"Fecha de finalización"},"withdrawalReason":{"type":"string","description":"Motivo de retiro"},"withdrawalDate":{"format":"date-time","type":"string","description":"Fecha de retiro"},"certificateIssued":{"type":"boolean","description":"Certificado emitido"},"certificateIssuedDate":{"format":"date-time","type":"string","description":"Fecha de emisión del certificado"}}},"StudentInfoDto":{"type":"object","properties":{"sourceId":{"type":"number","description":"ID único del estudiante en la fuente original"},"sourceType":{"type":"string","description":"Tipo de fuente del estudiante","enum":["MEMBER","NEW_BELIEVER","MANUAL"],"example":"MEMBER"},"studentType":{"type":"string","description":"Tipo de estudiante según categorización del sistema","enum":["MIEMBRO","NUEVO_CREYENTE","VISITANTE","EX_MIEMBRO"]},"fullName":{"type":"string","description":"Nombre completo del estudiante"},"firstName":{"type":"string","description":"Primer nombre"},"lastName":{"type":"string","description":"Apellido"},"cellPhone":{"type":"string","description":"Teléfono celular"},"homePhone":{"type":"string","description":"Teléfono fijo"},"email":{"type":"string","description":"Correo electrónico"},"identification":{"type":"string","description":"Documento de identidad (cédula)"},"birthDate":{"format":"date-time","type":"string","description":"Fecha de nacimiento"},"sex":{"type":"string","description":"Sexo","enum":["M","F"]},"address":{"type":"string","description":"Dirección"},"civilStatus":{"type":"string","description":"Estado civil"},"photoUrl":{"type":"string","description":"URL de la foto"},"isActive":{"type":"boolean","description":"Indica si el estudiante está activo"},"additionalInfo":{"type":"object","description":"Información adicional específica del tipo de estudiante"}},"required":["sourceId","sourceType","studentType","fullName"]},"EnrollmentWithStudentDto":{"type":"object","properties":{"enrollmentId":{"type":"number","description":"ID de la inscripción"},"enrollmentNumber":{"type":"string","description":"Número de matrícula"},"student":{"description":"Información del estudiante","allOf":[{"$ref":"#/components/schemas/StudentInfoDto"}]},"courseId":{"type":"number","description":"ID del curso"},"courseName":{"type":"string","description":"Nombre del curso"},"periodId":{"type":"number","description":"ID del período"},"periodName":{"type":"string","description":"Nombre del período"},"status":{"type":"string","description":"Estado de la inscripción"},"enrollmentDate":{"format":"date-time","type":"string","description":"Fecha de inscripción"},"attendancePercentage":{"type":"number","description":"Porcentaje de asistencia"},"finalAverage":{"type":"number","description":"Promedio final"},"passedCourse":{"type":"boolean","description":"Indica si aprobó el curso"}},"required":["enrollmentId","enrollmentNumber","student","courseId","periodId","status","enrollmentDate"]},"StudentSummaryDto":{"type":"object","properties":{"sourceId":{"type":"number","description":"ID único del estudiante en la fuente original"},"sourceType":{"type":"string","description":"Tipo de fuente del estudiante","enum":["MEMBER","NEW_BELIEVER","MANUAL"]},"fullName":{"type":"string","description":"Nombre completo del estudiante"},"phone":{"type":"string","description":"Teléfono de contacto"},"email":{"type":"string","description":"Correo electrónico"},"studentType":{"type":"string","description":"Tipo de estudiante","enum":["MIEMBRO","NUEVO_CREYENTE","VISITANTE","EX_MIEMBRO"]}},"required":["sourceId","sourceType","fullName","studentType"]},"AutoGradeRequestDto":{"type":"object","properties":{"asistenciaWeight":{"type":"number","description":"Peso de asistencia en el promedio final (%)","default":20,"minimum":0,"maximum":100},"practicaWeight":{"type":"number","description":"Peso de práctica en el promedio final (%)","default":25,"minimum":0,"maximum":100},"parcialWeight":{"type":"number","description":"Peso de examen parcial en el promedio final (%)","default":25,"minimum":0,"maximum":100},"finalWeight":{"type":"number","description":"Peso de examen final en el promedio final (%)","default":30,"minimum":0,"maximum":100},"minimumPassingGrade":{"type":"number","description":"Nota mínima para aprobar el curso","default":70,"minimum":0,"maximum":100},"minimumAttendance":{"type":"number","description":"Porcentaje mínimo de asistencia requerido","default":75,"minimum":0,"maximum":100},"courseId":{"type":"string","description":"ID del curso"},"period":{"type":"string","description":"Período académico"},"dryRun":{"type":"boolean","description":"Modo de simulación - no guarda cambios","default":false}},"required":["courseId","period"]},"StudentGradeDetailDto":{"type":"object","properties":{"studentCode":{"type":"string","description":"Código del estudiante"},"previousGrade":{"type":"number","description":"Calificación anterior"},"newGrade":{"type":"number","description":"Nueva calificación calculada"},"passed":{"type":"boolean","description":"Indica si el estudiante pasó el curso"},"notes":{"type":"string","description":"Notas adicionales sobre la calificación"}},"required":["studentCode","previousGrade","newGrade","passed"]},"AutoGradeResultDto":{"type":"object","properties":{"success":{"type":"boolean","description":"Indica si el proceso fue exitoso"},"studentsProcessed":{"type":"number","description":"Número total de estudiantes procesados"},"studentsUpdated":{"type":"number","description":"Número de estudiantes con calificaciones actualizadas"},"errors":{"description":"Lista de errores ocurridos","type":"array","items":{"type":"string"}},"warnings":{"description":"Lista de advertencias","type":"array","items":{"type":"string"}},"details":{"description":"Detalles por estudiante","type":"array","items":{"$ref":"#/components/schemas/StudentGradeDetailDto"}}},"required":["success","studentsProcessed","studentsUpdated","errors","warnings","details"]},"GradeStatsDto":{"type":"object","properties":{"totalStudents":{"type":"number","description":"Total de estudiantes en el curso"},"studentsWithCompleteGrades":{"type":"number","description":"Estudiantes con todas las calificaciones"},"averageGrade":{"type":"number","description":"Promedio general del curso"},"passedStudents":{"type":"number","description":"Estudiantes que pasaron el curso"},"failedStudents":{"type":"number","description":"Estudiantes que reprobaron el curso"},"pendingGrades":{"description":"Estudiantes con calificaciones pendientes","type":"array","items":{"type":"string"}}},"required":["totalStudents","studentsWithCompleteGrades","averageGrade","passedStudents","failedStudents","pendingGrades"]},"ProcessTmpNotesResultDto":{"type":"object","properties":{"processed":{"type":"number","description":"Notas temporales procesadas"},"applied":{"type":"number","description":"Notas temporales aplicadas automáticamente"},"rejected":{"type":"number","description":"Notas temporales rechazadas"},"errors":{"description":"Errores durante el procesamiento","type":"array","items":{"type":"string"}}},"required":["processed","applied","rejected","errors"]},"GradeValidationDto":{"type":"object","properties":{"studentCode":{"type":"string","description":"Código del estudiante"},"courseId":{"type":"string","description":"ID del curso"},"period":{"type":"string","description":"Período académico"},"asistencia":{"type":"number","description":"Calificación de asistencia"},"practica":{"type":"number","description":"Calificación de práctica"},"examenParcial":{"type":"number","description":"Calificación de examen parcial"},"examenFinal":{"type":"number","description":"Calificación de examen final"}},"required":["studentCode","courseId","period","asistencia","practica","examenParcial","examenFinal"]},"GradingCriteriaDto":{"type":"object","properties":{"asistenciaWeight":{"type":"number","description":"Peso de asistencia en el promedio final (%)","default":20,"minimum":0,"maximum":100},"practicaWeight":{"type":"number","description":"Peso de práctica en el promedio final (%)","default":25,"minimum":0,"maximum":100},"parcialWeight":{"type":"number","description":"Peso de examen parcial en el promedio final (%)","default":25,"minimum":0,"maximum":100},"finalWeight":{"type":"number","description":"Peso de examen final en el promedio final (%)","default":30,"minimum":0,"maximum":100},"minimumPassingGrade":{"type":"number","description":"Nota mínima para aprobar el curso","default":70,"minimum":0,"maximum":100},"minimumAttendance":{"type":"number","description":"Porcentaje mínimo de asistencia requerido","default":75,"minimum":0,"maximum":100}}},"GradeValidationResultDto":{"type":"object","properties":{"isValid":{"type":"boolean","description":"Indica si las calificaciones son válidas"},"calculatedAverage":{"type":"number","description":"Promedio calculado con las calificaciones proporcionadas"},"wouldPass":{"type":"boolean","description":"Indica si el estudiante pasaría con estas calificaciones"},"missingGrades":{"description":"Calificaciones faltantes para completar","type":"array","items":{"type":"string"}},"warnings":{"description":"Advertencias sobre las calificaciones","type":"array","items":{"type":"string"}},"criteriaUsed":{"description":"Criterios de calificación utilizados","allOf":[{"$ref":"#/components/schemas/GradingCriteriaDto"}]}},"required":["isValid","calculatedAverage","wouldPass","missingGrades","warnings","criteriaUsed"]},"DateRangeDto":{"type":"object","properties":{"start":{"format":"date-time","type":"string","description":"Fecha de inicio","example":"2025-01-01"},"end":{"format":"date-time","type":"string","description":"Fecha de fin","example":"2025-12-31"}},"required":["start","end"]},"CreateReportDto":{"type":"object","properties":{"moduleNames":{"description":"Módulos a incluir en el reporte","example":["members","payments","discipleship"],"type":"array","items":{"type":"string"}},"reportType":{"type":"string","description":"Tipo de reporte","enum":["dashboard","detailed","analytics","summary","comparison"],"example":"dashboard"},"exportFormat":{"type":"string","description":"Formato de exportación","enum":["json","excel","pdf","csv"],"default":"json"},"filters":{"description":"Filtros dinámicos a aplicar","type":"array","items":{"type":"object"}},"groupBy":{"description":"Campos de agrupación","example":["location","ministry"],"type":"array","items":{"type":"string"}},"dateRange":{"description":"Rango de fechas para el reporte","allOf":[{"$ref":"#/components/schemas/DateRangeDto"}]},"includeDetails":{"type":"boolean","description":"Incluir datos detallados en el reporte","default":false},"includeComparison":{"type":"boolean","description":"Incluir comparación con período anterior","default":false}},"required":["moduleNames","reportType","exportFormat","includeDetails","includeComparison"]},"ReportResponseDto":{"type":"object","properties":{"metadata":{"type":"object","description":"Metadatos del reporte"},"data":{"type":"object","description":"Datos del reporte"},"kpis":{"description":"KPIs calculados","type":"array","items":{"type":"string"}},"trends":{"description":"Datos de tendencias","type":"array","items":{"type":"string"}},"summary":{"type":"object","description":"Resumen ejecutivo"}},"required":["metadata","data"]},"KPIResponse":{"type":"object","properties":{"key":{"type":"string","description":"Clave del KPI"},"label":{"type":"string","description":"Etiqueta visible"},"value":{"type":"object","description":"Valor actual"},"trend":{"type":"string","description":"Tendencia","enum":["up","down","stable"]},"percentage":{"type":"number","description":"Porcentaje de cambio"},"target":{"type":"number","description":"Objetivo/meta"},"format":{"type":"string","description":"Formato de display","enum":["number","currency","percentage"]}},"required":["key","label","value","trend","percentage","target","format"]},"SimpleHealthDto":{"type":"object","properties":{"status":{"type":"string","example":"OK","description":"Simple health status"},"timestamp":{"type":"string","example":"2024-11-17T10:30:00Z","description":"Timestamp"},"uptime":{"type":"string","example":"2h 45m 30s","description":"Uptime"}},"required":["status","timestamp"]},"HealthOptionsDto":{"type":"object","properties":{"appName":{"type":"string","example":"SGM API v2.0","description":"Application name"},"version":{"type":"string","example":"2.0.0","description":"Application version"},"environment":{"type":"string","example":"production","description":"Environment"},"nodeVersion":{"type":"string","example":"v20.11.0","description":"Node.js version"},"uptime":{"type":"string","example":"2h 45m 30s","description":"System uptime"},"startTime":{"type":"string","example":"2024-11-17T10:30:00Z","description":"Server start time"},"currentTime":{"type":"string","example":"2024-11-17T10:30:00Z","description":"Current server time"},"memoryUsage":{"type":"object","example":{"heapUsed":"45MB","heapTotal":"67MB","rss":"78MB"},"description":"Memory usage information"},"availableModules":{"type":"object","example":{"database":true,"auth":true,"payments":false,"emails":true},"description":"Available modules status"},"implementedEndpoints":{"example":["auth","members","currencies","emails","health"],"description":"Implemented endpoints","type":"array","items":{"type":"string"}},"database":{"type":"object","example":{"type":"postgres","version":"14.2","connected":true},"description":"Database connection info"},"server":{"type":"object","example":{"port":3000,"docs":"/docs","healthEndpoint":"/health"},"description":"Server configuration"}},"required":["appName","version","environment","nodeVersion","uptime","startTime","currentTime","memoryUsage","availableModules","implementedEndpoints","database","server"]},"ModuleHealthDto":{"type":"object","properties":{"module":{"type":"string","example":"database","description":"Module name"},"status":{"type":"string","enum":["healthy","unhealthy","degraded"],"example":"healthy"},"message":{"type":"string","example":"Connection successful","description":"Status message"},"responseTime":{"type":"number","example":45,"description":"Response time in milliseconds"},"details":{"type":"object","example":{"connections":5,"uptime":"2h 30m"},"description":"Additional module details"},"timestamp":{"type":"string","example":"2024-11-17T10:30:00Z","description":"Timestamp of the check"}},"required":["module","status","message","timestamp"]},"SystemHealthDto":{"type":"object","properties":{"status":{"type":"string","enum":["healthy","unhealthy","degraded"],"example":"healthy"},"version":{"type":"string","example":"1.0.0","description":"API version"},"uptime":{"type":"string","example":"2h 45m 30s","description":"System uptime"},"timestamp":{"type":"string","example":"2024-11-17T10:30:00Z","description":"Timestamp of the check"},"modules":{"description":"Health status of individual modules","type":"array","items":{"$ref":"#/components/schemas/ModuleHealthDto"}},"systemMetrics":{"type":"object","example":{"memoryUsage":"256MB","cpuUsage":"15%"},"description":"System metrics"}},"required":["status","version","uptime","timestamp","modules"]},"CreateCountryDto":{"type":"object","properties":{"code":{"type":"string","description":"Código ISO 3166-1 alpha-3 del país","example":"DOM","maxLength":3},"name":{"type":"string","description":"Nombre oficial del país","example":"República Dominicana","maxLength":100},"nationality":{"type":"string","description":"Gentilicio/nacionalidad","example":"Dominicana","maxLength":50},"phoneCode":{"type":"string","description":"Código telefónico del país","example":"+1","maxLength":10},"currencyCode":{"type":"string","description":"Código de moneda ISO 4217","example":"DOP","maxLength":3},"isoCode2":{"type":"string","description":"Código ISO 3166-1 alpha-2","example":"DO","maxLength":2},"isActive":{"type":"boolean","description":"Estado activo del país","example":true,"default":true},"displayOrder":{"type":"number","description":"Orden de visualización","example":1,"default":0}},"required":["code","name"]},"CountryEntity":{"type":"object","properties":{}},"UpdateCountryDto":{"type":"object","properties":{}},"CreateStateDto":{"type":"object","properties":{"countryCode":{"type":"string","description":"Código del país al que pertenece el estado","example":"0001"},"code":{"type":"string","description":"Código del estado/provincia/departamento","example":"13","maxLength":10},"name":{"type":"string","description":"Nombre del estado/provincia/departamento","example":"La Romana","maxLength":100},"fullName":{"type":"string","description":"Nombre completo oficial","example":"Provincia La Romana","maxLength":150},"abbreviation":{"type":"string","description":"Abreviación oficial","example":"LR","maxLength":10},"isActive":{"type":"boolean","description":"Estado activo","example":true,"default":true},"displayOrder":{"type":"number","description":"Orden de visualización","example":1,"default":0}},"required":["countryCode","code","name"]},"StateEntity":{"type":"object","properties":{}},"UpdateStateDto":{"type":"object","properties":{}},"CreateCityDto":{"type":"object","properties":{"stateId":{"type":"number","description":"ID del estado al que pertenece la ciudad","example":1},"code":{"type":"number","description":"Código de la ciudad","example":1},"name":{"type":"string","description":"Nombre de la ciudad","example":"Santo Domingo","maxLength":100},"fullName":{"type":"string","description":"Nombre completo oficial de la ciudad","example":"Santo Domingo de Guzmán","maxLength":150},"postalCode":{"type":"string","description":"Código postal","example":"10100","maxLength":20},"timezone":{"type":"string","description":"Zona horaria","example":"America/Santo_Domingo","maxLength":50},"latitude":{"type":"number","description":"Latitud geográfica","example":18.4861},"longitude":{"type":"number","description":"Longitud geográfica","example":-69.9312},"isCapital":{"type":"boolean","description":"Es capital del estado/provincia","example":true,"default":false},"isActive":{"type":"boolean","description":"Estado activo","example":true,"default":true},"displayOrder":{"type":"number","description":"Orden de visualización","example":1,"default":0}},"required":["stateId","code","name"]},"CityEntity":{"type":"object","properties":{}},"UpdateCityDto":{"type":"object","properties":{}},"CreateSectorDto":{"type":"object","properties":{"cityCode":{"type":"number","description":"Código de la ciudad a la que pertenece el sector","example":1},"code":{"type":"number","description":"Código numérico del sector","example":1025},"name":{"type":"string","description":"Nombre del sector","example":"Centro de la Ciudad","maxLength":150},"zone":{"type":"string","description":"Zona específica dentro del sector","example":"Zona Colonial","maxLength":50},"postalCode":{"type":"string","description":"Código postal específico del sector","example":"10101","maxLength":20},"isActive":{"type":"boolean","description":"Estado activo","example":true,"default":true},"displayOrder":{"type":"number","description":"Orden de visualización","example":1,"default":0}},"required":["cityCode","name"]},"SectorEntity":{"type":"object","properties":{}},"UpdateSectorDto":{"type":"object","properties":{}}}}}