GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

place()   C
last analyzed

Complexity

Conditions 9
Paths 19

Size

Total Lines 63
Code Lines 42

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 63
rs 6.6149
cc 9
eloc 42
nc 19
nop 2

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * Copyright (c) 2013-2014 eBay Enterprise, Inc.
4
 *
5
 * NOTICE OF LICENSE
6
 *
7
 * This source file is subject to the Open Software License (OSL 3.0)
8
 * that is bundled with this package in the file LICENSE.md.
9
 * It is also available through the world-wide-web at this URL:
10
 * http://opensource.org/licenses/osl-3.0.php
11
 *
12
 * @copyright   Copyright (c) 2013-2014 eBay Enterprise, Inc. (http://www.ebayenterprise.com/)
13
 * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
14
 */
15
16
/**
17
 * Wrapper that performs Paypal Express and Checkout communication
18
 * Use current Paypal Express method instance
19
 * @SuppressWarnings(TooManyMethods)
20
 * ^-- @TODO If __construct, nullCoalesce and checkTypes are always needed, this value should be +3 IMO
0 ignored issues
show
Coding Style Best Practice introduced by
Comments for TODO tasks are often forgotten in the code; it might be better to use a dedicated issue tracker.
Loading history...
21
 * @SuppressWarnings(ExcessiveClassComplexity)
22
 * ^-- This will ignore overall class complexity (which does take WMC into consideration), but will *not* ignore too much complexity in individual methods
23
 */
24
class EbayEnterprise_PayPal_Model_Express_Checkout
25
{
26
    const EBAYENTERPRISE_PAYPAL_ZERO_CHECKOUT_NOT_SUPPORTED = 'EBAYENTERPRISE_PAYPAL_ZERO_CHECKOUT_NOT_SUPPORTED';
27
    /**
28
     * Cache ID prefix for "pal" lookup
29
     *
30
     * @var string
31
     */
32
    const EBAYENTERPRISE_PAL_CACHE_ID = 'ebayenterprise_paypal_express_checkout_pal';
33
34
    /**
35
     * Keys for passthrough variables in sales/quote_payment and sales/order_payment
36
     * Stored in additional_information
37
     *
38
     * @var string
39
     */
40
    const PAYMENT_INFO_TOKEN = 'paypal_express_checkout_token';
41
    const PAYMENT_INFO_SHIPPING_OVERRIDDEN = 'paypal_express_checkout_shipping_overriden';
42
    const PAYMENT_INFO_SHIPPING_METHOD = 'paypal_express_checkout_shipping_method';
43
    const PAYMENT_INFO_PAYER_ID = 'paypal_express_checkout_payer_id';
44
    const PAYMENT_INFO_REDIRECT = 'paypal_express_checkout_redirect_required';
45
    const PAYMENT_INFO_BILLING_AGREEMENT = 'paypal_ec_create_ba';
46
    const PAYMENT_INFO_IS_AUTHORIZED_FLAG = 'is_authorized';
47
    const PAYMENT_INFO_IS_VOIDED_FLAG = 'is_voided';
48
    const PAYMENT_INFO_ADDRESS_STATUS = 'paypal_express_checkout_address_status';
49
50
    /** @var string Flag from the request that indicates checkout was initiated outside normal checkout flow */
51
    const PAYMENT_INFO_BUTTON = 'button';
52
53
    /** @var Mage_Sales_Model_Quote */
54
    protected $_quote;
55
    /** @var EbayEnterprise_PayPal_Model_Config */
56
    protected $_config;
57
    /** @var EbayEnterprise_PayPal_Helper_Data */
58
    protected $_helper;
59
    /** @var EbayEnterprise_Paypal_Model_Express_Api */
60
    protected $_api;
61
    /** @var EbayEnterprise_MageLog_Helper_Data */
62
    protected $_logger;
63
    /** @var EbayEnterprise_MageLog_Helper_Context */
64
    protected $_context;
65
66
    /** @var EbayEnterprise_PayPal_Helper_Region */
67
    protected $regionHelper;
68
    /** @var Mage_Customer_Model_Session */
69
    protected $_customerSession;
70
    /** @var int */
71
    protected $_customerId;
72
    /** @var Mage_Sales_Model_Order */
73
    protected $_order;
74
75
76
    public function __construct(array $initParams = array())
77
    {
78
        list($this->_helper, $this->_logger, $this->_config, $this->_quote, $this->_context, $this->regionHelper)
79
            = $this->_checkTypes(
80
                $this->_nullCoalesce(
81
                    $initParams,
82
                    'helper',
83
                    Mage::helper('ebayenterprise_paypal')
84
                ),
85
                $this->_nullCoalesce(
86
                    $initParams,
87
                    'logger',
88
                    Mage::helper('ebayenterprise_magelog')
89
                ),
90
                $this->_nullCoalesce(
91
                    $initParams,
92
                    'config',
93
                    Mage::helper('ebayenterprise_paypal')->getConfigModel()
94
                ),
95
                $this->_nullCoalesce($initParams, 'quote', null),
96
                $this->_nullCoalesce(
97
                    $initParams,
98
                    'context',
99
                    Mage::helper('ebayenterprise_magelog/context')
100
                ),
101
                $this->_nullCoalesce(
102
                    $initParams,
103
                    'region_helper',
104
                    Mage::helper('ebayenterprise_paypal/region')
105
                )
106
            );
107
        if (!$this->_quote) {
108
            throw new Exception('Quote instance is required.');
109
        }
110
    }
111
112
    /**
113
     * Type hinting for self::__construct $initParams
114
     *
115
     * @param EbayEnterprise_PayPal_Helper_Data,
116
     * @param EbayEnterprise_MageLog_Helper_Data,
117
     * @param EbayEnterprise_Eb2cCore_Model_Config_Registry,
118
     * @param Mage_Sales_Model_Quote,
119
     * @param EbayEnterprise_MageLog_Helper_Context,
120
     * @param EbayEnterprise_PayPal_Helper_Region
121
     *
122
     * @return array
123
     */
124
    protected function _checkTypes(
0 ignored issues
show
Unused Code introduced by
The method parameter $helper is never used
Loading history...
Unused Code introduced by
The method parameter $logger is never used
Loading history...
Unused Code introduced by
The method parameter $config is never used
Loading history...
Unused Code introduced by
The method parameter $quote is never used
Loading history...
Unused Code introduced by
The method parameter $context is never used
Loading history...
Unused Code introduced by
The method parameter $regionHelper is never used
Loading history...
125
        EbayEnterprise_PayPal_Helper_Data $helper,
0 ignored issues
show
Unused Code introduced by
The parameter $helper is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
126
        EbayEnterprise_MageLog_Helper_Data $logger,
0 ignored issues
show
Unused Code introduced by
The parameter $logger is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
127
        EbayEnterprise_Eb2cCore_Model_Config_Registry $config,
0 ignored issues
show
Unused Code introduced by
The parameter $config is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
128
        Mage_Sales_Model_Quote $quote,
0 ignored issues
show
Unused Code introduced by
The parameter $quote is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
129
        EbayEnterprise_MageLog_Helper_Context $context,
0 ignored issues
show
Unused Code introduced by
The parameter $context is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
130
        EbayEnterprise_PayPal_Helper_Region $regionHelper
0 ignored issues
show
Unused Code introduced by
The parameter $regionHelper is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
131
    ) {
132
        return func_get_args();
133
    }
134
135
    /**
136
     * Return the value at field in array if it exists. Otherwise, use the
137
     * default value.
138
     *
139
     * @param  array      $arr
140
     * @param  string|int $field Valid array key
141
     * @param  mixed      $default
142
     * @return mixed
143
     */
144
    protected function _nullCoalesce(array $arr, $field, $default)
145
    {
146
        return isset($arr[$field]) ? $arr[$field] : $default;
147
    }
148
149
    /**
150
     * Reserve order ID for specified quote and start checkout on PayPal
151
     *
152
     * @param string
153
     * @param string
154
     * @param bool|null $button specifies if we came from Checkout Stream or from Product/Cart directly
155
     * @return mixed
156
     */
157
    public function start($returnUrl, $cancelUrl, $button = null)
158
    {
159
        $this->_quote->collectTotals();
160
        if (!$this->_quote->getGrandTotal()
161
            && !$this->_quote->hasNominalItems()
162
        ) {
163
            Mage::throwException(
164
                $this->_helper->__(
165
                    self::EBAYENTERPRISE_PAYPAL_ZERO_CHECKOUT_NOT_SUPPORTED
166
                )
167
            );
168
        }
169
        $this->_quote->reserveOrderId()->save();
170
        $this->_getApi();
171
        $setExpressCheckoutReply = $this->_api->setExpressCheckout(
172
            $returnUrl,
173
            $cancelUrl,
174
            $this->_quote
175
        );
176
        if ($button) {
177
            // mark the payment to indicate express checkout was initiated from
178
            // outside the normal checkout flow
179
            // (e.g. clicked paypal checkout button from product page)
180
            $setExpressCheckoutReply[self::PAYMENT_INFO_BUTTON] = 1;
181
        }
182
        $this->_quote->getPayment()->importData($setExpressCheckoutReply);
183
        $this->_quote->getPayment()->save();
184
        return $setExpressCheckoutReply;
185
    }
186
187
    /**
188
     * Setter for customer
189
     *
190
     * @param Mage_Customer_Model_Customer $customer
191
     *
192
     * @return Mage_Paypal_Model_Express_Checkout
0 ignored issues
show
Documentation introduced by
Should the return type not be EbayEnterprise_PayPal_Model_Express_Checkout?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
193
     */
194
    public function setCustomer($customer)
195
    {
196
        $this->_quote->assignCustomer($customer);
197
        $this->_customerId = $customer->getId();
198
        return $this;
199
    }
200
201
    /**
202
     * Setter for customer with billing and shipping address changing ability
203
     *
204
     * @param  Mage_Customer_Model_Customer   $customer
205
     * @param  Mage_Sales_Model_Quote_Address $billingAddress
0 ignored issues
show
Documentation introduced by
Should the type for parameter $billingAddress not be Mage_Sales_Model_Quote_Address|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
206
     * @param  Mage_Sales_Model_Quote_Address $shippingAddress
0 ignored issues
show
Documentation introduced by
Should the type for parameter $shippingAddress not be Mage_Sales_Model_Quote_Address|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
207
     *
208
     * @return Mage_Paypal_Model_Express_Checkout
0 ignored issues
show
Documentation introduced by
Should the return type not be EbayEnterprise_PayPal_Model_Express_Checkout?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
209
     */
210
    public function setCustomerWithAddressChange(
211
        $customer,
212
        $billingAddress = null,
213
        $shippingAddress = null
214
    ) {
215
        $this->_quote->assignCustomerWithAddressChange(
216
            $customer,
217
            $billingAddress,
218
            $shippingAddress
219
        );
220
        $this->_customerId = $customer->getId();
221
        return $this;
222
    }
223
224
    /**
225
     * Update quote when returned from PayPal
226
     * rewrite billing address by paypal
227
     * save old billing address for new customer
228
     * export shipping address in case address absence
229
     *
230
     * @param string $token
231
     */
232
    public function returnFromPaypal($token)
233
    {
234
        $this->_getApi();
235
        $quote = $this->_quote;
236
        $getExpressCheckoutReply = $this->_api->getExpressCheckout(
237
            $quote->reserveOrderId()->getReservedOrderId(),
238
            $token,
239
            Mage::app()->getStore()->getCurrentCurrencyCode()
240
        );
241
242
        $this->_ignoreAddressValidation();
243
        /* Always import shipping address. We would have passed the shipping address in to begin with, so they
244
			can keep it that way at PayPal if they like - or choose their own registered shipping address at PayPal. */
245
        $paypalShippingAddress = $getExpressCheckoutReply['shipping_address'];
246
        if (!$quote->getIsVirtual()) {
247
            $shippingAddress = $quote->getShippingAddress();
248
            $shippingAddress->setTelephone($getExpressCheckoutReply['phone']);
249
            $shippingAddress->setStreet($paypalShippingAddress['street']);
250
            $shippingAddress->setCity($paypalShippingAddress['city']);
251
            $shippingAddress->setPostcode($paypalShippingAddress['postcode']);
252
            $shippingAddress->setCountryId($paypalShippingAddress['country_id']);
253
            // Region must be processed after country id is set for the lookup to work.
254
            $this->regionHelper->setQuoteAddressRegion($shippingAddress, $paypalShippingAddress['region_code']);
255
            $shippingAddress->setPrefix(null);
256
257
            $shippingAddress->setMiddlename(
258
                $getExpressCheckoutReply['middlename']
259
            );
260
            $shippingAddress->setLastname($getExpressCheckoutReply['lastname']);
261
            $shippingAddress->setFirstname(
262
                $getExpressCheckoutReply['firstname']
263
            );
264
            $shippingAddress->setSuffix($getExpressCheckoutReply['suffix']);
265
            $shippingAddress->setCollectShippingRates(true);
266
            $shippingAddress->setSameAsBilling(0);
267
            $quote->setShippingAddress($shippingAddress);
268
            $quote->setCustomerFirstname($getExpressCheckoutReply['firstname']);
269
            $quote->setCustomerLastname($getExpressCheckoutReply['lastname']);
270
        }
271
272
        // Import billing address if we are here via Button - which is to say we didn't have a billing address yet:
273
        $portBillingFromShipping
274
            = $quote->getPayment()->getAdditionalInformation(
275
                self::PAYMENT_INFO_BUTTON
276
            ) == 1
277
            && !$quote->isVirtual();
278
        if ($portBillingFromShipping) {
279
            $billingAddress = clone $shippingAddress;
0 ignored issues
show
Bug introduced by
The variable $shippingAddress does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
280
            $billingAddress->unsAddressId()->unsAddressType();
281
            $data = $billingAddress->getData();
282
            $data['save_in_address_book'] = 0;
283
            $quote->getBillingAddress()->addData($data);
284
            $quote->getShippingAddress()->setSameAsBilling(1);
285
        } else {
286
            $billingAddress = $quote->getBillingAddress();
287
        }
288
        $paypalBillingAddress = $getExpressCheckoutReply['billing_address'];
289
        $billingAddress->setStreet($paypalBillingAddress['street']);
290
        $billingAddress->setCity($paypalBillingAddress['city']);
291
        $billingAddress->setPostcode($paypalBillingAddress['postcode']);
292
        $billingAddress->setCountryId($paypalBillingAddress['country_id']);
293
        $billingAddress->setEmail($getExpressCheckoutReply['email']);
294
        // Region must be processed after country id is set for the lookup to work.
295
        $this->regionHelper->setQuoteAddressRegion($billingAddress, $paypalBillingAddress['region_code']);
296
        $quote->setBillingAddress($billingAddress);
297
298
        // import payment info
299
        $quote->getPayment()
300
            ->setAdditionalInformation(self::PAYMENT_INFO_PAYER_ID, $getExpressCheckoutReply['payer_id'])
301
            ->setAdditionalInformation(self::PAYMENT_INFO_TOKEN, $token)
302
            ->setAdditionalInformation(self::PAYMENT_INFO_ADDRESS_STATUS, $paypalShippingAddress['status']);
303
        $quote->collectTotals()->save();
304
    }
305
306
    /**
307
     * Check whether order review has enough data to initialize
308
     *
309
     * @param $token
310
     *
311
     * @throws Mage_Core_Exception
312
     */
313
    public function prepareOrderReview()
314
    {
315
        $payment = $this->_quote->getPayment();
316
        if (!$payment
317
            || !$payment->getAdditionalInformation(
318
                self::PAYMENT_INFO_PAYER_ID
319
            )
320
        ) {
321
            Mage::throwException(
322
                Mage::helper('paypal')->__('Payer is not identified.')
323
            );
324
        }
325
        $this->_quote->setMayEditShippingAddress(
326
            1 != $this->_quote->getPayment()->getAdditionalInformation(
327
                self::PAYMENT_INFO_SHIPPING_OVERRIDDEN
328
            )
329
        );
330
        $this->_ignoreAddressValidation();
331
        $this->_quote->collectTotals()->save();
332
    }
333
334
    /**
335
     * Set shipping method to quote, if needed
336
     *
337
     * @param string $methodCode
338
     */
339
    public function updateShippingMethod($methodCode)
340
    {
341
        $shippingAddress = $this->_quote->getShippingAddress();
342
        if ($methodCode && !$this->_quote->getIsVirtual() && $shippingAddress) {
343
            if ($methodCode != $shippingAddress->getShippingMethod()) {
344
                $this->_ignoreAddressValidation();
345
                $shippingAddress->setShippingMethod($methodCode)
346
                    ->setCollectShippingRates(true);
347
                // Know shipping method has changed which will likely trigger
348
                // total changes. Ensure that totals are collected again by
349
                // setting the flag to false before triggering the collect.
350
                $this->_quote->setTotalsCollectedFlag(false)->collectTotals()->save();
351
            }
352
        }
353
    }
354
355
    /**
356
     * Prepare the quote according to the method (guest, registering new customer, or existing customer)
357
     *
358
     * @return boolean Whether we are a new customer
359
     */
360
    protected function _prepareQuote()
361
    {
362
        $isNewCustomer = false;
363
        switch ($this->getCheckoutMethod()) {
364
            case Mage_Checkout_Model_Type_Onepage::METHOD_GUEST:
365
                $this->_prepareGuestQuote();
366
                break;
367
            case Mage_Checkout_Model_Type_Onepage::METHOD_REGISTER:
368
                $customerId = $this->_lookupCustomerId();
369
                if ($customerId) {
370
                    $this->_getCustomerSession()->loginById($customerId);
371
                    $this->_prepareCustomerQuote();
372
                } else {
373
                    $this->_prepareNewCustomerQuote();
374
                }
375
                $isNewCustomer = true;
376
                break;
377
            default:
378
                $this->_prepareCustomerQuote();
379
                break;
380
        }
381
        return $isNewCustomer;
382
    }
383
384
    /**
385
     * Place the order and recurring payment profiles when customer returned from paypal
386
     * Until this moment all quote data must be valid
387
     *
388
     * @param string $token
389
     * @param string $shippingMethodCode
0 ignored issues
show
Documentation introduced by
Should the type for parameter $shippingMethodCode not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
390
     */
391
    public function place($token, $shippingMethodCode = null)
392
    {
393
        $this->updateShippingMethod($shippingMethodCode);
394
        $isNewCustomer = $this->_prepareQuote();
395
        $this->_ignoreAddressValidation();
396
        $this->_quote->collectTotals();
397
        $this->_getApi();
398
        $payerId = $this->_quote->getPayment()->getAdditionalInformation(
399
            self::PAYMENT_INFO_PAYER_ID
400
        );
401
        $doExpressReply = $this->_api->doExpressCheckout(
402
            $this->_quote,
403
            $token,
404
            $payerId
405
        );
406
        $doAuthorizationReply = $this->_api->doAuthorization($this->_quote);
407
        $this->_quote->getPayment()
408
            ->importData(array_merge($doExpressReply, $doAuthorizationReply));
409
        $service = Mage::getModel('sales/service_quote', $this->_quote);
410
        try {
411
            $service->submitAll();
412
        // Any exceptions thrown from submitAll indicate an order that failed
413
        // to be created. In any such cases, the payment auth needs to be voided.
414
        } catch (Exception $e) {
415
            $this->_api->doVoidQuote($this->_quote);
416
            // Throw an exception for the controller to handle. Needs to indicate
417
            // the failure to complete the PayPal payment as the PayPal process
418
            // needs to be restarted once the auth was performed.
419
            throw Mage::exception('EbayEnterprise_PayPal', $this->_helper->__(EbayEnterprise_Paypal_Model_Express_Api::EBAYENTERPRISE_PAYPAL_API_FAILED));
420
        }
421
        $this->_quote->save();
422
423
        if ($isNewCustomer) {
424
            try {
425
                $this->_involveNewCustomer();
426
            } catch (Exception $e) {
427
                $this->_logger->logException($e, $this->_context->getMetaData(__CLASS__, [], $e));
428
            }
429
        }
430
431
        $order = $service->getOrder();
432
        if (!$order) {
433
            return;
434
        }
435
436
        switch ($order->getState()) {
437
            // Even after placement, paypal can disallow authorize/capture
438
            case Mage_Sales_Model_Order::STATE_PENDING_PAYMENT:
439
                break;
440
            // regular placement, when everything is ok
441
            case Mage_Sales_Model_Order::STATE_PROCESSING:
442
            case Mage_Sales_Model_Order::STATE_COMPLETE:
443
            case Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW:
444
                $order->sendNewOrderEmail();
445
                break;
446
        }
447
        $this->_order = $order;
448
449
        Mage::dispatchEvent(
450
            'checkout_submit_all_after',
451
            array('order' => $order, 'quote' => $this->_quote)
452
        );
453
    }
454
455
    /**
456
     * Make sure addresses will be saved without validation errors
457
     */
458
    private function _ignoreAddressValidation()
459
    {
460
        $this->_quote->getBillingAddress()->setShouldIgnoreValidation(true);
461
        if (!$this->_quote->getIsVirtual()) {
462
            $this->_quote->getShippingAddress()->setShouldIgnoreValidation(
463
                true
464
            );
465
        }
466
    }
467
468
    /**
469
     * Return order
470
     *
471
     * @return Mage_Sales_Model_Order
472
     */
473
    public function getOrder()
474
    {
475
        return $this->_order;
476
    }
477
478
    /**
479
     * Get checkout method
480
     *
481
     * @return string
482
     */
483
    public function getCheckoutMethod()
484
    {
485
        if ($this->_getCustomerSession()->isLoggedIn()) {
486
            return Mage_Checkout_Model_Type_Onepage::METHOD_CUSTOMER;
487
        }
488
        if (!$this->_quote->getCheckoutMethod()) {
489
            if (Mage::helper('checkout')->isAllowedGuestCheckout(
490
                $this->_quote
491
            )
492
            ) {
493
                $this->_quote->setCheckoutMethod(
494
                    Mage_Checkout_Model_Type_Onepage::METHOD_GUEST
495
                );
496
            } else {
497
                $this->_quote->setCheckoutMethod(
498
                    Mage_Checkout_Model_Type_Onepage::METHOD_REGISTER
499
                );
500
            }
501
        }
502
        return $this->_quote->getCheckoutMethod();
503
    }
504
505
    /**
506
     * @return EbayEnterprise_Paypal_Model_Express_Api
507
     */
508
    protected function _getApi()
509
    {
510
        if (!$this->_api) {
511
            $this->_api = Mage::getModel('ebayenterprise_paypal/express_api');
512
        }
513
        return $this->_api;
514
    }
515
516
    /**
517
     * Prepare quote for guest checkout order submit
518
     *
519
     * @return Mage_Paypal_Model_Express_Checkout
0 ignored issues
show
Documentation introduced by
Should the return type not be EbayEnterprise_PayPal_Model_Express_Checkout?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
520
     */
521
    protected function _prepareGuestQuote()
522
    {
523
        $quote = $this->_quote;
524
        $quote->setCustomerId(null)
525
            ->setCustomerEmail($quote->getBillingAddress()->getEmail())
526
            ->setCustomerIsGuest(true)
527
            ->setCustomerGroupId(Mage_Customer_Model_Group::NOT_LOGGED_IN_ID);
528
        return $this;
529
    }
530
531
    /**
532
     * Checks if customer with email coming from Express checkout exists
533
     *
534
     * @return int
535
     */
536
    protected function _lookupCustomerId()
537
    {
538
        return Mage::getModel('customer/customer')
539
            ->setWebsiteId(Mage::app()->getWebsite()->getId())
540
            ->loadByEmail($this->_quote->getCustomerEmail())
541
            ->getId();
542
    }
543
544
    /**
545
     * Prepare quote for customer registration and customer order submit
546
     * and restore magento customer data from quote
547
     *
548
     * @return Mage_Paypal_Model_Express_Checkout
0 ignored issues
show
Documentation introduced by
Should the return type not be EbayEnterprise_PayPal_Model_Express_Checkout?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
549
     */
550
    protected function _prepareNewCustomerQuote()
551
    {
552
        $quote = $this->_quote;
553
        $billing = $quote->getBillingAddress();
554
        $shipping = $quote->isVirtual() ? null : $quote->getShippingAddress();
555
556
        $customer = $quote->getCustomer();
557
        /** @var $customer Mage_Customer_Model_Customer */
558
        $customerBilling = $billing->exportCustomerAddress();
559
        $customer->addAddress($customerBilling);
560
        $billing->setCustomerAddress($customerBilling);
561
        $customerBilling->setIsDefaultBilling(true);
562
        if ($shipping && !$shipping->getSameAsBilling()) {
563
            $customerShipping = $shipping->exportCustomerAddress();
564
            $customer->addAddress($customerShipping);
565
            $shipping->setCustomerAddress($customerShipping);
566
            $customerShipping->setIsDefaultShipping(true);
567
        } elseif ($shipping) {
568
            $customerBilling->setIsDefaultShipping(true);
569
        }
570
        $this->_setAdditionalCustomerBillingData();
571
        Mage::helper('core')->copyFieldset(
572
            'checkout_onepage_billing',
573
            'to_customer',
574
            $billing,
575
            $customer
576
        );
577
        $customer->setEmail($quote->getCustomerEmail());
578
        $customer->setPrefix($quote->getCustomerPrefix());
579
        $customer->setFirstname($quote->getCustomerFirstname());
580
        $customer->setMiddlename($quote->getCustomerMiddlename());
581
        $customer->setLastname($quote->getCustomerLastname());
582
        $customer->setSuffix($quote->getCustomerSuffix());
583
        $customer->setPassword(
584
            $customer->decryptPassword($quote->getPasswordHash())
585
        );
586
        $customer->setPasswordHash(
587
            $customer->hashPassword($customer->getPassword())
588
        );
589
        $customer->save();
590
        $quote->setCustomer($customer);
591
        return $this;
592
    }
593
594
    /**
595
     * Set additional customer billing data
596
     *
597
     * @return self
598
     */
599
    protected function _setAdditionalCustomerBillingData()
600
    {
601
        $quote = $this->_quote;
602
        $billing = $quote->getBillingAddress();
603
        if ($quote->getCustomerDob() && !$billing->getCustomerDob()) {
604
            $billing->setCustomerDob($quote->getCustomerDob());
605
        }
606
        if ($quote->getCustomerTaxvat() && !$billing->getCustomerTaxvat()) {
607
            $billing->setCustomerTaxvat($quote->getCustomerTaxvat());
608
        }
609
        if ($quote->getCustomerGender() && !$billing->getCustomerGender()) {
610
            $billing->setCustomerGender($quote->getCustomerGender());
611
        }
612
        return $this;
613
    }
614
615
    /**
616
     * Prepare quote customer address information and set the customer on the quote
617
     *
618
     * @return self
619
     */
620
    protected function _prepareCustomerQuote()
621
    {
622
        $shipping = $this->_quote->isVirtual() ? null
623
            : $this->_quote->getShippingAddress();
624
        $customer = $this->_getCustomerSession()->getCustomer();
625
        $customerBilling = $this->_prepareCustomerBilling($customer);
626
        if ($shipping) {
627
            $customerShipping = $this->_prepareCustomerShipping(
628
                $customer,
629
                $shipping
630
            );
631
            if ($customerBilling && !$customer->getDefaultShipping()
632
                && $shipping->getSameAsBilling()
633
            ) {
634
                $customerBilling->setIsDefaultShipping(true);
635
            } elseif (isset($customerShipping)
636
                && !$customer->getDefaultShipping()
637
            ) {
638
                $customerShipping->setIsDefaultShipping(true);
639
            }
640
        }
641
        $this->_quote->setCustomer($customer);
642
        return $this;
643
    }
644
645
    /**
646
     * Set up the billing address for the quote and on the customer, and set the customer's
647
     * default billing address.
648
     *
649
     * @param $customer Mage_Customer_Model_Customer
650
     *
651
     * @return Mage_Sales_Model_Quote_Address $billingAddress | null
652
     */
653
    protected function _prepareCustomerBilling(
654
        Mage_Customer_Model_Customer $customer
655
    ) {
656
        $billing = $this->_quote->getBillingAddress();
657
        if (!$billing->getCustomerId() || $billing->getSaveInAddressBook()) {
658
            $customerBilling = $billing->exportCustomerAddress();
659
            $customer->addAddress($customerBilling);
660
            $billing->setCustomerAddress($customerBilling);
661
            if (!$customer->getDefaultBilling()) {
662
                $customerBilling->setIsDefaultBilling(true);
663
            }
664
            return $customerBilling;
665
        }
666
        return null;
667
    }
668
669
    /**
670
     * Setup shipping address and set as customer default if indicated.
671
     *
672
     * @param                                $customer Mage_Customer_Model_Customer
673
     * @param Mage_Sales_Model_Quote_Address $shipping
674
     *
675
     * @return Mage_Sales_Model_Quote_Address $shipping | null
676
     */
677
    protected function _prepareCustomerShipping(
678
        Mage_Customer_Model_Customer $customer,
679
        Mage_Sales_Model_Quote_Address $shipping
680
    ) {
681
        if ($shipping
682
            && ((!$shipping->getCustomerId() && !$shipping->getSameAsBilling())
683
                || (!$shipping->getSameAsBilling()
684
                    && $shipping->getSaveInAddressBook()))
685
        ) {
686
            $customerShipping = $shipping->exportCustomerAddress();
687
            $customer->addAddress($customerShipping);
688
            $shipping->setCustomerAddress($customerShipping);
689
            return $customerShipping;
690
        }
691
        return null;
692
    }
693
694
    /**
695
     * Involve new customer to system
696
     *
697
     * @return self
698
     */
699
    protected function _involveNewCustomer()
700
    {
701
        $customer = $this->_quote->getCustomer();
702
        if ($customer->isConfirmationRequired()) {
703
            $customer->sendNewAccountEmail('confirmation');
704
            $url = Mage::helper('customer')->getEmailConfirmationUrl(
705
                $customer->getEmail()
706
            );
707
            $this->_getCustomerSession()->addSuccess(
708
                Mage::helper('customer')->__(
709
                    'Account confirmation is required. Please, check your e-mail for confirmation link. To resend confirmation email please <a href="%s">click here</a>.',
710
                    $url
711
                )
712
            );
713
        } else {
714
            $customer->sendNewAccountEmail();
715
            $this->_getCustomerSession()->loginById($customer->getId());
716
        }
717
        return $this;
718
    }
719
720
    /**
721
     * Set customer session object
722
     *
723
     * @return self
724
     */
725
    public function setCustomerSession(
726
        Mage_Customer_Model_Session $customerSession
727
    ) {
728
        $this->_customerSession = $customerSession;
729
        return $this;
730
    }
731
732
    /**
733
     * Get customer session object
734
     *
735
     * @return Mage_Customer_Model_Session
736
     */
737
    protected function _getCustomerSession()
738
    {
739
        return $this->_customerSession;
740
    }
741
}
742