Saltar al contenido principal

Creating an order

Alice quiere comprar los audífonos de Bob. Mercatto describe la vida del pedido como un mapa de dos estados — esperando entrega, luego entregado — y crea la Transaction que retendrá el dinero de Alice, indicándole a Ishtaran desde el principio exactamente cómo debe dividirse eventualmente: 90% para Bob, 10% para la comisión propia de Mercatto.

AguardandoEntrega ──(ProdutoEntregue event)──► Entregue

Código

examples/marketplace-mercatto/create-order.ts
const workflow = await owner.workflows.create(organizationId, 'Mercatto - Ciclo do Pedido');
const version = await owner.workflows.createVersion(
workflow.workflowId,
[
{ id: awaitingDeliveryStateId, name: 'AguardandoEntrega', isInitial: true, isFinal: false },
{ id: deliveredStateId, name: 'Entregue', isInitial: false, isFinal: true },
],
[{ id: transitionId, fromStateId: awaitingDeliveryStateId, toStateId: deliveredStateId }],
);
const eventType = await owner.eventTypes.create(organizationId, 'ProdutoEntregue');
await owner.workflows.createRule(workflow.workflowId, version.workflowVersionId, awaitingDeliveryStateId, deliveredStateId, eventType.eventTypeId, []);
await owner.workflows.publishVersion(workflow.workflowId, version.workflowVersionId);

const buyer = { accountId: aliceAccountId, role: 'buyer', isPayer: true };
const seller = { accountId: bobAccountId, role: 'seller', isPayer: false, splitPercentage: '90' };
const marketplace = { accountId: mercattoRevenueAccountId, role: 'marketplace', isPayer: false, splitPercentage: '10' };

const transaction = await mercatto.transactions.create(
organizationId, applicationId, version.workflowVersionId, assetNetworkId, '200',
[buyer, seller, marketplace], `mercatto-order-${runId}`,
);

Resultado

{ "transactionId": "…", "status": "CREATED" }

Qué pasó por debajo

Las Rules deben existir antes de publicar. Un createRule sobre un WorkflowVersion ya Published es rechazado (422 WORKFLOW_VERSION_NOT_MUTABLE) — un orden real, confirmado en vivo, no una convención de documentación.

El Split es explícito a propósito. Con dos Participants que no son el pagador (Bob y Mercatto), Ishtaran exige un splitPercentage explícito en cada uno — un único beneficiario sin split declarado recibiría en cambio el 100% implícitamente (BR-SPL-004, ver Failure scenarios para ese caso más simple). Esta regla existe por un bug financiero real que ocurrió antes: sin ella, se aplicaba una suposición de 100% implícito para un solo beneficiario incluso con dos o más beneficiarios, sobre-acreditando a quien fuera evaluado primero. Los porcentajes se validan para que sumen exactamente 100% al crear la Transaction, no en el Settlement — un split inválido (digamos, 90% + 20%) ni siquiera llega a producir una Transaction.