Requisitos — Add Recommended Item
Task #194880 · Endpoint POST api/payment/v2/{id}/add-recommended-item
Task pai: #194880 — [Back] 02 - Adicionar item recomendado Contexto: US 194871 — MVP Upsell (Pedido) Spec tecnica: a ser criada ADRs relacionados: ADR-004 · ADR-005 · ADR-006 · ADR-007 · ADR-009
Visão geral
O cliente que recebeu um link de pagamento (zzlink) pode visualizar itens recomendados pelo vendedor e, com um clique, adicionar um desses itens ao seu pedido. O endpoint recebe essa intenção, valida as condições, incorpora o item ao cart e retorna os valores atualizados do pedido para que o front possa atualizar a tela sem recarregar.
Papéis
- Cliente: pessoa que acessa o zzlink para efetuar o pagamento
- Checkout service: orquestrador da operação — valida, chama Cart API, atualiza Payment
- Cart API: responsável por validar estoque e persistir o novo item no cart
Requisitos
RF-01 — Receber e validar o contexto do pedido
User Story: Como cliente no zzlink, quero adicionar um item recomendado ao meu pedido, para que ele seja incluído no pagamento que vou realizar.
Acceptance Criteria:
WHENo cliente chamaPOST api/payment/v2/{id}/add-recommended-itemTHENo sistemaSHALLexigir autenticação viaPaymentsScheme(token JWT já presente no zzlink para operações de finalização).WHENo{id}(GUID do payment) não corresponde a nenhum paymentTHENo sistemaSHALLretornar400com mensagem"Payment não encontrado".WHENo payment encontrado é do tipoEcommerce(nãoStore)THENo sistemaSHALLretornar400com mensagem"Operação não disponível para este tipo de pedido".
RF-02 — Validar a recomendação
Acceptance Criteria:
WHENoRecommendedItemIdinformado não existe na tabela deCartRecommendedItemsTHENo sistemaSHALLretornar400com mensagem"Recomendação não encontrada".WHENoRecommendedItemIdexiste, mas o registro não pertence aoCartIdvinculado ao paymentTHENo sistemaSHALLretornar400com mensagem"Recomendação não encontrada".WHENo item recomendado existe, masCart.DateCreated + 1 hora < DateTime.Now(janela de validade expirada)THENo sistemaSHALLretornar400com mensagem"Recomendação não está mais disponível".WHENtodas as validações de contexto e recomendação passamTHENo sistemaSHALLprosseguir para a chamada à Cart API.
RF-03 — Adicionar o item via Cart API
Acceptance Criteria:
WHENo sistema chama a Cart API para adicionar o itemTHENo sistemaSHALLenviar:cartIderecommendedItemId. A Cart API é responsável por resolver os dados do item (productId,size,fullPrice,discount,discountType) a partir do registro emCartRecommendedItems.WHENa Cart API retorna sucessoTHENo sistemaSHALLprosseguir para o ajuste doPayment.Total.WHENa Cart API retorna erro de produto sem estoqueTHENo sistemaSHALLretornar400com mensagem"Produto sem estoque na loja"e registrar a falha na alllogs.WHENa Cart API retorna qualquer outro erroTHENo sistemaSHALLretornar400com mensagem"Não foi possível adicionar o item"e registrar a falha na alllogs.
RF-04 — Atualizar o Payment e retornar o DTO consolidado
Acceptance Criteria:
WHENa Cart API confirma sucessoTHENo sistemaSHALLatualizar sincronamente o campoTotaldoPaymentModelcom o novo total do cart.WHENoPayment.Totalé atualizado com sucessoTHENo sistemaSHALLretornar200com oAddRecommendedItemResponseDTOcontendo:values—Valuesrecalculado com o novo totalproducts—List<Product>completa e atualizada dosCartItems(incluindo o item recém-adicionado)paymentMethods—PaymentMethodscom parcelas recalculadas para o novo totalrecommendedItems—List<RecommendedItemsInfoDTO>atualizada (item aceito removido por deduplicação de SKU)
RF-05 — Auditoria (alllogs)
Acceptance Criteria:
WHENo endpoint é chamado com dados válidos de autenticaçãoTHENo sistemaSHALLregistrar na alllogs a tentativa de adicionar o item (payment GUID, recommendedItemId).WHENa operação conclui com sucessoTHENo sistemaSHALLregistrar na alllogs o resultado positivo.WHENa operação falha em qualquer etapa (Cart API, atualização do payment, etc.)THENo sistemaSHALLregistrar na alllogs a falha com o motivo.
Contrato do endpoint
Request
POST api/payment/v2/{id}/add-recommended-item
Authorization: Bearer {token PaymentsScheme}
Content-Type: application/json
{
"recommendedItemId": 0
}
Response 200
{
"values": {
"products": { "value": 0.0, "description": "R$ 0,00", "amount": 0 },
"discount": { "value": 0.0, "description": "R$ 0,00" },
"discountPix": { "value": 0.0, "description": "R$ 0,00" },
"bonus": { "value": 0.0, "description": "R$ 0,00" },
"subtotal": { "value": 0.0, "description": "R$ 0,00" },
"subtotalWhenPix": { "value": 0.0, "description": "R$ 0,00" },
"shipment": { "value": 0.0, "description": "R$ 0,00" },
"total": { "value": 0.0, "description": "R$ 0,00" },
"totalWhenPix": { "value": 0.0, "description": "R$ 0,00" }
},
"products": [
{
"itemId" 0,
"name": "string",
"size": "string",
"amount": 0,
"fullPrice": 0.0,
"price": 0.0,
"total": 0.0,
"url": "string",
"isFromRecommendation": false
}
],
"paymentMethods": {
"creditCard": true,
"pix": { "operator": 0, "key": "string", "discountPercentage": null, "discountValue": null },
"boleto": false,
"installments": [
{ "installment": "1", "value": 0.0, "description": "1x de R$ 0,00" }
],
"isTwoCreditCardsAllowed": false
},
"recommendedItems": [
{
"recommendedItemId": 0,
"productId": "string",
"sku": "string",
"productName": "string",
"description": "string",
"thumbnail": "string",
"images": [],
"fullPrice": 0.0,
"discountValue": 0.0,
"discountType": 0,
"size": "string"
}
]
}
Responses 400
| Cenário | Mensagem |
|---|---|
| Payment não encontrado | "Payment não encontrado" |
| Payment não é do tipo Store | "Operação não disponível para este tipo de pedido" |
| RecommendedItemId não encontrado na tabela de recomendações | "Recomendação não encontrada" |
Janela de validade expirada (Cart.DateCreated + 1h) | "Recomendação não está mais disponível" |
| Sem estoque na loja (retorno Cart API) | "Produto sem estoque na loja" |
| Outro erro da Cart API | "Não foi possível adicionar o item" |
Dependências
| Dependência | Task | Status |
|---|---|---|
Cart API — endpoint POST api/cart/{cartId}/items | Task 03 — Cart API: Add Item | Pendente de refinamento |
Nota: O contrato da Cart API será alterado para aceitar
recommendedItemIdem vez deproductId+size. Esta alteração será feita no refinamento da task-03.
Fora de escopo
- Lógica interna da Cart API (validação de estoque, cálculo de totais do cart) — responsabilidade da task separada da Cart API
- Remoção de item recomendado — task #193232 item 03
Questões abertas
Nenhuma.