|
|
@@ -23,9 +23,15 @@ class OrderbookTransferController
|
|
|
private TokenModel $tokenModel;
|
|
|
private CprModel $cprModel;
|
|
|
private OrderbookModel $orderbookModel;
|
|
|
+ private \PDO $pdo;
|
|
|
|
|
|
public function __construct()
|
|
|
{
|
|
|
+ if (!isset($GLOBALS['pdo']) || !$GLOBALS['pdo'] instanceof \PDO) {
|
|
|
+ throw new \RuntimeException('Global PDO connection not initialized');
|
|
|
+ }
|
|
|
+
|
|
|
+ $this->pdo = $GLOBALS['pdo'];
|
|
|
$this->paymentModel = new PaymentModel();
|
|
|
$this->walletModel = new WalletModel();
|
|
|
$this->orderbookTransferModel = new OrderbookTransferModel();
|
|
|
@@ -79,6 +85,36 @@ class OrderbookTransferController
|
|
|
return ResponseLib::sendFail('Orderbook não encontrado', ['token_external_id' => $tokenExternalId], 'E_NOT_FOUND')->withStatus(404);
|
|
|
}
|
|
|
|
|
|
+ if ((int)$orderbook['status_id'] !== OrderbookModel::STATUS_OPEN) {
|
|
|
+ if ((int)$orderbook['status_id'] === OrderbookModel::STATUS_COMPLETED) {
|
|
|
+ return ResponseLib::sendOk([
|
|
|
+ 'orderbook_id' => (int)$orderbook['orderbook_id'],
|
|
|
+ 'token_external_id' => $tokenExternalId,
|
|
|
+ 'message' => 'Orderbook já transferido anteriormente',
|
|
|
+ ], 'S_TOKEN_ALREADY_TRANSFERRED');
|
|
|
+ }
|
|
|
+
|
|
|
+ return ResponseLib::sendFail(
|
|
|
+ 'Orderbook não está disponível para transferência',
|
|
|
+ ['orderbook_id' => (int)$orderbook['orderbook_id'], 'status_id' => $orderbook['status_id']],
|
|
|
+ 'E_ORDERBOOK_STATUS'
|
|
|
+ )->withStatus(409);
|
|
|
+ }
|
|
|
+
|
|
|
+ $paymentFlag = trim((string)($payment['payment_flag'] ?? ''));
|
|
|
+ $expectedFlag = sprintf('orderbook:%d;token:%s', (int)$orderbook['orderbook_id'], $tokenExternalId);
|
|
|
+ if ($paymentFlag === '' || $paymentFlag !== $expectedFlag) {
|
|
|
+ return ResponseLib::sendFail(
|
|
|
+ 'Pagamento não vinculado ao orderbook informado',
|
|
|
+ [
|
|
|
+ 'external_id' => $externalId,
|
|
|
+ 'payment_flag' => $paymentFlag,
|
|
|
+ 'expected' => $expectedFlag,
|
|
|
+ ],
|
|
|
+ 'E_PAYMENT_MISMATCH'
|
|
|
+ )->withStatus(409);
|
|
|
+ }
|
|
|
+
|
|
|
$tokenId = (int)($orderbook['token_id'] ?? 0);
|
|
|
if ($tokenId <= 0) {
|
|
|
return ResponseLib::sendFail('Orderbook sem token associado', [], 'E_ORDERBOOK_TOKEN')->withStatus(409);
|
|
|
@@ -109,14 +145,6 @@ class OrderbookTransferController
|
|
|
return ResponseLib::sendFail('Carteira da empresa não encontrada', [], 'E_WALLET_NOT_FOUND')->withStatus(404);
|
|
|
}
|
|
|
|
|
|
- if ((int)$orderbook['status_id'] === OrderbookModel::STATUS_COMPLETED) {
|
|
|
- return ResponseLib::sendOk([
|
|
|
- 'orderbook_id' => (int)$orderbook['orderbook_id'],
|
|
|
- 'token_external_id' => $tokenExternalId,
|
|
|
- 'message' => 'Orderbook já transferido anteriormente',
|
|
|
- ], 'S_TOKEN_ALREADY_TRANSFERRED');
|
|
|
- }
|
|
|
-
|
|
|
$serverAddress = $this->resolveServerAddress();
|
|
|
|
|
|
try {
|
|
|
@@ -131,17 +159,24 @@ class OrderbookTransferController
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
- $this->orderbookModel->updateWalletId((int)$orderbook['orderbook_id'], (int)$wallet['wallet_id']);
|
|
|
- } catch (\Throwable $e) {
|
|
|
- return ResponseLib::sendFail('Falha ao registrar comprador no orderbook: ' . $e->getMessage(), [], 'E_ORDERBOOK_UPDATE')->withStatus(500);
|
|
|
- }
|
|
|
+ $this->pdo->beginTransaction();
|
|
|
|
|
|
- try {
|
|
|
+ $this->orderbookModel->updateWalletId((int)$orderbook['orderbook_id'], (int)$wallet['wallet_id']);
|
|
|
$this->orderbookTransferModel->markCompleted((int)$orderbook['orderbook_id']);
|
|
|
$this->tokenModel->updateWalletId($tokenId, (int)$wallet['wallet_id']);
|
|
|
$this->cprModel->updateCompanyId($cprId, $companyId);
|
|
|
+
|
|
|
+ $this->pdo->commit();
|
|
|
} catch (\Throwable $e) {
|
|
|
- return ResponseLib::sendFail('Falha ao atualizar registros após transferência: ' . $e->getMessage(), [], 'E_TRANSFER_PERSIST')->withStatus(500);
|
|
|
+ if ($this->pdo->inTransaction()) {
|
|
|
+ $this->pdo->rollBack();
|
|
|
+ }
|
|
|
+
|
|
|
+ return ResponseLib::sendFail(
|
|
|
+ 'Falha ao atualizar registros após transferência: ' . $e->getMessage(),
|
|
|
+ [],
|
|
|
+ 'E_TRANSFER_PERSIST'
|
|
|
+ )->withStatus(500);
|
|
|
}
|
|
|
|
|
|
return ResponseLib::sendOk([
|