{"openapi":"3.0.0","paths":{"/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":""}},"tags":["Health"]}},"/metrics":{"get":{"operationId":"MetricsController_scrape","parameters":[],"responses":{"200":{"description":""}},"tags":["Metrics"]}},"/ripci/authorizations":{"get":{"operationId":"RipciAuthorizationsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["RipciAuthorizations"]},"post":{"operationId":"RipciAuthorizationsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRipciAuthorizationDto"}}}},"responses":{"201":{"description":""}},"tags":["RipciAuthorizations"]}},"/ripci/authorizations/expiring":{"get":{"operationId":"RipciAuthorizationsController_expiring","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["RipciAuthorizations"]}},"/ripci/authorizations/active/{region}":{"get":{"operationId":"RipciAuthorizationsController_active","parameters":[{"name":"region","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["RipciAuthorizations"]}},"/ripci/authorizations/{id}":{"get":{"operationId":"RipciAuthorizationsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["RipciAuthorizations"]},"patch":{"operationId":"RipciAuthorizationsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRipciAuthorizationDto"}}}},"responses":{"200":{"description":""}},"tags":["RipciAuthorizations"]},"delete":{"operationId":"RipciAuthorizationsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["RipciAuthorizations"]}},"/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":""}},"tags":["Auth"]}},"/auth/refresh":{"post":{"operationId":"AuthController_refresh","parameters":[],"responses":{"200":{"description":""}},"tags":["Auth"]}},"/auth/me":{"get":{"operationId":"AuthController_me","parameters":[],"responses":{"200":{"description":""}},"tags":["Auth"]}},"/auth/nfc-login":{"post":{"operationId":"AuthController_nfcLogin","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NfcLoginDto"}}}},"responses":{"200":{"description":""}},"tags":["Auth"]}},"/auth/pin-login":{"post":{"operationId":"AuthController_pinLogin","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinLoginDto"}}}},"responses":{"200":{"description":""}},"tags":["Auth"]}},"/tenant/me":{"get":{"operationId":"TenantController_me","parameters":[],"responses":{"200":{"description":""}},"tags":["Tenant"]},"patch":{"operationId":"TenantController_update","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantBrandingDto"}}}},"responses":{"200":{"description":""}},"tags":["Tenant"]}},"/tenant/convert-demo":{"post":{"operationId":"TenantController_convertDemo","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertDemoDto"}}}},"responses":{"200":{"description":""}},"tags":["Tenant"]}},"/tenant/plan-usage":{"get":{"operationId":"TenantController_planUsage","parameters":[],"responses":{"200":{"description":""}},"tags":["Tenant"]}},"/tenant/whatsapp/test":{"post":{"operationId":"TenantController_whatsappTest","parameters":[],"responses":{"200":{"description":""}},"tags":["Tenant"]}},"/tenant/branding-preview.pdf":{"get":{"operationId":"TenantPreviewController_preview","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"PDF de prueba con el branding actual del tenant","tags":["tenant"]}},"/notifications/send":{"post":{"operationId":"NotificationsController_send","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendNotificationDto"}}}},"responses":{"200":{"description":""}},"tags":["Notifications"]}},"/notifications/templates":{"get":{"operationId":"NotificationsController_listTemplates","parameters":[],"responses":{"200":{"description":""}},"tags":["Notifications"]},"post":{"operationId":"NotificationsController_createTemplate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateDto"}}}},"responses":{"201":{"description":""}},"tags":["Notifications"]}},"/notifications/templates/{id}":{"patch":{"operationId":"NotificationsController_updateTemplate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateDto"}}}},"responses":{"200":{"description":""}},"tags":["Notifications"]}},"/notifications/logs":{"get":{"operationId":"NotificationsController_listLogs","parameters":[],"responses":{"200":{"description":""}},"tags":["Notifications"]}},"/notifications/my-inbox":{"get":{"operationId":"NotificationsController_myInbox","parameters":[],"responses":{"200":{"description":""}},"tags":["Notifications"]}},"/notifications/logs/{id}/read":{"post":{"operationId":"NotificationsController_markAsRead","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Notifications"]}},"/push/subscribe":{"post":{"operationId":"PushSubscriptionsController_subscribe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribePushDto"}}}},"responses":{"200":{"description":""}},"tags":["PushSubscriptions"]},"delete":{"operationId":"PushSubscriptionsController_unsubscribe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribePushDto"}}}},"responses":{"200":{"description":""}},"tags":["PushSubscriptions"]}},"/onboarding/signup":{"post":{"operationId":"OnboardingController_signup","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupTenantDto"}}}},"responses":{"201":{"description":""}},"tags":["Onboarding"]}},"/users":{"get":{"operationId":"UsersController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Users"]},"post":{"operationId":"UsersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserDto"}}}},"responses":{"201":{"description":""}},"tags":["Users"]}},"/users/me":{"get":{"operationId":"UsersController_getMe","parameters":[],"responses":{"200":{"description":""}},"tags":["Users"]}},"/users/{id}":{"get":{"operationId":"UsersController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"]},"patch":{"operationId":"UsersController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserDto"}}}},"responses":{"200":{"description":""}},"tags":["Users"]},"delete":{"operationId":"UsersController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"]}},"/users/{id}/nfc-uid":{"post":{"operationId":"UsersController_assignNfcUid","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"]}},"/users/me/nfc-uid":{"post":{"operationId":"UsersController_assignNfcUidSelf","parameters":[],"responses":{"200":{"description":""}},"tags":["Users"]}},"/users/{id}/set-pin":{"post":{"operationId":"UsersController_setPin","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"]}},"/users/{id}/workshop-zone":{"patch":{"operationId":"UsersController_setWorkshopZone","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"]}},"/customers/next-code":{"get":{"operationId":"CustomersController_nextCode","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Sugerir siguiente customerCode libre","tags":["customers"]}},"/customers/contacts/{contactId}":{"patch":{"operationId":"CustomersController_updateContact","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomerContactDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualizar contacto","tags":["customers"]},"delete":{"operationId":"CustomersController_removeContact","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Borrar (soft-delete) contacto","tags":["customers"]}},"/customers":{"get":{"operationId":"CustomersController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar clientes del tenant (paginado)","tags":["customers"]},"post":{"operationId":"CustomersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomerDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear cliente","tags":["customers"]}},"/customers/{id}":{"get":{"operationId":"CustomersController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de un cliente con instalaciones","tags":["customers"]},"patch":{"operationId":"CustomersController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomerDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualizar cliente (campos parciales)","tags":["customers"]},"delete":{"operationId":"CustomersController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"BORRADO DEFINITIVO (SUPER_ADMIN). Requiere confirmCode = customerCode del cliente.","tags":["customers"]}},"/customers/{id}/service-plan":{"get":{"operationId":"CustomersController_servicePlan","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Plan de servicios PCI del cliente en un rango (planificadas + forecast)","tags":["customers"]}},"/customers/{id}/contacts":{"get":{"operationId":"CustomersController_listContacts","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar contactos del cliente","tags":["customers"]},"post":{"operationId":"CustomersController_createContact","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomerContactDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Añadir un contacto al cliente","tags":["customers"]}},"/customers/{id}/documents":{"get":{"operationId":"CustomersController_listDocuments","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Documentos del cliente (presupuestos, albaranes, certificados, facturas)","tags":["customers"]}},"/customers/{id}/documents/send":{"post":{"operationId":"CustomersController_sendDocument","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Enviar documento por email al cliente","tags":["customers"]}},"/customers/{id}/mark-lost":{"patch":{"operationId":"CustomersController_markLost","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Marcar cliente como perdido a competencia (NO borra, recuperable)","tags":["customers"]}},"/customers/{id}/recover":{"patch":{"operationId":"CustomersController_recover","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Recuperar cliente perdido — vuelve a activos","tags":["customers"]}},"/installations/next-suffix/{customerId}":{"get":{"operationId":"InstallationsController_nextSuffix","parameters":[{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Installations"]}},"/installations":{"get":{"operationId":"InstallationsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Installations"]},"post":{"operationId":"InstallationsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInstallationDto"}}}},"responses":{"201":{"description":""}},"tags":["Installations"]}},"/installations/{id}":{"get":{"operationId":"InstallationsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Installations"]},"patch":{"operationId":"InstallationsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInstallationDto"}}}},"responses":{"200":{"description":""}},"tags":["Installations"]},"delete":{"operationId":"InstallationsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Installations"]}},"/installations/{id}/geocode":{"post":{"operationId":"InstallationsController_geocode","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Installations"]}},"/equipment":{"get":{"operationId":"EquipmentController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar equipos del tenant (paginado, filtros)","tags":["equipment"]},"post":{"operationId":"EquipmentController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEquipmentDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear equipo (alta con OCR/NFC) — sujeto a plan limit","tags":["equipment"]}},"/equipment/by-nfc/{uid}":{"get":{"operationId":"EquipmentController_getByNfc","parameters":[{"name":"uid","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lookup equipo por NFC UID (usado por la app Android al tap)","tags":["equipment"]}},"/equipment/by-qr/{code}":{"get":{"operationId":"EquipmentController_getByQr","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lookup equipo por QR code (legacy)","tags":["equipment"]}},"/equipment/by-slug/{slug}":{"get":{"operationId":"EquipmentController_getBySlug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lookup equipo por slug (publicSlug → nfcUid → id) usado por la PWA al volver desde la landing pública","tags":["equipment"]}},"/equipment/counts-by-installation":{"get":{"operationId":"EquipmentController_countsByInstallation","parameters":[{"name":"ids","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Contar equipos por instalación (bulk)","tags":["equipment"]}},"/equipment/{id}":{"get":{"operationId":"EquipmentController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de un equipo","tags":["equipment"]},"patch":{"operationId":"EquipmentController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEquipmentDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualizar equipo (campos parciales)","tags":["equipment"]},"delete":{"operationId":"EquipmentController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Soft-delete del equipo (ADMIN)","tags":["equipment"]}},"/equipment/{id}/replace":{"post":{"operationId":"EquipmentController_replace","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplaceEquipmentDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Sustituir definitivamente un equipo (RETIRED) por uno nuevo en la misma instalación","tags":["equipment"]}},"/equipment/{id}/provision-nfc":{"post":{"operationId":"EquipmentController_provisionNfc","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisionNfcDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Provisionar tag NFC: asegura publicSlug del equipo","tags":["equipment"]}},"/equipment/{id}/location":{"patch":{"operationId":"EquipmentController_updateLocation","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLocationDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza lat/lng del equipo (geolocalización pasiva PWA técnico)","tags":["equipment"]}},"/equipment/quick-create":{"post":{"operationId":"EquipmentController_quickCreate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickCreateEquipmentDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Alta rápida de equipo durante visita (genera publicSlug auto, bloquea duplicado de identificación por cliente)","tags":["equipment"]}},"/equipment/{id}/sticker.pdf":{"get":{"operationId":"EquipmentController_stickerPdf","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"PDF pegatina UNE-23120 (80x40mm) con QR + NFC + código humano","tags":["equipment"]}},"/route-bag/today/required":{"get":{"operationId":"RouteBagController_getTodayRequired","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Calcula el mínimo/recomendado del kit del día del técnico","tags":["route-bag"]}},"/route-bag/today":{"get":{"operationId":"RouteBagController_getToday","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve la RouteBag confirmada de hoy del técnico (o null)","tags":["route-bag"]}},"/route-bag/today/confirm":{"post":{"operationId":"RouteBagController_confirmToday","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmRouteBagDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Confirma el contenido del kit que el técnico lleva hoy","tags":["route-bag"]}},"/route-bag/today/close":{"post":{"operationId":"RouteBagController_closeToday","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloseRouteBagDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cierra la jornada del técnico con reconciliación de material","tags":["route-bag"]}},"/operations":{"get":{"operationId":"OperationsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Operations"]},"post":{"operationId":"OperationsController_close","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExecutionDto"}}}},"responses":{"201":{"description":""}},"tags":["Operations"]}},"/operations/{id}/sticker-printed":{"post":{"operationId":"OperationsController_markPrinted","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Operations"]}},"/stock-movements":{"get":{"operationId":"StockMovementsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["StockMovements"]},"post":{"operationId":"StockMovementsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStockMovementDto"}}}},"responses":{"201":{"description":""}},"tags":["StockMovements"]}},"/stock-movements/{id}":{"get":{"operationId":"StockMovementsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["StockMovements"]}},"/equipment-traces/by-nfc/{uid}":{"get":{"operationId":"EquipmentTracesController_getByNfc","parameters":[{"name":"uid","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["EquipmentTraces"]}},"/equipment-traces/my-equipment/{equipmentId}":{"get":{"operationId":"EquipmentTracesController_listMyEquipment","parameters":[{"name":"equipmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["EquipmentTraces"]}},"/equipment-traces/publish":{"post":{"operationId":"EquipmentTracesController_publish","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishTraceDto"}}}},"responses":{"201":{"description":""}},"tags":["EquipmentTraces"]}},"/tenant-transfers":{"get":{"operationId":"TenantTransfersController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["TenantTransfers"]},"post":{"operationId":"TenantTransfersController_propose","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposeTransferDto"}}}},"responses":{"201":{"description":""}},"tags":["TenantTransfers"]}},"/tenant-transfers/{id}":{"get":{"operationId":"TenantTransfersController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["TenantTransfers"]}},"/tenant-transfers/{id}/customer-ack":{"post":{"operationId":"TenantTransfersController_customerAck","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerAckDto"}}}},"responses":{"201":{"description":""}},"tags":["TenantTransfers"]}},"/tenant-transfers/{id}/to-ack":{"post":{"operationId":"TenantTransfersController_toAck","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["TenantTransfers"]}},"/tenant-transfers/{id}/reject":{"post":{"operationId":"TenantTransfersController_reject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectTransferDto"}}}},"responses":{"201":{"description":""}},"tags":["TenantTransfers"]}},"/market-leads":{"post":{"operationId":"MarketLeadsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMarketLeadDto"}}}},"responses":{"201":{"description":""}},"tags":["MarketLeads"]}},"/market-leads/sent":{"get":{"operationId":"MarketLeadsController_listSent","parameters":[],"responses":{"200":{"description":""}},"tags":["MarketLeads"]}},"/market-leads/received":{"get":{"operationId":"MarketLeadsController_listReceived","parameters":[],"responses":{"200":{"description":""}},"tags":["MarketLeads"]}},"/market-leads/{id}/open":{"post":{"operationId":"MarketLeadsController_open","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MarketLeads"]}},"/market-leads/{id}/accept":{"post":{"operationId":"MarketLeadsController_accept","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MarketLeads"]}},"/market-leads/{id}/reject":{"post":{"operationId":"MarketLeadsController_reject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectMarketLeadDto"}}}},"responses":{"200":{"description":""}},"tags":["MarketLeads"]}},"/workorders/{id}/certificate.pdf":{"get":{"operationId":"CertificatesController_certificate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Renderiza el certificado PDF de una OT (white-label tenant)","tags":["certificates"]}},"/workorders/{id}/glovebox.pdf":{"get":{"operationId":"CertificatesController_glovebox","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Certificado \"guantera\" A6 para vehículos (sólo si installation.type=VEHICULO)","tags":["certificates"]}},"/workorders":{"get":{"operationId":"WorkOrdersController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar OTs (paginado, filtros)","tags":["workorders"]},"post":{"operationId":"WorkOrdersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkOrderDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear OT","tags":["workorders"]}},"/workorders/{id}":{"get":{"operationId":"WorkOrdersController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de una OT","tags":["workorders"]}},"/workorders/{id}/summary":{"get":{"operationId":"WorkOrdersController_getSummary","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Resumen ejecutivo de la OT (equipos + stats). Usado por el modal del calendario.","tags":["workorders"]}},"/workorders/{id}/transition":{"patch":{"operationId":"WorkOrdersController_transition","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransitionWorkOrderDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Transicionar estado de la OT (técnico EN_ROUTE → ON_SITE → COMPLETED)","tags":["workorders"]}},"/workorders/{id}/close-and-certify":{"post":{"operationId":"WorkOrdersController_closeAndCertify","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cerrar OT (COMPLETED) y emitir certificado RIPCI + auto-envío al cliente","tags":["workorders"]}},"/workorders/{id}/specialty":{"patch":{"operationId":"WorkOrdersController_setSpecialty","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualizar requiredSpecialty manualmente","tags":["workorders"]}},"/workorders/{id}/eligible-technicians":{"get":{"operationId":"WorkOrdersController_eligibleTechnicians","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Técnicos elegibles para esta OT","tags":["workorders"]}},"/workorders/bulk-reassign":{"post":{"operationId":"WorkOrdersController_bulkReassign","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reasignar OTs en bloque (apply propuesta IA)","tags":["workorders"]}},"/workorders/{id}/notify-arrival":{"post":{"operationId":"WorkOrdersController_notifyArrival","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Avisar al cliente que el técnico llega en N minutos (WhatsApp)","tags":["workorders"]}},"/anomalies":{"get":{"operationId":"AnomaliesController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar anomalías (filtros: status, severity, ...)","tags":["anomalies"]},"post":{"operationId":"AnomaliesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAnomalyDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Registrar anomalía (TECNICO o superior)","tags":["anomalies"]}},"/anomalies/{id}":{"get":{"operationId":"AnomaliesController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de una anomalía con equipment y workOrder","tags":["anomalies"]},"patch":{"operationId":"AnomaliesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAnomalyDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualizar estado / detalles de la anomalía","tags":["anomalies"]},"delete":{"operationId":"AnomaliesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Soft-delete (status=REJECTED) — solo ADMIN","tags":["anomalies"]}},"/vision/extinguisher-plate":{"post":{"operationId":"VisionController_analyze","parameters":[],"responses":{"200":{"description":""}},"tags":["Vision"]}},"/vision/corrections":{"post":{"operationId":"VisionController_recordCorrection","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordCorrectionDto"}}}},"responses":{"201":{"description":""}},"tags":["Vision"]}},"/printers":{"get":{"operationId":"PrintersController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Printers"]},"post":{"operationId":"PrintersController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterPrinterDto"}}}},"responses":{"201":{"description":""}},"tags":["Printers"]}},"/printers/{id}":{"delete":{"operationId":"PrintersController_deactivate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Printers"]}},"/printers/prints":{"post":{"operationId":"PrintersController_recordPrint","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordPrintDto"}}}},"responses":{"201":{"description":""}},"tags":["Printers"]}},"/catalog/manufacturers":{"get":{"operationId":"CatalogController_manufacturers","parameters":[],"responses":{"200":{"description":""}},"tags":["Catalog"]}},"/catalog/models":{"get":{"operationId":"CatalogController_models","parameters":[{"name":"manufacturerId","required":true,"in":"query","schema":{"type":"string"}},{"name":"type","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog"]}},"/catalog/models/{id}":{"get":{"operationId":"CatalogController_model","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog"]}},"/catalog/parts":{"get":{"operationId":"CatalogController_parts","parameters":[{"name":"category","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Catalog"]}},"/catalog/quote-products":{"get":{"operationId":"CatalogController_quoteProducts","parameters":[],"responses":{"200":{"description":""}},"tags":["Catalog"]}},"/quotes":{"get":{"operationId":"QuotesController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Quotes"]},"post":{"operationId":"QuotesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateQuoteDto"}}}},"responses":{"201":{"description":""}},"tags":["Quotes"]}},"/quotes/{id}":{"get":{"operationId":"QuotesController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Quotes"]}},"/quotes/{id}/transition":{"patch":{"operationId":"QuotesController_transition","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransitionQuoteDto"}}}},"responses":{"200":{"description":""}},"tags":["Quotes"]}},"/quotes/{id}/convert-to-workorder":{"post":{"operationId":"QuotesController_convert","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Quotes"]}},"/quotes/{id}/convert-to-delivery":{"post":{"operationId":"QuotesController_convertToDelivery","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Convertir presupuesto ACEPTADO en albarán DRAFT (taller lo prepara)","tags":["Quotes"]}},"/quotes/{id}/pdf":{"get":{"operationId":"QuotesController_getPdf","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Quotes"]}},"/delivery-notes":{"get":{"operationId":"DeliveryNotesController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar albaranes (filtros: customerId, installationId, status)","tags":["delivery-notes"]},"post":{"operationId":"DeliveryNotesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDeliveryNoteDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear albarán (estado DRAFT)","tags":["delivery-notes"]}},"/delivery-notes/{id}":{"get":{"operationId":"DeliveryNotesController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de un albarán con líneas","tags":["delivery-notes"]}},"/delivery-notes/{id}/deliver":{"patch":{"operationId":"DeliveryNotesController_deliver","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Marcar entregado (firmado si llega signedByName/signatureRef)","tags":["delivery-notes"]}},"/delivery-notes/pending-preparation":{"get":{"operationId":"DeliveryNotesController_pending","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Albaranes DRAFT con líneas sin preparar (pantalla taller)","tags":["delivery-notes"]}},"/delivery-notes/{id}/lines/{lineId}/prepare":{"patch":{"operationId":"DeliveryNotesController_prepareLine","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"lineId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Taller asigna marca + identificación a una línea (crea Equipment)","tags":["delivery-notes"]}},"/delivery-notes/{id}/create-workorder":{"post":{"operationId":"DeliveryNotesController_createWorkOrder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear OT de instalación desde albarán entregado/firmado","tags":["delivery-notes"]}},"/delivery-notes/{id}/pdf":{"get":{"operationId":"DeliveryNotesController_getPdf","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"PDF del albarán (brandeado con tenant)","tags":["delivery-notes"]}},"/commissions/me":{"get":{"operationId":"CommissionsController_myCommissions","parameters":[{"name":"period","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Mis comisiones (técnico): día/semana/mes/año","tags":["commissions"]}},"/commissions/users/{userId}":{"get":{"operationId":"CommissionsController_forUser","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}},{"name":"period","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Comisiones de un técnico (solo ADMIN)","tags":["commissions"]},"patch":{"operationId":"CommissionsController_setUserRate","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"ADMIN asigna % comisión a técnico","tags":["commissions"]}},"/commissions/contacts/{contactId}":{"get":{"operationId":"CommissionsController_forContact","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}},{"name":"period","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Comisiones de un contacto admin fincas (solo ADMIN)","tags":["commissions"]},"patch":{"operationId":"CommissionsController_setContactRate","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"ADMIN asigna % comisión a contacto admin fincas","tags":["commissions"]}},"/search":{"get":{"operationId":"SearchController_global","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Search"]}},"/search/caller":{"get":{"operationId":"SearchController_caller","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Search"]}},"/search/customer/{id}/context":{"get":{"operationId":"SearchController_customerContext","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Search"]}},"/public/demo-request":{"post":{"operationId":"PublicController_demo","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoRequestDto"}}}},"responses":{"200":{"description":""}},"tags":["Public"]}},"/public/nfc/e/{slug}":{"get":{"operationId":"PublicNfcController_resolveSlug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PublicNfc"]}},"/public/nfc/e/{slug}/history":{"get":{"operationId":"PublicNfcController_history","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PublicNfc"]}},"/public/nfc/e/{slug}/incident":{"post":{"operationId":"PublicNfcController_incidentReport","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["PublicNfc"]}},"/public/nfc/e/{slug}/request-service":{"post":{"operationId":"PublicNfcController_requestService","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestServiceDto"}}}},"responses":{"201":{"description":""}},"tags":["PublicNfc"]}},"/public/marketplace/lead":{"post":{"operationId":"PublicNfcController_marketLead","parameters":[],"responses":{"201":{"description":""}},"tags":["PublicNfc"]}},"/public/marketplace/orphan":{"post":{"operationId":"PublicNfcController_marketOrphan","parameters":[],"responses":{"201":{"description":""}},"tags":["PublicNfc"]}},"/public/migrate/preview":{"post":{"operationId":"PublicMigrateController_preview","parameters":[],"responses":{"200":{"description":""}},"tags":["PublicMigrate"]}},"/public/demo/start":{"post":{"operationId":"PublicDemoController_start","parameters":[],"responses":{"201":{"description":""}},"tags":["PublicDemo"]}},"/technician-certifications":{"get":{"operationId":"CertificationsController_list","parameters":[{"name":"userId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Certifications"]},"post":{"operationId":"CertificationsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCertificationDto"}}}},"responses":{"201":{"description":""}},"tags":["Certifications"]}},"/technician-certifications/expiring":{"get":{"operationId":"CertificationsController_expiring","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Certifications"]}},"/technician-certifications/{id}":{"get":{"operationId":"CertificationsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Certifications"]},"patch":{"operationId":"CertificationsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCertificationDto"}}}},"responses":{"200":{"description":""}},"tags":["Certifications"]},"delete":{"operationId":"CertificationsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Certifications"]}},"/suppliers":{"get":{"operationId":"SuppliersController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Suppliers"]},"post":{"operationId":"SuppliersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSupplierDto"}}}},"responses":{"201":{"description":""}},"tags":["Suppliers"]}},"/suppliers/{id}":{"get":{"operationId":"SuppliersController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Suppliers"]},"patch":{"operationId":"SuppliersController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSupplierDto"}}}},"responses":{"200":{"description":""}},"tags":["Suppliers"]},"delete":{"operationId":"SuppliersController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Suppliers"]}},"/warehouses":{"get":{"operationId":"WarehousesController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Warehouses"]},"post":{"operationId":"WarehousesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWarehouseDto"}}}},"responses":{"201":{"description":""}},"tags":["Warehouses"]}},"/warehouses/{id}":{"get":{"operationId":"WarehousesController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Warehouses"]},"patch":{"operationId":"WarehousesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWarehouseDto"}}}},"responses":{"200":{"description":""}},"tags":["Warehouses"]},"delete":{"operationId":"WarehousesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Warehouses"]}},"/warehouses/{id}/stock":{"get":{"operationId":"WarehousesController_listStock","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Warehouses"]}},"/warehouses/{id}/movements":{"get":{"operationId":"WarehousesController_listMovements","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Warehouses"]}},"/stock-items":{"get":{"operationId":"StockItemsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["StockItems"]},"post":{"operationId":"StockItemsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStockItemDto"}}}},"responses":{"201":{"description":""}},"tags":["StockItems"]}},"/stock-items/alerts/low":{"get":{"operationId":"StockItemsController_lowStock","parameters":[],"responses":{"200":{"description":""}},"tags":["StockItems"]}},"/stock-items/alerts/expiring":{"get":{"operationId":"StockItemsController_expiring","parameters":[],"responses":{"200":{"description":""}},"tags":["StockItems"]}},"/stock-items/{id}":{"get":{"operationId":"StockItemsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["StockItems"]},"patch":{"operationId":"StockItemsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStockItemDto"}}}},"responses":{"200":{"description":""}},"tags":["StockItems"]},"delete":{"operationId":"StockItemsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["StockItems"]}},"/purchase-orders":{"get":{"operationId":"PurchaseOrdersController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["PurchaseOrders"]},"post":{"operationId":"PurchaseOrdersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePurchaseOrderDto"}}}},"responses":{"201":{"description":""}},"tags":["PurchaseOrders"]}},"/purchase-orders/{id}":{"get":{"operationId":"PurchaseOrdersController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PurchaseOrders"]},"patch":{"operationId":"PurchaseOrdersController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePurchaseOrderDto"}}}},"responses":{"200":{"description":""}},"tags":["PurchaseOrders"]}},"/purchase-orders/{id}/transition":{"patch":{"operationId":"PurchaseOrdersController_transition","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransitionPurchaseOrderDto"}}}},"responses":{"200":{"description":""}},"tags":["PurchaseOrders"]}},"/purchase-orders/{id}/receive":{"post":{"operationId":"PurchaseOrdersController_receive","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceivePurchaseOrderDto"}}}},"responses":{"201":{"description":""}},"tags":["PurchaseOrders"]}},"/loaner-fleet/active":{"get":{"operationId":"LoanerFleetController_active","parameters":[],"responses":{"200":{"description":""}},"tags":["LoanerFleet"]}},"/loaner-fleet/handover":{"post":{"operationId":"LoanerFleetController_handover","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoanerHandoverDto"}}}},"responses":{"201":{"description":""}},"tags":["LoanerFleet"]}},"/loaner-fleet/return":{"post":{"operationId":"LoanerFleetController_return_","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoanerReturnDto"}}}},"responses":{"201":{"description":""}},"tags":["LoanerFleet"]}},"/payments":{"get":{"operationId":"PaymentsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Payments"]},"post":{"operationId":"PaymentsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePaymentDto"}}}},"responses":{"201":{"description":""}},"tags":["Payments"]}},"/payments/my-pending":{"get":{"operationId":"PaymentsController_myPending","parameters":[],"responses":{"200":{"description":""}},"tags":["Payments"]}},"/payments/reports/daily":{"get":{"operationId":"PaymentsController_dailyReport","parameters":[],"responses":{"200":{"description":""}},"tags":["Payments"]}},"/payments/{id}":{"get":{"operationId":"PaymentsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Payments"]}},"/payments/{id}/cancel":{"post":{"operationId":"PaymentsController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelPaymentDto"}}}},"responses":{"201":{"description":""}},"tags":["Payments"]}},"/cash-deposits":{"get":{"operationId":"CashDepositsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["CashDeposits"]}},"/cash-deposits/reports/by-technician":{"get":{"operationId":"CashDepositsController_reportByTechnician","parameters":[],"responses":{"200":{"description":""}},"tags":["CashDeposits"]}},"/cash-deposits/{id}":{"get":{"operationId":"CashDepositsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["CashDeposits"]}},"/cash-deposits/open":{"post":{"operationId":"CashDepositsController_open","parameters":[],"responses":{"201":{"description":""}},"tags":["CashDeposits"]}},"/cash-deposits/{id}/declare":{"post":{"operationId":"CashDepositsController_declare","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeclareCashDepositDto"}}}},"responses":{"201":{"description":""}},"tags":["CashDeposits"]}},"/cash-deposits/{id}/close":{"post":{"operationId":"CashDepositsController_close","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloseCashDepositDto"}}}},"responses":{"201":{"description":""}},"tags":["CashDeposits"]}},"/cash-deposits/{id}/reconcile":{"post":{"operationId":"CashDepositsController_reconcile","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReconcileCashDepositDto"}}}},"responses":{"201":{"description":""}},"tags":["CashDeposits"]}},"/signatures":{"post":{"operationId":"SignaturesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSignatureDto"}}}},"responses":{"201":{"description":""}},"tags":["Signatures"]},"get":{"operationId":"SignaturesController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Signatures"]}},"/signatures/{id}":{"get":{"operationId":"SignaturesController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Signatures"]}},"/signatures/{id}/image":{"get":{"operationId":"SignaturesController_image","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Signatures"]}},"/routes":{"get":{"operationId":"RoutesController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Routes"]}},"/routes/{id}":{"get":{"operationId":"RoutesController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Routes"]},"delete":{"operationId":"RoutesController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Routes"]}},"/routes/plan":{"post":{"operationId":"RoutesController_plan","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRouteDto"}}}},"responses":{"201":{"description":""}},"tags":["Routes"]}},"/routes/plan-multi":{"post":{"operationId":"RoutesController_planMulti","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanMultiDto"}}}},"responses":{"201":{"description":""}},"tags":["Routes"]}},"/routes/{id}/accept":{"post":{"operationId":"RoutesController_accept","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Routes"]}},"/imports/upload":{"post":{"operationId":"ImportsController_upload","parameters":[],"responses":{"201":{"description":""}},"tags":["Imports"]}},"/imports":{"get":{"operationId":"ImportsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Imports"]}},"/imports/target-fields/{entityType}":{"get":{"operationId":"ImportsController_targetFields","parameters":[{"name":"entityType","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Imports"]}},"/imports/templates":{"get":{"operationId":"ImportsController_template","parameters":[],"responses":{"200":{"description":""}},"tags":["Imports"]}},"/imports/{id}":{"get":{"operationId":"ImportsController_detail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Imports"]}},"/imports/{id}/errors":{"get":{"operationId":"ImportsController_errors","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Imports"]}},"/imports/{id}/mapping":{"patch":{"operationId":"ImportsController_setMapping","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMappingDto"}}}},"responses":{"200":{"description":""}},"tags":["Imports"]}},"/imports/{id}/validate":{"post":{"operationId":"ImportsController_validate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Imports"]}},"/imports/{id}/run":{"post":{"operationId":"ImportsController_run","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Imports"]}},"/imports/preview":{"post":{"operationId":"ImportsController_preview","parameters":[],"responses":{"201":{"description":""}},"tags":["Imports"]}},"/imports/customers":{"post":{"operationId":"ImportsController_importCustomers","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRowsDto"}}}},"responses":{"200":{"description":""}},"tags":["Imports"]}},"/imports/installations":{"post":{"operationId":"ImportsController_importInstallations","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRowsDto"}}}},"responses":{"200":{"description":""}},"tags":["Imports"]}},"/imports/equipment":{"post":{"operationId":"ImportsController_importEquipment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRowsDto"}}}},"responses":{"200":{"description":""}},"tags":["Imports"]}},"/imports/template/{entity}":{"get":{"operationId":"ImportsController_downloadTemplate","parameters":[{"name":"entity","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Imports"]}},"/exports/{entityType}":{"get":{"operationId":"ExportsController_run","parameters":[{"name":"entityType","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Exports"]}},"/exports/beta10-style/equipment.csv":{"get":{"operationId":"ExportsController_beta10Equipment","parameters":[],"responses":{"200":{"description":""}},"tags":["Exports"]}},"/exports/full-backup":{"post":{"operationId":"ExportsController_fullBackup","parameters":[],"responses":{"201":{"description":""}},"tags":["Exports"]}},"/reports/series":{"get":{"operationId":"ReportsController_series","parameters":[],"responses":{"200":{"description":""}},"tags":["Reports"]}},"/reports/replacements":{"get":{"operationId":"ReportsController_replacements","parameters":[],"responses":{"200":{"description":""}},"tags":["Reports"]}},"/reports/collars":{"get":{"operationId":"ReportsController_collars","parameters":[],"responses":{"200":{"description":""}},"tags":["Reports"]}},"/webhooks":{"get":{"operationId":"WebhooksController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Webhooks"]},"post":{"operationId":"WebhooksController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookDto"}}}},"responses":{"201":{"description":""}},"tags":["Webhooks"]}},"/webhooks/{id}":{"get":{"operationId":"WebhooksController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Webhooks"]},"patch":{"operationId":"WebhooksController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookDto"}}}},"responses":{"200":{"description":""}},"tags":["Webhooks"]},"delete":{"operationId":"WebhooksController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Webhooks"]}},"/webhooks/{id}/deliveries":{"get":{"operationId":"WebhooksController_deliveries","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Webhooks"]}},"/ai/summarize":{"post":{"operationId":"AiController_summarize","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummarizeDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Resume notas técnicas — OFICINA+","tags":["ai"]}},"/ai/classify-anomaly":{"post":{"operationId":"AiController_classifyAnomaly","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassifyAnomalyDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Clasifica una anomalía PCI (severity + categoría) — TECNICO+","tags":["ai"]}},"/ai/generate-email":{"post":{"operationId":"AiController_generateEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateEmailDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Genera correo profesional — OFICINA+","tags":["ai"]}},"/ai/qa":{"post":{"operationId":"AiController_qa","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QaDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Q&A sobre normativa PCI (RIPCI / UNE 23120 / RD 513/2017)","tags":["ai"]}},"/reconciliation/upload":{"post":{"operationId":"ReconciliationController_upload","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Subir CSV de extracto bancario y conciliar con Payments existentes","tags":["reconciliation"]}},"/reconciliation/recent":{"get":{"operationId":"ReconciliationController_recent","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Últimos batches de conciliación","tags":["reconciliation"]}},"/vehicles/queue":{"get":{"operationId":"VehiclesController_queue","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cola actual de vehículos en taller","tags":["vehicles"]}},"/vehicles/search":{"get":{"operationId":"VehiclesController_search","parameters":[{"name":"plate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Busca vehículo por matrícula (case-insensitive)","tags":["vehicles"]}},"/vehicles/checkin":{"post":{"operationId":"VehiclesController_checkin","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VehiclesCheckinDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Vehículo entra al taller: marca equipos IN_WORKSHOP y entrega provisional","tags":["vehicles"]}},"/vehicles/checkout":{"post":{"operationId":"VehiclesController_checkout","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VehiclesCheckoutDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Vehículo sale del taller: ACTIVE + collarín + devolver provisional","tags":["vehicles"]}},"/vehicles/fleet/{customerId}/parque":{"get":{"operationId":"VehiclesController_getFleetParque","parameters":[{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Parque de vehículos del cliente (todos los Installation VEHICULO)","tags":["vehicles"]}},"/vehicles/fleet-pickup":{"post":{"operationId":"VehiclesController_fleetPickup","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetPickupDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Recogida en flota: marca N vehículos IN_WORKSHOP, deja provisionales, crea manifest PICKUP","tags":["vehicles"]}},"/vehicles/fleet-return":{"post":{"operationId":"VehiclesController_fleetReturn","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetReturnDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Devolución en flota: equipos ACTIVE + collarines + retorno de provisionales + manifest RETURN","tags":["vehicles"]}},"/vehicles/fleet/manifests":{"get":{"operationId":"VehiclesController_listManifests","parameters":[{"name":"customerId","required":true,"in":"query","schema":{"type":"string"}},{"name":"type","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar PickupManifest del tenant (paginado)","tags":["vehicles"]}},"/vehicles/fleet/manifest/{id}":{"get":{"operationId":"VehiclesController_getManifest","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de un PickupManifest","tags":["vehicles"]}},"/vehicles/fleet/manifest/{id}/print.pdf":{"get":{"operationId":"VehiclesController_manifestPdf","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"PDF A4 imprimible del PickupManifest (firmable in-situ)","tags":["vehicles"]}},"/stripe/checkout/quote/{quoteId}":{"post":{"operationId":"StripeController_checkoutForQuote","parameters":[{"name":"quoteId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Stripe"]}},"/stripe/webhook":{"post":{"operationId":"StripeController_webhook","parameters":[],"responses":{"200":{"description":""}},"tags":["Stripe"]}},"/invoices":{"get":{"operationId":"InvoicesController_list","parameters":[{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["DRAFT","SENT_TO_AEAT","ACCEPTED","REJECTED","CANCELLED"]}},{"name":"customerId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar facturas (paginado, filtros status / customerId)","tags":["invoices"]},"post":{"operationId":"InvoicesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvoiceDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear factura DRAFT — calcula número correlativo YYYY/NNNN + hash Verifactu encadenado","tags":["invoices"]}},"/invoices/{id}":{"get":{"operationId":"InvoicesController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de la factura con líneas y cliente","tags":["invoices"]}},"/invoices/{id}.pdf":{"get":{"operationId":"InvoicesController_pdf","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"PDF de la factura (brandeado con tenant-branding)","tags":["invoices"]}},"/invoices/{id}/send-aeat":{"post":{"operationId":"InvoicesController_sendAeat","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Enviar factura a AEAT (Verifactu) — devuelve 503 hasta que haya .p12 instalado","tags":["invoices"]}},"/inspection-ai/batches":{"post":{"operationId":"InspectionAiController_createBatch","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear batch IA con varias fotos (máx 20, 5MB cada una)","tags":["inspection-ai"]}},"/inspection-ai/batches/{id}":{"get":{"operationId":"InspectionAiController_getBatch","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle del batch + frames + anomalías","tags":["inspection-ai"]}},"/inspection-ai/batches/{id}/process":{"post":{"operationId":"InspectionAiController_process","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Disparar procesamiento del batch (clasifica todos los frames)","tags":["inspection-ai"]}},"/inspection-ai/frames/{frameId}/review":{"post":{"operationId":"InspectionAiController_review","parameters":[{"name":"frameId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Marcar un frame como revisado por humano (feedback IA)","tags":["inspection-ai"]}},"/marketplace/jobs":{"post":{"operationId":"MarketplaceController_publish","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMarketJobDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Publicar nuevo trabajo en el marketplace","tags":["marketplace"]},"get":{"operationId":"MarketplaceController_listForFreelance","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar trabajos públicos abiertos (filtra por CP / specialty)","tags":["marketplace"]}},"/marketplace/jobs/mine":{"get":{"operationId":"MarketplaceController_listMine","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar trabajos publicados por mi tenant","tags":["marketplace"]}},"/marketplace/jobs/{id}/assign/{bidId}":{"post":{"operationId":"MarketplaceController_assign","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"bidId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Asignar puja ganadora (cierra el job)","tags":["marketplace"]}},"/marketplace/jobs/{id}/bid":{"post":{"operationId":"MarketplaceController_bid","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BidDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Pujar por un trabajo","tags":["marketplace"]}},"/marketplace/jobs/{id}/complete":{"post":{"operationId":"MarketplaceController_complete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Marcar trabajo como completado","tags":["marketplace"]}},"/marketplace/freelancers/me":{"post":{"operationId":"MarketplaceController_upsertMe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FreelancerProfileDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear o actualizar mi perfil freelance","tags":["marketplace"]},"get":{"operationId":"MarketplaceController_getMe","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Mi perfil freelance","tags":["marketplace"]}},"/marketplace/freelancers/me/jobs":{"get":{"operationId":"MarketplaceController_getMyJobs","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Mis trabajos (activos + histórico)","tags":["marketplace"]}},"/customer/me/generate-compliance-token":{"post":{"operationId":"ComplianceController_generateToken","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Generar token público compliance (idempotente)","tags":["compliance"]}},"/customer/me/dashboard":{"get":{"operationId":"ComplianceController_getDashboard","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Dashboard del cliente final (equipos + score)","tags":["compliance"]}},"/public/compliance/{token}":{"get":{"operationId":"ComplianceController_getPublic","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Vista pública compliance (sin auth, por token único)","tags":["compliance"]}},"/optimization/proposals":{"get":{"operationId":"OptimizationProposalsController_list","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar propuestas (default: PENDING)","tags":["optimization"]}},"/optimization/proposals/{id}":{"get":{"operationId":"OptimizationProposalsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle propuesta (incluye proposalJson completo)","tags":["optimization"]}},"/optimization/proposals/{id}/accept":{"post":{"operationId":"OptimizationProposalsController_accept","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Aceptar propuesta — aplica bulk-reassign","tags":["optimization"]}},"/optimization/proposals/{id}/discard":{"post":{"operationId":"OptimizationProposalsController_discard","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Descartar propuesta — marca DISCARDED","tags":["optimization"]}},"/admin/ripci/reconcile":{"post":{"operationId":"RipciAdminController_reconcile","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Forzar reconciliación RIPCI (sin esperar al cron de 03:00)","tags":["admin"]}},"/admin/geocoding/run":{"post":{"operationId":"RipciAdminController_geocode","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Forzar geocoding nocturno (sin esperar al cron de 04:00)","tags":["admin"]}},"/admin/jobs/status":{"get":{"operationId":"RipciAdminController_jobsStatus","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de los crons (última ejecución de cada job)","tags":["admin"]}},"/public/status/summary":{"get":{"operationId":"PublicStatusController_summary","parameters":[],"responses":{"200":{"description":""}},"tags":["PublicStatus"]}},"/public/status/history":{"get":{"operationId":"PublicStatusController_history","parameters":[{"name":"service","required":true,"in":"query","schema":{"type":"string"}},{"name":"hours","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PublicStatus"]}},"/public/status/incidents":{"get":{"operationId":"PublicStatusController_incidents","parameters":[],"responses":{"200":{"description":""}},"tags":["PublicStatus"]}},"/invitations":{"post":{"operationId":"InvitationsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvitationDto"}}}},"responses":{"201":{"description":""}},"tags":["Invitations"]}},"/invitations/by-token/{token}":{"get":{"operationId":"InvitationsController_byToken","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Invitations"]}},"/invitations/{token}/accept":{"post":{"operationId":"InvitationsController_accept","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInvitationDto"}}}},"responses":{"200":{"description":""}},"tags":["Invitations"]}},"/workshop/batch/start":{"post":{"operationId":"WorkshopController_start","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Abre la sesión del día (o devuelve la OPEN existente)","tags":["workshop"]}},"/workshop/batch/current":{"post":{"operationId":"WorkshopController_current","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Devuelve la sesión OPEN actual + detalle del equipo en mano (si lo hay)","tags":["workshop"]}},"/workshop/batch/finish":{"post":{"operationId":"WorkshopController_finish","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cierra la sesión, totaliza y deja todo listo para el día siguiente","tags":["workshop"]}},"/workshop/scan":{"post":{"operationId":"WorkshopController_scan","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkshopScanDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Escanea un equipo: auto-cierra el anterior, marca este como current y devuelve sugerencia + destino","tags":["workshop"]}},"/workshop/scan/finish-current":{"post":{"operationId":"WorkshopController_finishCurrent","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cierra el equipo en mano sin escanear otro (último del lote)","tags":["workshop"]}},"/workshop/scan/undo-last":{"post":{"operationId":"WorkshopController_undoLast","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Deshace el último cierre si fue hace menos de 30s","tags":["workshop"]}},"/workshop/batch/sales-queue":{"get":{"operationId":"WorkshopController_salesQueue","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cola de preparativos venta: stock nuevo + segunda mano (segunda mano: próximamente)","tags":["workshop"]}},"/workshop/scan/sale":{"post":{"operationId":"WorkshopController_scanSale","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkshopScanSaleDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Escanea preparación de venta (PREP_SALE_NEW | PREP_SALE_USED). Se registra como WorkshopOperation cerrada al instante.","tags":["workshop"]}}},"info":{"title":"SecurFyre API","description":"Plataforma cloud de mantenimiento PCI (RIPCI / UNE 23120). Esta API es abierta y documentada: cualquier mantenedora puede integrar su software con SecurFyre. Para webhooks y SDK ver https://app.securfyre.com/developers.","version":"1.0","contact":{"name":"SecurFyre","url":"https://securfyre.com","email":"dev@securfyre.com"},"license":{"name":"Proprietary — uso comercial bajo contrato","url":"https://securfyre.com/legal"}},"tags":[{"name":"auth","description":"Autenticación y sesiones"},{"name":"customers","description":"Clientes finales del tenant"},{"name":"installations","description":"Sedes / ubicaciones del cliente"},{"name":"equipment","description":"Inventario de equipos PCI"},{"name":"workorders","description":"Órdenes de trabajo"},{"name":"anomalies","description":"Anomalías detectadas en revisiones"},{"name":"certificates","description":"Certificados PDF de OTs"},{"name":"quotes","description":"Presupuestos"},{"name":"invoices","description":"Facturas + Verifactu (AEAT)"},{"name":"payments","description":"Cobros"},{"name":"reports","description":"KPIs y series temporales"},{"name":"webhooks","description":"Webhooks salientes (integraciones)"},{"name":"public","description":"Endpoints públicos sin auth (landing tag NFC, demo, developers, marketplace)"},{"name":"nfc","description":"Tags NFC: provisión, lookup, login express técnico"},{"name":"marketplace","description":"Marketplace de leads entrantes desde landing pública"}],"servers":[{"url":"https://api.securfyre.com","description":"Producción"},{"url":"http://localhost:3000","description":"Local development"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header","name":"Authorization"}},"schemas":{"CreateRipciAuthorizationDto":{"type":"object","properties":{}},"UpdateRipciAuthorizationDto":{"type":"object","properties":{}},"LoginDto":{"type":"object","properties":{}},"NfcLoginDto":{"type":"object","properties":{}},"PinLoginDto":{"type":"object","properties":{}},"UpdateTenantBrandingDto":{"type":"object","properties":{}},"ConvertDemoDto":{"type":"object","properties":{}},"SendNotificationDto":{"type":"object","properties":{}},"CreateTemplateDto":{"type":"object","properties":{}},"UpdateTemplateDto":{"type":"object","properties":{}},"SubscribePushDto":{"type":"object","properties":{}},"UnsubscribePushDto":{"type":"object","properties":{}},"SignupTenantDto":{"type":"object","properties":{}},"CreateUserDto":{"type":"object","properties":{}},"UpdateUserDto":{"type":"object","properties":{}},"UpdateCustomerContactDto":{"type":"object","properties":{}},"CreateCustomerContactDto":{"type":"object","properties":{}},"CreateCustomerDto":{"type":"object","properties":{}},"UpdateCustomerDto":{"type":"object","properties":{}},"CreateInstallationDto":{"type":"object","properties":{}},"UpdateInstallationDto":{"type":"object","properties":{}},"CreateEquipmentDto":{"type":"object","properties":{}},"UpdateEquipmentDto":{"type":"object","properties":{}},"ReplaceEquipmentDto":{"type":"object","properties":{}},"ProvisionNfcDto":{"type":"object","properties":{}},"UpdateLocationDto":{"type":"object","properties":{}},"QuickCreateEquipmentDto":{"type":"object","properties":{}},"ConfirmRouteBagDto":{"type":"object","properties":{}},"CloseRouteBagDto":{"type":"object","properties":{}},"CreateExecutionDto":{"type":"object","properties":{}},"CreateStockMovementDto":{"type":"object","properties":{}},"PublishTraceDto":{"type":"object","properties":{}},"ProposeTransferDto":{"type":"object","properties":{}},"CustomerAckDto":{"type":"object","properties":{}},"RejectTransferDto":{"type":"object","properties":{}},"CreateMarketLeadDto":{"type":"object","properties":{}},"RejectMarketLeadDto":{"type":"object","properties":{}},"CreateWorkOrderDto":{"type":"object","properties":{}},"TransitionWorkOrderDto":{"type":"object","properties":{}},"CreateAnomalyDto":{"type":"object","properties":{}},"UpdateAnomalyDto":{"type":"object","properties":{}},"RecordCorrectionDto":{"type":"object","properties":{}},"RegisterPrinterDto":{"type":"object","properties":{}},"RecordPrintDto":{"type":"object","properties":{}},"CreateQuoteDto":{"type":"object","properties":{}},"TransitionQuoteDto":{"type":"object","properties":{}},"CreateDeliveryNoteDto":{"type":"object","properties":{}},"DemoRequestDto":{"type":"object","properties":{}},"RequestServiceDto":{"type":"object","properties":{}},"CreateCertificationDto":{"type":"object","properties":{}},"UpdateCertificationDto":{"type":"object","properties":{}},"CreateSupplierDto":{"type":"object","properties":{}},"UpdateSupplierDto":{"type":"object","properties":{}},"CreateWarehouseDto":{"type":"object","properties":{}},"UpdateWarehouseDto":{"type":"object","properties":{}},"CreateStockItemDto":{"type":"object","properties":{}},"UpdateStockItemDto":{"type":"object","properties":{}},"CreatePurchaseOrderDto":{"type":"object","properties":{}},"UpdatePurchaseOrderDto":{"type":"object","properties":{}},"TransitionPurchaseOrderDto":{"type":"object","properties":{}},"ReceivePurchaseOrderDto":{"type":"object","properties":{}},"LoanerHandoverDto":{"type":"object","properties":{}},"LoanerReturnDto":{"type":"object","properties":{}},"CreatePaymentDto":{"type":"object","properties":{}},"CancelPaymentDto":{"type":"object","properties":{}},"DeclareCashDepositDto":{"type":"object","properties":{}},"CloseCashDepositDto":{"type":"object","properties":{}},"ReconcileCashDepositDto":{"type":"object","properties":{}},"CreateSignatureDto":{"type":"object","properties":{}},"PlanRouteDto":{"type":"object","properties":{}},"PlanMultiDto":{"type":"object","properties":{}},"UpdateMappingDto":{"type":"object","properties":{}},"ImportRowsDto":{"type":"object","properties":{}},"CreateWebhookDto":{"type":"object","properties":{}},"UpdateWebhookDto":{"type":"object","properties":{}},"SummarizeDto":{"type":"object","properties":{}},"ClassifyAnomalyDto":{"type":"object","properties":{}},"GenerateEmailDto":{"type":"object","properties":{}},"QaDto":{"type":"object","properties":{}},"VehiclesCheckinDto":{"type":"object","properties":{}},"VehiclesCheckoutDto":{"type":"object","properties":{}},"FleetPickupDto":{"type":"object","properties":{}},"FleetReturnDto":{"type":"object","properties":{}},"InvoiceLineInputDto":{"type":"object","properties":{"description":{"type":"string","example":"Mantenimiento anual extintores 6kg","maxLength":500},"quantity":{"type":"number","example":12,"minimum":0.01},"unitPrice":{"type":"number","example":25.5,"minimum":0},"taxRate":{"type":"number","example":21,"default":21}},"required":["description","quantity","unitPrice"]},"CreateInvoiceDto":{"type":"object","properties":{"customerId":{"type":"string","example":"clxxxx","description":"ID del Customer destinatario"},"workOrderId":{"type":"string","example":"clxxx-wo"},"type":{"type":"string","enum":["ORDINARY","RECTIFICATIVE","SIMPLIFIED"],"default":"ORDINARY"},"issueDate":{"type":"string","example":"2026-05-24"},"dueDate":{"type":"string","example":"2026-06-23"},"taxRate":{"type":"number","example":21,"default":21},"lines":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceLineInputDto"}}},"required":["customerId","issueDate","lines"]},"CreateMarketJobDto":{"type":"object","properties":{}},"BidDto":{"type":"object","properties":{}},"FreelancerProfileDto":{"type":"object","properties":{}},"CreateInvitationDto":{"type":"object","properties":{}},"AcceptInvitationDto":{"type":"object","properties":{}},"WorkshopScanDto":{"type":"object","properties":{}},"WorkshopScanSaleDto":{"type":"object","properties":{}}}}}