Skip to content
This repository has been archived by the owner on Apr 24, 2023. It is now read-only.

Commit

Permalink
Merge pull request #111 from gabriellucius/partial-refund
Browse files Browse the repository at this point in the history
Partial refund
  • Loading branch information
s2it-moscou authored Apr 10, 2018
2 parents 7d8ffb7 + c9dbe53 commit bb6e6ea
Show file tree
Hide file tree
Showing 18 changed files with 498 additions and 108 deletions.
44 changes: 44 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
1.12.0
- Checkout sem endereço (para produtos do tipo 'virtual' e 'downloadable')
- Habilitar/desabilitar recuperação de carrinho do PagSeguro via admin
- Tela de listar transações no admin, permitindo ver detalhes da transação
- Estorno parcial
- Disconto por meio de pagamento via configuração do módulo (admin) para o checkout padrão/lightbox
- Atualizada versão do pagseguro-php-sdk no composer.json para utilizar as versões 4.+
- Adicionada compatibilidade com endereços de 4 linhas, no formato: 1 rua/endereço, 2 número, 3 complemento, 4 bairro (padrão brasileiro)
- Valida se o telefone do comprador foi configurado antes de tentar usar o telefone do endereço de entrega
- Fix: Corrigido id dos itens do pedido (carrinho) enviados para o PagSeguro

1.4.0
- Alterado o fluxo do checkout transparente (na própria tela de checkout do Magento)
- Alterada a forma de configurar o módulo e os meios de pagamento do PagSeguro, que agora são configurados individualmente.
- Melhorias gerais e correções de bugs: transações do admin, css muito abrangente, remoção de arquivos velhos e desnecessários, refatorações.

1.3.0
- Adicionada validação e mensagens de erro (frontend) nos formulários do checkout transparente

1.2.6
- Melhoria na configuração do log na interface administrativa
- Adicionada seção de atualização do módulo e atualização geral da documentação (README.md)
- Correção de bugs quando o pedido deixava de existir ou a sessão era encerrada
- Correçao para aceitar CVV de 4 digitos
- Melhoria no acesso aos dados do endereço do cliente

1.2.1
- Alterada a biblioteca JavaScript utilizada nas máscaras.

1.2.0
- Adicionada opção para utilizar o Checkout Transparente.

1.1.0
- Possibilidade de consultar e solicitar o cancelamento de transações;
- Possibilidade de consultar e solicitar o estorno de transações;
- Possibilidade de definir descontos com base no meio de pagamento escolhido durante o checkout PagSeguro;

1.0.0
- Adicionando opção para utilização do Checkout Lightbox.
- Integração com API de Notificação.
- Integração com API de Pagamento do PagSeguro.
- Configuração do Setup do módulo.
- Adicionado meio de pagamento ao Magento2
- Versão inicial.
3 changes: 1 addition & 2 deletions Controller/Adminhtml/Refund/Refund.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,8 @@ public function execute()
$this->_objectManager->create('UOL\PagSeguro\Helper\Library'),
$this->_objectManager->create('UOL\PagSeguro\Helper\Crypt')
);

try {
return $this->whenSuccess($refund->execute($this->getRequest()->getParam('data')));
return $this->whenSuccess($refund->execute($this->getRequest()->getParam('data'), $this->getRequest()->getParam('value')));
} catch (\Exception $exception) {
return $this->whenError($exception->getMessage());
}
Expand Down
3 changes: 2 additions & 1 deletion Helper/Data.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ class Data
6 => "pagseguro_devolvida",
7 => "pagseguro_cancelada",
8 => "pagseguro_chargeback_debitado",
9 => "pagseguro_em_contestacao"
9 => "pagseguro_em_contestacao",
10 => "partially_refunded"
);

/**
Expand Down
2 changes: 1 addition & 1 deletion Model/Direct/BoletoMethod.php
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ private function setSenderDocument()
private function setItemsInformation($product)
{
$this->_paymentRequest->addItems()->withParameters(
$product->getId(), //id
$product->getProduct()->getId(), //id
\UOL\PagSeguro\Helper\Data::fixStringLength($product->getName(), 255), //description
$product->getSimpleQtyToShip(), //quantity
\UOL\PagSeguro\Helper\Data::toFloat($product->getPrice()), //amount
Expand Down
2 changes: 1 addition & 1 deletion Model/Direct/CreditCardMethod.php
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ private function setSenderDocument()
private function setItemsInformation($product)
{
$this->_paymentRequest->addItems()->withParameters(
$product->getId(), //id
$product->getProduct()->getId(), //id
\UOL\PagSeguro\Helper\Data::fixStringLength($product->getName(), 255), //description
$product->getSimpleQtyToShip(), //quantity
\UOL\PagSeguro\Helper\Data::toFloat($product->getPrice()), //amount
Expand Down
2 changes: 1 addition & 1 deletion Model/Direct/DebitMethod.php
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ private function setSenderDocument()
private function setItemsInformation($product)
{
$this->_paymentRequest->addItems()->withParameters(
$product->getId(), //id
$product->getProduct()->getId(), //id
\UOL\PagSeguro\Helper\Data::fixStringLength($product->getName(), 255), //description
$product->getSimpleQtyToShip(), //quantity
\UOL\PagSeguro\Helper\Data::toFloat($product->getPrice()), //amount
Expand Down
2 changes: 1 addition & 1 deletion Model/PaymentMethod.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ private function setItemsInformation()
{
foreach ($this->_checkoutSession->getLastRealOrder()->getAllVisibleItems() as $product) {
$this->_paymentRequest->addItems()->withParameters(
$product->getId(), //id
$product->getProduct()->getId(), //id
\UOL\PagSeguro\Helper\Data::fixStringLength($product->getName(), 255), //description
$product->getSimpleQtyToShip(), //quantity
\UOL\PagSeguro\Helper\Data::toFloat($product->getPrice()), //amount
Expand Down
56 changes: 52 additions & 4 deletions Model/Transactions/Method.php
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,9 @@ public function searchTransactions()
}

if (!empty($this->_status)) {
$select = $select->where('order.status = ?', $this->getStatusFromPaymentKey($this->_status));
$select = $this->getStatusFromPaymentKey($this->_status) == 'partially_refunded'
? $select->where('ps.partially_refunded = ?', 1)
: $select->where('order.status = ?', $this->getStatusFromPaymentKey($this->_status));
}

if (!empty($this->_dateBegin) && !empty($this->_dateEnd)) {
Expand Down Expand Up @@ -278,12 +280,15 @@ protected function formatPagSeguroStatus($payment)
}

/**
* @param $order
* @param string $status
* @param integer $isPartiallyRefunded
* @return bool|string
*/
protected function formatMagentoStatus($order)
protected function formatMagentoStatus($status, $isPartiallyRefunded = 0)
{
return $this->getStatusString($this->getKeyFromOrderStatus($order));
return $isPartiallyRefunded
? $this->getStatusString($this->getKeyFromOrderStatus($status)) . ' (estornada parcialmente)'
: $this->getStatusString($this->getKeyFromOrderStatus($status));
}

/**
Expand Down Expand Up @@ -380,6 +385,49 @@ private function getPrefixTableName($table)
return $this->_resource->getTableName($table);
}

/**
* Update column 'partially_refunded' the `pagseguro_orders` table
*
* @param int $orderId
* @return void
*/
protected function updatePartiallyRefundedPagSeguro($orderId)
{
$this->getConnection()
->query(sprintf(
"UPDATE `%s` SET partially_refunded = 1 WHERE entity_id='%s'",
$this->getPrefixTableName('pagseguro_orders'),
$orderId
));
}

/**
* Get all pagseguro partially refunded orders id
*
* @return array
*/
protected function getPartiallyRefundedOrders()
{
$pagseguroOrdersIdArray = array();

$connection = $this->getConnection();
$select = $connection->select()
->from( ['ps' => $this->getPrefixTableName('pagseguro_orders')], ['order_id'] )
->where('ps.partially_refunded = ?', '1');

if ($this->_scopeConfig->getValue('payment/pagseguro/environment')) {
$select = $select->where('ps.environment = ?', $this->_scopeConfig->getValue('payment/pagseguro/environment'));
}

$connection->prepare($select);

foreach ($connection->fetchAll($select) as $value) {
$pagseguroOrdersIdArray[] = $value['order_id'];
}

return $pagseguroOrdersIdArray;
}

/**
* @param $order
* @param $payment
Expand Down
76 changes: 60 additions & 16 deletions Model/Transactions/Methods/Refund.php
Original file line number Diff line number Diff line change
Expand Up @@ -130,21 +130,24 @@ public function __construct(
* Refund one transaction
*
* @param $data
* @param $value
* @return bool
* @throws \Exception
*/
public function execute($data) {

public function execute($data, $value = null) {
try {
$config = $this->sanitizeConfig($data);
if ($value != null)
$config->value = number_format(floatval($value), 2, '.', '');
$this->isConciliate($config);
if (!$this->doRefund($config))
throw new \Exception('impossible to refund');
throw new \Exception('impossible to refund');

$this->doUpdates($config);
return true;
} catch (\Exception $exception) {
throw $exception;
$error = simplexml_load_string($exception->getMessage());
throw new \Exception((string)$error->error->code);
}
}

Expand All @@ -164,9 +167,17 @@ private function isConciliate($config)
private function doUpdates($config)
{
try {
$this->addStatusToOrder($config->order_id, 'pagseguro_devolvida');
$this->updateSalesOrder($config->order_id, $config->pagseguro_id);
$this->updatePagSeguroOrders($config->order_id, $config->pagseguro_id);
/* if have refund value is an partially refund, so the status should be keeped */
if ($config->value) {
$comment = 'Estornado valor de R$' . $config->value . ' do seu pedido.';
$this->setPartiallyRefundedStatus($config->order_id);
$this->notifyCustomer($config->order_id, $config->pagseguro_status, $comment);
} else {
$this->addStatusToOrder($config->order_id, 'pagseguro_devolvida');
$this->updateSalesOrder($config->order_id, $config->pagseguro_id);
$this->updatePagSeguroOrders($config->order_id, $config->pagseguro_id);
}

unset($order);
} catch (\Exception $exception) {
throw $exception;
Expand Down Expand Up @@ -216,7 +227,8 @@ private function requestRefund($config)
try {
return \PagSeguro\Services\Transactions\Refund::create(
$this->_library->getPagSeguroCredentials(),
$config->pagseguro_id
$config->pagseguro_id,
$config->value
);
} catch (\Exception $exception) {
throw $exception;
Expand All @@ -233,9 +245,15 @@ public function request()
{
$this->getTransactions();
if (! is_null($this->_PagSeguroPaymentList->getTransactions())) {
$partiallyRefundedOrdersArray = $this->getPartiallyRefundedOrders();

foreach ($this->_PagSeguroPaymentList->getTransactions() as $payment) {
if (! $this->addPayment($this->decryptOrderById($payment), $payment))
continue;
$order = $this->decryptOrderById($payment);

if (!in_array($order->getId(), $partiallyRefundedOrdersArray)) {
if (! $this->addPayment($this->decryptOrderById($payment), $payment))
continue;
}
}
}
return $this->_arrayPayments;
Expand Down Expand Up @@ -285,7 +303,8 @@ private function toArray($payment, $order, $conciliate = false)
'magento_status' => $this->formatMagentoStatus($order),
'pagseguro_id' => $payment->getCode(),
'order_id' => $order->getId(),
'details' => $this->details($order, $payment, ['conciliate' => $conciliate])
'details' => $this->details($order, $payment, ['conciliate' => $conciliate]),
'value' => $payment->getGrossAmount(),
];
}

Expand All @@ -304,7 +323,8 @@ protected function details($order, $payment, $options)
'order_id' => $order->getId(),
'pagseguro_status' => $payment->getStatus(),
'pagseguro_id' => $payment->getCode(),
'needConciliate' => $options['conciliate']
'needConciliate' => $options['conciliate'],
'value' => null
])
);
}
Expand Down Expand Up @@ -332,14 +352,14 @@ private function checkConciliation($payment, $order)
*/
private function compareStatus($order, $payment)
{
if (! (in_array($order->getStatus(), [
if ((in_array($order->getStatus(), [
$this->getStatusFromPaymentKey(3),
$this->getStatusFromPaymentKey(4),
$this->getStatusFromPaymentKey(5),
]) || in_array($payment->getStatus(), [3, 4, 5]))) {
return false;
]) == 1 && in_array($payment->getStatus(), [3, 4, 5]) == 1)) {
return true;
}
return true;
return false;
}

/**
Expand Down Expand Up @@ -367,4 +387,28 @@ private function hasOrder($order)
return false;
return true;
}

/**
* Updates respective order partially refunded status to 1 in pagseguro_orders table
*
* @param string $orderId
* @return void
*/
private function setPartiallyRefundedStatus($orderId)
{
$this->updatePartiallyRefundedPagSeguro($orderId);
}

/**
* @param $orderId
* @param $orderStatus
* @param $comment
*/
public function notifyCustomer($orderId, $orderStatus, $comment = null)
{
$notify = true;
$order = $this->_order->load($orderId);
$order->addStatusToHistory($this->getStatusFromPaymentKey($orderStatus), $comment, $notify);
$order->save();
}
}
2 changes: 1 addition & 1 deletion Model/Transactions/Methods/Transactions.php
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ public function request()
'magento_id' => $transaction['increment_id'],
'pagseguro_id' => $transaction['transaction_code'],
'environment' => $transaction['environment'],
'magento_status' => $this->formatMagentoStatus($transaction['status']),
'magento_status' => $this->formatMagentoStatus($transaction['status'], $transaction['partially_refunded']),
'order_id' => $transaction['entity_id']
);
}
Expand Down
34 changes: 1 addition & 33 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,39 +160,7 @@ Caso tenha dúvidas ou precise de suporte, acesse nosso [fórum].

Changelog
---------
1.4.0
- Alterado o fluxo do checkout transparente (na própria tela de checkout do Magento)
- Alterada a forma de configurar o módulo e os meios de pagamento do PagSeguro, que agora são configurados individualmente.
- Melhorias gerais e correções de bugs: transações do admin, css muito abrangente, remoção de arquivos velhos e desnecessários, refatorações.

1.3.0
- Adicionada validação e mensagens de erro (frontend) nos formulários do checkout transparente

1.2.6
- Melhoria na configuração do log na interface administrativa
- Adicionada seção de atualização do módulo e atualização geral da documentação (README.md)
- Correção de bugs quando o pedido deixava de existir ou a sessão era encerrada
- Correçao para aceitar CVV de 4 digitos
- Melhoria no acesso aos dados do endereço do cliente

1.2.1
- Alterada a biblioteca JavaScript utilizada nas máscaras.

1.2.0
- Adicionada opção para utilizar o Checkout Transparente.

1.1.0
- Possibilidade de consultar e solicitar o cancelamento de transações;
- Possibilidade de consultar e solicitar o estorno de transações;
- Possibilidade de definir descontos com base no meio de pagamento escolhido durante o checkout PagSeguro;

1.0.0
- Adicionando opção para utilização do Checkout Lightbox.
- Integração com API de Notificação.
- Integração com API de Pagamento do PagSeguro.
- Configuração do Setup do módulo.
- Adicionado meio de pagamento ao Magento2
- Versão inicial.
Para consultar o log de alterações acesse o arquivo [CHANGELOG.md](CHANGELOG.md).

Licença
-------
Expand Down
Loading

0 comments on commit bb6e6ea

Please sign in to comment.