Pesquisar K
Appearance
Appearance
Ao integrar a plataforma de pagamentos da Layers, você encontrará dois conceitos fundamentais: Sale e SaleGroup. Entender a diferença entre eles é essencial para implementar corretamente sua integração.
| Aspecto | Sale | SaleGroup |
|---|---|---|
| Propósito | Representa apenas uma venda | Agrupador de múltiplas vendas |
| Identificação | code e token único | code e token único |
| Pagamento | Status individual do pagamento dessa venda | Status agregado do grupo de vendas |
| Marketplace | Suporta marketplace individual | Vinculada a um marketplace específico |
| Independência | Pode existir sem SaleGroup | Não existe sem ao menos 1 Sale |
| Rastreamento | URL de rastreamento individual | URL única de rastreamento para todas as vendas |
| Refund/Cancelamento | Individual | Afeta múltiplas vendas |
Veja os campos principais de uma venda:
{
// Identificação
code: "LP1-LK3JC-FHM9F", // Código único da venda
token: "uuid-v4", // Token público para rastreamento
saleGroupId: "ObjectId", // Referência para o grupo (opcional)
saleGroupCode: "LM-LK3JC-FHMCC", // Código do grupo (se existir)
// Cliente
customer: {
name: "João Silva",
email: "joao@example.com",
phone: "+55 11 99999-9999",
birth: "1990-05-15",
address: { /* endereço completo */ },
document: { kind: "cpf", value: "12345678900" }
},
// Produtos
items: [
{
quantity: 2,
name: "Produto A",
subtotal: { amount: 10000 }, // em centavos
// ... outros campos
}
],
// Pagamento
payment: {
status: "open", // open, pending, paid, refunded, etc
method: {
method: "credit_card", // credit_card, pix, bank_slip, etc
installments: 3, // número de parcelas
// ... dados do método
}
},
// Envio
shipping: {
required: true,
address: { /* endereço de envio */ },
method: { /* método de envio */ }
},
// Totalizações
owned: {
total: { amount: 30000 } // Total incluindo tudo
},
// Tipo de venda
kind: "order", // order, recurrence, subscription, gift, voucher
// Metadata
createdAt: "2024-01-15T10:30:00Z",
updatedAt: "2024-01-15T10:30:00Z"
}Características principais:
order, recurrence, subscription, gift, voucher)SaleGroupUm SaleGroup é um contenedor para múltiplas vendas relacionadas:
{
// Identificação
code: "LM-LK3JC-FHMCC", // Código único do grupo
token: "uuid-v4", // Token público para rastreamento
// Marketplace
marketplaceSlug: "loja-abc", // Slug do marketplace
marketplaceId: "ObjectId", // ID do marketplace
// Vendas agrupadas
saleIds: [
"ObjectId-1", // Referência para Sale 1
"ObjectId-2", // Referência para Sale 2
"ObjectId-3" // Referência para Sale 3
],
// Cliente (sincronizado)
customer: {
name: "João Silva",
email: "joao@example.com",
// ... dados básicos do cliente
},
// Totalizações do grupo
price: {
amount: 90000 // Soma de todas as Sales
},
currency: "BRL",
// Status agregado
status: "open", // open, pending, paid, refunded, etc
// Rastreamento unificado
trackingUrl: "https://marketplace.com/account/order/uuid-v4",
// Metadata
createdAt: "2024-01-15T10:30:00Z",
updatedAt: "2024-01-15T10:30:00Z"
}Características principais:
Sales via array saleIdsQuando você cria um SaleGroup:
saleGroupIdCenário: Um cliente compra produtos de um único vendedor
Características:
Exemplo JSON:
{
"code": "LP1-LK3JC-FHM9F",
"saleGroupId": null,
"customer": {
"name": "João Silva",
"email": "joao@example.com"
},
"items": [
{ "name": "Produto A", "quantity": 2, "subtotal": { "amount": 10000 } }
],
"payment": {
"status": "open",
"method": "credit_card"
}
}Cenário: Um cliente compra de múltiplos vendedores em um marketplace em uma única venda.
Características:
Exemplo JSON:
{
"saleGroup": {
"code": "LM-LK3JC-FHMCC",
"token": "abc-def-ghi",
"saleIds": ["id-sale-1", "id-sale-2", "id-sale-3"],
"price": { "amount": 90000 },
"status": "open"
},
"sales": [
{
"code": "LP1-LK3JC-FHM9F",
"saleGroupId": "id-salegroup",
"saleGroupCode": "LM-LK3JC-FHMCC",
"customer": { "name": "João Silva", "email": "joao@example.com" },
"items": [{ "name": "Produto do Vendedor A", "quantity": 1, "subtotal": { "amount": 30000 } }],
"owned": { "total": { "amount": 30000 } }
},
{
"code": "SAL-2024-002",
"saleGroupId": "id-salegroup",
"saleGroupCode": "LM-LK3JC-FHMCC",
"customer": { "name": "João Silva", "email": "joao@example.com" },
"items": [{ "name": "Produto do Vendedor B", "quantity": 2, "subtotal": { "amount": 30000 } }],
"owned": { "total": { "amount": 30000 } }
},
{
"code": "SAL-2024-003",
"saleGroupId": "id-salegroup",
"saleGroupCode": "LM-LK3JC-FHMCC",
"customer": { "name": "João Silva", "email": "joao@example.com" },
"items": [{ "name": "Produto do Vendedor C", "quantity": 3, "subtotal": { "amount": 30000 } }],
"owned": { "total": { "amount": 30000 } }
}
]
}Estados principais de uma Sale:
Estados principais de um SaleGroup:
Use SaleGroup quando:
Use apenas Sale quando:
O SaleGroup é criado durante o checkout, quando o sistema detecta que o cliente está comprando de múltiplos vendedores em um marketplace.
Sim. Quando você modifica os dados do cliente no SaleGroup, a plataforma sincroniza automaticamente essas mudanças para todas as Sales vinculadas.
// Modificar cliente no SaleGroup
saleGroup.customer.name = "Novo Nome"
await saleGroup.save() // Todas as Sales também são atualizadasNão diretamente. A relação é criada no momento do checkout e é considerada imutável para manter a integridade dos dados. Se necessário, você deve cancelar a Sale e criar uma nova.
Não. Cada Sale é processada independentemente. Uma falha em um pagamento não afeta as outras Sales do grupo. O status do SaleGroup refletirá partially_paid ou failed para indicar o estado geral.
price (SaleGroup) e owned.total (Sale)? price (SaleGroup): Soma agregada de todas as Sales dentro do grupoowned.total (Sale): Total específico daquela venda individualParcialmente. A integração base é a mesma, mas:
Sale diretamenteSaleGroup que contém referências a múltiplas SalesUse o trackingUrl do SaleGroup. Ele fornece uma URL única que permite ao cliente visualizar todas as compras do grupo:
{
"saleGroup": {
"trackingUrl": "https://marketplace.com/account/order/abc-def-ghi"
}
}Agora que você entende a diferença entre Sale e SaleGroup, continue explorando: