Orders
Este documento descreve todas as operações disponíveis para o agregado Order e seus sub-recursos, seguindo os padrões de Domain-Driven Design (DDD) e Command Query Responsibility Segregation (CQRS).
Índice
Orders (Pedidos)
Commands (Comandos)
1. Criação de Pedido (CreateOrder)
Contrato: CreateOrderCommand
Campos Necessários:
RequestId(Guid, obrigatório) - Identificador da solicitação origemUserId(Guid, obrigatório) - Identificador do usuárioCode(string, obrigatório) - Código do pedidoAuthor(string, opcional) - Autor da operação
Validações:
RequestId: Não pode ser vazio; Solicitação deve existirUserId: Não pode ser vazio; Usuário deve existirCode: Não pode ser vazio
Retorno: CreateOrderResponse
Eventos de Domínio:
OrderCreatedEvent- Disparado quando um pedido é criado
Regras de Negócio:
- Pedido é criado a partir de uma solicitação processada
- Pedido é criado com status
Pending - Code é único e identifica o pedido
- Preços são herdados da solicitação
2. Atualização de Pedido (UpdateOrder)
Contrato: UpdateOrderCommand
Campos Necessários:
Id(Guid, obrigatório) - Identificador do pedido (JsonIgnore)Status(OrderStatus enum, opcional) - Novo status do pedidoObservation(string, opcional) - Observações adicionaisAuthor(string, opcional) - Autor da operação
Validações:
Id: Pedido deve existirStatus: Deve ser um valor válido do enum quando fornecido
Retorno: Void
Eventos de Domínio:
OrderUpdatedEvent- Disparado quando um pedido é atualizado
Regras de Negócio:
- Permite atualizar status e observações
- Não permite atualizar pedidos cancelados ou finalizados
3. Processar Pedido (ProcessOrder)
Contrato: ProcessOrderCommand
Campos Necessários:
OrderId(Guid, obrigatório) - Identificador do pedido
Validações:
OrderId: Pedido deve existir- Pedido deve estar com status
Pending
Retorno: Void
Eventos de Domínio:
OrderProcessedEvent- Disparado quando um pedido é processado
Regras de Negócio:
- Altera status do pedido para
Processed - Valida que todos os itens têm profissionais atribuídos
- Libera o pedido para pagamento
4. Deletar Pedido (DeleteOrder)
Contrato: DeleteOrderCommand
Campos Necessários:
Id(Guid, obrigatório) - Identificador do pedido
Validações:
Id: Pedido deve existir
Retorno: Void
Regras de Negócio:
- Remove permanentemente o pedido do banco de dados
- Remove todos os itens e pagamentos associados
- Operação irreversível
Queries (Consultas)
1. Buscar Pedido por ID (GetOrderById)
Contrato: GetOrderByIdQuery
Parâmetros:
Id(Guid, obrigatório) - Identificador do pedido
Retorno: GetOrderByIdResponse
Descrição:
- Retorna todos os dados do pedido especificado
- Inclui detalhes de preços, datas, status e itens
2. Pesquisar Pedidos (SearchOrders)
Contrato: SearchOrdersQuery
Parâmetros:
ProfessionalUserId(Guid, opcional) - Filtrar por profissionalUserId(Guid, opcional) - Filtrar por usuárioRequestId(Guid, opcional) - Filtrar por solicitação origemStatus(OrderStatus enum, opcional) - Filtrar por statusIsPaid(bool, opcional) - Filtrar por pedidos pagos (true) ou não pagos (false)StartDt(DateTime, opcional) - Data inicialEndDt(DateTime, opcional) - Data finalPageNumber(int, padrão: 1) - Número da páginaPageSize(int, padrão: 30) - Tamanho da página
Retorno: SearchOrdersResponse (lista paginada de pedidos)
Descrição:
- Retorna uma lista paginada de pedidos conforme os filtros aplicados
- O filtro
IsPaidpermite buscar facilmente pedidos pagos ou pendentes de pagamento
Campos retornados em cada item (SearchOrdersResponseItem):
Id- Identificador do item do pedidoRequestItemId- Identificador do item da solicitaçãoResponseId- Identificador da resposta do profissional (se houver)Status- Status do item do pedidoTaskName- Nome da tarefa/serviçoAddress- Endereço onde o serviço será realizadoBasePrice- Preço base para o clienteFinalPrice- Preço final para o clienteProfessionalBasePrice- Preço base para o profissionalProfessionalFinalPrice- Preço final para o profissionalSkills- Habilidades necessárias (Dictionary) Professional- Dados do profissional atribuído (se houver)StartDt- Data/hora de início do serviçoEndDt- Data/hora de término do serviçoCreated- Data/hora de criaçãoUpdated- Data/hora de atualizaçãoObservation- Observações adicionaisAuthorCreated- Autor da criaçãoAuthorUpdated- Autor da última atualização
OrderItems (Itens de Pedido)
Commands (Comandos)
1. Adicionar Item ao Pedido (AddOrderItem)
Contrato: AddOrderItemCommand
Campos Necessários:
OrderId(Guid, obrigatório) - Identificador do pedido (JsonIgnore)RequestItemId(Guid, obrigatório) - Identificador do item da solicitaçãoProfessionalUserId(Guid, obrigatório) - Identificador do profissionalObservation(string, opcional) - Observações adicionaisAuthor(string, opcional) - Autor da operação
Validações:
OrderId: Não pode ser vazio; Pedido deve existirRequestItemId: Não pode ser vazio; Item da solicitação deve existirProfessionalUserId: Não pode ser vazio; Profissional deve existir
Retorno: AddOrderItemResponse
Eventos de Domínio:
OrderItemAddedEvent- Disparado quando um item é adicionado
Regras de Negócio:
- Adiciona um serviço ao pedido
- Profissional deve ter aceitado a resposta do RequestItem
- Herda dados do RequestItem (tarefa, endereço, atributos)
- Atualiza preços do pedido
- Item é criado com status
Pending
2. Remover Item do Pedido (RemoveOrderItem)
Contrato: RemoveOrderItemCommand
Campos Necessários:
OrderId(Guid, obrigatório) - Identificador do pedidoOrderItemId(Guid, obrigatório) - Identificador do item
Validações:
- Item deve existir para o pedido
Retorno: Void
Eventos de Domínio:
OrderItemRemovedEvent- Disparado quando um item é removido
Regras de Negócio:
- Remove o item do pedido
- Atualiza preços do pedido
- Não pode remover itens já iniciados ou finalizados
3. Definir Profissional (SetProfessional)
Contrato: SetProfessionalCommand
Campos Necessários:
OrderId(Guid, obrigatório) - Identificador do pedido (JsonIgnore)OrderItemId(Guid, obrigatório) - Identificador do item (JsonIgnore)ProfessionalUserId(Guid, obrigatório) - Identificador do profissionalAuthor(string, opcional) - Autor da operaçãoObservation(string, opcional) - Observações adicionais
Validações:
- Item deve existir para o pedido
- Profissional deve existir
- Profissional deve ter habilidades necessárias
Retorno: Void
Eventos de Domínio:
ProfessionalSetToOrderItemEvent- Disparado quando um profissional é definido
Regras de Negócio:
- Define ou altera o profissional responsável pelo item
- Profissional deve ter as habilidades necessárias para a tarefa
- Pode substituir profissional se necessário
4. Adicionar Profissional por Busca (AddProfessionalByFind)
Contrato: AddProfessionalByFindCommand
Campos Necessários:
OrderId(Guid, obrigatório) - Identificador do pedido (JsonIgnore)OrderItemId(Guid, obrigatório) - Identificador do item (JsonIgnore)Author(string, opcional) - Autor da operação
Validações:
- Item deve existir para o pedido
- Item não deve ter profissional atribuído
Retorno: AddProfessionalByFindResponse (contém o profissional encontrado)
Regras de Negócio:
- Sistema busca automaticamente um profissional disponível
- Profissional deve ter:
- Habilidades necessárias
- Disponibilidade no horário
- Atender na cidade do serviço
- Profissional é atribuído automaticamente ao item
5. Definir Status do Item (SetOrderItemStatus)
Contrato: SetOrderItemStatusCommand
Campos Necessários:
Id(Guid, obrigatório) - Identificador do item (JsonIgnore)OrderId(Guid, obrigatório) - Identificador do pedido (JsonIgnore)Status(OrderStatus enum, obrigatório) - Novo statusObservation(string, opcional) - Observações adicionaisAuthor(string, opcional) - Autor da operação
Validações:
- Item deve existir para o pedido
Status: Deve ser um valor válido do enum- Transição de status deve ser válida
Retorno: Void
Eventos de Domínio:
OrderItemStatusChangedEvent- Disparado quando o status muda
Regras de Negócio:
- Permite controlar o ciclo de vida do item
- Status possíveis: Pending, InProgress, Completed, Cancelled
- Não pode voltar status (ex: de Completed para InProgress)
Queries (Consultas)
1. Buscar Itens do Pedido (GetOrderItems)
Contrato: GetOrderItemsQuery
Parâmetros:
OrderId(Guid, obrigatório) - Identificador do pedido
Retorno: GetOrderItemsResponse (lista de itens)
Descrição:
- Retorna todos os itens de um pedido
- Inclui detalhes do profissional, tarefa, endereço e preços
2. Buscar Item por ID (GetOrderItemById)
Contrato: GetOrderItemByIdQuery
Parâmetros:
OrderId(Guid, obrigatório) - Identificador do pedidoOrderItemId(Guid, obrigatório) - Identificador do item
Retorno: GetOrderItemByIdResponse
Descrição:
- Retorna um item específico do pedido com todos os detalhes
OrderPayments (Pagamentos)
Commands (Comandos)
1. Criar Pagamento (CreateOrderPayment)
Contrato: CreateOrderPaymentCommand
Campos Necessários:
OrderId(Guid, obrigatório) - Identificador do pedido (JsonIgnore)CorrelationId(Guid, obrigatório) - Identificador de correlação (JsonIgnore)ExpiresAt(DateTime, padrão: DateTime.Now.AddDays(2)) - Data de expiraçãoExternalPaymentId(string, opcional) - ID do pagamento no sistema externoAuthor(string, opcional) - Autor da operação
Validações:
OrderId: Não pode ser vazio; Pedido deve existirCorrelationId: Não pode ser vazioExpiresAt: Deve ser no futuro
Retorno: CreateOrderPaymentResponse (contém URL de pagamento)
Eventos de Domínio:
OrderPaymentCreatedEvent- Disparado quando um pagamento é criado
Regras de Negócio:
- Cria uma cobrança no sistema de pagamento externo
- Pedido deve estar processado
- Gera URL para pagamento
- Pagamento é criado com status
Pending - Expira automaticamente após a data definida
2. Marcar Pagamento como Pago (MarkPaymentAsPaid)
Contrato: MarkPaymentAsPaidCommand
Campos Necessários:
OrderId(Guid, obrigatório) - Identificador do pedido (JsonIgnore)PaymentId(Guid, obrigatório) - Identificador do pagamento (JsonIgnore)ExternalPaymentId(string, obrigatório) - ID do pagamento confirmadoObservation(string, opcional) - Observações adicionaisAuthor(string, opcional) - Autor da operação
Validações:
- Pagamento deve existir para o pedido
- Pagamento deve estar com status
Pending ExternalPaymentId: Não pode ser vazio
Retorno: Void
Eventos de Domínio:
OrderPaymentPaidEvent- Disparado quando um pagamento é confirmado
Regras de Negócio:
- Confirma o pagamento
- Altera status do pagamento para
Paid - Altera status do pedido para
Paid - Libera os serviços para execução
3. Atualizar URL de Pagamento (UpdatePaymentUrl)
Contrato: UpdatePaymentUrlCommand
Campos Necessários:
OrderId(Guid, obrigatório) - Identificador do pedidoPaymentId(Guid, obrigatório) - Identificador do pagamentoPaymentUrl(string, obrigatório) - Nova URL de pagamentoAuthor(string, opcional) - Autor da operação
Validações:
- Pagamento deve existir para o pedido
PaymentUrl: Não pode ser vazio; Deve ser uma URL válida
Retorno: Void
Regras de Negócio:
- Atualiza a URL de pagamento
- Usado quando há renovação de link de pagamento
4. Cancelar Pagamento (CancelPayment)
Contrato: CancelPaymentCommand
Campos Necessários:
OrderId(Guid, obrigatório) - Identificador do pedido (JsonIgnore)PaymentId(Guid, obrigatório) - Identificador do pagamento (JsonIgnore)Reason(string, obrigatório) - Motivo do cancelamentoAuthor(string, opcional) - Autor da operação
Validações:
- Pagamento deve existir para o pedido
Reason: Não pode ser vazio
Retorno: Void
Eventos de Domínio:
OrderPaymentCancelledEvent- Disparado quando um pagamento é cancelado
Regras de Negócio:
- Cancela o pagamento
- Altera status do pagamento para
Cancelled - Cancela também no sistema de pagamento externo
- Não pode cancelar pagamentos já pagos
5. Reembolsar Pagamento (RefundPayment)
Contrato: RefundPaymentCommand
Campos Necessários:
OrderId(Guid, obrigatório) - Identificador do pedido (JsonIgnore)PaymentId(Guid, obrigatório) - Identificador do pagamento (JsonIgnore)Reason(string, obrigatório) - Motivo do reembolsoAuthor(string, opcional) - Autor da operação
Validações:
- Pagamento deve existir para o pedido
- Pagamento deve estar com status
Paid Reason: Não pode ser vazio
Retorno: Void
Eventos de Domínio:
OrderPaymentRefundedEvent- Disparado quando um pagamento é reembolsado
Regras de Negócio:
- Reembolsa o pagamento
- Altera status do pagamento para
Refunded - Processa reembolso no sistema de pagamento externo
- Apenas pagamentos pagos podem ser reembolsados
6. Atualizar Pagamento (UpdateOrderPayment)
Contrato: UpdateOrderPaymentCommand
Campos Necessários:
OrderId(Guid, obrigatório) - Identificador do pedido (JsonIgnore)OrderPaymentId(Guid, obrigatório) - Identificador do pagamento (JsonIgnore)BillingAddress(BillingAddress, opcional) - Endereço de cobrançaPaymentDetails(PaymentDetails, opcional) - Detalhes do pagamentoExternalPaymentId(string, opcional) - ID do pagamento externoAuthor(string, opcional) - Autor da operação
Validações:
OrderId: Não pode ser vazio; Pedido deve existirOrderPaymentId: Não pode ser vazio; Pagamento deve existir
Retorno: Void
Regras de Negócio:
- Permite atualizar informações do pagamento
- Registra alteração no histórico (OrderPaymentHistory)
- Não pode atualizar pagamentos finalizados (Paid, Refunded)
Exemplo de Uso:
{
"billingAddress": {
"responsibleName": "João Silva",
"responsibleDocument": "123.456.789-00",
"street": "Rua Exemplo",
"number": "123",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"postalCode": "01234-567"
},
"externalPaymentId": "pay_abc123",
"author": "admin@sistema.com"
}
Queries (Consultas)
1. Pesquisar Pagamentos (SearchPayments)
Contrato: SearchPaymentsQuery
Parâmetros:
OrderId(Guid, opcional) - Filtrar por pedidoUserId(Guid, opcional) - Filtrar por usuárioStatus(PaymentStatus enum, opcional) - Filtrar por statusStartDate(DateTime, opcional) - Data inicialEndDate(DateTime, opcional) - Data finalPageNumber(int, padrão: 1) - Número da páginaPageSize(int, padrão: 100) - Tamanho da página
Retorno: SearchPaymentsResponse (lista paginada de pagamentos)
Descrição:
- Retorna uma lista paginada de pagamentos conforme os filtros aplicados
2. Buscar Pagamento por ID (GetPaymentById)
Contrato: GetPaymentByIdQuery
Parâmetros:
OrderId(Guid, obrigatório) - Identificador do pedidoPaymentId(Guid, obrigatório) - Identificador do pagamento
Retorno: GetPaymentByIdResponse
Descrição:
- Retorna um pagamento específico com todos os detalhes
- Inclui URL de pagamento e informações do sistema externo
3. Buscar Histórico de Pagamento (GetPaymentHistory)
Contrato: GetPaymentHistoryQuery
Parâmetros:
OrderId(Guid, obrigatório) - Identificador do pedidoPaymentId(Guid, obrigatório) - Identificador do pagamento
Retorno: GetPaymentHistoryResponse (histórico de alterações)
Descrição:
- Retorna todo o histórico de alterações do pagamento
- Inclui mudanças de status, tentativas, etc.
Eventos de Domínio
Order
- OrderCreatedEvent - Disparado quando um pedido é criado
- OrderUpdatedEvent - Disparado quando um pedido é atualizado
- OrderProcessedEvent - Disparado quando um pedido é processado
OrderItems
- OrderItemAddedEvent - Disparado quando um item é adicionado
- OrderItemRemovedEvent - Disparado quando um item é removido
- ProfessionalSetToOrderItemEvent - Disparado quando um profissional é atribuído
- OrderItemStatusChangedEvent - Disparado quando o status de um item muda
OrderPayments
- OrderPaymentCreatedEvent - Disparado quando um pagamento é criado
- OrderPaymentPaidEvent - Disparado quando um pagamento é confirmado
- OrderPaymentCancelledEvent - Disparado quando um pagamento é cancelado
- OrderPaymentRefundedEvent - Disparado quando um pagamento é reembolsado
Regras Gerais de Negócio
Pedido (Order)
- Pedido é criado a partir de uma Request processada
- Code é único e identifica o pedido
- Status possíveis: Pending, Processed, Paid, InProgress, Completed, Cancelled
- Pedido deve estar processado para aceitar pagamentos
- Preços são calculados com base nos itens e descontos
- OrderDetails contém: BasePrice, ProfessionalsBasePrice, FinalPrice, ProfessionalsFinalPrice
Itens de Pedido (OrderItems)
- Cada item representa um serviço a ser executado
- Item deve ter um profissional atribuído
- Profissional pode ser atribuído manualmente ou automaticamente
- Herda dados do RequestItem correspondente
- Status possíveis: Pending, InProgress, Completed, Cancelled
- Não pode remover itens já iniciados ou finalizados
Pagamentos (OrderPayments)
- Pagamento expira em 2 dias por padrão
- Integrado com sistema de pagamento externo
- Status possíveis: Pending, Paid, Cancelled, Refunded, Expired
- Apenas pagamentos pendentes podem ser cancelados
- Apenas pagamentos pagos podem ser reembolsados
- Webhook do sistema externo atualiza status automaticamente
Fluxo Completo
Fluxo do Pedido:
- Criar Pedido →
CreateOrder(a partir de uma Request) - Adicionar Itens →
AddOrderItem(para cada RequestItem aceito) - Atribuir Profissionais →
SetProfessionalouAddProfessionalByFind - Processar Pedido →
ProcessOrder(valida e libera para pagamento) - Criar Pagamento →
CreateOrderPayment(gera URL de pagamento) - Confirmar Pagamento →
MarkPaymentAsPaid(após webhook) - Executar Serviços →
SetOrderItemStatus(InProgress → Completed)
Fluxo de Pagamento:
- Criar → Sistema cria cobrança e gera URL
- Aguardar → Cliente realiza pagamento
- Webhook → Sistema externo confirma pagamento
- Marcar como Pago → Sistema atualiza status
- Liberar Serviços → Profissionais podem iniciar trabalho
Fluxo de Cancelamento/Reembolso:
- Antes do Pagamento →
CancelPayment - Após o Pagamento →
RefundPayment
Padrões Utilizados
CQRS (Command Query Responsibility Segregation)
- Commands: Operações que modificam o estado (Create, Add, Remove, Set, Mark, Cancel, Refund)
- Queries: Operações que apenas consultam dados (Get, Search)
DDD (Domain-Driven Design)
- Agregados: Order é o agregado raiz
- Entidades: OrderItem, OrderPayment
- Value Objects: OrderDetails, Address, TaskAttribute
- Domain Events: Eventos disparados quando ações importantes ocorrem
- Invariantes: Regras de negócio mantidas pelo agregado
Repository Pattern
- Acesso a dados abstraído através de interfaces de repositório
MediatR Pattern
- Commands e Queries implementados como requests do MediatR
- Handlers processam as requisições
FluentValidation
- Validações declarativas para commands e queries
Integration Events
- Integração com sistema de pagamento externo via webhooks
Observações Finais
- Todos os campos marcados com
[JsonIgnore]não aparecem no contrato JSON da API - Campos opcionais podem ser
null - Enums devem ser valores válidos conforme definição
- Validações de tamanho máximo referem-se aos valores numéricos especificados
- Eventos de domínio são disparados de forma assíncrona
- Operações que modificam estado são transacionais
- Observation máximo: 500 caracteres
- OrderDetails calcula automaticamente preços com e sem descontos
- Pagamentos expiram em 2 dias por padrão
- Sistema integrado com gateway de pagamento externo
- Webhooks atualizam status de pagamento automaticamente