magento_community_Ebcomm_PaypalMx - Version 1.0.5

Version Notes

Este módulo es Compatible con las versiones de Magento: 1.8.0.0, 1.7.0.1 y 1.7.0.2

Download this release

Release Info

Developer Armando Martínez
Extension magento_community_Ebcomm_PaypalMx
Version 1.0.5
Comparing to
See all releases


Code changes from version 1.0.4 to 1.0.5

app/code/community/Ebcomm/PaypalMx/Block/Adminhtml/Settlement/Report/Grid.php CHANGED
@@ -65,7 +65,7 @@ class Ebcomm_PaypalMx_Block_Adminhtml_Settlement_Report_Grid extends Mage_Adminh
65
  'header' => $settlement->getFieldLabel('transaction_event'),
66
  'index' => 'transaction_event_code',
67
  'type' => 'options',
68
- 'options' => Mage::getModel('paypal/report_settlement_row')->getTransactionEvents()
69
  ));
70
  $this->addColumn('transaction_initiation_date', array(
71
  'header' => $settlement->getFieldLabel('transaction_initiation_date'),
65
  'header' => $settlement->getFieldLabel('transaction_event'),
66
  'index' => 'transaction_event_code',
67
  'type' => 'options',
68
+ 'options' => Mage::getModel('paypalmx/report_settlement_row')->getTransactionEvents()
69
  ));
70
  $this->addColumn('transaction_initiation_date', array(
71
  'header' => $settlement->getFieldLabel('transaction_initiation_date'),
app/code/community/Ebcomm/PaypalMx/Model/Ipn.php ADDED
@@ -0,0 +1,671 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * PayPal Instant Payment Notification processor model
4
+ */
5
+ class Ebcomm_PaypalMx_Model_Ipn
6
+ {
7
+ /**
8
+ * Default log filename
9
+ *
10
+ * @var string
11
+ */
12
+ const DEFAULT_LOG_FILE = 'paypalmx_unknown_ipn.log';
13
+
14
+ /*
15
+ * @param Mage_Sales_Model_Order
16
+ */
17
+ protected $_order = null;
18
+
19
+ /*
20
+ * Recurring profile instance
21
+ *
22
+ * @var Mage_Sales_Model_Recurring_Profile
23
+ */
24
+ protected $_recurringProfile = null;
25
+
26
+ /**
27
+ *
28
+ * @var Ebcomm_PaypalMx_Model_Config
29
+ */
30
+ protected $_config = null;
31
+
32
+ /**
33
+ * PayPal info instance
34
+ *
35
+ * @var Ebcomm_PaypalMx_Model_Info
36
+ */
37
+ protected $_info = null;
38
+
39
+ /**
40
+ * IPN request data
41
+ * @var array
42
+ */
43
+ protected $_request = array();
44
+
45
+ /**
46
+ * Collected debug information
47
+ *
48
+ * @var array
49
+ */
50
+ protected $_debugData = array();
51
+
52
+ /**
53
+ * IPN request data getter
54
+ *
55
+ * @param string $key
56
+ * @return array|string
57
+ */
58
+ public function getRequestData($key = null)
59
+ {
60
+ if (null === $key) {
61
+ return $this->_request;
62
+ }
63
+ return isset($this->_request[$key]) ? $this->_request[$key] : null;
64
+ }
65
+
66
+ /**
67
+ * Get ipn data, send verification to PayPal, run corresponding handler
68
+ *
69
+ * @param array $request
70
+ * @param Zend_Http_Client_Adapter_Interface $httpAdapter
71
+ * @throws Exception
72
+ */
73
+ public function processIpnRequest(array $request, Zend_Http_Client_Adapter_Interface $httpAdapter = null)
74
+ {
75
+ $this->_request = $request;
76
+ $this->_debugData = array('ipn' => $request);
77
+ ksort($this->_debugData['ipn']);
78
+
79
+ try {
80
+ if (isset($this->_request['txn_type']) && 'recurring_payment' == $this->_request['txn_type']) {
81
+ $this->_getRecurringProfile();
82
+ if ($httpAdapter) {
83
+ $this->_postBack($httpAdapter);
84
+ }
85
+ $this->_processRecurringProfile();
86
+ } else {
87
+ $this->_getOrder();
88
+ if ($httpAdapter) {
89
+ $this->_postBack($httpAdapter);
90
+ }
91
+ $this->_processOrder();
92
+ }
93
+ } catch (Exception $e) {
94
+ $this->_debugData['exception'] = $e->getMessage();
95
+ $this->_debug();
96
+ throw $e;
97
+ }
98
+ $this->_debug();
99
+ }
100
+
101
+ /**
102
+ * Post back to PayPal to check whether this request is a valid one
103
+ *
104
+ * @param Zend_Http_Client_Adapter_Interface $httpAdapter
105
+ */
106
+ protected function _postBack(Zend_Http_Client_Adapter_Interface $httpAdapter)
107
+ {
108
+ $sReq = '';
109
+ foreach ($this->_request as $k => $v) {
110
+ $sReq .= '&'.$k.'='.urlencode($v);
111
+ }
112
+ $sReq .= "&cmd=_notify-validate";
113
+ $sReq = substr($sReq, 1);
114
+ $this->_debugData['postback'] = $sReq;
115
+ $this->_debugData['postback_to'] = $this->_config->getPaypalUrl();
116
+
117
+ $httpAdapter->setConfig(array('verifypeer' => $this->_config->verifyPeer));
118
+ $httpAdapter->write(Zend_Http_Client::POST, $this->_config->getPaypalUrl(), '1.1', array(), $sReq);
119
+ try {
120
+ $response = $httpAdapter->read();
121
+ } catch (Exception $e) {
122
+ $this->_debugData['http_error'] = array('error' => $e->getMessage(), 'code' => $e->getCode());
123
+ throw $e;
124
+ }
125
+ $this->_debugData['postback_result'] = $response;
126
+
127
+ $response = preg_split('/^\r?$/m', $response, 2);
128
+ $response = trim($response[1]);
129
+ if ($response != 'VERIFIED') {
130
+ throw new Exception('PayPal IPN postback failure. See ' . self::DEFAULT_LOG_FILE . ' for details.');
131
+ }
132
+ unset($this->_debugData['postback'], $this->_debugData['postback_result']);
133
+ }
134
+
135
+ /**
136
+ * Load and validate order, instantiate proper configuration
137
+ *
138
+ *
139
+ * @return Mage_Sales_Model_Order
140
+ * @throws Exception
141
+ */
142
+ protected function _getOrder()
143
+ {
144
+ if (empty($this->_order)) {
145
+ // get proper order
146
+ $id = $this->_request['invoice'];
147
+ $this->_order = Mage::getModel('sales/order')->loadByIncrementId($id);
148
+ if (!$this->_order->getId()) {
149
+ $this->_debugData['exception'] = sprintf('Wrong order ID: "%s".', $id);
150
+ $this->_debug();
151
+ Mage::app()->getResponse()
152
+ ->setHeader('HTTP/1.1','503 Service Unavailable')
153
+ ->sendResponse();
154
+ exit;
155
+ }
156
+ // re-initialize config with the method code and store id
157
+ $methodCode = $this->_order->getPayment()->getMethod();
158
+ $this->_config = Mage::getModel('paypalmx/config', array($methodCode, $this->_order->getStoreId()));
159
+ if (!$this->_config->isMethodActive($methodCode) || !$this->_config->isMethodAvailable()) {
160
+ throw new Exception(sprintf('Method "%s" is not available.', $methodCode));
161
+ }
162
+
163
+ $this->_verifyOrder();
164
+ }
165
+ return $this->_order;
166
+ }
167
+
168
+ /**
169
+ * Load recurring profile
170
+ *
171
+ * @return Mage_Sales_Model_Recurring_Profile
172
+ * @throws Exception
173
+ */
174
+ protected function _getRecurringProfile()
175
+ {
176
+ if (empty($this->_recurringProfile)) {
177
+ // get proper recurring profile
178
+ $internalReferenceId = $this->_request['rp_invoice_id'];
179
+ $this->_recurringProfile = Mage::getModel('sales/recurring_profile')
180
+ ->loadByInternalReferenceId($internalReferenceId);
181
+ if (!$this->_recurringProfile->getId()) {
182
+ throw new Exception(
183
+ sprintf('Wrong recurring profile INTERNAL_REFERENCE_ID: "%s".', $internalReferenceId)
184
+ );
185
+ }
186
+ // re-initialize config with the method code and store id
187
+ $methodCode = $this->_recurringProfile->getMethodCode();
188
+ $this->_config = Mage::getModel(
189
+ 'paypalmx/config', array($methodCode, $this->_recurringProfile->getStoreId())
190
+ );
191
+ if (!$this->_config->isMethodActive($methodCode) || !$this->_config->isMethodAvailable()) {
192
+ throw new Exception(sprintf('Method "%s" is not available.', $methodCode));
193
+ }
194
+ }
195
+ return $this->_recurringProfile;
196
+ }
197
+
198
+ /**
199
+ * Validate incoming request data, as PayPal recommends
200
+ *
201
+ * @throws Exception
202
+ * @link https://cms.paypal.com/cgi-bin/marketingweb?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro
203
+ */
204
+ protected function _verifyOrder()
205
+ {
206
+ // verify merchant email intended to receive notification
207
+ $merchantEmail = $this->_config->businessAccount;
208
+ if ($merchantEmail) {
209
+ $receiverEmail = $this->getRequestData('business');
210
+ if (!$receiverEmail) {
211
+ $receiverEmail = $this->getRequestData('receiver_email');
212
+ }
213
+ if (strtolower($merchantEmail) != strtolower($receiverEmail)) {
214
+ throw new Exception(
215
+ sprintf(
216
+ 'Requested %s and configured %s merchant emails do not match.', $receiverEmail, $merchantEmail
217
+ )
218
+ );
219
+ }
220
+ }
221
+ }
222
+
223
+ /**
224
+ * IPN workflow implementation
225
+ * Everything should be added to order comments. In positive processing cases customer will get email notifications.
226
+ * Admin will be notified on errors.
227
+ */
228
+ protected function _processOrder()
229
+ {
230
+ $this->_order = null;
231
+ $this->_getOrder();
232
+
233
+ $this->_info = Mage::getSingleton('paypal/info');
234
+ try {
235
+ // handle payment_status
236
+ $paymentStatus = $this->_filterPaymentStatus($this->_request['payment_status']);
237
+
238
+ switch ($paymentStatus) {
239
+ // paid
240
+ case Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_COMPLETED:
241
+ $this->_registerPaymentCapture();
242
+ break;
243
+
244
+ // the holded payment was denied on paypal side
245
+ case Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_DENIED:
246
+ $this->_registerPaymentDenial();
247
+ break;
248
+
249
+ // customer attempted to pay via bank account, but failed
250
+ case Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_FAILED:
251
+ // cancel order
252
+ $this->_registerPaymentFailure();
253
+ break;
254
+
255
+ // refund forced by PayPal
256
+ case Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_REVERSED: // break is intentionally omitted
257
+ case Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_UNREVERSED: // or returned back :)
258
+ $this->_registerPaymentReversal();
259
+ break;
260
+
261
+ // refund by merchant on PayPal side
262
+ case Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_REFUNDED:
263
+ $this->_registerPaymentRefund();
264
+ break;
265
+
266
+ // payment was obtained, but money were not captured yet
267
+ case Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_PENDING:
268
+ $this->_registerPaymentPending();
269
+ break;
270
+
271
+ // MassPayments success
272
+ case Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_PROCESSED:
273
+ $this->_registerMasspaymentsSuccess();
274
+ break;
275
+
276
+ // authorization expire/void
277
+ case Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_EXPIRED: // break is intentionally omitted
278
+ case Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_VOIDED:
279
+ $this->_registerPaymentVoid();
280
+ break;
281
+
282
+ default:
283
+ throw new Exception("Cannot handle payment status '{$paymentStatus}'.");
284
+ }
285
+ } catch (Mage_Core_Exception $e) {
286
+ $comment = $this->_createIpnComment(Mage::helper('paypal')->__('Note: %s', $e->getMessage()), true);
287
+ $comment->save();
288
+ throw $e;
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Process notification from recurring profile payments
294
+ */
295
+ protected function _processRecurringProfile()
296
+ {
297
+ $this->_recurringProfile = null;
298
+ $this->_getRecurringProfile();
299
+
300
+ try {
301
+ // handle payment_status
302
+ $paymentStatus = $this->_filterPaymentStatus($this->_request['payment_status']);
303
+
304
+ switch ($paymentStatus) {
305
+ // paid
306
+ case Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_COMPLETED:
307
+ $this->_registerRecurringProfilePaymentCapture();
308
+ break;
309
+
310
+ default:
311
+ throw new Exception("Cannot handle payment status '{$paymentStatus}'.");
312
+ }
313
+ } catch (Mage_Core_Exception $e) {
314
+ // TODO: add to payment profile comments
315
+ // $comment = $this->_createIpnComment(Mage::helper('paypal')->__('Note: %s', $e->getMessage()), true);
316
+ // $comment->save();
317
+ throw $e;
318
+ }
319
+ }
320
+
321
+ /**
322
+ * Register recurring payment notification, create and process order
323
+ */
324
+ protected function _registerRecurringProfilePaymentCapture()
325
+ {
326
+ $price = $this->getRequestData('mc_gross') - $this->getRequestData('tax') - $this->getRequestData('shipping');
327
+ $productItemInfo = new Varien_Object;
328
+ $type = trim($this->getRequestData('period_type'));
329
+ if ($type == 'Trial') {
330
+ $productItemInfo->setPaymentType(Mage_Sales_Model_Recurring_Profile::PAYMENT_TYPE_TRIAL);
331
+ } elseif ($type == 'Regular') {
332
+ $productItemInfo->setPaymentType(Mage_Sales_Model_Recurring_Profile::PAYMENT_TYPE_REGULAR);
333
+ }
334
+ $productItemInfo->setTaxAmount($this->getRequestData('tax'));
335
+ $productItemInfo->setShippingAmount($this->getRequestData('shipping'));
336
+ $productItemInfo->setPrice($price);
337
+
338
+ $order = $this->_recurringProfile->createOrder($productItemInfo);
339
+
340
+ $payment = $order->getPayment();
341
+ $payment->setTransactionId($this->getRequestData('txn_id'))
342
+ ->setPreparedMessage($this->_createIpnComment(''))
343
+ ->setIsTransactionClosed(0);
344
+ $order->save();
345
+ $this->_recurringProfile->addOrderRelation($order->getId());
346
+ $payment->registerCaptureNotification($this->getRequestData('mc_gross'));
347
+ $order->save();
348
+
349
+ // notify customer
350
+ if ($invoice = $payment->getCreatedInvoice()) {
351
+ $message = Mage::helper('paypal')->__('Notified customer about invoice #%s.', $invoice->getIncrementId());
352
+ $comment = $order->sendNewOrderEmail()->addStatusHistoryComment($message)
353
+ ->setIsCustomerNotified(true)
354
+ ->save();
355
+ }
356
+ }
357
+
358
+ /**
359
+ * Process completed payment (either full or partial)
360
+ */
361
+ protected function _registerPaymentCapture()
362
+ {
363
+ if ($this->getRequestData('transaction_entity') == 'auth') {
364
+ return;
365
+ }
366
+ $this->_importPaymentInformation();
367
+ $payment = $this->_order->getPayment();
368
+ $payment->setTransactionId($this->getRequestData('txn_id'))
369
+ ->setPreparedMessage($this->_createIpnComment(''))
370
+ ->setParentTransactionId($this->getRequestData('parent_txn_id'))
371
+ ->setShouldCloseParentTransaction('Completed' === $this->getRequestData('auth_status'))
372
+ ->setIsTransactionClosed(0)
373
+ ->registerCaptureNotification($this->getRequestData('mc_gross'));
374
+ $this->_order->save();
375
+
376
+ // notify customer
377
+ $invoice = $payment->getCreatedInvoice();
378
+ if ($invoice && !$this->_order->getEmailSent()) {
379
+ $this->_order->sendNewOrderEmail()->addStatusHistoryComment(
380
+ Mage::helper('paypal')->__('Notified customer about invoice #%s.', $invoice->getIncrementId())
381
+ )
382
+ ->setIsCustomerNotified(true)
383
+ ->save();
384
+ }
385
+ }
386
+
387
+ /**
388
+ * Process denied payment notification
389
+ */
390
+ protected function _registerPaymentDenial()
391
+ {
392
+ $this->_importPaymentInformation();
393
+ $this->_order->getPayment()
394
+ ->setTransactionId($this->getRequestData('txn_id'))
395
+ ->setNotificationResult(true)
396
+ ->setIsTransactionClosed(true)
397
+ ->registerPaymentReviewAction(Mage_Sales_Model_Order_Payment::REVIEW_ACTION_DENY, false);
398
+ $this->_order->save();
399
+ }
400
+
401
+ /**
402
+ * Treat failed payment as order cancellation
403
+ */
404
+ protected function _registerPaymentFailure()
405
+ {
406
+ $this->_importPaymentInformation();
407
+ $this->_order
408
+ ->registerCancellation($this->_createIpnComment(''), false)
409
+ ->save();
410
+ }
411
+
412
+ /**
413
+ * Process a refund or a chargeback
414
+ */
415
+ protected function _registerPaymentRefund()
416
+ {
417
+ $this->_importPaymentInformation();
418
+ $reason = $this->getRequestData('reason_code');
419
+ $isRefundFinal = !$this->_info->isReversalDisputable($reason);
420
+ $payment = $this->_order->getPayment()
421
+ ->setPreparedMessage($this->_createIpnComment($this->_info->explainReasonCode($reason)))
422
+ ->setTransactionId($this->getRequestData('txn_id'))
423
+ ->setParentTransactionId($this->getRequestData('parent_txn_id'))
424
+ ->setIsTransactionClosed($isRefundFinal)
425
+ ->registerRefundNotification(-1 * $this->getRequestData('mc_gross'));
426
+ $this->_order->save();
427
+
428
+ // TODO: there is no way to close a capture right now
429
+
430
+ if ($creditmemo = $payment->getCreatedCreditmemo()) {
431
+ $creditmemo->sendEmail();
432
+ $comment = $this->_order->addStatusHistoryComment(
433
+ Mage::helper('paypal')->__('Notified customer about creditmemo #%s.', $creditmemo->getIncrementId())
434
+ )
435
+ ->setIsCustomerNotified(true)
436
+ ->save();
437
+ }
438
+ }
439
+
440
+ /**
441
+ * Process payment reversal notification
442
+ */
443
+ protected function _registerPaymentReversal()
444
+ {
445
+ /**
446
+ * PayPal may send such payment status when triggered IPR denial
447
+ * Note that this check is done on the old payment info object, before importing new payment information
448
+ */
449
+ if ($this->_info->isPaymentReviewRequired($this->_order->getPayment())) {
450
+ $this->_registerPaymentDenial();
451
+ return;
452
+ }
453
+
454
+ if ('chargeback_reimbursement' == $this->getRequestData('reason_code')) {
455
+ // TODO: chargebacks reversals are not implemented
456
+ return;
457
+ }
458
+
459
+ // treat as a usual charegeback
460
+ $this->_registerPaymentRefund();
461
+ }
462
+
463
+ /**
464
+ * Process payment pending notification
465
+ *
466
+ * @throws Exception
467
+ */
468
+ public function _registerPaymentPending()
469
+ {
470
+ $reason = $this->getRequestData('pending_reason');
471
+ if ('authorization' === $reason) {
472
+ $this->_registerPaymentAuthorization();
473
+ return;
474
+ }
475
+ if ('order' === $reason) {
476
+ throw new Exception('The "order" authorizations are not implemented.');
477
+ }
478
+
479
+ // case when was placed using PayPal standard
480
+ if (Mage_Sales_Model_Order::STATE_PENDING_PAYMENT == $this->_order->getState()) {
481
+ $this->_registerPaymentCapture();
482
+ return;
483
+ }
484
+
485
+ $this->_importPaymentInformation();
486
+
487
+ $this->_order->getPayment()
488
+ ->setPreparedMessage($this->_createIpnComment($this->_info->explainPendingReason($reason)))
489
+ ->setTransactionId($this->getRequestData('txn_id'))
490
+ ->setIsTransactionClosed(0)
491
+ ->registerPaymentReviewAction(Mage_Sales_Model_Order_Payment::REVIEW_ACTION_UPDATE, false);
492
+ $this->_order->save();
493
+ }
494
+
495
+ /**
496
+ * Register authorized payment
497
+ */
498
+ protected function _registerPaymentAuthorization()
499
+ {
500
+ $this->_importPaymentInformation();
501
+
502
+ $this->_order->getPayment()
503
+ ->setPreparedMessage($this->_createIpnComment(''))
504
+ ->setTransactionId($this->getRequestData('txn_id'))
505
+ ->setParentTransactionId($this->getRequestData('parent_txn_id'))
506
+ ->setIsTransactionClosed(0)
507
+ ->registerAuthorizationNotification($this->getRequestData('mc_gross'));
508
+ if (!$this->_order->getEmailSent()) {
509
+ $this->_order->sendNewOrderEmail();
510
+ }
511
+ $this->_order->save();
512
+ }
513
+
514
+ /**
515
+ * Process voided authorization
516
+ */
517
+ protected function _registerPaymentVoid()
518
+ {
519
+ $this->_importPaymentInformation();
520
+
521
+ $parentTxnId = $this->getRequestData('transaction_entity') == 'auth'
522
+ ? $this->getRequestData('txn_id') : $this->getRequestData('parent_txn_id');
523
+
524
+ $this->_order->getPayment()
525
+ ->setPreparedMessage($this->_createIpnComment(''))
526
+ ->setParentTransactionId($parentTxnId)
527
+ ->registerVoidNotification();
528
+
529
+ $this->_order->save();
530
+ }
531
+
532
+ /**
533
+ * TODO
534
+ * The status "Processed" is used when all Masspayments are successful
535
+ */
536
+ protected function _registerMasspaymentsSuccess()
537
+ {
538
+ $comment = $this->_createIpnComment('', true);
539
+ $comment->save();
540
+ }
541
+
542
+ /**
543
+ * Generate an "IPN" comment with additional explanation.
544
+ * Returns the generated comment or order status history object
545
+ *
546
+ * @param string $comment
547
+ * @param bool $addToHistory
548
+ * @return string|Mage_Sales_Model_Order_Status_History
549
+ */
550
+ protected function _createIpnComment($comment = '', $addToHistory = false)
551
+ {
552
+ $paymentStatus = $this->getRequestData('payment_status');
553
+ $message = Mage::helper('paypal')->__('IPN "%s".', $paymentStatus);
554
+ if ($comment) {
555
+ $message .= ' ' . $comment;
556
+ }
557
+ if ($addToHistory) {
558
+ $message = $this->_order->addStatusHistoryComment($message);
559
+ $message->setIsCustomerNotified(null);
560
+ }
561
+ return $message;
562
+ }
563
+
564
+ /**
565
+ * Map payment information from IPN to payment object
566
+ * Returns true if there were changes in information
567
+ *
568
+ * @param Mage_Payment_Model_Info $payment
569
+ * @return bool
570
+ */
571
+ protected function _importPaymentInformation()
572
+ {
573
+ $payment = $this->_order->getPayment();
574
+ $was = $payment->getAdditionalInformation();
575
+
576
+ // collect basic information
577
+ $from = array();
578
+ foreach (array(
579
+ Ebcomm_PaypalMx_Model_Info::PAYER_ID,
580
+ 'payer_email' => Ebcomm_PaypalMx_Model_Info::PAYER_EMAIL,
581
+ Ebcomm_PaypalMx_Model_Info::PAYER_STATUS,
582
+ Ebcomm_PaypalMx_Model_Info::ADDRESS_STATUS,
583
+ Ebcomm_PaypalMx_Model_Info::PROTECTION_EL,
584
+ Ebcomm_PaypalMx_Model_Info::PAYMENT_STATUS,
585
+ Ebcomm_PaypalMx_Model_Info::PENDING_REASON,
586
+ ) as $privateKey => $publicKey) {
587
+ if (is_int($privateKey)) {
588
+ $privateKey = $publicKey;
589
+ }
590
+ $value = $this->getRequestData($privateKey);
591
+ if ($value) {
592
+ $from[$publicKey] = $value;
593
+ }
594
+ }
595
+ if (isset($from['payment_status'])) {
596
+ $from['payment_status'] = $this->_filterPaymentStatus($this->getRequestData('payment_status'));
597
+ }
598
+
599
+ // collect fraud filters
600
+ $fraudFilters = array();
601
+ for ($i = 1; $value = $this->getRequestData("fraud_management_pending_filters_{$i}"); $i++) {
602
+ $fraudFilters[] = $value;
603
+ }
604
+ if ($fraudFilters) {
605
+ $from[Ebcomm_PaypalMx_Model_Info::FRAUD_FILTERS] = $fraudFilters;
606
+ }
607
+
608
+ $this->_info->importToPayment($from, $payment);
609
+
610
+ /**
611
+ * Detect pending payment, frauds
612
+ * TODO: implement logic in one place
613
+ * @see Ebcomm_PaypalMx_Model_Pro::importPaymentInfo()
614
+ */
615
+ if ($this->_info->isPaymentReviewRequired($payment)) {
616
+ $payment->setIsTransactionPending(true);
617
+ if ($fraudFilters) {
618
+ $payment->setIsFraudDetected(true);
619
+ }
620
+ }
621
+ if ($this->_info->isPaymentSuccessful($payment)) {
622
+ $payment->setIsTransactionApproved(true);
623
+ } elseif ($this->_info->isPaymentFailed($payment)) {
624
+ $payment->setIsTransactionDenied(true);
625
+ }
626
+
627
+ return $was != $payment->getAdditionalInformation();
628
+ }
629
+
630
+ /**
631
+ * Filter payment status from NVP into paypal/info format
632
+ *
633
+ * @param string $ipnPaymentStatus
634
+ * @return string
635
+ */
636
+ protected function _filterPaymentStatus($ipnPaymentStatus)
637
+ {
638
+ switch ($ipnPaymentStatus) {
639
+ case 'Created': // break is intentionally omitted
640
+ case 'Completed': return Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_COMPLETED;
641
+ case 'Denied': return Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_DENIED;
642
+ case 'Expired': return Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_EXPIRED;
643
+ case 'Failed': return Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_FAILED;
644
+ case 'Pending': return Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_PENDING;
645
+ case 'Refunded': return Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_REFUNDED;
646
+ case 'Reversed': return Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_REVERSED;
647
+ case 'Canceled_Reversal': return Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_UNREVERSED;
648
+ case 'Processed': return Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_PROCESSED;
649
+ case 'Voided': return Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_VOIDED;
650
+ }
651
+ return '';
652
+ // documented in NVP, but not documented in IPN:
653
+ //Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_NONE
654
+ //Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_INPROGRESS
655
+ //Ebcomm_PaypalMx_Model_Info::PAYMENTSTATUS_REFUNDEDPART
656
+ }
657
+
658
+ /**
659
+ * Log debug data to file
660
+ *
661
+ * @param mixed $debugData
662
+ */
663
+ protected function _debug()
664
+ {
665
+ if ($this->_config && $this->_config->debug) {
666
+ $file = $this->_config->getMethodCode() ? "payment_{$this->_config->getMethodCode()}.log"
667
+ : self::DEFAULT_LOG_FILE;
668
+ Mage::getModel('core/log_adapter', $file)->log($this->_debugData);
669
+ }
670
+ }
671
+ }
app/code/community/Ebcomm/PaypalMx/controllers/IpnController.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Ebcomm_PaypalMx_IpnController extends Mage_Core_Controller_Front_Action
4
+ {
5
+ /**
6
+ * Instantiate IPN model and pass IPN request to it
7
+ */
8
+ public function indexAction()
9
+ {
10
+ if (!$this->getRequest()->isPost()) {
11
+ return;
12
+ }
13
+
14
+ try {
15
+ $data = $this->getRequest()->getPost();
16
+ Mage::getModel('paypalmx/ipn')->processIpnRequest($data, new Varien_Http_Adapter_Curl());
17
+ } catch (Exception $e) {
18
+ Mage::logException($e);
19
+ }
20
+ }
21
+ }
app/code/community/Ebcomm/PaypalMx/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <Ebcomm_PaypalMx>
5
- <version>1.0.4</version>
6
  </Ebcomm_PaypalMx>
7
  </modules>
8
  <global>
2
  <config>
3
  <modules>
4
  <Ebcomm_PaypalMx>
5
+ <version>1.0.5</version>
6
  </Ebcomm_PaypalMx>
7
  </modules>
8
  <global>
app/etc/modules/Ebcomm_PaypalMx.xml CHANGED
@@ -4,7 +4,7 @@
4
  <Ebcomm_PaypalMx>
5
  <active>true</active>
6
  <codePool>community</codePool>
7
- <version>1.0.4</version>
8
  </Ebcomm_PaypalMx>
9
  </modules>
10
  </config>
4
  <Ebcomm_PaypalMx>
5
  <active>true</active>
6
  <codePool>community</codePool>
7
+ <version>1.0.5</version>
8
  </Ebcomm_PaypalMx>
9
  </modules>
10
  </config>
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>magento_community_Ebcomm_PaypalMx</name>
4
- <version>1.0.4</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">OSL v3.0</license>
7
  <channel>community</channel>
@@ -73,9 +73,9 @@ pago r&#xE1;pida, f&#xE1;cil y confiable. Entre sus caracter&#xED;sticas destaca
73
  &#x2022; Se integra a la perfecci&#xF3;n con los sistemas de back-office y back-end a la perfecci&#xF3;n.</description>
74
  <notes>Este m&#xF3;dulo es Compatible con las versiones de Magento: 1.8.0.0, 1.7.0.1 y 1.7.0.2</notes>
75
  <authors><author><name>Armando Mart&#xED;nez</name><user>jorgearmando</user><email>jmartinez@ebcomm.mx</email></author><author><name>Ebcomm</name><user>Ebcomm</user><email>soporte@ebcomm.mx</email></author></authors>
76
- <date>2014-04-01</date>
77
- <time>16:58:02</time>
78
- <contents><target name="magecommunity"><dir name="Ebcomm"><dir name="PaypalMx"><dir name="Block"><dir name="Adminhtml"><dir name="Settlement"><dir name="Details"><file name="Form.php" hash="b4cd66af4231bb4ba9bca8d75cc913c2"/></dir><file name="Details.php" hash="c721bb4e2f17fa2a805f4de2f2289888"/><dir name="Report"><file name="Grid.php" hash="776efd4bd4d87e16df77cf92db18cf0e"/></dir><file name="Report.php" hash="8850ee51b7773debbb58d14c65437ece"/></dir><dir name="System"><dir name="Config"><file name="ApiWizard.php" hash="80e5ae8798ab6bab3c81ee5cf376d5c2"/><dir name="Field"><file name="Country.php" hash="87db0dbbe10b34d2de7864b1d03a0b88"/><file name="Hidden.php" hash="40b17e389a0aee746592d8f4e1624979"/></dir><dir name="Fieldset"><file name="Expanded.php" hash="099556f3e484638c9facd35604ec7225"/><file name="Global.php" hash="94559f302e2fd22734e32423a279fe14"/><file name="Group.php" hash="7171fda706718a838710733b3105fa65"/><file name="Hint.php" hash="bf7ba7e966d4a223fb7e5f4180111bbe"/><file name="Location.php" hash="7ea802ee66868fb8a32f596593b07426"/><file name="Payment.php" hash="a751fd1ff644462985bf35f03444df89"/><file name="Store.php" hash="22d54bea1a5c0306828013584c5668af"/></dir><dir name="Payflowlink"><file name="Advanced.php" hash="5dd3ca0839dc4ccd2b2a61768fb519d1"/><file name="Info.php" hash="22882a71b671aa7364e52b46c83a8242"/></dir></dir></dir></dir><dir name="Debito"><file name="Form.php" hash="fa3ee77484ecaa5999f0acdf97959b6f"/><dir name="Review"><file name="Billing.php" hash="4d7f23048b18b1b8ad3317773f4f1e40"/><file name="Details.php" hash="15d86be5b2afa3023c78e33fb63d0857"/><file name="Shipping.php" hash="2b4223451ad0215b3a036bbe6c62debd"/></dir><file name="Review.php" hash="c6966f89d147619f604893d625e75dad"/></dir><dir name="Debito2"><file name="Form.php" hash="d85b3704a56cb3b285dd032845cba513"/><dir name="Review"><file name="Billing.php" hash="e2bc5486e487b391526a4305c73189a2"/><file name="Details.php" hash="446c6f3aa23ba5fccd834191d4816870"/><file name="Shipping.php" hash="5f4c83a6de3f9eacbe82879655ea97de"/></dir><file name="Review.php" hash="d5beca27a2dfd637404f6c3de88dc2f5"/><file name="Shortcut.php" hash="9201b9ce21345d4063011b72505cc230"/></dir><dir name="Express"><file name="Form.php" hash="7d043afe5a31007d4825b459c7f89190"/><dir name="Review"><file name="Billing.php" hash="4d7f23048b18b1b8ad3317773f4f1e40"/><file name="Details.php" hash="15d86be5b2afa3023c78e33fb63d0857"/><file name="Shipping.php" hash="2b4223451ad0215b3a036bbe6c62debd"/></dir><file name="Review.php" hash="7abd308b3b9aea48b69331bb2a7e5b2c"/><file name="Shortcut.php" hash="f19e8f442446a73e2d5fef93bd47c374"/></dir><dir name="Hosted"><dir name="Pro"><file name="Form.php" hash="ce858564fcd9897787bc37653b4888cb"/><file name="Iframe.php" hash="fc2d5870d207bb7205754298908c7a62"/><file name="Info.php" hash="c1aa1a0a39e0bebc0c2bac41f1761350"/></dir></dir><file name="Iframe.php" hash="578b47d39e498419be4e6c83b089f235"/><file name="Logo.php" hash="60aa0464029a82d100b6c0f7bd20e460"/><dir name="Mensualidades"><file name="Form.php" hash="3cf8338a8e89081449b2ac51f8f780ff"/><dir name="Review"><file name="Billing.php" hash="4d7f23048b18b1b8ad3317773f4f1e40"/><file name="Details.php" hash="15d86be5b2afa3023c78e33fb63d0857"/><file name="Shipping.php" hash="2b4223451ad0215b3a036bbe6c62debd"/></dir><file name="Review.php" hash="33cadd7774a17a29239f6d8722b8f57b"/></dir><dir name="Mensualidades2"><file name="Form.php" hash="3f5d31397e8eb63f5226d094a6d47331"/><dir name="Review"><file name="Billing.php" hash="6b5d7fa2eeb2518c295e56b8b2e9bf1e"/><file name="Details.php" hash="04fbfc8d7f54a0e06414c042b0670718"/><file name="Shipping.php" hash="5f4c83a6de3f9eacbe82879655ea97de"/></dir><file name="Review.php" hash="da02b2f12f8662c38388672dbf76fa14"/><file name="Shortcut.php" hash="289dc02f278629a2dc0cefba518cf172"/></dir><dir name="Payflow"><dir name="Advanced"><file name="Form.php" hash="927010606fe5fced1403d6ef58d3c270"/><file name="Iframe.php" hash="27d0fc56829f2c75b293df2e5e4650ab"/><file name="Info.php" hash="42d47a2b51ce4776f969ea5c72fd255e"/><file name="Review.php" hash="2714529f5662538bf847f0ed2e66bd41"/></dir><dir name="Link"><file name="Form.php" hash="f778d0aeee9c7b39931c0c135ae92003"/><file name="Iframe.php" hash="3c089c9890fc32657dc9fcaf126b9528"/><file name="Info.php" hash="420577d8a045b35691b7477915a147b3"/><file name="Review.php" hash="8f786f27ab15e61ddaaec8da98ac9c35"/></dir></dir><dir name="Payment"><file name="Info.php" hash="2cd023036a62048968e932dad6796b66"/></dir><dir name="Standard"><file name="Form.php" hash="f3ad173d8ba39b04dff8e2370eda5fa2"/><file name="Redirect.php" hash="542276cef580745aedca25069183d391"/></dir></dir><dir name="Controller"><dir name="Express"><file name="Abstract.php" hash="ea133b7e8507dd763f0816dd40c9cb4d"/></dir></dir><dir name="Helper"><file name="Data.php" hash="db302f1b6a260a8c782f02dd12ee478d"/><file name="Hss.php" hash="c410266e64be391558b9ff8e143326fb"/></dir><dir name="Model"><dir name="Api"><file name="Abstract.php" hash="08923700aba3c615280c4504a1ce81ad"/><file name="Nvp.php" hash="ef24fccac541c0da88093fdf686288e3"/><file name="Standard.php" hash="b96bf939bfa415b12388955077080bfc"/></dir><file name="Cart.php" hash="3b864c26f735143475b2f0615333d893"/><file name="Config.php" hash="9c72fc35fcd1747a980b26f92e04f862"/><dir name="Debito2"><file name="Checkout.php" hash="a903481cacf3c1adb87e7c56cc2084a0"/></dir><file name="Debito2.php" hash="b65a1e2f39d588dc70fa1bf688c23a7f"/><dir name="Express"><file name="Checkout.php" hash="c882c7a145cb3801c8222f4efd935a62"/></dir><file name="Express.php" hash="c60d7452da8b7bbf9d9ecee9fa81d037"/><file name="Info.php" hash="520ad9cbdd7dd4fa8d07dd9005d87d22"/><dir name="Mensualidades2"><file name="Checkout.php" hash="31a5a6fa6e664ef188da7723b7b7b1fc"/></dir><file name="Mensualidades2.php" hash="4bf49b042828316deb7e2715dc89b9d3"/><file name="Observer.php" hash="407d9e755edc91d063a42839a5074f36"/><file name="Pro.php" hash="de3a2f57cf5a002b4f9d586cad26c2e8"/><dir name="Report"><dir name="Settlement"><file name="Row.php" hash="3f592ab9955c8d6a0de4fd6f62261bdd"/></dir><file name="Settlement.php" hash="2691c26ef9cf5d8c3975142a0b586954"/></dir><dir name="Resource"><file name="Cert.php" hash="64f2ff21ad23f68923602d867be75f95"/><dir name="Payment"><dir name="Transaction"><file name="Collection.php" hash="cbf6b54fe1a27fcd7244c6812b7dfcc5"/></dir><file name="Transaction.php" hash="55ba2006e21cdbd346eac74fe9539d2b"/></dir><dir name="Report"><dir name="Settlement"><dir name="Row"><file name="Collection.php" hash="8ece691160ad67e9e978579d2115002e"/></dir><file name="Row.php" hash="1eeaca503f403f134aab6d4dcb10f6ff"/></dir><file name="Settlement.php" hash="5b33161db3930ac991e2085c65ba771c"/></dir><file name="Setup.php" hash="7b15a771edebf6c6537cf178a666723b"/></dir><file name="Session.php" hash="ab58cd4c8d5d4e2859c666c27f956828"/><dir name="System"><dir name="Config"><dir name="Backend"><file name="Cert.php" hash="8ffbb08021ca8a4ce58803d65e3bd735"/><file name="Cron.php" hash="a12543a814ef2ef2e24fe198e5f5700e"/><file name="MerchantCountry.php" hash="5bece6129577d833bdb86f52562af327"/></dir><dir name="Source"><file name="AuthorizationAmounts.php" hash="c7bc73f81cba80fa18980e49943eeae6"/><file name="BuyerCountry.php" hash="ee6578ea63adb780e1984e14103c40b1"/><file name="FetchingSchedule.php" hash="ae16dad27d4612b8c1e06600891ac801"/><file name="Logo.php" hash="b27ffbe0531bccc37c35f24d3cfd5377"/><file name="MerchantCountry.php" hash="3bb1fd8d8724df3b1b8e6ca850f8f4ff"/><dir name="PaymentActions"><file name="Express.php" hash="ac1a4ec817571dc2cfec035e588f296d"/></dir><file name="PaymentActions.php" hash="658d1257015b76f4b20726cbc2f65381"/><file name="RequireBillingAddress.php" hash="beb69ae978a1ad00aa7bc153ce1faf54"/><file name="UrlMethod.php" hash="3537462618e67f6ed30f149a83ab3978"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Paypal"><file name="ReportssController.php" hash="be81a61a7a8c1c641040479a2a1f311f"/></dir></dir><file name="ExpressController.php" hash="5cdf754a2f6d50c06724a9e2b46419d0"/></dir><dir name="etc"><file name="adminhtml.xml" hash="2d1d1903c172a3cc49144d932922472e"/><file name="config.xml" hash="4400c12a3b38c4e6090a88083703a25c"/><file name="system.xml" hash="2baea251939e41bbbb940247e479df7e"/></dir><dir name="sql"><dir name="paypal_setup"><file name="install-1.6.0.0.php" hash="b2469041739bf8e14fd0966400a22c07"/><file name="mysql4-install-0.7.0.php" hash="25fcdc3e2c1c6269aaa418be249b2d9f"/><file name="mysql4-install-1.4.0.0.php" hash="f42c5ef6ac5567f2d1f6f4c15263ea74"/><file name="mysql4-upgrade-0.7.1-0.7.2.php" hash="d6a61cfed1b9816441d043dd880e8238"/><file name="mysql4-upgrade-0.7.2-0.7.3.php" hash="1716deec69cbf7fa949558a76fa43fd1"/><file name="mysql4-upgrade-1.4.0.0-1.4.0.1.php" hash="e624edb8630883dd02b4b51662dc331b"/><file name="mysql4-upgrade-1.4.0.1-1.4.0.2.php" hash="38089d012488add3dfebb8257561f113"/><file name="mysql4-upgrade-1.5.9.9-1.6.0.0.php" hash="97953cf10dad2b87ed38a3e16fa10ca5"/><file name="upgrade-1.6.0.0-1.6.0.1.php" hash="145024349ddf84b2beab0f5f0f6d64a2"/><file name="upgrade-1.6.0.1-1.6.0.2.php" hash="370588e330f0a311fbd543cb31a182bb"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="paypalmx"><dir name="system"><dir name="config"><file name="api_wizard.phtml" hash="6a5528fd5e0f05894b304bef308f5393"/><dir name="fieldset"><file name="global.phtml" hash="9782420769b39409c72b4248dc8bf9f3"/><file name="store.phtml" hash="f05eed8334cc4d25b3f767e330763cf4"/></dir><dir name="payflowlink"><file name="advanced.phtml" hash="50928244065ad54cc7e2ec921dd3f261"/><file name="info.phtml" hash="5db2cff1d753f822a72ab07bdee9c4a8"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="paypalmx.xml" hash="61434c3d35ecca74433f0cd511498c10"/></dir><dir name="template"><dir name="paypalmx"><dir name="express"><dir name="review"><file name="address.phtml" hash="f274e591956f2277608bebf62fa2b6b9"/><file name="details.phtml" hash="f3a7b01960a0a1ffbce627de81ddbaa5"/><dir name="shipping"><file name="method.phtml" hash="b3d255b8567f88996b2ed7cc36895a6e"/></dir></dir><file name="review.phtml" hash="0b838e121a183836b92b9e14b6cf46f1"/><file name="shortcut.phtml" hash="15ebec4b34f2df23807be71fd2579165"/></dir><dir name="hss"><file name="form.phtml" hash="7988a2afc2f851631223b2db66e1b064"/><file name="iframe.phtml" hash="dbb2b3fbf4ffa17b9e7fac30d996bf3f"/><file name="info.phtml" hash="0422558db314c49361ffa4e1486673b4"/><file name="js.phtml" hash="7810505ae3dc5caa48626edd367d869f"/><file name="redirect.phtml" hash="92aa527ff49a49557f991f417ba2e3f6"/><dir name="review"><file name="button.phtml" hash="d5c300ad6bd5149ae148424232cc431c"/></dir></dir><dir name="partner"><file name="logo.phtml" hash="fcf0a1f4b3aa08f892033b0b26c048e5"/></dir><dir name="payflowadvanced"><file name="form.phtml" hash="0cef01090768f89bb2dfaab4201750e4"/><file name="iframe.phtml" hash="a0a93a9784d09df119315e7f5947d11d"/><file name="info.phtml" hash="3c3d3115a34158ee1045924ad06fa5f6"/><file name="redirect.phtml" hash="2d22773588722699eb4b0943e496bbf0"/></dir><dir name="payflowlink"><file name="form.phtml" hash="7988a2afc2f851631223b2db66e1b064"/><file name="iframe.phtml" hash="990fd582d1a47def3453299a6abc8fc3"/><file name="info.phtml" hash="ef8a052347e035d9fdc3d8bea9859807"/><file name="redirect.phtml" hash="87b87bcb189c2e49f1f129086eea55ec"/></dir><dir name="payment"><file name="mark.phtml" hash="7b071019bbb5377a4585c6f3a7f4cab6"/><file name="redirect.phtml" hash="e584eba7a6af84e86294499edddf00cb"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Ebcomm_PaypalMx.xml" hash="0e45c2145c9d7a3ce9abc74de8a3f816"/></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="images"><dir name="paypalmx"><file name="accpmark_mensualidades_SP.PNG" hash="eeec91559b0b8bc76fdc3d47fd5042bf"/><file name="accpmark_tarjdeb_SP.PNG" hash="dc4acb3d846c91817b477c7650730830"/><file name="accpmark_visa_mc_SP.PNG" hash="25fc6f60251c81a594feb4ae9c4cc829"/><file name="logo-paypal.png" hash="d032551b47e48dced277c4fa344ac7f6"/><file name="pp-alt.png" hash="c262d332b342a2f4063cd82a61d11107"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="images"><dir name="paypalmx"><file name="accpmark_mensualidades_SP.PNG" hash="eeec91559b0b8bc76fdc3d47fd5042bf"/><file name="accpmark_tarjdeb_SP.PNG" hash="dc4acb3d846c91817b477c7650730830"/><file name="accpmark_visa_mc_SP.PNG" hash="25fc6f60251c81a594feb4ae9c4cc829"/><file name="bdg_compra_segura_pp_.PNG" hash="99f16d5431768683b5bca61e8494ce4a"/><file name="logo-paypal.png" hash="d032551b47e48dced277c4fa344ac7f6"/><file name="paypalmx_loader.gif" hash="7f0d7ae2a20ebfc33b3f967d91047684"/><file name="pp-alt.png" hash="c262d332b342a2f4063cd82a61d11107"/></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="es_ES"><file name="Ebcomm_PaypalMx.csv" hash="11ef4a4cf25d117699e61eac6bc13b78"/></dir><dir name="es_MX"><file name="Ebcomm_PaypalMx.csv" hash="11ef4a4cf25d117699e61eac6bc13b78"/></dir></target></contents>
79
  <compatible/>
80
  <dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php></required></dependencies>
81
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>magento_community_Ebcomm_PaypalMx</name>
4
+ <version>1.0.5</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">OSL v3.0</license>
7
  <channel>community</channel>
73
  &#x2022; Se integra a la perfecci&#xF3;n con los sistemas de back-office y back-end a la perfecci&#xF3;n.</description>
74
  <notes>Este m&#xF3;dulo es Compatible con las versiones de Magento: 1.8.0.0, 1.7.0.1 y 1.7.0.2</notes>
75
  <authors><author><name>Armando Mart&#xED;nez</name><user>jorgearmando</user><email>jmartinez@ebcomm.mx</email></author><author><name>Ebcomm</name><user>Ebcomm</user><email>soporte@ebcomm.mx</email></author></authors>
76
+ <date>2014-04-11</date>
77
+ <time>21:57:42</time>
78
+ <contents><target name="magecommunity"><dir name="Ebcomm"><dir name="PaypalMx"><dir name="Block"><dir name="Adminhtml"><dir name="Settlement"><dir name="Details"><file name="Form.php" hash="b4cd66af4231bb4ba9bca8d75cc913c2"/></dir><file name="Details.php" hash="c721bb4e2f17fa2a805f4de2f2289888"/><dir name="Report"><file name="Grid.php" hash="d1c5ac56383f62de9d303510638567f0"/></dir><file name="Report.php" hash="8850ee51b7773debbb58d14c65437ece"/></dir><dir name="System"><dir name="Config"><file name="ApiWizard.php" hash="80e5ae8798ab6bab3c81ee5cf376d5c2"/><dir name="Field"><file name="Country.php" hash="87db0dbbe10b34d2de7864b1d03a0b88"/><file name="Hidden.php" hash="40b17e389a0aee746592d8f4e1624979"/></dir><dir name="Fieldset"><file name="Expanded.php" hash="099556f3e484638c9facd35604ec7225"/><file name="Global.php" hash="94559f302e2fd22734e32423a279fe14"/><file name="Group.php" hash="7171fda706718a838710733b3105fa65"/><file name="Hint.php" hash="bf7ba7e966d4a223fb7e5f4180111bbe"/><file name="Location.php" hash="7ea802ee66868fb8a32f596593b07426"/><file name="Payment.php" hash="a751fd1ff644462985bf35f03444df89"/><file name="Store.php" hash="22d54bea1a5c0306828013584c5668af"/></dir><dir name="Payflowlink"><file name="Advanced.php" hash="5dd3ca0839dc4ccd2b2a61768fb519d1"/><file name="Info.php" hash="22882a71b671aa7364e52b46c83a8242"/></dir></dir></dir></dir><dir name="Debito"><file name="Form.php" hash="fa3ee77484ecaa5999f0acdf97959b6f"/><dir name="Review"><file name="Billing.php" hash="4d7f23048b18b1b8ad3317773f4f1e40"/><file name="Details.php" hash="15d86be5b2afa3023c78e33fb63d0857"/><file name="Shipping.php" hash="2b4223451ad0215b3a036bbe6c62debd"/></dir><file name="Review.php" hash="c6966f89d147619f604893d625e75dad"/></dir><dir name="Debito2"><file name="Form.php" hash="d85b3704a56cb3b285dd032845cba513"/><dir name="Review"><file name="Billing.php" hash="e2bc5486e487b391526a4305c73189a2"/><file name="Details.php" hash="446c6f3aa23ba5fccd834191d4816870"/><file name="Shipping.php" hash="5f4c83a6de3f9eacbe82879655ea97de"/></dir><file name="Review.php" hash="d5beca27a2dfd637404f6c3de88dc2f5"/><file name="Shortcut.php" hash="9201b9ce21345d4063011b72505cc230"/></dir><dir name="Express"><file name="Form.php" hash="7d043afe5a31007d4825b459c7f89190"/><dir name="Review"><file name="Billing.php" hash="4d7f23048b18b1b8ad3317773f4f1e40"/><file name="Details.php" hash="15d86be5b2afa3023c78e33fb63d0857"/><file name="Shipping.php" hash="2b4223451ad0215b3a036bbe6c62debd"/></dir><file name="Review.php" hash="7abd308b3b9aea48b69331bb2a7e5b2c"/><file name="Shortcut.php" hash="f19e8f442446a73e2d5fef93bd47c374"/></dir><dir name="Hosted"><dir name="Pro"><file name="Form.php" hash="ce858564fcd9897787bc37653b4888cb"/><file name="Iframe.php" hash="fc2d5870d207bb7205754298908c7a62"/><file name="Info.php" hash="c1aa1a0a39e0bebc0c2bac41f1761350"/></dir></dir><file name="Iframe.php" hash="578b47d39e498419be4e6c83b089f235"/><file name="Logo.php" hash="60aa0464029a82d100b6c0f7bd20e460"/><dir name="Mensualidades"><file name="Form.php" hash="3cf8338a8e89081449b2ac51f8f780ff"/><dir name="Review"><file name="Billing.php" hash="4d7f23048b18b1b8ad3317773f4f1e40"/><file name="Details.php" hash="15d86be5b2afa3023c78e33fb63d0857"/><file name="Shipping.php" hash="2b4223451ad0215b3a036bbe6c62debd"/></dir><file name="Review.php" hash="33cadd7774a17a29239f6d8722b8f57b"/></dir><dir name="Mensualidades2"><file name="Form.php" hash="3f5d31397e8eb63f5226d094a6d47331"/><dir name="Review"><file name="Billing.php" hash="6b5d7fa2eeb2518c295e56b8b2e9bf1e"/><file name="Details.php" hash="04fbfc8d7f54a0e06414c042b0670718"/><file name="Shipping.php" hash="5f4c83a6de3f9eacbe82879655ea97de"/></dir><file name="Review.php" hash="da02b2f12f8662c38388672dbf76fa14"/><file name="Shortcut.php" hash="289dc02f278629a2dc0cefba518cf172"/></dir><dir name="Payflow"><dir name="Advanced"><file name="Form.php" hash="927010606fe5fced1403d6ef58d3c270"/><file name="Iframe.php" hash="27d0fc56829f2c75b293df2e5e4650ab"/><file name="Info.php" hash="42d47a2b51ce4776f969ea5c72fd255e"/><file name="Review.php" hash="2714529f5662538bf847f0ed2e66bd41"/></dir><dir name="Link"><file name="Form.php" hash="f778d0aeee9c7b39931c0c135ae92003"/><file name="Iframe.php" hash="3c089c9890fc32657dc9fcaf126b9528"/><file name="Info.php" hash="420577d8a045b35691b7477915a147b3"/><file name="Review.php" hash="8f786f27ab15e61ddaaec8da98ac9c35"/></dir></dir><dir name="Payment"><file name="Info.php" hash="2cd023036a62048968e932dad6796b66"/></dir><dir name="Standard"><file name="Form.php" hash="f3ad173d8ba39b04dff8e2370eda5fa2"/><file name="Redirect.php" hash="542276cef580745aedca25069183d391"/></dir></dir><dir name="Controller"><dir name="Express"><file name="Abstract.php" hash="ea133b7e8507dd763f0816dd40c9cb4d"/></dir></dir><dir name="Helper"><file name="Data.php" hash="db302f1b6a260a8c782f02dd12ee478d"/><file name="Hss.php" hash="c410266e64be391558b9ff8e143326fb"/></dir><dir name="Model"><dir name="Api"><file name="Abstract.php" hash="08923700aba3c615280c4504a1ce81ad"/><file name="Nvp.php" hash="ef24fccac541c0da88093fdf686288e3"/><file name="Standard.php" hash="b96bf939bfa415b12388955077080bfc"/></dir><file name="Cart.php" hash="3b864c26f735143475b2f0615333d893"/><file name="Config.php" hash="9c72fc35fcd1747a980b26f92e04f862"/><dir name="Debito2"><file name="Checkout.php" hash="a903481cacf3c1adb87e7c56cc2084a0"/></dir><file name="Debito2.php" hash="b65a1e2f39d588dc70fa1bf688c23a7f"/><dir name="Express"><file name="Checkout.php" hash="c882c7a145cb3801c8222f4efd935a62"/></dir><file name="Express.php" hash="c60d7452da8b7bbf9d9ecee9fa81d037"/><file name="Info.php" hash="520ad9cbdd7dd4fa8d07dd9005d87d22"/><file name="Ipn.php" hash="7761f94270225749d6c0c52b79ae0579"/><dir name="Mensualidades2"><file name="Checkout.php" hash="31a5a6fa6e664ef188da7723b7b7b1fc"/></dir><file name="Mensualidades2.php" hash="4bf49b042828316deb7e2715dc89b9d3"/><file name="Observer.php" hash="407d9e755edc91d063a42839a5074f36"/><file name="Pro.php" hash="de3a2f57cf5a002b4f9d586cad26c2e8"/><dir name="Report"><dir name="Settlement"><file name="Row.php" hash="3f592ab9955c8d6a0de4fd6f62261bdd"/></dir><file name="Settlement.php" hash="2691c26ef9cf5d8c3975142a0b586954"/></dir><dir name="Resource"><file name="Cert.php" hash="64f2ff21ad23f68923602d867be75f95"/><dir name="Payment"><dir name="Transaction"><file name="Collection.php" hash="cbf6b54fe1a27fcd7244c6812b7dfcc5"/></dir><file name="Transaction.php" hash="55ba2006e21cdbd346eac74fe9539d2b"/></dir><dir name="Report"><dir name="Settlement"><dir name="Row"><file name="Collection.php" hash="8ece691160ad67e9e978579d2115002e"/></dir><file name="Row.php" hash="1eeaca503f403f134aab6d4dcb10f6ff"/></dir><file name="Settlement.php" hash="5b33161db3930ac991e2085c65ba771c"/></dir><file name="Setup.php" hash="7b15a771edebf6c6537cf178a666723b"/></dir><file name="Session.php" hash="ab58cd4c8d5d4e2859c666c27f956828"/><dir name="System"><dir name="Config"><dir name="Backend"><file name="Cert.php" hash="8ffbb08021ca8a4ce58803d65e3bd735"/><file name="Cron.php" hash="a12543a814ef2ef2e24fe198e5f5700e"/><file name="MerchantCountry.php" hash="5bece6129577d833bdb86f52562af327"/></dir><dir name="Source"><file name="AuthorizationAmounts.php" hash="c7bc73f81cba80fa18980e49943eeae6"/><file name="BuyerCountry.php" hash="ee6578ea63adb780e1984e14103c40b1"/><file name="FetchingSchedule.php" hash="ae16dad27d4612b8c1e06600891ac801"/><file name="Logo.php" hash="b27ffbe0531bccc37c35f24d3cfd5377"/><file name="MerchantCountry.php" hash="3bb1fd8d8724df3b1b8e6ca850f8f4ff"/><dir name="PaymentActions"><file name="Express.php" hash="ac1a4ec817571dc2cfec035e588f296d"/></dir><file name="PaymentActions.php" hash="658d1257015b76f4b20726cbc2f65381"/><file name="RequireBillingAddress.php" hash="beb69ae978a1ad00aa7bc153ce1faf54"/><file name="UrlMethod.php" hash="3537462618e67f6ed30f149a83ab3978"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Paypal"><file name="ReportssController.php" hash="be81a61a7a8c1c641040479a2a1f311f"/></dir></dir><file name="ExpressController.php" hash="5cdf754a2f6d50c06724a9e2b46419d0"/><file name="IpnController.php" hash="7fd712dc950b7628223dfe61214c749f"/></dir><dir name="etc"><file name="adminhtml.xml" hash="2d1d1903c172a3cc49144d932922472e"/><file name="config.xml" hash="b98b8ad6fc202596a1f96c8585c5dc8c"/><file name="system.xml" hash="2baea251939e41bbbb940247e479df7e"/></dir><dir name="sql"><dir name="paypal_setup"><file name="install-1.6.0.0.php" hash="b2469041739bf8e14fd0966400a22c07"/><file name="mysql4-install-0.7.0.php" hash="25fcdc3e2c1c6269aaa418be249b2d9f"/><file name="mysql4-install-1.4.0.0.php" hash="f42c5ef6ac5567f2d1f6f4c15263ea74"/><file name="mysql4-upgrade-0.7.1-0.7.2.php" hash="d6a61cfed1b9816441d043dd880e8238"/><file name="mysql4-upgrade-0.7.2-0.7.3.php" hash="1716deec69cbf7fa949558a76fa43fd1"/><file name="mysql4-upgrade-1.4.0.0-1.4.0.1.php" hash="e624edb8630883dd02b4b51662dc331b"/><file name="mysql4-upgrade-1.4.0.1-1.4.0.2.php" hash="38089d012488add3dfebb8257561f113"/><file name="mysql4-upgrade-1.5.9.9-1.6.0.0.php" hash="97953cf10dad2b87ed38a3e16fa10ca5"/><file name="upgrade-1.6.0.0-1.6.0.1.php" hash="145024349ddf84b2beab0f5f0f6d64a2"/><file name="upgrade-1.6.0.1-1.6.0.2.php" hash="370588e330f0a311fbd543cb31a182bb"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="paypalmx"><dir name="system"><dir name="config"><file name="api_wizard.phtml" hash="6a5528fd5e0f05894b304bef308f5393"/><dir name="fieldset"><file name="global.phtml" hash="9782420769b39409c72b4248dc8bf9f3"/><file name="store.phtml" hash="f05eed8334cc4d25b3f767e330763cf4"/></dir><dir name="payflowlink"><file name="advanced.phtml" hash="50928244065ad54cc7e2ec921dd3f261"/><file name="info.phtml" hash="5db2cff1d753f822a72ab07bdee9c4a8"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="paypalmx.xml" hash="61434c3d35ecca74433f0cd511498c10"/></dir><dir name="template"><dir name="paypalmx"><dir name="express"><dir name="review"><file name="address.phtml" hash="f274e591956f2277608bebf62fa2b6b9"/><file name="details.phtml" hash="f3a7b01960a0a1ffbce627de81ddbaa5"/><dir name="shipping"><file name="method.phtml" hash="b3d255b8567f88996b2ed7cc36895a6e"/></dir></dir><file name="review.phtml" hash="0b838e121a183836b92b9e14b6cf46f1"/><file name="shortcut.phtml" hash="15ebec4b34f2df23807be71fd2579165"/></dir><dir name="hss"><file name="form.phtml" hash="7988a2afc2f851631223b2db66e1b064"/><file name="iframe.phtml" hash="dbb2b3fbf4ffa17b9e7fac30d996bf3f"/><file name="info.phtml" hash="0422558db314c49361ffa4e1486673b4"/><file name="js.phtml" hash="7810505ae3dc5caa48626edd367d869f"/><file name="redirect.phtml" hash="92aa527ff49a49557f991f417ba2e3f6"/><dir name="review"><file name="button.phtml" hash="d5c300ad6bd5149ae148424232cc431c"/></dir></dir><dir name="partner"><file name="logo.phtml" hash="fcf0a1f4b3aa08f892033b0b26c048e5"/></dir><dir name="payflowadvanced"><file name="form.phtml" hash="0cef01090768f89bb2dfaab4201750e4"/><file name="iframe.phtml" hash="a0a93a9784d09df119315e7f5947d11d"/><file name="info.phtml" hash="3c3d3115a34158ee1045924ad06fa5f6"/><file name="redirect.phtml" hash="2d22773588722699eb4b0943e496bbf0"/></dir><dir name="payflowlink"><file name="form.phtml" hash="7988a2afc2f851631223b2db66e1b064"/><file name="iframe.phtml" hash="990fd582d1a47def3453299a6abc8fc3"/><file name="info.phtml" hash="ef8a052347e035d9fdc3d8bea9859807"/><file name="redirect.phtml" hash="87b87bcb189c2e49f1f129086eea55ec"/></dir><dir name="payment"><file name="mark.phtml" hash="7b071019bbb5377a4585c6f3a7f4cab6"/><file name="redirect.phtml" hash="e584eba7a6af84e86294499edddf00cb"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Ebcomm_PaypalMx.xml" hash="39207651b5dc875151844b6046458459"/></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="images"><dir name="paypalmx"><file name="accpmark_mensualidades_SP.PNG" hash="eeec91559b0b8bc76fdc3d47fd5042bf"/><file name="accpmark_tarjdeb_SP.PNG" hash="dc4acb3d846c91817b477c7650730830"/><file name="accpmark_visa_mc_SP.PNG" hash="25fc6f60251c81a594feb4ae9c4cc829"/><file name="logo-paypal.png" hash="d032551b47e48dced277c4fa344ac7f6"/><file name="pp-alt.png" hash="c262d332b342a2f4063cd82a61d11107"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="images"><dir name="paypalmx"><file name="accpmark_mensualidades_SP.PNG" hash="eeec91559b0b8bc76fdc3d47fd5042bf"/><file name="accpmark_tarjdeb_SP.PNG" hash="dc4acb3d846c91817b477c7650730830"/><file name="accpmark_visa_mc_SP.PNG" hash="25fc6f60251c81a594feb4ae9c4cc829"/><file name="bdg_compra_segura_pp_.PNG" hash="99f16d5431768683b5bca61e8494ce4a"/><file name="logo-paypal.png" hash="d032551b47e48dced277c4fa344ac7f6"/><file name="paypalmx_loader.gif" hash="7f0d7ae2a20ebfc33b3f967d91047684"/><file name="pp-alt.png" hash="c262d332b342a2f4063cd82a61d11107"/></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="es_ES"><file name="Ebcomm_PaypalMx.csv" hash="11ef4a4cf25d117699e61eac6bc13b78"/></dir><dir name="es_MX"><file name="Ebcomm_PaypalMx.csv" hash="11ef4a4cf25d117699e61eac6bc13b78"/></dir></target></contents>
79
  <compatible/>
80
  <dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php></required></dependencies>
81
  </package>