Skip to content

Commit ff7f7e1

Browse files
committed
PagBank 😍 Magento
Adiciona informação do bank e tipo de cartão Corrige aplicação de juros em 2 cartões
1 parent fb79811 commit ff7f7e1

File tree

10 files changed

+274
-72
lines changed

10 files changed

+274
-72
lines changed

Api/InterestManagementInterface.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ interface InterestManagementInterface
2222
/**
2323
* Generate the list installments by credit card number.
2424
*
25-
* @param int $cartId
26-
* @param \PagBank\PaymentMagento\Api\Data\CreditCardBinInterface $creditCardBin
27-
* @param \PagBank\PaymentMagento\Api\Data\InstallmentSelectedInterface $installmentSelected
28-
* @param \PagBank\PaymentMagento\Api\Data\CustomAmountInterface|null $customAmount
29-
* @param \PagBank\PaymentMagento\Api\Data\CardIndexInterface|null $cardIndex
25+
* @param int $cartId
26+
* @param \PagBank\PaymentMagento\Api\Data\CreditCardBinInterface $creditCardBin
27+
* @param \PagBank\PaymentMagento\Api\Data\InstallmentSelectedInterface $installmentSelected
28+
* @param \PagBank\PaymentMagento\Api\Data\CustomAmountInterface|null $customAmount
29+
* @param \PagBank\PaymentMagento\Api\Data\CardIndexInterface|null $cardIndex
30+
* @param \PagBank\PaymentMagento\Api\Data\CreditCardBinInterface|null $creditCardBinCard1
31+
* @param \PagBank\PaymentMagento\Api\Data\InstallmentSelectedInterface|null $installmentSelectedCard1
3032
*
3133
* @return \Magento\Quote\Api\Data\TotalsInterface Quote totals data.
3234
*/
@@ -35,6 +37,8 @@ public function generatePagBankInterest(
3537
\PagBank\PaymentMagento\Api\Data\CreditCardBinInterface $creditCardBin,
3638
\PagBank\PaymentMagento\Api\Data\InstallmentSelectedInterface $installmentSelected,
3739
?\PagBank\PaymentMagento\Api\Data\CustomAmountInterface $customAmount = null,
38-
?\PagBank\PaymentMagento\Api\Data\CardIndexInterface $cardIndex = null
40+
?\PagBank\PaymentMagento\Api\Data\CardIndexInterface $cardIndex = null,
41+
?\PagBank\PaymentMagento\Api\Data\CreditCardBinInterface $creditCardBinCard1 = null,
42+
?\PagBank\PaymentMagento\Api\Data\InstallmentSelectedInterface $installmentSelectedCard1 = null
3943
);
40-
}
44+
}

Gateway/Response/TxnDetailDataCcHandler.php

Lines changed: 133 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,25 @@ class TxnDetailDataCcHandler implements HandlerInterface
2828
public const PAYMENT_INFO_CC_AUTHORIZATION_CODE = 'cc_authorization_code';
2929

3030
/**
31-
* Cc NSU - Payment Addtional Information.
31+
* Cc NSU - Payment Addtional Information.
3232
*/
3333
public const PAYMENT_INFO_CC_NSU = 'cc_nsu';
3434

35+
/**
36+
* Three DS Auth Status - Payment Additional Information.
37+
*/
38+
public const PAYMENT_INFO_THREE_DS_AUTH_STATUS = 'three_ds_auth_status';
39+
40+
/**
41+
* Cc Issuer Name - Payment Additional Information.
42+
*/
43+
public const PAYMENT_INFO_CC_ISSUER_NAME = 'cc_issuer_name';
44+
45+
/**
46+
* Cc Issuer Product - Payment Additional Information.
47+
*/
48+
public const PAYMENT_INFO_CC_ISSUER_PRODUCT = 'cc_issuer_product';
49+
3550
/**
3651
* Response Pay Charges - Block name.
3752
*/
@@ -42,6 +57,41 @@ class TxnDetailDataCcHandler implements HandlerInterface
4257
*/
4358
public const RESPONSE_PAYMENT_RESPONSE = 'payment_response';
4459

60+
/**
61+
* Response Pay Payment Method - Block Name.
62+
*/
63+
public const RESPONSE_PAYMENT_METHOD = 'payment_method';
64+
65+
/**
66+
* Response Authentication Method - Block Name.
67+
*/
68+
public const RESPONSE_AUTHENTICATION_METHOD = 'authentication_method';
69+
70+
/**
71+
* Response Authentication Method Status - Block Name.
72+
*/
73+
public const RESPONSE_AUTH_METHOD_STATUS = 'status';
74+
75+
/**
76+
* Response Card - Block Name.
77+
*/
78+
public const RESPONSE_CARD = 'card';
79+
80+
/**
81+
* Response Issuer - Block Name.
82+
*/
83+
public const RESPONSE_ISSUER = 'issuer';
84+
85+
/**
86+
* Response Issuer Name - Block Name.
87+
*/
88+
public const RESPONSE_ISSUER_NAME = 'name';
89+
90+
/**
91+
* Response Issuer Product - Block Name.
92+
*/
93+
public const RESPONSE_ISSUER_PRODUCT = 'product';
94+
4595
/**
4696
* Response Raw Data - Block name.
4797
*/
@@ -53,7 +103,7 @@ class TxnDetailDataCcHandler implements HandlerInterface
53103
public const RESPONSE_AUTHORIZATION_CODE = 'authorization_code';
54104

55105
/**
56-
* Response Pay Payment Method - Block name.
106+
* Response NSU - Block name.
57107
*/
58108
public const RESPONSE_NSU = 'nsu';
59109

@@ -68,8 +118,8 @@ class TxnDetailDataCcHandler implements HandlerInterface
68118
protected $config;
69119

70120
/**
71-
* @param Json $json
72-
* @param Config $config
121+
* @param Json $json
122+
* @param Config $config
73123
*/
74124
public function __construct(
75125
Json $json,
@@ -96,17 +146,18 @@ public function handle(array $handlingSubject, array $response)
96146
}
97147

98148
$paymentDO = $handlingSubject['payment'];
99-
100149
$payment = $paymentDO->getPayment();
101-
102150
$charges = $response[self::RESPONSE_CHARGES][0];
151+
$paymentResponse = $charges[self::RESPONSE_PAYMENT_RESPONSE] ?? null;
152+
$paymentMethod = $charges[self::RESPONSE_PAYMENT_METHOD] ?? null;
103153

104-
$paymentResponse = $charges[self::RESPONSE_PAYMENT_RESPONSE];
105-
106-
if (isset($paymentResponse)) {
107-
/** Set Addtional Information */
154+
if ($paymentResponse) {
108155
$this->setAdditionalInfo($payment, $paymentResponse);
109156
}
157+
158+
if ($paymentMethod) {
159+
$this->setPaymentMethodInfo($payment, $paymentMethod);
160+
}
110161
}
111162

112163
/**
@@ -119,7 +170,7 @@ public function handle(array $handlingSubject, array $response)
119170
*/
120171
public function setAdditionalInfo($payment, $paymentResponse)
121172
{
122-
$data = $paymentResponse[self::RAW_DATA];
173+
$data = $paymentResponse[self::RAW_DATA] ?? [];
123174

124175
if (isset($data[self::RESPONSE_AUTHORIZATION_CODE])) {
125176
$payment->setAdditionalInformation(
@@ -135,4 +186,75 @@ public function setAdditionalInfo($payment, $paymentResponse)
135186
);
136187
}
137188
}
189+
190+
/**
191+
* Set Payment Method Info.
192+
*
193+
* @param InfoInterface $payment
194+
* @param array $paymentMethod
195+
*
196+
* @return void
197+
*/
198+
public function setPaymentMethodInfo($payment, $paymentMethod)
199+
{
200+
$this->setAuthenticationMethodInfo($payment, $paymentMethod);
201+
$this->setIssuerInfo($payment, $paymentMethod);
202+
}
203+
204+
/**
205+
* Set Authentication Method Info.
206+
*
207+
* @param InfoInterface $payment
208+
* @param array $paymentMethod
209+
*
210+
* @return void
211+
*/
212+
private function setAuthenticationMethodInfo($payment, $paymentMethod)
213+
{
214+
$authMethod = $paymentMethod[self::RESPONSE_AUTHENTICATION_METHOD] ?? null;
215+
216+
if ($authMethod && isset($authMethod[self::RESPONSE_AUTH_METHOD_STATUS])) {
217+
$payment->setAdditionalInformation(
218+
self::PAYMENT_INFO_THREE_DS_AUTH_STATUS,
219+
$authMethod[self::RESPONSE_AUTH_METHOD_STATUS]
220+
);
221+
}
222+
}
223+
224+
/**
225+
* Set Issuer Info.
226+
*
227+
* @param InfoInterface $payment
228+
* @param array $paymentMethod
229+
*
230+
* @return void
231+
*/
232+
private function setIssuerInfo($payment, $paymentMethod)
233+
{
234+
$card = $paymentMethod[self::RESPONSE_CARD] ?? null;
235+
236+
if (!$card) {
237+
return;
238+
}
239+
240+
$issuer = $card[self::RESPONSE_ISSUER] ?? null;
241+
242+
if (!$issuer) {
243+
return;
244+
}
245+
246+
if (isset($issuer[self::RESPONSE_ISSUER_NAME])) {
247+
$payment->setAdditionalInformation(
248+
self::PAYMENT_INFO_CC_ISSUER_NAME,
249+
$issuer[self::RESPONSE_ISSUER_NAME]
250+
);
251+
}
252+
253+
if (isset($issuer[self::RESPONSE_ISSUER_PRODUCT])) {
254+
$payment->setAdditionalInformation(
255+
self::PAYMENT_INFO_CC_ISSUER_PRODUCT,
256+
$issuer[self::RESPONSE_ISSUER_PRODUCT]
257+
);
258+
}
259+
}
138260
}

Model/Api/InterestManagement.php

Lines changed: 67 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,45 @@ public function __construct(
7676
$this->consultInstallments = $consultInstallments;
7777
}
7878

79+
/**
80+
* Fetch interest from PagBank for a given bin, installment and amount.
81+
*
82+
* @param int $storeId
83+
* @param string $bin
84+
* @param float $amount
85+
* @param int $installment
86+
*
87+
* @return float
88+
*/
89+
private function fetchInterest(int $storeId, string $bin, float $amount, int $installment): float
90+
{
91+
if (!$bin || $installment < 2) {
92+
return 0.0;
93+
}
94+
95+
$pagBankInterests = $this->consultInstallments->getPagBankInstallments(
96+
$storeId,
97+
$bin,
98+
$this->configBase->formatPrice($amount)
99+
);
100+
101+
if (isset($pagBankInterests[$installment - 1]['amount']['fees'])) {
102+
return (float) $pagBankInterests[$installment - 1]['amount']['fees']['buyer']['interest']['total'] / 100;
103+
}
104+
105+
return 0.0;
106+
}
107+
79108
/**
80109
* Generate List Installments.
81110
*
82-
* @param int $cartId
83-
* @param \PagBank\PaymentMagento\Api\Data\CreditCardBinInterface $creditCardBin
84-
* @param \PagBank\PaymentMagento\Api\Data\InstallmentSelectedInterface $installmentSelected
85-
* @param \PagBank\PaymentMagento\Api\Data\CustomAmountInterface|null $customAmount
86-
* @param \PagBank\PaymentMagento\Api\Data\CardIndexInterface|null $cardIndex
111+
* @param int $cartId
112+
* @param \PagBank\PaymentMagento\Api\Data\CreditCardBinInterface $creditCardBin
113+
* @param \PagBank\PaymentMagento\Api\Data\InstallmentSelectedInterface $installmentSelected
114+
* @param \PagBank\PaymentMagento\Api\Data\CustomAmountInterface|null $customAmount
115+
* @param \PagBank\PaymentMagento\Api\Data\CardIndexInterface|null $cardIndex
116+
* @param \PagBank\PaymentMagento\Api\Data\CreditCardBinInterface|null $creditCardBinCard1
117+
* @param \PagBank\PaymentMagento\Api\Data\InstallmentSelectedInterface|null $installmentSelectedCard1
87118
*
88119
* @throws CouldNotSaveException
89120
* @throws NoSuchEntityException
@@ -99,7 +130,9 @@ public function generatePagBankInterest(
99130
CreditCardBinInterface $creditCardBin,
100131
InstallmentSelectedInterface $installmentSelected,
101132
?CustomAmountInterface $customAmount = null,
102-
?CardIndexInterface $cardIndex = null
133+
?CardIndexInterface $cardIndex = null,
134+
?CreditCardBinInterface $creditCardBinCard1 = null,
135+
?InstallmentSelectedInterface $installmentSelectedCard1 = null
103136
) {
104137
$interest = 0;
105138
$cardIndexValue = null;
@@ -111,63 +144,63 @@ public function generatePagBankInterest(
111144

112145
$quoteTotal = $this->quoteTotalRepository->get($cartId);
113146

114-
$creditCardBin = $creditCardBin->getCreditCardBin();
115-
116-
$installmentSelected = $installmentSelected->getInstallmentSelected();
117-
147+
$creditCardBinValue = $creditCardBin->getCreditCardBin();
148+
$installmentSelectedValue = $installmentSelected->getInstallmentSelected();
118149
$storeId = $quote->getData(QuoteCartInterface::KEY_STORE_ID);
119-
120150
$amount = $quoteTotal->getBaseGrandTotal();
121-
$currentInterest = $quote->getData(InstallmentSelectedInterface::PAGBANK_INTEREST_AMOUNT);
122-
123-
if ($installmentSelected === 0) {
124151

152+
if ($installmentSelectedValue === 0) {
125153
if (!$cardIndex) {
126154
$quote->setData(InstallmentSelectedInterface::PAGBANK_INTEREST_AMOUNT, 0);
127155
$quote->setData(InstallmentSelectedInterface::BASE_PAGBANK_INTEREST_AMOUNT, 0);
128156
$this->quoteRepository->save($quote);
129157
return $this->quoteTotalRepository->get($cartId);
130158
}
131159

132-
if ($cardIndex !== null) {
133-
$cardIndexValue = $cardIndex->getCardIndex();
134-
if ($cardIndexValue === 1) {
135-
$quote->setData(InstallmentSelectedInterface::PAGBANK_INTEREST_AMOUNT, 0);
136-
$quote->setData(InstallmentSelectedInterface::BASE_PAGBANK_INTEREST_AMOUNT, 0);
137-
$this->quoteRepository->save($quote);
138-
return $this->quoteTotalRepository->get($cartId);
139-
}
160+
$cardIndexValue = $cardIndex->getCardIndex();
161+
if ($cardIndexValue === 1) {
162+
$quote->setData(InstallmentSelectedInterface::PAGBANK_INTEREST_AMOUNT, 0);
163+
$quote->setData(InstallmentSelectedInterface::BASE_PAGBANK_INTEREST_AMOUNT, 0);
164+
$this->quoteRepository->save($quote);
165+
return $this->quoteTotalRepository->get($cartId);
140166
}
141167
}
142168

143169
if ($cardIndex !== null) {
144170
$cardIndexValue = $cardIndex->getCardIndex();
171+
$customAmountValue = $customAmount ? (float) $customAmount->getCustomAmount() : 0.0;
172+
145173
if ($cardIndexValue === 1) {
146-
$customAmountValue = $customAmount->getCustomAmount();
147174
$amount = $customAmountValue;
148175
}
149176

150177
if ($cardIndexValue === 2) {
151-
$customAmountValue = $customAmount->getCustomAmount();
178+
$card1Interest = 0.0;
179+
if ($creditCardBinCard1 && $installmentSelectedCard1) {
180+
$card1Interest = $this->fetchInterest(
181+
$storeId,
182+
(string) $creditCardBinCard1->getCreditCardBin(),
183+
$customAmountValue,
184+
(int) $installmentSelectedCard1->getInstallmentSelected()
185+
);
186+
}
187+
152188
$amount -= $customAmountValue;
153-
$amount -= $currentInterest;
189+
$amount -= $card1Interest;
154190
}
155-
} else {
156-
$amount -= $currentInterest;
157191
}
158192

159-
160193
$amount = $this->configBase->formatPrice($amount);
161194

162-
if ($creditCardBin) {
195+
if ($creditCardBinValue) {
163196
$pagBankInterests = $this->consultInstallments->getPagBankInstallments(
164197
$storeId,
165-
$creditCardBin,
198+
$creditCardBinValue,
166199
$amount
167200
);
168201

169-
if (isset($pagBankInterests[$installmentSelected - 1])) {
170-
$installment = $pagBankInterests[$installmentSelected - 1];
202+
if (isset($pagBankInterests[$installmentSelectedValue - 1])) {
203+
$installment = $pagBankInterests[$installmentSelectedValue - 1];
171204
if (isset($installment['amount']['fees'])) {
172205
$interest = $installment['amount']['fees']['buyer']['interest']['total'];
173206
}
@@ -178,7 +211,7 @@ public function generatePagBankInterest(
178211

179212
try {
180213
if ($cardIndexValue === 2) {
181-
$interest += $currentInterest;
214+
$interest += $card1Interest;
182215
}
183216

184217
$quote->setData(InstallmentSelectedInterface::PAGBANK_INTEREST_AMOUNT, $interest);
@@ -190,4 +223,4 @@ public function generatePagBankInterest(
190223

191224
return $this->quoteTotalRepository->get($cartId);
192225
}
193-
}
226+
}

0 commit comments

Comments
 (0)