Table of Contents

Class TicketsController

Namespace
KadicErp.WebApi.Controllers.Helpdesk
Assembly
KadicErp.WebApi.dll

Tickets de soporte. Helpdesk es global y transversal a todo el ERP (decisión 2026-07-13): NO lleva [RequireModule] a propósito — se gatea únicamente por permisos, que el auto-seed asigna a todos los roles activos (Create/ViewOwn/Comment) o solo a gestores (ViewAll/…). La regla own-or-ViewAll de lectura/comentario se resuelve en los handlers vía ICurrentUser.HasPermission.

[ApiController]
[Route("api/helpdesk/tickets")]
[Authorize]
public class TicketsController : ControllerBase
Inheritance
object
ControllerBase
TicketsController

Constructors

TicketsController(IMediator)

public TicketsController(IMediator mediator)

Parameters

mediator IMediator

Methods

AddComment(Guid, AddCommentRequest)

[HttpPost("{id:guid}/comments")]
[Authorize(Policy = "HELPDESK_TICKETS_COMMENT")]
public Task<IActionResult> AddComment(Guid id, TicketsController.AddCommentRequest request)

Parameters

id Guid
request TicketsController.AddCommentRequest

Returns

Task<IActionResult>

Assign(Guid, AssignTicketRequest)

[HttpPost("{id:guid}/assign")]
[Authorize(Policy = "HELPDESK_TICKETS_ASSIGN")]
public Task<IActionResult> Assign(Guid id, TicketsController.AssignTicketRequest request)

Parameters

id Guid
request TicketsController.AssignTicketRequest

Returns

Task<IActionResult>

Create(CreateTicketCommand)

[HttpPost]
[Authorize(Policy = "HELPDESK_TICKETS_CREATE")]
public Task<IActionResult> Create(CreateTicketCommand command)

Parameters

command CreateTicketCommand

Returns

Task<IActionResult>

GetById(Guid)

[HttpGet("{id:guid}")]
[Authorize(Policy = "HELPDESK_TICKETS_VIEW_OWN")]
public Task<IActionResult> GetById(Guid id)

Parameters

id Guid

Returns

Task<IActionResult>

GetInbox(int, int, TicketStatus?, int?, Guid?, string?)

Bandeja de gestores: todos los tickets del tenant con filtros combinables.

[HttpGet]
[Authorize(Policy = "HELPDESK_TICKETS_VIEW_ALL")]
public Task<IActionResult> GetInbox(int pageNumber = 1, int pageSize = 20, TicketStatus? status = null, int? categoryId = null, Guid? assigneeUserId = null, string? search = null)

Parameters

pageNumber int
pageSize int
status TicketStatus?
categoryId int?
assigneeUserId Guid?
search string

Returns

Task<IActionResult>

GetMine(int, int, TicketStatus?)

[HttpGet("mine")]
[Authorize(Policy = "HELPDESK_TICKETS_VIEW_OWN")]
public Task<IActionResult> GetMine(int pageNumber = 1, int pageSize = 20, TicketStatus? status = null)

Parameters

pageNumber int
pageSize int
status TicketStatus?

Returns

Task<IActionResult>

Transition(Guid, TransitionTicketRequest)

Cambia el estado del ticket. Policy base ViewOwn (la tienen todos los roles activos): la regla real — Tickets.Transition, EXCEPTO el solicitante cancelando su propio ticket Open — se resuelve en el handler vía ICurrentUser.HasPermission.

[HttpPost("{id:guid}/transition")]
[Authorize(Policy = "HELPDESK_TICKETS_VIEW_OWN")]
public Task<IActionResult> Transition(Guid id, TicketsController.TransitionTicketRequest request)

Parameters

id Guid
request TicketsController.TransitionTicketRequest

Returns

Task<IActionResult>