From e05b3288b14a6cfd85baec216dcc735e55714d93 Mon Sep 17 00:00:00 2001 From: Rohit Jain Date: Thu, 21 Feb 2019 14:09:29 +0530 Subject: [PATCH] V1.3.2 released: Guest Checkout, New Designed Checkout Page, Custom CMS Link, Data cleaner Module --- .travis.yml | 2 +- CHANGELOG.txt | 32 +- .../controllers/products/associations.tpl | 4 +- classes/Address.php | 2 + classes/Category.php | 9 +- classes/Feature.php | 2 +- classes/Hook.php | 9 +- .../checkoutProcess/AbstractCheckoutStep.php | 82 + .../CheckoutCartSummaryStep.php | 44 + .../CheckoutCustomerDetailsStep.php | 77 + .../checkoutProcess/CheckoutPaymentStep.php | 37 + classes/checkoutProcess/CheckoutProcess.php | 109 + .../checkoutProcess/CheckoutStepInterface.php | 11 +- .../admin/AdminCategoriesController.php | 7 +- .../AdminCustomerPreferencesController.php | 7 + controllers/admin/AdminFeaturesController.php | 1358 +++--- .../admin/AdminOrderPreferencesController.php | 6 +- controllers/admin/AdminProductsController.php | 7 +- controllers/front/AuthController.php | 1516 ++++--- controllers/front/CartController.php | 7 +- controllers/front/GuestTrackingController.php | 186 +- controllers/front/OrderDetailController.php | 223 +- controllers/front/OrderOpcController.php | 125 +- install/controllers/console/process.php | 1 + install/controllers/http/configure.php | 2 + install/controllers/http/process.php | 23 +- install/controllers/http/system.php | 2 +- install/data/xml/quick_access.xml | 3 - install/data/xml/tab.xml | 4 +- install/fixtures/fashion/data/connections.xml | 2 +- install/install_version.php | 2 +- install/langs/bg/data/quick_access.xml | 1 - install/langs/en/data/quick_access.xml | 1 - install/langs/hr/data/quick_access.xml | 1 - install/langs/hu/data/quick_access.xml | 1 - install/langs/lt/data/quick_access.xml | 1 - install/langs/mk/data/quick_access.xml | 1 - install/langs/no/data/quick_access.xml | 1 - install/langs/si/data/quick_access.xml | 1 - install/langs/sr/data/quick_access.xml | 1 - install/langs/sv/data/quick_access.xml | 1 - install/langs/zh/data/quick_access.xml | 1 - install/models/install.php | 1 + install/theme/views/configure.phtml | 10 +- modules/hotelreservationsystem/CHANGELOG.txt | 30 + .../classes/HotelBookingDetail.php | 2 +- .../classes/HotelBranchInformation.php | 173 +- .../classes/HotelCartBookingData.php | 213 +- .../classes/HotelHelper.php | 39 +- .../classes/HotelImage.php | 14 +- .../admin/AdminAddHotelController.php | 42 +- ...minHotelConfigurationSettingController.php | 1 + .../AdminHotelGeneralSettingsController.php | 18 +- .../admin/AdminHotelfeaturesController.php | 2 + .../hotelreservationsystem.php | 2 +- .../views/css/HotelReservationAdmin.css | 3 + .../helpers/view/view.tpl | 112 +- modules/paypal/Readme.md | 36 + modules/paypal/about.php | 44 + modules/paypal/api/.htaccess | 2 + modules/paypal/api/ApiPaypalPlus.php | 382 ++ modules/paypal/api/CallApiPaypalPlus.php | 209 + modules/paypal/api/index.php | 33 + modules/paypal/api/paypal_connect.php | 183 + modules/paypal/api/paypal_lib.php | 115 + modules/paypal/api/sdk/braintree/index.php | 35 + .../api/sdk/braintree/lib/Braintree.php | 25 + .../Braintree/AccountUpdaterDailyReport.php | 45 + .../api/sdk/braintree/lib/Braintree/AddOn.php | 29 + .../braintree/lib/Braintree/AddOnGateway.php | 53 + .../sdk/braintree/lib/Braintree/Address.php | 151 + .../lib/Braintree/AddressGateway.php | 310 ++ .../lib/Braintree/AmexExpressCheckoutCard.php | 81 + .../lib/Braintree/AndroidPayCard.php | 90 + .../braintree/lib/Braintree/ApplePayCard.php | 100 + .../api/sdk/braintree/lib/Braintree/Base.php | 77 + .../braintree/lib/Braintree/ClientToken.php | 49 + .../lib/Braintree/ClientTokenGateway.php | 129 + .../lib/Braintree/CoinbaseAccount.php | 112 + .../braintree/lib/Braintree/Collection.php | 162 + .../braintree/lib/Braintree/Configuration.php | 500 ++ .../lib/Braintree/CredentialsParser.php | 148 + .../braintree/lib/Braintree/CreditCard.php | 315 ++ .../lib/Braintree/CreditCardGateway.php | 485 ++ .../lib/Braintree/CreditCardVerification.php | 43 + .../CreditCardVerificationGateway.php | 74 + .../CreditCardVerificationSearch.php | 56 + .../sdk/braintree/lib/Braintree/Customer.php | 396 ++ .../lib/Braintree/CustomerGateway.php | 623 +++ .../lib/Braintree/CustomerSearch.php | 34 + .../braintree/lib/Braintree/Descriptor.php | 7 + .../sdk/braintree/lib/Braintree/Digest.php | 62 + .../braintree/lib/Braintree/Disbursement.php | 52 + .../lib/Braintree/DisbursementDetails.php | 25 + .../sdk/braintree/lib/Braintree/Discount.php | 21 + .../lib/Braintree/DiscountGateway.php | 31 + .../sdk/braintree/lib/Braintree/Dispute.php | 82 + .../Braintree/Dispute/TransactionDetails.php | 27 + .../braintree/lib/Braintree/Dispute/index.php | 35 + .../braintree/lib/Braintree/EqualityNode.php | 12 + .../braintree/lib/Braintree/Error/Codes.php | 509 +++ .../lib/Braintree/Error/ErrorCollection.php | 114 + .../lib/Braintree/Error/Validation.php | 61 + .../Error/ValidationErrorCollection.php | 132 + .../braintree/lib/Braintree/Error/index.php | 35 + .../lib/Braintree/EuropeBankAccount.php | 68 + .../sdk/braintree/lib/Braintree/Exception.php | 14 + .../Braintree/Exception/Authentication.php | 18 + .../lib/Braintree/Exception/Authorization.php | 20 + .../lib/Braintree/Exception/Configuration.php | 17 + .../Exception/DownForMaintenance.php | 17 + .../Braintree/Exception/ForgedQueryString.php | 21 + .../Braintree/Exception/InvalidChallenge.php | 9 + .../Braintree/Exception/InvalidSignature.php | 9 + .../lib/Braintree/Exception/NotFound.php | 17 + .../Braintree/Exception/SSLCaFileNotFound.php | 17 + .../Braintree/Exception/SSLCertificate.php | 17 + .../lib/Braintree/Exception/ServerError.php | 17 + .../TestOperationPerformedInProduction.php | 16 + .../lib/Braintree/Exception/Timeout.php | 17 + .../lib/Braintree/Exception/Unexpected.php | 18 + .../Braintree/Exception/UpgradeRequired.php | 17 + .../Braintree/Exception/ValidationsFailed.php | 17 + .../lib/Braintree/Exception/index.php | 35 + .../lib/Braintree/FacilitatorDetails.php | 30 + .../sdk/braintree/lib/Braintree/Gateway.php | 198 + .../api/sdk/braintree/lib/Braintree/Http.php | 188 + .../sdk/braintree/lib/Braintree/Instance.php | 75 + .../sdk/braintree/lib/Braintree/IsNode.php | 24 + .../braintree/lib/Braintree/KeyValueNode.php | 23 + .../sdk/braintree/lib/Braintree/Merchant.php | 28 + .../lib/Braintree/MerchantAccount.php | 64 + .../MerchantAccount/AddressDetails.php | 10 + .../MerchantAccount/BusinessDetails.php | 23 + .../MerchantAccount/FundingDetails.php | 10 + .../MerchantAccount/IndividualDetails.php | 23 + .../lib/Braintree/MerchantAccount/index.php | 35 + .../lib/Braintree/MerchantAccountGateway.php | 154 + .../lib/Braintree/MerchantGateway.php | 42 + .../braintree/lib/Braintree/Modification.php | 22 + .../lib/Braintree/MultipleValueNode.php | 41 + .../lib/Braintree/MultipleValueOrTextNode.php | 47 + .../lib/Braintree/OAuthCredentials.php | 36 + .../braintree/lib/Braintree/OAuthGateway.php | 105 + .../lib/Braintree/PartialMatchNode.php | 18 + .../lib/Braintree/PartnerMerchant.php | 42 + .../braintree/lib/Braintree/PayPalAccount.php | 111 + .../lib/Braintree/PayPalAccountGateway.php | 180 + .../lib/Braintree/PaymentInstrumentType.php | 13 + .../braintree/lib/Braintree/PaymentMethod.php | 47 + .../lib/Braintree/PaymentMethodGateway.php | 300 ++ .../lib/Braintree/PaymentMethodNonce.php | 55 + .../Braintree/PaymentMethodNonceGateway.php | 67 + .../api/sdk/braintree/lib/Braintree/Plan.php | 51 + .../braintree/lib/Braintree/PlanGateway.php | 34 + .../sdk/braintree/lib/Braintree/RangeNode.php | 40 + .../lib/Braintree/ResourceCollection.php | 146 + .../Result/CreditCardVerification.php | 99 + .../braintree/lib/Braintree/Result/Error.php | 124 + .../lib/Braintree/Result/Successful.php | 93 + .../braintree/lib/Braintree/Result/index.php | 35 + .../sdk/braintree/lib/Braintree/RiskData.php | 30 + .../lib/Braintree/SettlementBatchSummary.php | 45 + .../SettlementBatchSummaryGateway.php | 106 + .../lib/Braintree/SignatureService.php | 24 + .../braintree/lib/Braintree/Subscription.php | 141 + .../Braintree/Subscription/StatusDetails.php | 23 + .../lib/Braintree/Subscription/index.php | 35 + .../lib/Braintree/SubscriptionGateway.php | 215 + .../lib/Braintree/SubscriptionSearch.php | 67 + .../lib/Braintree/Test/CreditCardNumbers.php | 76 + .../lib/Braintree/Test/MerchantAccount.php | 22 + .../braintree/lib/Braintree/Test/Nonces.php | 70 + .../lib/Braintree/Test/Transaction.php | 64 + .../lib/Braintree/Test/TransactionAmounts.php | 19 + .../braintree/lib/Braintree/Test/VenmoSdk.php | 31 + .../braintree/lib/Braintree/Test/index.php | 35 + .../lib/Braintree/TestingGateway.php | 52 + .../sdk/braintree/lib/Braintree/TextNode.php | 12 + .../lib/Braintree/ThreeDSecureInfo.php | 30 + .../braintree/lib/Braintree/Transaction.php | 557 +++ .../Braintree/Transaction/AddressDetails.php | 28 + .../AmexExpressCheckoutCardDetails.php | 45 + .../Transaction/AndroidPayCardDetails.php | 49 + .../Transaction/ApplePayCardDetails.php | 41 + .../Braintree/Transaction/CoinbaseDetails.php | 40 + .../Transaction/CreditCardDetails.php | 39 + .../Braintree/Transaction/CustomerDetails.php | 26 + .../Transaction/EuropeBankAccountDetails.php | 25 + .../Braintree/Transaction/PayPalDetails.php | 43 + .../Braintree/Transaction/StatusDetails.php | 22 + .../Transaction/SubscriptionDetails.php | 20 + .../Transaction/VenmoAccountDetails.php | 40 + .../lib/Braintree/Transaction/index.php | 35 + .../lib/Braintree/TransactionGateway.php | 481 ++ .../lib/Braintree/TransactionSearch.php | 129 + .../lib/Braintree/TransparentRedirect.php | 101 + .../Braintree/TransparentRedirectGateway.php | 290 ++ .../lib/Braintree/UnknownPaymentMethod.php | 71 + .../api/sdk/braintree/lib/Braintree/Util.php | 411 ++ .../braintree/lib/Braintree/VenmoAccount.php | 75 + .../sdk/braintree/lib/Braintree/Version.php | 36 + .../lib/Braintree/WebhookNotification.php | 135 + .../lib/Braintree/WebhookTesting.php | 340 ++ .../api/sdk/braintree/lib/Braintree/Xml.php | 41 + .../braintree/lib/Braintree/Xml/Generator.php | 151 + .../braintree/lib/Braintree/Xml/Parser.php | 142 + .../sdk/braintree/lib/Braintree/Xml/index.php | 35 + .../api/sdk/braintree/lib/Braintree/index.php | 35 + .../paypal/api/sdk/braintree/lib/autoload.php | 20 + .../paypal/api/sdk/braintree/lib/index.php | 35 + .../lib/ssl/api_braintreegateway_com.ca.crt | 191 + .../api/sdk/braintree/lib/ssl/index.php | 35 + modules/paypal/api/sdk/index.php | 33 + modules/paypal/br.php | 133 + .../classes/AuthenticatePaymentMethods.php | 220 + modules/paypal/classes/Braintree.php | 339 ++ modules/paypal/classes/PaypalCapture.php | 172 + modules/paypal/classes/PaypalPlusPui.php | 53 + modules/paypal/classes/index.php | 35 + .../controllers/front/braintreesubmit.php | 165 + modules/paypal/controllers/front/confirm.php | 58 + .../front/expresscheckoutsubmit.php | 33 + modules/paypal/controllers/front/index.php | 35 + .../front/integralevolutionsubmit.php | 33 + .../paypal/controllers/front/pluspatch.php | 58 + modules/paypal/controllers/front/submit.php | 161 + .../paypal/controllers/front/submitplus.php | 299 ++ modules/paypal/controllers/index.php | 35 + modules/paypal/de.php | 284 ++ modules/paypal/en.php | 277 ++ modules/paypal/es.php | 93 + modules/paypal/express_checkout/ajax.php | 58 + modules/paypal/express_checkout/index.php | 35 + modules/paypal/express_checkout/payment.php | 456 ++ modules/paypal/express_checkout/process.php | 599 +++ modules/paypal/express_checkout/submit.php | 99 + modules/paypal/fr.php | 352 ++ modules/paypal/img/fancybox/index.php | 35 + modules/paypal/img/index.php | 35 + modules/paypal/index.php | 35 + modules/paypal/integral_evolution/confirm.php | 43 + modules/paypal/integral_evolution/index.php | 35 + .../paypal/integral_evolution/notifier.php | 113 + modules/paypal/integral_evolution/submit.php | 101 + modules/paypal/ipn.php | 240 + modules/paypal/it.php | 157 + modules/paypal/log/braintree_log.txt | 6 + modules/paypal/log/index.php | 35 + modules/paypal/logo.gif | Bin 0 -> 6051 bytes modules/paypal/logo.png | Bin 0 -> 6051 bytes modules/paypal/logos.xml | 349 ++ modules/paypal/mails/br/error_reporting.html | 43 + modules/paypal/mails/br/error_reporting.txt | 9 + modules/paypal/mails/br/index.php | 35 + modules/paypal/mails/de/error_reporting.html | 46 + modules/paypal/mails/de/error_reporting.txt | 9 + modules/paypal/mails/de/index.php | 35 + modules/paypal/mails/en/error_reporting.html | 42 + modules/paypal/mails/en/error_reporting.txt | 9 + modules/paypal/mails/en/index.php | 35 + modules/paypal/mails/es/error_reporting.html | 46 + modules/paypal/mails/es/error_reporting.txt | 9 + modules/paypal/mails/es/index.php | 35 + modules/paypal/mails/fr/error_reporting.html | 42 + modules/paypal/mails/fr/error_reporting.txt | 9 + modules/paypal/mails/fr/index.php | 35 + modules/paypal/mails/index.php | 35 + modules/paypal/mails/it/error_reporting.html | 46 + modules/paypal/mails/it/error_reporting.txt | 9 + modules/paypal/mails/it/index.php | 35 + modules/paypal/mails/nl/index.php | 35 + modules/paypal/mails/pl/index.php | 35 + modules/paypal/mails/pt/error_reporting.html | 43 + modules/paypal/mails/pt/error_reporting.txt | 9 + modules/paypal/mails/pt/index.php | 35 + modules/paypal/nl.php | 182 + modules/paypal/paypal.php | 2649 +++++++++++ modules/paypal/paypal_install.php | 287 ++ .../paypal/paypal_login/PayPalLoginUser.php | 141 + modules/paypal/paypal_login/index.php | 35 + modules/paypal/paypal_login/paypal_login.php | 255 ++ .../paypal_login/paypal_login_token.php | 59 + modules/paypal/paypal_logos.php | 153 + modules/paypal/paypal_orders.php | 155 + modules/paypal/paypal_plus/index.php | 35 + modules/paypal/paypal_plus/submit.php | 237 + modules/paypal/paypal_tools.php | 88 + modules/paypal/pl.php | 128 + modules/paypal/pt.php | 202 + modules/paypal/sdk/index.php | 35 + modules/paypal/sdk/paypalREST/index.php | 35 + .../paypal/sdk/paypalREST/vendor/index.php | 35 + .../sdk/paypalREST/vendor/paypal/index.php | 35 + .../vendor/paypal/rest-api-sdk-php/index.php | 35 + .../paypal/rest-api-sdk-php/var/auth.cache | 1 + .../paypal/rest-api-sdk-php/var/index.php | 35 + modules/paypal/tr.php | 69 + modules/paypal/translations.xml | 4008 +++++++++++++++++ modules/paypal/translations/index.php | 35 + modules/paypal/upgrade/index.php | 35 + modules/paypal/upgrade/install-2.8.php | 129 + modules/paypal/upgrade/install-3.0.php | 83 + modules/paypal/upgrade/install-3.10.1.php | 42 + modules/paypal/upgrade/install-3.10.10.php | 38 + modules/paypal/upgrade/install-3.10.4.php | 35 + modules/paypal/upgrade/install-3.11.2.php | 87 + modules/paypal/upgrade/install-3.11.php | 68 + modules/paypal/upgrade/install-3.7.php | 59 + modules/paypal/upgrade/install-3.8.3.php | 60 + modules/paypal/upgrade/install-3.9.php | 53 + modules/paypal/views/css/index.php | 35 + .../paypal/views/css/paypal-cart-summary.css | 8 + modules/paypal/views/css/paypal.css | 242 + modules/paypal/views/css/paypal_1_4.css | 6 + .../css/paypal_1_4_paypal-cart-summary.css | 31 + .../css/paypal_1_5_paypal-cart-summary.css | 4 + modules/paypal/views/img/bg-button.png | Bin 0 -> 188 bytes modules/paypal/views/img/bg-call-button.png | Bin 0 -> 204 bytes modules/paypal/views/img/blue_tick.png | Bin 0 -> 1194 bytes .../paypal/views/img/bo-cards/AU_bo_cards.png | Bin 0 -> 18609 bytes .../paypal/views/img/bo-cards/CN_bo_cards.png | Bin 0 -> 18922 bytes .../paypal/views/img/bo-cards/DE_bo_cards.png | Bin 0 -> 10449 bytes .../paypal/views/img/bo-cards/ES_bo_cards.png | Bin 0 -> 22210 bytes .../paypal/views/img/bo-cards/FR_bo_cards.png | Bin 0 -> 13225 bytes .../paypal/views/img/bo-cards/GB_bo_cards.png | Bin 0 -> 16845 bytes .../paypal/views/img/bo-cards/HK_bo_cards.png | Bin 0 -> 11079 bytes .../paypal/views/img/bo-cards/IT_bo_cards.png | Bin 0 -> 13153 bytes .../paypal/views/img/bo-cards/MY_bo_cards.png | Bin 0 -> 6787 bytes .../paypal/views/img/bo-cards/NZ_bo_cards.png | Bin 0 -> 17860 bytes .../paypal/views/img/bo-cards/PL_bo_cards.png | Bin 0 -> 16354 bytes .../views/img/bo-cards/PayPal_bo_cards.png | Bin 0 -> 3031 bytes .../paypal/views/img/bo-cards/RA_bo_cards.png | Bin 0 -> 10788 bytes .../paypal/views/img/bo-cards/RE_bo_cards.png | Bin 0 -> 10788 bytes .../paypal/views/img/bo-cards/SG_bo_cards.png | Bin 0 -> 6738 bytes .../paypal/views/img/bo-cards/TH_bo_cards.png | Bin 0 -> 6768 bytes .../paypal/views/img/bo-cards/TR_bo_cards.png | Bin 0 -> 6768 bytes .../paypal/views/img/bo-cards/TW_bo_cards.png | Bin 0 -> 6768 bytes modules/paypal/views/img/bo-cards/default.png | Bin 0 -> 11585 bytes modules/paypal/views/img/bo-cards/index.php | 35 + modules/paypal/views/img/braintree.png | Bin 0 -> 1104 bytes modules/paypal/views/img/call.png | Bin 0 -> 1370 bytes .../default_logos/AU_vertical_solution_PP.png | Bin 0 -> 10408 bytes .../BE_horizontal_solution_PP.png | Bin 0 -> 18110 bytes .../default_logos/BE_vertical_solution_PP.png | Bin 0 -> 23896 bytes .../DE_horizontal_solution_PP.gif | Bin 0 -> 1670 bytes .../default_logos/DE_vertical_solution_PP.gif | Bin 0 -> 1670 bytes .../default_logos/FR_vertical_solution_PP.png | Bin 0 -> 10725 bytes .../PL_horizontal_solution_PP.png | Bin 0 -> 16413 bytes .../default_logos/PL_vertical_solution_PP.png | Bin 0 -> 16941 bytes .../RA_horizontal_solution_PP.png | Bin 0 -> 16413 bytes .../default_logos/RA_vertical_solution_PP.png | Bin 0 -> 16941 bytes .../RE_horizontal_solution_PP.png | Bin 0 -> 16413 bytes .../default_logos/RE_vertical_solution_PP.png | Bin 0 -> 16941 bytes .../img/default_logos/default_horizontal.png | Bin 0 -> 17138 bytes .../views/img/default_logos/default_logo.gif | Bin 0 -> 956 bytes .../img/default_logos/default_vertical.png | Bin 0 -> 24518 bytes .../paypal/views/img/default_logos/index.php | 35 + modules/paypal/views/img/index.php | 35 + modules/paypal/views/img/logos/BRAINTREE.png | Bin 0 -> 3088 bytes .../img/logos/DE_de-btn-expresscheckout.gif | Bin 0 -> 2750 bytes .../views/img/logos/DE_de-pp-logo-100px.png | Bin 0 -> 3415 bytes .../views/img/logos/DE_de-pp-logo-150px.png | Bin 0 -> 4457 bytes .../views/img/logos/DE_de-pp-logo-200px.png | Bin 0 -> 4743 bytes .../views/img/logos/DE_pp_cc_mark_111x69.jpg | Bin 0 -> 11005 bytes .../views/img/logos/DE_pp_cc_mark_37x23.jpg | Bin 0 -> 6051 bytes .../views/img/logos/DE_pp_cc_mark_74x46.jpg | Bin 0 -> 8101 bytes .../FR_logo_paypal_moyens_paiement_fr.jpg | Bin 0 -> 11105 bytes .../views/img/logos/FR_pp_cc_mark_111x69.jpg | Bin 0 -> 11005 bytes .../views/img/logos/FR_pp_cc_mark_37x23.jpg | Bin 0 -> 6051 bytes .../views/img/logos/FR_pp_cc_mark_74x46.jpg | Bin 0 -> 8101 bytes .../views/img/logos/US_PayPal_logo_100x45.gif | Bin 0 -> 1380 bytes .../views/img/logos/US_PayPal_logo_150x65.gif | Bin 0 -> 1633 bytes .../views/img/logos/US_PayPal_logo_80x35.gif | Bin 0 -> 1188 bytes .../views/img/logos/US_PayPal_mark_37x23.gif | Bin 0 -> 812 bytes .../views/img/logos/US_PayPal_mark_50x34.gif | Bin 0 -> 1050 bytes .../views/img/logos/US_PayPal_mark_60x38.gif | Bin 0 -> 956 bytes .../logos/US_horizontal_solution_PPeCheck.gif | Bin 0 -> 5015 bytes .../logos/US_vertical_solution_PPeCheck.gif | Bin 0 -> 6122 bytes .../views/img/logos/braintree_cards.png | Bin 0 -> 13105 bytes .../img/logos/default_PayPal_logo_100x45.gif | Bin 0 -> 1380 bytes .../img/logos/default_PayPal_logo_150x65.gif | Bin 0 -> 1633 bytes .../img/logos/default_PayPal_logo_80x35.gif | Bin 0 -> 1188 bytes .../img/logos/default_PayPal_mark_37x23.gif | Bin 0 -> 812 bytes .../img/logos/default_PayPal_mark_50x34.gif | Bin 0 -> 1050 bytes .../img/logos/default_PayPal_mark_60x38.gif | Bin 0 -> 956 bytes .../CO_de_DE_orange_295x43.png | Bin 0 -> 7831 bytes .../CO_en_EN_orange_295x43.png | Bin 0 -> 7254 bytes .../CO_en_US_orange_295x43.png | Bin 0 -> 7254 bytes .../CO_es_ES_orange_295x43.png | Bin 0 -> 7247 bytes .../CO_fr_FR_orange_295x43.png | Bin 0 -> 7215 bytes .../CO_it_IT_orange_295x43.png | Bin 0 -> 7274 bytes .../CO_ja_JP_orange_295x43.png | Bin 0 -> 7635 bytes .../CO_nl_NL_orange_295x43.png | Bin 0 -> 7092 bytes .../CO_pl_PL_orange_295x43.png | Bin 0 -> 8447 bytes .../CO_pt_BR_orange_295x43.png | Bin 0 -> 8391 bytes .../CO_zh_CN_orange_295x43.png | Bin 0 -> 7511 bytes .../CO_zh_HK_orange_295x43.png | Bin 0 -> 7334 bytes .../CO_zh_TW_orange_295x43.png | Bin 0 -> 7334 bytes .../logos/express_checkout_mobile/index.php | 35 + modules/paypal/views/img/logos/index.php | 35 + .../paypal/views/img/logos/os_braintree.png | Bin 0 -> 727 bytes modules/paypal/views/img/mail.png | Bin 0 -> 693 bytes modules/paypal/views/img/paypal.gif | Bin 0 -> 1525 bytes .../paypal/views/img/paypal_login_blue.png | Bin 0 -> 9471 bytes .../paypal/views/img/paypal_login_grey.png | Bin 0 -> 9633 bytes modules/paypal/views/img/sprites.png | Bin 0 -> 816 bytes modules/paypal/views/img/template.png | Bin 0 -> 39589 bytes modules/paypal/views/index.php | 35 + modules/paypal/views/js/back_office.js | 447 ++ modules/paypal/views/js/index.php | 35 + modules/paypal/views/js/paypal.js | 256 ++ modules/paypal/views/js/paypal_login.js | 68 + .../templates/admin/admin_order/capture.tpl | 100 + .../templates/admin/admin_order/index.php | 35 + .../templates/admin/admin_order/refund.tpl | 58 + .../admin/admin_order/validation.tpl | 56 + .../views/templates/admin/back_office.tpl | 500 ++ .../templates/admin/button_braintree.tpl | 62 + .../paypal/views/templates/admin/header.tpl | 34 + .../paypal/views/templates/admin/index.php | 35 + .../paypal/views/templates/front/about.tpl | 41 + .../paypal/views/templates/front/error.tpl | 57 + .../paypal/views/templates/front/index.php | 35 + .../front/order-confirmation-mobile.tpl | 69 + .../front/order-confirmation-plus-mobile.tpl | 130 + .../front/order-confirmation-plus.tpl | 131 + .../templates/front/order-confirmation.tpl | 81 + .../views/templates/front/order-summary.tpl | 48 + .../templates/hook/braintree_confirm.tpl | 38 + .../templates/hook/braintree_payment.tpl | 258 ++ .../views/templates/hook/braintree_return.tpl | 34 + .../paypal/views/templates/hook/column.tpl | 28 + .../views/templates/hook/confirmation.tpl | 32 + .../hook/express_checkout_payment.tpl | 96 + .../hook/express_checkout_payment_eu.tpl | 30 + .../hook/express_checkout_shortcut_button.tpl | 42 + .../hook/express_checkout_shortcut_form.tpl | 50 + modules/paypal/views/templates/hook/index.php | 35 + .../hook/integral_evolution_payment.tpl | 122 + .../hook/integral_evolution_payment_eu.tpl | 71 + .../templates/hook/paypal_cart_summary.tpl | 89 + .../templates/hook/paypal_plus_payment.tpl | 138 + .../templates/hook/paypal_plus_payment_eu.tpl | 55 + .../hook/paypal_plus_payment_eu_legal.tpl | 84 + modules/paypal/views/templates/index.php | 35 + modules/pscleaner/CHANGELOG.txt | 3 + modules/pscleaner/Readme.md | 3 + .../pscleaner/classes/WkPsCleanerHelper.php | 72 + modules/pscleaner/classes/index.php | 29 + modules/pscleaner/index.php | 35 + modules/pscleaner/logo.gif | Bin 0 -> 1089 bytes modules/pscleaner/logo.png | Bin 0 -> 935 bytes modules/pscleaner/pscleaner.php | 834 ++++ modules/pscleaner/translations/en.php | 33 + modules/pscleaner/translations/fr.php | 33 + modules/pscleaner/translations/index.php | 35 + modules/pscleaner/views/index.php | 35 + .../admin/_configure/helpers/form/form.tpl | 59 + .../admin/_configure/helpers/form/index.php | 35 + .../admin/_configure/helpers/index.php | 35 + .../templates/admin/_configure/index.php | 35 + .../pscleaner/views/templates/admin/index.php | 35 + modules/pscleaner/views/templates/index.php | 35 + modules/wkabouthotelblock/CHANGELOG.txt | 21 + .../classes/WkHotelInteriorImage.php | 42 +- .../AdminAboutHotelBlockSettingController.php | 68 +- .../hook/aboutHotelBlockModuleSetting.tpl | 2 +- .../wkabouthotelblock/wkabouthotelblock.php | 15 +- modules/wkfooterexploreblock/CHANGELOG.txt | 18 + .../classes/WkCustomExploreLink.php | 165 + .../wkfooterexploreblock/classes/index.php | 29 + ...dminCustomExploreLinkSettingController.php | 339 ++ .../controllers/admin/index.php | 29 + .../controllers/index.php | 29 + modules/wkfooterexploreblock/install.sql | 38 + .../views/js/admin/index.php | 29 + .../views/js/admin/wk_explore_link.js | 39 + .../helpers/form/form.tpl | 208 + .../helpers/form/index.php | 29 + .../helpers/index.php | 29 + .../custom_explore_link_setting/index.php | 29 + .../views/templates/admin/index.php | 29 + .../hook/customExploreLinkSetting.tpl | 28 + .../hook/hotelExternalNaviagtionMenu.tpl | 26 + .../templates/hook/wkFooterExploreBlock.tpl | 79 +- .../wkfooterexploreblock.php | 142 +- modules/wkfooterpaymentblock/CHANGELOG.txt | 13 + ...minFooterPaymentBlockSettingController.php | 6 +- .../hook/footerPaymentSettingLink.tpl | 2 +- .../wkfooterpaymentblock.php | 2 +- modules/wkhotelfeaturesblock/CHANGELOG.txt | 30 + .../classes/WkHotelFeaturesData.php | 33 +- .../AdminFeaturesModuleSettingController.php | 97 +- modules/wkhotelfeaturesblock/install.sql | 4 - .../views/img/dummy_img/1.jpg | Bin 16995 -> 21686 bytes .../views/img/dummy_img/2.jpg | Bin 21018 -> 26859 bytes .../views/img/dummy_img/3.jpg | Bin 33610 -> 43245 bytes .../views/img/dummy_img/4.jpg | Bin 55824 -> 60106 bytes .../views/js/hotel_features_block.js | 67 - .../hook/hotelFeatureSettingLink.tpl | 2 +- .../templates/hook/hotelfeaturescontent.tpl | 2 +- .../wkhotelfeaturesblock.php | 18 +- modules/wkhotelroom/CHANGELOG.txt | 25 + .../classes/WkHotelRoomDisplay.php | 15 +- .../AdminHotelRoomModuleSettingController.php | 91 +- .../templates/hook/hotelRoomSettingLink.tpl | 2 +- modules/wkhotelroom/wkhotelroom.php | 29 +- modules/wktestimonialblock/CHANGELOG.txt | 22 + .../classes/WkHotelTestimonialData.php | 51 +- ...minTestimonialsModuleSettingController.php | 82 +- .../hook/hotelTestimonialSettingLink.tpl | 2 +- .../wktestimonialblock/wktestimonialblock.php | 14 +- themes/hotel-reservation-theme/addresses.tpl | 10 +- themes/hotel-reservation-theme/css/global.css | 97 +- .../hotel-reservation-theme/css/order-opc.css | 553 ++- .../guest-tracking.tpl | 12 +- .../img/icon/form-ok-circle.svg | 35 + .../hotel-reservation-theme/js/order-opc.js | 45 +- .../js/tools/statesManagement.js | 2 +- .../hotel-reservation-theme/order-detail.tpl | 61 +- .../order-opc-advanced-payment-option.tpl | 88 +- .../order-opc-new-account.tpl | 511 +-- themes/hotel-reservation-theme/order-opc.tpl | 440 +- .../order-payment-classic.tpl | 11 + .../hotel-reservation-theme/order-payment.tpl | 3 - .../hotel-reservation-theme/shopping-cart.tpl | 475 +- .../themeconfigurator.php | 851 ---- 528 files changed, 41049 insertions(+), 4031 deletions(-) create mode 100644 classes/checkoutProcess/AbstractCheckoutStep.php create mode 100644 classes/checkoutProcess/CheckoutCartSummaryStep.php create mode 100644 classes/checkoutProcess/CheckoutCustomerDetailsStep.php create mode 100644 classes/checkoutProcess/CheckoutPaymentStep.php create mode 100644 classes/checkoutProcess/CheckoutProcess.php rename modules/wkfooterexploreblock/views/js/wkFooterExploreBlockFront.js => classes/checkoutProcess/CheckoutStepInterface.php (73%) create mode 100644 modules/paypal/Readme.md create mode 100644 modules/paypal/about.php create mode 100644 modules/paypal/api/.htaccess create mode 100644 modules/paypal/api/ApiPaypalPlus.php create mode 100644 modules/paypal/api/CallApiPaypalPlus.php create mode 100644 modules/paypal/api/index.php create mode 100644 modules/paypal/api/paypal_connect.php create mode 100644 modules/paypal/api/paypal_lib.php create mode 100644 modules/paypal/api/sdk/braintree/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/AccountUpdaterDailyReport.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/AddOn.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/AddOnGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Address.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/AddressGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/AmexExpressCheckoutCard.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/AndroidPayCard.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/ApplePayCard.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Base.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/ClientToken.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/ClientTokenGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/CoinbaseAccount.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Collection.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Configuration.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/CredentialsParser.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/CreditCard.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerification.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerificationGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerificationSearch.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Customer.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/CustomerGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/CustomerSearch.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Descriptor.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Digest.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Disbursement.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/DisbursementDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Discount.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/DiscountGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Dispute.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Dispute/TransactionDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Dispute/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/EqualityNode.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Error/Codes.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Error/ErrorCollection.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Error/Validation.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Error/ValidationErrorCollection.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Error/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/EuropeBankAccount.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/Authentication.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/Authorization.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/Configuration.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/DownForMaintenance.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/ForgedQueryString.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/InvalidChallenge.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/InvalidSignature.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/NotFound.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/SSLCaFileNotFound.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/SSLCertificate.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/ServerError.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/TestOperationPerformedInProduction.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/Timeout.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/Unexpected.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/UpgradeRequired.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/ValidationsFailed.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Exception/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/FacilitatorDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Gateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Http.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Instance.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/IsNode.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/KeyValueNode.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Merchant.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/AddressDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/BusinessDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/FundingDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/IndividualDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccountGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/MerchantGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Modification.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/MultipleValueNode.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/MultipleValueOrTextNode.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/OAuthCredentials.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/OAuthGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/PartialMatchNode.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/PartnerMerchant.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/PayPalAccount.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/PayPalAccountGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/PaymentInstrumentType.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethod.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodNonce.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodNonceGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Plan.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/PlanGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/RangeNode.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/ResourceCollection.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Result/CreditCardVerification.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Result/Error.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Result/Successful.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Result/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/RiskData.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/SettlementBatchSummary.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/SettlementBatchSummaryGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/SignatureService.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Subscription.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Subscription/StatusDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Subscription/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/SubscriptionGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/SubscriptionSearch.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Test/CreditCardNumbers.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Test/MerchantAccount.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Test/Nonces.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Test/Transaction.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Test/TransactionAmounts.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Test/VenmoSdk.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Test/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/TestingGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/TextNode.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/ThreeDSecureInfo.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/AddressDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/AmexExpressCheckoutCardDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/AndroidPayCardDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/ApplePayCardDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/CoinbaseDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/CreditCardDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/CustomerDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/EuropeBankAccountDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/PayPalDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/StatusDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/SubscriptionDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/VenmoAccountDetails.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/TransactionGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/TransactionSearch.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/TransparentRedirect.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/TransparentRedirectGateway.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/UnknownPaymentMethod.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Util.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/VenmoAccount.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Version.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/WebhookNotification.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/WebhookTesting.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Xml.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Xml/Generator.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Xml/Parser.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/Xml/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/Braintree/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/autoload.php create mode 100644 modules/paypal/api/sdk/braintree/lib/index.php create mode 100644 modules/paypal/api/sdk/braintree/lib/ssl/api_braintreegateway_com.ca.crt create mode 100644 modules/paypal/api/sdk/braintree/lib/ssl/index.php create mode 100644 modules/paypal/api/sdk/index.php create mode 100644 modules/paypal/br.php create mode 100644 modules/paypal/classes/AuthenticatePaymentMethods.php create mode 100644 modules/paypal/classes/Braintree.php create mode 100644 modules/paypal/classes/PaypalCapture.php create mode 100644 modules/paypal/classes/PaypalPlusPui.php create mode 100644 modules/paypal/classes/index.php create mode 100644 modules/paypal/controllers/front/braintreesubmit.php create mode 100644 modules/paypal/controllers/front/confirm.php create mode 100644 modules/paypal/controllers/front/expresscheckoutsubmit.php create mode 100644 modules/paypal/controllers/front/index.php create mode 100644 modules/paypal/controllers/front/integralevolutionsubmit.php create mode 100644 modules/paypal/controllers/front/pluspatch.php create mode 100644 modules/paypal/controllers/front/submit.php create mode 100644 modules/paypal/controllers/front/submitplus.php create mode 100644 modules/paypal/controllers/index.php create mode 100644 modules/paypal/de.php create mode 100644 modules/paypal/en.php create mode 100644 modules/paypal/es.php create mode 100644 modules/paypal/express_checkout/ajax.php create mode 100644 modules/paypal/express_checkout/index.php create mode 100644 modules/paypal/express_checkout/payment.php create mode 100644 modules/paypal/express_checkout/process.php create mode 100644 modules/paypal/express_checkout/submit.php create mode 100644 modules/paypal/fr.php create mode 100644 modules/paypal/img/fancybox/index.php create mode 100644 modules/paypal/img/index.php create mode 100644 modules/paypal/index.php create mode 100644 modules/paypal/integral_evolution/confirm.php create mode 100644 modules/paypal/integral_evolution/index.php create mode 100644 modules/paypal/integral_evolution/notifier.php create mode 100644 modules/paypal/integral_evolution/submit.php create mode 100644 modules/paypal/ipn.php create mode 100644 modules/paypal/it.php create mode 100644 modules/paypal/log/braintree_log.txt create mode 100644 modules/paypal/log/index.php create mode 100644 modules/paypal/logo.gif create mode 100644 modules/paypal/logo.png create mode 100644 modules/paypal/logos.xml create mode 100644 modules/paypal/mails/br/error_reporting.html create mode 100644 modules/paypal/mails/br/error_reporting.txt create mode 100644 modules/paypal/mails/br/index.php create mode 100644 modules/paypal/mails/de/error_reporting.html create mode 100644 modules/paypal/mails/de/error_reporting.txt create mode 100644 modules/paypal/mails/de/index.php create mode 100644 modules/paypal/mails/en/error_reporting.html create mode 100644 modules/paypal/mails/en/error_reporting.txt create mode 100644 modules/paypal/mails/en/index.php create mode 100644 modules/paypal/mails/es/error_reporting.html create mode 100644 modules/paypal/mails/es/error_reporting.txt create mode 100644 modules/paypal/mails/es/index.php create mode 100644 modules/paypal/mails/fr/error_reporting.html create mode 100644 modules/paypal/mails/fr/error_reporting.txt create mode 100644 modules/paypal/mails/fr/index.php create mode 100644 modules/paypal/mails/index.php create mode 100644 modules/paypal/mails/it/error_reporting.html create mode 100644 modules/paypal/mails/it/error_reporting.txt create mode 100644 modules/paypal/mails/it/index.php create mode 100644 modules/paypal/mails/nl/index.php create mode 100644 modules/paypal/mails/pl/index.php create mode 100644 modules/paypal/mails/pt/error_reporting.html create mode 100644 modules/paypal/mails/pt/error_reporting.txt create mode 100644 modules/paypal/mails/pt/index.php create mode 100644 modules/paypal/nl.php create mode 100644 modules/paypal/paypal.php create mode 100644 modules/paypal/paypal_install.php create mode 100644 modules/paypal/paypal_login/PayPalLoginUser.php create mode 100644 modules/paypal/paypal_login/index.php create mode 100644 modules/paypal/paypal_login/paypal_login.php create mode 100644 modules/paypal/paypal_login/paypal_login_token.php create mode 100644 modules/paypal/paypal_logos.php create mode 100644 modules/paypal/paypal_orders.php create mode 100644 modules/paypal/paypal_plus/index.php create mode 100644 modules/paypal/paypal_plus/submit.php create mode 100644 modules/paypal/paypal_tools.php create mode 100644 modules/paypal/pl.php create mode 100644 modules/paypal/pt.php create mode 100644 modules/paypal/sdk/index.php create mode 100644 modules/paypal/sdk/paypalREST/index.php create mode 100644 modules/paypal/sdk/paypalREST/vendor/index.php create mode 100644 modules/paypal/sdk/paypalREST/vendor/paypal/index.php create mode 100644 modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/index.php create mode 100644 modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/var/auth.cache create mode 100644 modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/var/index.php create mode 100644 modules/paypal/tr.php create mode 100644 modules/paypal/translations.xml create mode 100644 modules/paypal/translations/index.php create mode 100644 modules/paypal/upgrade/index.php create mode 100644 modules/paypal/upgrade/install-2.8.php create mode 100644 modules/paypal/upgrade/install-3.0.php create mode 100644 modules/paypal/upgrade/install-3.10.1.php create mode 100644 modules/paypal/upgrade/install-3.10.10.php create mode 100644 modules/paypal/upgrade/install-3.10.4.php create mode 100644 modules/paypal/upgrade/install-3.11.2.php create mode 100644 modules/paypal/upgrade/install-3.11.php create mode 100644 modules/paypal/upgrade/install-3.7.php create mode 100644 modules/paypal/upgrade/install-3.8.3.php create mode 100644 modules/paypal/upgrade/install-3.9.php create mode 100644 modules/paypal/views/css/index.php create mode 100644 modules/paypal/views/css/paypal-cart-summary.css create mode 100644 modules/paypal/views/css/paypal.css create mode 100644 modules/paypal/views/css/paypal_1_4.css create mode 100644 modules/paypal/views/css/paypal_1_4_paypal-cart-summary.css create mode 100644 modules/paypal/views/css/paypal_1_5_paypal-cart-summary.css create mode 100644 modules/paypal/views/img/bg-button.png create mode 100644 modules/paypal/views/img/bg-call-button.png create mode 100644 modules/paypal/views/img/blue_tick.png create mode 100644 modules/paypal/views/img/bo-cards/AU_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/CN_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/DE_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/ES_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/FR_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/GB_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/HK_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/IT_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/MY_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/NZ_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/PL_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/PayPal_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/RA_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/RE_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/SG_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/TH_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/TR_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/TW_bo_cards.png create mode 100644 modules/paypal/views/img/bo-cards/default.png create mode 100644 modules/paypal/views/img/bo-cards/index.php create mode 100644 modules/paypal/views/img/braintree.png create mode 100644 modules/paypal/views/img/call.png create mode 100644 modules/paypal/views/img/default_logos/AU_vertical_solution_PP.png create mode 100644 modules/paypal/views/img/default_logos/BE_horizontal_solution_PP.png create mode 100644 modules/paypal/views/img/default_logos/BE_vertical_solution_PP.png create mode 100644 modules/paypal/views/img/default_logos/DE_horizontal_solution_PP.gif create mode 100644 modules/paypal/views/img/default_logos/DE_vertical_solution_PP.gif create mode 100644 modules/paypal/views/img/default_logos/FR_vertical_solution_PP.png create mode 100644 modules/paypal/views/img/default_logos/PL_horizontal_solution_PP.png create mode 100644 modules/paypal/views/img/default_logos/PL_vertical_solution_PP.png create mode 100644 modules/paypal/views/img/default_logos/RA_horizontal_solution_PP.png create mode 100644 modules/paypal/views/img/default_logos/RA_vertical_solution_PP.png create mode 100644 modules/paypal/views/img/default_logos/RE_horizontal_solution_PP.png create mode 100644 modules/paypal/views/img/default_logos/RE_vertical_solution_PP.png create mode 100644 modules/paypal/views/img/default_logos/default_horizontal.png create mode 100644 modules/paypal/views/img/default_logos/default_logo.gif create mode 100644 modules/paypal/views/img/default_logos/default_vertical.png create mode 100644 modules/paypal/views/img/default_logos/index.php create mode 100644 modules/paypal/views/img/index.php create mode 100644 modules/paypal/views/img/logos/BRAINTREE.png create mode 100644 modules/paypal/views/img/logos/DE_de-btn-expresscheckout.gif create mode 100644 modules/paypal/views/img/logos/DE_de-pp-logo-100px.png create mode 100644 modules/paypal/views/img/logos/DE_de-pp-logo-150px.png create mode 100644 modules/paypal/views/img/logos/DE_de-pp-logo-200px.png create mode 100644 modules/paypal/views/img/logos/DE_pp_cc_mark_111x69.jpg create mode 100644 modules/paypal/views/img/logos/DE_pp_cc_mark_37x23.jpg create mode 100644 modules/paypal/views/img/logos/DE_pp_cc_mark_74x46.jpg create mode 100644 modules/paypal/views/img/logos/FR_logo_paypal_moyens_paiement_fr.jpg create mode 100644 modules/paypal/views/img/logos/FR_pp_cc_mark_111x69.jpg create mode 100644 modules/paypal/views/img/logos/FR_pp_cc_mark_37x23.jpg create mode 100644 modules/paypal/views/img/logos/FR_pp_cc_mark_74x46.jpg create mode 100644 modules/paypal/views/img/logos/US_PayPal_logo_100x45.gif create mode 100644 modules/paypal/views/img/logos/US_PayPal_logo_150x65.gif create mode 100644 modules/paypal/views/img/logos/US_PayPal_logo_80x35.gif create mode 100644 modules/paypal/views/img/logos/US_PayPal_mark_37x23.gif create mode 100644 modules/paypal/views/img/logos/US_PayPal_mark_50x34.gif create mode 100644 modules/paypal/views/img/logos/US_PayPal_mark_60x38.gif create mode 100644 modules/paypal/views/img/logos/US_horizontal_solution_PPeCheck.gif create mode 100644 modules/paypal/views/img/logos/US_vertical_solution_PPeCheck.gif create mode 100644 modules/paypal/views/img/logos/braintree_cards.png create mode 100644 modules/paypal/views/img/logos/default_PayPal_logo_100x45.gif create mode 100644 modules/paypal/views/img/logos/default_PayPal_logo_150x65.gif create mode 100644 modules/paypal/views/img/logos/default_PayPal_logo_80x35.gif create mode 100644 modules/paypal/views/img/logos/default_PayPal_mark_37x23.gif create mode 100644 modules/paypal/views/img/logos/default_PayPal_mark_50x34.gif create mode 100644 modules/paypal/views/img/logos/default_PayPal_mark_60x38.gif create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_de_DE_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_en_EN_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_en_US_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_es_ES_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_fr_FR_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_it_IT_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_ja_JP_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_nl_NL_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_pl_PL_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_pt_BR_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_zh_CN_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_zh_HK_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/CO_zh_TW_orange_295x43.png create mode 100644 modules/paypal/views/img/logos/express_checkout_mobile/index.php create mode 100644 modules/paypal/views/img/logos/index.php create mode 100644 modules/paypal/views/img/logos/os_braintree.png create mode 100644 modules/paypal/views/img/mail.png create mode 100644 modules/paypal/views/img/paypal.gif create mode 100644 modules/paypal/views/img/paypal_login_blue.png create mode 100644 modules/paypal/views/img/paypal_login_grey.png create mode 100644 modules/paypal/views/img/sprites.png create mode 100644 modules/paypal/views/img/template.png create mode 100644 modules/paypal/views/index.php create mode 100644 modules/paypal/views/js/back_office.js create mode 100644 modules/paypal/views/js/index.php create mode 100644 modules/paypal/views/js/paypal.js create mode 100644 modules/paypal/views/js/paypal_login.js create mode 100644 modules/paypal/views/templates/admin/admin_order/capture.tpl create mode 100644 modules/paypal/views/templates/admin/admin_order/index.php create mode 100644 modules/paypal/views/templates/admin/admin_order/refund.tpl create mode 100644 modules/paypal/views/templates/admin/admin_order/validation.tpl create mode 100644 modules/paypal/views/templates/admin/back_office.tpl create mode 100644 modules/paypal/views/templates/admin/button_braintree.tpl create mode 100644 modules/paypal/views/templates/admin/header.tpl create mode 100644 modules/paypal/views/templates/admin/index.php create mode 100644 modules/paypal/views/templates/front/about.tpl create mode 100644 modules/paypal/views/templates/front/error.tpl create mode 100644 modules/paypal/views/templates/front/index.php create mode 100644 modules/paypal/views/templates/front/order-confirmation-mobile.tpl create mode 100644 modules/paypal/views/templates/front/order-confirmation-plus-mobile.tpl create mode 100644 modules/paypal/views/templates/front/order-confirmation-plus.tpl create mode 100644 modules/paypal/views/templates/front/order-confirmation.tpl create mode 100644 modules/paypal/views/templates/front/order-summary.tpl create mode 100644 modules/paypal/views/templates/hook/braintree_confirm.tpl create mode 100644 modules/paypal/views/templates/hook/braintree_payment.tpl create mode 100644 modules/paypal/views/templates/hook/braintree_return.tpl create mode 100644 modules/paypal/views/templates/hook/column.tpl create mode 100644 modules/paypal/views/templates/hook/confirmation.tpl create mode 100644 modules/paypal/views/templates/hook/express_checkout_payment.tpl create mode 100644 modules/paypal/views/templates/hook/express_checkout_payment_eu.tpl create mode 100644 modules/paypal/views/templates/hook/express_checkout_shortcut_button.tpl create mode 100644 modules/paypal/views/templates/hook/express_checkout_shortcut_form.tpl create mode 100644 modules/paypal/views/templates/hook/index.php create mode 100644 modules/paypal/views/templates/hook/integral_evolution_payment.tpl create mode 100644 modules/paypal/views/templates/hook/integral_evolution_payment_eu.tpl create mode 100644 modules/paypal/views/templates/hook/paypal_cart_summary.tpl create mode 100644 modules/paypal/views/templates/hook/paypal_plus_payment.tpl create mode 100644 modules/paypal/views/templates/hook/paypal_plus_payment_eu.tpl create mode 100644 modules/paypal/views/templates/hook/paypal_plus_payment_eu_legal.tpl create mode 100644 modules/paypal/views/templates/index.php create mode 100644 modules/pscleaner/CHANGELOG.txt create mode 100644 modules/pscleaner/Readme.md create mode 100644 modules/pscleaner/classes/WkPsCleanerHelper.php create mode 100644 modules/pscleaner/classes/index.php create mode 100644 modules/pscleaner/index.php create mode 100644 modules/pscleaner/logo.gif create mode 100644 modules/pscleaner/logo.png create mode 100644 modules/pscleaner/pscleaner.php create mode 100644 modules/pscleaner/translations/en.php create mode 100644 modules/pscleaner/translations/fr.php create mode 100644 modules/pscleaner/translations/index.php create mode 100644 modules/pscleaner/views/index.php create mode 100644 modules/pscleaner/views/templates/admin/_configure/helpers/form/form.tpl create mode 100644 modules/pscleaner/views/templates/admin/_configure/helpers/form/index.php create mode 100644 modules/pscleaner/views/templates/admin/_configure/helpers/index.php create mode 100644 modules/pscleaner/views/templates/admin/_configure/index.php create mode 100644 modules/pscleaner/views/templates/admin/index.php create mode 100644 modules/pscleaner/views/templates/index.php create mode 100644 modules/wkfooterexploreblock/classes/WkCustomExploreLink.php create mode 100644 modules/wkfooterexploreblock/classes/index.php create mode 100644 modules/wkfooterexploreblock/controllers/admin/AdminCustomExploreLinkSettingController.php create mode 100644 modules/wkfooterexploreblock/controllers/admin/index.php create mode 100644 modules/wkfooterexploreblock/controllers/index.php create mode 100644 modules/wkfooterexploreblock/install.sql create mode 100644 modules/wkfooterexploreblock/views/js/admin/index.php create mode 100644 modules/wkfooterexploreblock/views/js/admin/wk_explore_link.js create mode 100644 modules/wkfooterexploreblock/views/templates/admin/custom_explore_link_setting/helpers/form/form.tpl create mode 100644 modules/wkfooterexploreblock/views/templates/admin/custom_explore_link_setting/helpers/form/index.php create mode 100644 modules/wkfooterexploreblock/views/templates/admin/custom_explore_link_setting/helpers/index.php create mode 100644 modules/wkfooterexploreblock/views/templates/admin/custom_explore_link_setting/index.php create mode 100644 modules/wkfooterexploreblock/views/templates/admin/index.php create mode 100644 modules/wkfooterexploreblock/views/templates/hook/customExploreLinkSetting.tpl create mode 100644 modules/wkfooterexploreblock/views/templates/hook/hotelExternalNaviagtionMenu.tpl delete mode 100644 modules/wkhotelfeaturesblock/views/js/hotel_features_block.js create mode 100644 themes/hotel-reservation-theme/img/icon/form-ok-circle.svg delete mode 100644 themes/hotel-reservation-theme/themeconfigurator.php diff --git a/.travis.yml b/.travis.yml index 0e1aff37b..6f81f0d74 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,4 +33,4 @@ after_failure: - cat /etc/apache2/sites-available/000-default.conf - sudo cat /var/log/php-fpm.log - sudo ls -l /var/log/apache2 - - sudo cat /var/log/apache2/other_vhosts_access.log \ No newline at end of file + - sudo cat /var/log/apache2/other_vhosts_access.log diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 76252a9d8..300606fa1 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,33 @@ +#################################### +# V1.3.2 +#################################### + +## Added Features: + +[+] CO : pscleaner module is added for cleaning demo data from QloApps. + +[+] FO : Option for Guest checkout is given at Preferences->Orders tab. So Guest Checkout is enabled. + +[+] FO : Option for Shorter registration/address form is given at Preferences->Customers tab. (In this case address will be created from customer chosen room type's hotel address automatically). + +[+] CO : wkfooterexploreblock :: Admin can add custom explore links to show at footer explore block and navigation menu also. table 'htl_custom_explore_link' added with multilang. + +## Improved/changed features: + +[-] BO : New category option from "quick access" links is removed. +[+] FO : Checkout page design has been changed. +[+] CO : Images validation improved. + + +## Bug/Issues Resolved: + +[-] CO : 56% Installation issue. + +[-] BO : Dashboard graphs not loading issues on php 7.2 +[-] BO : feature update issue on not selecting image while updating the feature. +[-] BO : Category bug resolve (Should not be created updated deleted from anywhere). Will be handled from hotel creation/updation/deletion. + + #################################### # V1.3.1 #################################### @@ -342,4 +372,4 @@ [-] MO : wktestimonialblock : Fixed while adding the image in valid format on configuration page then showing error page. [-] MO : wkpaypaladaptive : Fixed paypal is not working because paypal api has been changed. [-] MO : wkpaypaladaptive : Fixed fopen issues fixed, done by CURL. -[-] MO : wkpaypaladaptive : Fixed payment negative value bug fixed. \ No newline at end of file +[-] MO : wkpaypaladaptive : Fixed payment negative value bug fixed. diff --git a/admin/themes/default/template/controllers/products/associations.tpl b/admin/themes/default/template/controllers/products/associations.tpl index 66267aa1e..9193cac80 100644 --- a/admin/themes/default/template/controllers/products/associations.tpl +++ b/admin/themes/default/template/controllers/products/associations.tpl @@ -38,9 +38,9 @@
{$category_tree}
- + {* {l s='Create new category'} - + *}
diff --git a/classes/Address.php b/classes/Address.php index c86b8c5ad..89efc1a18 100644 --- a/classes/Address.php +++ b/classes/Address.php @@ -203,6 +203,8 @@ public function delete() if (Validate::isUnsignedId($this->id_customer)) { Customer::resetAddressCache($this->id_customer, $this->id); } + // reset checkout process if addresses deletes + CheckoutProcess::refreshCheckoutProcess(); if (!$this->isUsed()) { return parent::delete(); diff --git a/classes/Category.php b/classes/Category.php index 770470233..daaa86676 100644 --- a/classes/Category.php +++ b/classes/Category.php @@ -433,10 +433,11 @@ protected static function _subTree(&$categories, $id_category, &$n) } $right = (int)$n++; - Db::getInstance()->execute(' - UPDATE '._DB_PREFIX_.'category - SET nleft = '.(int)$left.', nright = '.(int)$right.' - WHERE id_category = '.(int)$id_category.' LIMIT 1'); + Db::getInstance()->execute( + 'UPDATE '._DB_PREFIX_.'category + SET nleft = '.(int)$left.', nright = '.(int)$right.' + WHERE id_category = '.(int)$id_category.' LIMIT 1' + ); } /** diff --git a/classes/Feature.php b/classes/Feature.php index c67c0971b..fc9f2ba32 100644 --- a/classes/Feature.php +++ b/classes/Feature.php @@ -41,7 +41,7 @@ class FeatureCore extends ObjectModel 'position' => array('type' => self::TYPE_INT, 'validate' => 'isInt'), /* Lang fields */ - 'name' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true, 'size' => 128), + 'name' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 128), ), ); diff --git a/classes/Hook.php b/classes/Hook.php index b4fcfc83b..61fa8de41 100644 --- a/classes/Hook.php +++ b/classes/Hook.php @@ -418,8 +418,7 @@ public static function getHookModuleExecList($hook_name = null) * * @return string/array modules output */ - public static function exec($hook_name, $hook_args = array(), $id_module = null, $array_return = false, $check_exceptions = true, - $use_push = false, $id_shop = null) + public static function exec($hook_name, $hook_args = array(), $id_module = null, $array_return = false, $check_exceptions = true, $use_push = false, $id_shop = null) { if (defined('PS_INSTALLATION_IN_PROGRESS')) { return; @@ -462,7 +461,11 @@ public static function exec($hook_name, $hook_args = array(), $id_module = null, // Look on modules list $altern = 0; - $output = ''; + if ($array_return) { + $output = array(); + } else { + $output = ''; + } if ($disable_non_native_modules && !isset(Hook::$native_module)) { Hook::$native_module = Module::getNativeModuleList(); diff --git a/classes/checkoutProcess/AbstractCheckoutStep.php b/classes/checkoutProcess/AbstractCheckoutStep.php new file mode 100644 index 000000000..185e131dc --- /dev/null +++ b/classes/checkoutProcess/AbstractCheckoutStep.php @@ -0,0 +1,82 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +abstract class AbstractCheckoutStep implements CheckoutStepInterface +{ + public $step_is_reachable = 0; + public $step_is_complete = 0; + public $step_is_current = 0; + public $step_key; + private $checkoutProcess; + + public function __construct() + { + $this->context = Context::getContext(); + } + + public function setCheckoutProcess(CheckoutProcess $checkoutProcess) + { + $this->checkoutProcess = $checkoutProcess; + + return $this; + } + + public function setReachable($step_is_reachable) + { + $this->step_is_reachable = $step_is_reachable; + + return $this; + } + + public function isReachable() + { + return $this->step_is_reachable; + } + + public function setComplete($step_is_complete) + { + $this->step_is_complete = $step_is_complete; + + return $this; + } + + public function isComplete() + { + return $this->step_is_complete; + } + + public function setCurrent($step_is_current) + { + $this->step_is_current = $step_is_current; + + return $this; + } + + public function isCurrent() + { + return $this->step_is_current; + } +} diff --git a/classes/checkoutProcess/CheckoutCartSummaryStep.php b/classes/checkoutProcess/CheckoutCartSummaryStep.php new file mode 100644 index 000000000..d58ec04d2 --- /dev/null +++ b/classes/checkoutProcess/CheckoutCartSummaryStep.php @@ -0,0 +1,44 @@ + +* @copyright 2010-2018 Webkul IN +* @license https://store.webkul.com/license.html +*/ + +class CheckoutCartSummaryStep extends AbstractCheckoutStep +{ + public function __construct() { + parent::__construct(); + $this->step_key = 'checkout_rooms_summary'; + } + + public function handleRequest() + { + // set data in checkout_session cookie + if (Tools::getValue('proceed_to_customer_dtl')) { + $this->step_is_reachable = 1; + $this->step_is_complete = 1; + $this->step_is_current = 0; + $this->context->cookie->__set('cart_summary_proceeded', 1); + } elseif ($this->context->cookie->__get('cart_summary_proceeded')) { + $this->step_is_reachable = 1; + $this->step_is_complete = 1; + $this->step_is_current = 0; + } + + return $this; + } +} diff --git a/classes/checkoutProcess/CheckoutCustomerDetailsStep.php b/classes/checkoutProcess/CheckoutCustomerDetailsStep.php new file mode 100644 index 000000000..813da1edb --- /dev/null +++ b/classes/checkoutProcess/CheckoutCustomerDetailsStep.php @@ -0,0 +1,77 @@ + +* @copyright 2010-2018 Webkul IN +* @license https://store.webkul.com/license.html +*/ + +class CheckoutCustomerDetailsStep extends AbstractCheckoutStep +{ + public function __construct() { + parent::__construct(); + $this->step_key = 'checkout_customer'; + } + + public function handleRequest() + { + $idAddressDelivery = $this->context->cart->id_address_delivery; + $objAddress = new Address($idAddressDelivery); + if (Tools::getValue('proceed_to_customer_dtl')) { + $this->step_is_reachable = 1; + $this->step_is_current = 1; + if ($idAddressDelivery) { + if (!Validate::isLoadedObject($objAddress)) { + if ($this->context->cookie->__get('customer_details_proceeded')) { + $this->step_is_current = 0; + $this->step_is_complete = 1; + } + } + } + } elseif (Tools::getValue('proceed_to_payment')) { + $this->step_is_reachable = 1; + $this->step_is_current = 1; + if ($idAddressDelivery) { + if (Validate::isLoadedObject($objAddress)) { + $this->step_is_current = 0; + $this->step_is_complete = 1; + $this->context->cookie->__set('customer_details_proceeded', 1); + } + } + } elseif ($this->context->cookie->__get('customer_details_proceeded') + || $this->context->cookie->__get('cart_summary_proceeded') + ) { + if ($idAddressDelivery) { + if (!Validate::isLoadedObject($objAddress)) { + $this->context->cookie->__set('customer_details_proceeded', 0); + $this->step_is_reachable = 1; + $this->step_is_current = 1; + } + } else { + $this->step_is_reachable = 1; + $this->step_is_current = 1; + $this->context->cookie->__set('customer_details_proceeded', 0); + } + } elseif ($this->context->customer->logged) { + $this->step_is_reachable = 1; + if ($idAddressDelivery) { + $this->step_is_complete = 1; + } else { + $this->step_is_complete = 0; + $this->step_is_current = 1; + } + } + } +} diff --git a/classes/checkoutProcess/CheckoutPaymentStep.php b/classes/checkoutProcess/CheckoutPaymentStep.php new file mode 100644 index 000000000..11d902e3d --- /dev/null +++ b/classes/checkoutProcess/CheckoutPaymentStep.php @@ -0,0 +1,37 @@ + +* @copyright 2010-2018 Webkul IN +* @license https://store.webkul.com/license.html +*/ + +class CheckoutPaymentStep extends AbstractCheckoutStep +{ + public function __construct() { + parent::__construct(); + $this->step_key = 'checkout_payment'; + } + + public function handleRequest() + { + if ($this->context->cookie->__get('customer_details_proceeded')) { + $this->step_is_reachable = 1; + $this->step_is_current = 1; + $this->step_is_complete = 0; + } + } +} + diff --git a/classes/checkoutProcess/CheckoutProcess.php b/classes/checkoutProcess/CheckoutProcess.php new file mode 100644 index 000000000..0944d3d44 --- /dev/null +++ b/classes/checkoutProcess/CheckoutProcess.php @@ -0,0 +1,109 @@ + +* @copyright 2010-2018 Webkul IN +* @license https://store.webkul.com/license.html +*/ + +class CheckoutProcess +{ + public $steps = array(); + + public function handleRequest() + { + foreach ($this->steps as $step) { + $step->handleRequest(); + } + return $this; + } + + public function addStep(CheckoutStepInterface $step) + { + $step->setCheckoutProcess($this); + $this->steps[] = $step; + return $this; + } + + public function getSteps() + { + return $this->steps; + } + + public function setNextStepReachable() + { + foreach ($this->getSteps() as $step) { + if (!$step->isReachable()) { + $step->setReachable(true); + break; + } + if (!$step->isComplete()) { + break; + } + } + + return $this; + } + + public function markCurrentStep() + { + $steps = $this->getSteps(); + + foreach ($steps as $step) { + if ($step->isCurrent()) { + // If a step marked itself as current + // then we assume it has a good reason + // to do so and we don't auto-advance. + return $this; + } + } + + foreach ($steps as $position => $step) { + $nextStep = ($position < count($steps) - 1) ? $steps[$position + 1] : null; + + if ($step->isReachable() && (!$step->isComplete() || ($nextStep && !$nextStep->isReachable()))) { + $step->setCurrent(true); + + return $this; + } + } + + return $this; + } + + public function invalidateAllStepsAfterCurrent() + { + $markAsUnreachable = false; + foreach ($this->getSteps() as $step) { + if ($markAsUnreachable) { + $step->setComplete(false)->setReachable(false); + } + + if ($step->isCurrent()) { + $markAsUnreachable = true; + } + } + + return $this; + } + + // if any event occurred which is changing cart/address/payment/customer then reset cehckout cookies + public static function refreshCheckoutProcess() + { + $context = Context::getContext(); + $context->cookie->__set('cart_summary_proceeded', 0); + $context->cookie->__set('customer_details_proceeded', 0); + } +} diff --git a/modules/wkfooterexploreblock/views/js/wkFooterExploreBlockFront.js b/classes/checkoutProcess/CheckoutStepInterface.php similarity index 73% rename from modules/wkfooterexploreblock/views/js/wkFooterExploreBlockFront.js rename to classes/checkoutProcess/CheckoutStepInterface.php index 7b6419a20..7c7b6d28f 100644 --- a/modules/wkfooterexploreblock/views/js/wkFooterExploreBlockFront.js +++ b/classes/checkoutProcess/CheckoutStepInterface.php @@ -1,3 +1,4 @@ +context = Context::getContext(); + Tools::redirectAdmin($this->context->link->getAdminLink('AdminDashboard')); + $this->bootstrap = true; $this->table = 'category'; $this->className = 'Category'; @@ -54,8 +59,6 @@ public function __construct() $this->_defaultOrderBy = 'position'; $this->allow_export = true; - $this->context = Context::getContext(); - $this->fieldImageSettings = array( 'name' => 'image', 'dir' => 'c' diff --git a/controllers/admin/AdminCustomerPreferencesController.php b/controllers/admin/AdminCustomerPreferencesController.php index d490a647c..61e816aeb 100644 --- a/controllers/admin/AdminCustomerPreferencesController.php +++ b/controllers/admin/AdminCustomerPreferencesController.php @@ -113,6 +113,13 @@ public function __construct() 'cast' => 'intval', 'type' => 'bool' ), + 'PS_CUSTOMER_ADDRESS_CREATION' => array( + 'title' => $this->l('Enable customer address creation at checkout'), + 'hint' => $this->l('If disabled, At checkout process, guest has to fill only personal details and address will be created according to the hotel address which rooms guest has in his cart. If enabled, guest has to fill his address details in checkout process.'), + 'validation' => 'isBool', + 'cast' => 'intval', + 'type' => 'bool' + ), ), 'submit' => array('title' => $this->l('Save')), ), diff --git a/controllers/admin/AdminFeaturesController.php b/controllers/admin/AdminFeaturesController.php index 33828661a..6ef65f568 100644 --- a/controllers/admin/AdminFeaturesController.php +++ b/controllers/admin/AdminFeaturesController.php @@ -29,697 +29,677 @@ */ class AdminFeaturesControllerCore extends AdminController { - public $bootstrap = true; - protected $position_identifier = 'id_feature'; - protected $feature_name; - - public function __construct() - { - $this->table = 'feature'; - $this->className = 'Feature'; - $this->list_id = 'feature'; - $this->identifier = 'id_feature'; - $this->lang = true; - $this->imageType = 'png'; - $this->fieldImageSettings = array( - 'name' => 'icon', - 'dir' => 'rf' - ); - - $this->fields_list = array( - 'id_feature' => array( - 'title' => $this->l('ID'), - 'align' => 'center', - 'class' => 'fixed-width-xs' - ), - 'name' => array( - 'title' => $this->l('Name'), - 'width' => 'auto', - 'filter_key' => 'b!name' - ), - 'logo' => array( - 'title' => $this->l('Icon'), - 'align' => 'text-center', - 'image' => 'rf', - 'orderby' => false, - 'search' => false, - 'class' => 'fixed-width-xs' - ),/*by webkul to show feature image*/ - /*'value' => array( - 'title' => $this->l('Values'), - 'orderby' => false, - 'search' => false, - 'align' => 'center', - 'class' => 'fixed-width-xs' - ),*/ - 'position' => array( - 'title' => $this->l('Position'), - 'filter_key' => 'a!position', - 'align' => 'center', - 'class' => 'fixed-width-xs', - 'position' => 'position' - ) - ); - - $this->bulk_actions = array( - 'delete' => array( - 'text' => $this->l('Delete selected'), - 'icon' => 'icon-trash', - 'confirm' => $this->l('Delete selected items?') - ) - ); - parent::__construct(); - } - - /** - * AdminController::renderList() override - * @see AdminController::renderList() - */ - public function renderList() - { - /*$this->addRowAction('view');*//*by webkul*/ - $this->addRowAction('edit'); - $this->addRowAction('delete'); - - return parent::renderList(); - } - - /** - * Change object type to feature value (use when processing a feature value) - */ - protected function setTypeValue() - { - $this->table = 'feature_value'; - $this->className = 'FeatureValue'; - $this->identifier = 'id_feature_value'; - } - - /** - * Change object type to feature (use when processing a feature) - */ - protected function setTypeFeature() - { - $this->table = 'feature'; - $this->className = 'Feature'; - $this->identifier = 'id_feature'; - } - - public function renderView() - { - if (($id = Tools::getValue('id_feature'))) - { - $this->setTypeValue(); - $this->list_id = 'feature_value'; - $this->lang = true; - - // Action for list - $this->addRowAction('edit'); - $this->addRowAction('delete'); - - if (!Validate::isLoadedObject($obj = new Feature((int)$id))) - { - $this->errors[] = Tools::displayError('An error occurred while updating the status for an object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); - return; - } - - $this->feature_name = $obj->name; - $this->toolbar_title = $this->feature_name[$this->context->employee->id_lang]; - $this->fields_list = array( - 'id_feature_value' => array( - 'title' => $this->l('ID'), - 'align' => 'center', - 'class' => 'fixed-width-xs' - ), - 'value' => array( - 'title' => $this->l('Value') - ) - ); - - $this->_where = sprintf('AND `id_feature` = %d', (int)$id); - self::$currentIndex = self::$currentIndex.'&id_feature='.(int)$id.'&viewfeature'; - $this->processFilter(); - return parent::renderList(); - } - } - - /** - * AdminController::renderForm() override - * @see AdminController::renderForm() - */ - public function renderForm() - { - if (!($obj = $this->loadObject(true))) { + public $bootstrap = true; + protected $position_identifier = 'id_feature'; + protected $feature_name; + + public function __construct() + { + $this->table = 'feature'; + $this->className = 'Feature'; + $this->list_id = 'feature'; + $this->identifier = 'id_feature'; + $this->lang = true; + $this->imageType = 'png'; + $this->fieldImageSettings = array( + 'name' => 'icon', + 'dir' => 'rf' + ); + + $this->fields_list = array( + 'id_feature' => array( + 'title' => $this->l('ID'), + 'align' => 'center', + 'class' => 'fixed-width-xs' + ), + 'name' => array( + 'title' => $this->l('Name'), + 'width' => 'auto', + 'filter_key' => 'b!name' + ), + 'logo' => array( + 'title' => $this->l('Icon'), + 'align' => 'text-center', + 'image' => 'rf', + 'orderby' => false, + 'search' => false, + 'class' => 'fixed-width-xs' + ),/*by webkul to show feature image*/ + /*'value' => array( + 'title' => $this->l('Values'), + 'orderby' => false, + 'search' => false, + 'align' => 'center', + 'class' => 'fixed-width-xs' + ),*/ + 'position' => array( + 'title' => $this->l('Position'), + 'filter_key' => 'a!position', + 'align' => 'center', + 'class' => 'fixed-width-xs', + 'position' => 'position' + ) + ); + + $this->bulk_actions = array( + 'delete' => array( + 'text' => $this->l('Delete selected'), + 'icon' => 'icon-trash', + 'confirm' => $this->l('Delete selected items?') + ) + ); + parent::__construct(); + } + + /** + * AdminController::renderList() override + * @see AdminController::renderList() + */ + public function renderList() + { + /*$this->addRowAction('view');*//*by webkul*/ + $this->addRowAction('edit'); + $this->addRowAction('delete'); + + return parent::renderList(); + } + + /** + * Change object type to feature value (use when processing a feature value) + */ + protected function setTypeValue() + { + $this->table = 'feature_value'; + $this->className = 'FeatureValue'; + $this->identifier = 'id_feature_value'; + } + + /** + * Change object type to feature (use when processing a feature) + */ + protected function setTypeFeature() + { + $this->table = 'feature'; + $this->className = 'Feature'; + $this->identifier = 'id_feature'; + } + + public function renderView() + { + if (($id = Tools::getValue('id_feature'))) { + $this->setTypeValue(); + $this->list_id = 'feature_value'; + $this->lang = true; + + // Action for list + $this->addRowAction('edit'); + $this->addRowAction('delete'); + + if (!Validate::isLoadedObject($obj = new Feature((int)$id))) { + $this->errors[] = Tools::displayError('An error occurred while updating the status for an object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + return; + } + + $this->feature_name = $obj->name; + $this->toolbar_title = $this->feature_name[$this->context->employee->id_lang]; + $this->fields_list = array( + 'id_feature_value' => array( + 'title' => $this->l('ID'), + 'align' => 'center', + 'class' => 'fixed-width-xs' + ), + 'value' => array( + 'title' => $this->l('Value') + ) + ); + + $this->_where = sprintf('AND `id_feature` = %d', (int)$id); + self::$currentIndex = self::$currentIndex.'&id_feature='.(int)$id.'&viewfeature'; + $this->processFilter(); + return parent::renderList(); + } + } + + /** + * AdminController::renderForm() override + * @see AdminController::renderForm() + */ + public function renderForm() + { + if (!($obj = $this->loadObject(true))) { + return; + } + $ps_img_url = _PS_IMG_DIR_.'rf/'.$obj->id.'.png'; + if ($img_exist = file_exists($ps_img_url)) { + $img_url = '../../hotelcommerce/img/rf/'.$obj->id.'.png'; + $image = ""; + } + + $this->toolbar_title = $this->l('Add a new feature'); + $this->fields_form = array( + 'legend' => array( + 'title' => $this->l('Feature'), + 'icon' => 'icon-info-sign' + ), + 'input' => array( + array( + 'type' => 'text', + 'label' => $this->l('Name'), + 'name' => 'name', + 'lang' => true, + 'size' => 33, + 'hint' => $this->l('Enter a name for the feature. Invalid characters:').' <>;=#{}', + 'required' => true + ), + array( + 'type' => 'file', + 'label' => $this->l('Feature Logo'), + 'name' => 'logo', + 'image' => $img_exist ? $image : false, + 'display_image' => true, + 'hint' => $this->l('Upload a feature logo.'), + 'required' => true + ) + ) + ); + + if (Shop::isFeatureActive()) { + $this->fields_form['input'][] = array( + 'type' => 'shop', + 'label' => $this->l('Shop association'), + 'name' => 'checkBoxShopAsso', + ); + } + + $this->fields_form['submit'] = array( + 'title' => $this->l('Save'), + ); + + return parent::renderForm(); + } + + public function initPageHeaderToolbar() + { + if (empty($this->display)) { + $this->page_header_toolbar_btn['new_feature'] = array( + 'href' => self::$currentIndex.'&addfeature&token='.$this->token, + 'desc' => $this->l('Add new feature', null, null, false), + 'icon' => 'process-icon-new' + ); + } + + if ($this->display == 'view') { + $this->page_header_toolbar_btn['new_feature_value'] = array( + 'href' => self::$currentIndex.'&addfeature_value&id_feature='.(int)Tools::getValue('id_feature').'&token='.$this->token, + 'desc' => $this->l('Add new feature value', null, null, false), + 'icon' => 'process-icon-new' + ); + } + + parent::initPageHeaderToolbar(); + } + + /** + * AdminController::initToolbar() override + * @see AdminController::initToolbar() + */ + public function initToolbar() + { + switch ($this->display) { + case 'editFeatureValue': + case 'add': + case 'edit': + $this->toolbar_btn['save'] = array( + 'href' => '#', + 'desc' => $this->l('Save') + ); + + if ($this->display == 'editFeatureValue') { + $this->toolbar_btn['save-and-stay'] = array( + 'short' => 'SaveAndStay', + 'href' => '#', + 'desc' => $this->l('Save and add another value'), + 'force_desc' => true, + ); + } + + // Default cancel button - like old back link + $back = Tools::safeOutput(Tools::getValue('back', '')); + if (empty($back)) { + $back = self::$currentIndex.'&token='.$this->token; + } + + $this->toolbar_btn['back'] = array( + 'href' => $back, + 'desc' => $this->l('Back to the list') + ); + break; + case 'view': + $this->toolbar_btn['newAttributes'] = array( + 'href' => self::$currentIndex.'&addfeature_value&id_feature='.(int)Tools::getValue('id_feature').'&token='.$this->token, + 'desc' => $this->l('Add new feature values') + ); + $this->toolbar_btn['back'] = array( + 'href' => self::$currentIndex.'&token='.$this->token, + 'desc' => $this->l('Back to the list') + ); + break; + default: + parent::initToolbar(); + } + } + + public function initToolbarTitle() + { + $bread_extended = $this->breadcrumbs; + + switch ($this->display) { + case 'edit': + $bread_extended[] = $this->l('Edit New Feature'); + $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); + break; + + case 'add': + $bread_extended[] = $this->l('Add New Feature'); + $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); + break; + + case 'view': + $bread_extended[] = $this->feature_name[$this->context->employee->id_lang]; + $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); + break; + + case 'editFeatureValue': + if (($idFeature_value = Tools::getValue('id_feature_value'))) { + if (($id = Tools::getValue('id_feature'))) { + if (Validate::isLoadedObject($obj = new Feature((int)$id))) { + $bread_extended[] = ''.$obj->name[$this->context->employee->id_lang].''; + } + + if (Validate::isLoadedObject($obj = new FeatureValue((int)Tools::getValue('id_feature_value')))) { + $bread_extended[] = sprintf($this->l('Edit: %s'), $obj->value[$this->context->employee->id_lang]); + } + } else { + $bread_extended[] = $this->l('Edit Value'); + } + } else { + $bread_extended[] = $this->l('Add New Value'); + } + + if (count($bread_extended) > 0) { + $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); + } + break; + } + + $this->toolbar_title = $bread_extended; + } + + /** + * AdminController::renderForm() override + * @see AdminController::renderForm() + */ + public function initFormFeatureValue() + { + $this->setTypeValue(); + + $this->fields_form[0]['form'] = array( + 'legend' => array( + 'title' => $this->l('Feature value'), + 'icon' => 'icon-info-sign' + ), + 'input' => array( + array( + 'type' => 'select', + 'label' => $this->l('Feature'), + 'name' => 'id_feature', + 'options' => array( + 'query' => Feature::getFeatures($this->context->language->id), + 'id' => 'id_feature', + 'name' => 'name' + ), + 'required' => true + ), + array( + 'type' => 'text', + 'label' => $this->l('Value'), + 'name' => 'value', + 'lang' => true, + 'size' => 33, + 'hint' => $this->l('Invalid characters:').' <>;=#{}', + 'required' => true + ), + ), + 'submit' => array( + 'title' => $this->l('Save'), + ), + 'buttons' => array( + 'save-and-stay' => array( + 'title' => $this->l('Save then add another value'), + 'name' => 'submitAdd'.$this->table.'AndStay', + 'type' => 'submit', + 'class' => 'btn btn-default pull-right', + 'icon' => 'process-icon-save' + ) + ) + ); + + $this->fields_value['id_feature'] = (int)Tools::getValue('id_feature'); + + // Create Object FeatureValue + $feature_value = new FeatureValue(Tools::getValue('id_feature_value')); + + $this->tpl_vars = array( + 'feature_value' => $feature_value, + ); + + $this->getlanguages(); + $helper = new HelperForm(); + $helper->show_cancel_button = true; + + $back = Tools::safeOutput(Tools::getValue('back', '')); + if (empty($back)) { + $back = self::$currentIndex.'&token='.$this->token; + } + if (!Validate::isCleanHtml($back)) { + die(Tools::displayError()); + } + + $helper->back_url = $back; + $helper->currentIndex = self::$currentIndex; + $helper->token = $this->token; + $helper->table = $this->table; + $helper->identifier = $this->identifier; + $helper->override_folder = 'feature_value/'; + $helper->id = $feature_value->id; + $helper->toolbar_scroll = false; + $helper->tpl_vars = $this->tpl_vars; + $helper->languages = $this->_languages; + $helper->default_form_language = $this->default_form_language; + $helper->allow_employee_form_lang = $this->allow_employee_form_lang; + $helper->fields_value = $this->getFieldsValue($feature_value); + $helper->toolbar_btn = $this->toolbar_btn; + $helper->title = $this->l('Add a new feature value'); + $this->content .= $helper->generateForm($this->fields_form); + } + + /** + * AdminController::initContent() override + * @see AdminController::initContent() + */ + public function initContent() + { + if (Feature::isFeatureActive()) { + // toolbar (save, cancel, new, ..) + $this->initTabModuleList(); + $this->initToolbar(); + $this->initPageHeaderToolbar(); + if ($this->display == 'edit' || $this->display == 'add') { + if (!$this->loadObject(true)) { + return; + } + $this->content .= $this->renderForm(); + } elseif ($this->display == 'view') { + // Some controllers use the view action without an object + if ($this->className) { + $this->loadObject(true); + } + $this->content .= $this->renderView(); + } elseif ($this->display == 'editFeatureValue') { + if (!$this->object = new FeatureValue((int)Tools::getValue('id_feature_value'))) { + return; + } + + $this->content .= $this->initFormFeatureValue(); + } elseif (!$this->ajax) { + // If a feature value was saved, we need to reset the values to display the list + $this->setTypeFeature(); + $this->content .= $this->renderList(); + } + } else { + $url = ''.$this->l('Performance').''; + $this->displayWarning(sprintf($this->l('This feature has been disabled. You can activate it here: %s.'), $url)); + } + + $this->context->smarty->assign( + array( + 'content' => $this->content, + 'url_post' => self::$currentIndex.'&token='.$this->token, + 'show_page_header_toolbar' => $this->show_page_header_toolbar, + 'page_header_toolbar_title' => $this->page_header_toolbar_title, + 'page_header_toolbar_btn' => $this->page_header_toolbar_btn + ) + ); + } + + public function initProcess() + { + // Are we working on feature values? + if (Tools::getValue('id_feature_value') + || Tools::isSubmit('deletefeature_value') + || Tools::isSubmit('submitAddfeature_value') + || Tools::isSubmit('addfeature_value') + || Tools::isSubmit('updatefeature_value') + || Tools::isSubmit('submitBulkdeletefeature_value') + ) { + $this->setTypeValue(); + } + + if (Tools::getIsset('viewfeature')) { + $this->list_id = 'feature_value'; + + if (isset($_POST['submitReset'.$this->list_id])) { + $this->processResetFilters(); + } + } else { + $this->list_id = 'feature'; + $this->_defaultOrderBy = 'position'; + $this->_defaultOrderWay = 'ASC'; + } + + parent::initProcess(); + } + + public function postProcess() + { + if (!Feature::isFeatureActive()) { return; } - $ps_img_url = _PS_IMG_DIR_.'rf/'.$obj->id.'.png'; - if ($img_exist = file_exists($ps_img_url)) - { - $img_url = '../../hotelcommerce/img/rf/'.$obj->id.'.png'; - $image = ""; - } - - $this->toolbar_title = $this->l('Add a new feature'); - $this->fields_form = array( - 'legend' => array( - 'title' => $this->l('Feature'), - 'icon' => 'icon-info-sign' - ), - 'input' => array( - array( - 'type' => 'text', - 'label' => $this->l('Name'), - 'name' => 'name', - 'lang' => true, - 'size' => 33, - 'hint' => $this->l('Invalid characters:').' <>;=#{}', - 'required' => true - ), - array( - 'type' => 'file', - 'label' => $this->l('Feature Logo'), - 'name' => 'logo', - 'image' => $img_exist ? $image : false, - 'display_image' => true, - 'hint' => $this->l('Upload a feature logo.'), - 'required' => true - ) - ) - ); - - if (Shop::isFeatureActive()) - { - $this->fields_form['input'][] = array( - 'type' => 'shop', - 'label' => $this->l('Shop association'), - 'name' => 'checkBoxShopAsso', - ); - } - - $this->fields_form['submit'] = array( - 'title' => $this->l('Save'), - ); - - return parent::renderForm(); - } - - public function initPageHeaderToolbar() - { - if (empty($this->display)) - { - $this->page_header_toolbar_btn['new_feature'] = array( - 'href' => self::$currentIndex.'&addfeature&token='.$this->token, - 'desc' => $this->l('Add new feature', null, null, false), - 'icon' => 'process-icon-new' - ); - - /*$this->page_header_toolbar_btn['new_feature_value'] = array( - 'href' => self::$currentIndex.'&addfeature_value&id_feature='.(int)Tools::getValue('id_feature').'&token='.$this->token, - 'desc' => $this->l('Add new feature value', null, null, false), - 'icon' => 'process-icon-new' - );*//*by webkul feature value will be added from add feature buttun in form of image*/ - } - - if ($this->display == 'view') - $this->page_header_toolbar_btn['new_feature_value'] = array( - 'href' => self::$currentIndex.'&addfeature_value&id_feature='.(int)Tools::getValue('id_feature').'&token='.$this->token, - 'desc' => $this->l('Add new feature value', null, null, false), - 'icon' => 'process-icon-new' - ); - - parent::initPageHeaderToolbar(); - } - - /** - * AdminController::initToolbar() override - * @see AdminController::initToolbar() - */ - public function initToolbar() - { - switch ($this->display) - { - case 'editFeatureValue': - case 'add': - case 'edit': - $this->toolbar_btn['save'] = array( - 'href' => '#', - 'desc' => $this->l('Save') - ); - - if ($this->display == 'editFeatureValue') - $this->toolbar_btn['save-and-stay'] = array( - 'short' => 'SaveAndStay', - 'href' => '#', - 'desc' => $this->l('Save and add another value'), - 'force_desc' => true, - ); - - // Default cancel button - like old back link - $back = Tools::safeOutput(Tools::getValue('back', '')); - if (empty($back)) - $back = self::$currentIndex.'&token='.$this->token; - - $this->toolbar_btn['back'] = array( - 'href' => $back, - 'desc' => $this->l('Back to the list') - ); - break; - case 'view': - $this->toolbar_btn['newAttributes'] = array( - 'href' => self::$currentIndex.'&addfeature_value&id_feature='.(int)Tools::getValue('id_feature').'&token='.$this->token, - 'desc' => $this->l('Add new feature values') - ); - $this->toolbar_btn['back'] = array( - 'href' => self::$currentIndex.'&token='.$this->token, - 'desc' => $this->l('Back to the list') - ); - break; - default: - parent::initToolbar(); - } - } - - public function initToolbarTitle() - { - $bread_extended = $this->breadcrumbs; - - switch ($this->display) - { - case 'edit': - $bread_extended[] = $this->l('Edit New Feature'); - $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); - break; - - case 'add': - $bread_extended[] = $this->l('Add New Feature'); - $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); - break; - - case 'view': - $bread_extended[] = $this->feature_name[$this->context->employee->id_lang]; - $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); - break; - - case 'editFeatureValue': - if (($id_feature_value = Tools::getValue('id_feature_value'))) - { - if (($id = Tools::getValue('id_feature'))) - { - if (Validate::isLoadedObject($obj = new Feature((int)$id))) - $bread_extended[] = ''.$obj->name[$this->context->employee->id_lang].''; - - if (Validate::isLoadedObject($obj = new FeatureValue((int)Tools::getValue('id_feature_value')))) - $bread_extended[] = sprintf($this->l('Edit: %s'), $obj->value[$this->context->employee->id_lang]); - } - else - $bread_extended[] = $this->l('Edit Value'); - } - else - $bread_extended[] = $this->l('Add New Value'); - - if (count($bread_extended) > 0) - $this->addMetaTitle($bread_extended[count($bread_extended) - 1]); - break; - } - - $this->toolbar_title = $bread_extended; - } - - /** - * AdminController::renderForm() override - * @see AdminController::renderForm() - */ - public function initFormFeatureValue() - { - $this->setTypeValue(); - - $this->fields_form[0]['form'] = array( - 'legend' => array( - 'title' => $this->l('Feature value'), - 'icon' => 'icon-info-sign' - ), - 'input' => array( - array( - 'type' => 'select', - 'label' => $this->l('Feature'), - 'name' => 'id_feature', - 'options' => array( - 'query' => Feature::getFeatures($this->context->language->id), - 'id' => 'id_feature', - 'name' => 'name' - ), - 'required' => true - ), - array( - 'type' => 'text', - 'label' => $this->l('Value'), - 'name' => 'value', - 'lang' => true, - 'size' => 33, - 'hint' => $this->l('Invalid characters:').' <>;=#{}', - 'required' => true - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - ), - 'buttons' => array( - 'save-and-stay' => array( - 'title' => $this->l('Save then add another value'), - 'name' => 'submitAdd'.$this->table.'AndStay', - 'type' => 'submit', - 'class' => 'btn btn-default pull-right', - 'icon' => 'process-icon-save' - ) - ) - ); - - $this->fields_value['id_feature'] = (int)Tools::getValue('id_feature'); - - // Create Object FeatureValue - $feature_value = new FeatureValue(Tools::getValue('id_feature_value')); - - $this->tpl_vars = array( - 'feature_value' => $feature_value, - ); - - $this->getlanguages(); - $helper = new HelperForm(); - $helper->show_cancel_button = true; - - $back = Tools::safeOutput(Tools::getValue('back', '')); - if (empty($back)) - $back = self::$currentIndex.'&token='.$this->token; - if (!Validate::isCleanHtml($back)) - die(Tools::displayError()); - - $helper->back_url = $back; - $helper->currentIndex = self::$currentIndex; - $helper->token = $this->token; - $helper->table = $this->table; - $helper->identifier = $this->identifier; - $helper->override_folder = 'feature_value/'; - $helper->id = $feature_value->id; - $helper->toolbar_scroll = false; - $helper->tpl_vars = $this->tpl_vars; - $helper->languages = $this->_languages; - $helper->default_form_language = $this->default_form_language; - $helper->allow_employee_form_lang = $this->allow_employee_form_lang; - $helper->fields_value = $this->getFieldsValue($feature_value); - $helper->toolbar_btn = $this->toolbar_btn; - $helper->title = $this->l('Add a new feature value'); - $this->content .= $helper->generateForm($this->fields_form); - } - - /** - * AdminController::initContent() override - * @see AdminController::initContent() - */ - public function initContent() - { - if (Feature::isFeatureActive()) - { - // toolbar (save, cancel, new, ..) - $this->initTabModuleList(); - $this->initToolbar(); - $this->initPageHeaderToolbar(); - if ($this->display == 'edit' || $this->display == 'add') - { - if (!$this->loadObject(true)) - return; - $this->content .= $this->renderForm(); - } - elseif ($this->display == 'view') - { - // Some controllers use the view action without an object - if ($this->className) - $this->loadObject(true); - $this->content .= $this->renderView(); - } - elseif ($this->display == 'editFeatureValue') - { - if (!$this->object = new FeatureValue((int)Tools::getValue('id_feature_value'))) - return; - - $this->content .= $this->initFormFeatureValue(); - } - elseif (!$this->ajax) - { - // If a feature value was saved, we need to reset the values to display the list - $this->setTypeFeature(); - $this->content .= $this->renderList(); - } - } - else - { - $url = ''.$this->l('Performance').''; - $this->displayWarning(sprintf($this->l('This feature has been disabled. You can activate it here: %s.'), $url)); - } - - $this->context->smarty->assign(array( - 'content' => $this->content, - 'url_post' => self::$currentIndex.'&token='.$this->token, - 'show_page_header_toolbar' => $this->show_page_header_toolbar, - 'page_header_toolbar_title' => $this->page_header_toolbar_title, - 'page_header_toolbar_btn' => $this->page_header_toolbar_btn - )); - } - - public function initProcess() - { - // Are we working on feature values? - if (Tools::getValue('id_feature_value') - || Tools::isSubmit('deletefeature_value') - || Tools::isSubmit('submitAddfeature_value') - || Tools::isSubmit('addfeature_value') - || Tools::isSubmit('updatefeature_value') - || Tools::isSubmit('submitBulkdeletefeature_value')) - $this->setTypeValue(); - - if (Tools::getIsset('viewfeature')) - { - $this->list_id = 'feature_value'; - - if (isset($_POST['submitReset'.$this->list_id])) - $this->processResetFilters(); - } - else - { - $this->list_id = 'feature'; - $this->_defaultOrderBy = 'position'; - $this->_defaultOrderWay = 'ASC'; - } - - parent::initProcess(); - - } - - public function postProcess() - { - if (!Feature::isFeatureActive()) - return; - - if ($this->table == 'feature_value' && ($this->action == 'save' || $this->action == 'delete' || $this->action == 'bulkDelete')) - Hook::exec('displayFeatureValuePostProcess', - array('errors' => &$this->errors)); // send errors as reference to allow displayFeatureValuePostProcess to stop saving process - else - Hook::exec('displayFeaturePostProcess', - array('errors' => &$this->errors)); // send errors as reference to allow displayFeaturePostProcess to stop saving process - - parent::postProcess(); - - if ($this->table == 'feature_value' && ($this->display == 'edit' || $this->display == 'add')) - $this->display = 'editFeatureValue'; - } - - /** - * Override processAdd to change SaveAndStay button action - * @see classes/AdminControllerCore::processAdd() - */ - public function processAdd() - { - $object = parent::processAdd(); - - if (Tools::isSubmit('submitAdd'.$this->table.'AndStay') && !count($this->errors)) - { - if( $this->table == 'feature_value' && ($this->display == 'edit' || $this->display == 'add') ) - $this->redirect_after = self::$currentIndex.'&addfeature_value&id_feature='.(int)Tools::getValue('id_feature').'&token='.$this->token; - else - $this->redirect_after = self::$currentIndex.'&'.$this->identifier.'=&conf=3&update'.$this->table.'&token='.$this->token; - } - elseif (Tools::isSubmit('submitAdd'.$this->table.'AndStay') && count($this->errors)) - $this->display = 'editFeatureValue'; - - return $object; - } - - /** - * Override processUpdate to change SaveAndStay button action - * @see classes/AdminControllerCore::processUpdate() - */ - public function processUpdate() - { - $object = parent::processUpdate(); - - if (Tools::isSubmit('submitAdd'.$this->table.'AndStay') && !count($this->errors)) - $this->redirect_after = self::$currentIndex.'&'.$this->identifier.'=&conf=3&update'.$this->table.'&token='.$this->token; - - return $object; - } - - /** - * Call the right method for creating or updating object - * - * @return mixed - */ - public function processSave() - { - if ($this->table == 'feature') - { - $id_feature = (int)Tools::getValue('id_feature'); - // Adding last position to the feature if not exist - if ($id_feature <= 0) - { - $sql = 'SELECT `position`+1 + + if ($this->table == 'feature_value' && ($this->action == 'save' || $this->action == 'delete' || $this->action == 'bulkDelete')) { + Hook::exec( + 'displayFeatureValuePostProcess', + array('errors' => &$this->errors) + ); + } else { // send errors as reference to allow displayFeatureValuePostProcess to stop saving process + Hook::exec( + 'displayFeaturePostProcess', + array('errors' => &$this->errors) + ); + } // send errors as reference to allow displayFeaturePostProcess to stop saving process + + parent::postProcess(); + + if ($this->table == 'feature_value' && ($this->display == 'edit' || $this->display == 'add')) { + $this->display = 'editFeatureValue'; + } + } + + /** + * Override processAdd to change SaveAndStay button action + * @see classes/AdminControllerCore::processAdd() + */ + public function processAdd() + { + $object = parent::processAdd(); + + if (Tools::isSubmit('submitAdd'.$this->table.'AndStay') && !count($this->errors)) { + if ($this->table == 'feature_value' && ($this->display == 'edit' || $this->display == 'add')) { + $this->redirect_after = self::$currentIndex.'&addfeature_value&id_feature='.(int)Tools::getValue('id_feature').'&token='.$this->token; + } else { + $this->redirect_after = self::$currentIndex.'&'.$this->identifier.'=&conf=3&update'.$this->table.'&token='.$this->token; + } + } elseif (Tools::isSubmit('submitAdd'.$this->table.'AndStay') && count($this->errors)) { + $this->display = 'editFeatureValue'; + } + + return $object; + } + + /** + * Override processUpdate to change SaveAndStay button action + * @see classes/AdminControllerCore::processUpdate() + */ + public function processUpdate() + { + $object = parent::processUpdate(); + + if (Tools::isSubmit('submitAdd'.$this->table.'AndStay') && !count($this->errors)) { + $this->redirect_after = self::$currentIndex.'&'.$this->identifier.'=&conf=3&update'.$this->table.'&token='.$this->token; + } + + return $object; + } + + /** + * Call the right method for creating or updating object + * + * @return mixed + */ + public function processSave() + { + if ($this->table == 'feature') { + $idFeature = (int)Tools::getValue('id_feature'); + // Adding last position to the feature if not exist + if ($idFeature <= 0) { + $sql = 'SELECT `position`+1 FROM `'._DB_PREFIX_.'feature` ORDER BY position DESC'; - // set the position of the new feature in $_POST for postProcess() method - $_POST['position'] = DB::getInstance()->getValue($sql); - } - // clean \n\r characters - foreach ($_POST as $key => $value) - if (preg_match('/^name_/Ui', $key)) - $_POST[$key] = str_replace ('\n', '', str_replace('\r', '', $value)); - //validate feature image - if(isset($_FILES['logo']) && $_FILES['logo']['tmp_name']) - $this->validAddFeatureImage($_FILES['logo']); - else - $this->errors[] = Tools::displayError('Please upload a feature image.'); - - $obj_feature = parent::processSave(); - if (!count($this->errors)) - { - $img_path = _PS_IMG_DIR_.'rf/'.$obj_feature->id.'.png'; - - //by webkul to save image of feature with feature name - $feature_values = FeatureValue::getFeatureValuesWithLang(1, $obj_feature->id); - - if ($feature_values) - $obj_feature_value = new FeatureValue($feature_values[0]['id_feature_value']); - else - $obj_feature_value = new FeatureValue(); - - - $current_file = _PS_TMP_IMG_DIR_.'feature_mini_'.$obj_feature->id.'_'.$this->context->shop->id.'.png'; - if (file_exists($current_file)) - unlink($current_file); - - $this->uploadFeatureImage($_FILES['logo'], $img_path); - $obj_feature_value->id_feature = $obj_feature->id; - - foreach (Language::getLanguages(true) as $lang) - $obj_feature_value->value[$lang['id_lang']] = $obj_feature->id.'.png'; - - $obj_feature_value->save(); - return $obj_feature; - } - - } - } - - // upload feature image by webkul - public function uploadFeatureImage($image, $feature_img_path) - { - if (isset($image)) - { - if ($image['size'] > 0) - ImageManager::resize($image['tmp_name'], $feature_img_path); - } - } - - // validate feature image by webkul - public function validAddFeatureImage($image) - { - if ($image['size'] > 0) - { - if ($image['tmp_name'] != "") - { - if(!ImageManager::isCorrectImageFileExt($image['name'])) - $this->errors[] = Tools::displayError(''.$_FILES['logo']['name'].' : Image format not recognized, allowed formats are: .gif, .jpg, .png', false); - } - } - else - return true; - } - - /** - * AdminController::getList() override - * @see AdminController::getList() - * - * @param int $id_lang - * @param string|null $order_by - * @param string|null $order_way - * @param int $start - * @param int|null $limit - * @param int|bool $id_lang_shop - * - * @throws PrestaShopException - */ - public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false) - { - if ($this->table == 'feature_value') - $this->_where .= ' AND (a.custom = 0 OR a.custom IS NULL)'; - - parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop); - - if ($this->table == 'feature') - { - $nb_items = count($this->_list); - for ($i = 0; $i < $nb_items; ++$i) - { - $item = &$this->_list[$i]; - - $query = new DbQuery(); - $query->select('COUNT(fv.id_feature_value) as count_values'); - $query->from('feature_value', 'fv'); - $query->where('fv.id_feature ='.(int)$item['id_feature']); - $query->where('(fv.custom=0 OR fv.custom IS NULL)'); - $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query); - $item['value'] = (int)$res; - unset($query); - } - } - } - - public function ajaxProcessUpdatePositions() - { - if ($this->tabAccess['edit'] === '1') - { - $way = (int)Tools::getValue('way'); - $id_feature = (int)Tools::getValue('id'); - $positions = Tools::getValue('feature'); - - $new_positions = array(); - foreach ($positions as $k => $v) - if (!empty($v)) - $new_positions[] = $v; - - foreach ($new_positions as $position => $value) - { - $pos = explode('_', $value); - - if (isset($pos[2]) && (int)$pos[2] === $id_feature) - { - if ($feature = new Feature((int)$pos[2])) - if (isset($position) && $feature->updatePosition($way, $position, $id_feature)) - echo 'ok position '.(int)$position.' for feature '.(int)$pos[1].'\r\n'; - else - echo '{"hasError" : true, "errors" : "Can not update feature '.(int)$id_feature.' to position '.(int)$position.' "}'; - else - echo '{"hasError" : true, "errors" : "This feature ('.(int)$id_feature.') can t be loaded"}'; - - break; - } - } - } - } + // set the position of the new feature in $_POST for postProcess() method + $_POST['position'] = DB::getInstance()->getValue($sql); + } + // clean \n\r characters + foreach ($_POST as $key => $value) { + if (preg_match('/^name_/Ui', $key)) { + $_POST[$key] = str_replace('\n', '', str_replace('\r', '', $value)); + } + } + $featureImage = $_FILES['logo']; + if (!$idFeature || (isset($featureImage['tmp_name']) && $featureImage['tmp_name'])) { + if ($featureImage && $featureImage['tmp_name'] && $featureImage['name']) { + if ($error = ImageManager::validateUpload($featureImage, Tools::getMaxUploadSize())) { + $this->errors[] = $error; + } + } else { + $this->errors[] = $this->l('Please select an image for this feature.'); + } + } + + $objFeature = parent::processSave(); + if (!count($this->errors)) { + // save feature image + if (isset($featureImage['tmp_name']) && $featureImage['tmp_name']) { + // if already feature image then delete it once before uploading new image + if ($idFeature) { + $currentImg = _PS_TMP_IMG_DIR_.'feature_mini_'.$objFeature->id.'_'.$this->context->shop->id.'.png'; + if (file_exists($currentImg)) { + unlink($currentImg); + } + } + // upload feature image + $imgPath = _PS_IMG_DIR_.'rf/'.$objFeature->id.'.png'; + if (!ImageManager::resize($featureImage['tmp_name'], $imgPath)) { + $this->errors[] = $this->l('Some error occurred while uploding feature image. Please try again.'); + } + } + + if ($featureValues = FeatureValue::getFeatureValuesWithLang( + $this->context->language->id, + $objFeature->id + )) { + $objFeatureValue = new FeatureValue($featureValues[0]['id_feature_value']); + } else { + $objFeatureValue = new FeatureValue(); + } + $objFeatureValue->id_feature = $objFeature->id; + foreach (Language::getLanguages(true) as $lang) { + $objFeatureValue->value[$lang['id_lang']] = $objFeature->id.'.png'; + } + $objFeatureValue->save(); + return $objFeature; + } + } + } + + /** + * AdminController::getList() override + * @see AdminController::getList() + * + * @param int $id_lang + * @param string|null $order_by + * @param string|null $order_way + * @param int $start + * @param int|null $limit + * @param int|bool $id_lang_shop + * + * @throws PrestaShopException + */ + public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false) + { + if ($this->table == 'feature_value') { + $this->_where .= ' AND (a.custom = 0 OR a.custom IS NULL)'; + } + + parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop); + + if ($this->table == 'feature') { + $nb_items = count($this->_list); + for ($i = 0; $i < $nb_items; ++$i) { + $item = &$this->_list[$i]; + + $query = new DbQuery(); + $query->select('COUNT(fv.id_feature_value) as count_values'); + $query->from('feature_value', 'fv'); + $query->where('fv.id_feature ='.(int)$item['id_feature']); + $query->where('(fv.custom=0 OR fv.custom IS NULL)'); + $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query); + $item['value'] = (int)$res; + unset($query); + } + } + } + + public function ajaxProcessUpdatePositions() + { + if ($this->tabAccess['edit'] === '1') { + $way = (int)Tools::getValue('way'); + $idFeature = (int)Tools::getValue('id'); + $positions = Tools::getValue('feature'); + + $new_positions = array(); + foreach ($positions as $k => $v) { + if (!empty($v)) { + $new_positions[] = $v; + } + } + + foreach ($new_positions as $position => $value) { + $pos = explode('_', $value); + + if (isset($pos[2]) && (int)$pos[2] === $idFeature) { + if ($feature = new Feature((int)$pos[2])) { + if (isset($position) && $feature->updatePosition($way, $position, $idFeature)) { + echo 'ok position '.(int)$position.' for feature '.(int)$pos[1].'\r\n'; + } else { + echo '{"hasError" : true, "errors" : "Can not update feature '.(int)$idFeature.' to position '.(int)$position.' "}'; + } + } else { + echo '{"hasError" : true, "errors" : "This feature ('.(int)$idFeature.') can t be loaded"}'; + } + + break; + } + } + } + } } diff --git a/controllers/admin/AdminOrderPreferencesController.php b/controllers/admin/AdminOrderPreferencesController.php index b739b5dbb..62202b9b5 100644 --- a/controllers/admin/AdminOrderPreferencesController.php +++ b/controllers/admin/AdminOrderPreferencesController.php @@ -73,13 +73,13 @@ public function __construct() 'value' => PS_ORDER_PROCESS_OPC, 'identifier' => 'value', ),*/ - /*'PS_GUEST_CHECKOUT_ENABLED' => array( + 'PS_GUEST_CHECKOUT_ENABLED' => array( 'title' => $this->l('Enable guest checkout'), 'hint' => $this->l('Allow guest visitors to place an order without registering.'), 'validation' => 'isBool', 'cast' => 'intval', - 'type' => 'hidden' - ),*/ + 'type' => 'bool' + ), /*'PS_DISALLOW_HISTORY_REORDERING' => array( 'title' => $this->l('Disable Reordering Option'), 'hint' => $this->l('Disable the option to allow customers to reorder in one click from the order history page (required in some European countries).'), diff --git a/controllers/admin/AdminProductsController.php b/controllers/admin/AdminProductsController.php index 480bba03b..17d6600e0 100644 --- a/controllers/admin/AdminProductsController.php +++ b/controllers/admin/AdminProductsController.php @@ -476,12 +476,14 @@ public function ajaxProcessGetCategoryTree() $full_tree = Tools::getValue('fullTree', 0); $use_check_box = Tools::getValue('useCheckBox', 1); $selected = Tools::getValue('selected', array()); + $id_tree = Tools::getValue('type'); $input_name = str_replace(array('[', ']'), '', Tools::getValue('inputName', null)); $tree = new HelperTreeCategories('subtree_associated_categories'); $tree->setTemplate('subtree_associated_categories.tpl') ->setUseCheckBox($use_check_box) - ->setUseSearch(true) + ->setUseSearch(false) + ->setIdTree($id_tree) ->setSelectedCategories($selected) ->setFullTree($full_tree) ->setChildrenOnly(true) @@ -3666,7 +3668,8 @@ public function initFormAssociations($obj) ->setHeaderTemplate('tree_associated_header.tpl') ->setRootCategory($root->id) ->setUseCheckBox(true) - ->setUseSearch(true) + ->setUseSearch(false) + ->setFullTree(0) ->setSelectedCategories($categories); $data->assign(array('default_category' => $default_category, diff --git a/controllers/front/AuthController.php b/controllers/front/AuthController.php index 384dfed0b..02d9fa483 100644 --- a/controllers/front/AuthController.php +++ b/controllers/front/AuthController.php @@ -26,710 +26,814 @@ class AuthControllerCore extends FrontController { - public $ssl = true; - public $php_self = 'authentication'; - public $auth = false; - - /** - * @var bool create_account - */ - protected $create_account; - protected $id_country; - - /** - * Initialize auth controller - * @see FrontController::init() - */ - public function init() - { - parent::init(); - - if (!Tools::getIsset('step') && $this->context->customer->isLogged() && !$this->ajax) - Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account')); - - if (Tools::getValue('create_account')) - $this->create_account = true; - } - - /** - * Set default medias for this controller - * @see FrontController::setMedia() - */ - public function setMedia() - { - parent::setMedia(); - if (!$this->useMobileTheme()) - $this->addCSS(_THEME_CSS_DIR_.'authentication.css'); - - $this->addCSS(_THEME_CSS_DIR_.'htl-reservation-general.css');// webkul - - $this->addJqueryPlugin('typewatch'); - $this->addJS(array( - _THEME_JS_DIR_.'tools/vatManagement.js', - _THEME_JS_DIR_.'tools/statesManagement.js', - _THEME_JS_DIR_.'authentication.js', - _PS_JS_DIR_.'validate.js' - )); - } - - /** - * Run ajax process - * @see FrontController::displayAjax() - */ - public function displayAjax() - { - $this->display(); - } - - /** - * Assign template vars related to page content - * @see FrontController::initContent() - */ - public function initContent() - { - parent::initContent(); - - $this->context->smarty->assign('genders', Gender::getGenders()); - - $this->assignDate(); - - $this->assignCountries(); - - $newsletter = Configuration::get('PS_CUSTOMER_NWSL') || (Module::isInstalled('blocknewsletter') && Module::getInstanceByName('blocknewsletter')->active); - $this->context->smarty->assign('newsletter', $newsletter); - $this->context->smarty->assign('optin', (bool)Configuration::get('PS_CUSTOMER_OPTIN')); - - $back = Tools::getValue('back'); - $key = Tools::safeOutput(Tools::getValue('key')); - - if (!empty($key)) - $back .= (strpos($back, '?') !== false ? '&' : '?').'key='.$key; - - if ($back == Tools::secureReferrer(Tools::getValue('back'))) - $this->context->smarty->assign('back', html_entity_decode($back)); - else - $this->context->smarty->assign('back', Tools::safeOutput($back)); - - if (Tools::getValue('display_guest_checkout')) - { - if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES')) - $countries = Carrier::getDeliveredCountries($this->context->language->id, true, true); - else - $countries = Country::getCountries($this->context->language->id, true); - - $this->context->smarty->assign(array( - 'inOrderProcess' => true, - 'PS_GUEST_CHECKOUT_ENABLED' => Configuration::get('PS_GUEST_CHECKOUT_ENABLED'), - 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'), - 'sl_country' => (int)$this->id_country, - 'countries' => $countries - )); - } - - if (Tools::getValue('create_account')) - $this->context->smarty->assign('email_create', 1); - - if (Tools::getValue('multi-shipping') == 1) - $this->context->smarty->assign('multi_shipping', true); - else - $this->context->smarty->assign('multi_shipping', false); - - $this->context->smarty->assign('field_required', $this->context->customer->validateFieldsRequiredDatabase()); - - $this->assignAddressFormat(); - - // Call a hook to display more information on form - $this->context->smarty->assign(array( - 'HOOK_CREATE_ACCOUNT_FORM' => Hook::exec('displayCustomerAccountForm'), - 'HOOK_CREATE_ACCOUNT_TOP' => Hook::exec('displayCustomerAccountFormTop') - )); - - // Just set $this->template value here in case it's used by Ajax - $this->setTemplate(_PS_THEME_DIR_.'authentication.tpl'); - - if ($this->ajax) - { - // Call a hook to display more information on form - $this->context->smarty->assign(array( - 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'), - 'genders' => Gender::getGenders() - )); - - $return = array( - 'hasError' => !empty($this->errors), - 'errors' => $this->errors, - 'page' => $this->context->smarty->fetch($this->template), - 'token' => Tools::getToken(false) - ); - $this->ajaxDie(Tools::jsonEncode($return)); - } - } - - /** - * Assign date var to smarty - */ - protected function assignDate() - { - $selectedYears = (int)(Tools::getValue('years', 0)); - $years = Tools::dateYears(); - $selectedMonths = (int)(Tools::getValue('months', 0)); - $months = Tools::dateMonths(); - $selectedDays = (int)(Tools::getValue('days', 0)); - $days = Tools::dateDays(); - - $this->context->smarty->assign(array( - 'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), - 'onr_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), //retro compat - 'years' => $years, - 'sl_year' => $selectedYears, - 'months' => $months, - 'sl_month' => $selectedMonths, - 'days' => $days, - 'sl_day' => $selectedDays - )); - } - - /** - * Assign countries var to smarty - */ - protected function assignCountries() - { - $this->id_country = (int)Tools::getCountry(); - if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES')) - $countries = Carrier::getDeliveredCountries($this->context->language->id, true, true); - else - $countries = Country::getCountries($this->context->language->id, true); - $this->context->smarty->assign(array( - 'countries' => $countries, - 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'), - 'sl_country' => (int)$this->id_country, - 'vat_management' => Configuration::get('VATNUMBER_MANAGEMENT') - )); - } - - /** - * Assign address var to smarty - */ - protected function assignAddressFormat() - { - $addressItems = array(); - $addressFormat = AddressFormat::getOrderedAddressFields((int)$this->id_country, false, true); - $requireFormFieldsList = AddressFormat::getFieldsRequired(); - - foreach ($addressFormat as $addressline) - foreach (explode(' ', $addressline) as $addressItem) - $addressItems[] = trim($addressItem); - - // Add missing require fields for a new user susbscription form - foreach ($requireFormFieldsList as $fieldName) - if (!in_array($fieldName, $addressItems)) - $addressItems[] = trim($fieldName); - - foreach (array('inv', 'dlv') as $addressType) - $this->context->smarty->assign(array( - $addressType.'_adr_fields' => $addressFormat, - $addressType.'_all_fields' => $addressItems, - 'required_fields' => $requireFormFieldsList - )); - } - - /** - * Start forms process - * @see FrontController::postProcess() - */ - public function postProcess() - { - if (Tools::isSubmit('SubmitCreate')) - $this->processSubmitCreate(); - - if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) - $this->processSubmitAccount(); - - if (Tools::isSubmit('SubmitLogin')) - $this->processSubmitLogin(); - } - - /** - * Process login - */ - protected function processSubmitLogin() - { - Hook::exec('actionBeforeAuthentication'); - $passwd = trim(Tools::getValue('passwd')); - $_POST['passwd'] = null; - $email = trim(Tools::getValue('email')); - if (empty($email)) - $this->errors[] = Tools::displayError('An email address required.'); - elseif (!Validate::isEmail($email)) - $this->errors[] = Tools::displayError('Invalid email address.'); - elseif (empty($passwd)) - $this->errors[] = Tools::displayError('Password is required.'); - elseif (!Validate::isPasswd($passwd)) - $this->errors[] = Tools::displayError('Invalid password.'); - else - { - $customer = new Customer(); - $authentication = $customer->getByEmail(trim($email), trim($passwd)); - if (isset($authentication->active) && !$authentication->active) - $this->errors[] = Tools::displayError('Your account isn\'t available at this time, please contact us'); - elseif (!$authentication || !$customer->id) - $this->errors[] = Tools::displayError('Authentication failed.'); - else - { - $this->context->cookie->id_compare = isset($this->context->cookie->id_compare) ? $this->context->cookie->id_compare: CompareProduct::getIdCompareByIdCustomer($customer->id); - $this->context->cookie->id_customer = (int)($customer->id); - $this->context->cookie->customer_lastname = $customer->lastname; - $this->context->cookie->customer_firstname = $customer->firstname; - $this->context->cookie->logged = 1; - $customer->logged = 1; - $this->context->cookie->is_guest = $customer->isGuest(); - $this->context->cookie->passwd = $customer->passwd; - $this->context->cookie->email = $customer->email; - - // Add customer to the context - $this->context->customer = $customer; - - if (Configuration::get('PS_CART_FOLLOWING') && (empty($this->context->cookie->id_cart) || Cart::getNbProducts($this->context->cookie->id_cart) == 0) && $id_cart = (int)Cart::lastNoneOrderedCart($this->context->customer->id)) - $this->context->cart = new Cart($id_cart); - else - { - $id_carrier = (int)$this->context->cart->id_carrier; - $this->context->cart->id_carrier = 0; - $this->context->cart->setDeliveryOption(null); - $this->context->cart->id_address_delivery = (int)Address::getFirstCustomerAddressId((int)($customer->id)); - $this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId((int)($customer->id)); - } - $this->context->cart->id_customer = (int)$customer->id; - $this->context->cart->secure_key = $customer->secure_key; - - if ($this->ajax && isset($id_carrier) && $id_carrier && Configuration::get('PS_ORDER_PROCESS_TYPE')) - { - $delivery_option = array($this->context->cart->id_address_delivery => $id_carrier.','); - $this->context->cart->setDeliveryOption($delivery_option); - } - - $this->context->cart->save(); - $this->context->cookie->id_cart = (int)$this->context->cart->id; - $this->context->cookie->write(); - $this->context->cart->autosetProductAddress(); - - Hook::exec('actionAuthentication'); - - // Login information have changed, so we check if the cart rules still apply - CartRule::autoRemoveFromCart($this->context); - CartRule::autoAddToCart($this->context); - - if (!$this->ajax && $back = Tools::getValue('back')) - { - if ($back == Tools::secureReferrer(Tools::getValue('back'))) - Tools::redirect(html_entity_decode($back)); - - $back = $back ? $back : 'my-account'; - Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : $back)); - } - } - } - if ($this->ajax) - { - $return = array( - 'hasError' => !empty($this->errors), - 'errors' => $this->errors, - 'token' => Tools::getToken(false) - ); - $this->ajaxDie(Tools::jsonEncode($return)); - } - else - $this->context->smarty->assign('authentification_error', $this->errors); - - } - - /** - * Process the newsletter settings and set the customer infos. - * - * @param Customer $customer Reference on the customer Object. - * - * @note At this point, the email has been validated. - */ - protected function processCustomerNewsletter(&$customer) - { - if (Tools::getValue('newsletter')) - { - $customer->ip_registration_newsletter = pSQL(Tools::getRemoteAddr()); - $customer->newsletter_date_add = pSQL(date('Y-m-d H:i:s')); - - if ($module_newsletter = Module::getInstanceByName('blocknewsletter')) - { - /** @var Blocknewsletter $module_newsletter */ - if ($module_newsletter->active) - $module_newsletter->confirmSubscription(Tools::getValue('email')); - } - } - } - - /** - * Process submit on an account - */ - protected function processSubmitAccount() - { - Hook::exec('actionBeforeSubmitAccount'); - $this->create_account = true; - if (Tools::isSubmit('submitAccount')) - $this->context->smarty->assign('email_create', 1); - // New Guest customer - if (!Tools::getValue('is_new_customer', 1) && !Configuration::get('PS_GUEST_CHECKOUT_ENABLED')) - $this->errors[] = Tools::displayError('You cannot create a guest account.'); - if (!Tools::getValue('is_new_customer', 1)) - $_POST['passwd'] = md5(time()._COOKIE_KEY_); - if ($guest_email = Tools::getValue('guest_email')) - $_POST['email'] = $guest_email; - // Checked the user address in case he changed his email address - if (Validate::isEmail($email = Tools::getValue('email')) && !empty($email)) - if (Customer::customerExists($email)) - $this->errors[] = Tools::displayError('An account using this email address has already been registered.', false); - // Preparing customer - $customer = new Customer(); - $lastnameAddress = Tools::getValue('lastname'); - $firstnameAddress = Tools::getValue('firstname'); - $_POST['lastname'] = Tools::getValue('customer_lastname', $lastnameAddress); - $_POST['firstname'] = Tools::getValue('customer_firstname', $firstnameAddress); - $addresses_types = array('address'); - if (!Configuration::get('PS_ORDER_PROCESS_TYPE') && Configuration::get('PS_GUEST_CHECKOUT_ENABLED') && Tools::getValue('invoice_address')) - $addresses_types[] = 'address_invoice'; - - $error_phone = false; - if (Configuration::get('PS_ONE_PHONE_AT_LEAST')) - { - if (Tools::isSubmit('submitGuestAccount') || !Tools::getValue('is_new_customer')) - { - if (!Tools::getValue('phone') && !Tools::getValue('phone_mobile')) - $error_phone = true; - } - elseif (((Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Configuration::get('PS_ORDER_PROCESS_TYPE')) - || (Configuration::get('PS_ORDER_PROCESS_TYPE') && !Tools::getValue('email_create')) - || (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Tools::getValue('email_create'))) - && (!Tools::getValue('phone') && !Tools::getValue('phone_mobile'))) - $error_phone = true; - } - - if ($error_phone) - $this->errors[] = Tools::displayError('You must register at least one phone number.'); - - $this->errors = array_unique(array_merge($this->errors, $customer->validateController())); - - // Check the requires fields which are settings in the BO - $this->errors = $this->errors + $customer->validateFieldsRequiredDatabase(); - - if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) - { - if (!count($this->errors)) - { - if (Tools::isSubmit('newsletter')) - $this->processCustomerNewsletter($customer); - - $customer->firstname = Tools::ucwords($customer->firstname); - $customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days')); - if (!Validate::isBirthDate($customer->birthday)) - $this->errors[] = Tools::displayError('Invalid date of birth.'); - - // New Guest customer - $customer->is_guest = (Tools::isSubmit('is_new_customer') ? !Tools::getValue('is_new_customer', 1) : 0); - $customer->active = 1; - - if (!count($this->errors)) - { - if ($customer->add()) - { - if (!$customer->is_guest) - if (!$this->sendConfirmationMail($customer)) - $this->errors[] = Tools::displayError('The email cannot be sent.'); - - $this->updateContext($customer); - - $this->context->cart->update(); - Hook::exec('actionCustomerAccountAdd', array( - '_POST' => $_POST, - 'newCustomer' => $customer - )); - if ($this->ajax) - { - $return = array( - 'hasError' => !empty($this->errors), - 'errors' => $this->errors, - 'isSaved' => true, - 'id_customer' => (int)$this->context->cookie->id_customer, - 'id_address_delivery' => $this->context->cart->id_address_delivery, - 'id_address_invoice' => $this->context->cart->id_address_invoice, - 'token' => Tools::getToken(false) - ); - $this->ajaxDie(Tools::jsonEncode($return)); - } - - if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) - Tools::redirect(html_entity_decode($back)); - - // redirection: if cart is not empty : redirection to the cart - if (count($this->context->cart->getProducts(true)) > 0) - { - $multi = (int)Tools::getValue('multi-shipping'); - Tools::redirect('index.php?controller=order'.($multi ? '&multi-shipping='.$multi : '')); - } - // else : redirection to the account - else - Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account')); - } - else - $this->errors[] = Tools::displayError('An error occurred while creating your account.'); - } - } - - } - else // if registration type is in one step, we save the address - { - $_POST['lastname'] = $lastnameAddress; - $_POST['firstname'] = $firstnameAddress; - $post_back = $_POST; - // Preparing addresses - foreach ($addresses_types as $addresses_type) - { - $$addresses_type = new Address(); - $$addresses_type->id_customer = 1; - - if ($addresses_type == 'address_invoice') - foreach ($_POST as $key => &$post) - if ($tmp = Tools::getValue($key.'_invoice')) - $post = $tmp; - - $this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController())); - if ($addresses_type == 'address_invoice') - $_POST = $post_back; - - if (!($country = new Country($$addresses_type->id_country)) || !Validate::isLoadedObject($country)) - $this->errors[] = Tools::displayError('Country cannot be loaded with address->id_country'); - - if (!$country->active) - $this->errors[] = Tools::displayError('This country is not active.'); - - $postcode = $$addresses_type->postcode; - /* Check zip code format */ - if ($country->zip_code_format && !$country->checkZipCode($postcode)) - $this->errors[] = sprintf(Tools::displayError('The Zip/Postal code you\'ve entered is invalid. It must follow this format: %s'), str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $country->zip_code_format)))); - elseif (empty($postcode) && $country->need_zip_code) - $this->errors[] = Tools::displayError('A Zip / Postal code is required.'); - elseif ($postcode && !Validate::isPostCode($postcode)) - $this->errors[] = Tools::displayError('The Zip / Postal code is invalid.'); - - if ($country->need_identification_number && (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni')))) - $this->errors[] = Tools::displayError('The identification number is incorrect or has already been used.'); - elseif (!$country->need_identification_number) - $$addresses_type->dni = null; - - if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) - if (!($country = new Country($$addresses_type->id_country, Configuration::get('PS_LANG_DEFAULT'))) || !Validate::isLoadedObject($country)) - $this->errors[] = Tools::displayError('Country is invalid'); - $contains_state = isset($country) && is_object($country) ? (int)$country->contains_states: 0; - $id_state = isset($$addresses_type) && is_object($$addresses_type) ? (int)$$addresses_type->id_state: 0; - if ((Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) && $contains_state && !$id_state) - $this->errors[] = Tools::displayError('This country requires you to choose a State.'); - } - } - - if (!@checkdate(Tools::getValue('months'), Tools::getValue('days'), Tools::getValue('years')) && !(Tools::getValue('months') == '' && Tools::getValue('days') == '' && Tools::getValue('years') == '')) - $this->errors[] = Tools::displayError('Invalid date of birth'); - - if (!count($this->errors)) - { - if (Customer::customerExists(Tools::getValue('email'))) - $this->errors[] = Tools::displayError('An account using this email address has already been registered. Please enter a valid password or request a new one. ', false); - if (Tools::isSubmit('newsletter')) - $this->processCustomerNewsletter($customer); - - $customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days')); - if (!Validate::isBirthDate($customer->birthday)) - $this->errors[] = Tools::displayError('Invalid date of birth'); - - if (!count($this->errors)) - { - $customer->active = 1; - // New Guest customer - if (Tools::isSubmit('is_new_customer')) - $customer->is_guest = !Tools::getValue('is_new_customer', 1); - else - $customer->is_guest = 0; - if (!$customer->add()) - $this->errors[] = Tools::displayError('An error occurred while creating your account.'); - else - { - foreach ($addresses_types as $addresses_type) - { - $$addresses_type->id_customer = (int)$customer->id; - if ($addresses_type == 'address_invoice') - foreach ($_POST as $key => &$post) - if ($tmp = Tools::getValue($key.'_invoice')) - $post = $tmp; - - $this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController())); - if ($addresses_type == 'address_invoice') - $_POST = $post_back; - if (!count($this->errors) && (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') || $this->ajax || Tools::isSubmit('submitGuestAccount')) && !$$addresses_type->add()) - $this->errors[] = Tools::displayError('An error occurred while creating your address.'); - } - if (!count($this->errors)) - { - if (!$customer->is_guest) - { - $this->context->customer = $customer; - $customer->cleanGroups(); - // we add the guest customer in the default customer group - $customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP'))); - if (!$this->sendConfirmationMail($customer)) - $this->errors[] = Tools::displayError('The email cannot be sent.'); - } - else - { - $customer->cleanGroups(); - // we add the guest customer in the guest customer group - $customer->addGroups(array((int)Configuration::get('PS_GUEST_GROUP'))); - } - $this->updateContext($customer); - $this->context->cart->id_address_delivery = (int)Address::getFirstCustomerAddressId((int)$customer->id); - $this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId((int)$customer->id); - if (isset($address_invoice) && Validate::isLoadedObject($address_invoice)) - $this->context->cart->id_address_invoice = (int)$address_invoice->id; - - if ($this->ajax && Configuration::get('PS_ORDER_PROCESS_TYPE')) - { - $delivery_option = array((int)$this->context->cart->id_address_delivery => (int)$this->context->cart->id_carrier.','); - $this->context->cart->setDeliveryOption($delivery_option); - } - - // If a logged guest logs in as a customer, the cart secure key was already set and needs to be updated - $this->context->cart->update(); - - // Avoid articles without delivery address on the cart - $this->context->cart->autosetProductAddress(); - - Hook::exec('actionCustomerAccountAdd', array( - '_POST' => $_POST, - 'newCustomer' => $customer - )); - if ($this->ajax) - { - $return = array( - 'hasError' => !empty($this->errors), - 'errors' => $this->errors, - 'isSaved' => true, - 'id_customer' => (int)$this->context->cookie->id_customer, - 'id_address_delivery' => $this->context->cart->id_address_delivery, - 'id_address_invoice' => $this->context->cart->id_address_invoice, - 'token' => Tools::getToken(false) - ); - $this->ajaxDie(Tools::jsonEncode($return)); - } - // if registration type is in two steps, we redirect to register address - if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) - Tools::redirect('index.php?controller=address'); - - if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) - Tools::redirect(html_entity_decode($back)); - - // redirection: if cart is not empty : redirection to the cart - if (count($this->context->cart->getProducts(true)) > 0) - Tools::redirect('index.php?controller=order'.($multi = (int)Tools::getValue('multi-shipping') ? '&multi-shipping='.$multi : '')); - // else : redirection to the account - else - Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account')); - } - } - } - } - - if (count($this->errors)) - { - //for retro compatibility to display guest account creation form on authentication page - if (Tools::getValue('submitGuestAccount')) - $_GET['display_guest_checkout'] = 1; - - if (!Tools::getValue('is_new_customer')) - unset($_POST['passwd']); - if ($this->ajax) - { - $return = array( - 'hasError' => !empty($this->errors), - 'errors' => $this->errors, - 'isSaved' => false, - 'id_customer' => 0 - ); - $this->ajaxDie(Tools::jsonEncode($return)); - } - $this->context->smarty->assign('account_error', $this->errors); - } - } - - /** - * Process submit on a creation - */ - protected function processSubmitCreate() - { - if (!Validate::isEmail($email = Tools::getValue('email_create')) || empty($email)) - $this->errors[] = Tools::displayError('Invalid email address.'); - elseif (Customer::customerExists($email)) - { - $this->errors[] = Tools::displayError('An account using this email address has already been registered. Please enter a valid password or request a new one. ', false); - $_POST['email'] = Tools::getValue('email_create'); - unset($_POST['email_create']); - } - else - { - $this->create_account = true; - $this->context->smarty->assign('email_create', Tools::safeOutput($email)); - $_POST['email'] = $email; - } - } - - /** - * Update context after customer creation - * @param Customer $customer Created customer - */ - protected function updateContext(Customer $customer) - { - $this->context->customer = $customer; - $this->context->smarty->assign('confirmation', 1); - $this->context->cookie->id_customer = (int)$customer->id; - $this->context->cookie->customer_lastname = $customer->lastname; - $this->context->cookie->customer_firstname = $customer->firstname; - $this->context->cookie->passwd = $customer->passwd; - $this->context->cookie->logged = 1; - // if register process is in two steps, we display a message to confirm account creation - if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE')) - $this->context->cookie->account_created = 1; - $customer->logged = 1; - $this->context->cookie->email = $customer->email; - $this->context->cookie->is_guest = !Tools::getValue('is_new_customer', 1); - // Update cart address - $this->context->cart->secure_key = $customer->secure_key; - } - - /** - * sendConfirmationMail - * @param Customer $customer - * @return bool - */ - protected function sendConfirmationMail(Customer $customer) - { - if (!Configuration::get('PS_CUSTOMER_CREATION_EMAIL')) - return true; - - return Mail::Send( - $this->context->language->id, - 'account', - Mail::l('Welcome!'), - array( - '{firstname}' => $customer->firstname, - '{lastname}' => $customer->lastname, - '{email}' => $customer->email, - '{passwd}' => Tools::getValue('passwd')), - $customer->email, - $customer->firstname.' '.$customer->lastname - ); - } + public $ssl = true; + public $php_self = 'authentication'; + public $auth = false; + + /** + * @var bool create_account + */ + protected $create_account; + protected $id_country; + + /** + * Initialize auth controller + * @see FrontController::init() + */ + public function init() + { + parent::init(); + + if (!Tools::getIsset('step') && $this->context->customer->isLogged() && !$this->ajax) { + Tools::redirect( + 'index.php?controller='. + (($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account') + ); + } + + if (Tools::getValue('create_account')) { + $this->create_account = true; + } + } + + /** + * Set default medias for this controller + * @see FrontController::setMedia() + */ + public function setMedia() + { + parent::setMedia(); + if (!$this->useMobileTheme()) { + $this->addCSS(_THEME_CSS_DIR_.'authentication.css'); + } + + $this->addCSS(_THEME_CSS_DIR_.'htl-reservation-general.css');// webkul + + $this->addJqueryPlugin('typewatch'); + $this->addJS( + array( + _THEME_JS_DIR_.'tools/vatManagement.js', + _THEME_JS_DIR_.'tools/statesManagement.js', + _THEME_JS_DIR_.'authentication.js', + _PS_JS_DIR_.'validate.js' + ) + ); + } + + /** + * Run ajax process + * @see FrontController::displayAjax() + */ + public function displayAjax() + { + $this->display(); + } + + /** + * Assign template vars related to page content + * @see FrontController::initContent() + */ + public function initContent() + { + parent::initContent(); + + $this->context->smarty->assign('genders', Gender::getGenders()); + + $this->assignDate(); + + $this->assignCountries(); + + $newsletter = Configuration::get('PS_CUSTOMER_NWSL') || (Module::isInstalled('blocknewsletter') && Module::getInstanceByName('blocknewsletter')->active); + + $this->context->smarty->assign('newsletter', $newsletter); + $this->context->smarty->assign('optin', (bool)Configuration::get('PS_CUSTOMER_OPTIN')); + + $back = Tools::getValue('back'); + $key = Tools::safeOutput(Tools::getValue('key')); + + if (!empty($key)) { + $back .= (strpos($back, '?') !== false ? '&' : '?').'key='.$key; + } + + if ($back == Tools::secureReferrer(Tools::getValue('back'))) { + $this->context->smarty->assign('back', html_entity_decode($back)); + } else { + $this->context->smarty->assign('back', Tools::safeOutput($back)); + } + + if (Tools::getValue('display_guest_checkout')) { + if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES')) { + $countries = Carrier::getDeliveredCountries($this->context->language->id, true, true); + } else { + $countries = Country::getCountries($this->context->language->id, true); + } + + $this->context->smarty->assign( + array( + 'inOrderProcess' => true, + 'PS_GUEST_CHECKOUT_ENABLED' => Configuration::get('PS_GUEST_CHECKOUT_ENABLED'), + 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'), + 'sl_country' => (int)$this->id_country, + 'countries' => $countries + ) + ); + } + + if (Tools::getValue('create_account')) { + $this->context->smarty->assign('email_create', 1); + } + + if (Tools::getValue('multi-shipping') == 1) { + $this->context->smarty->assign('multi_shipping', true); + } else { + $this->context->smarty->assign('multi_shipping', false); + } + + $this->context->smarty->assign('field_required', $this->context->customer->validateFieldsRequiredDatabase()); + + $this->assignAddressFormat(); + + // Call a hook to display more information on form + $this->context->smarty->assign( + array( + 'HOOK_CREATE_ACCOUNT_FORM' => Hook::exec('displayCustomerAccountForm'), + 'HOOK_CREATE_ACCOUNT_TOP' => Hook::exec('displayCustomerAccountFormTop') + ) + ); + + // Just set $this->template value here in case it's used by Ajax + $this->setTemplate(_PS_THEME_DIR_.'authentication.tpl'); + + if ($this->ajax) { + // Call a hook to display more information on form + $this->context->smarty->assign( + array( + 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'), + 'genders' => Gender::getGenders() + ) + ); + + $return = array( + 'hasError' => !empty($this->errors), + 'errors' => $this->errors, + 'page' => $this->context->smarty->fetch($this->template), + 'token' => Tools::getToken(false) + ); + $this->ajaxDie(Tools::jsonEncode($return)); + } + } + + /** + * Assign date var to smarty + */ + protected function assignDate() + { + $selectedYears = (int)(Tools::getValue('years', 0)); + $years = Tools::dateYears(); + $selectedMonths = (int)(Tools::getValue('months', 0)); + $months = Tools::dateMonths(); + $selectedDays = (int)(Tools::getValue('days', 0)); + $days = Tools::dateDays(); + + $this->context->smarty->assign( + array( + 'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), + 'onr_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), //retro compat + 'years' => $years, + 'sl_year' => $selectedYears, + 'months' => $months, + 'sl_month' => $selectedMonths, + 'days' => $days, + 'sl_day' => $selectedDays + ) + ); + } + + /** + * Assign countries var to smarty + */ + protected function assignCountries() + { + $this->id_country = (int)Tools::getCountry(); + if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES')) { + $countries = Carrier::getDeliveredCountries($this->context->language->id, true, true); + } else { + $countries = Country::getCountries($this->context->language->id, true); + } + $this->context->smarty->assign( + array( + 'countries' => $countries, + 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'), + 'sl_country' => (int)$this->id_country, + 'vat_management' => Configuration::get('VATNUMBER_MANAGEMENT') + ) + ); + } + + /** + * Assign address var to smarty + */ + protected function assignAddressFormat() + { + $addressItems = array(); + $addressFormat = AddressFormat::getOrderedAddressFields((int)$this->id_country, false, true); + $requireFormFieldsList = AddressFormat::getFieldsRequired(); + + foreach ($addressFormat as $addressline) { + foreach (explode(' ', $addressline) as $addressItem) { + $addressItems[] = trim($addressItem); + } + } + + // Add missing require fields for a new user susbscription form + foreach ($requireFormFieldsList as $fieldName) { + if (!in_array($fieldName, $addressItems)) { + $addressItems[] = trim($fieldName); + } + } + + foreach (array('inv', 'dlv') as $addressType) { + $this->context->smarty->assign( + array( + $addressType.'_adr_fields' => $addressFormat, + $addressType.'_all_fields' => $addressItems, + 'required_fields' => $requireFormFieldsList + ) + ); + } + } + + /** + * Start forms process + * @see FrontController::postProcess() + */ + public function postProcess() + { + if (Tools::isSubmit('SubmitCreate')) { + $this->processSubmitCreate(); + } + + if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) { + $this->processSubmitAccount(); + } + + if (Tools::isSubmit('SubmitLogin')) { + $this->processSubmitLogin(); + } + } + + /** + * Process login + */ + protected function processSubmitLogin() + { + Hook::exec('actionBeforeAuthentication'); + $passwd = trim(Tools::getValue('passwd')); + $_POST['passwd'] = null; + $email = trim(Tools::getValue('email')); + + if (empty($email)) { + $this->errors[] = Tools::displayError('An email address required.'); + } elseif (!Validate::isEmail($email)) { + $this->errors[] = Tools::displayError('Invalid email address.'); + } elseif (empty($passwd)) { + $this->errors[] = Tools::displayError('Password is required.'); + } elseif (!Validate::isPasswd($passwd)) { + $this->errors[] = Tools::displayError('Invalid password.'); + } else { + $customer = new Customer(); + $authentication = $customer->getByEmail(trim($email), trim($passwd)); + if (isset($authentication->active) && !$authentication->active) { + $this->errors[] = Tools::displayError('Your account isn\'t available at this time, please contact us'); + } elseif (!$authentication || !$customer->id) { + $this->errors[] = Tools::displayError('Authentication failed.'); + } else { + $this->context->cookie->id_compare = isset($this->context->cookie->id_compare) ? $this->context->cookie->id_compare: CompareProduct::getIdCompareByIdCustomer($customer->id); + $this->context->cookie->id_customer = (int)($customer->id); + $this->context->cookie->customer_lastname = $customer->lastname; + $this->context->cookie->customer_firstname = $customer->firstname; + $this->context->cookie->logged = 1; + $customer->logged = 1; + $this->context->cookie->is_guest = $customer->isGuest(); + $this->context->cookie->passwd = $customer->passwd; + $this->context->cookie->email = $customer->email; + + // Add customer to the context + $this->context->customer = $customer; + + if (Configuration::get('PS_CART_FOLLOWING') + && (empty($this->context->cookie->id_cart) || Cart::getNbProducts($this->context->cookie->id_cart) == 0) && $id_cart = (int)Cart::lastNoneOrderedCart($this->context->customer->id) + ) { + $this->context->cart = new Cart($id_cart); + } else { + $id_carrier = (int)$this->context->cart->id_carrier; + $this->context->cart->id_carrier = 0; + $this->context->cart->setDeliveryOption(null); + $this->context->cart->id_address_delivery = (int)Address::getFirstCustomerAddressId( + (int)($customer->id) + ); + $this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId( + (int)($customer->id) + ); + } + $this->context->cart->id_customer = (int)$customer->id; + $this->context->cart->secure_key = $customer->secure_key; + + if ($this->ajax && isset($id_carrier) && $id_carrier && Configuration::get('PS_ORDER_PROCESS_TYPE')) { + $delivery_option = array($this->context->cart->id_address_delivery => $id_carrier.','); + $this->context->cart->setDeliveryOption($delivery_option); + } + + $this->context->cart->save(); + $this->context->cookie->id_cart = (int)$this->context->cart->id; + $this->context->cookie->write(); + $this->context->cart->autosetProductAddress(); + + Hook::exec('actionAuthentication'); + + // Login information have changed, so we check if the cart rules still apply + CartRule::autoRemoveFromCart($this->context); + CartRule::autoAddToCart($this->context); + + if (!$this->ajax && $back = Tools::getValue('back')) { + if ($back == Tools::secureReferrer(Tools::getValue('back'))) { + Tools::redirect(html_entity_decode($back)); + } + + $back = $back ? $back : 'my-account'; + Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : $back)); + } + } + } + if ($this->ajax) { + $return = array( + 'hasError' => !empty($this->errors), + 'errors' => $this->errors, + 'token' => Tools::getToken(false) + ); + $this->ajaxDie(Tools::jsonEncode($return)); + } else { + $this->context->smarty->assign('authentification_error', $this->errors); + } + } + + /** + * Process the newsletter settings and set the customer infos. + * + * @param Customer $customer Reference on the customer Object. + * + * @note At this point, the email has been validated. + */ + protected function processCustomerNewsletter(&$customer) + { + if (Tools::getValue('newsletter')) { + $customer->ip_registration_newsletter = pSQL(Tools::getRemoteAddr()); + $customer->newsletter_date_add = pSQL(date('Y-m-d H:i:s')); + + if ($module_newsletter = Module::getInstanceByName('blocknewsletter')) { + /** @var Blocknewsletter $module_newsletter */ + if ($module_newsletter->active) { + $module_newsletter->confirmSubscription(Tools::getValue('email')); + } + } + } + } + + /** + * Process submit on an account + */ + protected function processSubmitAccount() + { + Hook::exec('actionBeforeSubmitAccount'); + $this->create_account = true; + if (Tools::isSubmit('submitAccount')) { + $this->context->smarty->assign('email_create', 1); + } + // New Guest customer + if (!Tools::getValue('is_new_customer', 1) && !Configuration::get('PS_GUEST_CHECKOUT_ENABLED')) { + $this->errors[] = Tools::displayError('You cannot create a guest account.'); + } + if (!Tools::getValue('is_new_customer', 1)) { + $_POST['passwd'] = md5(time()._COOKIE_KEY_); + } + if ($guest_email = Tools::getValue('guest_email')) { + $_POST['email'] = $guest_email; + } + // Checked the user address in case he changed his email address + if (Validate::isEmail($email = Tools::getValue('email')) && !empty($email)) { + if (Customer::customerExists($email)) { + $this->errors[] = Tools::displayError('An account using this email address has already been registered.', false); + } + } + // Preparing customer + $customer = new Customer(); + $lastnameAddress = Tools::getValue('lastname'); + $firstnameAddress = Tools::getValue('firstname'); + $_POST['lastname'] = Tools::getValue('customer_lastname', $lastnameAddress); + $_POST['firstname'] = Tools::getValue('customer_firstname', $firstnameAddress); + $addresses_types = array('address'); + + if (!Configuration::get('PS_ORDER_PROCESS_TYPE') && Configuration::get('PS_GUEST_CHECKOUT_ENABLED') && Tools::getValue('invoice_address')) { + $addresses_types[] = 'address_invoice'; + } + $error_phone = false; + if (Configuration::get('PS_ONE_PHONE_AT_LEAST')) { + if (Tools::isSubmit('submitGuestAccount') || !Tools::getValue('is_new_customer')) { + if (!Tools::getValue('phone') && !Tools::getValue('phone_mobile')) { + $error_phone = true; + } + } elseif (((Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Configuration::get('PS_ORDER_PROCESS_TYPE')) + || (Configuration::get('PS_ORDER_PROCESS_TYPE') && !Tools::getValue('email_create')) + || (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Tools::getValue('email_create'))) + && (!Tools::getValue('phone') && !Tools::getValue('phone_mobile')) + ) { + $error_phone = true; + } + } + + if ($error_phone) { + $this->errors[] = Tools::displayError('You must register at least one phone number.'); + } + + // if PS_CUSTOMER_ADDRESS_CREATION is disabled And customer has no addresses then create customer address + // with the details of first hotel which rooms he has in cart + if (!Configuration::get('PS_CUSTOMER_ADDRESS_CREATION') + && isset($this->context->cart->id) + && $this->context->cart->id + ) { + if (Module::isInstalled('hotelreservationsystem')) { + include_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php'; + $objHtlCart = new HotelCartBookingData(); + if ($htlCartInfo = $objHtlCart->getCartCurrentDataByCartId($this->context->cart->id)) { + if (isset($htlCartInfo[0]['id_hotel']) && ($idHotel = $htlCartInfo[0]['id_hotel'])) { + if (Validate::isLoadedObject($objHotel = new HotelBranchInformation($idHotel))) { + $_POST['lastname'] = Tools::getValue('customer_lastname'); + $_POST['firstname'] = Tools::getValue('customer_firstname'); + $_POST['address1'] = $objHotel->address; + $_POST['city'] = $objHotel->city; + $_POST['postcode'] = $objHotel->zipcode; + $_POST['alias'] = 'My address'; + $_POST['id_country'] = $objHotel->country_id; + $_POST['id_state'] = $objHotel->state_id; + // if form is shorter then address name will be customer name + $lastnameAddress = $_POST['lastname']; + $firstnameAddress = $_POST['firstname']; + + } + } + } + } + } + // End + $this->errors = array_unique(array_merge($this->errors, $customer->validateController())); + // Check the requires fields which are settings in the BO + $this->errors = $this->errors + $customer->validateFieldsRequiredDatabase(); + + if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) { + if (!count($this->errors)) { + if (Tools::isSubmit('newsletter')) { + $this->processCustomerNewsletter($customer); + } + + $customer->firstname = Tools::ucwords($customer->firstname); + $customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days')); + if (!Validate::isBirthDate($customer->birthday)) { + $this->errors[] = Tools::displayError('Invalid date of birth.'); + } + + // New Guest customer + $customer->is_guest = (Tools::isSubmit('is_new_customer') ? !Tools::getValue('is_new_customer', 1) : 0); + $customer->active = 1; + + if (!count($this->errors)) { + if ($customer->add()) { + if (!$customer->is_guest) { + if (!$this->sendConfirmationMail($customer)) { + // webkul - we will not stop process on email delivery fails + //$this->errors[] = Tools::displayError('The email cannot be sent.'); + } + } + + $this->updateContext($customer); + + $this->context->cart->update(); + Hook::exec( + 'actionCustomerAccountAdd', + array( + '_POST' => $_POST, + 'newCustomer' => $customer + ) + ); + if ($this->ajax) { + $return = array( + 'hasError' => !empty($this->errors), + 'errors' => $this->errors, + 'isSaved' => true, + 'id_customer' => (int)$this->context->cookie->id_customer, + 'id_address_delivery' => $this->context->cart->id_address_delivery, + 'id_address_invoice' => $this->context->cart->id_address_invoice, + 'token' => Tools::getToken(false) + ); + $this->ajaxDie(Tools::jsonEncode($return)); + } + + if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) { + Tools::redirect(html_entity_decode($back)); + } + + // redirection: if cart is not empty : redirection to the cart + if (count($this->context->cart->getProducts(true)) > 0) { + $multi = (int)Tools::getValue('multi-shipping'); + Tools::redirect('index.php?controller=order'.($multi ? '&multi-shipping='.$multi : '')); + } else { // else : redirection to the account + Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account')); + } + } else { + $this->errors[] = Tools::displayError('An error occurred while creating your account.'); + } + } + } + } else { // if registration type is in one step, we save the address + $_POST['lastname'] = $lastnameAddress; + $_POST['firstname'] = $firstnameAddress; + $post_back = $_POST; + // Preparing addresses + foreach ($addresses_types as $addresses_type) { + $$addresses_type = new Address(); + $$addresses_type->id_customer = 1; + + if ($addresses_type == 'address_invoice') { + foreach ($_POST as $key => &$post) { + if ($tmp = Tools::getValue($key.'_invoice')) { + $post = $tmp; + } + } + } + + $this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController())); + if ($addresses_type == 'address_invoice') { + $_POST = $post_back; + } + + if (!($country = new Country($$addresses_type->id_country)) || !Validate::isLoadedObject($country)) { + $this->errors[] = Tools::displayError('Country cannot be loaded with address->id_country'); + } + + if (!$country->active) { + $this->errors[] = Tools::displayError('This country is not active.'); + } + + $postcode = $$addresses_type->postcode; + /* Check zip code format */ + if ($country->zip_code_format && !$country->checkZipCode($postcode)) { + $this->errors[] = sprintf(Tools::displayError('The Zip/Postal code you\'ve entered is invalid. It must follow this format: %s'), str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $country->zip_code_format)))); + } elseif (empty($postcode) && $country->need_zip_code) { + $this->errors[] = Tools::displayError('A Zip / Postal code is required.'); + } elseif ($postcode && !Validate::isPostCode($postcode)) { + $this->errors[] = Tools::displayError('The Zip / Postal code is invalid.'); + } + + if ($country->need_identification_number + && (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni'))) + ) { + $this->errors[] = Tools::displayError('The identification number is incorrect or has already been used.'); + } elseif (!$country->need_identification_number) { + $$addresses_type->dni = null; + } + + if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) { + if (!($country = new Country($$addresses_type->id_country, Configuration::get('PS_LANG_DEFAULT'))) + || !Validate::isLoadedObject($country) + ) { + $this->errors[] = Tools::displayError('Country is invalid'); + } + } + $contains_state = isset($country) && is_object($country) ? (int)$country->contains_states: 0; + $id_state = isset($$addresses_type) && is_object($$addresses_type) ? (int)$$addresses_type->id_state: 0; + if ((Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) + && $contains_state + && !$id_state + ) { + $this->errors[] = Tools::displayError('This country requires you to choose a State.'); + } + } + } + + if (!@checkdate(Tools::getValue('months'), Tools::getValue('days'), Tools::getValue('years')) + && !(Tools::getValue('months') == '' + && Tools::getValue('days') == '' + && Tools::getValue('years') == '') + ) { + $this->errors[] = Tools::displayError('Invalid date of birth'); + } + + if (!count($this->errors)) { + if (Customer::customerExists(Tools::getValue('email'))) { + $this->errors[] = Tools::displayError('An account using this email address has already been registered. Please enter a valid password or request a new one. ', false); + } + if (Tools::isSubmit('newsletter')) { + $this->processCustomerNewsletter($customer); + } + + $customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days')); + if (!Validate::isBirthDate($customer->birthday)) { + $this->errors[] = Tools::displayError('Invalid date of birth'); + } + + if (!count($this->errors)) { + $customer->active = 1; + // New Guest customer + if (Tools::isSubmit('is_new_customer')) { + $customer->is_guest = !Tools::getValue('is_new_customer', 1); + } else { + $customer->is_guest = 0; + } + if (!$customer->add()) { + $this->errors[] = Tools::displayError('An error occurred while creating your account.'); + } else { + foreach ($addresses_types as $addresses_type) { + $$addresses_type->id_customer = (int)$customer->id; + if ($addresses_type == 'address_invoice') { + foreach ($_POST as $key => &$post) { + if ($tmp = Tools::getValue($key.'_invoice')) { + $post = $tmp; + } + } + } + $this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController())); + if ($addresses_type == 'address_invoice') { + $_POST = $post_back; + } + if (!count($this->errors) && (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') || $this->ajax || Tools::isSubmit('submitGuestAccount')) && !$$addresses_type->add()) { + $this->errors[] = Tools::displayError('An error occurred while creating your address.'); + } + } + if (!count($this->errors)) { + if (!$customer->is_guest) { + $this->context->customer = $customer; + $customer->cleanGroups(); + // we add the guest customer in the default customer group + $customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP'))); + if (!$this->sendConfirmationMail($customer)) { + // webkul - we will not stop process on email delivery fails + //$this->errors[] = Tools::displayError('The email cannot be sent.'); + } + } else { + $customer->cleanGroups(); + // we add the guest customer in the guest customer group + $customer->addGroups(array((int)Configuration::get('PS_GUEST_GROUP'))); + } + $this->updateContext($customer); + $this->context->cart->id_address_delivery = (int)Address::getFirstCustomerAddressId( + (int)$customer->id + ); + $this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId( + (int)$customer->id + ); + if (isset($address_invoice) && Validate::isLoadedObject($address_invoice)) { + $this->context->cart->id_address_invoice = (int)$address_invoice->id; + } + + if ($this->ajax && Configuration::get('PS_ORDER_PROCESS_TYPE')) { + $delivery_option = array( + (int)$this->context->cart->id_address_delivery => (int)$this->context->cart->id_carrier.',' + ); + $this->context->cart->setDeliveryOption($delivery_option); + } + + // If a logged guest logs in as a customer, the cart secure key was already set and needs to be updated + $this->context->cart->update(); + + // Avoid articles without delivery address on the cart + $this->context->cart->autosetProductAddress(); + + Hook::exec( + 'actionCustomerAccountAdd', array( + '_POST' => $_POST, + 'newCustomer' => $customer + ) + ); + if ($this->ajax) { + $return = array( + 'hasError' => !empty($this->errors), + 'errors' => $this->errors, + 'isSaved' => true, + 'id_customer' => (int)$this->context->cookie->id_customer, + 'id_address_delivery' => $this->context->cart->id_address_delivery, + 'id_address_invoice' => $this->context->cart->id_address_invoice, + 'token' => Tools::getToken(false) + ); + $this->ajaxDie(Tools::jsonEncode($return)); + } + // if registration type is in two steps, we redirect to register address + if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') + && !$this->ajax + && !Tools::isSubmit('submitGuestAccount') + ) { + Tools::redirect('index.php?controller=address'); + } + + if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) { + Tools::redirect(html_entity_decode($back)); + } + + // redirection: if cart is not empty : redirection to the cart + if (count($this->context->cart->getProducts(true)) > 0) { + Tools::redirect('index.php?controller=order'.($multi = (int)Tools::getValue('multi-shipping') ? '&multi-shipping='.$multi : '')); + } else { // else : redirection to the account + Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account')); + } + } + } + } + } + + if (count($this->errors)) { + //for retro compatibility to display guest account creation form on authentication page + if (Tools::getValue('submitGuestAccount')) { + $_GET['display_guest_checkout'] = 1; + } + + if (!Tools::getValue('is_new_customer')) { + unset($_POST['passwd']); + } + if ($this->ajax) { + $return = array( + 'hasError' => !empty($this->errors), + 'errors' => $this->errors, + 'isSaved' => false, + 'id_customer' => 0 + ); + $this->ajaxDie(Tools::jsonEncode($return)); + } + $this->context->smarty->assign('account_error', $this->errors); + } + } + + /** + * Process submit on a creation + */ + protected function processSubmitCreate() + { + if (!Validate::isEmail($email = Tools::getValue('email_create')) || empty($email)) { + $this->errors[] = Tools::displayError('Invalid email address.'); + } elseif (Customer::customerExists($email)) { + $this->errors[] = Tools::displayError('An account using this email address has already been registered. Please enter a valid password or request a new one. ', false); + $_POST['email'] = Tools::getValue('email_create'); + unset($_POST['email_create']); + } else { + $this->create_account = true; + $this->context->smarty->assign('email_create', Tools::safeOutput($email)); + $_POST['email'] = $email; + } + } + + /** + * Update context after customer creation + * @param Customer $customer Created customer + */ + protected function updateContext(Customer $customer) + { + $this->context->customer = $customer; + $this->context->smarty->assign('confirmation', 1); + $this->context->cookie->id_customer = (int)$customer->id; + $this->context->cookie->customer_lastname = $customer->lastname; + $this->context->cookie->customer_firstname = $customer->firstname; + $this->context->cookie->passwd = $customer->passwd; + $this->context->cookie->logged = 1; + // if register process is in two steps, we display a message to confirm account creation + if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE')) { + $this->context->cookie->account_created = 1; + } + $customer->logged = 1; + $this->context->cookie->email = $customer->email; + $this->context->cookie->is_guest = !Tools::getValue('is_new_customer', 1); + // Update cart address + $this->context->cart->secure_key = $customer->secure_key; + } + + /** + * Confirmation mail to the customer + * @param Customer $customer + * @return [bool] true if maail sent or false + */ + protected function sendConfirmationMail(Customer $customer) + { + if (!Configuration::get('PS_CUSTOMER_CREATION_EMAIL')) { + return true; + } + + return Mail::Send( + $this->context->language->id, + 'account', + Mail::l('Welcome!'), + array( + '{firstname}' => $customer->firstname, + '{lastname}' => $customer->lastname, + '{email}' => $customer->email, + '{passwd}' => Tools::getValue('passwd')), + $customer->email, + $customer->firstname.' '.$customer->lastname + ); + } } diff --git a/controllers/front/CartController.php b/controllers/front/CartController.php index 2f29bbc14..ff6ed7d27 100644 --- a/controllers/front/CartController.php +++ b/controllers/front/CartController.php @@ -72,14 +72,19 @@ public function postProcess() if ($this->context->cookie->exists() && !$this->errors && !($this->context->customer->isLogged() && !$this->isTokenValid())) { if (Tools::getIsset('add') || Tools::getIsset('update')) { $this->processChangeProductInCart(); + CheckoutProcess::refreshCheckoutProcess(); } elseif (Tools::getIsset('delete')) { $this->processDeleteProductInCart(); + CheckoutProcess::refreshCheckoutProcess(); } elseif (Tools::getIsset('changeAddressDelivery')) { $this->processChangeProductAddressDelivery(); + CheckoutProcess::refreshCheckoutProcess(); } elseif (Tools::getIsset('allowSeperatedPackage')) { $this->processAllowSeperatedPackage(); + CheckoutProcess::refreshCheckoutProcess(); } elseif (Tools::getIsset('duplicate')) { $this->processDuplicateProduct(); + CheckoutProcess::refreshCheckoutProcess(); } // Make redirection if (!$this->errors && !$this->ajax) { @@ -392,7 +397,7 @@ protected function processChangeProductInCart() if ($chkQty < $req_rm) { $obj_htl_cart_booking_data = new HotelCartBookingData(); $obj_htl_cart_booking_data->id_cart = $this->context->cart->id; - $obj_htl_cart_booking_data->id_guest = $this->context->cookie->id_guest; + $obj_htl_cart_booking_data->id_guest = $this->context->cart->id_guest; $obj_htl_cart_booking_data->id_customer = $id_customer; $obj_htl_cart_booking_data->id_currency = $id_currency; $obj_htl_cart_booking_data->id_product = $val_hotel_room_info['id_product']; diff --git a/controllers/front/GuestTrackingController.php b/controllers/front/GuestTrackingController.php index 53a712f79..4b99ef6eb 100644 --- a/controllers/front/GuestTrackingController.php +++ b/controllers/front/GuestTrackingController.php @@ -68,7 +68,6 @@ public function postProcess() if (!empty($order_reference)) { $order_collection = Order::getByReference($order_reference); } - $email = Tools::getValue('email'); if (empty($order_reference) && empty($id_order)) { @@ -117,11 +116,12 @@ public function initContent() if (count($this->errors)) { sleep(1); } - - $this->context->smarty->assign(array( - 'action' => $this->context->link->getPageLink('guest-tracking.php', true), - 'errors' => $this->errors, - )); + $this->context->smarty->assign( + array( + 'action' => $this->context->link->getPageLink('guest-tracking.php', true), + 'errors' => $this->errors, + ) + ); $this->setTemplate(_PS_THEME_DIR_.'guest-tracking.tpl'); } @@ -143,7 +143,24 @@ protected function assignOrderTracking($order_collection) $order_list[] = $order; } + //by webkul to show order details properly on order history page + if ($hotelresInstalled = Module::isInstalled('hotelreservationsystem')) { + include_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php'; + $objHtlBranchInfo = new HotelBranchInformation(); + $objBookingDetail = new HotelBookingDetail(); + $objRoomType = new HotelRoomType(); + $objCustomerAdv = new HotelCustomerAdvancedPayment(); + $objOrdRefundInfo = new HotelOrderRefundInfo(); + $objRefundStages = new HotelOrderRefundStages(); + + $nonRequestedRooms = 0; + $anyBackOrder = 0; + $processedProducts = array(); + $cartHotelData = array(); + } + foreach ($order_list as &$order) { + $idOrder = $order->id; /** @var Order $order */ $order->id_order_state = (int)$order->getCurrentState(); $order->invoice = (OrderState::invoiceAvailable((int)$order->id_order_state) && $order->invoice_number); @@ -169,20 +186,155 @@ protected function assignOrderTracking($order_collection) } $order->hook_orderdetaildisplayed = Hook::exec('displayOrderDetail', array('order' => $order)); + // enter the details of the booking the order + if ($hotelresInstalled) { + if ($orderProducts = $order->getProducts()) { + foreach ($orderProducts as $type_key => $type_value) { + if (in_array($type_value['product_id'], $processedProducts)) { + continue; + } + $processedProducts[] = $type_value['product_id']; + + $objProduct = new Product($type_value['product_id'], false, $this->context->language->id); + $cover_image_arr = $objProduct->getCover($type_value['product_id']); + + if (!empty($cover_image_arr)) { + $cover_img = $this->context->link->getImageLink($objProduct->link_rewrite, $objProduct->id.'-'.$cover_image_arr['id_image'], 'small_default'); + } else { + $cover_img = $this->context->link->getImageLink($objProduct->link_rewrite, $this->context->language->iso_code.'-default', 'small_default'); + } + + if (isset($customer->id)) { + $obj_cart = new Cart($order->id_cart); + $order_bk_data = $objBookingDetail->getOnlyOrderBookingData($idOrder, $obj_cart->id_guest, $type_value['product_id'], $customer->id); + } else { + $order_bk_data = $objBookingDetail->getOnlyOrderBookingData($idOrder, $customer->id_guest, $type_value['product_id']); + } + $rm_dtl = $objRoomType->getRoomTypeInfoByIdProduct($type_value['product_id']); + + $cartHotelData[$type_key]['id_product'] = $type_value['product_id']; + $cartHotelData[$type_key]['cover_img'] = $cover_img; + $cartHotelData[$type_key]['adult'] = $rm_dtl['adult']; + $cartHotelData[$type_key]['children'] = $rm_dtl['children']; + + // by webkul to calculate rates of the product from hotelreservation syatem tables with feature prices.... + + + //END + foreach ($order_bk_data as $data_k => $data_v) { + $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); + + /*Product price when order was created*/ + $order_details_obj = new OrderDetail($data_v['id_order_detail']); + $prod_ord_dtl_name = $order_details_obj->product_name; + $cartHotelData[$type_key]['name'] = $prod_ord_dtl_name; + + $cartHotelData[$type_key]['paid_unit_price_tax_excl'] = ($order_details_obj->total_price_tax_excl)/$order_details_obj->product_quantity; + $cartHotelData[$type_key]['paid_unit_price_tax_incl'] = ($order_details_obj->total_price_tax_incl)/$order_details_obj->product_quantity; + + //work on entring refund data + + $ord_refnd_info = $objOrdRefundInfo->getOderRefundInfoByIdOrderIdProductByDate($idOrder, $type_value['product_id'], $data_v['date_from'], $data_v['date_to']); + if ($ord_refnd_info) { + $stage_name = $objRefundStages->getNameById($ord_refnd_info['refund_stage_id']); + } else { + $stage_name = ''; + $nonRequestedRooms = 1; + } + if (isset($cartHotelData[$type_key]['date_diff'][$date_join])) { + $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] += 1; + + $num_days = $cartHotelData[$type_key]['date_diff'][$date_join]['num_days']; + $var_quant = (int) $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm']; + + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']*$var_quant; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']*$var_quant; + $cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; + if ($data_v['is_back_order']) { + $anyBackOrder = 1; + } + //refund_stage + $cartHotelData[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; + } else { + $num_days = $objBookingDetail->getNumberOfDays($data_v['date_from'], $data_v['date_to']); + + $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] = 1; + $cartHotelData[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from']; + $cartHotelData[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; + $cartHotelData[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; + + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; + if ($data_v['is_back_order']) { + $anyBackOrder = 1; + } + //refund_stage + $cartHotelData[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; + } + + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_excl'] = $order_details_obj->unit_price_tax_excl; + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_incl'] = $order_details_obj->unit_price_tax_incl; + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_excl'] = $order_details_obj->unit_price_tax_excl + $order_details_obj->reduction_amount_tax_excl; + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] = $order_details_obj->unit_price_tax_incl + $order_details_obj->reduction_amount_tax_incl; + + $feature_price_diff = (float)($cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] - $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']); + $cartHotelData[$type_key]['date_diff'][$date_join]['feature_price_diff'] = $feature_price_diff; + + //enter hotel name + $hotelInfo = $objHtlBranchInfo->hotelBranchesInfo( + Configuration::get('PS_LANG_DEFAULT'), + 2, + 0, + $data_v['id_hotel'] + ); + $cartHotelData[$type_key]['hotel_name'] = $hotelInfo['hotel_name']; + } + } + //For Advanced Payment + $order_adv_dtl = $objCustomerAdv->getCstAdvPaymentDtlByIdOrder($idOrder); + } + } + // end booking details entries + $redirectTermsLink = $this->context->link->getCMSLink( + new CMS(3, $this->context->language->id), + null, $this->context->language->id + ); + + $this->context->smarty->assign( + array( + 'any_back_order' => $anyBackOrder, + 'shw_bo_msg' => Configuration::get('WK_SHOW_MSG_ON_BO'), + 'back_ord_msg' => Configuration::get('WK_BO_MESSAGE'), + 'order_has_invoice' => $order->hasInvoice(), + 'redirect_link_terms', $redirectTermsLink, + 'cart_htl_data' => $cartHotelData, + 'non_requested_rooms' => $nonRequestedRooms, + 'order_adv_dtl' => $order_adv_dtl + ) + ); + //end + Hook::exec('actionOrderDetail', array('carrier' => $order->carrier, 'order' => $order)); } - $this->context->smarty->assign(array( - 'shop_name' => Configuration::get('PS_SHOP_NAME'), - 'order_collection' => $order_list, - 'return_allowed' => false, - 'invoiceAllowed' => (int)Configuration::get('PS_INVOICE'), - 'is_guest' => true, - 'group_use_tax' => (Group::getPriceDisplayMethod($customer->id_default_group) == PS_TAX_INC), - 'CUSTOMIZE_FILE' => Product::CUSTOMIZE_FILE, - 'CUSTOMIZE_TEXTFIELD' => Product::CUSTOMIZE_TEXTFIELD, - 'use_tax' => Configuration::get('PS_TAX'), - )); + $this->context->smarty->assign( + array( + 'shop_name' => Configuration::get('PS_SHOP_NAME'), + 'order_collection' => $order_list, + 'return_allowed' => false, + 'invoiceAllowed' => (int)Configuration::get('PS_INVOICE'), + 'is_guest' => true, + 'group_use_tax' => (Group::getPriceDisplayMethod($customer->id_default_group) == PS_TAX_INC), + 'CUSTOMIZE_FILE' => Product::CUSTOMIZE_FILE, + 'CUSTOMIZE_TEXTFIELD' => Product::CUSTOMIZE_TEXTFIELD, + 'use_tax' => Configuration::get('PS_TAX'), + ) + ); } public function setMedia() diff --git a/controllers/front/OrderDetailController.php b/controllers/front/OrderDetailController.php index 3bd0f307b..2b794c5d5 100644 --- a/controllers/front/OrderDetailController.php +++ b/controllers/front/OrderDetailController.php @@ -321,21 +321,28 @@ public function initContent() $customer = new Customer($order->id_customer); //by webkul to show order details properly on order history page - if (Module::isInstalled('hotelreservationsystem')) { - require_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php'; + + if ($hotelresInstalled = Module::isInstalled('hotelreservationsystem')) { + include_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php'; $objHtlBranchInfo = new HotelBranchInformation(); - $obj_cart_bk_data = new HotelCartBookingData(); - $obj_htl_bk_dtl = new HotelBookingDetail(); - $obj_rm_type = new HotelRoomType(); - $non_requested_rooms = 0; - $any_back_order = 0; - $processed_product = array(); + $objBookingDetail = new HotelBookingDetail(); + $objRoomType = new HotelRoomType(); + $objCustomerAdv = new HotelCustomerAdvancedPayment(); + $objOrdRefundInfo = new HotelOrderRefundInfo(); + + $nonRequestedRooms = 0; + $anyBackOrder = 0; + $processedProducts = array(); + $cartHotelData = array(); + } + + if ($hotelresInstalled) { if (!empty($products)) { foreach ($products as $type_key => $type_value) { - if (in_array($type_value['product_id'], $processed_product)) { + if (in_array($type_value['product_id'], $processedProducts)) { continue; } - $processed_product[] = $type_value['product_id']; + $processedProducts[] = $type_value['product_id']; $product = new Product($type_value['product_id'], false, $this->context->language->id); $cover_image_arr = $product->getCover($type_value['product_id']); @@ -348,85 +355,79 @@ public function initContent() if (isset($customer->id)) { $obj_cart = new Cart($order->id_cart); - $order_bk_data = $obj_htl_bk_dtl->getOnlyOrderBookingData($order->id, $obj_cart->id_guest, $type_value['product_id'], $customer->id); + $order_bk_data = $objBookingDetail->getOnlyOrderBookingData($order->id, $obj_cart->id_guest, $type_value['product_id'], $customer->id); } else { - $order_bk_data = $obj_htl_bk_dtl->getOnlyOrderBookingData($order->id, $customer->id_guest, $type_value['product_id']); + $order_bk_data = $objBookingDetail->getOnlyOrderBookingData($order->id, $customer->id_guest, $type_value['product_id']); } - $rm_dtl = $obj_rm_type->getRoomTypeInfoByIdProduct($type_value['product_id']); - - $cart_htl_data[$type_key]['id_product'] = $type_value['product_id']; - $cart_htl_data[$type_key]['cover_img'] = $cover_img; - $cart_htl_data[$type_key]['adult'] = $rm_dtl['adult']; - $cart_htl_data[$type_key]['children'] = $rm_dtl['children']; + $rm_dtl = $objRoomType->getRoomTypeInfoByIdProduct($type_value['product_id']); - // by webkul to calculate rates of the product from hotelreservation syatem tables with feature prices.... + $cartHotelData[$type_key]['id_product'] = $type_value['product_id']; + $cartHotelData[$type_key]['cover_img'] = $cover_img; + $cartHotelData[$type_key]['adult'] = $rm_dtl['adult']; + $cartHotelData[$type_key]['children'] = $rm_dtl['children']; - $hotelCartBookingData = new HotelCartBookingData(); - //END foreach ($order_bk_data as $data_k => $data_v) { $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); /*Product price when order was created*/ $order_details_obj = new OrderDetail($data_v['id_order_detail']); $prod_ord_dtl_name = $order_details_obj->product_name; - $cart_htl_data[$type_key]['name'] = $prod_ord_dtl_name; + $cartHotelData[$type_key]['name'] = $prod_ord_dtl_name; - $cart_htl_data[$type_key]['paid_unit_price_tax_excl'] = ($order_details_obj->total_price_tax_excl)/$order_details_obj->product_quantity; - $cart_htl_data[$type_key]['paid_unit_price_tax_incl'] = ($order_details_obj->total_price_tax_incl)/$order_details_obj->product_quantity; + $cartHotelData[$type_key]['paid_unit_price_tax_excl'] = ($order_details_obj->total_price_tax_excl)/$order_details_obj->product_quantity; + $cartHotelData[$type_key]['paid_unit_price_tax_incl'] = ($order_details_obj->total_price_tax_incl)/$order_details_obj->product_quantity; //work on entring refund data - $obj_ord_ref_info = new HotelOrderRefundInfo(); - $ord_refnd_info = $obj_ord_ref_info->getOderRefundInfoByIdOrderIdProductByDate($id_order, $type_value['product_id'], $data_v['date_from'], $data_v['date_to']); + $ord_refnd_info = $objOrdRefundInfo->getOderRefundInfoByIdOrderIdProductByDate($id_order, $type_value['product_id'], $data_v['date_from'], $data_v['date_to']); if ($ord_refnd_info) { - $obj_refund_stages = new HotelOrderRefundStages(); - $stage_name = $obj_refund_stages->getNameById($ord_refnd_info['refund_stage_id']); + $stage_name = $objRefundStages->getNameById($ord_refnd_info['refund_stage_id']); } else { $stage_name = ''; - $non_requested_rooms = 1; + $nonRequestedRooms = 1; } - if (isset($cart_htl_data[$type_key]['date_diff'][$date_join])) { - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] += 1; + if (isset($cartHotelData[$type_key]['date_diff'][$date_join])) { + $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] += 1; - $num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days']; - $var_quant = (int) $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm']; + $num_days = $cartHotelData[$type_key]['date_diff'][$date_join]['num_days']; + $var_quant = (int) $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm']; - $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; - $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']*$var_quant; - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']*$var_quant; - $cart_htl_data[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']*$var_quant; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']*$var_quant; + $cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; if ($data_v['is_back_order']) { - $any_back_order = 1; + $anyBackOrder = 1; } //refund_stage - $cart_htl_data[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; + $cartHotelData[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; } else { - $num_days = $obj_htl_bk_dtl->getNumberOfDays($data_v['date_from'], $data_v['date_to']); - - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] = 1; - $cart_htl_data[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from']; - $cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; - - $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; - $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']; - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']; - $cart_htl_data[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; + $num_days = $objBookingDetail->getNumberOfDays($data_v['date_from'], $data_v['date_to']); + + $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] = 1; + $cartHotelData[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from']; + $cartHotelData[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; + $cartHotelData[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; + + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']; + $cartHotelData[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; if ($data_v['is_back_order']) { - $any_back_order = 1; + $anyBackOrder = 1; } //refund_stage - $cart_htl_data[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; + $cartHotelData[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; } - $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_tax_excl'] = $order_details_obj->unit_price_tax_excl; - $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_tax_incl'] = $order_details_obj->unit_price_tax_incl; - $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_excl'] = $order_details_obj->unit_price_tax_excl + $order_details_obj->reduction_amount_tax_excl; - $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] = $order_details_obj->unit_price_tax_incl + $order_details_obj->reduction_amount_tax_incl; + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_excl'] = $order_details_obj->unit_price_tax_excl; + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_tax_incl'] = $order_details_obj->unit_price_tax_incl; + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_excl'] = $order_details_obj->unit_price_tax_excl + $order_details_obj->reduction_amount_tax_excl; + $cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] = $order_details_obj->unit_price_tax_incl + $order_details_obj->reduction_amount_tax_incl; - $feature_price_diff = (float)($cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] - $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']); - $cart_htl_data[$type_key]['date_diff'][$date_join]['feature_price_diff'] = $feature_price_diff; + $feature_price_diff = (float)($cartHotelData[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] - $cartHotelData[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']); + $cartHotelData[$type_key]['date_diff'][$date_join]['feature_price_diff'] = $feature_price_diff; //enter hotel name $hotelInfo = $objHtlBranchInfo->hotelBranchesInfo( @@ -435,66 +436,64 @@ public function initContent() 0, $data_v['id_hotel'] ); - $cart_htl_data[$type_key]['hotel_name'] = $hotelInfo['hotel_name']; + $cartHotelData[$type_key]['hotel_name'] = $hotelInfo['hotel_name']; } } - $redirect_link_terms = $this->context->link->getCMSLink(new CMS(3, $this->context->language->id), null, $this->context->language->id); - $this->context->smarty->assign('redirect_link_terms', $redirect_link_terms); - $this->context->smarty->assign('cart_htl_data', $cart_htl_data); - $this->context->smarty->assign('non_requested_rooms', $non_requested_rooms); + $redirectTermsLink = $this->context->link->getCMSLink(new CMS(3, $this->context->language->id), null, $this->context->language->id); //For Advanced Payment - $obj_customer_adv = new HotelCustomerAdvancedPayment(); - $order_adv_dtl = $obj_customer_adv->getCstAdvPaymentDtlByIdOrder($order->id); - if ($order_adv_dtl) { - $this->context->smarty->assign('order_adv_dtl', $order_adv_dtl); - } + $orderAdvDetail = $objCustomerAdv->getCstAdvPaymentDtlByIdOrder($order->id); - $shw_bo_msg = Configuration::get('WK_SHOW_MSG_ON_BO'); - $bo_msg = Configuration::get('WK_BO_MESSAGE'); - $this->context->smarty->assign(array( - 'any_back_order' => $any_back_order, - 'shw_bo_msg' => $shw_bo_msg, - 'back_ord_msg' => $bo_msg, - )); - $order_has_invoice = $order->hasInvoice(); - $this->context->smarty->assign('order_has_invoice', $order_has_invoice); + $this->context->smarty->assign( + array( + 'any_back_order' => $anyBackOrder, + 'shw_bo_msg' => Configuration::get('WK_SHOW_MSG_ON_BO'), + 'back_ord_msg' => Configuration::get('WK_BO_MESSAGE'), + 'order_has_invoice' => $order->hasInvoice(), + 'redirect_link_terms', $redirectTermsLink, + 'cart_htl_data' => $cartHotelData, + 'non_requested_rooms' => $nonRequestedRooms, + 'order_adv_dtl' => $orderAdvDetail + ) + ); } } //end - $this->context->smarty->assign(array( - 'shop_name' => strval(Configuration::get('PS_SHOP_NAME')), - 'order' => $order, - 'return_allowed' => (int) $order->isReturnable(), - 'currency' => new Currency($order->id_currency), - 'order_state' => (int) $id_order_state, - 'invoiceAllowed' => (int) Configuration::get('PS_INVOICE'), - 'invoice' => (OrderState::invoiceAvailable($id_order_state) && count($order->getInvoicesCollection())), - 'logable' => (bool) $order_status->logable, - 'order_history' => $order->getHistory($this->context->language->id, false, true), - 'products' => $products, - 'discounts' => $order->getCartRules(), - 'carrier' => $carrier, - 'address_invoice' => $addressInvoice, - 'invoiceState' => (Validate::isLoadedObject($addressInvoice) && $addressInvoice->id_state) ? new State($addressInvoice->id_state) : false, - 'address_delivery' => $addressDelivery, - 'inv_adr_fields' => $inv_adr_fields, - 'dlv_adr_fields' => $dlv_adr_fields, - 'invoiceAddressFormatedValues' => $invoiceAddressFormatedValues, - 'deliveryAddressFormatedValues' => $deliveryAddressFormatedValues, - 'deliveryState' => (Validate::isLoadedObject($addressDelivery) && $addressDelivery->id_state) ? new State($addressDelivery->id_state) : false, - 'is_guest' => false, - 'messages' => CustomerMessage::getMessagesByOrderId((int) $order->id, false), - 'CUSTOMIZE_FILE' => Product::CUSTOMIZE_FILE, - 'CUSTOMIZE_TEXTFIELD' => Product::CUSTOMIZE_TEXTFIELD, - 'isRecyclable' => Configuration::get('PS_RECYCLABLE_PACK'), - 'use_tax' => Configuration::get('PS_TAX'), - 'group_use_tax' => (Group::getPriceDisplayMethod($customer->id_default_group) == PS_TAX_INC), - /* DEPRECATED: customizedDatas @since 1.5 */ - 'customizedDatas' => $customizedDatas, - /* DEPRECATED: customizedDatas @since 1.5 */ - 'reorderingAllowed' => !(bool) Configuration::get('PS_DISALLOW_HISTORY_REORDERING'), - )); + $this->context->smarty->assign( + array( + 'shop_name' => strval(Configuration::get('PS_SHOP_NAME')), + 'order' => $order, + 'return_allowed' => (int) $order->isReturnable(), + 'currency' => new Currency($order->id_currency), + 'order_state' => (int) $id_order_state, + 'invoiceAllowed' => (int) Configuration::get('PS_INVOICE'), + 'invoice' => (OrderState::invoiceAvailable($id_order_state) && count($order->getInvoicesCollection())), + 'logable' => (bool) $order_status->logable, + 'order_history' => $order->getHistory($this->context->language->id, false, true), + 'products' => $products, + 'discounts' => $order->getCartRules(), + 'carrier' => $carrier, + 'address_invoice' => $addressInvoice, + 'invoiceState' => (Validate::isLoadedObject($addressInvoice) && $addressInvoice->id_state) ? new State($addressInvoice->id_state) : false, + 'address_delivery' => $addressDelivery, + 'inv_adr_fields' => $inv_adr_fields, + 'dlv_adr_fields' => $dlv_adr_fields, + 'invoiceAddressFormatedValues' => $invoiceAddressFormatedValues, + 'deliveryAddressFormatedValues' => $deliveryAddressFormatedValues, + 'deliveryState' => (Validate::isLoadedObject($addressDelivery) && $addressDelivery->id_state) ? new State($addressDelivery->id_state) : false, + 'is_guest' => false, + 'messages' => CustomerMessage::getMessagesByOrderId((int) $order->id, false), + 'CUSTOMIZE_FILE' => Product::CUSTOMIZE_FILE, + 'CUSTOMIZE_TEXTFIELD' => Product::CUSTOMIZE_TEXTFIELD, + 'isRecyclable' => Configuration::get('PS_RECYCLABLE_PACK'), + 'use_tax' => Configuration::get('PS_TAX'), + 'group_use_tax' => (Group::getPriceDisplayMethod($customer->id_default_group) == PS_TAX_INC), + /* DEPRECATED: customizedDatas @since 1.5 */ + 'customizedDatas' => $customizedDatas, + /* DEPRECATED: customizedDatas @since 1.5 */ + 'reorderingAllowed' => !(bool) Configuration::get('PS_DISALLOW_HISTORY_REORDERING'), + ) + ); if ($carrier->url && $order->shipping_number) { $this->context->smarty->assign('followup', str_replace('@', $order->shipping_number, $carrier->url)); diff --git a/controllers/front/OrderOpcController.php b/controllers/front/OrderOpcController.php index aea787a4f..c78832de9 100644 --- a/controllers/front/OrderOpcController.php +++ b/controllers/front/OrderOpcController.php @@ -382,33 +382,65 @@ public function initContent() break; } } + if ($this->context->cart->id_address_delivery) { + // send address formatted layout data + if (Validate::isLoadedObject($address = new Address($this->context->cart->id_address_delivery))) { + $addressLayout = AddressFormat::getFormattedLayoutData($address); + $orderedAddressFields = AddressFormat::getOrderedAddressFields($address->id_country, false, true); + $this->context->smarty->assign( + array( + 'orderedAddressFields' => $orderedAddressFields, + 'addressLayout' => $addressLayout + ) + ); + } + } - $this->context->smarty->assign(array( - 'free_shipping' => $free_shipping, - 'isGuest' => isset($this->context->cookie->is_guest) ? $this->context->cookie->is_guest : 0, - 'countries' => $countries, - 'sl_country' => (int)Tools::getCountry(), - 'PS_GUEST_CHECKOUT_ENABLED' => Configuration::get('PS_GUEST_CHECKOUT_ENABLED'), - 'errorCarrier' => Tools::displayError('You must choose a carrier.', false), - 'errorTOS' => Tools::displayError('You must accept the Terms of Service.', false), - 'isPaymentStep' => isset($_GET['isPaymentStep']) && $_GET['isPaymentStep'], - 'genders' => Gender::getGenders(), - 'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), - 'HOOK_CREATE_ACCOUNT_FORM' => Hook::exec('displayCustomerAccountForm'), - 'HOOK_CREATE_ACCOUNT_TOP' => Hook::exec('displayCustomerAccountFormTop') - )); + // assign checkout process steps + $this->setCheckoutProcess(); + + // if there is cookie variable in the url the redirect + if (Tools::getValue('proceed_to_customer_dtl') || Tools::getValue('proceed_to_payment')) { + Tools::redirect($this->context->link->getPageLink('order-opc', null, $this->context->language->id)); + } + + $this->context->smarty->assign('checkout_process_steps', $this->checkoutProcess->getSteps()); + $this->context->smarty->assign( + array( + 'THEME_DIR' => _THEME_DIR_, + 'PS_CUSTOMER_ADDRESS_CREATION' => Configuration::get('PS_CUSTOMER_ADDRESS_CREATION'), + 'free_shipping' => $free_shipping, + 'isGuest' => isset($this->context->cookie->is_guest) ? $this->context->cookie->is_guest : 0, + 'countries' => $countries, + 'sl_country' => (int)Tools::getCountry(), + 'PS_GUEST_CHECKOUT_ENABLED' => Configuration::get('PS_GUEST_CHECKOUT_ENABLED'), + 'errorCarrier' => Tools::displayError('You must choose a carrier.', false), + 'errorTOS' => Tools::displayError('You must accept the Terms of Service.', false), + 'isPaymentStep' => isset($_GET['isPaymentStep']) && $_GET['isPaymentStep'], + 'genders' => Gender::getGenders(), + 'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), + 'HOOK_CREATE_ACCOUNT_FORM' => Hook::exec('displayCustomerAccountForm'), + 'HOOK_CREATE_ACCOUNT_TOP' => Hook::exec('displayCustomerAccountFormTop') + ) + ); $years = Tools::dateYears(); $months = Tools::dateMonths(); $days = Tools::dateDays(); - $this->context->smarty->assign(array( - 'years' => $years, - 'months' => $months, - 'days' => $days, - )); + $this->context->smarty->assign( + array( + 'years' => $years, + 'months' => $months, + 'days' => $days, + ) + ); /* Load guest informations */ - if ($this->isLogged && $this->context->cookie->is_guest) { - $this->context->smarty->assign('guestInformations', $this->_getGuestInformations()); + if ($this->isLogged) { + if ($this->context->cookie->is_guest) { + $this->context->smarty->assign('guestInformations', $this->_getGuestInformations()); + } else { + $this->context->smarty->assign('guestInformations', (array)$this->context->customer); + } } // ADDRESS if ($this->isLogged) { @@ -433,11 +465,14 @@ public function initContent() $id_product = Tools::getValue('id_product'); $date_from = Tools::getValue('date_from'); $date_to = Tools::getValue('date_to'); - $obj_cart_bk_data = new HotelCartBookingData(); - $cart_data_dlt = $obj_cart_bk_data->deleteRoomDataFromOrderLine($this->context->cart->id, $this->context->cart->id_guest, $id_product, $date_from, $date_to); - - if ($cart_data_dlt) { + if ($cart_data_dlt = $obj_cart_bk_data->deleteRoomDataFromOrderLine( + $this->context->cart->id, + $this->context->cart->id_guest, + $id_product, + $date_from, + $date_to + )) { Tools::redirect($link->getPageLink('order-opc', null, $this->context->language->id)); } } @@ -447,7 +482,7 @@ public function initContent() $this->setTemplate(_PS_THEME_DIR_ . 'order-opc-advanced.tpl'); } else { if (Module::isInstalled('hotelreservationsystem')) { - require_once(_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); + require_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php'; $obj_cart_bk_data = new HotelCartBookingData(); $obj_htl_bk_dtl = new HotelBookingDetail(); @@ -498,9 +533,8 @@ public function initContent() } } $this->context->smarty->assign('cartChanged', $cartChanged); - $cart_htl_data = HotelCartBookingData::getHotelCartBookingData(); - if ($cart_htl_data) { - $this->context->smarty->assign('cart_htl_data', $cart_htl_data); + if ($cartBookingInfo = HotelCartBookingData::getHotelCartBookingData()) { + $this->context->smarty->assign('cart_htl_data', $cartBookingInfo); } // For Advanced Payment @@ -567,7 +601,6 @@ public function initContent() $customer_adv_dtl['total_to_be_paid'] = ($customer_adv_dtl['total_paid_amount'] - $total_discount) > 0 ? ($customer_adv_dtl['total_paid_amount'] - $total_discount) : 0; $this->context->smarty->assign('customer_adv_dtl', $customer_adv_dtl); } - $this->context->smarty->assign('adv_amount', $adv_amount); $this->context->smarty->assign('advance_payment_active', $advance_payment_active); } @@ -585,6 +618,25 @@ public function initContent() } } + // sets checkout process steps as per current values + private function setCheckoutProcess() + { + $this->checkoutProcess = new CheckoutProcess(); + // add the steps you want to add in checkout process + $this->checkoutProcess + ->addStep(new CheckoutCartSummaryStep()) + ->addStep(new CheckoutCustomerDetailsStep()) + ->addStep(new CheckoutPaymentStep()); + + $this->checkoutProcess->handleRequest(); + + // for making steps synced + $this->checkoutProcess + ->setNextStepReachable() + ->markCurrentStep() + ->invalidateAllStepsAfterCurrent(); + } + protected function _getGuestInformations() { $customer = $this->context->customer; @@ -866,7 +918,6 @@ protected function _processAddressFormat() $dlv_adr_fields[] = trim($field_name); } } - foreach ($require_form_fields_list as $field_name) { if (!in_array($field_name, $inv_adr_fields)) { $inv_adr_fields[] = trim($field_name); @@ -886,11 +937,13 @@ protected function _processAddressFormat() ${$adr_type.'_adr_fields'} = array_unique(${$adr_type.'_adr_fields'}); ${$adr_type.'_all_fields'} = array_unique(${$adr_type.'_all_fields'}); - $this->context->smarty->assign(array( - $adr_type.'_adr_fields' => ${$adr_type.'_adr_fields'}, - $adr_type.'_all_fields' => ${$adr_type.'_all_fields'}, - 'required_fields' => $require_form_fields_list - )); + $this->context->smarty->assign( + array( + $adr_type.'_adr_fields' => ${$adr_type.'_adr_fields'}, + $adr_type.'_all_fields' => ${$adr_type.'_all_fields'}, + 'required_fields' => $require_form_fields_list + ) + ); } } diff --git a/install/controllers/console/process.php b/install/controllers/console/process.php index 14b149a4f..ce14e3ee5 100644 --- a/install/controllers/console/process.php +++ b/install/controllers/console/process.php @@ -244,6 +244,7 @@ public function processConfigureShop() 'admin_lastname' => $this->datas->admin_lastname, 'admin_password' => $this->datas->admin_password, 'admin_email' => $this->datas->admin_email, + 'marketing_consent' => $this->datas->marketing_consent, 'configuration_agrement' => true, 'send_informations' => true, )); diff --git a/install/controllers/http/configure.php b/install/controllers/http/configure.php index e4b95e34e..37a2bd6d0 100644 --- a/install/controllers/http/configure.php +++ b/install/controllers/http/configure.php @@ -49,6 +49,7 @@ public function processNextStep() $this->session->admin_lastname = trim(Tools::getValue('admin_lastname')); $this->session->admin_email = trim(Tools::getValue('admin_email')); $this->session->send_informations = Tools::getValue('send_informations'); + $this->session->marketing_consent = Tools::getValue('marketing_consent'); if ($this->session->send_informations) { // Qlo Notification $qloData = [ @@ -59,6 +60,7 @@ public function processNextStep() 'firstname' => Tools::ucfirst(Tools::getValue('admin_firstname')), 'lastname' => Tools::ucfirst(Tools::getValue('admin_lastname')), 'countryCode' => Tools::getValue('shop_country'), + 'marketingConsent' => Tools::getValue('marketing_consent'), ]; $objModelInstall = new InstallModelInstall(); $objModelInstall->setNotification($qloData); diff --git a/install/controllers/http/process.php b/install/controllers/http/process.php index e655ed656..55104f8b3 100644 --- a/install/controllers/http/process.php +++ b/install/controllers/http/process.php @@ -194,17 +194,18 @@ public function processConfigureShop() $this->initializeContext(); $success = $this->model_install->configureShop(array( - 'shop_name' => $this->session->shop_name, - 'shop_activity' => $this->session->shop_activity, - 'shop_country' => $this->session->shop_country, - 'shop_timezone' => $this->session->shop_timezone, - 'admin_firstname' => $this->session->admin_firstname, - 'admin_lastname' => $this->session->admin_lastname, - 'admin_password' => $this->session->admin_password, - 'admin_email' => $this->session->admin_email, - 'send_informations' => $this->session->send_informations, - 'configuration_agrement' => $this->session->configuration_agrement, - 'rewrite_engine' => $this->session->rewrite_engine, + 'shop_name' => $this->session->shop_name, + 'shop_activity' => $this->session->shop_activity, + 'shop_country' => $this->session->shop_country, + 'shop_timezone' => $this->session->shop_timezone, + 'admin_firstname' => $this->session->admin_firstname, + 'admin_lastname' => $this->session->admin_lastname, + 'admin_password' => $this->session->admin_password, + 'admin_email' => $this->session->admin_email, + 'marketing_consent' => $this->session->marketing_consent, + 'send_informations' => $this->session->send_informations, + 'configuration_agrement' => $this->session->configuration_agrement, + 'rewrite_engine' => $this->session->rewrite_engine, )); if (!$success || $this->model_install->getErrors()) { diff --git a/install/controllers/http/system.php b/install/controllers/http/system.php index e4a983836..0f63f4e92 100644 --- a/install/controllers/http/system.php +++ b/install/controllers/http/system.php @@ -160,4 +160,4 @@ public function display() $this->displayTemplate('system'); } -} \ No newline at end of file +} diff --git a/install/data/xml/quick_access.xml b/install/data/xml/quick_access.xml index 0543a29e2..d73081f87 100644 --- a/install/data/xml/quick_access.xml +++ b/install/data/xml/quick_access.xml @@ -5,9 +5,6 @@ - - index.php?controller=AdminCategories&addcategory - index.php?controller=AdminProducts&addproduct diff --git a/install/data/xml/tab.xml b/install/data/xml/tab.xml index ece6b8358..c23e31636 100644 --- a/install/data/xml/tab.xml +++ b/install/data/xml/tab.xml @@ -69,9 +69,9 @@ AdminProducts - + diff --git a/install/fixtures/fashion/data/connections.xml b/install/fixtures/fashion/data/connections.xml index 71f5b3b3f..658572b73 100644 --- a/install/fixtures/fashion/data/connections.xml +++ b/install/fixtures/fashion/data/connections.xml @@ -9,7 +9,7 @@ - + http://www.qloapps.com diff --git a/install/install_version.php b/install/install_version.php index e62af781f..3f0c148cf 100644 --- a/install/install_version.php +++ b/install/install_version.php @@ -25,4 +25,4 @@ */ define('_PS_INSTALL_VERSION_', '1.6.1.1'); -define('_QLO_INSTALL_VERSION_', '1.3.1'); \ No newline at end of file +define('_QLO_INSTALL_VERSION_', '1.3.2'); \ No newline at end of file diff --git a/install/langs/bg/data/quick_access.xml b/install/langs/bg/data/quick_access.xml index 72e5a5b9b..35bc0ba4a 100644 --- a/install/langs/bg/data/quick_access.xml +++ b/install/langs/bg/data/quick_access.xml @@ -2,7 +2,6 @@ - diff --git a/install/langs/en/data/quick_access.xml b/install/langs/en/data/quick_access.xml index 72e5a5b9b..35bc0ba4a 100644 --- a/install/langs/en/data/quick_access.xml +++ b/install/langs/en/data/quick_access.xml @@ -2,7 +2,6 @@ - diff --git a/install/langs/hr/data/quick_access.xml b/install/langs/hr/data/quick_access.xml index 72e5a5b9b..35bc0ba4a 100644 --- a/install/langs/hr/data/quick_access.xml +++ b/install/langs/hr/data/quick_access.xml @@ -2,7 +2,6 @@ - diff --git a/install/langs/hu/data/quick_access.xml b/install/langs/hu/data/quick_access.xml index 72e5a5b9b..35bc0ba4a 100644 --- a/install/langs/hu/data/quick_access.xml +++ b/install/langs/hu/data/quick_access.xml @@ -2,7 +2,6 @@ - diff --git a/install/langs/lt/data/quick_access.xml b/install/langs/lt/data/quick_access.xml index 72e5a5b9b..35bc0ba4a 100644 --- a/install/langs/lt/data/quick_access.xml +++ b/install/langs/lt/data/quick_access.xml @@ -2,7 +2,6 @@ - diff --git a/install/langs/mk/data/quick_access.xml b/install/langs/mk/data/quick_access.xml index 72e5a5b9b..35bc0ba4a 100644 --- a/install/langs/mk/data/quick_access.xml +++ b/install/langs/mk/data/quick_access.xml @@ -2,7 +2,6 @@ - diff --git a/install/langs/no/data/quick_access.xml b/install/langs/no/data/quick_access.xml index 72e5a5b9b..35bc0ba4a 100644 --- a/install/langs/no/data/quick_access.xml +++ b/install/langs/no/data/quick_access.xml @@ -2,7 +2,6 @@ - diff --git a/install/langs/si/data/quick_access.xml b/install/langs/si/data/quick_access.xml index 72e5a5b9b..35bc0ba4a 100644 --- a/install/langs/si/data/quick_access.xml +++ b/install/langs/si/data/quick_access.xml @@ -2,7 +2,6 @@ - diff --git a/install/langs/sr/data/quick_access.xml b/install/langs/sr/data/quick_access.xml index 72e5a5b9b..35bc0ba4a 100644 --- a/install/langs/sr/data/quick_access.xml +++ b/install/langs/sr/data/quick_access.xml @@ -2,7 +2,6 @@ - diff --git a/install/langs/sv/data/quick_access.xml b/install/langs/sv/data/quick_access.xml index 72e5a5b9b..35bc0ba4a 100644 --- a/install/langs/sv/data/quick_access.xml +++ b/install/langs/sv/data/quick_access.xml @@ -2,7 +2,6 @@ - diff --git a/install/langs/zh/data/quick_access.xml b/install/langs/zh/data/quick_access.xml index 72e5a5b9b..35bc0ba4a 100644 --- a/install/langs/zh/data/quick_access.xml +++ b/install/langs/zh/data/quick_access.xml @@ -2,7 +2,6 @@ - diff --git a/install/models/install.php b/install/models/install.php index 5e5ac546e..104c61b35 100644 --- a/install/models/install.php +++ b/install/models/install.php @@ -611,6 +611,7 @@ public function configureShop(array $data = array()) 'firstname' => Tools::ucfirst($data['admin_firstname']), 'lastname' => Tools::ucfirst($data['admin_lastname']), 'countryCode' => $data['shop_country'], + 'marketingConsent' => $data['marketing_consent'], ]; // Qlo Notification diff --git a/install/theme/views/configure.phtml b/install/theme/views/configure.phtml index 4af733cbc..e11c71847 100644 --- a/install/theme/views/configure.phtml +++ b/install/theme/views/configure.phtml @@ -155,10 +155,14 @@ var default_iso = 'session->shop_country ?>';
displayError('admin_password_confirm') ?> -
- l('The information you give us is collected by us and is subject to data processing and statistics. Under the current "Act on Data Processing, Data Files and Individual Liberties" you have the right to access, rectify and oppose to the processing of your personal data through this link.'), 'mailto:support@qloapps.com'); ?> +
+ l('The information you give us is collected by us and is subject to data processing and statistics. Under the current "Act on Data Processing, Data Files and Individual Liberties" you have the right to access, rectify and oppose to the processing of your personal data through this link.'), 'mailto:support@qloapps.com'); ?> +
+
+ session->marketing_consent): ?>checked="checked" /> +
+
- diff --git a/modules/hotelreservationsystem/CHANGELOG.txt b/modules/hotelreservationsystem/CHANGELOG.txt index 4a2ba027a..76006d911 100644 --- a/modules/hotelreservationsystem/CHANGELOG.txt +++ b/modules/hotelreservationsystem/CHANGELOG.txt @@ -1,3 +1,33 @@ +------------------------- +# V1.2.1 to V1.2.2 +------------------------- + +## Improved/changed features: + +[+] CO : Demo data insertion improved. +[+] CO : getHotelCartBookingData() improved as used many places in QloApps. + +[+] CO : Call to HotelImage::validateImage() is deprecated. +[+] CO : Call to Hotelhelper::validImageExt() is deprecated. + + +[+] BO : Unused category deletion process added on hotel deletion. function deleteUnusedHotelCategories() added. +[+] BO : Hotel creation code improved. +[+] BO : Images validation improved. +[+] BO : Zipcode validation is improved as per selected country. + + +## Bug/Issues Resolved: + +[-] CO : Zipcode in demo data is now dynamic for selected country while QloApps installation. + + + +## Update Policy + +- Mobule need only file update, can be updated only by UPLOADING new version on module + + ------------------------- # V1.2.0 to V1.2.1 ------------------------- diff --git a/modules/hotelreservationsystem/classes/HotelBookingDetail.php b/modules/hotelreservationsystem/classes/HotelBookingDetail.php index dd78c1a05..8e2adcc74 100644 --- a/modules/hotelreservationsystem/classes/HotelBookingDetail.php +++ b/modules/hotelreservationsystem/classes/HotelBookingDetail.php @@ -1530,4 +1530,4 @@ public function getRowByIdOrderIdProductInDateRange($id_order, $id_product, $dat { return Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'htl_booking_detail` WHERE `id_order`='.(int) $id_order.' AND `id_product`='.(int) $id_product.' AND `date_from`=\''.$date_from.'\' AND `date_to`= \''.$date_to.'\''); } -} \ No newline at end of file +} diff --git a/modules/hotelreservationsystem/classes/HotelBranchInformation.php b/modules/hotelreservationsystem/classes/HotelBranchInformation.php index cbf15fe84..8f0d19a97 100644 --- a/modules/hotelreservationsystem/classes/HotelBranchInformation.php +++ b/modules/hotelreservationsystem/classes/HotelBranchInformation.php @@ -316,6 +316,7 @@ public function update($null_values = false) { $objHotelInfo = new HotelBranchInformation($this->id); $oldStatus = $objHotelInfo->active; + if ($return = parent::update()) { if ($oldStatus && !$this->active) { $objHotelRoomType = new HotelRoomType(); @@ -341,11 +342,73 @@ public function update($null_values = false) return $return; } + public function addCategory($name, $parent_cat = false, $group_ids, $ishotel = false, $idHotel = false) + { + $context = Context::getContext(); + if (!$parent_cat) { + $parent_cat = Category::getRootCategory()->id; + } + if ($ishotel && $idHotel) { + if ($catIdHotel = Db::getInstance()->getValue( + 'SELECT `id_category` FROM `'._DB_PREFIX_.'htl_branch_info` WHERE id = '.(int)$idHotel + )) { + $category = new Category($catIdHotel); + foreach (Language::getLanguages(true) as $lang) { + if (is_array($name) && isset($name[$lang['id_lang']])) { + $catName = $name[$lang['id_lang']]; + } else { + $catName = $name; + } + $category->name[$lang['id_lang']] = $catName; + $category->description[$lang['id_lang']] = $this->moduleInstance->l( + 'Hotel Branch Category', + 'HotelBranchInformation' + ); + $category->link_rewrite[$lang['id_lang']] = Tools::link_rewrite($catName); + } + $category->id_parent = $parent_cat; + $category->groupBox = $group_ids; + $category->save(); + return $category->id; + } + } + if (is_array($name) && isset($name[Configuration::get('PS_LANG_DEFAULT')])) { + $catName = $name[Configuration::get('PS_LANG_DEFAULT')]; + } else { + $catName = $name; + } + if ($categoryExists = Category::searchByNameAndParentCategoryId( + Configuration::get('PS_LANG_DEFAULT'), + $catName, + $parent_cat + )) { + return $categoryExists['id_category']; + } else { + $category = new Category(); + foreach (Language::getLanguages(true) as $lang) { + if (is_array($name) && isset($name[$lang['id_lang']])) { + $catName = $name[$lang['id_lang']]; + } else { + $catName = $name; + } + $category->name[$lang['id_lang']] = $catName; + $category->description[$lang['id_lang']] = $this->moduleInstance->l( + 'Hotel Branch Category', 'HotelBranchInformation' + ); + $category->link_rewrite[$lang['id_lang']] = Tools::link_rewrite($catName); + } + $category->id_parent = $parent_cat; + $category->groupBox = $group_ids; + $category->add(); + return $category->id; + } + } + //Overrided ObjectModet::delete() to delete all the dependencies of the hotel public function delete() { + $contextController = Context::getContext()->controller; if ($idHotel = $this->id) { - $contextController = Context::getContext()->controller; // room types of this hotel $objHotelRoomType = new HotelRoomType(); $idsProduct = $objHotelRoomType->getIdProductByHotelId($idHotel); @@ -383,6 +446,13 @@ public function delete() 'HotelBranchInformation' ); } + // delete hotel unused categories of this hotel + if (!$this->deleteUnusedHotelCategories($idHotel)) { + $contextController->errors[] = $this->moduleInstance->l( + 'Some error has occurred while deleting unused hotel categories.', + 'HotelBranchInformation' + ); + } } if (!count($contextController->errors)) { if ($result = parent::delete()) { @@ -393,69 +463,60 @@ public function delete() } } - public function addCategory($name, $parent_cat = false, $group_ids, $ishotel = false, $idHotel = false) + /** + * returns all the categories used by all the hotels + * @param array $excludeIdHotels [array of the hotels which categories you dont want] + * @return [array] returns array of all the categories used by all the hotels + */ + public function getAllHotelCategories($excludeIdHotels = array()) { - $context = Context::getContext(); - if (!$parent_cat) { - $parent_cat = Category::getRootCategory()->id; + $hotelrelatedCategs = array(); + $sql = 'SELECT `id_category` FROM `'._DB_PREFIX_.'htl_branch_info`'; + if ($excludeIdHotels && count($excludeIdHotels)) { + $sql .= ' WHERE `id` NOT IN ('.implode(',', $excludeIdHotels).')'; } - if ($ishotel && $idHotel) { - $catIdHotel = Db::getInstance()->getValue( - 'SELECT `id_category` FROM `'._DB_PREFIX_.'htl_branch_info` WHERE id='.$idHotel - ); - if ($catIdHotel) { - $category = new Category($catIdHotel); - foreach (Language::getLanguages(true) as $lang) { - if (is_array($name) && isset($name[$lang['id_lang']])) { - $catName = $name[$lang['id_lang']]; - } else { - $catName = $name; + // get all the hotel name categories + if ($hotelCategs = Db::getInstance()->executeS($sql)) { + foreach ($hotelCategs as $rowCateg) { + if (Validate::isLoadedObject($objCategory = new Category($rowCateg['id_category']))) { + if ($parentCategs = $objCategory->getParentsCategories(Configuration::get('PS_LANG_DEFAULT'))) { + foreach ($parentCategs as $categInfo) { + // enter only unique categories in the array + if (!in_array($categInfo['id_category'], $hotelrelatedCategs)) { + $hotelrelatedCategs[] = $categInfo['id_category']; + } + } } - $category->name[$lang['id_lang']] = $catName; - $category->description[$lang['id_lang']] = $this->moduleInstance->l( - 'Hotel Branch Category', - 'HotelBranchInformation' - ); - $category->link_rewrite[$lang['id_lang']] = Tools::link_rewrite($catName); } - $category->id_parent = $parent_cat; - $category->groupBox = $group_ids; - $category->save(); - $cat_id = $category->id; - return $cat_id; } } - if (is_array($name) && isset($name[$context->language->id])) { - $catName = $name[$context->language->id]; - } else { - $catName = $name; - } - if ($categoryExists = Category::searchByNameAndParentCategoryId( - $context->language->id, - $catName, - $parent_cat - )) { - return $categoryExists['id_category']; - } else { - $category = new Category(); - foreach (Language::getLanguages(true) as $lang) { - if (is_array($name) && isset($name[$lang['id_lang']])) { - $catName = $name[$lang['id_lang']]; - } else { - $catName = $name; + return $hotelrelatedCategs; + } + + /** + * Deletes all the unused categories created by hotel creation of a hotel + * @param [int] $idHotel which categories you want to delete + * @return true if all the categories will be deleted + */ + public function deleteUnusedHotelCategories($idHotel) + { + if (Validate::isLoadedObject($objHotel = new HotelBranchInformation($idHotel))) { + $idCategory = $objHotel->id_category; + if (Validate::isLoadedObject($objCategory = new Category($idCategory))) { + $hotelCategories = $this->getAllHotelCategories(array($idHotel)); + // check if category is not root or home category and not used by other hotels + while ($idCategory + && !in_array($idCategory, $hotelCategories) + && $idCategory != Configuration::get('PS_HOME_CATEGORY') + ) { + if ($objCategory->delete()) { + // continue deleting the unused parent hotel categories + $idCategory = $objCategory->id_parent; + $objCategory = new Category($idCategory); + } } - $category->name[$lang['id_lang']] = $catName; - $category->description[$lang['id_lang']] = $this->moduleInstance->l( - 'Hotel Branch Category', 'HotelBranchInformation' - ); - $category->link_rewrite[$lang['id_lang']] = Tools::link_rewrite($catName); } - $category->id_parent = $parent_cat; - $category->groupBox = $group_ids; - $category->add(); - $cat_id = $category->id; - - return $cat_id; } + return true; } } diff --git a/modules/hotelreservationsystem/classes/HotelCartBookingData.php b/modules/hotelreservationsystem/classes/HotelCartBookingData.php index 972e25475..32cb1823c 100644 --- a/modules/hotelreservationsystem/classes/HotelCartBookingData.php +++ b/modules/hotelreservationsystem/classes/HotelCartBookingData.php @@ -632,110 +632,171 @@ public function getProductFeaturePricePlanByDateByPriority($id_product, $date) */ public static function getHotelCartBookingData() { + $cartHotelData = array(); $context = Context::getContext(); - $total_rooms = 0; - $cart_htl_data = array(); - $price_tax = HotelBookingDetail::useTax(); - - if (Module::isInstalled('hotelreservationsystem')) { - require_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php'; - $objHtlBranchInfo = new HotelBranchInformation(); - $obj_cart_bk_data = new self(); - $obj_htl_bk_dtl = new HotelBookingDetail(); - $obj_rm_type = new HotelRoomType(); - - $htl_rm_types = $context->cart->getProducts(); - if (!empty($htl_rm_types)) { - foreach ($htl_rm_types as $type_key => $type_value) { - $product = new Product($type_value['id_product'], false, $context->language->id); - $cover_image_arr = $product->getCover($type_value['id_product']); - - if (!empty($cover_image_arr)) { - $cover_img = $context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default'); + if ($cartRoomTypes = $context->cart->getProducts()) { + $idLang = $context->language->id; + $price_tax = HotelBookingDetail::useTax(); + // create needed objects + $objCartBooking = new self(); + $objBookingDetail = new HotelBookingDetail(); + $objRoomType = new HotelRoomType(); + $objHotelBranch = new HotelBranchInformation(); + $objHtlFeatures = new HotelFeatures(); + + foreach ($cartRoomTypes as $prodKey => $product) { + if (Validate::isLoadedObject( + $objProduct = new Product($product['id_product'], false, $idLang) + )) { + $coverImageArr = $objProduct->getCover($product['id_product']); + // get cover image link + if (!empty($coverImageArr)) { + $coverImg = $context->link->getImageLink( + $objProduct->link_rewrite, + $objProduct->id.'-'.$coverImageArr['id_image'], + 'small_default' + ); } else { - $cover_img = $context->link->getImageLink($product->link_rewrite, $context->language->iso_code.'-default', 'small_default'); + $coverImg = $context->link->getImageLink( + $objProduct->link_rewrite, + $context->language->iso_code.'-default', + 'small_default' + ); } + $unitPrice = Product::getPriceStatic( + $product['id_product'], + $price_tax, + null, + 6, + null, + false, + true, + 1 + ); + $unitPriceWithoutReduction = $objProduct->getPriceWithoutReduct(!$price_tax); + $roomDetail = $objRoomType->getRoomTypeInfoByIdProduct($product['id_product']); + $cartHotelData[$prodKey]['adult'] = $roomDetail['adult']; + $cartHotelData[$prodKey]['children'] = $roomDetail['children']; + $cartHotelData[$prodKey]['total_num_rooms'] = 0; + $cartHotelData[$prodKey]['id_product'] = $product['id_product']; + $cartHotelData[$prodKey]['cover_img'] = $coverImg; + $cartHotelData[$prodKey]['name'] = $objProduct->name; + $cartHotelData[$prodKey]['unit_price'] = $unitPrice; + $cartHotelData[$prodKey]['unit_price_without_reduction'] = $unitPriceWithoutReduction; + // add hotel info of the room + if ($hotelInfo = $objHotelBranch->hotelBranchesInfo(false, 2, 1, $roomDetail['id_hotel'])) { + $hotelInfo['location'] = $hotelInfo['hotel_name'].', '.$hotelInfo['city'].', '. + State::getNameById($hotelInfo['state_id']).', '. + Country::getNameById($idLang, $hotelInfo['country_id']) + .', '.$hotelInfo['zipcode']; + + // append hotel features + if ($hotelFeaureIds = $objHotelBranch->getFeaturesOfHotelByHotelId($roomDetail['id_hotel'])) { + $hotelFeatures = array(); + foreach ($hotelFeaureIds as $value) { + $htlFeatureInfo = $objHtlFeatures->getFeatureInfoById($value['feature_id']); + if ($htlFeatureInfo = $objHtlFeatures->getFeatureInfoById($value['feature_id'])) { + $hotelFeatures[] = $htlFeatureInfo['name']; + } + } + if ($hotelFeatures) { + $hotelInfo['htl_features'] = $hotelFeatures; + } + } + // append roomtype features + $hotelInfo['room_features'] = $objProduct->getFrontFeatures($idLang); - $unit_price = Product::getPriceStatic($type_value['id_product'], $price_tax, null, 6, null, false, true, 1); - $unitPriceWithoutReduction = $product->getPriceWithoutReduct(!$price_tax); + $cartHotelData[$prodKey]['hotel_info'] = $hotelInfo; + } if (isset($context->customer->id)) { - $cart_bk_data = $obj_cart_bk_data->getOnlyCartBookingData($context->cart->id, $context->cart->id_guest, $type_value['id_product']); + $cartBookingDetails = $objCartBooking->getOnlyCartBookingData( + $context->cart->id, + $context->cart->id_guest, + $product['id_product'] + ); } else { - $cart_bk_data = $obj_cart_bk_data->getOnlyCartBookingData($context->cart->id, $context->cart->id_guest, $type_value['id_product']); + $cartBookingDetails = $objCartBooking->getOnlyCartBookingData( + $context->cart->id, + $context->cart->id_guest, + $product['id_product'] + ); } - $rm_dtl = $obj_rm_type->getRoomTypeInfoByIdProduct($type_value['id_product']); - $cart_htl_data[$type_key]['total_num_rooms'] = 0; - $cart_htl_data[$type_key]['id_product'] = $type_value['id_product']; - $cart_htl_data[$type_key]['cover_img'] = $cover_img; - $cart_htl_data[$type_key]['name'] = $product->name; - $cart_htl_data[$type_key]['unit_price'] = $unit_price; - $cart_htl_data[$type_key]['unit_price_without_reduction'] = $unitPriceWithoutReduction; - $cart_htl_data[$type_key]['adult'] = $rm_dtl['adult']; - $cart_htl_data[$type_key]['children'] = $rm_dtl['children']; - if (isset($cart_bk_data) && $cart_bk_data) { - foreach ($cart_bk_data as $data_k => $data_v) { - $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); - if (isset($cart_htl_data[$type_key]['date_diff'][$date_join])) { - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] += 1; - $total_rooms += 1; - $num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days']; - $vart_quant = (int) $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm']; - //// By webkul New way to calculate product prices with feature Prices - $roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($type_value['id_product'], $data_v['date_from'], $data_v['date_to']); + if (isset($cartBookingDetails) && $cartBookingDetails) { + foreach ($cartBookingDetails as $data_k => $data_v) { + $dateJoin = strtotime($data_v['date_from']).strtotime($data_v['date_to']); + if (isset($cartHotelData[$prodKey]['date_diff'][$dateJoin])) { + $cartHotelData[$prodKey]['date_diff'][$dateJoin]['num_rm'] += 1; + $numDays = $cartHotelData[$prodKey]['date_diff'][$dateJoin]['num_days']; + $varQty = (int) $cartHotelData[$prodKey]['date_diff'][$dateJoin]['num_rm']; + $roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice( + $product['id_product'], + $data_v['date_from'], + $data_v['date_to'] + ); if (!$price_tax) { $amount = $roomTypeDateRangePrice['total_price_tax_excl']; } else { $amount = $roomTypeDateRangePrice['total_price_tax_incl']; } - //END - - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $amount * $vart_quant; + $cartHotelData[$prodKey]['date_diff'][$dateJoin]['amount'] = $amount * $varQty; } else { - $num_days = $obj_htl_bk_dtl->getNumberOfDays($data_v['date_from'], $data_v['date_to']); - $total_rooms += 1; - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] = 1; - $cart_htl_data[$type_key]['date_diff'][$date_join]['data_form'] = date('Y-m-d', strtotime($data_v['date_from'])); - $cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = date('Y-m-d', strtotime($data_v['date_to'])); - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; - - // By webkul New way to calculate product prices with feature Prices - $roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($type_value['id_product'], $data_v['date_from'], $data_v['date_to']); + $numDays = $objBookingDetail->getNumberOfDays($data_v['date_from'], $data_v['date_to']); + $cartHotelData[$prodKey]['date_diff'][$dateJoin]['num_rm'] = 1; + $cartHotelData[$prodKey]['date_diff'][$dateJoin]['data_form'] = date( + 'Y-m-d', + strtotime($data_v['date_from']) + ); + $cartHotelData[$prodKey]['date_diff'][$dateJoin]['data_to'] = date( + 'Y-m-d', + strtotime($data_v['date_to']) + ); + $cartHotelData[$prodKey]['date_diff'][$dateJoin]['num_days'] = $numDays; + $roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice( + $product['id_product'], + $data_v['date_from'], + $data_v['date_to'] + ); if (!$price_tax) { $amount = $roomTypeDateRangePrice['total_price_tax_excl']; } else { $amount = $roomTypeDateRangePrice['total_price_tax_incl']; } - // END - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $amount; - $cart_htl_data[$type_key]['date_diff'][$date_join]['link'] = $context->link->getPageLink('order-opc', null, $context->language->id, "id_product=".$type_value['id_product']."&deleteFromOrderLine=1&date_from=".$data_v['date_from']."&date_to=".$data_v['date_to']); + $cartHotelData[$prodKey]['date_diff'][$dateJoin]['amount'] = $amount; + $cartHotelData[$prodKey]['date_diff'][$dateJoin]['link'] = $context->link->getPageLink( + 'order-opc', + null, + $idLang, + "id_product=".$product['id_product']."&deleteFromOrderLine=1&date_from=". + $data_v['date_from']."&date_to=".$data_v['date_to'] + ); } - // product price after imposing feature prices... if ($price_tax) { - $feature_price = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay($type_value['id_product'], $data_v['date_from'], $data_v['date_to'], true); + $feature_price = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay( + $product['id_product'], + $data_v['date_from'], + $data_v['date_to'], + true + ); } else { - $feature_price = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay($type_value['id_product'], $data_v['date_from'], $data_v['date_to'], false); + $feature_price = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay( + $product['id_product'], + $data_v['date_from'], + $data_v['date_to'], + false + ); } $feature_price_diff = (float)($unitPriceWithoutReduction - $feature_price); - $cart_htl_data[$type_key]['date_diff'][$date_join]['feature_price'] = $feature_price; - $cart_htl_data[$type_key]['date_diff'][$date_join]['feature_price_diff'] = $feature_price_diff; - - //enter hotel name - $hotelInfo = $objHtlBranchInfo->hotelBranchesInfo( - $context->language->id, - 2, - 0, - $data_v['id_hotel'] - ); - $cart_htl_data[$type_key]['hotel_name'] = $hotelInfo['hotel_name']; + $cartHotelData[$prodKey]['date_diff'][$dateJoin]['feature_price'] = $feature_price; + $cartHotelData[$prodKey]['date_diff'][$dateJoin]['feature_price_diff'] = $feature_price_diff; } - foreach ($cart_htl_data[$type_key]['date_diff'] as $key => $value) { - $cart_htl_data[$type_key]['total_num_rooms'] += $value['num_rm']; + foreach ($cartHotelData[$prodKey]['date_diff'] as $key => $value) { + $cartHotelData[$prodKey]['total_num_rooms'] += $value['num_rm']; } } } } } - return $cart_htl_data; + return $cartHotelData; } public function getHotelCartDistinctDateRangesByRoomType($id_cart, $id_product) @@ -805,4 +866,4 @@ public static function getHotelCartInfoIdOrderIdProduct($id_cart, $id_product) { return Db::getInstance()->executeS("SELECT * FROM `"._DB_PREFIX_."htl_cart_booking_data` WHERE `id_cart`=".(int) $id_cart." AND `id_product`=".(int) $id_product); } -} \ No newline at end of file +} diff --git a/modules/hotelreservationsystem/classes/HotelHelper.php b/modules/hotelreservationsystem/classes/HotelHelper.php index b13065810..f47540ced 100644 --- a/modules/hotelreservationsystem/classes/HotelHelper.php +++ b/modules/hotelreservationsystem/classes/HotelHelper.php @@ -415,7 +415,7 @@ public function saveDummyHotelBranchInfo() } $obj_hotel_info->state_id = $state_id; $obj_hotel_info->country_id = $def_cont_id; - $obj_hotel_info->zipcode = '263001'; + $obj_hotel_info->zipcode = self::getRandomZipcodeByForCountry($def_cont_id); $obj_hotel_info->address = 'Monticello Dr, Montgomery, AL 36117, USA'; $obj_hotel_info->save(); @@ -502,7 +502,18 @@ public function saveDummyProductsAndRelatedInfo($id_hotel) Search::indexation(Tools::link_rewrite($value_prod), $product_id); - $product->addToCategories(2); + // assign all the categories of hotel and its parent to the product + if (Validate::isLoadedObject($objHotel = new HotelBranchInformation($id_hotel))) { + if (Validate::isLoadedObject($objCategory = new Category($objHotel->id_category))) { + if ($hotelCategories = $objCategory->getParentsCategories()) { + $categoryIds = array(); + foreach ($hotelCategories as $rowCateg) { + $categoryIds[] = $rowCateg['id_category']; + } + $product->addToCategories($categoryIds); + } + } + } StockAvailable::updateQuantity($product_id, null, 999999999); @@ -514,7 +525,11 @@ public function saveDummyProductsAndRelatedInfo($id_hotel) if (is_dir($image_dir_path)) { if ($opendir = opendir($image_dir_path)) { while (($image = readdir($opendir)) !== false) { - if ($this->validImageExt($image)) { + $old_path = $image_dir_path.$image; + + if (ImageManager::isRealImage($old_path) + && ImageManager::isCorrectImageFileExt($old_path) + ) { $image_obj = new Image(); $image_obj->id_product = $product_id; $image_obj->position = Image::getHighestPosition($product_id) + 1; @@ -529,7 +544,6 @@ public function saveDummyProductsAndRelatedInfo($id_hotel) $image_obj->cover = 0; } $image_obj->add(); - $old_path = $image_dir_path.$image; $new_path = $image_obj->getPathForCreation(); foreach ($imagesTypes as $image_type) { ImageManager::resize( @@ -771,4 +785,21 @@ public static function updateLangTables($idNewLang, $langTables) } return true; } + + public static function getRandomZipcodeByForCountry($idCountry) + { + $randZipCode = ''; + $alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + if (Validate::isLoadedObject($objCountry = new Country($idCountry))) { + if ($objCountry->need_zip_code) { + if ($randZipCode = $objCountry->zip_code_format) { + $randZipCode = str_replace('N', mt_rand(0, 9), $randZipCode); + $randZipCode = str_replace('L', $alphabet[mt_rand(0, Tools::strlen($alphabet) - 1)], $randZipCode); + $randZipCode = str_replace('C', $objCountry->iso_code, $randZipCode); + } + } + } + return $randZipCode; + } + } diff --git a/modules/hotelreservationsystem/classes/HotelImage.php b/modules/hotelreservationsystem/classes/HotelImage.php index a6e58827d..a67a3cb9f 100644 --- a/modules/hotelreservationsystem/classes/HotelImage.php +++ b/modules/hotelreservationsystem/classes/HotelImage.php @@ -56,6 +56,13 @@ public function deleteByHotelId($htl_id) return $delete; } + public static function getCover($idHotel) + { + return Db::getInstance()->getRow( + 'SELECT * FROM `'._DB_PREFIX_.'htl_image` WHERE `id_hotel` = '.(int)$idHotel.' AND `cover`=1' + ); + } + /** * [validAddHotelMainImage :: To validate the image of the hotel before saving it] * @param [array] $image [variable having image information of the hotel] @@ -74,13 +81,6 @@ public static function validateImage($image) } } - public static function getCover($idHotel) - { - return Db::getInstance()->getRow( - 'SELECT * FROM `'._DB_PREFIX_.'htl_image` WHERE `id_hotel` = '.(int)$idHotel.' AND `cover`=1' - ); - } - public function uploadHotelImages($images, $idHotel, $destPath) { if (isset($images) && $idHotel && $destPath) { diff --git a/modules/hotelreservationsystem/controllers/admin/AdminAddHotelController.php b/modules/hotelreservationsystem/controllers/admin/AdminAddHotelController.php index e72a96f84..2a916058d 100644 --- a/modules/hotelreservationsystem/controllers/admin/AdminAddHotelController.php +++ b/modules/hotelreservationsystem/controllers/admin/AdminAddHotelController.php @@ -255,12 +255,6 @@ public function processSave() $this->errors[] = $this->l('Check Out Time is required field.'); } - if ($zipcode == '') { - $this->errors[] = $this->l('Postal Code is required field.'); - } elseif (!Validate::isPostCode($zipcode)) { - $this->errors[] = $this->l('Enter a Valid Postal Code.'); - } - if (!$rating) { $this->errors[] = $this->l('Rating is required field.'); } @@ -280,6 +274,15 @@ public function processSave() $this->errors[] = $this->l('State is required field.'); } } + /* Check zip code format */ + $objCountry = new Country($country); + if ($objCountry->zip_code_format && !$objCountry->checkZipCode($zipcode)) { + $this->errors[] = sprintf($this->l('The Zip/Postal code you\'ve entered is invalid. It must follow this format: %s'), str_replace('C', $objCountry->iso_code, str_replace('N', '0', str_replace('L', 'A', $objCountry->zip_code_format)))); + } elseif (empty($zipcode) && $objCountry->need_zip_code) { + $this->errors[] = $this->l('A Zip / Postal code is required.'); + } elseif ($zipcode && !Validate::isPostCode($zipcode)) { + $this->errors[] = $this->l('The Zip / Postal code is invalid.'); + } } if ($city == '') { @@ -381,6 +384,9 @@ public function processSave() $objHotelBranch->map_input_text = $map_input_text; $objHotelBranch->save(); + // hotel categories before save categories + $categsBeforeUpd = $objHotelBranch->getAllHotelCategories(); + if ($newIdHotel = $objHotelBranch->id) { $groupIds = array(); if ($dataGroupIds = Group::getGroups($this->context->language->id)) { @@ -389,10 +395,11 @@ public function processSave() } } $objCountry = new Country(); - $countryName = $objCountry->getNameById($this->context->language->id, $country); + $countryName = $objCountry->getNameById(Configuration::get('PS_LANG_DEFAULT'), $country); if ($catCountry = $objHotelBranch->addCategory($countryName, false, $groupIds)) { if ($state) { - $stateName = (new State())->getNameById($state); + $objState = new State(); + $stateName = $objState->getNameById($state); $catState = $objHotelBranch->addCategory($stateName, $catCountry, $groupIds); } else { $catState = $objHotelBranch->addCategory($city, $catCountry, $groupIds); @@ -411,6 +418,23 @@ public function processSave() } } } + // hotel categories after save categories + $categsAfterUpd = $objHotelBranch->getAllHotelCategories(); + + // delete categories which not in hotel categories and also unused + if ($unusedCategs = array_diff($categsBeforeUpd, $categsAfterUpd)) { + if ($hotelCategories = $objHotelBranch->getAllHotelCategories()) { + foreach ($unusedCategs as $idCategory) { + if (!in_array($idCategory, $hotelCategories) + && $idCategory != Configuration::get('PS_HOME_CATEGORY') + ) { + $objCategory = new Category($idCategory); + $objCategory->delete(); + } + } + } + } + if (Tools::isSubmit('submitAdd'.$this->table.'AndStay')) { if ($idHotel) { Tools::redirectAdmin( @@ -465,7 +489,7 @@ public function ajaxProcessUploadHotelImages() if ($idHotel) { $invalidImg = ImageManager::validateUpload( $_FILES['hotel_image'], - Tools::getMaxUploadSize(Configuration::get('PS_LIMIT_UPLOAD_IMAGE_VALUE') * 1048576) + Tools::getMaxUploadSize() ); if (!$invalidImg) { // Add Hotel images diff --git a/modules/hotelreservationsystem/controllers/admin/AdminHotelConfigurationSettingController.php b/modules/hotelreservationsystem/controllers/admin/AdminHotelConfigurationSettingController.php index e86ad798f..a5bc7dee9 100644 --- a/modules/hotelreservationsystem/controllers/admin/AdminHotelConfigurationSettingController.php +++ b/modules/hotelreservationsystem/controllers/admin/AdminHotelConfigurationSettingController.php @@ -10,6 +10,7 @@ public function __construct() if (!($obj = $this->loadObject(true))) { return; } + $this->toolbar_title = $this->l('Manage Hotel Settings'); parent::__construct(); } diff --git a/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php b/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php index d299c8154..79d753a8e 100644 --- a/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php +++ b/modules/hotelreservationsystem/controllers/admin/AdminHotelGeneralSettingsController.php @@ -279,7 +279,9 @@ public function postProcess() $objDefaultLanguage['name']; } if ($_FILES['htl_header_image']['name']) { - $this->validateHotelHeaderImage($_FILES['htl_header_image']); + if ($error = ImageManager::validateUpload($_FILES['htl_header_image'], Tools::getMaxUploadSize())) { + $this->errors[] = $error; + } if (!count($this->errors)) { $img_path = _PS_IMG_DIR_.'hotel_header_image.jpg'; @@ -349,20 +351,6 @@ public function postProcess() } } - public function validateHotelHeaderImage($image) - { - if ($image['size'] > 0) { - if ($image['tmp_name'] != '') { - if (!ImageManager::isCorrectImageFileExt($image['name'])) { - $this->errors[] = ''.$_FILES['htl_header_image']['name'].' : '. - $this->l('Image format not recognized, allowed formats are: .gif, .jpg, .png'); - } - } - } else { - return true; - } - } - public function setMedia() { parent::setMedia(); diff --git a/modules/hotelreservationsystem/controllers/admin/AdminHotelfeaturesController.php b/modules/hotelreservationsystem/controllers/admin/AdminHotelfeaturesController.php index c2dff4a19..215a777a5 100644 --- a/modules/hotelreservationsystem/controllers/admin/AdminHotelfeaturesController.php +++ b/modules/hotelreservationsystem/controllers/admin/AdminHotelfeaturesController.php @@ -26,6 +26,8 @@ public function __construct() $this->table = 'htl_features'; $this->className = 'HotelFeatures'; $this->identifier = 'id'; + $this->toolbar_title = $this->l('Manage Hotel Features'); + parent::__construct(); $this->display = 'view'; } diff --git a/modules/hotelreservationsystem/hotelreservationsystem.php b/modules/hotelreservationsystem/hotelreservationsystem.php index 3dad9ea67..75cdb5c9d 100644 --- a/modules/hotelreservationsystem/hotelreservationsystem.php +++ b/modules/hotelreservationsystem/hotelreservationsystem.php @@ -29,7 +29,7 @@ class hotelreservationsystem extends Module public function __construct() { $this->name = 'hotelreservationsystem'; - $this->version = '1.2.1'; + $this->version = '1.2.2'; $this->author = 'Webkul'; $this->need_instance = 0; $this->bootstrap = true; diff --git a/modules/hotelreservationsystem/views/css/HotelReservationAdmin.css b/modules/hotelreservationsystem/views/css/HotelReservationAdmin.css index bdd45faa5..60b59372e 100644 --- a/modules/hotelreservationsystem/views/css/HotelReservationAdmin.css +++ b/modules/hotelreservationsystem/views/css/HotelReservationAdmin.css @@ -567,4 +567,7 @@ a.deleteHtlImage { .room_type_search_results_ul li:hover, .room_type_search_results_ul li:focus, .room_type_search_results_ul li:active { background-color: #379bf0; color: #FFFFFF; +} +.setting-title { + text-align: left; } \ No newline at end of file diff --git a/modules/hotelreservationsystem/views/templates/admin/hotel_configuration_setting/helpers/view/view.tpl b/modules/hotelreservationsystem/views/templates/admin/hotel_configuration_setting/helpers/view/view.tpl index 02f74bc3f..59ad054c0 100644 --- a/modules/hotelreservationsystem/views/templates/admin/hotel_configuration_setting/helpers/view/view.tpl +++ b/modules/hotelreservationsystem/views/templates/admin/hotel_configuration_setting/helpers/view/view.tpl @@ -1,62 +1,62 @@

   {l s='Hotel Configuration' mod='hotelreservationsystem'}

diff --git a/modules/paypal/Readme.md b/modules/paypal/Readme.md new file mode 100644 index 000000000..e8d45072c --- /dev/null +++ b/modules/paypal/Readme.md @@ -0,0 +1,36 @@ +# PayPal + +## About + +Let customer pay with PayPal Express Checkout or PayPal Integral Evolution. + +## Contributing + +PrestaShop modules are open-source extensions to the PrestaShop e-commerce solution. Everyone is welcome and even encouraged to contribute with their own improvements. + +### Requirements + +Contributors **must** follow the following rules: + +* **Make your Pull Request on the "dev" branch**, NOT the "master" branch. +* Do not update the module's version number. +* Follow [the coding standards][1]. + +### Process in details + +Contributors wishing to edit a module's files should follow the following process: + +1. Create your GitHub account, if you do not have one already. +2. Fork the bankwire project to your GitHub account. +3. Clone your fork to your local machine in the ```/modules``` directory of your PrestaShop installation. +4. Create a branch in your local clone of the module for your changes. +5. Change the files in your branch. Be sure to follow [the coding standards][1]! +6. Push your changed branch to your fork in your GitHub account. +7. Create a pull request for your changes **on the _'dev'_ branch** of the module's project. Be sure to follow [the commit message norm][2] in your pull request. If you need help to make a pull request, read the [Github help page about creating pull requests][3]. +8. Wait for one of the core developers either to include your change in the codebase, or to comment on possible improvements you should make to your code. + +That's it: you have contributed to this open-source project! Congratulations! + +[1]: http://doc.prestashop.com/display/PS16/Coding+Standards +[2]: http://doc.prestashop.com/display/PS16/How+to+write+a+commit+message +[3]: https://help.github.com/articles/using-pull-requests diff --git a/modules/paypal/about.php b/modules/paypal/about.php new file mode 100644 index 000000000..1358355e0 --- /dev/null +++ b/modules/paypal/about.php @@ -0,0 +1,44 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +require_once dirname(__FILE__).'/../../config/config.inc.php'; +require_once dirname(__FILE__).'/../../init.php'; + +include_once dirname(__FILE__).'/paypal.php'; +include_once dirname(__FILE__).'/backward_compatibility/backward.php'; + +$paypal = new PayPal(); + +$context = Context::getContext(); + +$id_lang = (int) ($context->cookie->id_lang ? $context->cookie->id_lang : Configuration::get('PS_LANG_DEFAULT')); +$iso_lang = Tools::strtolower(Language::getIsoById($id_lang)); + +$paypal->context->smarty->assign('iso_code', $iso_lang); + +$display = new BWDisplay(); +$display->setTemplate(_PS_MODULE_DIR_.'paypal/views/templates/front/about.tpl'); +$display->run(); diff --git a/modules/paypal/api/.htaccess b/modules/paypal/api/.htaccess new file mode 100644 index 000000000..281d5c33d --- /dev/null +++ b/modules/paypal/api/.htaccess @@ -0,0 +1,2 @@ +order allow,deny +deny from all diff --git a/modules/paypal/api/ApiPaypalPlus.php b/modules/paypal/api/ApiPaypalPlus.php new file mode 100644 index 000000000..0b5376f8a --- /dev/null +++ b/modules/paypal/api/ApiPaypalPlus.php @@ -0,0 +1,382 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +class ApiPaypalPlus +{ + /* * ********************************************************* */ + /* * ******************** CONNECT METHODS ******************** */ + /* * ********************************************************* */ + + public function __construct() + { + if (class_exists('Context')) { + $this->context = Context::getContext(); + } else { + global $smarty, $cookie; + $this->context = new StdClass(); + $this->context->smarty = $smarty; + $this->context->cookie = $cookie; + } + } + + protected function sendByCURL($url, $body, $http_header = false, $identify = false, $customRequest = false) + { + $ch = curl_init(); + + if ($ch) { + + if ((int) Configuration::get('PAYPAL_SANDBOX') == 1) { + curl_setopt($ch, CURLOPT_URL, 'https://api.sandbox.paypal.com'.$url); + } else { + curl_setopt($ch, CURLOPT_URL, 'https://api.paypal.com'.$url); + } + + if ($identify) { + curl_setopt($ch, CURLOPT_USERPWD, Configuration::get('PAYPAL_PLUS_CLIENT_ID').':'.Configuration::get('PAYPAL_PLUS_SECRET')); + } + + if ($http_header) { + curl_setopt($ch, CURLOPT_HTTPHEADER, $http_header); + } + if ($body) { + if ($customRequest === false) { + curl_setopt($ch, CURLOPT_POST, true); + } else { + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $customRequest); + } + + if ($identify) { + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($body)); + } else { + curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + } + + } + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HEADER, false); + curl_setopt($ch, CURLOPT_TIMEOUT, 60); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + //curl_setopt($ch, CURLOPT_SSLVERSION, defined('CURL_SSLVERSION_TLSv1') ? CURL_SSLVERSION_TLSv1 : 1); + curl_setopt($ch, CURLOPT_VERBOSE, false); + + $result = curl_exec($ch); + curl_close($ch); + } + + return $result; + } + + public function getToken($url, $body) + { + + + $result = $this->sendByCURL($url, $body, false, true); + + /* + * Init variable + */ + $oPayPalToken = Tools::jsonDecode($result); + + if (isset($oPayPalToken->error)) { + return false; + } else { + + if ($this->context->cookie->paypal_access_token_time_max > time()) { + return $this->context->cookie->paypal_access_token_access_token; + } + + $time_max = time() + $oPayPalToken->expires_in; + $access_token = $oPayPalToken->access_token; + + /* + * Set Token in Cookie + */ + $this->context->cookie->__set('paypal_access_token_time_max', $time_max); + $this->context->cookie->__set('paypal_access_token_access_token', $access_token); + $this->context->cookie->write(); + + return $access_token; + } + } + + private function _createWebProfile() + { + + $presentation = new stdClass(); + $presentation->brand_name = Configuration::get('PS_SHOP_NAME'); + $presentation->logo_image = Tools::getHttpHost(true).__PS_BASE_URI__.'img/logo.jpg'; + $presentation->locale_code = Tools::strtoupper(Language::getIsoById($this->context->language->id)); + $input_fields = new stdClass(); + $input_fields->allow_note = false; + $input_fields->no_shipping = 1; + $input_fields->address_override = 1; + + $flow_config = new stdClass(); + + $webProfile = new stdClass(); + $webProfile->name = Configuration::get('PS_SHOP_NAME'); + $webProfile->presentation = $presentation; + $webProfile->input_fields = $input_fields; + $webProfile->flow_config = $flow_config; + + return $webProfile; + } + + public function getWebProfile() + { + $accessToken = $this->getToken(URL_PPP_CREATE_TOKEN, array('grant_type' => 'client_credentials')); + + if ($accessToken) { + + $data = $this->_createWebProfile(); + + $header = array( + 'Content-Type:application/json', + 'Authorization:Bearer '.$accessToken, + ); + + $result = Tools::jsonDecode($this->sendByCURL(URL_PPP_WEBPROFILE, Tools::jsonEncode($data), $header)); + if (isset($result->id)) { + return $result->id; + } else { + + $results = $this->getListProfile(); + + foreach ($results as $result) { + if (isset($result->id) && $result->name == Configuration::get('PS_SHOP_NAME')) { + return $result->id; + } + } + + return false; + } + } + } + + public function getListProfile() + { + + $accessToken = $this->getToken(URL_PPP_CREATE_TOKEN, array('grant_type' => 'client_credentials')); + + if ($accessToken) { + + $header = array( + 'Content-Type:application/json', + 'Authorization:Bearer '.$accessToken, + ); + + return Tools::jsonDecode($this->sendByCURL(URL_PPP_WEBPROFILE, false, $header)); + } + } + + public function refreshToken() + { + if ($this->context->cookie->paypal_access_token_time_max < time()) { + return $this->getToken(URL_PPP_CREATE_TOKEN, array('grant_type' => 'client_credentials')); + } else { + return $this->context->cookie->paypal_access_token_access_token; + } + } + + private function _createObjectPayment($customer, $cart) + { + /* + * Init Variable + */ + $oCurrency = new Currency($cart->id_currency); + $address = new Address((int) $cart->id_address_invoice); + + $country = new Country((int) $address->id_country); + $iso_code = $country->iso_code; + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $totalShippingCostWithoutTax = $cart->getOrderShippingCost(null, false); + } else { + $totalShippingCostWithoutTax = $cart->getTotalShippingCost(null, false); + } + + $totalCartWithTax = $this->getCartPaymentTotal(true); + $totalCartWithoutTax = $this->getCartPaymentTotal(false); + + $total_tax = $totalCartWithTax - $totalCartWithoutTax; + + if ($cart->gift) { + if (version_compare(_PS_VERSION_, '1.5.3.0', '>=')) { + $giftWithoutTax = $cart->getGiftWrappingPrice(false); + } else { + $giftWithoutTax = (float) (Configuration::get('PS_GIFT_WRAPPING_PRICE')); + } + + } else { + $giftWithoutTax = 0; + } + + $shop_url = PayPal::getShopDomainSsl(true, true); + + /* + * Création de l'obj à envoyer à Paypal + */ + $state = new State($address->id_state); + $shipping_address = new stdClass(); + $shipping_address->recipient_name = $address->alias; + $shipping_address->type = 'residential'; + $shipping_address->line1 = $address->address1; + $shipping_address->line2 = $address->address2; + $shipping_address->city = $address->city; + $shipping_address->country_code = $iso_code; + $shipping_address->postal_code = $address->postcode; + $shipping_address->state = ($state->iso_code == null) ? '' : $state->iso_code; + $shipping_address->phone = $address->phone; + + $payer_info = new stdClass(); + $payer_info->email = '"'.$customer->email.'"'; + $payer_info->first_name = $address->firstname; + $payer_info->last_name = $address->lastname; + $payer_info->country_code = '"'.$iso_code.'"'; + $payer_info->shipping_address = array($shipping_address); + + $payer = new stdClass(); + $payer->payment_method = "paypal"; + //$payer->payer_info = $payer_info; // Objet set by PayPal + + $aItems = array(); + /* Item */ + // ojects needed to get advance paid amount + if ($cartItems = $cart->getProducts()) { + $objCustomerAdv = new HotelCustomerAdvancedPayment(); + $objAdvPayment = new HotelAdvancedPayment(); + $objCartBooking = new HotelCartBookingData(); + foreach ($cartItems as $cartItem) { + // set advance product price if customer chhoses advance payment + if (Configuration::get('WK_ALLOW_ADVANCED_PAYMENT') + && $objCustomerAdv->getClientAdvPaymentDtl($this->context->cart->id, $this->context->cart->id_guest) + ) { + $cartItem['price_wt'] = $cartItem['price'] = $objAdvPayment->getProductMinAdvPaymentAmountByIdCart( + $this->context->cart->id, + $cartItem['id_product'] + ); + $cartItem['quantity'] = 1; + } elseif ($productRoomTypes = $objCartBooking->getCartInfoIdCartIdProduct( + $this->context->cart->id, + $cartItem['id_product'] + )) { + $cartItem['price_wt'] = 0; + foreach ($productRoomTypes as $cartRoomInfo) { + if ($roomTotalPrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice( + $cartRoomInfo['id_product'], + $cartRoomInfo['date_from'], + $cartRoomInfo['date_to'] + )) { + $cartItem['price_wt'] += $roomTotalPrice['total_price_tax_incl']; + $cartItem['price'] += $roomTotalPrice['total_price_tax_excl']; + } + } + $cartItem['quantity'] = 1; + } + + $item = new stdClass(); + $item->name = $cartItem['name']; + $item->currency = $oCurrency->iso_code; + $item->quantity = $cartItem['quantity']; + $item->price = number_format(round($cartItem['price'], 2), 2); + $item->tax = number_format(round($cartItem['price_wt'] - $cartItem['price'], 2), 2); + $aItems[] = $item; + unset($item); + } + } + + /* ItemList */ + $itemList = new stdClass(); + $itemList->items = $aItems; + + /* Detail */ + $details = new stdClass(); + $details->shipping = number_format($totalShippingCostWithoutTax, 2); + $details->tax = number_format($total_tax, 2); + $details->handling_fee = number_format($giftWithoutTax, 2); + $details->subtotal = number_format($totalCartWithoutTax - $totalShippingCostWithoutTax - $giftWithoutTax, 2); + + /* Amount */ + $amount = new stdClass(); + $amount->total = number_format($totalCartWithTax, 2); + $amount->currency = $oCurrency->iso_code; + $amount->details = $details; + + /* Transaction */ + $transaction = new stdClass(); + $transaction->amount = $amount; + $transaction->item_list = $itemList; + $transaction->description = "Payment description"; + $transaction->notify_url = $shop_url.'/modules/paypal/ipn.php'; + + /* Redirecte Url */ + + $redirectUrls = new stdClass(); + $redirectUrls->cancel_url = $shop_url._MODULE_DIR_.'paypal/paypal_plus/submit.php?id_cart='.(int) $cart->id; + $redirectUrls->return_url = $shop_url._MODULE_DIR_.'paypal/paypal_plus/submit.php?id_cart='.(int) $cart->id; + + /* Payment */ + $payment = new stdClass(); + $payment->transactions = array($transaction); + $payment->payer = $payer; + $payment->intent = "sale"; + if (Configuration::get('PAYPAL_WEB_PROFILE_ID')) { + $payment->experience_profile_id = Configuration::get('PAYPAL_WEB_PROFILE_ID'); + } + $payment->redirect_urls = $redirectUrls; + return $payment; + } + + protected function createPayment($customer, $cart, $access_token) + { + + $data = $this->_createObjectPayment($customer, $cart); + + $header = array( + 'Content-Type:application/json', + 'Authorization:Bearer '.$access_token, + ); + + $result = $this->sendByCURL(URL_PPP_CREATE_PAYMENT, Tools::jsonEncode($data), $header); + return $result; + } + + public function getCartPaymentTotal($withTax = true) + { + $context = Context::getContext(); + if (Configuration::get('WK_ALLOW_ADVANCED_PAYMENT')) { + $objCustAdvPay = new HotelCustomerAdvancedPayment(); + $orderTotal = $objCustAdvPay->getOrdertTotal( + $context->cart->id, + $context->cart->id_guest + ); + } else { + $orderTotal = $cart->getOrderTotal($withTax, Cart::BOTH); + } + return $orderTotal; + } +} diff --git a/modules/paypal/api/CallApiPaypalPlus.php b/modules/paypal/api/CallApiPaypalPlus.php new file mode 100644 index 000000000..22fce69d8 --- /dev/null +++ b/modules/paypal/api/CallApiPaypalPlus.php @@ -0,0 +1,209 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +require_once _PS_MODULE_DIR_.'paypal/api/ApiPaypalPlus.php'; + +define('URL_PPP_CREATE_TOKEN', '/v1/oauth2/token'); +define('URL_PPP_CREATE_PAYMENT', '/v1/payments/payment'); +define('URL_PPP_LOOK_UP', '/v1/payments/payment/'); +define('URL_PPP_WEBPROFILE', '/v1/payment-experience/web-profiles'); +define('URL_PPP_EXECUTE_PAYMENT', '/v1/payments/payment/'); +define('URL_PPP_EXECUTE_REFUND', '/v1/payments/sale/'); + +define('URL_PPP_PATCH', '/v1/payments/payment/'); + + +class CallApiPaypalPlus extends ApiPaypalPlus +{ + protected $cart = null; + protected $customer = null; + public $id_payment; + + public function setParams($params) + { + $this->cart = new Cart($params['cart']->id); + $this->customer = new Customer($params['cookie']->id_customer); + } + + public function getApprovalUrl() + { + /* + * Récupération du token + */ + $accessToken = $this->getToken(URL_PPP_CREATE_TOKEN, array('grant_type' => 'client_credentials')); + + if ($accessToken != false) { + + $result = Tools::jsonDecode($this->createPayment($this->customer, $this->cart, $accessToken)); + + if (isset($result->links)) { + + foreach ($result->links as $link) { + + if ($link->rel == 'approval_url') { + $this->id_payment = $result->id; + return $link->href; + } + } + } + } + return false; + } + + public function lookUpPayment($paymentId) + { + + if ($paymentId == 'NULL') { + return false; + } + + $accessToken = $this->refreshToken(); + + $header = array( + 'Content-Type:application/json', + 'Authorization:Bearer '.$accessToken, + ); + + return $this->sendByCURL(URL_PPP_LOOK_UP.$paymentId, false, $header); + } + + public function executePayment($payer_id, $paymentId) + { + + if ($payer_id == 'NULL' || $paymentId == 'NULL') { + return false; + } + + $accessToken = $this->refreshToken(); + + $header = array( + 'Content-Type:application/json', + 'Authorization:Bearer '.$accessToken, + ); + + $data = array('payer_id' => $payer_id); + $response = $this->sendByCURL(URL_PPP_EXECUTE_PAYMENT.$paymentId.'/execute/', Tools::jsonEncode($data), $header); + + return $response; + } + + public function executeRefund($paymentId, $data) + { + + if ($paymentId == 'NULL' || !is_object($data)) { + return false; + } + + $accessToken = $this->refreshToken(); + + $header = array( + 'Content-Type:application/json', + 'Authorization:Bearer '.$accessToken, + ); + + return $this->sendByCURL(URL_PPP_EXECUTE_REFUND.$paymentId.'/refund', Tools::jsonEncode($data), $header); + } + + public function patch($id_payment, $address) + { + /* + $totalCartWithTax = $cart->getOrderTotal(true); + $totalCartWithoutTax = $cart->getOrderTotal(false); + $total_tax = $totalCartWithTax - $totalCartWithoutTax; + if ($cart->gift) { + if (version_compare(_PS_VERSION_, '1.5.3.0', '>=')) { + $giftWithoutTax = $cart->getGiftWrappingPrice(false); + } else { + $giftWithoutTax = (float) (Configuration::get('PS_GIFT_WRAPPING_PRICE')); + } + + } else { + $giftWithoutTax = 0; + } + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $totalShippingCostWithoutTax = $cart->getOrderShippingCost(null, false); + } else { + $totalShippingCostWithoutTax = $cart->getTotalShippingCost(null, false); + } + + $oCurrency = new Currency($cart->id_currency); + $country = new Country((int) $address->id_country); + $iso_code = $country->iso_code; + + $state = new State($address->id_state); + $shipping_address = new stdClass(); + $shipping_address->recipient_name = $address->alias; + $shipping_address->type = 'residential'; + $shipping_address->line1 = $address->address1; + $shipping_address->line2 = $address->address2; + $shipping_address->city = $address->city; + $shipping_address->country_code = $iso_code; + $shipping_address->postal_code = $address->postcode; + $shipping_address->state = ($state->iso_code == null) ? '' : $state->iso_code; + $shipping_address->phone = $address->phone; + + + $payment = new stdClass(); + + $payment->transactions = array(); + $payment->transactions[0] = new stdClass(); + $payment->transactions[0]->item_list = new stdClass(); + $payment->transactions[0]->item_list->shipping_address = $shipping_address; + $payment->transactions[0]->amount = new stdClass(); + $payment->transactions[0]->amount->total = number_format($totalCartWithTax, 2); + $payment->transactions[0]->amount->currency = $oCurrency->iso_code; + $payment->transactions[0]->amount->details = new stdClass();; + $payment->transactions[0]->amount->details->shipping = number_format($totalShippingCostWithoutTax, 2); + $payment->transactions[0]->amount->details->tax = number_format($total_tax, 2); + $payment->transactions[0]->amount->details->handling_fee = number_format($giftWithoutTax, 2); + $payment->transactions[0]->amount->details->subtotal = number_format($totalCartWithoutTax - $totalShippingCostWithoutTax - $giftWithoutTax, 2); + + */ + + $country = new Country((int) $address->id_country); + + $state = new State($address->id_state); + + $payment = array(0 => new stdClass); + $payment[0]->op = 'add'; + $payment[0]->path = '/transactions/0/item_list/shipping_address'; + $payment[0]->value = new stdClass(); + $payment[0]->value->line1 = $address->address1; + $payment[0]->value->city = $address->city; + $payment[0]->value->recipient_name = $address->firstname.' '.$address->lastname;//$address->alias; + $payment[0]->value->state = ($state->iso_code == null) ? '' : $state->iso_code; + $payment[0]->value->country_code = $country->iso_code; + $payment[0]->value->postal_code = $address->postcode; + + $accessToken = $this->refreshToken(); + $header = array( + 'Content-Type:application/json', + 'Authorization:Bearer '.$accessToken, + ); + $body = str_replace('\/transactions\/0\/item_list\/shipping_address', '/transactions/0/item_list/shipping_address', Tools::jsonEncode($payment)); + return $this->sendByCURL(URL_PPP_PATCH.$id_payment, $body, $header, false, 'PATCH'); + } +} diff --git a/modules/paypal/api/index.php b/modules/paypal/api/index.php new file mode 100644 index 000000000..68409394b --- /dev/null +++ b/modules/paypal/api/index.php @@ -0,0 +1,33 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/paypal_connect.php b/modules/paypal/api/paypal_connect.php new file mode 100644 index 000000000..a52be835d --- /dev/null +++ b/modules/paypal/api/paypal_connect.php @@ -0,0 +1,183 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +class PayPalConnect +{ + private $_logs = array(); + private $paypal = null; + + public function __construct() + { + $this->paypal = new PayPal(); + } + + public function makeConnection($host, $script, $body, $simple_mode = false, $http_header = false, $identify = false) + { + $this->_logs[] = $this->paypal->l('Making new connection to').' \''.$host.$script.'\''; + + if (function_exists('curl_exec')) { + $return = $this->_connectByCURL($host.$script, $body, $http_header, $identify); + } + + if (isset($return) && $return) { + return $return; + } + + $tmp = $this->_connectByFSOCK($host, $script, $body); + + if (!$simple_mode || !preg_match('/[A-Z]+=/', $tmp, $result)) { + return $tmp; + } + + return Tools::substr($tmp, strpos($tmp, $result[0])); + } + + public function getLogs() + { + return $this->_logs; + } + + /************************************************************/ + /********************** CONNECT METHODS *********************/ + /************************************************************/ + private function _connectByCURL($url, $body, $http_header = false, $identify = false) + { + $ch = @curl_init(); + + if (!$ch) { + $this->_logs[] = $this->paypal->l('Connect failed with CURL method'); + } else { + $this->_logs[] = $this->paypal->l('Connect with CURL method successful'); + $this->_logs[] = ''.$this->paypal->l('Sending this params:').''; + $this->_logs[] = $body; + + @curl_setopt($ch, CURLOPT_URL, 'https://'.$url); + + if ($identify) { + @curl_setopt($ch, CURLOPT_USERPWD, Configuration::get('PAYPAL_LOGIN_CLIENT_ID').':'.Configuration::get('PAYPAL_LOGIN_SECRET')); + } + + @curl_setopt($ch, CURLOPT_POST, true); + if ($body) { + @curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + } + + @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + @curl_setopt($ch, CURLOPT_HEADER, false); + @curl_setopt($ch, CURLOPT_TIMEOUT, 30); + @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + @curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + //@curl_setopt($ch, CURLOPT_SSLVERSION, Configuration::get('PAYPAL_VERSION_TLS_CHECKED') == '1.2' ? 6 : 1); + + @curl_setopt($ch, CURLOPT_VERBOSE, false); + if ($http_header) { + @curl_setopt($ch, CURLOPT_HTTPHEADER, $http_header); + } + + $result = @curl_exec($ch); + + if (!$result) { + $this->_logs[] = $this->paypal->l('Send with CURL method failed ! Error:').' '.curl_error($ch); + if (curl_errno($ch)) { + $this->_logPaypal(curl_error($ch)); + } + + } else { + $this->_logs[] = $this->paypal->l('Send with CURL method successful'); + } + + @curl_close($ch); + } + return $result ? $result : false; + } + + private function _connectByFSOCK($host, $script, $body) + { + $fp = @fsockopen('tls://'.$host, 443, $errno, $errstr, 4); + + if (!$fp) { + $this->_logs[] = $this->paypal->l('Connect failed with fsockopen method'); + } else { + $header = $this->_makeHeader($host, $script, Tools::strlen($body)); + $this->_logs[] = $this->paypal->l('Sending this params:').' '.$header.$body; + + @fputs($fp, $header.$body); + + $tmp = ''; + while (!feof($fp)) { + $tmp .= trim(fgets($fp, 1024)); + } + + fclose($fp); + + if (!isset($tmp) || $tmp == false) { + $this->_logs[] = $this->paypal->l('Send with fsockopen method failed !'); + } else { + $this->_logs[] = $this->paypal->l('Send with fsockopen method successful'); + } + + } + return isset($tmp) ? $tmp : false; + } + + private function _makeHeader($host, $script, $lenght) + { + return 'POST '.(string) $script.' HTTP/1.1'."\r\n". + 'Host: '.(string) $host."\r\n". + 'Content-Type: application/x-www-form-urlencoded'."\r\n". + 'Content-Length: '.(int) $lenght."\r\n". + 'Connection: close'."\r\n\r\n"; + } + + private function _logPaypal($message) + { + try { + $date = date('Ymd'); + $path = _PS_MODULE_DIR_.'paypal/log/'; + $context = Context::getContext(); + // file_put_contents($path.$date.'_paypal_curl.log',date('d/m/Y H:i:s').' cart : '.$context->cart->id.' => '.$message.PHP_EOL,FILE_APPEND); + $date_last_purge = Configuration::get('PAYPAL_PURGE_LOG_DATE'); + // if date not set : set at yesterday + if (!$date_last_purge) { + $date_last_purge = date('Ymd', strtotime('yesterday')); + } + if ($date_last_purge < $date) { + $date_limit_purge = date('Ymd', strtotime('-1 month')); + $dir = opendir($path); + while ($file = readdir($dir)) { + $date_file = Tools::substr($file, 0, 8); + if ($file !='.' && $file != '..' && $date_file <= $date_limit_purge) { + unlink($path.$file); + } + } + Configuration::updateValue('PAYPAL_PURGE_LOG_DATE', $date); + } + + } catch (Exception $e) { + return false; + } + } +} diff --git a/modules/paypal/api/paypal_lib.php b/modules/paypal/api/paypal_lib.php new file mode 100644 index 000000000..963e2211f --- /dev/null +++ b/modules/paypal/api/paypal_lib.php @@ -0,0 +1,115 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once _PS_MODULE_DIR_.'paypal/api/paypal_connect.php'; + +define('PAYPAL_API_VERSION', '106.0'); + +class PaypalLib +{ + + private $enable_log = false; + private $_logs = array(); + protected $paypal = null; + public function __construct() + { + $this->paypal = new PayPal(); + } + + public function getLogs() + { + return $this->_logs; + } + + public function makeCall($host, $script, $method_name, $data, $method_version = '') + { + // Making request string + $method_version = (!empty($method_version)) ? $method_version : PAYPAL_API_VERSION; + + $params = array( + 'METHOD' => $method_name, + 'VERSION' => $method_version, + 'PWD' => Configuration::get('PAYPAL_API_PASSWORD'), + 'USER' => Configuration::get('PAYPAL_API_USER'), + 'SIGNATURE' => Configuration::get('PAYPAL_API_SIGNATURE'), + ); + + $request = http_build_query($params, '', '&'); + $request .= '&'.(!is_array($data) ? $data : http_build_query($data, '', '&')); + + // Making connection + $result = $this->makeSimpleCall($host, $script, $request, true); + $response = explode('&', $result); + $logs_request = $this->_logs; + $return = array(); + + if ($this->enable_log === true) { + $handle = fopen(dirname(__FILE__).'/Results.txt', 'a+'); + fwrite($handle, 'Host : '.print_r($host, true)."\r\n"); + fwrite($handle, 'Request : '.print_r($request, true)."\r\n"); + fwrite($handle, 'Result : '.print_r($result, true)."\r\n"); + fwrite($handle, 'Logs : '.print_r($this->_logs, true."\r\n")); + fclose($handle); + } + + foreach ($response as $value) { + $tmp = explode('=', $value); + $return[$tmp[0]] = urldecode(!isset($tmp[1]) ? $tmp[0] : $tmp[1]); + } + + if (!Configuration::get('PAYPAL_DEBUG_MODE')) { + $this->_logs = array(); + } + + $to_exclude = array('TOKEN', 'SUCCESSPAGEREDIRECTREQUESTED', 'VERSION', 'BUILD', 'ACK', 'CORRELATIONID'); + $this->_logs[] = ''.$this->paypal->l('PayPal response:').''; + + foreach ($return as $key => $value) { + if (!Configuration::get('PAYPAL_DEBUG_MODE') && in_array($key, $to_exclude)) { + continue; + } + + $this->_logs[] = $key.' -> '.$value; + } + + // if (count($this->_logs) <= 2) { + // $this->_logs = array_merge($this->_logs, $logs_request); + // } + + return $return; + } + + public function makeSimpleCall($host, $script, $request, $simple_mode = false) + { + // Making connection + $paypal_connect = new PayPalConnect(); + + $result = $paypal_connect->makeConnection($host, $script, $request, $simple_mode); + $this->_logs = $paypal_connect->getLogs(); + + return $result; + } +} diff --git a/modules/paypal/api/sdk/braintree/index.php b/modules/paypal/api/sdk/braintree/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree.php b/modules/paypal/api/sdk/braintree/lib/Braintree.php new file mode 100644 index 000000000..b78f5a2b4 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree.php @@ -0,0 +1,25 @@ += 5.4.0 required'); +} + + +function requireDependencies() { + $requiredExtensions = ['xmlwriter', 'openssl', 'dom', 'hash', 'curl']; + foreach ($requiredExtensions AS $ext) { + if (!extension_loaded($ext)) { + throw new Braintree_Exception('The Braintree library requires the ' . $ext . ' extension.'); + } + } +} + +requireDependencies(); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/AccountUpdaterDailyReport.php b/modules/paypal/api/sdk/braintree/lib/Braintree/AccountUpdaterDailyReport.php new file mode 100644 index 000000000..66c2b2dda --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/AccountUpdaterDailyReport.php @@ -0,0 +1,45 @@ +_attributes = $disputeAttribs; + } + + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + public function __toString() + { + $display = [ + 'reportDate', 'reportUrl' + ]; + + $displayAttributes = []; + foreach ($display AS $attrib) { + $displayAttributes[$attrib] = $this->$attrib; + } + return __CLASS__ . '[' . + Util::attributesToString($displayAttributes) .']'; + } +} +class_alias('Braintree\AccountUpdaterDailyReport', 'Braintree_AccountUpdaterDailyReport'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/AddOn.php b/modules/paypal/api/sdk/braintree/lib/Braintree/AddOn.php new file mode 100644 index 000000000..04c1705de --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/AddOn.php @@ -0,0 +1,29 @@ +_initialize($attributes); + return $instance; + } + + + /** + * static methods redirecting to gateway + * + * @return AddOn[] + */ + public static function all() + { + return Configuration::gateway()->addOn()->all(); + } +} +class_alias('Braintree\AddOn', 'Braintree_AddOn'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/AddOnGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/AddOnGateway.php new file mode 100644 index 000000000..9ecf942a6 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/AddOnGateway.php @@ -0,0 +1,53 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + /** + * + * @return AddOn[] + */ + public function all() + { + $path = $this->_config->merchantPath() . '/add_ons'; + $response = $this->_http->get($path); + + $addOns = ["addOn" => $response['addOns']]; + + return Util::extractAttributeAsArray( + $addOns, + 'addOn' + ); + } +} +class_alias('Braintree\AddOnGateway', 'Braintree_AddOnGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Address.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Address.php new file mode 100644 index 000000000..9373132d4 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Address.php @@ -0,0 +1,151 @@ +id === $other->id && $this->customerId === $other->customerId); + } + + /** + * create a printable representation of the object as: + * ClassName[property=value, property=value] + * @ignore + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) . ']'; + } + + /** + * sets instance properties from an array of values + * + * @ignore + * @access protected + * @param array $addressAttribs array of address data + * @return void + */ + protected function _initialize($addressAttribs) + { + // set the attributes + $this->_attributes = $addressAttribs; + } + + /** + * factory method: returns an instance of Address + * to the requesting method, with populated properties + * @ignore + * @return Address + */ + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + + } + + + // static methods redirecting to gateway + + /** + * + * @param array $attribs + * @return Address + */ + public static function create($attribs) + { + return Configuration::gateway()->address()->create($attribs); + } + + /** + * + * @param array $attribs + * @return Address + */ + public static function createNoValidate($attribs) + { + return Configuration::gateway()->address()->createNoValidate($attribs); + } + + /** + * + * @param Customer|int $customerOrId + * @param int $addressId + * @throws InvalidArgumentException + * @return Result\Successful + */ + public static function delete($customerOrId = null, $addressId = null) + { + return Configuration::gateway()->address()->delete($customerOrId, $addressId); + } + + /** + * + * @param Customer|int $customerOrId + * @param int $addressId + * @throws Exception\NotFound + * @return Address + */ + public static function find($customerOrId, $addressId) + { + return Configuration::gateway()->address()->find($customerOrId, $addressId); + } + + /** + * + * @param Customer|int $customerOrId + * @param int $addressId + * @param array $attributes + * @throws Exception\Unexpected + * @return Result\Successful|Result\Error + */ + public static function update($customerOrId, $addressId, $attributes) + { + return Configuration::gateway()->address()->update($customerOrId, $addressId, $attributes); + } + + public static function updateNoValidate($customerOrId, $addressId, $attributes) + { + return Configuration::gateway()->address()->updateNoValidate($customerOrId, $addressId, $attributes); + } +} +class_alias('Braintree\Address', 'Braintree_Address'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/AddressGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/AddressGateway.php new file mode 100644 index 000000000..504ce57d9 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/AddressGateway.php @@ -0,0 +1,310 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + + /* public class methods */ + /** + * + * @access public + * @param array $attribs + * @return Result\Successful|Result\Error + */ + public function create($attribs) + { + Util::verifyKeys(self::createSignature(), $attribs); + $customerId = isset($attribs['customerId']) ? + $attribs['customerId'] : + null; + + $this->_validateCustomerId($customerId); + unset($attribs['customerId']); + return $this->_doCreate( + '/customers/' . $customerId . '/addresses', + ['address' => $attribs] + ); + } + + /** + * attempts the create operation assuming all data will validate + * returns a Address object instead of a Result + * + * @access public + * @param array $attribs + * @return self + * @throws Exception\ValidationError + */ + public function createNoValidate($attribs) + { + $result = $this->create($attribs); + return Util::returnObjectOrThrowException(__CLASS__, $result); + + } + + /** + * delete an address by id + * + * @param mixed $customerOrId + * @param string $addressId + */ + public function delete($customerOrId = null, $addressId = null) + { + $this->_validateId($addressId); + $customerId = $this->_determineCustomerId($customerOrId); + $path = $this->_config->merchantPath() . '/customers/' . $customerId . '/addresses/' . $addressId; + $this->_http->delete($path); + return new Result\Successful(); + } + + /** + * find an address by id + * + * Finds the address with the given addressId that is associated + * to the given customerOrId. + * If the address cannot be found, a NotFound exception will be thrown. + * + * + * @access public + * @param mixed $customerOrId + * @param string $addressId + * @return Address + * @throws Exception\NotFound + */ + public function find($customerOrId, $addressId) + { + + $customerId = $this->_determineCustomerId($customerOrId); + $this->_validateId($addressId); + + try { + $path = $this->_config->merchantPath() . '/customers/' . $customerId . '/addresses/' . $addressId; + $response = $this->_http->get($path); + return Address::factory($response['address']); + } catch (Exception\NotFound $e) { + throw new Exception\NotFound( + 'address for customer ' . $customerId . + ' with id ' . $addressId . ' not found.' + ); + } + + } + + /** + * updates the address record + * + * if calling this method in context, + * customerOrId is the 2nd attribute, addressId 3rd. + * customerOrId & addressId are not sent in object context. + * + * + * @access public + * @param array $attributes + * @param mixed $customerOrId (only used in call) + * @param string $addressId (only used in call) + * @return Result\Successful|Result\Error + */ + public function update($customerOrId, $addressId, $attributes) + { + $this->_validateId($addressId); + $customerId = $this->_determineCustomerId($customerOrId); + Util::verifyKeys(self::updateSignature(), $attributes); + + $path = $this->_config->merchantPath() . '/customers/' . $customerId . '/addresses/' . $addressId; + $response = $this->_http->put($path, ['address' => $attributes]); + + return $this->_verifyGatewayResponse($response); + + } + + /** + * update an address record, assuming validations will pass + * + * if calling this method in context, + * customerOrId is the 2nd attribute, addressId 3rd. + * customerOrId & addressId are not sent in object context. + * + * @access public + * @param array $transactionAttribs + * @param string $customerId + * @return Transaction + * @throws Exception\ValidationsFailed + * @see Address::update() + */ + public function updateNoValidate($customerOrId, $addressId, $attributes) + { + $result = $this->update($customerOrId, $addressId, $attributes); + return Util::returnObjectOrThrowException(__CLASS__, $result); + } + + /** + * creates a full array signature of a valid create request + * @return array gateway create request format + */ + public static function createSignature() + { + return [ + 'company', 'countryCodeAlpha2', 'countryCodeAlpha3', 'countryCodeNumeric', + 'countryName', 'customerId', 'extendedAddress', 'firstName', + 'lastName', 'locality', 'postalCode', 'region', 'streetAddress' + ]; + } + + /** + * creates a full array signature of a valid update request + * @return array gateway update request format + */ + public static function updateSignature() + { + // TODO: remove customerId from update signature + return self::createSignature(); + + } + + /** + * verifies that a valid address id is being used + * @ignore + * @param string $id address id + * @throws InvalidArgumentException + */ + private function _validateId($id = null) + { + if (empty($id) || trim($id) == "") { + throw new InvalidArgumentException( + 'expected address id to be set' + ); + } + if (!preg_match('/^[0-9A-Za-z_-]+$/', $id)) { + throw new InvalidArgumentException( + $id . ' is an invalid address id.' + ); + } + } + + /** + * verifies that a valid customer id is being used + * @ignore + * @param string $id customer id + * @throws InvalidArgumentException + */ + private function _validateCustomerId($id = null) + { + if (empty($id) || trim($id) == "") { + throw new InvalidArgumentException( + 'expected customer id to be set' + ); + } + if (!preg_match('/^[0-9A-Za-z_-]+$/', $id)) { + throw new InvalidArgumentException( + $id . ' is an invalid customer id.' + ); + } + + } + + /** + * determines if a string id or Customer object was passed + * @ignore + * @param mixed $customerOrId + * @return string customerId + */ + private function _determineCustomerId($customerOrId) + { + $customerId = ($customerOrId instanceof Customer) ? $customerOrId->id : $customerOrId; + $this->_validateCustomerId($customerId); + return $customerId; + + } + + /* private class methods */ + /** + * sends the create request to the gateway + * @ignore + * @param string $subPath + * @param array $params + * @return Result\Successful|Result\Error + */ + private function _doCreate($subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->post($fullPath, $params); + + return $this->_verifyGatewayResponse($response); + + } + + /** + * generic method for validating incoming gateway responses + * + * creates a new Address object and encapsulates + * it inside a Result\Successful object, or + * encapsulates an Errors object inside a Result\Error + * alternatively, throws an Unexpected exception if the response is invalid + * + * @ignore + * @param array $response gateway response values + * @return Result\Successful|Result\Error + * @throws Exception\Unexpected + */ + private function _verifyGatewayResponse($response) + { + if (isset($response['address'])) { + // return a populated instance of Address + return new Result\Successful( + Address::factory($response['address']) + ); + } else if (isset($response['apiErrorResponse'])) { + return new Result\Error($response['apiErrorResponse']); + } else { + throw new Exception\Unexpected( + "Expected address or apiErrorResponse" + ); + } + + } +} +class_alias('Braintree\AddressGateway', 'Braintree_AddressGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/AmexExpressCheckoutCard.php b/modules/paypal/api/sdk/braintree/lib/Braintree/AmexExpressCheckoutCard.php new file mode 100644 index 000000000..a17d93857 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/AmexExpressCheckoutCard.php @@ -0,0 +1,81 @@ +== More information == + * + * See {@link https://developers.braintreepayments.com/javascript+php}
+ * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read string $createdAt + * @property-read string $default + * @property-read string $updatedAt + * @property-read string $customerId + * @property-read string $cardType + * @property-read string $bin + * @property-read string $cardMemberExpiryDate + * @property-read string $cardMemberNumber + * @property-read string $cardType + * @property-read string $sourceDescription + * @property-read string $token + * @property-read string $imageUrl + * @property-read string $expirationMonth + * @property-read string $expirationYear + */ +class AmexExpressCheckoutCard extends Base +{ + /* instance methods */ + /** + * returns false if default is null or false + * + * @return boolean + */ + public function isDefault() + { + return $this->default; + } + + /** + * factory method: returns an instance of AmexExpressCheckoutCard + * to the requesting method, with populated properties + * + * @ignore + * @return AmexExpressCheckoutCard + */ + public static function factory($attributes) + { + + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + /** + * sets instance properties from an array of values + * + * @access protected + * @param array $amexExpressCheckoutCardAttribs array of Amex Express Checkout card properties + * @return void + */ + protected function _initialize($amexExpressCheckoutCardAttribs) + { + // set the attributes + $this->_attributes = $amexExpressCheckoutCardAttribs; + + $subscriptionArray = []; + if (isset($amexExpressCheckoutCardAttribs['subscriptions'])) { + foreach ($amexExpressCheckoutCardAttribs['subscriptions'] AS $subscription) { + $subscriptionArray[] = Subscription::factory($subscription); + } + } + + $this->_set('subscriptions', $subscriptionArray); + } +} +class_alias('Braintree\AmexExpressCheckoutCard', 'Braintree_AmexExpressCheckoutCard'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/AndroidPayCard.php b/modules/paypal/api/sdk/braintree/lib/Braintree/AndroidPayCard.php new file mode 100644 index 000000000..22879cd70 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/AndroidPayCard.php @@ -0,0 +1,90 @@ +== More information == + * + * See {@link https://developers.braintreepayments.com/javascript+php}
+ * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read string $bin + * @property-read string $cardType + * @property-read string $createdAt + * @property-read string $customerId + * @property-read string $default + * @property-read string $expirationMonth + * @property-read string $expirationYear + * @property-read string $googleTransactionId + * @property-read string $imageUrl + * @property-read string $last4 + * @property-read string $sourceCardLast4 + * @property-read string $sourceCardType + * @property-read string $sourceDescription + * @property-read string $token + * @property-read string $updatedAt + * @property-read string $virtualCardLast4 + * @property-read string $virtualCardType + */ +class AndroidPayCard extends Base +{ + /* instance methods */ + /** + * returns false if default is null or false + * + * @return boolean + */ + public function isDefault() + { + return $this->default; + } + + /** + * factory method: returns an instance of AndroidPayCard + * to the requesting method, with populated properties + * + * @ignore + * @return AndroidPayCard + */ + public static function factory($attributes) + { + $defaultAttributes = [ + 'expirationMonth' => '', + 'expirationYear' => '', + 'last4' => $attributes['virtualCardLast4'], + 'cardType' => $attributes['virtualCardType'], + ]; + + $instance = new self(); + $instance->_initialize(array_merge($defaultAttributes, $attributes)); + return $instance; + } + + /** + * sets instance properties from an array of values + * + * @access protected + * @param array $androidPayCardAttribs array of Android Pay card properties + * @return void + */ + protected function _initialize($androidPayCardAttribs) + { + // set the attributes + $this->_attributes = $androidPayCardAttribs; + + $subscriptionArray = []; + if (isset($androidPayCardAttribs['subscriptions'])) { + foreach ($androidPayCardAttribs['subscriptions'] AS $subscription) { + $subscriptionArray[] = Subscription::factory($subscription); + } + } + + $this->_set('subscriptions', $subscriptionArray); + } +} +class_alias('Braintree\AndroidPayCard', 'Braintree_AndroidPayCard'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/ApplePayCard.php b/modules/paypal/api/sdk/braintree/lib/Braintree/ApplePayCard.php new file mode 100644 index 000000000..c7b1deaa9 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/ApplePayCard.php @@ -0,0 +1,100 @@ +== More information == + * + * See {@link https://developers.braintreepayments.com/javascript+php}
+ * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read string $cardType + * @property-read string $createdAt + * @property-read string $customerId + * @property-read string $expirationDate + * @property-read string $expirationMonth + * @property-read string $expirationYear + * @property-read string $imageUrl + * @property-read string $last4 + * @property-read string $token + * @property-read string $paymentInstrumentName + * @property-read string $sourceDescription + * @property-read string $updatedAt + */ +class ApplePayCard extends Base +{ + // Card Type + const AMEX = 'Apple Pay - American Express'; + const MASTER_CARD = 'Apple Pay - MasterCard'; + const VISA = 'Apple Pay - Visa'; + + /* instance methods */ + /** + * returns false if default is null or false + * + * @return boolean + */ + public function isDefault() + { + return $this->default; + } + + /** + * checks whether the card is expired based on the current date + * + * @return boolean + */ + public function isExpired() + { + return $this->expired; + } + + /** + * factory method: returns an instance of ApplePayCard + * to the requesting method, with populated properties + * + * @ignore + * @return ApplePayCard + */ + public static function factory($attributes) + { + $defaultAttributes = [ + 'expirationMonth' => '', + 'expirationYear' => '', + 'last4' => '', + ]; + + $instance = new self(); + $instance->_initialize(array_merge($defaultAttributes, $attributes)); + return $instance; + } + + /** + * sets instance properties from an array of values + * + * @access protected + * @param array $applePayCardAttribs array of Apple Pay card properties + * @return void + */ + protected function _initialize($applePayCardAttribs) + { + // set the attributes + $this->_attributes = $applePayCardAttribs; + + $subscriptionArray = []; + if (isset($applePayCardAttribs['subscriptions'])) { + foreach ($applePayCardAttribs['subscriptions'] AS $subscription) { + $subscriptionArray[] = Subscription::factory($subscription); + } + } + + $this->_set('subscriptions', $subscriptionArray); + $this->_set('expirationDate', $this->expirationMonth . '/' . $this->expirationYear); + } +} +class_alias('Braintree\ApplePayCard', 'Braintree_ApplePayCard'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Base.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Base.php new file mode 100644 index 000000000..1d661fbcd --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Base.php @@ -0,0 +1,77 @@ +_attributes)) { + return $this->_attributes[$name]; + } + else { + trigger_error('Undefined property on ' . get_class($this) . ': ' . $name, E_USER_NOTICE); + return null; + } + } + + /** + * Checks for the existance of a property stored in the private $_attributes property + * + * @ignore + * @param string $name + * @return boolean + */ + public function __isset($name) + { + return array_key_exists($name, $this->_attributes); + } + + /** + * Mutator for instance properties stored in the private $_attributes property + * + * @ignore + * @param string $key + * @param mixed $value + */ + public function _set($key, $value) + { + $this->_attributes[$key] = $value; + } +} diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/ClientToken.php b/modules/paypal/api/sdk/braintree/lib/Braintree/ClientToken.php new file mode 100644 index 000000000..269bd987a --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/ClientToken.php @@ -0,0 +1,49 @@ +clientToken()->generate($params); + } + + /** + * + * @param type $params + * @throws InvalidArgumentException + */ + public static function conditionallyVerifyKeys($params) + { + return Configuration::gateway()->clientToken()->conditionallyVerifyKeys($params); + } + + /** + * + * @return string client token retrieved from server + */ + public static function generateWithCustomerIdSignature() + { + return Configuration::gateway()->clientToken()->generateWithCustomerIdSignature(); + } + + /** + * + * @return string client token retrieved from server + */ + public static function generateWithoutCustomerIdSignature() + { + return Configuration::gateway()->clientToken()->generateWithoutCustomerIdSignature(); + } +} +class_alias('Braintree\ClientToken', 'Braintree_ClientToken'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/ClientTokenGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/ClientTokenGateway.php new file mode 100644 index 000000000..cf72b28a4 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/ClientTokenGateway.php @@ -0,0 +1,129 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + public function generate($params=[]) + { + if (!array_key_exists("version", $params)) { + $params["version"] = ClientToken::DEFAULT_VERSION; + } + + $this->conditionallyVerifyKeys($params); + $generateParams = ["client_token" => $params]; + + return $this->_doGenerate('/client_token', $generateParams); + } + + /** + * sends the generate request to the gateway + * + * @ignore + * @param var $url + * @param array $params + * @return mixed + */ + public function _doGenerate($subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->post($fullPath, $params); + + return $this->_verifyGatewayResponse($response); + } + + /** + * + * @param array $params + * @throws InvalidArgumentException + */ + public function conditionallyVerifyKeys($params) + { + if (array_key_exists("customerId", $params)) { + Util::verifyKeys($this->generateWithCustomerIdSignature(), $params); + } else { + Util::verifyKeys($this->generateWithoutCustomerIdSignature(), $params); + } + } + + /** + * + * @return mixed[] + */ + public function generateWithCustomerIdSignature() + { + return [ + "version", "customerId", "proxyMerchantId", + ["options" => ["makeDefault", "verifyCard", "failOnDuplicatePaymentMethod"]], + "merchantAccountId", "sepaMandateType", "sepaMandateAcceptanceLocation"]; + } + + /** + * + * @return string[] + */ + public function generateWithoutCustomerIdSignature() + { + return ["version", "proxyMerchantId", "merchantAccountId"]; + } + + /** + * generic method for validating incoming gateway responses + * + * If the request is successful, returns a client token string. + * Otherwise, throws an InvalidArgumentException with the error + * response from the Gateway or an HTTP status code exception. + * + * @ignore + * @param array $response gateway response values + * @return string client token + * @throws InvalidArgumentException | HTTP status code exception + */ + private function _verifyGatewayResponse($response) + { + if (isset($response['clientToken'])) { + return $response['clientToken']['value']; + } elseif (isset($response['apiErrorResponse'])) { + throw new InvalidArgumentException( + $response['apiErrorResponse']['message'] + ); + } else { + throw new Exception\Unexpected( + "Expected clientToken or apiErrorResponse" + ); + } + } + +} +class_alias('Braintree\ClientTokenGateway', 'Braintree_ClientTokenGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/CoinbaseAccount.php b/modules/paypal/api/sdk/braintree/lib/Braintree/CoinbaseAccount.php new file mode 100644 index 000000000..32fb583bc --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/CoinbaseAccount.php @@ -0,0 +1,112 @@ +== More information == + * + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read string $customerId + * @property-read string $token + * @property-read string $userId + * @property-read string $userName + * @property-read string $userEmail + */ +class CoinbaseAccount extends Base +{ + /** + * factory method: returns an instance of CoinbaseAccount + * to the requesting method, with populated properties + * + * @ignore + * @return CoinbaseAccount + */ + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + /* instance methods */ + + /** + * returns false if default is null or false + * + * @return boolean + */ + public function isDefault() + { + return $this->default; + } + + /** + * sets instance properties from an array of values + * + * @access protected + * @param array $coinbaseAccountAttribs array of coinbaseAccount data + * @return void + */ + protected function _initialize($coinbaseAccountAttribs) + { + // set the attributes + $this->_attributes = $coinbaseAccountAttribs; + + $subscriptionArray = []; + if (isset($coinbaseAccountAttribs['subscriptions'])) { + foreach ($coinbaseAccountAttribs['subscriptions'] AS $subscription) { + $subscriptionArray[] = Subscription::factory($subscription); + } + } + + $this->_set('subscriptions', $subscriptionArray); + } + + /** + * create a printable representation of the object as: + * ClassName[property=value, property=value] + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) .']'; + } + + + // static methods redirecting to gateway + + public static function find($token) + { + return Configuration::gateway()->coinbaseAccount()->find($token); + } + + public static function update($token, $attributes) + { + return Configuration::gateway()->coinbaseAccount()->update($token, $attributes); + } + + public static function delete($token) + { + return Configuration::gateway()->coinbaseAccount()->delete($token); + } + + public static function sale($token, $transactionAttribs) + { + return Configuration::gateway()->coinbaseAccount()->sale($token, $transactionAttribs); + } +} +class_alias('Braintree\CoinbaseAccount', 'Braintree_CoinbaseAccount'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Collection.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Collection.php new file mode 100644 index 000000000..e44b8777e --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Collection.php @@ -0,0 +1,162 @@ +_collection[] = $value; + } + + /** + * Set index's value + * @param integer $index + * @param mixed $value + * @throws OutOfRangeException + */ + public function set($index, $value) + { + if($index >= $this->count()) + throw new OutOfRangeException('Index out of range'); + + $this->_collection[$index] = $value; + } + + /** + * Remove a value from the collection + * @param integer $index index to remove + * @throws OutOfRangeException if index is out of range + */ + public function remove($index) + { + if($index >= $this->count()) + throw new OutOfRangeException('Index out of range'); + + array_splice($this->_collection, $index, 1); + } + + /** + * Return value at index + * @param integer $index + * @return mixed + * @throws OutOfRangeException + */ + public function get($index) + { + if($index >= $this->count()) + throw new OutOfRangeException('Index out of range'); + + return $this->_collection[$index]; + } + + /** + * Determine if index exists + * @param integer $index + * @return boolean + */ + public function exists($index) + { + if($index >= $this->count()) + return false; + + return true; + } + /** + * Return count of items in collection + * Implements countable + * @return integer + */ + public function count() + { + return count($this->_collection); + } + + + /** + * Return an iterator + * Implements IteratorAggregate + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_collection); + } + + /** + * Set offset to value + * Implements ArrayAccess + * @see set + * @param integer $offset + * @param mixed $value + */ + public function offsetSet($offset, $value) + { + $this->set($offset, $value); + } + + /** + * Unset offset + * Implements ArrayAccess + * @see remove + * @param integer $offset + */ + public function offsetUnset($offset) + { + $this->remove($offset); + } + + /** + * get an offset's value + * Implements ArrayAccess + * @see get + * @param integer $offset + * @return mixed + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * Determine if offset exists + * Implements ArrayAccess + * @see exists + * @param integer $offset + * @return boolean + */ + public function offsetExists($offset) + { + return $this->exists($offset); + } + +} +class_alias('Braintree\Collection', 'Braintree_Collection'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Configuration.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Configuration.php new file mode 100644 index 000000000..8a40948fd --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Configuration.php @@ -0,0 +1,500 @@ + $value) { + if ($kind == 'environment') { + CredentialsParser::assertValidEnvironment($value); + $this->_environment = $value; + } + if ($kind == 'merchantId') { + $this->_merchantId = $value; + } + if ($kind == 'publicKey') { + $this->_publicKey = $value; + } + if ($kind == 'privateKey') { + $this->_privateKey = $value; + } + } + + if (isset($attribs['clientId']) || isset($attribs['accessToken'])) { + if (isset($attribs['environment']) || isset($attribs['merchantId']) || isset($attribs['publicKey']) || isset($attribs['privateKey'])) { + throw new Exception\Configuration('Cannot mix OAuth credentials (clientId, clientSecret, accessToken) with key credentials (publicKey, privateKey, environment, merchantId).'); + } + $parsedCredentials = new CredentialsParser($attribs); + + $this->_environment = $parsedCredentials->getEnvironment(); + $this->_merchantId = $parsedCredentials->getMerchantId(); + $this->_clientId = $parsedCredentials->getClientId(); + $this->_clientSecret = $parsedCredentials->getClientSecret(); + $this->_accessToken = $parsedCredentials->getAccessToken(); + } + } + + /** + * resets configuration to default + * @access public + */ + public static function reset() + { + self::$global = new Configuration(); + } + + public static function gateway() + { + return new Gateway(self::$global); + } + + public static function environment($value=null) + { + if (empty($value)) { + return self::$global->getEnvironment(); + } + CredentialsParser::assertValidEnvironment($value); + self::$global->setEnvironment($value); + } + + public static function merchantId($value=null) + { + if (empty($value)) { + return self::$global->getMerchantId(); + } + self::$global->setMerchantId($value); + } + + public static function publicKey($value=null) + { + if (empty($value)) { + return self::$global->getPublicKey(); + } + self::$global->setPublicKey($value); + } + + public static function privateKey($value=null) + { + if (empty($value)) { + return self::$global->getPrivateKey(); + } + self::$global->setPrivateKey($value); + } + + /** + * Sets or gets the read timeout to use for making requests. + * + * @param integer $value If provided, sets the read timeout + * @return integer The read timeout used for connecting to Braintree + */ + public static function timeout($value=null) + { + if (empty($value)) { + return self::$global->getTimeout(); + } + self::$global->setTimeout($value); + } + + /** + * Sets or gets the proxy host to use for connecting to Braintree + * + * @param string $value If provided, sets the proxy host + * @return string The proxy host used for connecting to Braintree + */ + public static function proxyHost($value = null) + { + if (empty($value)) { + return self::$global->getProxyHost(); + } + self::$global->setProxyHost($value); + } + + /** + * Sets or gets the port of the proxy to use for connecting to Braintree + * + * @param string $value If provided, sets the port of the proxy + * @return string The port of the proxy used for connecting to Braintree + */ + public static function proxyPort($value = null) + { + if (empty($value)) { + return self::$global->getProxyPort(); + } + self::$global->setProxyPort($value); + } + + /** + * Sets or gets the proxy type to use for connecting to Braintree. This value + * can be any of the CURLOPT_PROXYTYPE options in PHP cURL. + * + * @param string $value If provided, sets the proxy type + * @return string The proxy type used for connecting to Braintree + */ + public static function proxyType($value = null) + { + if (empty($value)) { + return self::$global->getProxyType(); + } + self::$global->setProxyType($value); + } + + /** + * Specifies whether or not a proxy is properly configured + * + * @return bool true if a proxy is configured properly, false if not + */ + public static function isUsingProxy() + { + $proxyHost = self::$global->getProxyHost(); + $proxyPort = self::$global->getProxyPort(); + return !empty($proxyHost) && !empty($proxyPort); + } + + public static function assertGlobalHasAccessTokenOrKeys() + { + self::$global->assertHasAccessTokenOrKeys(); + } + + public function assertHasAccessTokenOrKeys() + { + if (empty($this->_accessToken)) { + if (empty($this->_merchantId)) { + throw new Exception\Configuration('Braintree\\Configuration::merchantId needs to be set (or accessToken needs to be passed to Braintree\\Gateway).'); + } else if (empty($this->_environment)) { + throw new Exception\Configuration('Braintree\\Configuration::environment needs to be set.'); + } else if (empty($this->_publicKey)) { + throw new Exception\Configuration('Braintree\\Configuration::publicKey needs to be set.'); + } else if (empty($this->_privateKey)) { + throw new Exception\Configuration('Braintree\\Configuration::privateKey needs to be set.'); + } + } + } + + public function assertHasClientCredentials() + { + $this->assertHasClientId(); + $this->assertHasClientSecret(); + } + + public function assertHasClientId() + { + if (empty($this->_clientId)) { + throw new Exception\Configuration('clientId needs to be passed to Braintree\\Gateway.'); + } + } + + public function assertHasClientSecret() + { + if (empty($this->_clientSecret)) { + throw new Exception\Configuration('clientSecret needs to be passed to Braintree\\Gateway.'); + } + } + + public function getEnvironment() + { + return $this->_environment; + } + + /** + * Do not use this method directly. Pass in the environment to the constructor. + */ + public function setEnvironment($value) + { + $this->_environment = $value; + } + + public function getMerchantId() + { + return $this->_merchantId; + } + + /** + * Do not use this method directly. Pass in the merchantId to the constructor. + */ + public function setMerchantId($value) + { + $this->_merchantId = $value; + } + + public function getPublicKey() + { + return $this->_publicKey; + } + + public function getClientId() + { + return $this->_clientId; + } + + /** + * Do not use this method directly. Pass in the publicKey to the constructor. + */ + public function setPublicKey($value) + { + $this->_publicKey = $value; + } + + public function getPrivateKey() + { + return $this->_privateKey; + } + + public function getClientSecret() + { + return $this->_clientSecret; + } + + /** + * Do not use this method directly. Pass in the privateKey to the constructor. + */ + public function setPrivateKey($value) + { + $this->_privateKey = $value; + } + + private function setProxyHost($value) + { + $this->_proxyHost = $value; + } + + public function getProxyHost() + { + return $this->_proxyHost; + } + + private function setProxyPort($value) + { + $this->_proxyPort = $value; + } + + public function getProxyPort() + { + return $this->_proxyPort; + } + + private function setProxyType($value) + { + $this->_proxyType = $value; + } + + public function getProxyType() + { + return $this->_proxyType; + } + + private function setTimeout($value) + { + $this->_timeout = $value; + } + + public function getTimeout() + { + return $this->_timeout; + } + + public function getAccessToken() + { + return $this->_accessToken; + } + + public function isAccessToken() + { + return !empty($this->_accessToken); + } + + public function isClientCredentials() + { + return !empty($this->_clientId); + } + /** + * returns the base braintree gateway URL based on config values + * + * @access public + * @param none + * @return string braintree gateway URL + */ + public function baseUrl() + { + return sprintf('%s://%s:%d', $this->protocol(), $this->serverName(), $this->portNumber()); + } + + /** + * sets the merchant path based on merchant ID + * + * @access protected + * @param none + * @return string merchant path uri + */ + public function merchantPath() + { + return '/merchants/' . $this->_merchantId; + } + + /** + * sets the physical path for the location of the CA certs + * + * @access public + * @param none + * @return string filepath + */ + public function caFile($sslPath = NULL) + { + $sslPath = $sslPath ? $sslPath : DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . + 'ssl' . DIRECTORY_SEPARATOR; + $caPath = __DIR__ . $sslPath . 'api_braintreegateway_com.ca.crt'; + + if (!file_exists($caPath)) + { + throw new Exception\SSLCaFileNotFound(); + } + + return $caPath; + } + + /** + * returns the port number depending on environment + * + * @access public + * @param none + * @return int portnumber + */ + public function portNumber() + { + if ($this->sslOn()) { + return 443; + } + return getenv("GATEWAY_PORT") ? getenv("GATEWAY_PORT") : 3000; + } + + /** + * returns http protocol depending on environment + * + * @access public + * @param none + * @return string http || https + */ + public function protocol() + { + return $this->sslOn() ? 'https' : 'http'; + } + + /** + * returns gateway server name depending on environment + * + * @access public + * @param none + * @return string server domain name + */ + public function serverName() + { + switch($this->_environment) { + case 'production': + $serverName = 'api.braintreegateway.com'; + break; + case 'qa': + $serverName = 'gateway.qa.braintreepayments.com'; + break; + case 'sandbox': + $serverName = 'api.sandbox.braintreegateway.com'; + break; + case 'development': + case 'integration': + default: + $serverName = 'localhost'; + break; + } + + return $serverName; + } + + public function authUrl() + { + switch($this->_environment) { + case 'production': + $serverName = 'https://auth.venmo.com'; + break; + case 'qa': + $serverName = 'https://auth.qa.venmo.com'; + break; + case 'sandbox': + $serverName = 'https://auth.sandbox.venmo.com'; + break; + case 'development': + case 'integration': + default: + $serverName = 'http://auth.venmo.dev:9292'; + break; + } + + return $serverName; + } + + /** + * returns boolean indicating SSL is on or off for this session, + * depending on environment + * + * @access public + * @param none + * @return boolean + */ + public function sslOn() + { + switch($this->_environment) { + case 'integration': + case 'development': + $ssl = false; + break; + case 'production': + case 'qa': + case 'sandbox': + default: + $ssl = true; + break; + } + + return $ssl; + } + + /** + * log message to default logger + * + * @param string $message + * + */ + public function logMessage($message) + { + error_log('[Braintree] ' . $message); + } +} +Configuration::reset(); +class_alias('Braintree\Configuration', 'Braintree_Configuration'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/CredentialsParser.php b/modules/paypal/api/sdk/braintree/lib/Braintree/CredentialsParser.php new file mode 100644 index 000000000..d61e1aec0 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/CredentialsParser.php @@ -0,0 +1,148 @@ + $value) { + if ($kind == 'clientId') { + $this->_clientId = $value; + } + if ($kind == 'clientSecret') { + $this->_clientSecret = $value; + } + if ($kind == 'accessToken') { + $this->_accessToken = $value; + } + } + $this->parse(); + } + + /** + * + * @access protected + * @static + * @var array valid environments, used for validation + */ + private static $_validEnvironments = [ + 'development', + 'integration', + 'sandbox', + 'production', + 'qa', + ]; + + + public function parse() + { + $environments = []; + if (!empty($this->_clientId)) { + $environments[] = ['clientId', $this->_parseClientCredential('clientId', $this->_clientId, 'client_id')]; + } + if (!empty($this->_clientSecret)) { + $environments[] = ['clientSecret', $this->_parseClientCredential('clientSecret', $this->_clientSecret, 'client_secret')]; + } + if (!empty($this->_accessToken)) { + $environments[] = ['accessToken', $this->_parseAccessToken()]; + } + + $checkEnv = $environments[0]; + foreach ($environments as $env) { + if ($env[1] !== $checkEnv[1]) { + throw new Exception\Configuration( + 'Mismatched credential environments: ' . $checkEnv[0] . ' environment is ' . $checkEnv[1] . + ' and ' . $env[0] . ' environment is ' . $env[1]); + } + } + + self::assertValidEnvironment($checkEnv[1]); + $this->_environment = $checkEnv[1]; + } + + public static function assertValidEnvironment($environment) { + if (!in_array($environment, self::$_validEnvironments)) { + throw new Exception\Configuration('"' . + $environment . '" is not a valid environment.'); + } + } + + private function _parseClientCredential($credentialType, $value, $expectedValuePrefix) + { + $explodedCredential = explode('$', $value); + if (sizeof($explodedCredential) != 3) { + throw new Exception\Configuration('Incorrect ' . $credentialType . ' format. Expected: type$environment$token'); + } + + $gotValuePrefix = $explodedCredential[0]; + $environment = $explodedCredential[1]; + $token = $explodedCredential[2]; + + if ($gotValuePrefix != $expectedValuePrefix) { + throw new Exception\Configuration('Value passed for ' . $credentialType . ' is not a ' . $credentialType); + } + + return $environment; + } + + private function _parseAccessToken() + { + $accessTokenExploded = explode('$', $this->_accessToken); + if (sizeof($accessTokenExploded) != 4) { + throw new Exception\Configuration('Incorrect accessToken syntax. Expected: type$environment$merchant_id$token'); + } + + $gotValuePrefix = $accessTokenExploded[0]; + $environment = $accessTokenExploded[1]; + $merchantId = $accessTokenExploded[2]; + $token = $accessTokenExploded[3]; + + if ($gotValuePrefix != 'access_token') { + throw new Exception\Configuration('Value passed for accessToken is not an accessToken'); + } + + $this->_merchantId = $merchantId; + return $environment; + } + + public function getClientId() + { + return $this->_clientId; + } + + public function getClientSecret() + { + return $this->_clientSecret; + } + + public function getAccessToken() + { + return $this->_accessToken; + } + + public function getEnvironment() + { + return $this->_environment; + } + + public function getMerchantId() + { + return $this->_merchantId; + } +} +class_alias('Braintree\CredentialsParser', 'Braintree_CredentialsParser'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCard.php b/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCard.php new file mode 100644 index 000000000..9adba03a8 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCard.php @@ -0,0 +1,315 @@ +== More information == + * + * For more detailed information on CreditCards, see {@link http://www.braintreepayments.com/gateway/credit-card-api http://www.braintreepaymentsolutions.com/gateway/credit-card-api}
+ * For more detailed information on CreditCard verifications, see {@link http://www.braintreepayments.com/gateway/credit-card-verification-api http://www.braintreepaymentsolutions.com/gateway/credit-card-verification-api} + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read string $billingAddress + * @property-read string $bin + * @property-read string $cardType + * @property-read string $cardholderName + * @property-read string $createdAt + * @property-read string $customerId + * @property-read string $expirationDate + * @property-read string $expirationMonth + * @property-read string $expirationYear + * @property-read string $imageUrl + * @property-read string $last4 + * @property-read string $maskedNumber + * @property-read string $token + * @property-read string $updatedAt + */ +class CreditCard extends Base +{ + // Card Type + const AMEX = 'American Express'; + const CARTE_BLANCHE = 'Carte Blanche'; + const CHINA_UNION_PAY = 'China UnionPay'; + const DINERS_CLUB_INTERNATIONAL = 'Diners Club'; + const DISCOVER = 'Discover'; + const JCB = 'JCB'; + const LASER = 'Laser'; + const MAESTRO = 'Maestro'; + const MASTER_CARD = 'MasterCard'; + const SOLO = 'Solo'; + const SWITCH_TYPE = 'Switch'; + const VISA = 'Visa'; + const UNKNOWN = 'Unknown'; + + // Credit card origination location + const INTERNATIONAL = "international"; + const US = "us"; + + const PREPAID_YES = 'Yes'; + const PREPAID_NO = 'No'; + const PREPAID_UNKNOWN = 'Unknown'; + + const PAYROLL_YES = 'Yes'; + const PAYROLL_NO = 'No'; + const PAYROLL_UNKNOWN = 'Unknown'; + + const HEALTHCARE_YES = 'Yes'; + const HEALTHCARE_NO = 'No'; + const HEALTHCARE_UNKNOWN = 'Unknown'; + + const DURBIN_REGULATED_YES = 'Yes'; + const DURBIN_REGULATED_NO = 'No'; + const DURBIN_REGULATED_UNKNOWN = 'Unknown'; + + const DEBIT_YES = 'Yes'; + const DEBIT_NO = 'No'; + const DEBIT_UNKNOWN = 'Unknown'; + + const COMMERCIAL_YES = 'Yes'; + const COMMERCIAL_NO = 'No'; + const COMMERCIAL_UNKNOWN = 'Unknown'; + + const COUNTRY_OF_ISSUANCE_UNKNOWN = "Unknown"; + const ISSUING_BANK_UNKNOWN = "Unknown"; + + /* instance methods */ + /** + * returns false if default is null or false + * + * @return boolean + */ + public function isDefault() + { + return $this->default; + } + + /** + * checks whether the card is expired based on the current date + * + * @return boolean + */ + public function isExpired() + { + return $this->expired; + } + + /** + * checks whether the card is associated with venmo sdk + * + * @return boolean + */ + public function isVenmoSdk() + { + return $this->venmoSdk; + } + + /** + * sets instance properties from an array of values + * + * @access protected + * @param array $creditCardAttribs array of creditcard data + * @return void + */ + protected function _initialize($creditCardAttribs) + { + // set the attributes + $this->_attributes = $creditCardAttribs; + + // map each address into its own object + $billingAddress = isset($creditCardAttribs['billingAddress']) ? + Address::factory($creditCardAttribs['billingAddress']) : + null; + + $subscriptionArray = []; + if (isset($creditCardAttribs['subscriptions'])) { + foreach ($creditCardAttribs['subscriptions'] AS $subscription) { + $subscriptionArray[] = Subscription::factory($subscription); + } + } + + $this->_set('subscriptions', $subscriptionArray); + $this->_set('billingAddress', $billingAddress); + $this->_set('expirationDate', $this->expirationMonth . '/' . $this->expirationYear); + $this->_set('maskedNumber', $this->bin . '******' . $this->last4); + + if(isset($creditCardAttribs['verifications']) && count($creditCardAttribs['verifications']) > 0) { + $verifications = $creditCardAttribs['verifications']; + usort($verifications, [$this, '_compareCreatedAtOnVerifications']); + + $this->_set('verification', CreditCardVerification::factory($verifications[0])); + } + } + + private function _compareCreatedAtOnVerifications($verificationAttrib1, $verificationAttrib2) + { + return ($verificationAttrib2['createdAt'] < $verificationAttrib1['createdAt']) ? -1 : 1; + } + + /** + * returns false if comparing object is not a CreditCard, + * or is a CreditCard with a different id + * + * @param object $otherCreditCard customer to compare against + * @return boolean + */ + public function isEqual($otherCreditCard) + { + return !($otherCreditCard instanceof self) ? false : $this->token === $otherCreditCard->token; + } + + /** + * create a printable representation of the object as: + * ClassName[property=value, property=value] + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) .']'; + } + + /** + * factory method: returns an instance of CreditCard + * to the requesting method, with populated properties + * + * @ignore + * @return CreditCard + */ + public static function factory($attributes) + { + $defaultAttributes = [ + 'bin' => '', + 'expirationMonth' => '', + 'expirationYear' => '', + 'last4' => '', + ]; + + $instance = new self(); + $instance->_initialize(array_merge($defaultAttributes, $attributes)); + return $instance; + } + + + // static methods redirecting to gateway + + public static function create($attribs) + { + return Configuration::gateway()->creditCard()->create($attribs); + } + + public static function createNoValidate($attribs) + { + return Configuration::gateway()->creditCard()->createNoValidate($attribs); + } + + public static function createFromTransparentRedirect($queryString) + { + return Configuration::gateway()->creditCard()->createFromTransparentRedirect($queryString); + } + + public static function createCreditCardUrl() + { + return Configuration::gateway()->creditCard()->createCreditCardUrl(); + } + + public static function expired() + { + return Configuration::gateway()->creditCard()->expired(); + } + + public static function fetchExpired($ids) + { + return Configuration::gateway()->creditCard()->fetchExpired($ids); + } + + public static function expiringBetween($startDate, $endDate) + { + return Configuration::gateway()->creditCard()->expiringBetween($startDate, $endDate); + } + + public static function fetchExpiring($startDate, $endDate, $ids) + { + return Configuration::gateway()->creditCard()->fetchExpiring($startDate, $endDate, $ids); + } + + public static function find($token) + { + return Configuration::gateway()->creditCard()->find($token); + } + + public static function fromNonce($nonce) + { + return Configuration::gateway()->creditCard()->fromNonce($nonce); + } + + public static function credit($token, $transactionAttribs) + { + return Configuration::gateway()->creditCard()->credit($token, $transactionAttribs); + } + + public static function creditNoValidate($token, $transactionAttribs) + { + return Configuration::gateway()->creditCard()->creditNoValidate($token, $transactionAttribs); + } + + public static function sale($token, $transactionAttribs) + { + return Configuration::gateway()->creditCard()->sale($token, $transactionAttribs); + } + + public static function saleNoValidate($token, $transactionAttribs) + { + return Configuration::gateway()->creditCard()->saleNoValidate($token, $transactionAttribs); + } + + public static function update($token, $attributes) + { + return Configuration::gateway()->creditCard()->update($token, $attributes); + } + + public static function updateNoValidate($token, $attributes) + { + return Configuration::gateway()->creditCard()->updateNoValidate($token, $attributes); + } + + public static function updateCreditCardUrl() + { + return Configuration::gateway()->creditCard()->updateCreditCardUrl(); + } + + public static function updateFromTransparentRedirect($queryString) + { + return Configuration::gateway()->creditCard()->updateFromTransparentRedirect($queryString); + } + + public static function delete($token) + { + return Configuration::gateway()->creditCard()->delete($token); + } + + /** @return array */ + public static function allCardTypes() + { + return [ + CreditCard::AMEX, + CreditCard::CARTE_BLANCHE, + CreditCard::CHINA_UNION_PAY, + CreditCard::DINERS_CLUB_INTERNATIONAL, + CreditCard::DISCOVER, + CreditCard::JCB, + CreditCard::LASER, + CreditCard::MAESTRO, + CreditCard::MASTER_CARD, + CreditCard::SOLO, + CreditCard::SWITCH_TYPE, + CreditCard::VISA, + CreditCard::UNKNOWN + ]; + } +} +class_alias('Braintree\CreditCard', 'Braintree_CreditCard'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardGateway.php new file mode 100644 index 000000000..b632797fa --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardGateway.php @@ -0,0 +1,485 @@ +== More information == + * + * For more detailed information on CreditCards, see {@link http://www.braintreepayments.com/gateway/credit-card-api http://www.braintreepaymentsolutions.com/gateway/credit-card-api}
+ * For more detailed information on CreditCard verifications, see {@link http://www.braintreepayments.com/gateway/credit-card-verification-api http://www.braintreepaymentsolutions.com/gateway/credit-card-verification-api} + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + */ +class CreditCardGateway +{ + private $_gateway; + private $_config; + private $_http; + + public function __construct($gateway) + { + $this->_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + public function create($attribs) + { + Util::verifyKeys(self::createSignature(), $attribs); + return $this->_doCreate('/payment_methods', ['credit_card' => $attribs]); + } + + /** + * attempts the create operation assuming all data will validate + * returns a CreditCard object instead of a Result + * + * @access public + * @param array $attribs + * @return CreditCard + * @throws Exception\ValidationError + */ + public function createNoValidate($attribs) + { + $result = $this->create($attribs); + return Util::returnObjectOrThrowException(__CLASS__, $result); + } + /** + * create a customer from a TransparentRedirect operation + * + * @deprecated since version 2.3.0 + * @access public + * @param array $attribs + * @return Result\Successful|Result\Error + */ + public function createFromTransparentRedirect($queryString) + { + trigger_error("DEPRECATED: Please use TransparentRedirectRequest::confirm", E_USER_NOTICE); + $params = TransparentRedirect::parseAndValidateQueryString( + $queryString + ); + return $this->_doCreate( + '/payment_methods/all/confirm_transparent_redirect_request', + ['id' => $params['id']] + ); + } + + /** + * + * @deprecated since version 2.3.0 + * @access public + * @param none + * @return string + */ + public function createCreditCardUrl() + { + trigger_error("DEPRECATED: Please use TransparentRedirectRequest::url", E_USER_NOTICE); + return $this->_config->baseUrl() . $this->_config->merchantPath(). + '/payment_methods/all/create_via_transparent_redirect_request'; + } + + /** + * returns a ResourceCollection of expired credit cards + * @return ResourceCollection + */ + public function expired() + { + $path = $this->_config->merchantPath() . '/payment_methods/all/expired_ids'; + $response = $this->_http->post($path); + $pager = [ + 'object' => $this, + 'method' => 'fetchExpired', + 'methodArgs' => [] + ]; + + return new ResourceCollection($response, $pager); + } + + public function fetchExpired($ids) + { + $path = $this->_config->merchantPath() . "/payment_methods/all/expired"; + $response = $this->_http->post($path, ['search' => ['ids' => $ids]]); + + return Util::extractattributeasarray( + $response['paymentMethods'], + 'creditCard' + ); + } + /** + * returns a ResourceCollection of credit cards expiring between start/end + * + * @return ResourceCollection + */ + public function expiringBetween($startDate, $endDate) + { + $queryPath = $this->_config->merchantPath() . '/payment_methods/all/expiring_ids?start=' . date('mY', $startDate) . '&end=' . date('mY', $endDate); + $response = $this->_http->post($queryPath); + $pager = [ + 'object' => $this, + 'method' => 'fetchExpiring', + 'methodArgs' => [$startDate, $endDate] + ]; + + return new ResourceCollection($response, $pager); + } + + public function fetchExpiring($startDate, $endDate, $ids) + { + $queryPath = $this->_config->merchantPath() . '/payment_methods/all/expiring?start=' . date('mY', $startDate) . '&end=' . date('mY', $endDate); + $response = $this->_http->post($queryPath, ['search' => ['ids' => $ids]]); + + return Util::extractAttributeAsArray( + $response['paymentMethods'], + 'creditCard' + ); + } + + /** + * find a creditcard by token + * + * @access public + * @param string $token credit card unique id + * @return CreditCard + * @throws Exception\NotFound + */ + public function find($token) + { + $this->_validateId($token); + try { + $path = $this->_config->merchantPath() . '/payment_methods/credit_card/' . $token; + $response = $this->_http->get($path); + return CreditCard::factory($response['creditCard']); + } catch (Exception\NotFound $e) { + throw new Exception\NotFound( + 'credit card with token ' . $token . ' not found' + ); + } + + } + + /** + * Convert a payment method nonce to a credit card + * + * @access public + * @param string $nonce payment method nonce + * @return CreditCard + * @throws Exception\NotFound + */ + public function fromNonce($nonce) + { + $this->_validateId($nonce, "nonce"); + try { + $path = $this->_config->merchantPath() . '/payment_methods/from_nonce/' . $nonce; + $response = $this->_http->get($path); + return CreditCard::factory($response['creditCard']); + } catch (Exception\NotFound $e) { + throw new Exception\NotFound( + 'credit card with nonce ' . $nonce . ' locked, consumed or not found' + ); + } + + } + + /** + * create a credit on the card for the passed transaction + * + * @access public + * @param array $attribs + * @return Result\Successful|Result\Error + */ + public function credit($token, $transactionAttribs) + { + $this->_validateId($token); + return Transaction::credit( + array_merge( + $transactionAttribs, + ['paymentMethodToken' => $token] + ) + ); + } + + /** + * create a credit on this card, assuming validations will pass + * + * returns a Transaction object on success + * + * @access public + * @param array $attribs + * @return Transaction + * @throws Exception\ValidationError + */ + public function creditNoValidate($token, $transactionAttribs) + { + $result = $this->credit($token, $transactionAttribs); + return Util::returnObjectOrThrowException('Braintree\Transaction', $result); + } + + /** + * create a new sale for the current card + * + * @param string $token + * @param array $transactionAttribs + * @return Result\Successful|Result\Error + * @see Transaction::sale() + */ + public function sale($token, $transactionAttribs) + { + $this->_validateId($token); + return Transaction::sale( + array_merge( + $transactionAttribs, + ['paymentMethodToken' => $token] + ) + ); + } + + /** + * create a new sale using this card, assuming validations will pass + * + * returns a Transaction object on success + * + * @access public + * @param array $transactionAttribs + * @param string $token + * @return Transaction + * @throws Exception\ValidationsFailed + * @see Transaction::sale() + */ + public function saleNoValidate($token, $transactionAttribs) + { + $result = $this->sale($token, $transactionAttribs); + return Util::returnObjectOrThrowException('Braintree\Transaction', $result); + } + + /** + * updates the creditcard record + * + * if calling this method in context, $token + * is the 2nd attribute. $token is not sent in object context. + * + * @access public + * @param array $attributes + * @param string $token (optional) + * @return Result\Successful|Result\Error + */ + public function update($token, $attributes) + { + Util::verifyKeys(self::updateSignature(), $attributes); + $this->_validateId($token); + return $this->_doUpdate('put', '/payment_methods/credit_card/' . $token, ['creditCard' => $attributes]); + } + + /** + * update a creditcard record, assuming validations will pass + * + * if calling this method in context, $token + * is the 2nd attribute. $token is not sent in object context. + * returns a CreditCard object on success + * + * @access public + * @param array $attributes + * @param string $token + * @return CreditCard + * @throws Exception\ValidationsFailed + */ + public function updateNoValidate($token, $attributes) + { + $result = $this->update($token, $attributes); + return Util::returnObjectOrThrowException(__CLASS__, $result); + } + /** + * + * @access public + * @param none + * @return string + */ + public function updateCreditCardUrl() + { + trigger_error("DEPRECATED: Please use TransparentRedirectRequest::url", E_USER_NOTICE); + return $this->_config->baseUrl() . $this->_config->merchantPath() . + '/payment_methods/all/update_via_transparent_redirect_request'; + } + + /** + * update a customer from a TransparentRedirect operation + * + * @deprecated since version 2.3.0 + * @access public + * @param array $attribs + * @return object + */ + public function updateFromTransparentRedirect($queryString) + { + trigger_error("DEPRECATED: Please use TransparentRedirectRequest::confirm", E_USER_NOTICE); + $params = TransparentRedirect::parseAndValidateQueryString( + $queryString + ); + return $this->_doUpdate( + 'post', + '/payment_methods/all/confirm_transparent_redirect_request', + ['id' => $params['id']] + ); + } + + public function delete($token) + { + $this->_validateId($token); + $path = $this->_config->merchantPath() . '/payment_methods/credit_card/' . $token; + $this->_http->delete($path); + return new Result\Successful(); + } + + private static function baseOptions() + { + return ['makeDefault', 'verificationMerchantAccountId', 'verifyCard', 'verificationAmount', 'venmoSdkSession']; + } + + private static function baseSignature($options) + { + return [ + 'billingAddressId', 'cardholderName', 'cvv', 'number', 'deviceSessionId', + 'expirationDate', 'expirationMonth', 'expirationYear', 'token', 'venmoSdkPaymentMethodCode', + 'deviceData', 'fraudMerchantId', 'paymentMethodNonce', + ['options' => $options], + [ + 'billingAddress' => self::billingAddressSignature() + ], + ]; + } + + public static function billingAddressSignature() + { + return [ + 'firstName', + 'lastName', + 'company', + 'countryCodeAlpha2', + 'countryCodeAlpha3', + 'countryCodeNumeric', + 'countryName', + 'extendedAddress', + 'locality', + 'region', + 'postalCode', + 'streetAddress' + ]; + } + + public static function createSignature() + { + $options = self::baseOptions(); + $options[] = "failOnDuplicatePaymentMethod"; + $signature = self::baseSignature($options); + $signature[] = 'customerId'; + return $signature; + } + + public static function updateSignature() + { + $signature = self::baseSignature(self::baseOptions()); + + $updateExistingBillingSignature = [ + [ + 'options' => [ + 'updateExisting' + ] + ] + ]; + + foreach($signature AS $key => $value) { + if(is_array($value) and array_key_exists('billingAddress', $value)) { + $signature[$key]['billingAddress'] = array_merge_recursive($value['billingAddress'], $updateExistingBillingSignature); + } + } + + return $signature; + } + + /** + * sends the create request to the gateway + * + * @ignore + * @param string $subPath + * @param array $params + * @return mixed + */ + public function _doCreate($subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->post($fullPath, $params); + + return $this->_verifyGatewayResponse($response); + } + + /** + * verifies that a valid credit card identifier is being used + * @ignore + * @param string $identifier + * @param Optional $string $identifierType type of identifier supplied, default "token" + * @throws InvalidArgumentException + */ + private function _validateId($identifier = null, $identifierType = "token") + { + if (empty($identifier)) { + throw new InvalidArgumentException( + 'expected credit card id to be set' + ); + } + if (!preg_match('/^[0-9A-Za-z_-]+$/', $identifier)) { + throw new InvalidArgumentException( + $identifier . ' is an invalid credit card ' . $identifierType . '.' + ); + } + } + + /** + * sends the update request to the gateway + * + * @ignore + * @param string $url + * @param array $params + * @return mixed + */ + private function _doUpdate($httpVerb, $subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->$httpVerb($fullPath, $params); + return $this->_verifyGatewayResponse($response); + } + + /** + * generic method for validating incoming gateway responses + * + * creates a new CreditCard object and encapsulates + * it inside a Result\Successful object, or + * encapsulates a Errors object inside a Result\Error + * alternatively, throws an Unexpected exception if the response is invalid + * + * @ignore + * @param array $response gateway response values + * @return Result\Successful|Result\Error + * @throws Exception\Unexpected + */ + private function _verifyGatewayResponse($response) + { + if (isset($response['creditCard'])) { + // return a populated instance of Address + return new Result\Successful( + CreditCard::factory($response['creditCard']) + ); + } elseif (isset($response['apiErrorResponse'])) { + return new Result\Error($response['apiErrorResponse']); + } else { + throw new Exception\Unexpected( + "Expected address or apiErrorResponse" + ); + } + } +} +class_alias('Braintree\CreditCardGateway', 'Braintree_CreditCardGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerification.php b/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerification.php new file mode 100644 index 000000000..ab9075c5c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerification.php @@ -0,0 +1,43 @@ +creditCardVerification()->create($attributes); + } + + public static function fetch($query, $ids) + { + return Configuration::gateway()->creditCardVerification()->fetch($query, $ids); + } + + public static function search($query) + { + return Configuration::gateway()->creditCardVerification()->search($query); + } + + public static function createSignature() + { + return [ + ['options' => ['amount', 'merchantAccountId']], + ['creditCard' => + [ + 'cardholderName', 'cvv', 'number', + 'expirationDate', 'expirationMonth', 'expirationYear', + ['billingAddress' => CreditCardGateway::billingAddressSignature()] + ] + ]]; + } +} +class_alias('Braintree\CreditCardVerification', 'Braintree_CreditCardVerification'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerificationGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerificationGateway.php new file mode 100644 index 000000000..869bd6140 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerificationGateway.php @@ -0,0 +1,74 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + public function create($attributes) + { + $response = $this->_http->post($this->_config->merchantPath() . "/verifications", ['verification' => $attributes]); + return $this->_verifyGatewayResponse($response); + } + + private function _verifyGatewayResponse($response) + { + + if(isset($response['verification'])){ + return new Result\Successful( + CreditCardVerification::factory($response['verification']) + ); + } else if (isset($response['apiErrorResponse'])) { + return new Result\Error($response['apiErrorResponse']); + } else { + throw new Exception\Unexpected( + "Expected transaction or apiErrorResponse" + ); + } + } + + public function fetch($query, $ids) + { + $criteria = []; + foreach ($query as $term) { + $criteria[$term->name] = $term->toparam(); + } + $criteria["ids"] = CreditCardVerificationSearch::ids()->in($ids)->toparam(); + $path = $this->_config->merchantPath() . '/verifications/advanced_search'; + $response = $this->_http->post($path, ['search' => $criteria]); + + return Util::extractattributeasarray( + $response['creditCardVerifications'], + 'verification' + ); + } + + public function search($query) + { + $criteria = []; + foreach ($query as $term) { + $criteria[$term->name] = $term->toparam(); + } + + $path = $this->_config->merchantPath() . '/verifications/advanced_search_ids'; + $response = $this->_http->post($path, ['search' => $criteria]); + $pager = [ + 'object' => $this, + 'method' => 'fetch', + 'methodArgs' => [$query] + ]; + + return new ResourceCollection($response, $pager); + } +} +class_alias('Braintree\CreditCardVerificationGateway', 'Braintree_CreditCardVerificationGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerificationSearch.php b/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerificationSearch.php new file mode 100644 index 000000000..2dadff94f --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/CreditCardVerificationSearch.php @@ -0,0 +1,56 @@ +== More information == + * + * For more detailed information on Customers, see {@link http://www.braintreepayments.com/gateway/customer-api http://www.braintreepaymentsolutions.com/gateway/customer-api} + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read array $addresses + * @property-read array $paymentMethods + * @property-read string $company + * @property-read string $createdAt + * @property-read array $creditCards + * @property-read array $paypalAccounts + * @property-read array $applePayCards + * @property-read array $androidPayCards + * @property-read array $amexExpressCheckoutCards + * @property-read array $venmoAccounts + * @property-read array $coinbaseAccounts + * @property-read array $customFields custom fields passed with the request + * @property-read string $email + * @property-read string $fax + * @property-read string $firstName + * @property-read string $id + * @property-read string $lastName + * @property-read string $phone + * @property-read string $updatedAt + * @property-read string $website + */ +class Customer extends Base +{ + /** + * + * @return Customer[] + */ + public static function all() + { + return Configuration::gateway()->customer()->all(); + } + + /** + * + * @param string $query + * @param int[] $ids + * @return Customer|Customer[] + */ + public static function fetch($query, $ids) + { + return Configuration::gateway()->customer()->fetch($query, $ids); + } + + /** + * + * @param array $attribs + * @return Customer + */ + public static function create($attribs = []) + { + return Configuration::gateway()->customer()->create($attribs); + } + + /** + * + * @param array $attribs + * @return Customer + */ + public static function createNoValidate($attribs = []) + { + return Configuration::gateway()->customer()->createNoValidate($attribs); + } + + /** + * @deprecated since version 2.3.0 + * @param string $queryString + * @return Result\Successful + */ + public static function createFromTransparentRedirect($queryString) + { + return Configuration::gateway()->customer()->createFromTransparentRedirect($queryString); + } + + /** + * @deprecated since version 2.3.0 + * @return string + */ + public static function createCustomerUrl() + { + return Configuration::gateway()->customer()->createCustomerUrl(); + } + + /** + * + * @throws Exception\NotFound + * @param string $id customer id + * @return Customer + */ + public static function find($id) + { + return Configuration::gateway()->customer()->find($id); + } + + /** + * + * @param int $customerId + * @param array $transactionAttribs + * @return Result\Successful|Result\Error + */ + public static function credit($customerId, $transactionAttribs) + { + return Configuration::gateway()->customer()->credit($customerId, $transactionAttribs); + } + + /** + * + * @throws Exception\ValidationError + * @param type $customerId + * @param type $transactionAttribs + * @return Transaction + */ + public static function creditNoValidate($customerId, $transactionAttribs) + { + return Configuration::gateway()->customer()->creditNoValidate($customerId, $transactionAttribs); + } + + /** + * + * @throws Exception on invalid id or non-200 http response code + * @param int $customerId + * @return Result\Successful + */ + public static function delete($customerId) + { + return Configuration::gateway()->customer()->delete($customerId); + } + + /** + * + * @param int $customerId + * @param array $transactionAttribs + * @return Transaction + */ + public static function sale($customerId, $transactionAttribs) + { + return Configuration::gateway()->customer()->sale($customerId, $transactionAttribs); + } + + /** + * + * @param int $customerId + * @param array $transactionAttribs + * @return Transaction + */ + public static function saleNoValidate($customerId, $transactionAttribs) + { + return Configuration::gateway()->customer()->saleNoValidate($customerId, $transactionAttribs); + } + + /** + * + * @throws InvalidArgumentException + * @param string $query + * @return ResourceCollection + */ + public static function search($query) + { + return Configuration::gateway()->customer()->search($query); + } + + /** + * + * @throws Exception\Unexpected + * @param int $customerId + * @param array $attributes + * @return Result\Successful|Result\Error + */ + public static function update($customerId, $attributes) + { + return Configuration::gateway()->customer()->update($customerId, $attributes); + } + + /** + * + * @throws Exception\Unexpected + * @param int $customerId + * @param array $attributes + * @return CustomerGateway + */ + public static function updateNoValidate($customerId, $attributes) + { + return Configuration::gateway()->customer()->updateNoValidate($customerId, $attributes); + } + + /** + * + * @deprecated since version 2.3.0 + * @return string + */ + public static function updateCustomerUrl() + { + return Configuration::gateway()->customer()->updateCustomerUrl(); + } + + /** + * + * @deprecated since version 2.3.0 + * @param string $queryString + * @return Result\Successful|Result\Error + */ + public static function updateFromTransparentRedirect($queryString) + { + return Configuration::gateway()->customer()->updateFromTransparentRedirect($queryString); + } + + /* instance methods */ + + /** + * sets instance properties from an array of values + * + * @ignore + * @access protected + * @param array $customerAttribs array of customer data + */ + protected function _initialize($customerAttribs) + { + $this->_attributes = $customerAttribs; + + $addressArray = []; + if (isset($customerAttribs['addresses'])) { + + foreach ($customerAttribs['addresses'] AS $address) { + $addressArray[] = Address::factory($address); + } + } + $this->_set('addresses', $addressArray); + + $creditCardArray = []; + if (isset($customerAttribs['creditCards'])) { + foreach ($customerAttribs['creditCards'] AS $creditCard) { + $creditCardArray[] = CreditCard::factory($creditCard); + } + } + $this->_set('creditCards', $creditCardArray); + + $coinbaseAccountArray = []; + if (isset($customerAttribs['coinbaseAccounts'])) { + foreach ($customerAttribs['coinbaseAccounts'] AS $coinbaseAccount) { + $coinbaseAccountArray[] = CoinbaseAccount::factory($coinbaseAccount); + } + } + $this->_set('coinbaseAccounts', $coinbaseAccountArray); + + $paypalAccountArray = []; + if (isset($customerAttribs['paypalAccounts'])) { + foreach ($customerAttribs['paypalAccounts'] AS $paypalAccount) { + $paypalAccountArray[] = PayPalAccount::factory($paypalAccount); + } + } + $this->_set('paypalAccounts', $paypalAccountArray); + + $applePayCardArray = []; + if (isset($customerAttribs['applePayCards'])) { + foreach ($customerAttribs['applePayCards'] AS $applePayCard) { + $applePayCardArray[] = ApplePayCard::factory($applePayCard); + } + } + $this->_set('applePayCards', $applePayCardArray); + + $androidPayCardArray = []; + if (isset($customerAttribs['androidPayCards'])) { + foreach ($customerAttribs['androidPayCards'] AS $androidPayCard) { + $androidPayCardArray[] = AndroidPayCard::factory($androidPayCard); + } + } + $this->_set('androidPayCards', $androidPayCardArray); + + $amexExpressCheckoutCardArray = []; + if (isset($customerAttribs['amexExpressCheckoutCards'])) { + foreach ($customerAttribs['amexExpressCheckoutCards'] AS $amexExpressCheckoutCard) { + $amexExpressCheckoutCardArray[] = AmexExpressCheckoutCard::factory($amexExpressCheckoutCard); + } + } + $this->_set('amexExpressCheckoutCards', $amexExpressCheckoutCardArray); + + $venmoAccountArray = array(); + if (isset($customerAttribs['venmoAccounts'])) { + foreach ($customerAttribs['venmoAccounts'] AS $venmoAccount) { + $venmoAccountArray[] = VenmoAccount::factory($venmoAccount); + } + } + $this->_set('venmoAccounts', $venmoAccountArray); + + $this->_set('paymentMethods', array_merge( + $this->creditCards, + $this->paypalAccounts, + $this->applePayCards, + $this->coinbaseAccounts, + $this->androidPayCards, + $this->amexExpressCheckoutCards, + $this->venmoAccounts + )); + } + + /** + * returns a string representation of the customer + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) .']'; + } + + /** + * returns false if comparing object is not a Customer, + * or is a Customer with a different id + * + * @param object $otherCust customer to compare against + * @return boolean + */ + public function isEqual($otherCust) + { + return !($otherCust instanceof Customer) ? false : $this->id === $otherCust->id; + } + + /** + * returns an array containt all of the customer's payment methods + * + * @deprecated since version 3.1.0 - use the paymentMethods property directly + * + * @return array + */ + public function paymentMethods() + { + return $this->paymentMethods; + } + + /** + * returns the customer's default payment method + * + * @return CreditCard|PayPalAccount + */ + public function defaultPaymentMethod() + { + $defaultPaymentMethods = array_filter($this->paymentMethods, 'Braintree\Customer::_defaultPaymentMethodFilter'); + return current($defaultPaymentMethods); + } + + public static function _defaultPaymentMethodFilter($paymentMethod) + { + return $paymentMethod->isDefault(); + } + + /* private class properties */ + + /** + * @access protected + * @var array registry of customer data + */ + protected $_attributes = [ + 'addresses' => '', + 'company' => '', + 'creditCards' => '', + 'email' => '', + 'fax' => '', + 'firstName' => '', + 'id' => '', + 'lastName' => '', + 'phone' => '', + 'createdAt' => '', + 'updatedAt' => '', + 'website' => '', + ]; + + /** + * factory method: returns an instance of Customer + * to the requesting method, with populated properties + * + * @ignore + * @param array $attributes + * @return Customer + */ + public static function factory($attributes) + { + $instance = new Customer(); + $instance->_initialize($attributes); + return $instance; + } +} +class_alias('Braintree\Customer', 'Braintree_Customer'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/CustomerGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/CustomerGateway.php new file mode 100644 index 000000000..946691518 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/CustomerGateway.php @@ -0,0 +1,623 @@ +== More information == + * + * For more detailed information on Customers, see {@link http://www.braintreepayments.com/gateway/customer-api http://www.braintreepaymentsolutions.com/gateway/customer-api} + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + */ +class CustomerGateway +{ + private $_gateway; + private $_config; + private $_http; + + public function __construct($gateway) + { + $this->_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + public function all() + { + $path = $this->_config->merchantPath() . '/customers/advanced_search_ids'; + $response = $this->_http->post($path); + $pager = [ + 'object' => $this, + 'method' => 'fetch', + 'methodArgs' => [[]] + ]; + + return new ResourceCollection($response, $pager); + } + + public function fetch($query, $ids) + { + $criteria = []; + foreach ($query as $term) { + $criteria[$term->name] = $term->toparam(); + } + $criteria["ids"] = CustomerSearch::ids()->in($ids)->toparam(); + $path = $this->_config->merchantPath() . '/customers/advanced_search'; + $response = $this->_http->post($path, ['search' => $criteria]); + + return Util::extractattributeasarray( + $response['customers'], + 'customer' + ); + } + + /** + * Creates a customer using the given +attributes+. If :id is not passed, + * the gateway will generate it. + * + * + * $result = Customer::create(array( + * 'first_name' => 'John', + * 'last_name' => 'Smith', + * 'company' => 'Smith Co.', + * 'email' => 'john@smith.com', + * 'website' => 'www.smithco.com', + * 'fax' => '419-555-1234', + * 'phone' => '614-555-1234' + * )); + * if($result->success) { + * echo 'Created customer ' . $result->customer->id; + * } else { + * echo 'Could not create customer, see result->errors'; + * } + * + * + * @access public + * @param array $attribs + * @return Braintree_Result_Successful|Braintree_Result_Error + */ + public function create($attribs = []) + { + Util::verifyKeys(self::createSignature(), $attribs); + return $this->_doCreate('/customers', ['customer' => $attribs]); + } + + /** + * attempts the create operation assuming all data will validate + * returns a Customer object instead of a Result + * + * @access public + * @param array $attribs + * @return Customer + * @throws Exception\ValidationError + */ + public function createNoValidate($attribs = []) + { + $result = $this->create($attribs); + return Util::returnObjectOrThrowException(__CLASS__, $result); + } + /** + * create a customer from a TransparentRedirect operation + * + * @deprecated since version 2.3.0 + * @access public + * @param array $attribs + * @return Customer + */ + public function createFromTransparentRedirect($queryString) + { + trigger_error("DEPRECATED: Please use TransparentRedirectRequest::confirm", E_USER_NOTICE); + $params = TransparentRedirect::parseAndValidateQueryString( + $queryString + ); + return $this->_doCreate( + '/customers/all/confirm_transparent_redirect_request', + ['id' => $params['id']] + ); + } + + /** + * + * @deprecated since version 2.3.0 + * @access public + * @param none + * @return string + */ + public function createCustomerUrl() + { + trigger_error("DEPRECATED: Please use TransparentRedirectRequest::url", E_USER_NOTICE); + return $this->_config->baseUrl() . $this->_config->merchantPath() . + '/customers/all/create_via_transparent_redirect_request'; + } + + + /** + * creates a full array signature of a valid create request + * @return array gateway create request format + */ + public static function createSignature() + { + + $creditCardSignature = CreditCardGateway::createSignature(); + unset($creditCardSignature[array_search('customerId', $creditCardSignature)]); + $signature = [ + 'id', 'company', 'email', 'fax', 'firstName', + 'lastName', 'phone', 'website', 'deviceData', + 'deviceSessionId', 'fraudMerchantId', 'paymentMethodNonce', + ['creditCard' => $creditCardSignature], + ['customFields' => ['_anyKey_']], + ]; + return $signature; + } + + /** + * creates a full array signature of a valid update request + * @return array update request format + */ + public static function updateSignature() + { + $creditCardSignature = CreditCardGateway::updateSignature(); + + foreach($creditCardSignature AS $key => $value) { + if(is_array($value) and array_key_exists('options', $value)) { + array_push($creditCardSignature[$key]['options'], 'updateExistingToken'); + } + } + + $signature = [ + 'id', 'company', 'email', 'fax', 'firstName', + 'lastName', 'phone', 'website', 'deviceData', + 'deviceSessionId', 'fraudMerchantId', 'paymentMethodNonce', + ['creditCard' => $creditCardSignature], + ['customFields' => ['_anyKey_']], + ]; + return $signature; + } + + + /** + * find a customer by id + * + * @access public + * @param string id customer Id + * @return Customer|boolean The customer object or false if the request fails. + * @throws Exception\NotFound + */ + public function find($id) + { + $this->_validateId($id); + try { + $path = $this->_config->merchantPath() . '/customers/' . $id; + $response = $this->_http->get($path); + return Customer::factory($response['customer']); + } catch (Exception\NotFound $e) { + throw new Exception\NotFound( + 'customer with id ' . $id . ' not found' + ); + } + } + + /** + * credit a customer for the passed transaction + * + * @access public + * @param int $customerId + * @param array $transactionAttribs + * @return Result\Successful|Result\Error + */ + public function credit($customerId, $transactionAttribs) + { + $this->_validateId($customerId); + return Transaction::credit( + array_merge($transactionAttribs, + ['customerId' => $customerId] + ) + ); + } + + /** + * credit a customer, assuming validations will pass + * + * returns a Transaction object on success + * + * @access public + * @param int $customerId + * @param array $transactionAttribs + * @return Transaction + * @throws Exception\ValidationError + */ + public function creditNoValidate($customerId, $transactionAttribs) + { + $result = $this->credit($customerId, $transactionAttribs); + return Util::returnObjectOrThrowException('Braintree\Transaction', $result); + } + + /** + * delete a customer by id + * + * @param string $customerId + */ + public function delete($customerId) + { + $this->_validateId($customerId); + $path = $this->_config->merchantPath() . '/customers/' . $customerId; + $this->_http->delete($path); + return new Result\Successful(); + } + + /** + * create a new sale for a customer + * + * @param string $customerId + * @param array $transactionAttribs + * @return Result\Successful|Result\Error + * @see Transaction::sale() + */ + public function sale($customerId, $transactionAttribs) + { + $this->_validateId($customerId); + return Transaction::sale( + array_merge($transactionAttribs, + ['customerId' => $customerId] + ) + ); + } + + /** + * create a new sale for a customer, assuming validations will pass + * + * returns a Transaction object on success + * @access public + * @param string $customerId + * @param array $transactionAttribs + * @return Transaction + * @throws Exception\ValidationsFailed + * @see Transaction::sale() + */ + public function saleNoValidate($customerId, $transactionAttribs) + { + $result = $this->sale($customerId, $transactionAttribs); + return Util::returnObjectOrThrowException('Braintree\Transaction', $result); + } + + /** + * Returns a ResourceCollection of customers matching the search query. + * + * If query is a string, the search will be a basic search. + * If query is a hash, the search will be an advanced search. + * For more detailed information and examples, see {@link http://www.braintreepayments.com/gateway/customer-api#searching http://www.braintreepaymentsolutions.com/gateway/customer-api} + * + * @param mixed $query search query + * @return ResourceCollection + * @throws InvalidArgumentException + */ + public function search($query) + { + $criteria = []; + foreach ($query as $term) { + $result = $term->toparam(); + if(is_null($result) || empty($result)) { + throw new InvalidArgumentException('Operator must be provided'); + } + + $criteria[$term->name] = $term->toparam(); + } + + $path = $this->_config->merchantPath() . '/customers/advanced_search_ids'; + $response = $this->_http->post($path, ['search' => $criteria]); + $pager = [ + 'object' => $this, + 'method' => 'fetch', + 'methodArgs' => [$query] + ]; + + return new ResourceCollection($response, $pager); + } + + /** + * updates the customer record + * + * if calling this method in static context, customerId + * is the 2nd attribute. customerId is not sent in object context. + * + * @access public + * @param string $customerId (optional) + * @param array $attributes + * @return Result\Successful|Result\Error + */ + public function update($customerId, $attributes) + { + Util::verifyKeys(self::updateSignature(), $attributes); + $this->_validateId($customerId); + return $this->_doUpdate( + 'put', + '/customers/' . $customerId, + ['customer' => $attributes] + ); + } + + /** + * update a customer record, assuming validations will pass + * + * if calling this method in static context, customerId + * is the 2nd attribute. customerId is not sent in object context. + * returns a Customer object on success + * + * @access public + * @param string $customerId + * @param array $attributes + * @return Customer + * @throws Exception\ValidationsFailed + */ + public function updateNoValidate($customerId, $attributes) + { + $result = $this->update($customerId, $attributes); + return Util::returnObjectOrThrowException(__CLASS__, $result); + } + /** + * + * @deprecated since version 2.3.0 + * @access public + * @return string + */ + public function updateCustomerUrl() + { + trigger_error("DEPRECATED: Please use TransparentRedirectRequest::url", E_USER_NOTICE); + return $this->_config->baseUrl() . $this->_config->merchantPath() . + '/customers/all/update_via_transparent_redirect_request'; + } + + /** + * update a customer from a TransparentRedirect operation + * + * @deprecated since version 2.3.0 + * @access public + * @param string $queryString + * @return object + */ + public function updateFromTransparentRedirect($queryString) + { + trigger_error("DEPRECATED: Please use TransparentRedirectRequest::confirm", E_USER_NOTICE); + $params = TransparentRedirect::parseAndValidateQueryString( + $queryString + ); + return $this->_doUpdate( + 'post', + '/customers/all/confirm_transparent_redirect_request', + ['id' => $params['id']] + ); + } + + /* instance methods */ + + /** + * sets instance properties from an array of values + * + * @ignore + * @access protected + * @param array $customerAttribs array of customer data + * @return void + */ + protected function _initialize($customerAttribs) + { + // set the attributes + $this->_attributes = $customerAttribs; + + // map each address into its own object + $addressArray = []; + if (isset($customerAttribs['addresses'])) { + + foreach ($customerAttribs['addresses'] AS $address) { + $addressArray[] = Address::factory($address); + } + } + $this->_set('addresses', $addressArray); + + // map each creditCard into its own object + $creditCardArray = []; + if (isset($customerAttribs['creditCards'])) { + foreach ($customerAttribs['creditCards'] AS $creditCard) { + $creditCardArray[] = CreditCard::factory($creditCard); + } + } + $this->_set('creditCards', $creditCardArray); + + // map each coinbaseAccount into its own object + $coinbaseAccountArray = []; + if (isset($customerAttribs['coinbaseAccounts'])) { + foreach ($customerAttribs['coinbaseAccounts'] AS $coinbaseAccount) { + $coinbaseAccountArray[] = CoinbaseAccount::factory($coinbaseAccount); + } + } + $this->_set('coinbaseAccounts', $coinbaseAccountArray); + + // map each paypalAccount into its own object + $paypalAccountArray = []; + if (isset($customerAttribs['paypalAccounts'])) { + foreach ($customerAttribs['paypalAccounts'] AS $paypalAccount) { + $paypalAccountArray[] = PayPalAccount::factory($paypalAccount); + } + } + $this->_set('paypalAccounts', $paypalAccountArray); + + // map each applePayCard into its own object + $applePayCardArray = []; + if (isset($customerAttribs['applePayCards'])) { + foreach ($customerAttribs['applePayCards'] AS $applePayCard) { + $applePayCardArray[] = ApplePayCard::factory($applePayCard); + } + } + $this->_set('applePayCards', $applePayCardArray); + + // map each androidPayCard into its own object + $androidPayCardArray = []; + if (isset($customerAttribs['androidPayCards'])) { + foreach ($customerAttribs['androidPayCards'] AS $androidPayCard) { + $androidPayCardArray[] = AndroidPayCard::factory($androidPayCard); + } + } + $this->_set('androidPayCards', $androidPayCardArray); + + $this->_set('paymentMethods', array_merge($this->creditCards, $this->paypalAccounts, $this->applePayCards, $this->coinbaseAccounts, $this->androidPayCards)); + } + + /** + * returns a string representation of the customer + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) .']'; + } + + /** + * returns false if comparing object is not a Customer, + * or is a Customer with a different id + * + * @param object $otherCust customer to compare against + * @return boolean + */ + public function isEqual($otherCust) + { + return !($otherCust instanceof Customer) ? false : $this->id === $otherCust->id; + } + + /** + * returns an array containt all of the customer's payment methods + * + * @return array + */ + public function paymentMethods() + { + return $this->paymentMethods; + } + + /** + * returns the customer's default payment method + * + * @return CreditCard|PayPalAccount|ApplePayCard|AndroidPayCard + */ + public function defaultPaymentMethod() + { + $defaultPaymentMethods = array_filter($this->paymentMethods, 'Braintree\\Customer::_defaultPaymentMethodFilter'); + return current($defaultPaymentMethods); + } + + public static function _defaultPaymentMethodFilter($paymentMethod) + { + return $paymentMethod->isDefault(); + } + + /* private class properties */ + + /** + * @access protected + * @var array registry of customer data + */ + protected $_attributes = [ + 'addresses' => '', + 'company' => '', + 'creditCards' => '', + 'email' => '', + 'fax' => '', + 'firstName' => '', + 'id' => '', + 'lastName' => '', + 'phone' => '', + 'createdAt' => '', + 'updatedAt' => '', + 'website' => '', + ]; + + /** + * sends the create request to the gateway + * + * @ignore + * @param string $subPath + * @param array $params + * @return mixed + */ + public function _doCreate($subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->post($fullPath, $params); + + return $this->_verifyGatewayResponse($response); + } + + /** + * verifies that a valid customer id is being used + * @ignore + * @param string customer id + * @throws InvalidArgumentException + */ + private function _validateId($id = null) { + if (is_null($id)) { + throw new InvalidArgumentException( + 'expected customer id to be set' + ); + } + if (!preg_match('/^[0-9A-Za-z_-]+$/', $id)) { + throw new InvalidArgumentException( + $id . ' is an invalid customer id.' + ); + } + } + + + /* private class methods */ + + /** + * sends the update request to the gateway + * + * @ignore + * @param string $subPath + * @param array $params + * @return mixed + */ + private function _doUpdate($httpVerb, $subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->$httpVerb($fullPath, $params); + + return $this->_verifyGatewayResponse($response); + } + + /** + * generic method for validating incoming gateway responses + * + * creates a new Customer object and encapsulates + * it inside a Result\Successful object, or + * encapsulates a Errors object inside a Result\Error + * alternatively, throws an Unexpected exception if the response is invalid. + * + * @ignore + * @param array $response gateway response values + * @return Result\Successful|Result\Error + * @throws Exception\Unexpected + */ + private function _verifyGatewayResponse($response) + { + if (isset($response['customer'])) { + // return a populated instance of Customer + return new Result\Successful( + Customer::factory($response['customer']) + ); + } else if (isset($response['apiErrorResponse'])) { + return new Result\Error($response['apiErrorResponse']); + } else { + throw new Exception\Unexpected( + "Expected customer or apiErrorResponse" + ); + } + } +} +class_alias('Braintree\CustomerGateway', 'Braintree_CustomerGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/CustomerSearch.php b/modules/paypal/api/sdk/braintree/lib/Braintree/CustomerSearch.php new file mode 100644 index 000000000..3bc734e4f --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/CustomerSearch.php @@ -0,0 +1,34 @@ +_attributes = $disbursementAttribs; + $this->merchantAccountDetails = $disbursementAttribs['merchantAccount']; + + if (isset($disbursementAttribs['merchantAccount'])) { + $this->_set('merchantAccount', + MerchantAccount::factory($disbursementAttribs['merchantAccount']) + ); + } + } + + public function transactions() + { + $collection = Transaction::search([ + TransactionSearch::ids()->in($this->transactionIds), + ]); + + return $collection; + } + + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + public function __toString() + { + $display = [ + 'id', 'merchantAccountDetails', 'exceptionMessage', 'amount', + 'disbursementDate', 'followUpAction', 'retry', 'success', + 'transactionIds' + ]; + + $displayAttributes = []; + foreach ($display AS $attrib) { + $displayAttributes[$attrib] = $this->$attrib; + } + return __CLASS__ . '[' . + Util::attributesToString($displayAttributes) .']'; + } +} +class_alias('Braintree\Disbursement', 'Braintree_Disbursement'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/DisbursementDetails.php b/modules/paypal/api/sdk/braintree/lib/Braintree/DisbursementDetails.php new file mode 100644 index 000000000..7eb59289b --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/DisbursementDetails.php @@ -0,0 +1,25 @@ +disbursementDate); + } +} +class_alias('Braintree\DisbursementDetails', 'Braintree_DisbursementDetails'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Discount.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Discount.php new file mode 100644 index 000000000..da780d06d --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Discount.php @@ -0,0 +1,21 @@ +_initialize($attributes); + return $instance; + } + + + // static methods redirecting to gateway + + public static function all() + { + return Configuration::gateway()->discount()->all(); + } +} +class_alias('Braintree\Discount', 'Braintree_Discount'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/DiscountGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/DiscountGateway.php new file mode 100644 index 000000000..d26672ac3 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/DiscountGateway.php @@ -0,0 +1,31 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + public function all() + { + $path = $this->_config->merchantPath() . '/discounts'; + $response = $this->_http->get($path); + + $discounts = ["discount" => $response['discounts']]; + + return Util::extractAttributeAsArray( + $discounts, + 'discount' + ); + } +} +class_alias('Braintree\DiscountGateway', 'Braintree_DiscountGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Dispute.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Dispute.php new file mode 100644 index 000000000..f941b939b --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Dispute.php @@ -0,0 +1,82 @@ +_attributes = $disputeAttribs; + + if (isset($disputeAttribs['transaction'])) { + $this->_set('transactionDetails', + new Dispute\TransactionDetails($disputeAttribs['transaction']) + ); + } + } + + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + public function __toString() + { + $display = [ + 'amount', 'reason', 'status', + 'replyByDate', 'receivedDate', 'currencyIsoCode' + ]; + + $displayAttributes = []; + foreach ($display AS $attrib) { + $displayAttributes[$attrib] = $this->$attrib; + } + return __CLASS__ . '[' . + Util::attributesToString($displayAttributes) .']'; + } +} +class_alias('Braintree\Dispute', 'Braintree_Dispute'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Dispute/TransactionDetails.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Dispute/TransactionDetails.php new file mode 100644 index 000000000..f0240ce3d --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Dispute/TransactionDetails.php @@ -0,0 +1,27 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/EqualityNode.php b/modules/paypal/api/sdk/braintree/lib/Braintree/EqualityNode.php new file mode 100644 index 000000000..d91e1eb7d --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/EqualityNode.php @@ -0,0 +1,12 @@ +searchTerms['is_not'] = strval($value); + return $this; + } +} +class_alias('Braintree\EqualityNode', 'Braintree_EqualityNode'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Error/Codes.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Error/Codes.php new file mode 100644 index 000000000..1b99f182d --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Error/Codes.php @@ -0,0 +1,509 @@ +_errors = + new ValidationErrorCollection($errorData); + } + + + /** + * Returns all of the validation errors at all levels of nesting in a single, flat array. + */ + public function deepAll() + { + return $this->_errors->deepAll(); + } + + /** + * Returns the total number of validation errors at all levels of nesting. For example, + *if creating a customer with a credit card and a billing address, and each of the customer, + * credit card, and billing address has 1 error, this method will return 3. + * + * @return int size + */ + public function deepSize() + { + $size = $this->_errors->deepSize(); + return $size; + } + + /** + * return errors for the passed key name + * + * @param string $key + * @return mixed + */ + public function forKey($key) + { + return $this->_errors->forKey($key); + } + + /** + * return errors for the passed html field. + * For example, $result->errors->onHtmlField("transaction[customer][last_name]") + * + * @param string $field + * @return array + */ + public function onHtmlField($field) + { + $pieces = preg_split("/[\[\]]+/", $field, 0, PREG_SPLIT_NO_EMPTY); + $errors = $this; + foreach(array_slice($pieces, 0, -1) as $key) { + $errors = $errors->forKey(Util::delimiterToCamelCase($key)); + if (!isset($errors)) { return []; } + } + $finalKey = Util::delimiterToCamelCase(end($pieces)); + return $errors->onAttribute($finalKey); + } + + /** + * Returns the errors at the given nesting level (see forKey) in a single, flat array: + * + * + * $result = Customer::create(...); + * $customerErrors = $result->errors->forKey('customer')->shallowAll(); + * + */ + public function shallowAll() + { + return $this->_errors->shallowAll(); + } + + /** + * + * @ignore + */ + public function __get($name) + { + $varName = "_$name"; + return isset($this->$varName) ? $this->$varName : null; + } + + /** + * + * @ignore + */ + public function __toString() + { + return sprintf('%s', $this->_errors); + } +} +class_alias('Braintree\Error\ErrorCollection', 'Braintree_Error_ErrorCollection'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Error/Validation.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Error/Validation.php new file mode 100644 index 000000000..7442f0c36 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Error/Validation.php @@ -0,0 +1,61 @@ +== More information == + * + * For more detailed information on Validation errors, see {@link http://www.braintreepayments.com/gateway/validation-errors http://www.braintreepaymentsolutions.com/gateway/validation-errors} + * + * @package Braintree + * @subpackage Error + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read string $attribute + * @property-read string $code + * @property-read string $message + */ +class Validation +{ + private $_attribute; + private $_code; + private $_message; + + /** + * @ignore + * @param array $attributes + */ + public function __construct($attributes) + { + $this->_initializeFromArray($attributes); + } + /** + * initializes instance properties from the keys/values of an array + * @ignore + * @access protected + * @param array $attributes array of properties to set - single level + * @return void + */ + private function _initializeFromArray($attributes) + { + foreach($attributes AS $name => $value) { + $varName = "_$name"; + $this->$varName = Util::delimiterToCamelCase($value, '_'); + } + } + + /** + * + * @ignore + */ + public function __get($name) + { + $varName = "_$name"; + return isset($this->$varName) ? $this->$varName : null; + } +} +class_alias('Braintree\Error\Validation', 'Braintree_Error_Validation'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Error/ValidationErrorCollection.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Error/ValidationErrorCollection.php new file mode 100644 index 000000000..91de9aa11 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Error/ValidationErrorCollection.php @@ -0,0 +1,132 @@ +== More information == + * + * For more detailed information on Validation errors, see {@link http://www.braintreepayments.com/gateway/validation-errors http://www.braintreepaymentsolutions.com/gateway/validation-errors} + * + * @package Braintree + * @subpackage Error + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read array $errors + * @property-read array $nested + */ +class ValidationErrorCollection extends Collection +{ + private $_errors = []; + private $_nested = []; + + /** + * @ignore + */ + public function __construct($data) + { + foreach($data AS $key => $errorData) + // map errors to new collections recursively + if ($key == 'errors') { + foreach ($errorData AS $error) { + $this->_errors[] = new Validation($error); + } + } else { + $this->_nested[$key] = new ValidationErrorCollection($errorData); + } + + } + + public function deepAll() + { + $validationErrors = array_merge([], $this->_errors); + foreach($this->_nested as $nestedErrors) + { + $validationErrors = array_merge($validationErrors, $nestedErrors->deepAll()); + } + return $validationErrors; + } + + public function deepSize() + { + $total = sizeof($this->_errors); + foreach($this->_nested as $_nestedErrors) + { + $total = $total + $_nestedErrors->deepSize(); + } + return $total; + } + + public function forIndex($index) + { + return $this->forKey("index" . $index); + } + + public function forKey($key) + { + return isset($this->_nested[$key]) ? $this->_nested[$key] : null; + } + + public function onAttribute($attribute) + { + $matches = []; + foreach ($this->_errors AS $key => $error) { + if($error->attribute == $attribute) { + $matches[] = $error; + } + } + return $matches; + } + + + public function shallowAll() + { + return $this->_errors; + } + + /** + * + * @ignore + */ + public function __get($name) + { + $varName = "_$name"; + return isset($this->$varName) ? $this->$varName : null; + } + + /** + * @ignore + */ + public function __toString() + { + $output = []; + + // TODO: implement scope + if (!empty($this->_errors)) { + $output[] = $this->_inspect($this->_errors); + } + if (!empty($this->_nested)) { + foreach ($this->_nested AS $key => $values) { + $output[] = $this->_inspect($this->_nested); + } + } + return join(', ', $output); + } + + /** + * @ignore + */ + private function _inspect($errors, $scope = null) + { + $eOutput = '[' . __CLASS__ . '/errors:['; + foreach($errors AS $error => $errorObj) { + $outputErrs[] = "({$errorObj->error['code']} {$errorObj->error['message']})"; + } + $eOutput .= join(', ', $outputErrs) . ']]'; + + return $eOutput; + } +} +class_alias('Braintree\Error\ValidationErrorCollection', 'Braintree_Error_ValidationErrorCollection'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Error/index.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Error/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Error/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/EuropeBankAccount.php b/modules/paypal/api/sdk/braintree/lib/Braintree/EuropeBankAccount.php new file mode 100644 index 000000000..cae935443 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/EuropeBankAccount.php @@ -0,0 +1,68 @@ +== More information == + * + * See {@link https://developers.braintreepayments.com/javascript+php}
+ * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read string $account-holder-name + * @property-read string $bic + * @property-read string $customerId + * @property-read string $default + * @property-read string $image-url + * @property-read string $mandate-reference-number + * @property-read string $masked-iban + * @property-read string $token + */ +class EuropeBankAccount extends Base +{ + + /* instance methods */ + /** + * returns false if default is null or false + * + * @return boolean + */ + public function isDefault() + { + return $this->default; + } + + /** + * factory method: returns an instance of EuropeBankAccount + * to the requesting method, with populated properties + * + * @ignore + * @return EuropeBankAccount + */ + public static function factory($attributes) + { + $defaultAttributes = [ + ]; + + $instance = new self(); + $instance->_initialize(array_merge($defaultAttributes, $attributes)); + return $instance; + } + + /** + * sets instance properties from an array of values + * + * @access protected + * @param array $europeBankAccountAttribs array of EuropeBankAccount properties + * @return void + */ + protected function _initialize($europeBankAccountAttribs) + { + $this->_attributes = $europeBankAccountAttribs; + } +} +class_alias('Braintree\EuropeBankAccount', 'Braintree_EuropeBankAccount'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Exception.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Exception.php new file mode 100644 index 000000000..c3ad85465 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Exception.php @@ -0,0 +1,14 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/FacilitatorDetails.php b/modules/paypal/api/sdk/braintree/lib/Braintree/FacilitatorDetails.php new file mode 100644 index 000000000..f28e400f6 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/FacilitatorDetails.php @@ -0,0 +1,30 @@ +_initialize($attributes); + + return $instance; + } + + protected function _initialize($attributes) + { + $this->_attributes = $attributes; + } + + /** + * returns a string representation of the three d secure info + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) .']'; + } + +} +class_alias('Braintree\FacilitatorDetails', 'Braintree_FacilitatorDetails'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Gateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Gateway.php new file mode 100644 index 000000000..4f8c9f527 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Gateway.php @@ -0,0 +1,198 @@ +config = $config; + } + + /** + * + * @return AddOnGateway + */ + public function addOn() + { + return new AddOnGateway($this); + } + + /** + * + * @return AddressGateway + */ + public function address() + { + return new AddressGateway($this); + } + + /** + * + * @return ClientTokenGateway + */ + public function clientToken() + { + return new ClientTokenGateway($this); + } + + /** + * + * @return CreditCardGateway + */ + public function creditCard() + { + return new CreditCardGateway($this); + } + + /** + * + * @return CreditCardVerificationGateway + */ + public function creditCardVerification() + { + return new CreditCardVerificationGateway($this); + } + + /** + * + * @return CustomerGateway + */ + public function customer() + { + return new CustomerGateway($this); + } + + /** + * + * @return DiscountGateway + */ + public function discount() + { + return new DiscountGateway($this); + } + + /** + * + * @return MerchantGateway + */ + public function merchant() + { + return new MerchantGateway($this); + } + + /** + * + * @return MerchantAccountGateway + */ + public function merchantAccount() + { + return new MerchantAccountGateway($this); + } + + /** + * + * @return OAuthGateway + */ + public function oauth() + { + return new OAuthGateway($this); + } + + /** + * + * @return PaymentMethodGateway + */ + public function paymentMethod() + { + return new PaymentMethodGateway($this); + } + + /** + * + * @return PaymentMethodNonceGateway + */ + public function paymentMethodNonce() + { + return new PaymentMethodNonceGateway($this); + } + + /** + * + * @return PayPalAccountGateway + */ + public function payPalAccount() + { + return new PayPalAccountGateway($this); + } + + /** + * + * @return PlanGateway + */ + public function plan() + { + return new PlanGateway($this); + } + + /** + * + * @return SettlementBatchSummaryGateway + */ + public function settlementBatchSummary() + { + return new SettlementBatchSummaryGateway($this); + } + + /** + * + * @return SubscriptionGateway + */ + public function subscription() + { + return new SubscriptionGateway($this); + } + + /** + * + * @return TestingGateway + */ + public function testing() + { + return new TestingGateway($this); + } + + /** + * + * @return TransactionGateway + */ + public function transaction() + { + return new TransactionGateway($this); + } + + /** + * + * @return TransparentRedirectGateway + */ + public function transparentRedirect() + { + return new TransparentRedirectGateway($this); + } +} +class_alias('Braintree\Gateway', 'Braintree_Gateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Http.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Http.php new file mode 100644 index 000000000..7936b65eb --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Http.php @@ -0,0 +1,188 @@ +_config = $config; + } + + public function delete($path) + { + $response = $this->_doRequest('DELETE', $path); + if($response['status'] === 200) { + return true; + } else { + Util::throwStatusCodeException($response['status']); + } + } + + public function get($path) + { + $response = $this->_doRequest('GET', $path); + if ($response['status'] === 200) { + return Xml::buildArrayFromXml($response['body']); + } else { + Util::throwStatusCodeException($response['status']); + } + } + + public function post($path, $params = null) + { + $response = $this->_doRequest('POST', $path, $this->_buildXml($params)); + $responseCode = $response['status']; + if($responseCode === 200 || $responseCode === 201 || $responseCode === 422 || $responseCode == 400) { + return Xml::buildArrayFromXml($response['body']); + } else { + Util::throwStatusCodeException($responseCode); + } + } + + public function put($path, $params = null) + { + $response = $this->_doRequest('PUT', $path, $this->_buildXml($params)); + $responseCode = $response['status']; + if($responseCode === 200 || $responseCode === 201 || $responseCode === 422 || $responseCode == 400) { + return Xml::buildArrayFromXml($response['body']); + } else { + Util::throwStatusCodeException($responseCode); + } + } + + private function _buildXml($params) + { + return empty($params) ? null : Xml::buildXmlFromArray($params); + } + + private function _getHeaders() + { + return [ + 'Accept: application/xml', + 'Content-Type: application/xml', + ]; + } + + private function _getAuthorization() + { + if ($this->_useClientCredentials) { + return [ + 'user' => $this->_config->getClientId(), + 'password' => $this->_config->getClientSecret(), + ]; + } else if ($this->_config->isAccessToken()) { + return [ + 'token' => $this->_config->getAccessToken(), + ]; + } else { + return [ + 'user' => $this->_config->getPublicKey(), + 'password' => $this->_config->getPrivateKey(), + ]; + } + } + + public function useClientCredentials() + { + $this->_useClientCredentials = true; + } + + private function _doRequest($httpVerb, $path, $requestBody = null) + { + return $this->_doUrlRequest($httpVerb, $this->_config->baseUrl() . $path, $requestBody); + } + + public function _doUrlRequest($httpVerb, $url, $requestBody = null) + { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_TIMEOUT, $this->_config->timeout()); + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $httpVerb); + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_ENCODING, 'gzip'); + + $headers = $this->_getHeaders($curl); + $headers[] = 'User-Agent: Braintree PHP Library ' . Version::get(); + $headers[] = 'X-ApiVersion: ' . Configuration::API_VERSION; + + $authorization = $this->_getAuthorization(); + if (isset($authorization['user'])) { + curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + curl_setopt($curl, CURLOPT_USERPWD, $authorization['user'] . ':' . $authorization['password']); + } else if (isset($authorization['token'])) { + $headers[] = 'Authorization: Bearer ' . $authorization['token']; + } + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + + // curl_setopt($curl, CURLOPT_VERBOSE, true); + if ($this->_config->sslOn()) { + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); + curl_setopt($curl, CURLOPT_CAINFO, $this->getCaFile()); + } + + if(!empty($requestBody)) { + curl_setopt($curl, CURLOPT_POSTFIELDS, $requestBody); + } + + if($this->_config->isUsingProxy()) { + $proxyHost = $this->_config->getProxyHost(); + $proxyPort = $this->_config->getProxyPort(); + $proxyType = $this->_config->getProxyType(); + curl_setopt($curl, CURLOPT_PROXY, $proxyHost . ':' . $proxyPort); + if(!empty($proxyType)) { + curl_setopt($curl, CURLOPT_PROXYTYPE, $proxyType); + } + } + + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + $response = curl_exec($curl); + $httpStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $error_code = curl_errno($curl); + + if ($error_code == 28 && $httpStatus == 0) { + throw new Exception\Timeout(); + } + + curl_close($curl); + if ($this->_config->sslOn()) { + if ($httpStatus == 0) { + throw new Exception\SSLCertificate(); + } + } + return ['status' => $httpStatus, 'body' => $response]; + } + + private function getCaFile() + { + static $memo; + + if ($memo === null) { + $caFile = $this->_config->caFile(); + + if (substr($caFile, 0, 7) !== 'phar://') { + return $caFile; + } + + $extractedCaFile = sys_get_temp_dir() . '/api_braintreegateway_com.ca.crt'; + + if (!file_exists($extractedCaFile) || sha1_file($extractedCaFile) != sha1_file($caFile)) { + if (!copy($caFile, $extractedCaFile)) { + throw new Exception\SSLCaFileNotFound(); + } + } + $memo = $extractedCaFile; + } + + return $memo; + } +} +class_alias('Braintree\Http', 'Braintree_Http'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Instance.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Instance.php new file mode 100644 index 000000000..2f8e46ebb --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Instance.php @@ -0,0 +1,75 @@ +_initializeFromArray($attributes); + } + } + + /** + * returns private/nonexistent instance properties + * @access public + * @param string $name property name + * @return mixed contents of instance properties + */ + public function __get($name) + { + if (array_key_exists($name, $this->_attributes)) { + return $this->_attributes[$name]; + } else { + trigger_error('Undefined property on ' . get_class($this) . ': ' . $name, E_USER_NOTICE); + return null; + } + } + + /** + * used by isset() and empty() + * @access public + * @param string $name property name + * @return boolean + */ + public function __isset($name) + { + return array_key_exists($name, $this->_attributes); + } + + /** + * create a printable representation of the object as: + * ClassName[property=value, property=value] + * @return string + */ + public function __toString() + { + $objOutput = Util::implodeAssociativeArray($this->_attributes); + return get_class($this) .'[' . $objOutput . ']'; + } + /** + * initializes instance properties from the keys/values of an array + * @ignore + * @access protected + * @param $aAttribs array of properties to set - single level + * @return void + */ + private function _initializeFromArray($attributes) + { + $this->_attributes = $attributes; + } + +} +class_alias('Braintree\Instance', 'Braintree_Instance'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/IsNode.php b/modules/paypal/api/sdk/braintree/lib/Braintree/IsNode.php new file mode 100644 index 000000000..6db01b062 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/IsNode.php @@ -0,0 +1,24 @@ +name = $name; + $this->searchTerms = []; + } + + public function is($value) + { + $this->searchTerms['is'] = strval($value); + + return $this; + } + + public function toParam() + { + return $this->searchTerms; + } +} +class_alias('Braintree\IsNode', 'Braintree_IsNode'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/KeyValueNode.php b/modules/paypal/api/sdk/braintree/lib/Braintree/KeyValueNode.php new file mode 100644 index 000000000..1fd0139c6 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/KeyValueNode.php @@ -0,0 +1,23 @@ +name = $name; + $this->searchTerm = True; + } + + public function is($value) + { + $this->searchTerm = $value; + return $this; + } + + public function toParam() + { + return $this->searchTerm; + } +} +class_alias('Braintree\KeyValueNode', 'Braintree_KeyValueNode'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Merchant.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Merchant.php new file mode 100644 index 000000000..df443e67e --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Merchant.php @@ -0,0 +1,28 @@ +_attributes = $attribs; + } + + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + /** + * returns a string representation of the merchant + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) .']'; + } +} +class_alias('Braintree\Merchant', 'Braintree_Merchant'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount.php b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount.php new file mode 100644 index 000000000..fb9b25960 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount.php @@ -0,0 +1,64 @@ +_initialize($attributes); + return $instance; + } + + protected function _initialize($merchantAccountAttribs) + { + $this->_attributes = $merchantAccountAttribs; + + if (isset($merchantAccountAttribs['individual'])) { + $individual = $merchantAccountAttribs['individual']; + $this->_set('individualDetails', MerchantAccount\IndividualDetails::Factory($individual)); + } + + if (isset($merchantAccountAttribs['business'])) { + $business = $merchantAccountAttribs['business']; + $this->_set('businessDetails', MerchantAccount\BusinessDetails::Factory($business)); + } + + if (isset($merchantAccountAttribs['funding'])) { + $funding = $merchantAccountAttribs['funding']; + $this->_set('fundingDetails', new MerchantAccount\FundingDetails($funding)); + } + + if (isset($merchantAccountAttribs['masterMerchantAccount'])) { + $masterMerchantAccount = $merchantAccountAttribs['masterMerchantAccount']; + $this->_set('masterMerchantAccount', self::Factory($masterMerchantAccount)); + } + } + + + // static methods redirecting to gateway + + public static function create($attribs) + { + return Configuration::gateway()->merchantAccount()->create($attribs); + } + + public static function find($merchant_account_id) + { + return Configuration::gateway()->merchantAccount()->find($merchant_account_id); + } + + public static function update($merchant_account_id, $attributes) + { + return Configuration::gateway()->merchantAccount()->update($merchant_account_id, $attributes); + } +} +class_alias('Braintree\MerchantAccount', 'Braintree_MerchantAccount'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/AddressDetails.php b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/AddressDetails.php new file mode 100644 index 000000000..07233cee1 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/AddressDetails.php @@ -0,0 +1,10 @@ +_attributes = $businessAttribs; + if (isset($businessAttribs['address'])) { + $this->_set('addressDetails', new AddressDetails($businessAttribs['address'])); + } + } + + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } +} +class_alias('Braintree\MerchantAccount\BusinessDetails', 'Braintree_MerchantAccount_BusinessDetails'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/FundingDetails.php b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/FundingDetails.php new file mode 100644 index 000000000..0e77e58bc --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/FundingDetails.php @@ -0,0 +1,10 @@ +_attributes = $individualAttribs; + if (isset($individualAttribs['address'])) { + $this->_set('addressDetails', new AddressDetails($individualAttribs['address'])); + } + } + + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } +} +class_alias('Braintree\MerchantAccount\IndividualDetails', 'Braintree_MerchantAccount_IndividualDetails'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/index.php b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccount/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccountGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccountGateway.php new file mode 100644 index 000000000..5816980f4 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantAccountGateway.php @@ -0,0 +1,154 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + public function create($attribs) + { + Util::verifyKeys(self::detectSignature($attribs), $attribs); + return $this->_doCreate('/merchant_accounts/create_via_api', ['merchant_account' => $attribs]); + } + + public function find($merchant_account_id) + { + try { + $path = $this->_config->merchantPath() . '/merchant_accounts/' . $merchant_account_id; + $response = $this->_http->get($path); + return MerchantAccount::factory($response['merchantAccount']); + } catch (Exception\NotFound $e) { + throw new Exception\NotFound('merchant account with id ' . $merchant_account_id . ' not found'); + } + } + + public function update($merchant_account_id, $attributes) + { + Util::verifyKeys(self::updateSignature(), $attributes); + return $this->_doUpdate('/merchant_accounts/' . $merchant_account_id . '/update_via_api', ['merchant_account' => $attributes]); + } + + public static function detectSignature($attribs) + { + if (isset($attribs['applicantDetails'])) { + trigger_error("DEPRECATED: Passing applicantDetails to create is deprecated. Please use individual, business, and funding", E_USER_NOTICE); + return self::createDeprecatedSignature(); + } else { + return self::createSignature(); + } + } + + public static function updateSignature() + { + $signature = self::createSignature(); + unset($signature['tosAccepted']); + return $signature; + } + + public static function createSignature() + { + $addressSignature = ['streetAddress', 'postalCode', 'locality', 'region']; + $individualSignature = [ + 'firstName', + 'lastName', + 'email', + 'phone', + 'dateOfBirth', + 'ssn', + ['address' => $addressSignature] + ]; + + $businessSignature = [ + 'dbaName', + 'legalName', + 'taxId', + ['address' => $addressSignature] + ]; + + $fundingSignature = [ + 'routingNumber', + 'accountNumber', + 'destination', + 'email', + 'mobilePhone', + 'descriptor', + ]; + + return [ + 'id', + 'tosAccepted', + 'masterMerchantAccountId', + ['individual' => $individualSignature], + ['funding' => $fundingSignature], + ['business' => $businessSignature] + ]; + } + + public static function createDeprecatedSignature() + { + $applicantDetailsAddressSignature = ['streetAddress', 'postalCode', 'locality', 'region']; + $applicantDetailsSignature = [ + 'companyName', + 'firstName', + 'lastName', + 'email', + 'phone', + 'dateOfBirth', + 'ssn', + 'taxId', + 'routingNumber', + 'accountNumber', + ['address' => $applicantDetailsAddressSignature] + ]; + + return [ + ['applicantDetails' => $applicantDetailsSignature], + 'id', + 'tosAccepted', + 'masterMerchantAccountId' + ]; + } + + public function _doCreate($subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->post($fullPath, $params); + + return $this->_verifyGatewayResponse($response); + } + + private function _doUpdate($subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->put($fullPath, $params); + + return $this->_verifyGatewayResponse($response); + } + + private function _verifyGatewayResponse($response) + { + if (isset($response['merchantAccount'])) { + // return a populated instance of merchantAccount + return new Result\Successful( + MerchantAccount::factory($response['merchantAccount']) + ); + } else if (isset($response['apiErrorResponse'])) { + return new Result\Error($response['apiErrorResponse']); + } else { + throw new Exception\Unexpected( + "Expected merchant account or apiErrorResponse" + ); + } + } +} +class_alias('Braintree\MerchantAccountGateway', 'Braintree_MerchantAccountGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantGateway.php new file mode 100644 index 000000000..fc24c45c8 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/MerchantGateway.php @@ -0,0 +1,42 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasClientCredentials(); + $this->_http = new Http($gateway->config); + $this->_http->useClientCredentials(); + } + + public function create($attribs) + { + $response = $this->_http->post('/merchants/create_via_api', ['merchant' => $attribs]); + return $this->_verifyGatewayResponse($response); + } + + private function _verifyGatewayResponse($response) + { + if (isset($response['response']['merchant'])) { + // return a populated instance of merchant + return new Result\Successful([ + Merchant::factory($response['response']['merchant']), + OAuthCredentials::factory($response['response']['credentials']), + ]); + } else if (isset($response['apiErrorResponse'])) { + return new Result\Error($response['apiErrorResponse']); + } else { + throw new Exception\Unexpected( + "Expected merchant or apiErrorResponse" + ); + } + } +} +class_alias('Braintree\MerchantGateway', 'Braintree_MerchantGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Modification.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Modification.php new file mode 100644 index 000000000..e1d32b22e --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Modification.php @@ -0,0 +1,22 @@ +_attributes = $attributes; + } + + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + public function __toString() { + return get_called_class() . '[' . Util::attributesToString($this->_attributes) . ']'; + } +} +class_alias('Braintree\Modification', 'Braintree_Modification'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/MultipleValueNode.php b/modules/paypal/api/sdk/braintree/lib/Braintree/MultipleValueNode.php new file mode 100644 index 000000000..397c610ff --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/MultipleValueNode.php @@ -0,0 +1,41 @@ +name = $name; + $this->items = []; + $this->allowedValues = $allowedValues; + } + + public function in($values) + { + $bad_values = array_diff($values, $this->allowedValues); + if (count($this->allowedValues) > 0 && count($bad_values) > 0) { + $message = 'Invalid argument(s) for ' . $this->name . ':'; + foreach ($bad_values AS $bad_value) { + $message .= ' ' . $bad_value; + } + + throw new InvalidArgumentException($message); + } + + $this->items = $values; + return $this; + } + + public function is($value) + { + return $this->in([$value]); + } + + public function toParam() + { + return $this->items; + } +} +class_alias('Braintree\MultipleValueNode', 'Braintree_MultipleValueNode'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/MultipleValueOrTextNode.php b/modules/paypal/api/sdk/braintree/lib/Braintree/MultipleValueOrTextNode.php new file mode 100644 index 000000000..c98ee95a9 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/MultipleValueOrTextNode.php @@ -0,0 +1,47 @@ +textNode = new TextNode($name); + } + + public function contains($value) + { + $this->textNode->contains($value); + return $this; + } + + public function endsWith($value) + { + $this->textNode->endsWith($value); + return $this; + } + + public function is($value) + { + $this->textNode->is($value); + return $this; + } + + public function isNot($value) + { + $this->textNode->isNot($value); + return $this; + } + + public function startsWith($value) + { + $this->textNode->startsWith($value); + return $this; + } + + public function toParam() + { + return array_merge(parent::toParam(), $this->textNode->toParam()); + } +} +class_alias('Braintree\MultipleValueOrTextNode', 'Braintree_MultipleValueOrTextNode'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/OAuthCredentials.php b/modules/paypal/api/sdk/braintree/lib/Braintree/OAuthCredentials.php new file mode 100644 index 000000000..d2f35f261 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/OAuthCredentials.php @@ -0,0 +1,36 @@ +_attributes = $attribs; + } + + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + /** + * returns a string representation of the access token + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) .']'; + } +} +class_alias('Braintree\OAuthCredentials', 'Braintree_OAuthCredentials'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/OAuthGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/OAuthGateway.php new file mode 100644 index 000000000..2cd52fef3 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/OAuthGateway.php @@ -0,0 +1,105 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_http = new Http($gateway->config); + $this->_http->useClientCredentials(); + + $this->_config->assertHasClientCredentials(); + } + + public function createTokenFromCode($params) + { + $params['grantType'] = "authorization_code"; + return $this->_createToken($params); + } + + public function createTokenFromRefreshToken($params) + { + $params['grantType'] = "refresh_token"; + return $this->_createToken($params); + } + + private function _createToken($params) + { + $params = ['credentials' => $params]; + $response = $this->_http->post('/oauth/access_tokens', $params); + return $this->_verifyGatewayResponse($response); + } + + private function _verifyGatewayResponse($response) + { + if (isset($response['credentials'])) { + $result = new Result\Successful( + OAuthCredentials::factory($response['credentials']) + ); + return $this->_mapSuccess($result); + } else if (isset($response['apiErrorResponse'])) { + $result = new Result\Error($response['apiErrorResponse']); + return $this->_mapError($result); + } else { + throw new Exception\Unexpected( + "Expected credentials or apiErrorResponse" + ); + } + } + + public function _mapError($result) + { + $error = $result->errors->deepAll()[0]; + + if ($error->code == Error\Codes::OAUTH_INVALID_GRANT) { + $result->error = 'invalid_grant'; + } else if ($error->code == Error\Codes::OAUTH_INVALID_CREDENTIALS) { + $result->error = 'invalid_credentials'; + } else if ($error->code == Error\Codes::OAUTH_INVALID_SCOPE) { + $result->error = 'invalid_scope'; + } + $result->errorDescription = explode(': ', $error->message)[1]; + return $result; + } + + public function _mapSuccess($result) + { + $credentials = $result->credentials; + $result->accessToken = $credentials->accessToken; + $result->refreshToken = $credentials->refreshToken; + $result->tokenType = $credentials->tokenType; + $result->expiresAt = $credentials->expiresAt; + return $result; + } + + public function connectUrl($params = []) + { + $query = Util::camelCaseToDelimiterArray($params, '_'); + $query['client_id'] = $this->_config->getClientId(); + $queryString = preg_replace('/\%5B\d+\%5D/', '%5B%5D', http_build_query($query)); + $url = $this->_config->baseUrl() . '/oauth/connect?' . $queryString; + + return $url . '&signature=' . $this->computeSignature($url) . '&algorithm=SHA256'; + } + + public function computeSignature($url) + { + $key = hash('sha256', $this->_config->getClientSecret(), true); + return hash_hmac('sha256', $url, $key); + } +} +class_alias('Braintree\OAuthGateway', 'Braintree_OAuthGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/PartialMatchNode.php b/modules/paypal/api/sdk/braintree/lib/Braintree/PartialMatchNode.php new file mode 100644 index 000000000..5d8dc917b --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/PartialMatchNode.php @@ -0,0 +1,18 @@ +searchTerms["starts_with"] = strval($value); + return $this; + } + + public function endsWith($value) + { + $this->searchTerms["ends_with"] = strval($value); + return $this; + } +} +class_alias('Braintree\PartialMatchNode', 'Braintree_PartialMatchNode'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/PartnerMerchant.php b/modules/paypal/api/sdk/braintree/lib/Braintree/PartnerMerchant.php new file mode 100644 index 000000000..c0ee7d0b0 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/PartnerMerchant.php @@ -0,0 +1,42 @@ +_initialize($attributes); + + return $instance; + } + + /** + * @ignore + */ + protected function _initialize($attributes) + { + $this->_attributes = $attributes; + } +} +class_alias('Braintree\PartnerMerchant', 'Braintree_PartnerMerchant'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/PayPalAccount.php b/modules/paypal/api/sdk/braintree/lib/Braintree/PayPalAccount.php new file mode 100644 index 000000000..7f09581b1 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/PayPalAccount.php @@ -0,0 +1,111 @@ +== More information == + * + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read string $customerId + * @property-read string $email + * @property-read string $token + * @property-read string $imageUrl + */ +class PayPalAccount extends Base +{ + /** + * factory method: returns an instance of PayPalAccount + * to the requesting method, with populated properties + * + * @ignore + * @return PayPalAccount + */ + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + /* instance methods */ + + /** + * returns false if default is null or false + * + * @return boolean + */ + public function isDefault() + { + return $this->default; + } + + /** + * sets instance properties from an array of values + * + * @access protected + * @param array $paypalAccountAttribs array of paypalAccount data + * @return void + */ + protected function _initialize($paypalAccountAttribs) + { + // set the attributes + $this->_attributes = $paypalAccountAttribs; + + $subscriptionArray = []; + if (isset($paypalAccountAttribs['subscriptions'])) { + foreach ($paypalAccountAttribs['subscriptions'] AS $subscription) { + $subscriptionArray[] = Subscription::factory($subscription); + } + } + + $this->_set('subscriptions', $subscriptionArray); + } + + /** + * create a printable representation of the object as: + * ClassName[property=value, property=value] + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) . ']'; + } + + + // static methods redirecting to gateway + + public static function find($token) + { + return Configuration::gateway()->payPalAccount()->find($token); + } + + public static function update($token, $attributes) + { + return Configuration::gateway()->payPalAccount()->update($token, $attributes); + } + + public static function delete($token) + { + return Configuration::gateway()->payPalAccount()->delete($token); + } + + public static function sale($token, $transactionAttribs) + { + return Configuration::gateway()->payPalAccount()->sale($token, $transactionAttribs); + } +} +class_alias('Braintree\PayPalAccount', 'Braintree_PayPalAccount'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/PayPalAccountGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/PayPalAccountGateway.php new file mode 100644 index 000000000..1b0933e76 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/PayPalAccountGateway.php @@ -0,0 +1,180 @@ +== More information == + * + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + */ +class PayPalAccountGateway +{ + private $_gateway; + private $_config; + private $_http; + + public function __construct($gateway) + { + $this->_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + + /** + * find a paypalAccount by token + * + * @access public + * @param string $token paypal accountunique id + * @return PayPalAccount + * @throws Exception\NotFound + */ + public function find($token) + { + $this->_validateId($token); + try { + $path = $this->_config->merchantPath() . '/payment_methods/paypal_account/' . $token; + $response = $this->_http->get($path); + return PayPalAccount::factory($response['paypalAccount']); + } catch (Exception\NotFound $e) { + throw new Exception\NotFound( + 'paypal account with token ' . $token . ' not found' + ); + } + + } + + /** + * updates the paypalAccount record + * + * if calling this method in context, $token + * is the 2nd attribute. $token is not sent in object context. + * + * @access public + * @param array $attributes + * @param string $token (optional) + * @return Result\Successful or Result\Error + */ + public function update($token, $attributes) + { + Util::verifyKeys(self::updateSignature(), $attributes); + $this->_validateId($token); + return $this->_doUpdate('put', '/payment_methods/paypal_account/' . $token, ['paypalAccount' => $attributes]); + } + + public function delete($token) + { + $this->_validateId($token); + $path = $this->_config->merchantPath() . '/payment_methods/paypal_account/' . $token; + $this->_http->delete($path); + return new Result\Successful(); + } + + /** + * create a new sale for the current PayPal account + * + * @param string $token + * @param array $transactionAttribs + * @return Result\Successful|Result\Error + * @see Transaction::sale() + */ + public function sale($token, $transactionAttribs) + { + $this->_validateId($token); + return Transaction::sale( + array_merge( + $transactionAttribs, + ['paymentMethodToken' => $token] + ) + ); + } + + public static function updateSignature() + { + return [ + 'token', + ['options' => ['makeDefault']] + ]; + } + + /** + * sends the update request to the gateway + * + * @ignore + * @param string $subPath + * @param array $params + * @return mixed + */ + private function _doUpdate($httpVerb, $subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->$httpVerb($fullPath, $params); + return $this->_verifyGatewayResponse($response); + } + + /** + * generic method for validating incoming gateway responses + * + * creates a new PayPalAccount object and encapsulates + * it inside a Result\Successful object, or + * encapsulates a Errors object inside a Result\Error + * alternatively, throws an Unexpected exception if the response is invalid. + * + * @ignore + * @param array $response gateway response values + * @return Result\Successful|Result\Error + * @throws Exception\Unexpected + */ + private function _verifyGatewayResponse($response) + { + if (isset($response['paypalAccount'])) { + // return a populated instance of PayPalAccount + return new Result\Successful( + PayPalAccount::factory($response['paypalAccount']) + ); + } else if (isset($response['apiErrorResponse'])) { + return new Result\Error($response['apiErrorResponse']); + } else { + throw new Exception\Unexpected( + 'Expected paypal account or apiErrorResponse' + ); + } + } + + /** + * verifies that a valid paypal account identifier is being used + * @ignore + * @param string $identifier + * @param Optional $string $identifierType type of identifier supplied, default 'token' + * @throws InvalidArgumentException + */ + private function _validateId($identifier = null, $identifierType = 'token') + { + if (empty($identifier)) { + throw new InvalidArgumentException( + 'expected paypal account id to be set' + ); + } + if (!preg_match('/^[0-9A-Za-z_-]+$/', $identifier)) { + throw new InvalidArgumentException( + $identifier . ' is an invalid paypal account ' . $identifierType . '.' + ); + } + } +} +class_alias('Braintree\PayPalAccountGateway', 'Braintree_PayPalAccountGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentInstrumentType.php b/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentInstrumentType.php new file mode 100644 index 000000000..551a7ccc4 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentInstrumentType.php @@ -0,0 +1,13 @@ +== More information == + * + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + */ +class PaymentMethod extends Base +{ + // static methods redirecting to gateway + + public static function create($attribs) + { + return Configuration::gateway()->paymentMethod()->create($attribs); + } + + public static function find($token) + { + return Configuration::gateway()->paymentMethod()->find($token); + } + + public static function update($token, $attribs) + { + return Configuration::gateway()->paymentMethod()->update($token, $attribs); + } + + public static function delete($token) + { + return Configuration::gateway()->paymentMethod()->delete($token); + } +} +class_alias('Braintree\PaymentMethod', 'Braintree_PaymentMethod'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodGateway.php new file mode 100644 index 000000000..630d69188 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodGateway.php @@ -0,0 +1,300 @@ +== More information == + * + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + */ +class PaymentMethodGateway +{ + private $_gateway; + private $_config; + private $_http; + + public function __construct($gateway) + { + $this->_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + + public function create($attribs) + { + Util::verifyKeys(self::createSignature(), $attribs); + return $this->_doCreate('/payment_methods', ['payment_method' => $attribs]); + } + + /** + * find a PaymentMethod by token + * + * @param string $token payment method unique id + * @return CreditCard|PayPalAccount + * @throws Exception\NotFound + */ + public function find($token) + { + $this->_validateId($token); + try { + $path = $this->_config->merchantPath() . '/payment_methods/any/' . $token; + $response = $this->_http->get($path); + if (isset($response['creditCard'])) { + return CreditCard::factory($response['creditCard']); + } else if (isset($response['paypalAccount'])) { + return PayPalAccount::factory($response['paypalAccount']); + } else if (isset($response['coinbaseAccount'])) { + return CoinbaseAccount::factory($response['coinbaseAccount']); + } else if (isset($response['applePayCard'])) { + return ApplePayCard::factory($response['applePayCard']); + } else if (isset($response['androidPayCard'])) { + return AndroidPayCard::factory($response['androidPayCard']); + } else if (isset($response['amexExpressCheckoutCard'])) { + return AmexExpressCheckoutCard::factory($response['amexExpressCheckoutCard']); + } else if (isset($response['europeBankAccount'])) { + return EuropeBankAccount::factory($response['europeBankAccount']); + } else if (isset($response['venmoAccount'])) { + return VenmoAccount::factory($response['venmoAccount']); + } else if (is_array($response)) { + return UnknownPaymentMethod::factory($response); + } + } catch (Exception\NotFound $e) { + throw new Exception\NotFound( + 'payment method with token ' . $token . ' not found' + ); + } + } + + public function update($token, $attribs) + { + Util::verifyKeys(self::updateSignature(), $attribs); + return $this->_doUpdate('/payment_methods/any/' . $token, ['payment_method' => $attribs]); + } + + public function delete($token) + { + $this->_validateId($token); + $path = $this->_config->merchantPath() . '/payment_methods/any/' . $token; + $this->_http->delete($path); + return new Result\Successful(); + } + + public function grant($sharedPaymentMethodToken, $allowVaulting) + { + return $this->_doCreate( + '/payment_methods/grant', + [ + 'payment_method' => [ + 'shared_payment_method_token' => $sharedPaymentMethodToken, + 'allow_vaulting' => $allowVaulting + ] + ] + ); + } + + public function revoke($sharedPaymentMethodToken) + { + return $this->_doCreate( + '/payment_methods/revoke', + [ + 'payment_method' => [ + 'shared_payment_method_token' => $sharedPaymentMethodToken + ] + ] + ); + } + + private static function baseSignature() + { + $billingAddressSignature = AddressGateway::createSignature(); + $optionsSignature = [ + 'failOnDuplicatePaymentMethod', + 'makeDefault', + 'verificationMerchantAccountId', + 'verifyCard', + 'verificationAmount' + ]; + return [ + 'billingAddressId', + 'cardholderName', + 'cvv', + 'deviceData', + 'expirationDate', + 'expirationMonth', + 'expirationYear', + 'number', + 'paymentMethodNonce', + 'token', + ['options' => $optionsSignature], + ['billingAddress' => $billingAddressSignature] + ]; + } + + public static function createSignature() + { + $signature = array_merge(self::baseSignature(), ['customerId']); + return $signature; + } + + public static function updateSignature() + { + $billingAddressSignature = AddressGateway::updateSignature(); + array_push($billingAddressSignature, [ + 'options' => [ + 'updateExisting' + ] + ]); + $signature = array_merge(self::baseSignature(), [ + 'deviceSessionId', + 'venmoSdkPaymentMethodCode', + 'fraudMerchantId', + ['billingAddress' => $billingAddressSignature] + ]); + return $signature; + } + + /** + * sends the create request to the gateway + * + * @ignore + * @param string $subPath + * @param array $params + * @return mixed + */ + public function _doCreate($subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->post($fullPath, $params); + + return $this->_verifyGatewayResponse($response); + } + + /** + * sends the update request to the gateway + * + * @ignore + * @param string $subPath + * @param array $params + * @return mixed + */ + public function _doUpdate($subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->put($fullPath, $params); + + return $this->_verifyGatewayResponse($response); + } + + /** + * generic method for validating incoming gateway responses + * + * creates a new CreditCard or PayPalAccount object + * and encapsulates it inside a Result\Successful object, or + * encapsulates a Errors object inside a Result\Error + * alternatively, throws an Unexpected exception if the response is invalid. + * + * @ignore + * @param array $response gateway response values + * @return Result\Successful|Result\Error + * @throws Exception\Unexpected + */ + private function _verifyGatewayResponse($response) + { + if (isset($response['creditCard'])) { + return new Result\Successful( + CreditCard::factory($response['creditCard']), + 'paymentMethod' + ); + } else if (isset($response['paypalAccount'])) { + return new Result\Successful( + PayPalAccount::factory($response['paypalAccount']), + "paymentMethod" + ); + } else if (isset($response['coinbaseAccount'])) { + return new Result\Successful( + CoinbaseAccount::factory($response['coinbaseAccount']), + "paymentMethod" + ); + } else if (isset($response['applePayCard'])) { + return new Result\Successful( + ApplePayCard::factory($response['applePayCard']), + "paymentMethod" + ); + } else if (isset($response['androidPayCard'])) { + return new Result\Successful( + AndroidPayCard::factory($response['androidPayCard']), + "paymentMethod" + ); + } else if (isset($response['amexExpressCheckoutCard'])) { + return new Result\Successful( + AmexExpressCheckoutCard::factory($response['amexExpressCheckoutCard']), + "paymentMethod" + ); + } else if (isset($response['europeBankAccount'])) { + return new Result\Successful( + EuropeBankAccount::factory($response['europeBankAccount']), + "paymentMethod" + ); + } else if (isset($response['venmoAccount'])) { + return new Result\Successful( + VenmoAccount::factory($response['venmoAccount']), + "paymentMethod" + ); + } else if (isset($response['paymentMethodNonce'])) { + return new Result\Successful( + PaymentMethodNonce::factory($response['paymentMethodNonce']), + "paymentMethodNonce" + ); + } else if (isset($response['apiErrorResponse'])) { + return new Result\Error($response['apiErrorResponse']); + } else if (is_array($response)) { + return new Result\Successful( + UnknownPaymentMethod::factory($response), + "paymentMethod" + ); + } else { + throw new Exception\Unexpected( + 'Expected payment method or apiErrorResponse' + ); + } + } + + /** + * verifies that a valid payment method identifier is being used + * @ignore + * @param string $identifier + * @param Optional $string $identifierType type of identifier supplied, default 'token' + * @throws InvalidArgumentException + */ + private function _validateId($identifier = null, $identifierType = 'token') + { + if (empty($identifier)) { + throw new InvalidArgumentException( + 'expected payment method id to be set' + ); + } + if (!preg_match('/^[0-9A-Za-z_-]+$/', $identifier)) { + throw new InvalidArgumentException( + $identifier . ' is an invalid payment method ' . $identifierType . '.' + ); + } + } +} +class_alias('Braintree\PaymentMethodGateway', 'Braintree_PaymentMethodGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodNonce.php b/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodNonce.php new file mode 100644 index 000000000..4e04efb9c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodNonce.php @@ -0,0 +1,55 @@ +== More information == + * + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + */ +class PaymentMethodNonce extends Base +{ + // static methods redirecting to gateway + + public static function create($token) + { + return Configuration::gateway()->paymentMethodNonce()->create($token); + } + + public static function find($nonce) + { + return Configuration::gateway()->paymentMethodNonce()->find($nonce); + } + + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + protected function _initialize($nonceAttributes) + { + $this->_attributes = $nonceAttributes; + $this->_set('nonce', $nonceAttributes['nonce']); + $this->_set('type', $nonceAttributes['type']); + + if(isset($nonceAttributes['threeDSecureInfo'])) { + $this->_set('threeDSecureInfo', ThreeDSecureInfo::factory($nonceAttributes['threeDSecureInfo'])); + } + } +} +class_alias('Braintree\PaymentMethodNonce', 'Braintree_PaymentMethodNonce'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodNonceGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodNonceGateway.php new file mode 100644 index 000000000..82dcfaebc --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/PaymentMethodNonceGateway.php @@ -0,0 +1,67 @@ +== More information == + * + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + */ +class PaymentMethodNonceGateway +{ + private $_gateway; + private $_config; + private $_http; + + public function __construct($gateway) + { + $this->_gateway = $gateway; + $this->_config = $gateway->config; + $this->_http = new Http($gateway->config); + } + + + public function create($token) + { + $subPath = '/payment_methods/' . $token . '/nonces'; + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->post($fullPath); + + return new Result\Successful( + PaymentMethodNonce::factory($response['paymentMethodNonce']), + "paymentMethodNonce" + ); + } + + /** + * @access public + * + */ + public function find($nonce) + { + try { + $path = $this->_config->merchantPath() . '/payment_method_nonces/' . $nonce; + $response = $this->_http->get($path); + return PaymentMethodNonce::factory($response['paymentMethodNonce']); + } catch (Exception\NotFound $e) { + throw new Exception\NotFound( + 'payment method nonce with id ' . $nonce . ' not found' + ); + } + + } +} +class_alias('Braintree\PaymentMethodNonceGateway', 'Braintree_PaymentMethodNonceGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Plan.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Plan.php new file mode 100644 index 000000000..a92c604ac --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Plan.php @@ -0,0 +1,51 @@ +_initialize($attributes); + + return $instance; + } + + protected function _initialize($attributes) + { + $this->_attributes = $attributes; + + $addOnArray = []; + if (isset($attributes['addOns'])) { + foreach ($attributes['addOns'] AS $addOn) { + $addOnArray[] = AddOn::factory($addOn); + } + } + $this->_attributes['addOns'] = $addOnArray; + + $discountArray = []; + if (isset($attributes['discounts'])) { + foreach ($attributes['discounts'] AS $discount) { + $discountArray[] = Discount::factory($discount); + } + } + $this->_attributes['discounts'] = $discountArray; + + $planArray = []; + if (isset($attributes['plans'])) { + foreach ($attributes['plans'] AS $plan) { + $planArray[] = self::factory($plan); + } + } + $this->_attributes['plans'] = $planArray; + } + + + // static methods redirecting to gateway + + public static function all() + { + return Configuration::gateway()->plan()->all(); + } +} +class_alias('Braintree\Plan', 'Braintree_Plan'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/PlanGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/PlanGateway.php new file mode 100644 index 000000000..22beaeec9 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/PlanGateway.php @@ -0,0 +1,34 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + public function all() + { + $path = $this->_config->merchantPath() . '/plans'; + $response = $this->_http->get($path); + if (key_exists('plans', $response)){ + $plans = ["plan" => $response['plans']]; + } else { + $plans = ["plan" => []]; + } + + return Util::extractAttributeAsArray( + $plans, + 'plan' + ); + } +} +class_alias('Braintree\PlanGateway', 'Braintree_PlanGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/RangeNode.php b/modules/paypal/api/sdk/braintree/lib/Braintree/RangeNode.php new file mode 100644 index 000000000..622939ac4 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/RangeNode.php @@ -0,0 +1,40 @@ +name = $name; + $this->searchTerms = []; + } + + public function greaterThanOrEqualTo($value) + { + $this->searchTerms['min'] = $value; + return $this; + } + + public function lessThanOrEqualTo($value) + { + $this->searchTerms['max'] = $value; + return $this; + } + + public function is($value) + { + $this->searchTerms['is'] = $value; + return $this; + } + + public function between($min, $max) + { + return $this->greaterThanOrEqualTo($min)->lessThanOrEqualTo($max); + } + + public function toParam() + { + return $this->searchTerms; + } +} +class_alias('Braintree\RangeNode', 'Braintree_RangeNode'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/ResourceCollection.php b/modules/paypal/api/sdk/braintree/lib/Braintree/ResourceCollection.php new file mode 100644 index 000000000..2d5d4c13b --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/ResourceCollection.php @@ -0,0 +1,146 @@ + + * $result = Customer::all(); + * + * foreach($result as $transaction) { + * print_r($transaction->id); + * } + * + * + * @package Braintree + * @subpackage Utility + * @copyright 2015 Braintree, a division of PayPal, Inc. + */ +class ResourceCollection implements Iterator +{ + private $_index; + private $_batchIndex; + private $_items; + private $_pageSize; + private $_pager; + + /** + * set up the resource collection + * + * expects an array of attributes with literal keys + * + * @param array $response + * @param array $pager + */ + public function __construct($response, $pager) + { + $this->_pageSize = $response["searchResults"]["pageSize"]; + $this->_ids = $response["searchResults"]["ids"]; + $this->_pager = $pager; + } + + /** + * returns the current item when iterating with foreach + */ + public function current() + { + return $this->_items[$this->_index]; + } + + /** + * returns the first item in the collection + * + * @return mixed + */ + public function firstItem() + { + $ids = $this->_ids; + $page = $this->_getPage([$ids[0]]); + return $page[0]; + } + + public function key() + { + return null; + } + + /** + * advances to the next item in the collection when iterating with foreach + */ + public function next() + { + ++$this->_index; + } + + /** + * rewinds the testIterateOverResults collection to the first item when iterating with foreach + */ + public function rewind() + { + $this->_batchIndex = 0; + $this->_getNextPage(); + } + + /** + * returns whether the current item is valid when iterating with foreach + */ + public function valid() + { + if ($this->_index == count($this->_items) && $this->_batchIndex < count($this->_ids)) { + $this->_getNextPage(); + } + + if ($this->_index < count($this->_items)) { + return true; + } else { + return false; + } + } + + public function maximumCount() + { + return count($this->_ids); + } + + private function _getNextPage() + { + if (empty($this->_ids)) + { + $this->_items = []; + } + else + { + $this->_items = $this->_getPage(array_slice($this->_ids, $this->_batchIndex, $this->_pageSize)); + $this->_batchIndex += $this->_pageSize; + $this->_index = 0; + } + } + + /** + * requests the next page of results for the collection + * + * @return void + */ + private function _getPage($ids) + { + $object = $this->_pager['object']; + $method = $this->_pager['method']; + $methodArgs = []; + foreach ($this->_pager['methodArgs'] as $arg) { + array_push($methodArgs, $arg); + } + array_push($methodArgs, $ids); + + return call_user_func_array( + [$object, $method], + $methodArgs + ); + } +} +class_alias('Braintree\ResourceCollection', 'Braintree_ResourceCollection'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Result/CreditCardVerification.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Result/CreditCardVerification.php new file mode 100644 index 000000000..6a0eb16a4 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Result/CreditCardVerification.php @@ -0,0 +1,99 @@ +_initializeFromArray($attributes); + } + + /** + * initializes instance properties from the keys/values of an array + * @ignore + * @access protected + * @param $aAttribs array of properties to set - single level + * @return void + */ + private function _initializeFromArray($attributes) + { + if(isset($attributes['riskData'])) + { + $attributes['riskData'] = RiskData::factory($attributes['riskData']); + } + + $this->_attributes = $attributes; + foreach($attributes AS $name => $value) { + $varName = "_$name"; + $this->$varName = $value; + } + } + + /** + * @ignore + */ + public function __get($name) + { + $varName = "_$name"; + return isset($this->$varName) ? $this->$varName : null; + } + + /** + * returns a string representation of the customer + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) . ']'; + } + + public static function allStatuses() + { + return [ + CreditCardVerification::FAILED, + CreditCardVerification::GATEWAY_REJECTED, + CreditCardVerification::PROCESSOR_DECLINED, + CreditCardVerification::VERIFIED + ]; + } +} +class_alias('Braintree\Result\CreditCardVerification', 'Braintree_Result_CreditCardVerification'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Result/Error.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Result/Error.php new file mode 100644 index 000000000..effbc408c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Result/Error.php @@ -0,0 +1,124 @@ + + * $result = Transaction::void('abc123'); + * if ($result->success) { + * // Successful Result + * } else { + * // Result\Error + * } + * + * + * @package Braintree + * @subpackage Result + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read array $params original passed params + * @property-read Braintree\Error\ErrorCollection $errors + * @property-read Braintree\Result\CreditCardVerification $creditCardVerification credit card verification data + */ +class Error extends Base +{ + /** + * @var bool always false + */ + public $success = false; + + /** + * return original value for a field + * For example, if a user tried to submit 'invalid-email' in the html field transaction[customer][email], + * $result->valueForHtmlField("transaction[customer][email]") would yield "invalid-email" + * + * @param string $field + * @return string + */ + public function valueForHtmlField($field) + { + $pieces = preg_split("/[\[\]]+/", $field, 0, PREG_SPLIT_NO_EMPTY); + $params = $this->params; + foreach(array_slice($pieces, 0, -1) as $key) { + $params = $params[Util::delimiterToCamelCase($key)]; + } + if ($key != 'custom_fields') { + $finalKey = Util::delimiterToCamelCase(end($pieces)); + } else { + $finalKey = end($pieces); + } + $fieldValue = isset($params[$finalKey]) ? $params[$finalKey] : null; + return $fieldValue; + } + + /** + * overrides default constructor + * @ignore + * @param array $response gateway response array + */ + public function __construct($response) + { + $this->_attributes = $response; + $this->_set('errors', new ErrorCollection($response['errors'])); + + if(isset($response['verification'])) { + $this->_set('creditCardVerification', new CreditCardVerification($response['verification'])); + } else { + $this->_set('creditCardVerification', null); + } + + if(isset($response['transaction'])) { + $this->_set('transaction', Transaction::factory($response['transaction'])); + } else { + $this->_set('transaction', null); + } + + if(isset($response['subscription'])) { + $this->_set('subscription', Subscription::factory($response['subscription'])); + } else { + $this->_set('subscription', null); + } + + if(isset($response['merchantAccount'])) { + $this->_set('merchantAccount', MerchantAccount::factory($response['merchantAccount'])); + } else { + $this->_set('merchantAccount', null); + } + + if(isset($response['verification'])) { + $this->_set('verification', new CreditCardVerification($response['verification'])); + } else { + $this->_set('verification', null); + } + } + + /** + * create a printable representation of the object as: + * ClassName[property=value, property=value] + * @ignore + * @return string + */ + public function __toString() + { + $output = Util::attributesToString($this->_attributes); + if (isset($this->_creditCardVerification)) { + $output .= sprintf('%s', $this->_creditCardVerification); + } + return __CLASS__ .'[' . $output . ']'; + } +} +class_alias('Braintree\Result\Error', 'Braintree_Result_Error'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Result/Successful.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Result/Successful.php new file mode 100644 index 000000000..fe958354b --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Result/Successful.php @@ -0,0 +1,93 @@ +customer like so: + * + * + * $result = Customer::create(array('first_name' => "John")); + * if ($result->success) { + * // Successful + * echo "Created customer {$result->customer->id}"; + * } else { + * // Error + * } + * + * + * + * @package Braintree + * @subpackage Result + * @copyright 2015 Braintree, a division of PayPal, Inc. + */ +class Successful extends Instance +{ + /** + * + * @var boolean always true + */ + public $success = true; + /** + * + * @var string stores the internal name of the object providing access to + */ + private $_returnObjectNames; + + /** + * @ignore + * @param array|null $objsToReturn + * @param array|null $propertyNames + */ + public function __construct($objsToReturn = [], $propertyNames = []) + { + // Sanitize arguments (preserves backwards compatibility) + if (!is_array($objsToReturn)) { $objsToReturn = [$objsToReturn]; } + if (!is_array($propertyNames)) { $propertyNames = [$propertyNames]; } + + $objects = $this->_mapPropertyNamesToObjsToReturn($propertyNames, $objsToReturn); + $this->_attributes = []; + $this->_returnObjectNames = []; + + foreach ($objects as $propertyName => $objToReturn) { + + // save the name for indirect access + array_push($this->_returnObjectNames, $propertyName); + + // create the property! + $this->$propertyName = $objToReturn; + } + } + + /** + * + * @ignore + * @return string string representation of the object's structure + */ + public function __toString() + { + $objects = []; + foreach ($this->_returnObjectNames as $returnObjectName) { + array_push($objects, $this->$returnObjectName); + } + return __CLASS__ . '[' . implode(', ', $objects) . ']'; + } + + private function _mapPropertyNamesToObjsToReturn($propertyNames, $objsToReturn) { + if(count($objsToReturn) != count($propertyNames)) { + $propertyNames = []; + foreach ($objsToReturn as $obj) { + array_push($propertyNames, Util::cleanClassName(get_class($obj))); + } + } + return array_combine($propertyNames, $objsToReturn); + } +} +class_alias('Braintree\Result\Successful', 'Braintree_Result_Successful'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Result/index.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Result/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Result/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/RiskData.php b/modules/paypal/api/sdk/braintree/lib/Braintree/RiskData.php new file mode 100644 index 000000000..971d80598 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/RiskData.php @@ -0,0 +1,30 @@ +_initialize($attributes); + + return $instance; + } + + protected function _initialize($attributes) + { + $this->_attributes = $attributes; + } + + /** + * returns a string representation of the risk data + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) .']'; + } + +} +class_alias('Braintree\RiskData', 'Braintree_RiskData'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/SettlementBatchSummary.php b/modules/paypal/api/sdk/braintree/lib/Braintree/SettlementBatchSummary.php new file mode 100644 index 000000000..3a270a893 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/SettlementBatchSummary.php @@ -0,0 +1,45 @@ +_initialize($attributes); + return $instance; + } + + /** + * @ignore + * @param array $attributes + */ + protected function _initialize($attributes) + { + $this->_attributes = $attributes; + } + + public function records() + { + return $this->_attributes['records']; + } + + + /** + * static method redirecting to gateway + * + * @param string $settlement_date Date YYYY-MM-DD + * @param string $groupByCustomField + * @return Result\Successful|Result\Error + */ + public static function generate($settlement_date, $groupByCustomField = NULL) + { + return Configuration::gateway()->settlementBatchSummary()->generate($settlement_date, $groupByCustomField); + } +} +class_alias('Braintree\SettlementBatchSummary', 'Braintree_SettlementBatchSummary'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/SettlementBatchSummaryGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/SettlementBatchSummaryGateway.php new file mode 100644 index 000000000..e70db875a --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/SettlementBatchSummaryGateway.php @@ -0,0 +1,106 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + /** + * + * @param string $settlement_date + * @param string $groupByCustomField + * @return SettlementBatchSummary|Result\Error + */ + public function generate($settlement_date, $groupByCustomField = NULL) + { + $criteria = ['settlement_date' => $settlement_date]; + if (isset($groupByCustomField)) + { + $criteria['group_by_custom_field'] = $groupByCustomField; + } + $params = ['settlement_batch_summary' => $criteria]; + $path = $this->_config->merchantPath() . '/settlement_batch_summary'; + $response = $this->_http->post($path, $params); + + if (isset($groupByCustomField)) + { + $response['settlementBatchSummary']['records'] = $this->_underscoreCustomField( + $groupByCustomField, + $response['settlementBatchSummary']['records'] + ); + } + + return $this->_verifyGatewayResponse($response); + } + + /** + * + * @param string $groupByCustomField + * @param array $records + * @return array + */ + private function _underscoreCustomField($groupByCustomField, $records) + { + $updatedRecords = []; + + foreach ($records as $record) + { + $camelized = Util::delimiterToCamelCase($groupByCustomField); + $record[$groupByCustomField] = $record[$camelized]; + unset($record[$camelized]); + $updatedRecords[] = $record; + } + + return $updatedRecords; + } + + /** + * + * @param array $response + * @return Result\Successful|Result\Error + * @throws Exception\Unexpected + */ + private function _verifyGatewayResponse($response) + { + if (isset($response['settlementBatchSummary'])) { + return new Result\Successful( + SettlementBatchSummary::factory($response['settlementBatchSummary']) + ); + } else if (isset($response['apiErrorResponse'])) { + return new Result\Error($response['apiErrorResponse']); + } else { + throw new Exception\Unexpected( + "Expected settlementBatchSummary or apiErrorResponse" + ); + } + } +} +class_alias('Braintree\SettlementBatchSummaryGateway', 'Braintree_SettlementBatchSummaryGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/SignatureService.php b/modules/paypal/api/sdk/braintree/lib/Braintree/SignatureService.php new file mode 100644 index 000000000..5e123692d --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/SignatureService.php @@ -0,0 +1,24 @@ +key = $key; + $this->digest = $digest; + } + + public function sign($payload) + { + return $this->hash($payload) . "|" . $payload; + } + + public function hash($data) + { + return call_user_func($this->digest, $this->key, $data); + } + +} +class_alias('Braintree\SignatureService', 'Braintree_SignatureService'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Subscription.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Subscription.php new file mode 100644 index 000000000..1b7eb94bb --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Subscription.php @@ -0,0 +1,141 @@ +== More information == + * + * For more detailed information on Subscriptions, see {@link http://www.braintreepayments.com/gateway/subscription-api http://www.braintreepaymentsolutions.com/gateway/subscription-api} + * + * PHP Version 5 + * + * @package Braintree + * @copyright 2015 Braintree, a division of PayPal, Inc. + */ +class Subscription extends Base +{ + const ACTIVE = 'Active'; + const CANCELED = 'Canceled'; + const EXPIRED = 'Expired'; + const PAST_DUE = 'Past Due'; + const PENDING = 'Pending'; + + // Subscription Sources + const API = 'api'; + const CONTROL_PANEL = 'control_panel'; + const RECURRING = 'recurring'; + + /** + * @ignore + */ + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + + return $instance; + } + + /** + * @ignore + */ + protected function _initialize($attributes) + { + $this->_attributes = $attributes; + + $addOnArray = []; + if (isset($attributes['addOns'])) { + foreach ($attributes['addOns'] AS $addOn) { + $addOnArray[] = AddOn::factory($addOn); + } + } + $this->_attributes['addOns'] = $addOnArray; + + $discountArray = []; + if (isset($attributes['discounts'])) { + foreach ($attributes['discounts'] AS $discount) { + $discountArray[] = Discount::factory($discount); + } + } + $this->_attributes['discounts'] = $discountArray; + + if (isset($attributes['descriptor'])) { + $this->_set('descriptor', new Descriptor($attributes['descriptor'])); + } + + $statusHistory = []; + if (isset($attributes['statusHistory'])) { + foreach ($attributes['statusHistory'] AS $history) { + $statusHistory[] = new Subscription\StatusDetails($history); + } + } + $this->_attributes['statusHistory'] = $statusHistory; + + $transactionArray = []; + if (isset($attributes['transactions'])) { + foreach ($attributes['transactions'] AS $transaction) { + $transactionArray[] = Transaction::factory($transaction); + } + } + $this->_attributes['transactions'] = $transactionArray; + } + + /** + * returns a string representation of the customer + * @return string + */ + public function __toString() + { + $excludedAttributes = ['statusHistory']; + + $displayAttributes = []; + foreach($this->_attributes as $key => $val) { + if (!in_array($key, $excludedAttributes)) { + $displayAttributes[$key] = $val; + } + } + + return __CLASS__ . '[' . + Util::attributesToString($displayAttributes) .']'; + } + + + // static methods redirecting to gateway + + public static function create($attributes) + { + return Configuration::gateway()->subscription()->create($attributes); + } + + public static function find($id) + { + return Configuration::gateway()->subscription()->find($id); + } + + public static function search($query) + { + return Configuration::gateway()->subscription()->search($query); + } + + public static function fetch($query, $ids) + { + return Configuration::gateway()->subscription()->fetch($query, $ids); + } + + public static function update($subscriptionId, $attributes) + { + return Configuration::gateway()->subscription()->update($subscriptionId, $attributes); + } + + public static function retryCharge($subscriptionId, $amount = null) + { + return Configuration::gateway()->subscription()->retryCharge($subscriptionId, $amount); + } + + public static function cancel($subscriptionId) + { + return Configuration::gateway()->subscription()->cancel($subscriptionId); + } +} +class_alias('Braintree\Subscription', 'Braintree_Subscription'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Subscription/StatusDetails.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Subscription/StatusDetails.php new file mode 100644 index 000000000..fda998a7c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Subscription/StatusDetails.php @@ -0,0 +1,23 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/SubscriptionGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/SubscriptionGateway.php new file mode 100644 index 000000000..8e727643a --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/SubscriptionGateway.php @@ -0,0 +1,215 @@ +== More information == + * + * For more detailed information on Subscriptions, see {@link http://www.braintreepayments.com/gateway/subscription-api http://www.braintreepaymentsolutions.com/gateway/subscription-api} + * + * PHP Version 5 + * + * @package Braintree + * @copyright 2015 Braintree, a division of PayPal, Inc. + */ +class SubscriptionGateway +{ + private $_gateway; + private $_config; + private $_http; + + public function __construct($gateway) + { + $this->_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + public function create($attributes) + { + Util::verifyKeys(self::_createSignature(), $attributes); + $path = $this->_config->merchantPath() . '/subscriptions'; + $response = $this->_http->post($path, ['subscription' => $attributes]); + return $this->_verifyGatewayResponse($response); + } + + public function find($id) + { + $this->_validateId($id); + + try { + $path = $this->_config->merchantPath() . '/subscriptions/' . $id; + $response = $this->_http->get($path); + return Subscription::factory($response['subscription']); + } catch (Exception\NotFound $e) { + throw new Exception\NotFound('subscription with id ' . $id . ' not found'); + } + + } + + public function search($query) + { + $criteria = []; + foreach ($query as $term) { + $criteria[$term->name] = $term->toparam(); + } + + + $path = $this->_config->merchantPath() . '/subscriptions/advanced_search_ids'; + $response = $this->_http->post($path, ['search' => $criteria]); + $pager = [ + 'object' => $this, + 'method' => 'fetch', + 'methodArgs' => [$query] + ]; + + return new ResourceCollection($response, $pager); + } + + public function fetch($query, $ids) + { + $criteria = []; + foreach ($query as $term) { + $criteria[$term->name] = $term->toparam(); + } + $criteria["ids"] = SubscriptionSearch::ids()->in($ids)->toparam(); + $path = $this->_config->merchantPath() . '/subscriptions/advanced_search'; + $response = $this->_http->post($path, ['search' => $criteria]); + + return Util::extractAttributeAsArray( + $response['subscriptions'], + 'subscription' + ); + } + + public function update($subscriptionId, $attributes) + { + Util::verifyKeys(self::_updateSignature(), $attributes); + $path = $this->_config->merchantPath() . '/subscriptions/' . $subscriptionId; + $response = $this->_http->put($path, ['subscription' => $attributes]); + return $this->_verifyGatewayResponse($response); + } + + public function retryCharge($subscriptionId, $amount = null) + { + $transaction_params = ['type' => Transaction::SALE, + 'subscriptionId' => $subscriptionId]; + if (isset($amount)) { + $transaction_params['amount'] = $amount; + } + + $path = $this->_config->merchantPath() . '/transactions'; + $response = $this->_http->post($path, ['transaction' => $transaction_params]); + return $this->_verifyGatewayResponse($response); + } + + public function cancel($subscriptionId) + { + $path = $this->_config->merchantPath() . '/subscriptions/' . $subscriptionId . '/cancel'; + $response = $this->_http->put($path); + return $this->_verifyGatewayResponse($response); + } + + private static function _createSignature() + { + return array_merge( + [ + 'billingDayOfMonth', + 'firstBillingDate', + 'createdAt', + 'updatedAt', + 'id', + 'merchantAccountId', + 'neverExpires', + 'numberOfBillingCycles', + 'paymentMethodToken', + 'paymentMethodNonce', + 'planId', + 'price', + 'trialDuration', + 'trialDurationUnit', + 'trialPeriod', + ['descriptor' => ['name', 'phone', 'url']], + ['options' => ['doNotInheritAddOnsOrDiscounts', 'startImmediately']], + ], + self::_addOnDiscountSignature() + ); + } + + private static function _updateSignature() + { + return array_merge( + [ + 'merchantAccountId', 'numberOfBillingCycles', 'paymentMethodToken', 'planId', + 'paymentMethodNonce', 'id', 'neverExpires', 'price', + ['descriptor' => ['name', 'phone', 'url']], + ['options' => ['prorateCharges', 'replaceAllAddOnsAndDiscounts', 'revertSubscriptionOnProrationFailure']], + ], + self::_addOnDiscountSignature() + ); + } + + private static function _addOnDiscountSignature() + { + return [ + [ + 'addOns' => [ + ['add' => ['amount', 'inheritedFromId', 'neverExpires', 'numberOfBillingCycles', 'quantity']], + ['update' => ['amount', 'existingId', 'neverExpires', 'numberOfBillingCycles', 'quantity']], + ['remove' => ['_anyKey_']], + ] + ], + [ + 'discounts' => [ + ['add' => ['amount', 'inheritedFromId', 'neverExpires', 'numberOfBillingCycles', 'quantity']], + ['update' => ['amount', 'existingId', 'neverExpires', 'numberOfBillingCycles', 'quantity']], + ['remove' => ['_anyKey_']], + ] + ] + ]; + } + + /** + * @ignore + */ + private function _validateId($id = null) { + if (empty($id)) { + throw new InvalidArgumentException( + 'expected subscription id to be set' + ); + } + if (!preg_match('/^[0-9A-Za-z_-]+$/', $id)) { + throw new InvalidArgumentException( + $id . ' is an invalid subscription id.' + ); + } + } + + /** + * @ignore + */ + private function _verifyGatewayResponse($response) + { + if (isset($response['subscription'])) { + return new Result\Successful( + Subscription::factory($response['subscription']) + ); + } else if (isset($response['transaction'])) { + // return a populated instance of Transaction, for subscription retryCharge + return new Result\Successful( + Transaction::factory($response['transaction']) + ); + } else if (isset($response['apiErrorResponse'])) { + return new Result\Error($response['apiErrorResponse']); + } else { + throw new Exception\Unexpected( + "Expected subscription, transaction, or apiErrorResponse" + ); + } + } +} +class_alias('Braintree\SubscriptionGateway', 'Braintree_SubscriptionGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/SubscriptionSearch.php b/modules/paypal/api/sdk/braintree/lib/Braintree/SubscriptionSearch.php new file mode 100644 index 000000000..fc30622c4 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/SubscriptionSearch.php @@ -0,0 +1,67 @@ + '378734493671000', + 'Discover' => '6011000990139424', + 'MasterCard' => '5105105105105100', + 'Visa' => '4000111111111115', + ]; + + public static $amexPayWithPoints = [ + 'Success' => "371260714673002", + 'IneligibleCard' => "378267515471109", + 'InsufficientPoints' => "371544868764018", + ]; + + public static function getAll() + { + return array_merge( + self::$amExes, + self::$discoverCards, + self::$masterCards, + self::$visas + ); + } +} +class_alias('Braintree\Test\CreditCardNumbers', 'Braintree_Test_CreditCardNumbers'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Test/MerchantAccount.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Test/MerchantAccount.php new file mode 100644 index 000000000..581eccd2d --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Test/MerchantAccount.php @@ -0,0 +1,22 @@ +testing()->settle($transactionId); + } + + /** + * settlement confirm a transaction by id in sandbox + * + * @param string $id transaction id + * @param Configuration $config gateway config + * @return Transaction + */ + public static function settlementConfirm($transactionId) + { + return Configuration::gateway()->testing()->settlementConfirm($transactionId); + } + + /** + * settlement decline a transaction by id in sandbox + * + * @param string $id transaction id + * @param Configuration $config gateway config + * @return Transaction + */ + public static function settlementDecline($transactionId) + { + return Configuration::gateway()->testing()->settlementDecline($transactionId); + } + + /** + * settlement pending a transaction by id in sandbox + * + * @param string $id transaction id + * @param Configuration $config gateway config + * @return Transaction + */ + public static function settlementPending($transactionId) + { + return Configuration::gateway()->testing()->settlementPending($transactionId); + } +} +class_alias('Braintree\Test\Transaction', 'Braintree_Test_Transaction'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Test/TransactionAmounts.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Test/TransactionAmounts.php new file mode 100644 index 000000000..8a9e9309a --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Test/TransactionAmounts.php @@ -0,0 +1,19 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/TestingGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/TestingGateway.php new file mode 100644 index 000000000..cb707d15b --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/TestingGateway.php @@ -0,0 +1,52 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_http = new Http($this->_config); + } + + public function settle($transactionId) + { + return self::_doTestRequest('/settle', $transactionId); + } + + public function settlementPending($transactionId) + { + return self::_doTestRequest('/settlement_pending', $transactionId); + } + + public function settlementConfirm($transactionId) + { + return self::_doTestRequest('/settlement_confirm', $transactionId); + } + + public function settlementDecline($transactionId) + { + return self::_doTestRequest('/settlement_decline', $transactionId); + } + + private function _doTestRequest($testPath, $transactionId) + { + self::_checkEnvironment(); + $path = $this->_config->merchantPath() . '/transactions/' . $transactionId . $testPath; + $response = $this->_http->put($path); + return Transaction::factory($response['transaction']); + } + + private function _checkEnvironment() + { + if (Configuration::$global->getEnvironment() === 'production') { + throw new Exception\TestOperationPerformedInProduction(); + } + } +} +class_alias('Braintree\TestingGateway', 'Braintree_TestingGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/TextNode.php b/modules/paypal/api/sdk/braintree/lib/Braintree/TextNode.php new file mode 100644 index 000000000..9f932a35c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/TextNode.php @@ -0,0 +1,12 @@ +searchTerms["contains"] = strval($value); + return $this; + } +} +class_alias('Braintree\TextNode', 'Braintree_TextNode'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/ThreeDSecureInfo.php b/modules/paypal/api/sdk/braintree/lib/Braintree/ThreeDSecureInfo.php new file mode 100644 index 000000000..a04ec396b --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/ThreeDSecureInfo.php @@ -0,0 +1,30 @@ +_initialize($attributes); + + return $instance; + } + + protected function _initialize($attributes) + { + $this->_attributes = $attributes; + } + + /** + * returns a string representation of the three d secure info + * @return string + */ + public function __toString() + { + return __CLASS__ . '[' . + Util::attributesToString($this->_attributes) .']'; + } + +} +class_alias('Braintree\ThreeDSecureInfo', 'Braintree_ThreeDSecureInfo'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction.php new file mode 100644 index 000000000..d2ee7288a --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction.php @@ -0,0 +1,557 @@ +Minimalistic example: + * + * Transaction::saleNoValidate(array( + * 'amount' => '100.00', + * 'creditCard' => array( + * 'number' => '5105105105105100', + * 'expirationDate' => '05/12', + * ), + * )); + * + * + * Full example: + * + * Transaction::saleNoValidate(array( + * 'amount' => '100.00', + * 'orderId' => '123', + * 'channel' => 'MyShoppingCardProvider', + * 'creditCard' => array( + * // if token is omitted, the gateway will generate a token + * 'token' => 'credit_card_123', + * 'number' => '5105105105105100', + * 'expirationDate' => '05/2011', + * 'cvv' => '123', + * ), + * 'customer' => array( + * // if id is omitted, the gateway will generate an id + * 'id' => 'customer_123', + * 'firstName' => 'Dan', + * 'lastName' => 'Smith', + * 'company' => 'Braintree', + * 'email' => 'dan@example.com', + * 'phone' => '419-555-1234', + * 'fax' => '419-555-1235', + * 'website' => 'http://braintreepayments.com' + * ), + * 'billing' => array( + * 'firstName' => 'Carl', + * 'lastName' => 'Jones', + * 'company' => 'Braintree', + * 'streetAddress' => '123 E Main St', + * 'extendedAddress' => 'Suite 403', + * 'locality' => 'Chicago', + * 'region' => 'IL', + * 'postalCode' => '60622', + * 'countryName' => 'United States of America' + * ), + * 'shipping' => array( + * 'firstName' => 'Andrew', + * 'lastName' => 'Mason', + * 'company' => 'Braintree', + * 'streetAddress' => '456 W Main St', + * 'extendedAddress' => 'Apt 2F', + * 'locality' => 'Bartlett', + * 'region' => 'IL', + * 'postalCode' => '60103', + * 'countryName' => 'United States of America' + * ), + * 'customFields' => array( + * 'birthdate' => '11/13/1954' + * ) + * ) + * + * + * == Storing in the Vault == + * + * The customer and credit card information used for + * a transaction can be stored in the vault by setting + * transaction[options][storeInVault] to true. + * + * $transaction = Transaction::saleNoValidate(array( + * 'customer' => array( + * 'firstName' => 'Adam', + * 'lastName' => 'Williams' + * ), + * 'creditCard' => array( + * 'number' => '5105105105105100', + * 'expirationDate' => '05/2012' + * ), + * 'options' => array( + * 'storeInVault' => true + * ) + * )); + * + * echo $transaction->customerDetails->id + * // '865534' + * echo $transaction->creditCardDetails->token + * // '6b6m' + * + * + * To also store the billing address in the vault, pass the + * addBillingAddressToPaymentMethod option. + * + * Transaction.saleNoValidate(array( + * ... + * 'options' => array( + * 'storeInVault' => true + * 'addBillingAddressToPaymentMethod' => true + * ) + * )); + * + * + * == Submitting for Settlement== + * + * This can only be done when the transction's + * status is authorized. If amount is not specified, + * the full authorized amount will be settled. If you would like to settle + * less than the full authorized amount, pass the desired amount. + * You cannot settle more than the authorized amount. + * + * A transaction can be submitted for settlement when created by setting + * $transaction[options][submitForSettlement] to true. + * + * + * $transaction = Transaction::saleNoValidate(array( + * 'amount' => '100.00', + * 'creditCard' => array( + * 'number' => '5105105105105100', + * 'expirationDate' => '05/2012' + * ), + * 'options' => array( + * 'submitForSettlement' => true + * ) + * )); + * + * + * == More information == + * + * For more detailed information on Transactions, see {@link http://www.braintreepayments.com/gateway/transaction-api http://www.braintreepaymentsolutions.com/gateway/transaction-api} + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * + * @property-read string $avsErrorResponseCode + * @property-read string $avsPostalCodeResponseCode + * @property-read string $avsStreetAddressResponseCode + * @property-read string $cvvResponseCode + * @property-read string $id transaction id + * @property-read string $amount transaction amount + * @property-read Braintree\Transaction\AddressDetails $billingDetails transaction billing address + * @property-read string $createdAt transaction created timestamp + * @property-read Braintree\ApplePayCardDetails $applePayCardDetails transaction Apple Pay card info + * @property-read Braintree\AndroidPayCardDetails $androidPayCardDetails transaction Android Pay card info + * @property-read Braintree\AmexExpressCheckoutCardDetails $amexExpressCheckoutCardDetails transaction Amex Express Checkout card info + * @property-read Braintree\CreditCardDetails $creditCardDetails transaction credit card info + * @property-read Braintree\CoinbaseAccountDetails $coinbaseDetails transaction Coinbase account info + * @property-read Braintree\PayPalAccountDetails $paypalDetails transaction paypal account info + * @property-read Braintree\Customer $customerDetails transaction customer info + * @property-read Braintree\VenmoAccount $venmoAccountDetails transaction Venmo Account info + * @property-read array $customFields custom fields passed with the request + * @property-read string $processorResponseCode gateway response code + * @property-read string $additionalProcessorResponse raw response from processor + * @property-read Braintree\Transaction\AddressDetails $shippingDetails transaction shipping address + * @property-read string $status transaction status + * @property-read array $statusHistory array of StatusDetails objects + * @property-read string $type transaction type + * @property-read string $updatedAt transaction updated timestamp + * @property-read Braintree\Disbursement $disbursementDetails populated when transaction is disbursed + * @property-read Braintree\Dispute $disputes populated when transaction is disputed + * + */ + +final class Transaction extends Base +{ + // Transaction Status + const AUTHORIZATION_EXPIRED = 'authorization_expired'; + const AUTHORIZING = 'authorizing'; + const AUTHORIZED = 'authorized'; + const GATEWAY_REJECTED = 'gateway_rejected'; + const FAILED = 'failed'; + const PROCESSOR_DECLINED = 'processor_declined'; + const SETTLED = 'settled'; + const SETTLING = 'settling'; + const SUBMITTED_FOR_SETTLEMENT = 'submitted_for_settlement'; + const VOIDED = 'voided'; + const UNRECOGNIZED = 'unrecognized'; + const SETTLEMENT_DECLINED = 'settlement_declined'; + const SETTLEMENT_PENDING = 'settlement_pending'; + const SETTLEMENT_CONFIRMED = 'settlement_confirmed'; + + // Transaction Escrow Status + const ESCROW_HOLD_PENDING = 'hold_pending'; + const ESCROW_HELD = 'held'; + const ESCROW_RELEASE_PENDING = 'release_pending'; + const ESCROW_RELEASED = 'released'; + const ESCROW_REFUNDED = 'refunded'; + + // Transaction Types + const SALE = 'sale'; + const CREDIT = 'credit'; + + // Transaction Created Using + const FULL_INFORMATION = 'full_information'; + const TOKEN = 'token'; + + // Transaction Sources + const API = 'api'; + const CONTROL_PANEL = 'control_panel'; + const RECURRING = 'recurring'; + + // Gateway Rejection Reason + const AVS = 'avs'; + const AVS_AND_CVV = 'avs_and_cvv'; + const CVV = 'cvv'; + const DUPLICATE = 'duplicate'; + const FRAUD = 'fraud'; + const THREE_D_SECURE = 'three_d_secure'; + const APPLICATION_INCOMPLETE = 'application_incomplete'; + + // Industry Types + const LODGING_INDUSTRY = 'lodging'; + const TRAVEL_AND_CRUISE_INDUSTRY = 'travel_cruise'; + + /** + * sets instance properties from an array of values + * + * @ignore + * @access protected + * @param array $transactionAttribs array of transaction data + * @return void + */ + protected function _initialize($transactionAttribs) + { + $this->_attributes = $transactionAttribs; + + if (isset($transactionAttribs['applePay'])) { + $this->_set('applePayCardDetails', + new Transaction\ApplePayCardDetails( + $transactionAttribs['applePay'] + ) + ); + } + + if (isset($transactionAttribs['androidPayCard'])) { + $this->_set('androidPayCardDetails', + new Transaction\AndroidPayCardDetails( + $transactionAttribs['androidPayCard'] + ) + ); + } + + if (isset($transactionAttribs['amexExpressCheckoutCard'])) { + $this->_set('amexExpressCheckoutCardDetails', + new Transaction\AmexExpressCheckoutCardDetails( + $transactionAttribs['amexExpressCheckoutCard'] + ) + ); + } + + if (isset($transactionAttribs['venmoAccount'])) { + $this->_set('venmoAccountDetails', + new Transaction\VenmoAccountDetails( + $transactionAttribs['venmoAccount'] + ) + ); + } + + if (isset($transactionAttribs['creditCard'])) { + $this->_set('creditCardDetails', + new Transaction\CreditCardDetails( + $transactionAttribs['creditCard'] + ) + ); + } + + if (isset($transactionAttribs['coinbaseAccount'])) { + $this->_set('coinbaseDetails', + new Transaction\CoinbaseDetails( + $transactionAttribs['coinbaseAccount'] + ) + ); + } + + if (isset($transactionAttribs['europeBankAccount'])) { + $this->_set('europeBankAccount', + new Transaction\EuropeBankAccountDetails( + $transactionAttribs['europeBankAccount'] + ) + ); + } + + if (isset($transactionAttribs['paypal'])) { + $this->_set('paypalDetails', + new Transaction\PayPalDetails( + $transactionAttribs['paypal'] + ) + ); + } + + if (isset($transactionAttribs['customer'])) { + $this->_set('customerDetails', + new Transaction\CustomerDetails( + $transactionAttribs['customer'] + ) + ); + } + + if (isset($transactionAttribs['billing'])) { + $this->_set('billingDetails', + new Transaction\AddressDetails( + $transactionAttribs['billing'] + ) + ); + } + + if (isset($transactionAttribs['shipping'])) { + $this->_set('shippingDetails', + new Transaction\AddressDetails( + $transactionAttribs['shipping'] + ) + ); + } + + if (isset($transactionAttribs['subscription'])) { + $this->_set('subscriptionDetails', + new Transaction\SubscriptionDetails( + $transactionAttribs['subscription'] + ) + ); + } + + if (isset($transactionAttribs['descriptor'])) { + $this->_set('descriptor', + new Descriptor( + $transactionAttribs['descriptor'] + ) + ); + } + + if (isset($transactionAttribs['disbursementDetails'])) { + $this->_set('disbursementDetails', + new DisbursementDetails($transactionAttribs['disbursementDetails']) + ); + } + + $disputes = []; + if (isset($transactionAttribs['disputes'])) { + foreach ($transactionAttribs['disputes'] AS $dispute) { + $disputes[] = Dispute::factory($dispute); + } + } + + $this->_set('disputes', $disputes); + + $statusHistory = []; + if (isset($transactionAttribs['statusHistory'])) { + foreach ($transactionAttribs['statusHistory'] AS $history) { + $statusHistory[] = new Transaction\StatusDetails($history); + } + } + + $this->_set('statusHistory', $statusHistory); + + $addOnArray = []; + if (isset($transactionAttribs['addOns'])) { + foreach ($transactionAttribs['addOns'] AS $addOn) { + $addOnArray[] = AddOn::factory($addOn); + } + } + $this->_set('addOns', $addOnArray); + + $discountArray = []; + if (isset($transactionAttribs['discounts'])) { + foreach ($transactionAttribs['discounts'] AS $discount) { + $discountArray[] = Discount::factory($discount); + } + } + $this->_set('discounts', $discountArray); + + if(isset($transactionAttribs['riskData'])) { + $this->_set('riskData', RiskData::factory($transactionAttribs['riskData'])); + } + if(isset($transactionAttribs['threeDSecureInfo'])) { + $this->_set('threeDSecureInfo', ThreeDSecureInfo::factory($transactionAttribs['threeDSecureInfo'])); + } + if(isset($transactionAttribs['facilitatorDetails'])) { + $this->_set('facilitatorDetails', FacilitatorDetails::factory($transactionAttribs['facilitatorDetails'])); + } + } + + /** + * returns a string representation of the transaction + * @return string + */ + public function __toString() + { + // array of attributes to print + $display = [ + 'id', 'type', 'amount', 'status', + 'createdAt', 'creditCardDetails', 'customerDetails' + ]; + + $displayAttributes = []; + foreach ($display AS $attrib) { + $displayAttributes[$attrib] = $this->$attrib; + } + return __CLASS__ . '[' . + Util::attributesToString($displayAttributes) .']'; + } + + public function isEqual($otherTx) + { + return $this->id === $otherTx->id; + } + + public function vaultCreditCard() + { + $token = $this->creditCardDetails->token; + if (empty($token)) { + return null; + } + else { + return CreditCard::find($token); + } + } + + /** @return void|Braintree\Customer */ + public function vaultCustomer() + { + $customerId = $this->customerDetails->id; + if (empty($customerId)) { + return null; + } + else { + return Customer::find($customerId); + } + } + + /** @return bool */ + public function isDisbursed() { + return $this->disbursementDetails->isValid(); + } + + /** + * factory method: returns an instance of Transaction + * to the requesting method, with populated properties + * + * @ignore + * @return Transaction + */ + public static function factory($attributes) + { + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + + // static methods redirecting to gateway + + public static function cloneTransaction($transactionId, $attribs) + { + return Configuration::gateway()->transaction()->cloneTransaction($transactionId, $attribs); + } + + public static function createFromTransparentRedirect($queryString) + { + return Configuration::gateway()->transaction()->createFromTransparentRedirect($queryString); + } + + public static function createTransactionUrl() + { + return Configuration::gateway()->transaction()->createTransactionUrl(); + } + + public static function credit($attribs) + { + return Configuration::gateway()->transaction()->credit($attribs); + } + + public static function creditNoValidate($attribs) + { + return Configuration::gateway()->transaction()->creditNoValidate($attribs); + } + + public static function find($id) + { + return Configuration::gateway()->transaction()->find($id); + } + + public static function sale($attribs) + { + return Configuration::gateway()->transaction()->sale($attribs); + } + + public static function saleNoValidate($attribs) + { + return Configuration::gateway()->transaction()->saleNoValidate($attribs); + } + + public static function search($query) + { + return Configuration::gateway()->transaction()->search($query); + } + + public static function fetch($query, $ids) + { + return Configuration::gateway()->transaction()->fetch($query, $ids); + } + + public static function void($transactionId) + { + return Configuration::gateway()->transaction()->void($transactionId); + } + + public static function voidNoValidate($transactionId) + { + return Configuration::gateway()->transaction()->voidNoValidate($transactionId); + } + + public static function submitForSettlement($transactionId, $amount = null, $attribs = []) + { + return Configuration::gateway()->transaction()->submitForSettlement($transactionId, $amount, $attribs); + } + + public static function submitForSettlementNoValidate($transactionId, $amount = null, $attribs = []) + { + return Configuration::gateway()->transaction()->submitForSettlementNoValidate($transactionId, $amount, $attribs); + } + + public static function submitForPartialSettlement($transactionId, $amount, $attribs = []) + { + return Configuration::gateway()->transaction()->submitForPartialSettlement($transactionId, $amount, $attribs); + } + + public static function holdInEscrow($transactionId) + { + return Configuration::gateway()->transaction()->holdInEscrow($transactionId); + } + + public static function releaseFromEscrow($transactionId) + { + return Configuration::gateway()->transaction()->releaseFromEscrow($transactionId); + } + + public static function cancelRelease($transactionId) + { + return Configuration::gateway()->transaction()->cancelRelease($transactionId); + } + + public static function refund($transactionId, $amount = null) + { + return Configuration::gateway()->transaction()->refund($transactionId, $amount); + } +} +class_alias('Braintree\Transaction', 'Braintree_Transaction'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/AddressDetails.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/AddressDetails.php new file mode 100644 index 000000000..d9257210f --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/AddressDetails.php @@ -0,0 +1,28 @@ +_attributes['cardType'] = $this->virtualCardType; + $this->_attributes['last4'] = $this->virtualCardLast4; + } +} +class_alias('Braintree\Transaction\AndroidPayCardDetails', 'Braintree_Transaction_AndroidPayCardDetails'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/ApplePayCardDetails.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/ApplePayCardDetails.php new file mode 100644 index 000000000..e9ce5d4b9 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/ApplePayCardDetails.php @@ -0,0 +1,41 @@ +_attributes['expirationDate'] = $this->expirationMonth . '/' . $this->expirationYear; + $this->_attributes['maskedNumber'] = $this->bin . '******' . $this->last4; + + } +} +class_alias('Braintree\Transaction\CreditCardDetails', 'Braintree_Transaction_CreditCardDetails'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/CustomerDetails.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/CustomerDetails.php new file mode 100644 index 000000000..45e5f11a3 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Transaction/CustomerDetails.php @@ -0,0 +1,26 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/TransactionGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/TransactionGateway.php new file mode 100644 index 000000000..708c0d953 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/TransactionGateway.php @@ -0,0 +1,481 @@ +== More information == + * + * For more detailed information on Transactions, see {@link http://www.braintreepayments.com/gateway/transaction-api http://www.braintreepaymentsolutions.com/gateway/transaction-api} + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + */ + +final class TransactionGateway +{ + private $_gateway; + private $_config; + private $_http; + + public function __construct($gateway) + { + $this->_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + $this->_http = new Http($gateway->config); + } + + public function cloneTransaction($transactionId, $attribs) + { + Util::verifyKeys(self::cloneSignature(), $attribs); + return $this->_doCreate('/transactions/' . $transactionId . '/clone', ['transactionClone' => $attribs]); + } + + /** + * @ignore + * @access private + * @param array $attribs + * @return object + */ + private function create($attribs) + { + Util::verifyKeys(self::createSignature(), $attribs); + return $this->_doCreate('/transactions', ['transaction' => $attribs]); + } + + /** + * @ignore + * @access private + * @param array $attribs + * @return object + * @throws Exception\ValidationError + */ + private function createNoValidate($attribs) + { + $result = $this->create($attribs); + return Util::returnObjectOrThrowException(__CLASS__, $result); + } + /** + * + * @deprecated since version 2.3.0 + * @access public + * @param array $attribs + * @return object + */ + public function createFromTransparentRedirect($queryString) + { + trigger_error("DEPRECATED: Please use TransparentRedirectRequest::confirm", E_USER_NOTICE); + $params = TransparentRedirect::parseAndValidateQueryString( + $queryString + ); + return $this->_doCreate( + '/transactions/all/confirm_transparent_redirect_request', + ['id' => $params['id']] + ); + } + /** + * + * @deprecated since version 2.3.0 + * @access public + * @param none + * @return string + */ + public function createTransactionUrl() + { + trigger_error("DEPRECATED: Please use TransparentRedirectRequest::url", E_USER_NOTICE); + return $this->_config->baseUrl() . $this->_config->merchantPath() . + '/transactions/all/create_via_transparent_redirect_request'; + } + + public static function cloneSignature() + { + return ['amount', 'channel', ['options' => ['submitForSettlement']]]; + } + + /** + * creates a full array signature of a valid gateway request + * @return array gateway request signature format + */ + public static function createSignature() + { + return [ + 'amount', + 'billingAddressId', + 'channel', + 'customerId', + 'deviceData', + 'deviceSessionId', + 'fraudMerchantId', + 'merchantAccountId', + 'orderId', + 'paymentMethodNonce', + 'paymentMethodToken', + 'purchaseOrderNumber', + 'recurring', + 'serviceFeeAmount', + 'sharedPaymentMethodToken', + 'sharedCustomerId', + 'sharedShippingAddressId', + 'sharedBillingAddressId', + 'shippingAddressId', + 'taxAmount', + 'taxExempt', + 'threeDSecureToken', + 'type', + 'venmoSdkPaymentMethodCode', + ['creditCard' => + ['token', 'cardholderName', 'cvv', 'expirationDate', 'expirationMonth', 'expirationYear', 'number'], + ], + ['customer' => + [ + 'id', 'company', 'email', 'fax', 'firstName', + 'lastName', 'phone', 'website'], + ], + ['billing' => + [ + 'firstName', 'lastName', 'company', 'countryName', + 'countryCodeAlpha2', 'countryCodeAlpha3', 'countryCodeNumeric', + 'extendedAddress', 'locality', 'postalCode', 'region', + 'streetAddress'], + ], + ['shipping' => + [ + 'firstName', 'lastName', 'company', 'countryName', + 'countryCodeAlpha2', 'countryCodeAlpha3', 'countryCodeNumeric', + 'extendedAddress', 'locality', 'postalCode', 'region', + 'streetAddress'], + ], + ['options' => + [ + 'holdInEscrow', + 'storeInVault', + 'storeInVaultOnSuccess', + 'submitForSettlement', + 'addBillingAddressToPaymentMethod', + 'venmoSdkSession', + 'storeShippingAddressInVault', + 'payeeEmail', + ['three_d_secure' => + ['required'] + ], + ['paypal' => + [ + 'payeeEmail', + 'customField', + 'description', + ['supplementaryData' => ['_anyKey_']], + ] + ], + ['amexRewards' => + [ + 'requestId', + 'points', + 'currencyAmount', + 'currencyIsoCode' + ] + ] + ], + ], + ['customFields' => ['_anyKey_']], + ['descriptor' => ['name', 'phone', 'url']], + ['paypalAccount' => ['payeeEmail']], + ['apple_pay_card' => ['number', 'cardholder_name', 'cryptogram', 'expiration_month', 'expiration_year']], + ['industry' => + ['industryType', + ['data' => + [ + 'folioNumber', + 'checkInDate', + 'checkOutDate', + 'travelPackage', + 'departureDate', + 'lodgingCheckInDate', + 'lodgingCheckOutDate', + 'lodgingName', + 'roomRate' + ] + ] + ] + ] + ]; + } + + public static function submitForSettlementSignature() + { + return ['orderId', ['descriptor' => ['name', 'phone', 'url']]]; + } + + /** + * + * @access public + * @param array $attribs + * @return Result\Successful|Result\Error + */ + public function credit($attribs) + { + return $this->create(array_merge($attribs, ['type' => Transaction::CREDIT])); + } + + /** + * + * @access public + * @param array $attribs + * @return Result\Successful|Result\Error + * @throws Exception\ValidationError + */ + public function creditNoValidate($attribs) + { + $result = $this->credit($attribs); + return Util::returnObjectOrThrowException(__CLASS__, $result); + } + + /** + * @access public + * @param string id + * @return Transaction + */ + public function find($id) + { + $this->_validateId($id); + try { + $path = $this->_config->merchantPath() . '/transactions/' . $id; + $response = $this->_http->get($path); + return Transaction::factory($response['transaction']); + } catch (Exception\NotFound $e) { + throw new Exception\NotFound( + 'transaction with id ' . $id . ' not found' + ); + } + } + /** + * new sale + * @param array $attribs + * @return array + */ + public function sale($attribs) + { + return $this->create(array_merge(['type' => Transaction::SALE], $attribs)); + } + + /** + * roughly equivalent to the ruby bang method + * @access public + * @param array $attribs + * @return array + * @throws Exception\ValidationsFailed + */ + public function saleNoValidate($attribs) + { + $result = $this->sale($attribs); + return Util::returnObjectOrThrowException(__CLASS__, $result); + } + + /** + * Returns a ResourceCollection of transactions matching the search query. + * + * If query is a string, the search will be a basic search. + * If query is a hash, the search will be an advanced search. + * For more detailed information and examples, see {@link http://www.braintreepayments.com/gateway/transaction-api#searching http://www.braintreepaymentsolutions.com/gateway/transaction-api} + * + * @param mixed $query search query + * @param array $options options such as page number + * @return ResourceCollection + * @throws InvalidArgumentException + */ + public function search($query) + { + $criteria = []; + foreach ($query as $term) { + $criteria[$term->name] = $term->toparam(); + } + + $path = $this->_config->merchantPath() . '/transactions/advanced_search_ids'; + $response = $this->_http->post($path, ['search' => $criteria]); + if (array_key_exists('searchResults', $response)) { + $pager = [ + 'object' => $this, + 'method' => 'fetch', + 'methodArgs' => [$query] + ]; + + return new ResourceCollection($response, $pager); + } else { + throw new Exception\DownForMaintenance(); + } + } + + public function fetch($query, $ids) + { + $criteria = []; + foreach ($query as $term) { + $criteria[$term->name] = $term->toparam(); + } + $criteria["ids"] = TransactionSearch::ids()->in($ids)->toparam(); + $path = $this->_config->merchantPath() . '/transactions/advanced_search'; + $response = $this->_http->post($path, ['search' => $criteria]); + + return Util::extractattributeasarray( + $response['creditCardTransactions'], + 'transaction' + ); + } + + /** + * void a transaction by id + * + * @param string $id transaction id + * @return Result\Successful|Result\Error + */ + public function void($transactionId) + { + $this->_validateId($transactionId); + + $path = $this->_config->merchantPath() . '/transactions/'. $transactionId . '/void'; + $response = $this->_http->put($path); + return $this->_verifyGatewayResponse($response); + } + /** + * + */ + public function voidNoValidate($transactionId) + { + $result = $this->void($transactionId); + return Util::returnObjectOrThrowException(__CLASS__, $result); + } + + public function submitForSettlement($transactionId, $amount = null, $attribs = []) + { + $this->_validateId($transactionId); + Util::verifyKeys(self::submitForSettlementSignature(), $attribs); + $attribs['amount'] = $amount; + + $path = $this->_config->merchantPath() . '/transactions/'. $transactionId . '/submit_for_settlement'; + $response = $this->_http->put($path, ['transaction' => $attribs]); + return $this->_verifyGatewayResponse($response); + } + + public function submitForSettlementNoValidate($transactionId, $amount = null, $attribs = []) + { + $result = $this->submitForSettlement($transactionId, $amount, $attribs); + return Util::returnObjectOrThrowException(__CLASS__, $result); + } + + public function submitForPartialSettlement($transactionId, $amount, $attribs = []) + { + $this->_validateId($transactionId); + Util::verifyKeys(self::submitForSettlementSignature(), $attribs); + $attribs['amount'] = $amount; + + $path = $this->_config->merchantPath() . '/transactions/'. $transactionId . '/submit_for_partial_settlement'; + $response = $this->_http->post($path, ['transaction' => $attribs]); + return $this->_verifyGatewayResponse($response); + } + + public function holdInEscrow($transactionId) + { + $this->_validateId($transactionId); + + $path = $this->_config->merchantPath() . '/transactions/' . $transactionId . '/hold_in_escrow'; + $response = $this->_http->put($path, []); + return $this->_verifyGatewayResponse($response); + } + + public function releaseFromEscrow($transactionId) + { + $this->_validateId($transactionId); + + $path = $this->_config->merchantPath() . '/transactions/' . $transactionId . '/release_from_escrow'; + $response = $this->_http->put($path, []); + return $this->_verifyGatewayResponse($response); + } + + public function cancelRelease($transactionId) + { + $this->_validateId($transactionId); + + $path = $this->_config->merchantPath() . '/transactions/' . $transactionId . '/cancel_release'; + $response = $this->_http->put($path, []); + return $this->_verifyGatewayResponse($response); + } + + public function refund($transactionId, $amount = null) + { + self::_validateId($transactionId); + + $params = ['transaction' => ['amount' => $amount]]; + $path = $this->_config->merchantPath() . '/transactions/' . $transactionId . '/refund'; + $response = $this->_http->post($path, $params); + return $this->_verifyGatewayResponse($response); + } + + /** + * sends the create request to the gateway + * + * @ignore + * @param var $subPath + * @param array $params + * @return mixed + */ + public function _doCreate($subPath, $params) + { + $fullPath = $this->_config->merchantPath() . $subPath; + $response = $this->_http->post($fullPath, $params); + + return $this->_verifyGatewayResponse($response); + } + + /** + * verifies that a valid transaction id is being used + * @ignore + * @param string transaction id + * @throws InvalidArgumentException + */ + private function _validateId($id = null) { + if (empty($id)) { + throw new InvalidArgumentException( + 'expected transaction id to be set' + ); + } + if (!preg_match('/^[0-9a-z]+$/', $id)) { + throw new InvalidArgumentException( + $id . ' is an invalid transaction id.' + ); + } + } + + /** + * generic method for validating incoming gateway responses + * + * creates a new Transaction object and encapsulates + * it inside a Result\Successful object, or + * encapsulates a Errors object inside a Result\Error + * alternatively, throws an Unexpected exception if the response is invalid. + * + * @ignore + * @param array $response gateway response values + * @return Result\Successful|Result\Error + * @throws Exception\Unexpected + */ + private function _verifyGatewayResponse($response) + { + if (isset($response['transaction'])) { + // return a populated instance of Transaction + return new Result\Successful( + Transaction::factory($response['transaction']) + ); + } else if (isset($response['apiErrorResponse'])) { + return new Result\Error($response['apiErrorResponse']); + } else { + throw new Exception\Unexpected( + "Expected transaction or apiErrorResponse" + ); + } + } +} +class_alias('Braintree\TransactionGateway', 'Braintree_TransactionGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/TransactionSearch.php b/modules/paypal/api/sdk/braintree/lib/Braintree/TransactionSearch.php new file mode 100644 index 000000000..d537d862e --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/TransactionSearch.php @@ -0,0 +1,129 @@ + + * $trData = TransparentRedirect::createCustomerData(array( + * 'redirectUrl => 'http://example.com/redirect_back_to_merchant_site', + * )); + * + * + * In addition to the redirectUrl, any data that needs to be protected + * from user tampering should be included in the trData. + * For example, to prevent the user from tampering with the transaction + * amount, include the amount in the trData. + * + * + * $trData = TransparentRedirect::transactionData(array( + * 'redirectUrl' => 'http://example.com/complete_transaction', + * 'transaction' => array('amount' => '100.00'), + * )); + * + * + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + */ +class TransparentRedirect +{ + // Request Kinds + const CREATE_TRANSACTION = 'create_transaction'; + const CREATE_PAYMENT_METHOD = 'create_payment_method'; + const UPDATE_PAYMENT_METHOD = 'update_payment_method'; + const CREATE_CUSTOMER = 'create_customer'; + const UPDATE_CUSTOMER = 'update_customer'; + + /** + * @ignore + * don't permit an explicit call of the constructor! + * (like $t = new TransparentRedirect()) + */ + protected function __construct() + { + + } + + + // static methods redirecting to gateway + + public static function confirm($queryString) + { + return Configuration::gateway()->transparentRedirect()->confirm($queryString); + } + + public static function createCreditCardData($params) + { + return Configuration::gateway()->transparentRedirect()->createCreditCardData($params); + } + + public static function createCustomerData($params) + { + return Configuration::gateway()->transparentRedirect()->createCustomerData($params); + } + + public static function url() + { + return Configuration::gateway()->transparentRedirect()->url(); + } + + public static function transactionData($params) + { + return Configuration::gateway()->transparentRedirect()->transactionData($params); + } + + public static function updateCreditCardData($params) + { + return Configuration::gateway()->transparentRedirect()->updateCreditCardData($params); + } + + public static function updateCustomerData($params) + { + return Configuration::gateway()->transparentRedirect()->updateCustomerData($params); + } + + public static function parseAndValidateQueryString($queryString) + { + return Configuration::gateway()->transparentRedirect()->parseAndValidateQueryString($queryString); + } +} +class_alias('Braintree\TransparentRedirect', 'Braintree_TransparentRedirect'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/TransparentRedirectGateway.php b/modules/paypal/api/sdk/braintree/lib/Braintree/TransparentRedirectGateway.php new file mode 100644 index 000000000..9d4ec0961 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/TransparentRedirectGateway.php @@ -0,0 +1,290 @@ +_gateway = $gateway; + $this->_config = $gateway->config; + $this->_config->assertHasAccessTokenOrKeys(); + } + + /** + * + * @ignore + */ + private static $_transparentRedirectKeys = 'redirectUrl'; + private static $_createCustomerSignature; + private static $_updateCustomerSignature; + private static $_transactionSignature; + private static $_createCreditCardSignature; + private static $_updateCreditCardSignature; + + /** + * create signatures for different call types + * @ignore + */ + public static function init() + { + + self::$_createCustomerSignature = [ + self::$_transparentRedirectKeys, + ['customer' => CustomerGateway::createSignature()], + ]; + self::$_updateCustomerSignature = [ + self::$_transparentRedirectKeys, + 'customerId', + ['customer' => CustomerGateway::updateSignature()], + ]; + self::$_transactionSignature = [ + self::$_transparentRedirectKeys, + ['transaction' => TransactionGateway::createSignature()], + ]; + self::$_createCreditCardSignature = [ + self::$_transparentRedirectKeys, + ['creditCard' => CreditCardGateway::createSignature()], + ]; + self::$_updateCreditCardSignature = [ + self::$_transparentRedirectKeys, + 'paymentMethodToken', + ['creditCard' => CreditCardGateway::updateSignature()], + ]; + } + + public function confirm($queryString) + { + $params = TransparentRedirect::parseAndValidateQueryString( + $queryString + ); + $confirmationKlasses = [ + TransparentRedirect::CREATE_TRANSACTION => 'Braintree\TransactionGateway', + TransparentRedirect::CREATE_CUSTOMER => 'Braintree\CustomerGateway', + TransparentRedirect::UPDATE_CUSTOMER => 'Braintree\CustomerGateway', + TransparentRedirect::CREATE_PAYMENT_METHOD => 'Braintree\CreditCardGateway', + TransparentRedirect::UPDATE_PAYMENT_METHOD => 'Braintree\CreditCardGateway', + ]; + $confirmationGateway = new $confirmationKlasses[$params["kind"]]($this->_gateway); + return $confirmationGateway->_doCreate('/transparent_redirect_requests/' . $params['id'] . '/confirm', []); + } + + /** + * returns the trData string for creating a credit card, + * @param array $params + * @return string + */ + public function createCreditCardData($params) + { + Util::verifyKeys( + self::$_createCreditCardSignature, + $params + ); + $params["kind"] = TransparentRedirect::CREATE_PAYMENT_METHOD; + return $this->_data($params); + } + + /** + * returns the trData string for creating a customer. + * @param array $params + * @return string + */ + public function createCustomerData($params) + { + Util::verifyKeys( + self::$_createCustomerSignature, + $params + ); + $params["kind"] = TransparentRedirect::CREATE_CUSTOMER; + return $this->_data($params); + + } + + public function url() + { + return $this->_config->baseUrl() . $this->_config->merchantPath() . '/transparent_redirect_requests'; + } + + /** + * returns the trData string for creating a transaction + * @param array $params + * @return string + */ + public function transactionData($params) + { + Util::verifyKeys( + self::$_transactionSignature, + $params + ); + $params["kind"] = TransparentRedirect::CREATE_TRANSACTION; + $transactionType = isset($params['transaction']['type']) ? + $params['transaction']['type'] : + null; + if ($transactionType != Transaction::SALE && $transactionType != Transaction::CREDIT) { + throw new InvalidArgumentException( + 'expected transaction[type] of sale or credit, was: ' . + $transactionType + ); + } + + return $this->_data($params); + } + + /** + * Returns the trData string for updating a credit card. + * + * The paymentMethodToken of the credit card to update is required. + * + * + * $trData = TransparentRedirect::updateCreditCardData(array( + * 'redirectUrl' => 'http://example.com/redirect_here', + * 'paymentMethodToken' => 'token123', + * )); + * + * + * @param array $params + * @return string + */ + public function updateCreditCardData($params) + { + Util::verifyKeys( + self::$_updateCreditCardSignature, + $params + ); + if (!isset($params['paymentMethodToken'])) { + throw new InvalidArgumentException( + 'expected params to contain paymentMethodToken.' + ); + } + $params["kind"] = TransparentRedirect::UPDATE_PAYMENT_METHOD; + return $this->_data($params); + } + + /** + * Returns the trData string for updating a customer. + * + * The customerId of the customer to update is required. + * + * + * $trData = TransparentRedirect::updateCustomerData(array( + * 'redirectUrl' => 'http://example.com/redirect_here', + * 'customerId' => 'customer123', + * )); + * + * + * @param array $params + * @return string + */ + public function updateCustomerData($params) + { + Util::verifyKeys( + self::$_updateCustomerSignature, + $params + ); + if (!isset($params['customerId'])) { + throw new InvalidArgumentException( + 'expected params to contain customerId of customer to update' + ); + } + $params["kind"] = TransparentRedirect::UPDATE_CUSTOMER; + return $this->_data($params); + } + + public function parseAndValidateQueryString($queryString) + { + // parse the params into an array + parse_str($queryString, $params); + // remove the hash + $queryStringWithoutHash = null; + if (preg_match('/^(.*)&hash=[a-f0-9]+$/', $queryString, $match)) { + $queryStringWithoutHash = $match[1]; + } + + if($params['http_status'] != '200') { + $message = null; + if(array_key_exists('bt_message', $params)) { + $message = $params['bt_message']; + } + Util::throwStatusCodeException(isset($params['http_status']) ? $params['http_status'] : null, $message); + } + + // recreate the hash and compare it + if ($this->_hash($queryStringWithoutHash) == $params['hash']) { + return $params; + } else { + throw new Exception\ForgedQueryString(); + } + } + + + /** + * + * @ignore + */ + private function _data($params) + { + if (!isset($params['redirectUrl'])) { + throw new InvalidArgumentException( + 'expected params to contain redirectUrl' + ); + } + $params = $this->_underscoreKeys($params); + $now = new DateTime('now', new DateTimeZone('UTC')); + $trDataParams = array_merge($params, + [ + 'api_version' => Configuration::API_VERSION, + 'public_key' => $this->_config->publicKey(), + 'time' => $now->format('YmdHis'), + ] + ); + ksort($trDataParams); + $urlEncodedData = http_build_query($trDataParams, null, "&"); + $signatureService = new SignatureService( + $this->_config->privateKey(), + "Braintree\Digest::hexDigestSha1" + ); + return $signatureService->sign($urlEncodedData); + } + + private function _underscoreKeys($array) + { + foreach($array as $key=>$value) + { + $newKey = Util::camelCaseToDelimiter($key, '_'); + unset($array[$key]); + if (is_array($value)) + { + $array[$newKey] = $this->_underscoreKeys($value); + } + else + { + $array[$newKey] = $value; + } + } + return $array; + } + + /** + * @ignore + */ + private function _hash($string) + { + return Digest::hexDigestSha1($this->_config->privateKey(), $string); + } +} +TransparentRedirectGateway::init(); +class_alias('Braintree\TransparentRedirectGateway', 'Braintree_TransparentRedirectGateway'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/UnknownPaymentMethod.php b/modules/paypal/api/sdk/braintree/lib/Braintree/UnknownPaymentMethod.php new file mode 100644 index 000000000..a88a05408 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/UnknownPaymentMethod.php @@ -0,0 +1,71 @@ +== More information == + * + * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read string $token + * @property-read string $imageUrl + */ +class UnknownPaymentMethod extends Base +{ + + + /** + * factory method: returns an instance of UnknownPaymentMethod + * to the requesting method, with populated properties + * + * @ignore + * @return UnknownPaymentMethod + */ + public static function factory($attributes) + { + $instance = new self(); + $values = array_values($attributes); + $instance->_initialize(array_shift($values)); + return $instance; + } + + /* instance methods */ + + /** + * returns false if default is null or false + * + * @return boolean + */ + public function isDefault() + { + return $this->default; + } + + /** + * sets instance properties from an array of values + * + * @access protected + * @param array $unknownPaymentMethodAttribs array of unknownPaymentMethod data + * @return void + */ + protected function _initialize($unknownPaymentMethodAttribs) + { + // set the attributes + $this->imageUrl = 'https://assets.braintreegateway.com/payment_method_logo/unknown.png'; + $this->_attributes = $unknownPaymentMethodAttribs; + } + +} +class_alias('Braintree\UnknownPaymentMethod', 'Braintree_UnknownPaymentMethod'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Util.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Util.php new file mode 100644 index 000000000..23d4af6bf --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Util.php @@ -0,0 +1,411 @@ +success) { + return $resultObj->$resultObjName; + } else { + throw new Exception\ValidationsFailed(); + } + } + + /** + * removes the header from a classname + * + * @param string $name ClassName + * @return camelCased classname minus header + */ + public static function cleanClassName($name) + { + $classNamesToResponseKeys = [ + 'Braintree\CreditCard' => 'creditCard', + 'Braintree_CreditCard' => 'creditCard', + 'Braintree\CreditCardGateway' => 'creditCard', + 'Braintree_CreditCardGateway' => 'creditCard', + 'Braintree\Customer' => 'customer', + 'Braintree_Customer' => 'customer', + 'Braintree\CustomerGateway' => 'customer', + 'Braintree_CustomerGateway' => 'customer', + 'Braintree\Subscription' => 'subscription', + 'Braintree_Subscription' => 'subscription', + 'Braintree\SubscriptionGateway' => 'subscription', + 'Braintree_SubscriptionGateway' => 'subscription', + 'Braintree\Transaction' => 'transaction', + 'Braintree_Transaction' => 'transaction', + 'Braintree\TransactionGateway' => 'transaction', + 'Braintree_TransactionGateway' => 'transaction', + 'Braintree\CreditCardVerification' => 'verification', + 'Braintree_CreditCardVerification' => 'verification', + 'Braintree\CreditCardVerificationGateway' => 'verification', + 'Braintree_CreditCardVerificationGateway' => 'verification', + 'Braintree\AddOn' => 'addOn', + 'Braintree_AddOn' => 'addOn', + 'Braintree\AddOnGateway' => 'addOn', + 'Braintree_AddOnGateway' => 'addOn', + 'Braintree\Discount' => 'discount', + 'Braintree_Discount' => 'discount', + 'Braintree\DiscountGateway' => 'discount', + 'Braintree_DiscountGateway' => 'discount', + 'Braintree\Plan' => 'plan', + 'Braintree_Plan' => 'plan', + 'Braintree\PlanGateway' => 'plan', + 'Braintree_PlanGateway' => 'plan', + 'Braintree\Address' => 'address', + 'Braintree_Address' => 'address', + 'Braintree\AddressGateway' => 'address', + 'Braintree_AddressGateway' => 'address', + 'Braintree\SettlementBatchSummary' => 'settlementBatchSummary', + 'Braintree_SettlementBatchSummary' => 'settlementBatchSummary', + 'Braintree\SettlementBatchSummaryGateway' => 'settlementBatchSummary', + 'Braintree_SettlementBatchSummaryGateway' => 'settlementBatchSummary', + 'Braintree\Merchant' => 'merchant', + 'Braintree_Merchant' => 'merchant', + 'Braintree\MerchantGateway' => 'merchant', + 'Braintree_MerchantGateway' => 'merchant', + 'Braintree\MerchantAccount' => 'merchantAccount', + 'Braintree_MerchantAccount' => 'merchantAccount', + 'Braintree\MerchantAccountGateway' => 'merchantAccount', + 'Braintree_MerchantAccountGateway' => 'merchantAccount', + 'Braintree\OAuthCredentials' => 'credentials', + 'Braintree_OAuthCredentials' => 'credentials', + 'Braintree\PayPalAccount' => 'paypalAccount', + 'Braintree_PayPalAccount' => 'paypalAccount', + 'Braintree\PayPalAccountGateway' => 'paypalAccount', + 'Braintree_PayPalAccountGateway' => 'paypalAccount', + ]; + + return $classNamesToResponseKeys[$name]; + } + + /** + * + * @param string $name className + * @return string ClassName + */ + public static function buildClassName($name) + { + $responseKeysToClassNames = [ + 'creditCard' => 'Braintree\CreditCard', + 'customer' => 'Braintree\Customer', + 'subscription' => 'Braintree\Subscription', + 'transaction' => 'Braintree\Transaction', + 'verification' => 'Braintree\CreditCardVerification', + 'addOn' => 'Braintree\AddOn', + 'discount' => 'Braintree\Discount', + 'plan' => 'Braintree\Plan', + 'address' => 'Braintree\Address', + 'settlementBatchSummary' => 'Braintree\SettlementBatchSummary', + 'merchantAccount' => 'Braintree\MerchantAccount', + ]; + + return (string) $responseKeysToClassNames[$name]; + } + + /** + * convert alpha-beta-gamma to alphaBetaGamma + * + * @access public + * @param string $string + * @param null|string $delimiter + * @return string modified string + */ + public static function delimiterToCamelCase($string, $delimiter = '[\-\_]') + { + // php doesn't garbage collect functions created by create_function() + // so use a static variable to avoid adding a new function to memory + // every time this function is called. + static $callback = null; + if ($callback === null) { + $callback = create_function('$matches', 'return strtoupper($matches[1]);'); + } + + return preg_replace_callback('/' . $delimiter . '(\w)/', $callback, $string); + } + + /** + * convert alpha-beta-gamma to alpha_beta_gamma + * + * @access public + * @param string $string + * @return string modified string + */ + public static function delimiterToUnderscore($string) + { + return preg_replace('/-/', '_', $string); + } + + + /** + * find capitals and convert to delimiter + lowercase + * + * @access public + * @param string $string + * @param null|string $delimiter + * @return string modified string + */ + public static function camelCaseToDelimiter($string, $delimiter = '-') + { + return strtolower(preg_replace('/([A-Z])/', "$delimiter\\1", $string)); + } + + public static function delimiterToCamelCaseArray($array, $delimiter = '[\-\_]') + { + $converted = []; + foreach ($array as $key => $value) { + if (is_string($key)) { + $key = self::delimiterToCamelCase($key, $delimiter); + } + + if (is_array($value)) { + // Make an exception for custom fields, which must be underscore (can't be + // camelCase). + if ($key === 'customFields') { + $value = self::delimiterToUnderscoreArray($value); + } else { + $value = self::delimiterToCamelCaseArray($value, $delimiter); + } + } + $converted[$key] = $value; + } + return $converted; + } + + public static function camelCaseToDelimiterArray($array, $delimiter = '-') + { + $converted = []; + foreach ($array as $key => $value) { + if (is_string($key)) { + $key = self::camelCaseToDelimiter($key, $delimiter); + } + if (is_array($value)) { + $value = self::camelCaseToDelimiterArray($value, $delimiter); + } + $converted[$key] = $value; + } + return $converted; + } + + public static function delimiterToUnderscoreArray($array) + { + $converted = []; + foreach ($array as $key => $value) { + $key = self::delimiterToUnderscore($key); + $converted[$key] = $value; + } + return $converted; + } + + /** + * + * @param array $array associative array to implode + * @param string $separator (optional, defaults to =) + * @param string $glue (optional, defaults to ', ') + * @return bool + */ + public static function implodeAssociativeArray($array, $separator = '=', $glue = ', ') + { + // build a new array with joined keys and values + $tmpArray = null; + foreach ($array AS $key => $value) { + if ($value instanceof DateTime) { + $value = $value->format('r'); + } + $tmpArray[] = $key . $separator . $value; + } + // implode and return the new array + return (is_array($tmpArray)) ? implode($glue, $tmpArray) : false; + } + + public static function attributesToString($attributes) { + $printableAttribs = []; + foreach ($attributes AS $key => $value) { + if (is_array($value)) { + $pAttrib = self::attributesToString($value); + } else if ($value instanceof DateTime) { + $pAttrib = $value->format(DateTime::RFC850); + } else { + $pAttrib = $value; + } + $printableAttribs[$key] = sprintf('%s', $pAttrib); + } + return self::implodeAssociativeArray($printableAttribs); + } + + /** + * verify user request structure + * + * compares the expected signature of a gateway request + * against the actual structure sent by the user + * + * @param array $signature + * @param array $attributes + */ + public static function verifyKeys($signature, $attributes) + { + $validKeys = self::_flattenArray($signature); + $userKeys = self::_flattenUserKeys($attributes); + $invalidKeys = array_diff($userKeys, $validKeys); + $invalidKeys = self::_removeWildcardKeys($validKeys, $invalidKeys); + + if(!empty($invalidKeys)) { + asort($invalidKeys); + $sortedList = join(', ', $invalidKeys); + throw new InvalidArgumentException('invalid keys: ' . $sortedList); + } + } + /** + * flattens a numerically indexed nested array to a single level + * @param array $keys + * @param string $namespace + * @return array + */ + private static function _flattenArray($keys, $namespace = null) + { + $flattenedArray = []; + foreach($keys AS $key) { + if(is_array($key)) { + $theKeys = array_keys($key); + $theValues = array_values($key); + $scope = $theKeys[0]; + $fullKey = empty($namespace) ? $scope : $namespace . '[' . $scope . ']'; + $flattenedArray = array_merge($flattenedArray, self::_flattenArray($theValues[0], $fullKey)); + } else { + $fullKey = empty($namespace) ? $key : $namespace . '[' . $key . ']'; + $flattenedArray[] = $fullKey; + } + } + sort($flattenedArray); + return $flattenedArray; + } + + private static function _flattenUserKeys($keys, $namespace = null) + { + $flattenedArray = []; + + foreach($keys AS $key => $value) { + $fullKey = empty($namespace) ? $key : $namespace; + if (!is_numeric($key) && $namespace != null) { + $fullKey .= '[' . $key . ']'; + } + if (is_numeric($key) && is_string($value)) { + $fullKey .= '[' . $value . ']'; + } + if(is_array($value)) { + $more = self::_flattenUserKeys($value, $fullKey); + $flattenedArray = array_merge($flattenedArray, $more); + } else { + $flattenedArray[] = $fullKey; + } + } + sort($flattenedArray); + return $flattenedArray; + } + + /** + * removes wildcard entries from the invalid keys array + * @param array $validKeys + * @param $invalidKey) { + if (stristr($invalidKey, $wildcardKey)) { + unset($invalidKeys[$index]); + } + } + } + } + return $invalidKeys; + } +} +class_alias('Braintree\Util', 'Braintree_Util'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/VenmoAccount.php b/modules/paypal/api/sdk/braintree/lib/Braintree/VenmoAccount.php new file mode 100644 index 000000000..acc0b1fc7 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/VenmoAccount.php @@ -0,0 +1,75 @@ +== More information == + * + * See {@link https://developers.braintreepayments.com/javascript+php}
+ * + * @package Braintree + * @category Resources + * @copyright 2015 Braintree, a division of PayPal, Inc. + * + * @property-read string $createdAt + * @property-read string $default + * @property-read string $updatedAt + * @property-read string $customerId + * @property-read string $sourceDescription + * @property-read string $token + * @property-read string $imageUrl + * @property-read string $username + * @property-read string $venmoUserId + */ +class VenmoAccount extends Base +{ + /* instance methods */ + /** + * returns false if default is null or false + * + * @return boolean + */ + public function isDefault() + { + return $this->default; + } + + /** + * factory method: returns an instance of VenmoAccount + * to the requesting method, with populated properties + * + * @ignore + * @return VenmoAccount + */ + public static function factory($attributes) + { + + $instance = new self(); + $instance->_initialize($attributes); + return $instance; + } + + /** + * sets instance properties from an array of values + * + * @access protected + * @param array $venmoAccountAttribs array of Venmo account properties + * @return void + */ + protected function _initialize($venmoAccountAttribs) + { + $this->_attributes = $venmoAccountAttribs; + + $subscriptionArray = array(); + if (isset($venmoAccountAttribs['subscriptions'])) { + foreach ($venmoAccountAttribs['subscriptions'] AS $subscription) { + $subscriptionArray[] = Subscription::factory($subscription); + } + } + + $this->_set('subscriptions', $subscriptionArray); + } +} +class_alias('Braintree\VenmoAccount', 'Braintree_VenmoAccount'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Version.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Version.php new file mode 100644 index 000000000..ca4bece3b --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Version.php @@ -0,0 +1,36 @@ +_initialize($attributes); + return $instance; + } + + private static function _matchingSignature($signaturePairs) + { + foreach ($signaturePairs as $pair) + { + $components = preg_split("/\|/", $pair); + if ($components[0] == Configuration::publicKey()) { + return $components[1]; + } + } + + return null; + } + + private static function _payloadMatches($signature, $payload) + { + $payloadSignature = Digest::hexDigestSha1(Configuration::privateKey(), $payload); + return Digest::secureCompare($signature, $payloadSignature); + } + + private static function _validateSignature($signatureString, $payload) + { + $signaturePairs = preg_split("/&/", $signatureString); + $signature = self::_matchingSignature($signaturePairs); + if (!$signature) { + throw new Exception\InvalidSignature("no matching public key"); + } + + if (!(self::_payloadMatches($signature, $payload) || self::_payloadMatches($signature, $payload . "\n"))) { + throw new Exception\InvalidSignature("signature does not match payload - one has been modified"); + } + } + + protected function _initialize($attributes) + { + $this->_attributes = $attributes; + + if (isset($attributes['subject']['apiErrorResponse'])) { + $wrapperNode = $attributes['subject']['apiErrorResponse']; + } else { + $wrapperNode = $attributes['subject']; + } + + if (isset($wrapperNode['subscription'])) { + $this->_set('subscription', Subscription::factory($attributes['subject']['subscription'])); + } + + if (isset($wrapperNode['merchantAccount'])) { + $this->_set('merchantAccount', MerchantAccount::factory($wrapperNode['merchantAccount'])); + } + + if (isset($wrapperNode['transaction'])) { + $this->_set('transaction', Transaction::factory($wrapperNode['transaction'])); + } + + if (isset($wrapperNode['disbursement'])) { + $this->_set('disbursement', Disbursement::factory($wrapperNode['disbursement'])); + } + + if (isset($wrapperNode['partnerMerchant'])) { + $this->_set('partnerMerchant', PartnerMerchant::factory($wrapperNode['partnerMerchant'])); + } + + if (isset($wrapperNode['dispute'])) { + $this->_set('dispute', Dispute::factory($wrapperNode['dispute'])); + } + + if (isset($wrapperNode['accountUpdaterDailyReport'])) { + $this->_set('accountUpdaterDailyReport', AccountUpdaterDailyReport::factory($wrapperNode['accountUpdaterDailyReport'])); + } + + if (isset($wrapperNode['errors'])) { + $this->_set('errors', new Error\ValidationErrorCollection($wrapperNode['errors'])); + $this->_set('message', $wrapperNode['message']); + } + } +} +class_alias('Braintree\WebhookNotification', 'Braintree_WebhookNotification'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/WebhookTesting.php b/modules/paypal/api/sdk/braintree/lib/Braintree/WebhookTesting.php new file mode 100644 index 000000000..9cbde0e6d --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/WebhookTesting.php @@ -0,0 +1,340 @@ + $signature, + 'bt_payload' => $payload + ]; + } + + private static function _sampleXml($kind, $id) + { + switch ($kind) { + case WebhookNotification::SUB_MERCHANT_ACCOUNT_APPROVED: + $subjectXml = self::_merchantAccountApprovedSampleXml($id); + break; + case WebhookNotification::SUB_MERCHANT_ACCOUNT_DECLINED: + $subjectXml = self::_merchantAccountDeclinedSampleXml($id); + break; + case WebhookNotification::TRANSACTION_DISBURSED: + $subjectXml = self::_transactionDisbursedSampleXml($id); + break; + case WebhookNotification::DISBURSEMENT_EXCEPTION: + $subjectXml = self::_disbursementExceptionSampleXml($id); + break; + case WebhookNotification::DISBURSEMENT: + $subjectXml = self::_disbursementSampleXml($id); + break; + case WebhookNotification::PARTNER_MERCHANT_CONNECTED: + $subjectXml = self::_partnerMerchantConnectedSampleXml($id); + break; + case WebhookNotification::PARTNER_MERCHANT_DISCONNECTED: + $subjectXml = self::_partnerMerchantDisconnectedSampleXml($id); + break; + case WebhookNotification::PARTNER_MERCHANT_DECLINED: + $subjectXml = self::_partnerMerchantDeclinedSampleXml($id); + break; + case WebhookNotification::DISPUTE_OPENED: + $subjectXml = self::_disputeOpenedSampleXml($id); + break; + case WebhookNotification::DISPUTE_LOST: + $subjectXml = self::_disputeLostSampleXml($id); + break; + case WebhookNotification::DISPUTE_WON: + $subjectXml = self::_disputeWonSampleXml($id); + break; + case WebhookNotification::SUBSCRIPTION_CHARGED_SUCCESSFULLY: + $subjectXml = self::_subscriptionChargedSuccessfullySampleXml($id); + break; + case WebhookNotification::CHECK: + $subjectXml = self::_checkSampleXml(); + break; + case WebhookNotification::ACCOUNT_UPDATER_DAILY_REPORT: + $subjectXml = self::_accountUpdaterDailyReportSampleXml($id); + break; + default: + $subjectXml = self::_subscriptionSampleXml($id); + break; + } + $timestamp = self::_timestamp(); + return " + + {$timestamp} + {$kind} + {$subjectXml} + + "; + } + + private static function _merchantAccountApprovedSampleXml($id) + { + return " + + {$id} + + master_ma_for_{$id} + active + + active + + "; + } + + private static function _merchantAccountDeclinedSampleXml($id) + { + return " + + Credit score is too low + + + + + + 82621 + Credit score is too low + base + + + + + + {$id} + suspended + + master_ma_for_{$id} + suspended + + + + "; + } + + private static function _transactionDisbursedSampleXml($id) + { + return " + + ${id} + 100 + + 2013-07-09 + + + "; + } + + private static function _disbursementExceptionSampleXml($id) + { + return " + + ${id} + + asdfg + qwert + + false + false + + merchant_account_token + USD + false + active + + 100.00 + 2014-02-10 + bank_rejected + update_funding_information + + "; + } + + private static function _disbursementSampleXml($id) + { + return " + + ${id} + + asdfg + qwert + + true + false + + merchant_account_token + USD + false + active + + 100.00 + 2014-02-10 + + + + "; + } + + private static function _disputeOpenedSampleXml($id) + { + return " + + 250.00 + USD + 2014-03-01 + 2014-03-21 + chargeback + open + fraud + ${id} + + ${id} + 250.00 + + 2014-03-21 + + "; + } + + private static function _disputeLostSampleXml($id) + { + return " + + 250.00 + USD + 2014-03-01 + 2014-03-21 + chargeback + lost + fraud + ${id} + + ${id} + 250.00 + + 2014-03-21 + + "; + } + + private static function _disputeWonSampleXml($id) + { + return " + + 250.00 + USD + 2014-03-01 + 2014-03-21 + chargeback + won + fraud + ${id} + + ${id} + 250.00 + + 2014-03-21 + 2014-03-22 + + "; + } + + private static function _subscriptionSampleXml($id) + { + return " + + {$id} + + + + + + + + "; + } + + private static function _subscriptionChargedSuccessfullySampleXml($id) + { + return " + + {$id} + 2016-03-21 + 2017-03-31 + + + submitted_for_settlement + 49.99 + + + + + + + + "; + } + + private static function _checkSampleXml() + { + return " + true + "; + } + + private static function _partnerMerchantConnectedSampleXml($id) + { + return " + + public_id + public_key + private_key + abc123 + cse_key + + "; + } + + private static function _partnerMerchantDisconnectedSampleXml($id) + { + return " + + abc123 + + "; + } + + private static function _partnerMerchantDeclinedSampleXml($id) + { + return " + + abc123 + + "; + } + + private static function _accountUpdaterDailyReportSampleXml($id) + { + return " + + 2016-01-14 + link-to-csv-report + + "; + } + + private static function _timestamp() + { + $originalZone = date_default_timezone_get(); + date_default_timezone_set('UTC'); + $timestamp = strftime('%Y-%m-%dT%TZ'); + date_default_timezone_set($originalZone); + + return $timestamp; + } +} +class_alias('Braintree\WebhookTesting', 'Braintree_WebhookTesting'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Xml.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Xml.php new file mode 100644 index 000000000..e287e2ed1 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Xml.php @@ -0,0 +1,41 @@ +openMemory(); + + $writer->setIndent(true); + $writer->setIndentString(' '); + $writer->startDocument('1.0', 'UTF-8'); + + // get the root element name + $aKeys = array_keys($aData); + $rootElementName = $aKeys[0]; + // open the root element + $writer->startElement($rootElementName); + // create the body + self::_createElementsFromArray($writer, $aData[$rootElementName], $rootElementName); + + // close the root element and document + $writer->endElement(); + $writer->endDocument(); + + // send the output as string + return $writer->outputMemory(); + } + + /** + * Construct XML elements with attributes from an associative array. + * + * @access protected + * @static + * @param object $writer XMLWriter object + * @param array $aData contains attributes and values + * @return void + */ + private static function _createElementsFromArray(&$writer, $aData) + { + if (!is_array($aData)) { + if (is_bool($aData)) { + $writer->text($aData ? 'true' : 'false'); + } else { + $writer->text($aData); + } + return; + } + foreach ($aData AS $elementName => $element) { + // handle child elements + $writer->startElement($elementName); + if (is_array($element)) { + if (array_key_exists(0, $element) || empty($element)) { + $writer->writeAttribute('type', 'array'); + foreach ($element AS $ignored => $itemInArray) { + $writer->startElement('item'); + self::_createElementsFromArray($writer, $itemInArray); + $writer->endElement(); + } + } + else { + self::_createElementsFromArray($writer, $element); + } + } else { + // generate attributes as needed + $attribute = self::_generateXmlAttribute($element); + if (is_array($attribute)) { + $writer->writeAttribute($attribute[0], $attribute[1]); + $element = $attribute[2]; + } + $writer->text($element); + } + $writer->endElement(); + } + } + + /** + * convert passed data into an array of attributeType, attributeName, and value + * dates sent as DateTime objects will be converted to strings + * @access protected + * @param mixed $value + * @return array attributes and element value + */ + private static function _generateXmlAttribute($value) + { + if ($value instanceof DateTime) { + return ['type', 'datetime', self::_dateTimeToXmlTimestamp($value)]; + } + if (is_int($value)) { + return ['type', 'integer', $value]; + } + if (is_bool($value)) { + return ['type', 'boolean', ($value ? 'true' : 'false')]; + } + if ($value === NULL) { + return ['nil', 'true', $value]; + } + } + /** + * converts datetime back to xml schema format + * @access protected + * @param object $dateTime + * @return string XML schema formatted timestamp + */ + private static function _dateTimeToXmlTimestamp($dateTime) + { + $dateTime->setTimeZone(new DateTimeZone('UTC')); + return ($dateTime->format('Y-m-d\TH:i:s') . 'Z'); + } + + private static function _castDateTime($string) + { + try { + if (empty($string)) { + return false; + } + $dateTime = new DateTime($string); + return self::_dateTimeToXmlTimestamp($dateTime); + } catch (Exception $e) { + // not a datetime + return false; + } + } +} +class_alias('Braintree\Xml\Generator', 'Braintree_Xml_Generator'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Xml/Parser.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Xml/Parser.php new file mode 100644 index 000000000..61c629582 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Xml/Parser.php @@ -0,0 +1,142 @@ +loadXML($xml); + + $root = $document->documentElement->nodeName; + + return Util::delimiterToCamelCaseArray([ + $root => self::_nodeToValue($document->childNodes->item(0)), + ]); + } + + /** + * Converts a node to an array of values or nodes + * + * @param DOMNode @node + * @return mixed + */ + private static function _nodeToArray($node) + { + $type = null; + if ($node instanceof DOMElement) { + $type = $node->getAttribute('type'); + } + + switch($type) { + case 'array': + $array = []; + foreach ($node->childNodes as $child) { + $value = self::_nodeToValue($child); + if ($value !== null) { + $array[] = $value; + } + } + return $array; + case 'collection': + $collection = []; + foreach ($node->childNodes as $child) { + $value = self::_nodetoValue($child); + if ($value !== null) { + if (!isset($collection[$child->nodeName])) { + $collection[$child->nodeName] = []; + } + $collection[$child->nodeName][] = self::_nodeToValue($child); + } + } + return $collection; + default: + $values = []; + if ($node->childNodes->length === 1 && $node->childNodes->item(0) instanceof DOMText) { + return $node->childNodes->item(0)->nodeValue; + } else { + foreach ($node->childNodes as $child) { + if (!$child instanceof DOMText) { + $values[$child->nodeName] = self::_nodeToValue($child); + } + } + return $values; + } + } + } + + /** + * Converts a node to a PHP value + * + * @param DOMNode $node + * @return mixed + */ + private static function _nodeToValue($node) + { + $type = null; + if ($node instanceof DOMElement) { + $type = $node->getAttribute('type'); + } + + switch($type) { + case 'datetime': + return self::_timestampToUTC((string) $node->nodeValue); + case 'date': + return new DateTime((string) $node->nodeValue); + case 'integer': + return (int) $node->nodeValue; + case 'boolean': + $value = (string) $node->nodeValue; + if(is_numeric($value)) { + return (bool) $value; + } else { + return ($value !== "true") ? false : true; + } + case 'array': + case 'collection': + return self::_nodeToArray($node); + default: + if ($node->hasChildNodes()) { + return self::_nodeToArray($node); + } elseif (trim($node->nodeValue) === '') { + return null; + } else { + return $node->nodeValue; + } + } + } + + + /** + * Converts XML timestamps into DateTime instances + * + * @param string $timestamp + * @return DateTime + */ + private static function _timestampToUTC($timestamp) + { + $tz = new DateTimeZone('UTC'); + $dateTime = new DateTime($timestamp, $tz); + $dateTime->setTimezone($tz); + return $dateTime; + } +} +class_alias('Braintree\Xml\Parser', 'Braintree_Xml_Parser'); diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/Xml/index.php b/modules/paypal/api/sdk/braintree/lib/Braintree/Xml/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/Xml/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/Braintree/index.php b/modules/paypal/api/sdk/braintree/lib/Braintree/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/Braintree/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/autoload.php b/modules/paypal/api/sdk/braintree/lib/autoload.php new file mode 100644 index 000000000..56bf5fc8a --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/autoload.php @@ -0,0 +1,20 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/braintree/lib/ssl/api_braintreegateway_com.ca.crt b/modules/paypal/api/sdk/braintree/lib/ssl/api_braintreegateway_com.ca.crt new file mode 100644 index 000000000..2d90f19b7 --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/ssl/api_braintreegateway_com.ca.crt @@ -0,0 +1,191 @@ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- diff --git a/modules/paypal/api/sdk/braintree/lib/ssl/index.php b/modules/paypal/api/sdk/braintree/lib/ssl/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/api/sdk/braintree/lib/ssl/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/api/sdk/index.php b/modules/paypal/api/sdk/index.php new file mode 100644 index 000000000..68409394b --- /dev/null +++ b/modules/paypal/api/sdk/index.php @@ -0,0 +1,33 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/br.php b/modules/paypal/br.php new file mode 100644 index 000000000..739424bd0 --- /dev/null +++ b/modules/paypal/br.php @@ -0,0 +1,133 @@ +paypal_abstract_ad69e733ebae8d264bccaa38d68830e8'] = 'Paypal'; +$_MODULE['<{paypal}prestashop>paypal_abstract_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Aceita pagamentos por cartão de crédito (CB, Visa, MasterCard, Amex, Aurore, Cofinoga, 4 stars) com Paypal.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Você tem certeza que você quer deletar seus dados?'; +$_MODULE['<{paypal}prestashop>paypal_abstract_c91f1fb5e06286c3e0a33fc552dffbea'] = 'Você deve definir suas credenciais do PayPal Integral, para que o tema de telefonia móvel funcione corretamente.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_bd6b3cca1e559117a964cdfab6a977cf'] = 'O tema de telefonia móvel somente funciona com o módulo de pagamento Paypal neste momento. Por favor, ative o módulo para permitir pagamentos. '; +$_MODULE['<{paypal}prestashop>paypal_abstract_ea5eb3f904bf42377277255cbd0e2251'] = 'Para funcionar corretamente o módulo requer o módulo de compatibilidade com versões anteriores habilitado'; +$_MODULE['<{paypal}prestashop>paypal_abstract_48878e69ef59b9e9d2d9a8c18e4de520'] = 'Para funcionar corretamente o módulo requer pelo menos o módulo de compatibilidade com versões anteriores v'; +$_MODULE['<{paypal}prestashop>paypal_abstract_c9d8a8d3c76c69e9a5ba6387acb8655a'] = 'Para usar o módulo você precisa instalar o módulo de compatibilidade com versões anteriores.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_d739f6e2d6351c3a587d44190a8253af'] = 'Todos recursos do módulo API do Paypal estão incluídos no novo módulo Paypal. Para que não haja nenhum conflito, por favor, não use e remova o módulo PaypalAPI.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_32af90c3cfef1bacf43b0c3a8f60a4da'] = 'Fundos foram recuperados.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_d238649ac5ec14afc894fad36c0b50fc'] = 'Sem sucesso na recuperação dos fundos solicitados. Por favor, veja mensagem de registro!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_05b998de2c4fb46a7bdd37bd378b81d9'] = 'Validação bem sucedida. Por favor, veja mensagem de registro!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_aeca7e93a1b3d77e38c3cffa131774d5'] = 'Reembolso foi efetuado.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_cba030a50c8a99c7e224adbe1cf58544'] = 'Reembolso solicitado sem sucesso. Por favor, veja mensagem de registro!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_20fda49ece75d93bea97648ab1f1f1cf'] = 'Resultado de cancelamento de produtos:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_90ab0cfd410722553c79e614207a789a'] = 'Alguns campos estão vazios.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ce0e2b401002ca796d2e8aca7deb8f00'] = 'Campos de credenciais não podem estar vazios'; +$_MODULE['<{paypal}prestashop>paypal_abstract_3f7145179c909f0e87a911a3171986b6'] = 'Campo para e-mail comercial não pode estar vazio'; +$_MODULE['<{paypal}prestashop>paypal_abstract_e5d5d9f40763cfe6549bef705e3529a7'] = 'Mensagem de pagamento não é válida, por favor verifique seu módulo.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ee9dc1e678d54c517f481583c3fb2db8'] = 'Não é uma moeda válida'; +$_MODULE['<{paypal}prestashop>paypal_abstract_eec39bf42bd135971fb2d838c67d1449'] = 'Resultado de operação de reembolso:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_2ab62d1a578713d0862b56819295630e'] = 'Reembolso do Paypal efetuado com sucesso!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_a64db959966ba8d07c8b5d9493fcc21f'] = 'Erro de transação!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_67962779da962e3d4225055afc05e7bd'] = 'Resultado de operação de captura:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_8778ee03f6592d5fec9a1f2ee851e476'] = 'Terminado o pedido com Paypal'; +$_MODULE['<{paypal}prestashop>paypal_abstract_672d40feac6437e49f771019bc330790'] = 'Status de verificação:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_1828820cc60e36b6f9fdf60cab103ed7'] = 'Você está usando o e-mail padrão que vem com o Paypal, por favor coloque seu próprio e-mail.'; +$_MODULE['<{paypal}prestashop>validation_20dfea1a472e5be3f15f6b5f36ca335c'] = 'Problema conectando com o servidor do Paypal.'; +$_MODULE['<{paypal}prestashop>validation_f7799c2ded739cf3c3e9babffc5f315b'] = 'Conexão usando cURL falhou'; +$_MODULE['<{paypal}prestashop>validation_eca77e208634d52703b07672abbf16ec'] = 'Falha na verificação (usando cURL). Retornou:'; +$_MODULE['<{paypal}prestashop>validation_8358ec19f397d4cdd632688d4f79e535'] = 'Falha na verificação (usando fsockopen). Retornou:'; +$_MODULE['<{paypal}prestashop>validation_76ee8dc73701e846f7bccdf98dae079b'] = 'Sem transporte de comunicação disponível.'; +$_MODULE['<{paypal}prestashop>validation_2818bed1f235637049f4d46fd455dc1c'] = 'A chave Paypal \'mc_gross\' não foi especificada, não pode controlar a quantia paga.'; +$_MODULE['<{paypal}prestashop>validation_be59cbfbf305dc45cd0c3e9841b17ecf'] = 'A chave Paypal \'payment_status\' não foi especificada, não pode controlar a validade de pagamento'; +$_MODULE['<{paypal}prestashop>validation_bd0e34e5be6447844e6f262d51f1a9dc'] = 'Pagamento:'; +$_MODULE['<{paypal}prestashop>validation_e0395c4ce35d0b1e59ca3f2d5e260d23'] = 'A chave Paypal \'custom\' não foi especificada, não pode transmitir ao carrinho'; +$_MODULE['<{paypal}prestashop>validation_765261b630ee773659fae89e9ad762f5'] = 'A chave Paypal \'txn_id\' não foi especificada, transação desconhecida'; +$_MODULE['<{paypal}prestashop>validation_01634612f84d2b7ba56ccdf467e604b7'] = 'A chave Paypal \'mc_currency\' não foi especificada, moeda desconhecida'; +$_MODULE['<{paypal}prestashop>validation_e61f52d02b9f52fbe1fd41ed320e29c3'] = 'Carrinho não foi encontrado'; +$_MODULE['<{paypal}prestashop>validation_0617900b1aff826081d07f5a3e2e7cd0'] = 'Pedido já foi feito'; +$_MODULE['<{paypal}prestashop>validation_f5209b3301a46f3057ffbf34d903e205'] = 'ID de Transação Paypal: '; +$_MODULE['<{paypal}prestashop>validation_7b19e875ff64b09d80ee05dcc84b9975'] = 'A transação do Paypal não pode ser VERIFICADA.'; +$_MODULE['<{paypal}prestashop>paypal_connect_d1f14cc4a2dade80c92421d26422fea0'] = 'Fazendo nova conexão com'; +$_MODULE['<{paypal}prestashop>paypal_connect_94a27811a721ef512ad7bfa06cab34e0'] = 'Falha ao conectar com método CURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_70215486455daee13382c68b1a230b82'] = 'Conexão com método CURL com sucesso'; +$_MODULE['<{paypal}prestashop>paypal_connect_e4c4ad49bced42265b5facc2175cdafd'] = 'Enviando este params:'; +$_MODULE['<{paypal}prestashop>paypal_connect_445583f6641da98fc7ac8fd9d13a564b'] = 'Envio com método CURL falhou! Erro:'; +$_MODULE['<{paypal}prestashop>paypal_connect_ef4fbf36eaa2083442d386990ba063c2'] = 'Envio com método CURL com sucesso'; +$_MODULE['<{paypal}prestashop>paypal_connect_bf059c9751bb1a20b449b7917b1df374'] = 'Conexão com método fsockopen falhou'; +$_MODULE['<{paypal}prestashop>paypal_connect_ea800e3536f81238a4cbc32eb6db4eaf'] = 'Conexão com método fsockopen com sucesso'; +$_MODULE['<{paypal}prestashop>paypal_connect_6e9aa4cb541e09b07602d4ea96080811'] = 'Envio com método fsockopen falhou!'; +$_MODULE['<{paypal}prestashop>paypal_connect_842a183be225d415b2b4375ba1dd1c94'] = 'Envio com método fsockopen com sucesso!'; +$_MODULE['<{paypal}prestashop>paypal_lib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'Resposta do Paypal'; +$_MODULE['<{paypal}prestashop>paypal_express_checkout_ee9dc1e678d54c517f481583c3fb2db8'] = 'Não é uma moeda válida'; +$_MODULE['<{paypal}prestashop>paypal_express_checkout_484f5a79672cebe198ebdde45a1d672f'] = 'Papel de presente'; +$_MODULE['<{paypal}prestashop>submit_1e97d97a923eaddd810e056c828e99ea'] = 'Erro no pagamento'; +$_MODULE['<{paypal}prestashop>submit_7ef8c0c75056a5d1f988e352efcd0f09'] = 'Este produto não está mais em estoque com estes atributos mas está disponível com outros'; +$_MODULE['<{paypal}prestashop>submit_d141a42a5e72c871a3116414bb5c64c1'] = 'Não é possível criar novo carrinho'; +$_MODULE['<{paypal}prestashop>submit_5b5adcef5e3f2e5e1b6f60eb3e7e41ed'] = 'Ocorreu um erro:'; +$_MODULE['<{paypal}prestashop>submit_58f53d0306ffc9cc9820eab866e90efe'] = 'Erro durante a preparação do pagamento express checkout'; +$_MODULE['<{paypal}prestashop>submit_51da74120dd5e11817ef21e27d2599bc'] = 'Não foi possível criar cliente'; +$_MODULE['<{paypal}prestashop>submit_bcf08b34ab427cb871635151c6976eb0'] = 'Não foi possível criar endereço'; +$_MODULE['<{paypal}prestashop>submit_ca5cecfc8fd8e585ba1e684757168158'] = 'Não foi possível atualizar o carrinho existente'; +$_MODULE['<{paypal}prestashop>submit_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pagamento aceito.'; +$_MODULE['<{paypal}prestashop>submit_28060413b9f346d871b633018d03c7b0'] = 'Preço pago no Paypal não é o mesmo que no PrestaShop.'; +$_MODULE['<{paypal}prestashop>submit_98825385aadb1d0dd0fd133ef8acd23d'] = 'Não é possível criar pedido'; +$_MODULE['<{paypal}prestashop>submit_085b78e060c3ef4cc37bd25abd06ff66'] = 'Carrinho mudou desde o último checkout express, por favor faça um novo pagamento no checkout Paypal'; +$_MODULE['<{paypal}prestashop>notifier_28060413b9f346d871b633018d03c7b0'] = 'Preço pago no Paypal não é o msmo que no PrestaShop.'; +$_MODULE['<{paypal}prestashop>notifier_572f9af7615560af2cba038cc1948287'] = 'Carrinho mudou, por favor entre dados novamente.'; +$_MODULE['<{paypal}prestashop>notifier_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pagamento aceito.'; +$_MODULE['<{paypal}prestashop>back_office_2d801c24938b12e4ca9a2cf9b980c759'] = 'Erro!'; +$_MODULE['<{paypal}prestashop>capture_81e826adb70e2e6b189c2eef739d52d4'] = 'Captura Paypal'; +$_MODULE['<{paypal}prestashop>capture_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informação:'; +$_MODULE['<{paypal}prestashop>capture_ce64b2ea82cf4fa861a6512e2c32b84b'] = 'Fundos prontos para serem capturados antes do envio'; +$_MODULE['<{paypal}prestashop>capture_99e64593868df2b7b32231c1ae5ddc04'] = 'Obter o dinheiro'; +$_MODULE['<{paypal}prestashop>refund_8ba079f305b81b172792bc0469b6a690'] = 'Reembolso Paypal'; +$_MODULE['<{paypal}prestashop>refund_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informação:'; +$_MODULE['<{paypal}prestashop>refund_016e1f278eccd700eaf33f74a501d050'] = 'Pagamento aceito'; +$_MODULE['<{paypal}prestashop>refund_a8b1cc445942a2e1a7d7cca641c86d67'] = 'Quando você reembolsa um produto, um reembolso parcial é feito a menos que você selecione \"Generate a voucher\".'; +$_MODULE['<{paypal}prestashop>refund_c2a5e2e23d8ec9cad779d657b7d33fc1'] = 'Reembolso total da transação'; +$_MODULE['<{paypal}prestashop>refund_729a51874fe901b092899e9e8b31c97a'] = 'Você tem certeza?'; +$_MODULE['<{paypal}prestashop>validation_b630aa9b5e25da971949cae62dd109aa'] = 'Validação Paypal'; +$_MODULE['<{paypal}prestashop>validation_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informação:'; +$_MODULE['<{paypal}prestashop>validation_9119a92adbbf6c67bfb8a3aee0bdb720'] = 'Captura Pendente - Sem meio de envio'; +$_MODULE['<{paypal}prestashop>validation_c14eb95a724174f336b8ffdd98ef2f35'] = 'Pagamento Pendente - Sem meio de envio'; +$_MODULE['<{paypal}prestashop>validation_5b18ff32c2aaaf4b79bdead10b10fe29'] = 'Obtenha o status do pagamento'; +$_MODULE['<{paypal}prestashop>about_e816e21c1c8e0eba0620fa3df6bd6795'] = 'O que é Paypal?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal, uma confiável empresa líder em pagamentos on-line, permite que compradores e empresas enviem e recebam dinheiro online. PayPal tem mais de 100 milhões de contas de membros em 190 países e regiões. Ele é aceito por comerciantes em toda parte, dentro e fora do eBay.'; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = 'É seguro para usar?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal ajuda a proteger suas informações de cartão de crédito com líderes de mercado em segurança e sistemas de prevenção de fraude. Quando você usa o PayPal, suas informações financeiras nunca são compartilhadas com o comerciante.'; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = 'Porque usar Paypal?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = 'Faça compras ou envie dinheiro com o Paypal - é grátis!'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Compre e pague de forma conveniente salvando suas informações com o Paypal'; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'O Paypal é aceito por milhões de empresas em todo o mundo e é o método preferido no eBay'; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = 'Comece a usar o Paypal hoje!'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pague com Paypal'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Seu pedido no'; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'está completo.'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'Você escolheu o método Paypal.'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Seu pedido será enviado em breve.'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Para qualquer pergunta ou mais informações, por favor contate nosso '; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'serviço de atendimento ao cliente'; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Seu carrinho de compra'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'Paypal'; +$_MODULE['<{paypal}prestashop>error_425551a2289ed60c9260933d1c45ef00'] = 'Por favor consulte os registros:'; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Voltar'; +$_MODULE['<{paypal}prestashop>order-confirmation_fb077ecba55e5552916bde26d8b9e794'] = 'Confirmação do Pedido'; +$_MODULE['<{paypal}prestashop>order-confirmation_d5860edcd3078f86ee963c27654bc6cf'] = 'Total da transação (impostos incluídos) :'; +$_MODULE['<{paypal}prestashop>order-confirmation_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'A ID do seu pedido é:'; +$_MODULE['<{paypal}prestashop>order-confirmation_6e860dc1cf94ca08b3fd99993aa2dc68'] = 'A ID da sua transação Paypal é:'; +$_MODULE['<{paypal}prestashop>order-confirmation_4082ea29b4f196c4f60533500139725a'] = 'Acompanhar meu pedido'; +$_MODULE['<{paypal}prestashop>order-confirmation_9390390581f54c65d6acfc8da4e17362'] = 'Voltar para pedidos'; +$_MODULE['<{paypal}prestashop>order-summary_a40cab5994f36d4c48103a22ca082e8f'] = 'Seu carrinho de compra'; +$_MODULE['<{paypal}prestashop>order-summary_ad69e733ebae8d264bccaa38d68830e8'] = 'Paypal'; +$_MODULE['<{paypal}prestashop>order-summary_f1d3b424cd68795ecaa552883759aceb'] = 'Resumo do pedido'; +$_MODULE['<{paypal}prestashop>order-summary_dd23adc5fb6bda9c384397b31e57fc53'] = 'Pagamento Paypal'; +$_MODULE['<{paypal}prestashop>order-summary_62d74398cb6ebaa69ab7339052ca5c92'] = 'Você escolheu pagar com Paypal.'; +$_MODULE['<{paypal}prestashop>order-summary_c884ed19483d45970c5bf23a681e2dd2'] = 'Aqui está um curto resumo do seu pedido:'; +$_MODULE['<{paypal}prestashop>order-summary_e2867a925cba382f1436d1834bb52a1c'] = 'O valor total do seu pedido é'; +$_MODULE['<{paypal}prestashop>order-summary_1f87346a16cf80c372065de3c54c86d9'] = '(imposto incluído)'; +$_MODULE['<{paypal}prestashop>order-summary_8ed356c32b198c9cb2abab7c3d262b93'] = 'Nós aceitamos as seguintes moedas para serem enviadas pelo Paypal:'; +$_MODULE['<{paypal}prestashop>order-summary_0881a11f7af33bc1b43e437391129d66'] = 'Por favor confirme seu pedido clicando \'Eu confirmo meu pedido\''; +$_MODULE['<{paypal}prestashop>order-summary_46b9e3665f187c739c55983f757ccda0'] = 'Eu confirmo meu pedido'; +$_MODULE['<{paypal}prestashop>express_checkout_form_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pague com o Paypal'; +$_MODULE['<{paypal}prestashop>paypal_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pague com o Paypal'; +$_MODULE['<{paypal}prestashop>iframe_ecab922bc1f9b5726e2a6deb4acaec4e'] = 'Volte para o website do comerciante'; +$_MODULE['<{paypal}prestashop>payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pague com o Paypal'; +$_MODULE['<{paypal}prestashop>payment_a3f2caee6ef8e68fbd26e42d83f2bf65'] = 'Pague com sua conta Paypal, cartão de crédito (CB, Visa, Mastercard...), ou cartão de crédito privado'; +$_MODULE['<{paypal}prestashop>payment_b08008a2de4331ba13f006c9bcf37b62'] = 'Pague com sua conta Paypal'; diff --git a/modules/paypal/classes/AuthenticatePaymentMethods.php b/modules/paypal/classes/AuthenticatePaymentMethods.php new file mode 100644 index 000000000..da46bb838 --- /dev/null +++ b/modules/paypal/classes/AuthenticatePaymentMethods.php @@ -0,0 +1,220 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +class AuthenticatePaymentMethods +{ + + public static function getPaymentMethodsByIsoCode($iso_code) + { + // WPS -> Web Payment Standard + // HSS -> Web Payment Pro / Integral Evolution + // ECS -> Express Checkout Solution + // PPP -> PAYPAL PLUS + // PVZ -> Braintree / Payment VZero + + $payment_method = array( + // EUROPE + 'BE'=>array(WPS, ECS), + 'CZ'=>array(WPS, ECS), + 'DE'=>array(WPS, ECS, PPP), + 'ES'=>array(WPS, HSS, ECS), + 'FR'=>array(WPS, HSS, ECS, PVZ), + 'IT'=>array(WPS, HSS, ECS), + 'VA'=>array(WPS, HSS, ECS), + 'NL'=>array(WPS, ECS), + 'AN'=>array(WPS, ECS), //Netherlands Antilles + 'PL'=>array(WPS, ECS), + 'PT'=>array(WPS, ECS), + 'AT'=>array(WPS, ECS), + 'CH'=>array(WPS, ECS), + 'DK'=>array(WPS, ECS), + 'FI'=>array(WPS, ECS), + 'GR'=>array(WPS, ECS), + 'HU'=>array(WPS, ECS), + 'LU'=>array(WPS, ECS), + 'NO'=>array(WPS, ECS), + 'RO'=>array(WPS, ECS), + 'RU'=>array(WPS, ECS), + 'SE'=>array(WPS, ECS), + 'SK'=>array(WPS, ECS), + 'UA'=>array(WPS, ECS), + 'TR'=>array(WPS, ECS), + 'SI'=>array(WPS, ECS), + 'GB'=>array(WPS, HSS, ECS), + 'IE'=>array(WPS, ECS), + 'LT'=>array(WPS, ECS), + 'EE'=>array(WPS, ECS), + 'LV'=>array(WPS, ECS), + 'RS'=>array(WPS, ECS), + 'HR'=>array(WPS, ECS), + 'MD'=>array(WPS, ECS), + 'BA'=>array(WPS, ECS), + 'AL'=>array(WPS, ECS), + 'MT'=>array(WPS, ECS), + 'MC'=>array(WPS, ECS), + 'IS'=>array(WPS, ECS), + 'MK'=>array(WPS, ECS), + + //ASIE + 'CN'=>array(WPS, ECS), + 'MO'=>array(WPS, ECS), + 'HK'=>array(WPS, HSS, ECS), + 'JP'=>array(WPS, HSS, ECS), + 'MY'=>array(WPS, ECS), + 'BN'=>array(WPS, ECS), + 'ID'=>array(WPS, ECS), + 'KH'=>array(WPS, ECS), + 'LA'=>array(WPS, ECS), + 'PH'=>array(WPS, ECS), + 'TL'=>array(WPS, ECS), + 'VN'=>array(WPS, ECS), + 'IL'=>array(WPS, ECS), //Israel + 'SG'=>array(WPS, ECS), + 'TH'=>array(WPS, ECS), + 'TW'=>array(WPS, ECS), + + // OCEANIE + 'NZ'=>array(WPS, ECS), + 'PW'=>array(WPS, ECS), + 'AU'=>array(WPS, HSS, ECS), + + // AMERIQUE LATINE + 'BR'=>array(WPS, ECS), + 'MX'=>array(WPS, ECS), + 'CL'=>array(WPS, ECS), + 'CO'=>array(WPS, ECS), + 'PE'=>array(WPS, ECS), + + //AFRIQUE + 'SL'=>array(WPS, ECS), + 'SN'=>array(WPS, ECS), + ); + $return = isset($payment_method[$iso_code]) ? $payment_method[$iso_code] : false; + if (Configuration::get('VZERO_ENABLED')) { + $return[] = PVZ; + } + return $return; + } + + public static function getCountryDependencyRetroCompatibilite($iso_code) + { + $localizations = array( + 'AU' => array('AU'), 'BE' => array('BE'), 'CN' => array('CN', 'MO'), + 'CZ' => array('CZ'), 'DE' => array('DE'), 'ES' => array('ES'), + 'FR' => array('FR'), 'GB' => array('GB'), 'HK' => array('HK'), 'IL' => array( + 'IL'), 'IN' => array('IN'), 'IT' => array('IT', 'VA'), + 'JP' => array('JP'), 'MY' => array('MY'), 'NL' => array('AN', 'NL'), + 'NZ' => array('NZ'), 'PL' => array('PL'), 'PT' => array('PT', 'BR'), + 'RA' => array('AF', 'AS', 'BD', 'BN', 'BT', 'CC', 'CK', 'CX', 'FM', 'HM', + 'ID', 'KH', 'KI', 'KN', 'KP', 'KR', 'KZ', 'LA', 'LK', 'MH', + 'MM', 'MN', 'MV', 'MX', 'NF', 'NP', 'NU', 'OM', 'PG', 'PH', 'PW', + 'QA', 'SB', 'TJ', 'TK', 'TL', 'TM', 'TO', 'TV', 'TZ', 'UZ', 'VN', + 'VU', 'WF', 'WS'), + 'RE' => array('IE', 'ZA', 'GP', 'GG', 'JE', 'MC', 'MS', 'MP', 'PA', 'PY', + 'PE', 'PN', 'PR', 'LC', 'SR', 'TT', + 'UY', 'VE', 'VI', 'AG', 'AR', 'CA', 'BO', 'BS', 'BB', 'BZ', 'CL', + 'CO', 'CR', 'CU', 'SV', 'GD', 'GT', 'HN', 'JM', 'NI', 'AD', 'AE', + 'AI', 'AL', 'AM', 'AO', 'AQ', 'AT', 'AW', 'AX', 'AZ', 'BA', 'BF', + 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BV', 'BW', 'BY', 'CD', 'CF', + 'CG', + 'CH', 'CI', 'CM', 'CV', 'CY', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', + 'EE', 'EG', 'EH', 'ER', 'ET', 'FI', 'FJ', 'FK', 'FO', 'GA', 'GE', + 'GF', + 'GH', 'GI', 'GL', 'GM', 'GN', 'GQ', 'GR', 'GS', 'GU', 'GW', 'GY', + 'HR', 'HT', 'HU', 'IM', 'IO', 'IQ', 'IR', 'IS', 'JO', 'KE', 'KM', + 'KW', + 'KY', 'LB', 'LI', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MD', + 'ME', 'MF', 'MG', 'MK', 'ML', 'MQ', 'MR', 'MT', 'MU', 'MW', 'MZ', + 'NA', + 'NC', 'NE', 'NG', 'NO', 'NR', 'PF', 'PK', 'PM', 'PS', 'RE', 'RO', + 'RS', 'RU', 'RW', 'SA', 'SC', 'SD', 'SE', 'SI', 'SJ', 'SK', 'SL', + 'SM', 'SN', 'SO', 'ST', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TN', + 'UA', 'UG', 'VC', 'VG', 'YE', 'YT', 'ZM', 'ZW'), + 'SG' => array('SG'), 'TH' => array('TH'), 'TR' => array('TR'), 'TW' => array( + 'TW'), 'US' => array('US')); + + foreach ($localizations as $key => $value) { + if (in_array($iso_code, $value)) { + return $key; + } + } + + return false; + } + + public static function getPaymentMethodsRetroCompatibilite($iso_code) + { + // WPS -> Web Payment Standard + // HSS -> Web Payment Pro / Integral Evolution + // ECS -> Express Checkout Solution + // PPP -> PAYPAL PLUS + + $payment_method = array( + 'AU' => array(WPS, HSS, ECS), + 'BE' => array(WPS, ECS), + 'CN' => array(WPS, ECS), + 'CZ' => array(), + 'DE' => array(WPS, ECS, PPP), + 'ES' => array(WPS, HSS, ECS), + 'FR' => array(WPS, HSS, ECS), + 'GB' => array(WPS, HSS, ECS), + 'HK' => array(WPS, HSS, ECS), + 'IL' => array(WPS, ECS), + 'IN' => array(WPS, ECS), + 'IT' => array(WPS, HSS, ECS), + 'JP' => array(WPS, HSS, ECS), + 'MY' => array(WPS, ECS), + 'NL' => array(WPS, ECS), + 'NZ' => array(WPS, ECS), + 'PL' => array(WPS, ECS), + 'PT' => array(WPS, ECS), + 'RA' => array(WPS, ECS), + 'RE' => array(WPS, ECS), + 'SG' => array(WPS, ECS), + 'TH' => array(WPS, ECS), + 'TR' => array(WPS, ECS), + 'TW' => array(WPS, ECS), + 'US' => array(WPS, ECS), + 'ZA' => array(WPS, ECS)); + + + $return = isset($payment_method[$iso_code]) ? $payment_method[$iso_code] : $payment_method['GB']; + if (Configuration::get('VZERO_ENABLED')) { + $return[] = PVZ; + } + return $return; + } + + public static function authenticatePaymentMethodByLang($iso_code) + { + return self::getPaymentMethodsRetroCompatibilite(self::getCountryDependencyRetroCompatibilite($iso_code)); + } + + public static function authenticatePaymentMethodByCountry($iso_code) + { + return self::getPaymentMethodsByIsoCode($iso_code); + } +} diff --git a/modules/paypal/classes/Braintree.php b/modules/paypal/classes/Braintree.php new file mode 100644 index 000000000..54f4fe22e --- /dev/null +++ b/modules/paypal/classes/Braintree.php @@ -0,0 +1,339 @@ + + * @copyright 2007-2018 PrestaShop SA + * @version Release: $Revision: 13573 $ + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once _PS_MODULE_DIR_.'paypal/api/sdk/braintree/lib/Braintree.php'; + +class PrestaBraintree +{ + + public $gateway; + public $error; + + /** + * initialize config of braintree + */ + private function initConfig() + { + $this->_checkToken(); + + $this->gateway = new Braintree_Gateway(array('accessToken' => Configuration::get('PAYPAL_BRAINTREE_ACCESS_TOKEN'))); + $this->error = ''; + } + + /** + * @param $id_account_braintree + * @return bool + */ + public function createToken($id_account_braintree) + { + try { + $this->initConfig(); + + $clientToken = $this->gateway->clientToken()->generate(); + + return $clientToken; + } catch (Exception $e) { + PrestaShopLogger::addLog($e->getCode().'=>'.$e->getMessage()); + return false; + } + } + + /** + * @param $id_account_braintree + * @return mixed + */ + public function sale($cart, $id_account_braintree, $token_payment, $device_data) + { + + $this->initConfig(); + + $address_billing = new Address($cart->id_address_invoice); + $country_billing = new Country($address_billing->id_country); + $address_shipping = new Address($cart->id_address_delivery); + $country_shipping = new Country($address_shipping->id_country); + + try { + $data = array( + 'amount' => $this->getCartPaymentTotal(), + 'paymentMethodNonce' => $token_payment,//'fake-processor-declined-visa-nonce',// + 'merchantAccountId' => $id_account_braintree, + 'orderId' => $cart->id, + 'channel' => 'PrestaShop_Cart_Braintree', + 'billing' => array( + 'firstName' => $address_billing->firstname, + 'lastName' => $address_billing->lastname, + 'company' => $address_billing->company, + 'streetAddress' => $address_billing->address1, + 'extendedAddress' => $address_billing->address2, + 'locality' => $address_billing->city, + 'postalCode' => $address_billing->postcode, + 'countryCodeAlpha2' => $country_billing->iso_code, + ), + 'shipping' => array( + 'firstName' => $address_shipping->firstname, + 'lastName' => $address_shipping->lastname, + 'company' => $address_shipping->company, + 'streetAddress' => $address_shipping->address1, + 'extendedAddress' => $address_shipping->address2, + 'locality' => $address_shipping->city, + 'postalCode' => $address_shipping->postcode, + 'countryCodeAlpha2' => $country_shipping->iso_code, + ), + "deviceData" => $device_data, + 'options' => array( + 'submitForSettlement' => !Configuration::get('PAYPAL_CAPTURE'), + 'three_d_secure' => array( + 'required' => Configuration::get('PAYPAL_USE_3D_SECURE') + ) + ) + ); + $result = $this->gateway->transaction()->sale($data); + + if (($result instanceof Braintree_Result_Successful) && $result->success && $this->isValidStatus($result->transaction->status)) { + return $result->transaction; + } else { + $log = '### Braintree transaction error # '.date('Y-m-d H:i:s').' ###'."\n"; + $log .= '## cart id # '.$cart->id.' ##'."\n"; + $log .= '## amount # '.$this->getCartPaymentTotal().' ##'."\n"; + $log .= '## Braintree error message ##'."\n"; + + $log .= '# '.$result->message.' #'."\n"; + + foreach ($result->errors->deepAll() as $error) { + $log .= '# error code: '.$error->code.' # message: '.$error->message.' #'; + } + + file_put_contents(_PS_MODULE_DIR_.'paypal/log/braintree_log.txt', $log, FILE_APPEND); + + $this->error = $result->transaction->status; + } + + } catch (Exception $e) { + $this->error = $e->getCode().' : '.$e->getMessage(); + return false; + } + + return false; + } + + public function saveTransaction($data) + { + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'paypal_braintree`(`id_cart`,`nonce_payment_token`,`client_token`,`datas`) + VALUES (\''.pSQL($data['id_cart']).'\',\''.pSQL($data['nonce_payment_token']).'\',\''.pSQL($data['client_token']).'\',\''.pSQL($data['datas']).'\')'); + return Db::getInstance()->Insert_ID(); + } + + public function updateTransaction($braintree_id, $transaction, $id_order) + { + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'paypal_braintree` set transaction=\''.pSQL($transaction).'\', id_order = \''.pSQL($id_order).'\' WHERE id_paypal_braintree = '.(int)$braintree_id); + } + + public function checkStatus($id_cart) + { + $this->initConfig(); + try { + $collection = $this->gateway->transaction()->search( + array( + Braintree_TransactionSearch::orderId()->is($id_cart) + ) + ); + + $transaction = $this->gateway->transaction()->find($collection->_ids[0]); + } catch (Exception $e) { + $this->error = $e->getCode().' : '.$e->getMessage(); + return false; + } + return $transaction; + } + + public function cartStatus($id_cart) + { + + $sql = 'SELECT * + FROM '._DB_PREFIX_.'paypal_braintree + WHERE id_cart = '.(int)$id_cart; + + $result = Db::getInstance()->getRow($sql); + if (!empty($result['id_paypal_braintree'])) { + if (!empty($result['id_order'])) { + return 'alreadyUse'; + } + return 'alreadyTry'; + } else { + return false; + } + + } + + public function getTransactionId($id_order) + { + $result = Db::getInstance()->getValue('SELECT transaction FROM `'._DB_PREFIX_.'paypal_braintree` WHERE id_order = '.(int)$id_order); + return $result; + } + + public function getTransactionStatus($transactionId) + { + $this->initConfig(); + + try { + $result = $this->gateway->transaction()->find($transactionId); + + return $result->status; + } catch (Exception $e) { + PrestaShopLogger::addLog($e->getCode().'=>'.$e->getMessage()); + return false; + } + } + + public function refund($transactionId, $amount) + { + $this->initConfig(); + try { + $result = $this->gateway->transaction()->refund($transactionId, $amount); + + if ($result->success) { + return true; + } else { + $errors = $result->errors->deepAll(); + foreach ($errors as $error) { + // if transaction already total refund + if ($error->code == Braintree_Error_Codes::TRANSACTION_HAS_ALREADY_BEEN_REFUNDED) { + return true; + } + } + return false; + } + } catch (Exception $e) { + PrestaShopLogger::addLog($e->getCode().'=>'.$e->getMessage()); + return false; + } + } + + + public function submitForSettlement($transaction_id, $amount) + { + $this->initConfig(); + try { + $result = $this->gateway->transaction()->submitForSettlement($transaction_id, $amount); + if ($result instanceof Braintree_Result_Successful && $result->success) { + return true; + } else { + $errors = $result->errors->deepAll(); + foreach ($errors as $error) { + // if transaction already total refund + if ($error->code == Braintree_Error_Codes::TRANSACTION_CANNOT_SUBMIT_FOR_SETTLEMENT) { + return true; + } + } + if ($result->transaction->status == 'Authorization_expired') { + + $this->error = $result->transaction->status; + } + } + } catch (Exception $e) { + PrestaShopLogger::addLog($e->getCode().'=>'.$e->getMessage()); + return false; + } + return false; + + } + + public function void($transaction_id) + { + $this->initConfig(); + try { + $result = $this->gateway->transaction()->void($transaction_id); + if ($result instanceof Braintree_Result_Successful && $result->success) { + return true; + } + } catch (Exception $e) { + PrestaShopLogger::addLog($e->getCode().'=>'.$e->getMessage()); + return false; + } + } + + public function isValidStatus($status) + { + return in_array($status, array('submitted_for_settlement','authorized','settled')); + } + + /** + * Check if token is still valid by comparing the "expiresAt" parameter to the time + */ + private function _checkToken() + { + + if (Configuration::get('PAYPAL_BRAINTREE_EXPIRES_AT') && Configuration::get('PAYPAL_BRAINTREE_REFRESH_TOKEN')) { + + $datetime_bt = DateTime::createFromFormat(DateTime::ISO8601, Configuration::get('PAYPAL_BRAINTREE_EXPIRES_AT')); + $datetime_now = new DateTime(); + + $datetime_bt->format(DateTime::ISO8601); + $datetime_now->format(DateTime::ISO8601); + + if ($datetime_now->getTimestamp() >= $datetime_bt->getTimestamp()) { + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, PROXY_HOST.'prestashop/refreshToken?refreshToken='.urlencode(Configuration::get('PAYPAL_BRAINTREE_REFRESH_TOKEN'))); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_ENCODING, ''); + + $resp = curl_exec($ch); + + curl_close($ch); + + $json = Tools::jsonDecode($resp); + + Configuration::updateValue('PAYPAL_BRAINTREE_ACCESS_TOKEN', $json->data->accessToken); + Configuration::updateValue('PAYPAL_BRAINTREE_REFRESH_TOKEN', $json->data->refreshToken); + Configuration::updateValue('PAYPAL_BRAINTREE_EXPIRES_AT', $json->data->expiresAt); + + return true; + } + + return true; + + } else { + return false; + } + } + + public function getCartPaymentTotal() + { + $context = Context::getContext(); + if (Configuration::get('WK_ALLOW_ADVANCED_PAYMENT')) { + $objCustAdvPay = new HotelCustomerAdvancedPayment(); + $orderTotal = $objCustAdvPay->getOrdertTotal( + $context->cart->id, + $context->cart->id_guest + ); + } else { + $orderTotal = $cart->getOrderTotal(true, Cart::BOTH); + } + return $orderTotal; + } +} diff --git a/modules/paypal/classes/PaypalCapture.php b/modules/paypal/classes/PaypalCapture.php new file mode 100644 index 000000000..4c62fb7b0 --- /dev/null +++ b/modules/paypal/classes/PaypalCapture.php @@ -0,0 +1,172 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +class PaypalCapture extends ObjectModel +{ + + public $id_order; + public $capture_amount; + public $result; + public $date_add; + public $date_upd; + public $id_paypal_capture; + + /** + * @see ObjectModel::$definition + */ + public static $definition; + + // for Prestashop 1.4 + protected $tables; + protected $fieldsRequired; + protected $fieldsSize; + protected $fieldsValidate; + protected $table = 'paypal_capture'; + protected $identifier = 'id_paypal_capture'; + + public function __construct($id = null, $id_lang = null, $id_shop = null) + { + if (version_compare(_PS_VERSION_, '1.5', '>')) { + self::$definition = array( + 'table' => 'paypal_capture', + 'primary' => 'id_paypal_capture', + 'fields' => array( + 'id_order' => array('type' => 1, 'validate' => 'isUnsignedId'), + 'result' => array('type' => 3, 'validate' => 'isString'), + 'capture_amount' => array('type' => 4, 'validate' => 'isFloat'), + 'date_add' => array('type' => 5, 'validate' => 'isDate'), + 'date_upd' => array('type' => 5, 'validate' => 'isDate'), + ), + ); + } else { + $tables = array('paypal_capture'); + $fieldsRequired = array('id_order', 'result', 'capture_amount', 'date_add', 'date_upd'); + $fieldsValidate = array(); + } + + $this->date_add = date('Y-m-d H:i:s'); + $this->date_upd = date('Y-m-d H:i:s'); + + return parent::__construct($id, $id_lang, $id_shop); + } + + public function getFields() + { + $fields = parent::getFields(); + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $fields['result'] = pSQL($this->result); + $fields['capture_amount'] = pSQL($this->capture_amount); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + $fields['id_order'] = pSQL($this->id_order); + } + + return $fields; + } + + public static function getTotalAmountCapturedByIdOrder($id_order) + { + //Tester la version de prestashop + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $query = 'SELECT SUM(capture_amount) AS tt FROM '._DB_PREFIX_.'paypal_capture WHERE id_order ='.(int) $id_order.' AND result="Completed" '; + $result = Db::getInstance()->getRow($query); + + return Tools::ps_round($result['tt'], 2); + } else { + $query = new DbQuery(); + $query->select('SUM(capture_amount)'); + $query->from(self::$definition['table']); + $query->where('id_order = '.(int) $id_order); + $query->where('result = "Completed"'); + return Tools::ps_round(DB::getInstance()->getValue($query), 2); + } + + } + + public function getRestToPaid(Order $order) + { + $cart = new Cart($order->id_cart); + $totalPaid = Tools::ps_round($cart->getOrderTotal(), 2); + return Tools::ps_round($totalPaid, 2) - Tools::ps_round(self::getTotalAmountCapturedByIdOrder($order->id), 2); + } + + public function getRestToCapture($id_order) + { + $cart = Cart::getCartByOrderId($id_order); + $total = Tools::ps_round($cart->getOrderTotal(), 2) - Tools::ps_round(self::getTotalAmountCapturedByIdOrder($id_order), 2); + + if ($total > Tools::ps_round(0, 2)) { + return true; + } else { + return false; + } + + } + + public function getListCaptured() + { + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $query = 'SELECT * FROM '._DB_PREFIX_.'paypal_capture WHERE id_order ='.(int)$this->id_order.' ORDER BY date_add DESC ;'; + } else { + $query = new DbQuery(); + $query->from(self::$definition['table']); + $query->where('id_order = '.(int)$this->id_order); + $query->orderBy('date_add DESC'); + } + + $result = DB::getInstance()->executeS($query); + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + foreach ($result as &$foo) { + $foo['date'] = Tools::displayDate($foo['date_add'], Configuration::get('PS_LANG_DEFAULT'), true); + } + + } + return $result; + } + + public static function parsePrice($price) + { + $regexp = "/^([0-9\s]{0,10})((\.|,)[0-9]{0,2})?$/isD"; + + if (preg_match($regexp, $price)) { + $array_regexp = array("#,#isD", "# #isD"); + $array_replace = array(".", ""); + $price = preg_replace($array_regexp, $array_replace, $price); + + return Tools::ps_round($price, 2); + } else { + return false; + } + + } +} diff --git a/modules/paypal/classes/PaypalPlusPui.php b/modules/paypal/classes/PaypalPlusPui.php new file mode 100644 index 000000000..3c025ab5e --- /dev/null +++ b/modules/paypal/classes/PaypalPlusPui.php @@ -0,0 +1,53 @@ + + * @copyright 2007-2018 PrestaShop SA + * @version Release: $Revision: 13573 $ + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +class PaypalPlusPui extends ObjectModel +{ + + public $id_paypal_plus_pui; + public $id_order; + public $pui_informations; + + public static $definition = array( + 'table' => 'paypal_plus_pui', + 'primary' => 'id_paypal_plus_pui', + 'fields' => array( + 'id_order' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), + 'pui_informations' => array('type' => self::TYPE_STRING), + ), + ); + + + public function getByIdOrder($id_order) + { + $sql = new DbQuery(); + $sql->select('*'); + $sql->from('paypal_plus_pui'); + $sql->where('id_order = '.(int)$id_order); + return Db::getInstance()->getRow($sql); + } +} diff --git a/modules/paypal/classes/index.php b/modules/paypal/classes/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/classes/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/controllers/front/braintreesubmit.php b/modules/paypal/controllers/front/braintreesubmit.php new file mode 100644 index 000000000..cbb225002 --- /dev/null +++ b/modules/paypal/controllers/front/braintreesubmit.php @@ -0,0 +1,165 @@ + + * @copyright 2007-2018 PrestaShop SA + * @version Release: $Revision: 13573 $ + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once(_PS_MODULE_DIR_.'paypal/classes/Braintree.php'); +include_once(_PS_MODULE_DIR_.'paypal/paypal.php'); + +class PayPalBraintreeSubmitModuleFrontController extends ModuleFrontController +{ + + + public function __construct() + { + parent::__construct(); + $this->ssl = true; + + if (class_exists('Context')) { + $this->context = Context::getContext(); + } else { + global $smarty, $cookie; + $this->context = new StdClass(); + $this->context->smarty = $smarty; + $this->context->cookie = $cookie; + } + } + + public function postProcess() + { + + $paypal = new PayPal(); + $braintree = new PrestaBraintree(); + $id_account_braintree = $paypal->set_good_context(); + + if (empty($this->context->cart->id)) { + $paypal->reset_context(); + $this->redirectFailedPayment($paypal->l('failed load cart')); + } + + if (Configuration::get('PAYPAL_USE_3D_SECURE') && in_array(Tools::getValue('card_type'), array('Visa','MasterCard'))&& Tools::getValue('liabilityShifted') == 'false' && Tools::getValue('liabilityShiftPossible') == 'false') { + $paypal->reset_context(); + $this->redirectFailedPayment($this->getErrorMessageByCode('gateway_rejected')); + } + + + $cart_status = $braintree->cartStatus($this->context->cart->id); + switch($cart_status) { + case 'alreadyUse': + $order_id = Order::getOrderByCartId($this->context->cart->id); + $this->redirectConfirmation($paypal->id, $this->context->cart->id, $order_id); + break; + case 'alreadyTry': + $braintree_transaction = $braintree->checkStatus($this->context->cart->id); + if ($braintree_transaction instanceof Braintree_Transaction && $braintree->isValidStatus($braintree_transaction->status)) { + $transactionDetail = $this->getDetailsTransaction($braintree_transaction->id, $braintree_transaction->status); + $paypal->validateOrder( + $this->context->cart->id, + (Configuration::get('PAYPAL_CAPTURE')?Configuration::get('PAYPAL_BRAINTREE_OS_AWAITING'):Configuration::get('PS_OS_PAYMENT')), + $braintree_transaction->amount, + 'Braintree', + $paypal->l('Payment accepted.'), + $transactionDetail, + $this->context->cart->id_currency, + false, + $this->context->customer->secure_key + ); + $order_id = Order::getOrderByCartId($this->context->cart->id); + $this->redirectConfirmation($paypal->id, $this->context->cart->id, $order_id); + break; + } + default: + $id_braintree_presta = $braintree->saveTransaction(array('id_cart' => $this->context->cart->id, 'nonce_payment_token' => Tools::getValue('payment_method_nonce'), 'client_token' => Tools::getValue('client_token'), 'datas' => Tools::getValue('deviceData'))); + + $transaction = $braintree->sale($this->context->cart, $id_account_braintree, Tools::getValue('payment_method_nonce'), Tools::getValue('deviceData')); + + if (!$transaction) { + $paypal->reset_context(); + $this->redirectFailedPayment($this->getErrorMessageByCode($braintree->error)); + } + $transactionDetail = $this->getDetailsTransaction($transaction->id, $transaction->status); + $paypal->validateOrder($this->context->cart->id, (Configuration::get('PAYPAL_CAPTURE')?Configuration::get('PAYPAL_BRAINTREE_OS_AWAITING'):Configuration::get('PS_OS_PAYMENT')), $transaction->amount, 'Braintree', $paypal->l('Payment accepted.'), $transactionDetail, $this->context->cart->id_currency, false, $this->context->customer->secure_key); + $paypal->reset_context(); + $order_id = Order::getOrderByCartId($this->context->cart->id); + $braintree->updateTransaction($id_braintree_presta, $transaction->id, $order_id); + $this->redirectConfirmation($paypal->id, $this->context->cart->id, $order_id); + break; + } + } + + public function redirectFailedPayment($error = '') + { + if (Configuration::get('PS_ORDER_PROCESS_TYPE')) { + Tools::redirect('index.php?controller=order-opc&isPaymentStep=true&bt_error_msg='.urlencode($error)); + } else { + Tools::redirect('index.php?controller=order&step=3&bt_error_msg='.urlencode($error)); + } + + } + + public function redirectConfirmation($id_paypal, $id_cart, $id_order) + { + Tools::redirect($this->context->link->getPageLink('order-confirmation.php?id_module='.$id_paypal.'&id_cart='.$id_cart.'&id_order='.$id_order.'&key='.Context::getContext()->customer->secure_key.'&braintree=1')); + } + + public function getDetailsTransaction($transaction_id, $status) + { + $currency = new Currency($this->context->cart->id_currency); + $braintree = new PrestaBraintree(); + return array( + 'currency' => pSQL($currency->iso_code), + 'id_invoice' => null, + 'id_transaction' => pSQL($transaction_id), + 'transaction_id' => pSQL($transaction_id), + 'total_paid' => (float) pSQL($braintree->getCartPaymentTotal()), + 'shipping' => (float) pSQL($this->context->cart->getTotalShippingCost()), + 'payment_status' => $status, + 'payment_date' => date('Y-m-d H:i:s'), + ); + } + + + private function getErrorMessageByCode($code) + { + $module = new PayPal(); + switch ($code) { + case 'processor_declined': + $message = $module->l('The card used has probably been reported by your bank as lost, stolen or suspected of fraud.'); + break; + case 'failed': + $message = $module->l('An error occurred while sending the transaction.'); + break; + case 'authorization_expired': + $message = $module->l('The authorization of your banking transaction has expired.'); + break; + case 'gateway_rejected': + $message = $module->l('Your transaction was rejected for security reasons.'); + break; + default: + $message = $module->l('Your transaction isn\'t valid : ').$code; + } + return $message; + } +} diff --git a/modules/paypal/controllers/front/confirm.php b/modules/paypal/controllers/front/confirm.php new file mode 100644 index 000000000..24b6fa0a6 --- /dev/null +++ b/modules/paypal/controllers/front/confirm.php @@ -0,0 +1,58 @@ + + * @copyright 2007-2018 PrestaShop SA + * @version Release: $Revision: 13573 $ + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +/** + * @since 1.5.0 + */ + +class PayPalConfirmModuleFrontController extends ModuleFrontController +{ + public $display_column_left = false; + + public function initContent() + { + if (!$this->context->customer->isLogged(true) || empty($this->context->cart)) { + Tools::redirect('index.php'); + } + + parent::initContent(); + + $this->paypal = new PayPal(); + $this->context = Context::getContext(); + $this->id_module = (int) Tools::getValue('id_module'); + + //$currency = new Currency((int) $this->context->cart->id_currency); + + $this->module->assignCartSummary(); + + $this->context->smarty->assign(array( + 'form_action' => PayPal::getShopDomainSsl(true, true)._MODULE_DIR_.$this->paypal->name.'/express_checkout/payment.php', + )); + + $this->setTemplate('order-summary.tpl'); + } +} diff --git a/modules/paypal/controllers/front/expresscheckoutsubmit.php b/modules/paypal/controllers/front/expresscheckoutsubmit.php new file mode 100644 index 000000000..af2c588d6 --- /dev/null +++ b/modules/paypal/controllers/front/expresscheckoutsubmit.php @@ -0,0 +1,33 @@ + + * @copyright 2007-2018 PrestaShop SA + * @version Release: $Revision: 13573 $ + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +/** + * @since 1.5.0 + */ + +include_once(dirname(__FILE__).'/payment.php'); +include_once(dirname(__FILE__).'/../../express_checkout/payment.php'); diff --git a/modules/paypal/controllers/front/index.php b/modules/paypal/controllers/front/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/controllers/front/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/controllers/front/integralevolutionsubmit.php b/modules/paypal/controllers/front/integralevolutionsubmit.php new file mode 100644 index 000000000..11fd1aa7a --- /dev/null +++ b/modules/paypal/controllers/front/integralevolutionsubmit.php @@ -0,0 +1,33 @@ + + * @copyright 2007-2018 PrestaShop SA + * @version Release: $Revision: 13573 $ + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +/** + * @since 1.5.0 + */ + +include_once(dirname(__FILE__).'/submit.php'); +include_once(dirname(__FILE__).'/../../integral_evolution/submit.php'); diff --git a/modules/paypal/controllers/front/pluspatch.php b/modules/paypal/controllers/front/pluspatch.php new file mode 100644 index 000000000..fc2e10711 --- /dev/null +++ b/modules/paypal/controllers/front/pluspatch.php @@ -0,0 +1,58 @@ + + * @copyright 2007-2018 PrestaShop SA + * @version Release: $Revision: 13573 $ + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once(_PS_MODULE_DIR_.'paypal/paypal.php'); + +class PayPalPlusPatchModuleFrontController extends ModuleFrontController +{ + public function __construct() + { + parent::__construct(); + + if (class_exists('Context')) { + $this->context = Context::getContext(); + } else { + global $smarty, $cookie; + $this->context = new StdClass(); + $this->context->smarty = $smarty; + $this->context->cookie = $cookie; + } + $this->ajax = true; + } + + public function postProcess() + { + if (Tools::getValue('id_cart') == $this->context->cart->id) { + if (Tools::getValue('id_cart') && Tools::getValue('id_payment')) { + $cart = new Cart(Tools::getValue('id_cart')); + $address_delivery = new Address($cart->id_address_delivery); + $ppplus = new CallApiPaypalPlus(); + $result = $ppplus->patch(Tools::getValue('id_payment'), $address_delivery); + } + } + } +} diff --git a/modules/paypal/controllers/front/submit.php b/modules/paypal/controllers/front/submit.php new file mode 100644 index 000000000..04334304a --- /dev/null +++ b/modules/paypal/controllers/front/submit.php @@ -0,0 +1,161 @@ + + * @copyright 2007-2018 PrestaShop SA + * @version Release: $Revision: 13573 $ + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +/** + * @since 1.5.0 + */ + +class PayPalSubmitModuleFrontController extends ModuleFrontController +{ + public $display_column_left = false; + public $ssl = true; + + public function initContent() + { + parent::initContent(); + + $this->paypal = new PayPal(); + $this->context = Context::getContext(); + + $this->id_module = (int) Tools::getValue('id_module'); + $this->id_order = (int) Tools::getValue('id_order'); + $order = new Order($this->id_order); + // fix security issue + if ($order->id_cart != Tools::getValue('id_cart') || $order->secure_key != Tools::getValue('key')) { + Tools::redirect($this->context->link->getPageLink('history')); + } + + $order_state = new OrderState($order->current_state); + $paypal_order = PayPalOrder::getOrderById($this->id_order); + + if ($order_state->template[$this->context->language->id] == 'payment_error') { + $this->context->smarty->assign( + array( + 'message' => $order_state->name[$this->context->language->id], + 'logs' => array( + $this->paypal->l('An error occurred while processing payment.'), + ), + 'order' => $paypal_order, + 'price' => Tools::displayPrice($paypal_order['total_paid'], $this->context->currency), + ) + ); + + return $this->setTemplate('error.tpl'); + } + + $order_currency = new Currency((int) $order->id_currency); + $display_currency = new Currency((int) $this->context->currency->id); + + $price = Tools::convertPriceFull($paypal_order['total_paid'], $order_currency, $display_currency); + + $this->context->smarty->assign( + array( + 'is_guest' => (($this->context->customer->is_guest) || $this->context->customer->id == false), + 'order' => $paypal_order, + 'price' => Tools::displayPrice($price, $this->context->currency->id), + 'HOOK_ORDER_CONFIRMATION' => $this->displayOrderConfirmation(), + 'HOOK_PAYMENT_RETURN' => $this->displayPaymentReturn(), + ) + ); + if (version_compare(_PS_VERSION_, '1.5', '>')) { + $this->context->smarty->assign( + array( + 'reference_order' => Order::getUniqReferenceOf($paypal_order['id_order']), + ) + ); + } + + if (($this->context->customer->is_guest) || $this->context->customer->id == false) { + $this->context->smarty->assign( + array( + 'id_order' => (int) $this->id_order, + 'id_order_formatted' => sprintf('#%06d', (int) $this->id_order), + 'order_reference' => $order->reference, + ) + ); + + /* If guest we clear the cookie for security reason */ + $this->context->customer->mylogout(); + } + + $this->module->assignCartSummary(); + + if ($this->context->getMobileDevice() == true) { + $this->setTemplate('order-confirmation-mobile.tpl'); + } else { + $this->setTemplate('order-confirmation.tpl'); + } + } + + private function displayHook() + { + if (Validate::isUnsignedId($this->id_order) && Validate::isUnsignedId($this->id_module)) { + $order = new Order((int) $this->id_order); + $currency = new Currency((int) $order->id_currency); + + if (Validate::isLoadedObject($order)) { + $params = array(); + $params['objOrder'] = $order; + $params['currencyObj'] = $currency; + $params['currency'] = $currency->sign; + $params['total_to_pay'] = $order->getOrdersTotalPaid(); + + return $params; + } + } + + return false; + } + + /** + * Execute the hook displayPaymentReturn + */ + public function displayPaymentReturn() + { + $params = $this->displayHook(); + + if ($params && is_array($params)) { + return Hook::exec('displayPaymentReturn', $params, (int) $this->id_module); + } + + return false; + } + + /** + * Execute the hook displayOrderConfirmation + */ + public function displayOrderConfirmation() + { + $params = $this->displayHook(); + + if ($params && is_array($params)) { + return Hook::exec('displayOrderConfirmation', $params); + } + + return false; + } +} diff --git a/modules/paypal/controllers/front/submitplus.php b/modules/paypal/controllers/front/submitplus.php new file mode 100644 index 000000000..78b360932 --- /dev/null +++ b/modules/paypal/controllers/front/submitplus.php @@ -0,0 +1,299 @@ + + * @copyright 2007-2018 PrestaShop SA + * @version Release: $Revision: 13573 $ + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +/** + * @since 1.5.0 + */ + +require_once _PS_MODULE_DIR_.'paypal/classes/PaypalPlusPui.php'; + +class PayPalSubmitplusModuleFrontController extends ModuleFrontController +{ + public $display_column_left = false; + public $display_column_right = false; + public $ssl = true; + + /*public function init(){ + $this->page_name = 'Confirm Payment'; + }*/ + + public function __construct() + { + parent::__construct(); + + if (class_exists('Context')) { + $this->context = Context::getContext(); + } else { + global $smarty, $cookie; + $this->context = new StdClass(); + $this->context->smarty = $smarty; + $this->context->cookie = $cookie; + } + } + + public function initContent() + { + parent::initContent(); + + $paypal = new PayPal(); + + $this->id_module = (int) Tools::getValue('id_module'); + $this->id_cart = Tools::getValue('id_cart'); + $this->paymentId = Tools::getValue('paymentId'); + $this->token = Tools::getValue('token'); + + if (!empty($this->id_cart) && !empty($this->paymentId) && !empty($this->token)) { + $CallApiPaypalPlus = new CallApiPaypalPlus(); + $payment = Tools::jsonDecode($CallApiPaypalPlus->lookUpPayment($this->paymentId)); + + if (isset($payment->state)) { + $this->context->smarty->assign('state', $payment->state); + + $transaction = array( + 'id_transaction' => $payment->id, + 'payment_status' => $payment->state, + 'currency' => $payment->transactions[0]->amount->currency, + 'payment_date' => date("Y-m-d H:i:s"), + 'total_paid' => $payment->transactions[0]->amount->total, + 'id_invoice' => 0, + 'shipping' => 0, + ); + + switch ($payment->state) { + case 'created': + /* LookUp OK */ + /* Affichage bouton confirmation */ + + $this->context->smarty->assign( + array( + 'PayerID' => $payment->payer->payer_info->payer_id, + 'paymentId' => $this->paymentId, + 'id_cart' => $this->id_cart, + 'totalAmount' => Tools::displayPrice(Cart::getTotalCart($this->id_cart)), + 'linkSubmitPlus' => $this->context->link->getModuleLink('paypal', 'submitplus'), + ) + ); + break; + + case 'canceled': + /* LookUp cancel */ + $paypal->validateOrder( + $this->id_cart, + $this->getOrderStatus('order_canceled'), + $payment->transactions[0]->amount->total, + $payment->payer->payment_method, + null, + $transaction + ); + break; + + default: + /* Erreur de payment */ + $paypal->validateOrder( + $this->id_cart, + $this->getOrderStatus('payment_error'), + $payment->transactions[0]->amount->total, + $payment->payer->payment_method, + null, + $transaction + ); + + break; + } + } else { + $this->context->smarty->assign('state', 'failed'); + } + } else { + $this->context->smarty->assign('state', 'failed'); + } + + if (($this->context->customer->is_guest) || $this->context->customer->id == false) { + + /* If guest we clear the cookie for security reason */ + $this->context->customer->mylogout(); + } + + $this->module->assignCartSummary(); + + if ($this->context->getMobileDevice() == true) { + $this->setTemplate('order-confirmation-plus-mobile.tpl'); + } else { + $this->setTemplate('order-confirmation-plus.tpl'); + } + } + + private function displayHook() + { + if (Validate::isUnsignedId($this->id_order) && Validate::isUnsignedId($this->id_module)) { + $order = new Order((int) $this->id_order); + $currency = new Currency((int) $order->id_currency); + + if (Validate::isLoadedObject($order)) { + $params = array(); + $params['objOrder'] = $order; + $params['currencyObj'] = $currency; + $params['currency'] = $currency->sign; + $params['total_to_pay'] = $order->getOrdersTotalPaid(); + + return $params; + } + } + + return false; + } + + public function displayAjax() + { + $ajax = Tools::getValue('ajax'); + $return = array(); + if (!$ajax) { + $return['error'][] = $this->module->l('An error occured during the payment'); + echo Tools::jsonEncode($return); + die(); + } + + $id_cart = Tools::getValue('id_cart'); + $payerID = Tools::getValue('payerID'); + $paymentId = Tools::getValue('paymentId'); + $submit = Tools::getValue('submit'); + + if ((!empty($id_cart) && $this->context->cart->id == $id_cart) + && !empty($payerID) + && !empty($paymentId) + && !empty($submit) + ) { + $CallApiPaypalPlus = new CallApiPaypalPlus(); + $payment = Tools::jsonDecode($CallApiPaypalPlus->executePayment($payerID, $paymentId)); + + + if (isset($payment->state)) { + $paypal = new PayPal(); + + $transaction = array( + 'id_transaction' => $payment->transactions[0]->related_resources[0]->sale->id, + 'payment_status' => $payment->state, + 'total_paid' => $payment->transactions[0]->amount->total, + 'id_invoice' => 0, + 'shipping' => 0, + 'currency' => $payment->transactions[0]->amount->currency, + 'payment_date' => date("Y-m-d H:i:s"), + ); + + if ($submit == 'confirmPayment') { + if ($payment->state == 'approved') { + $paypal->validateOrder( + $this->id_cart, + $this->getOrderStatus('payment'), + $payment->transactions[0]->amount->total, + $payment->payer->payment_method, + null, + $transaction + ); + $return['success'][] = $this->module->l('Your payment has been taken into account'); + } else { + $paypal->validateOrder( + $this->id_cart, + $this->getOrderStatus('payment_error'), + $payment->transactions[0]->amount->total, + $payment->payer->payment_method, + null, + $transaction + ); + $return['error'][] = $this->module->l('An error occured during the payment'); + } + if (isset($payment->payment_instruction)) { + $id_order = Order::getOrderByCartId($this->id_cart); + + $paypal_plus_pui = new PaypalPlusPui(); + $paypal_plus_pui->id_order = $id_order; + $paypal_plus_pui->pui_informations = Tools::jsonEncode($payment->payment_instruction); + + $paypal_plus_pui->save(); + } + } elseif ($submit == 'confirmCancel') { + $paypal->validateOrder( + $this->id_cart, + $this->getOrderStatus('order_canceled'), + $payment->transactions[0]->amount->total, + $payment->payer->payment_method, + null, + $transaction + ); + $return['success'][] = $this->module->l('Your order has been canceled'); + } else { + $return['error'][] = $this->module->l('An error occured during the payment'); + } + } else { + $return['error'][] = $this->module->l('An error occured during the payment'); + } + } else { + $return['error'][] = $this->module->l('An error occured during the payment'); + } + + echo Tools::jsonEncode($return); + die(); + } + + /** + * Execute the hook displayPaymentReturn + */ + public function displayPaymentReturn() + { + $params = $this->displayHook(); + + if ($params && is_array($params)) { + return Hook::exec('displayPaymentReturn', $params, (int) $this->id_module); + } + + return false; + } + + /** + * Execute the hook displayOrderConfirmation + */ + public function displayOrderConfirmation() + { + $params = $this->displayHook(); + + if ($params && is_array($params)) { + return Hook::exec('displayOrderConfirmation', $params); + } + + return false; + } + + public function getOrderStatus($template) + { + /* + * payment + * payment_error + * order_canceled + * refund + */ + return Db::getInstance()->getValue('SELECT id_order_state FROM '._DB_PREFIX_.'order_state_lang WHERE template = "'.pSQL($template).'" AND id_lang = "'.(int) $this->context->language->id.'"'); + } +} diff --git a/modules/paypal/controllers/index.php b/modules/paypal/controllers/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/controllers/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/de.php b/modules/paypal/de.php new file mode 100644 index 000000000..a592dbf9e --- /dev/null +++ b/modules/paypal/de.php @@ -0,0 +1,284 @@ +ipn_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Die Preise bei PayPal und PrestaShop sind nicht identisch.'; +$_MODULE['<{paypal}prestashop>ipn_572f9af7615560af2cba038cc1948287'] = 'Warenkorb geändert, versuchen Sie es erneut.'; +$_MODULE['<{paypal}prestashop>ipn_ada2b5d5bbf3065de283d61526141780'] = 'Offene Zahlung einziehen'; +$_MODULE['<{paypal}prestashop>ipn_36ec50c0e914dd2fb48a1b27540512ce'] = 'Zahlung akzeptiert'; +$_MODULE['<{paypal}prestashop>ipn_c8a31175ee6991be6a0d7a6d32ca4268'] = 'Offene Zahlung bestätigen'; +$_MODULE['<{paypal}prestashop>paypal_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Akzeptiert Kreditkartenzahlungen (CB, Visa, MasterCard, Amex, Aurore, Cofinoga, 4 stars) mit PayPal'; +$_MODULE['<{paypal}prestashop>paypal_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Möchten Sie Ihre Daten wirklich löschen?'; +$_MODULE['<{paypal}prestashop>paypal_8b57f95f1e9cf09dc028fa5a671781ff'] = 'Alle Funktionen des PayPal-API-Moduls werden vom neuen PayPal-Modul unterstützt. Entfernen Sie das PayPal-API-Modul, um Konflikte zu vermeiden.'; +$_MODULE['<{paypal}prestashop>paypal_c91f1fb5e06286c3e0a33fc552dffbea'] = 'Sie müssen Ihre PayPal Integral-Zugangsdaten einrichten, damit die mobile Ansicht richtig funktioniert.'; +$_MODULE['<{paypal}prestashop>paypal_bd6b3cca1e559117a964cdfab6a977cf'] = 'Derzeit funktioniert die mobile Ansicht nur mit dem PayPal-Zahlungsmodul. Aktivieren Sie das Modul, damit Sie Zahlungen empfangen können.'; +$_MODULE['<{paypal}prestashop>paypal_c9d8a8d3c76c69e9a5ba6387acb8655a'] = 'Damit Sie das Modul nutzen können, müssen Sie das Modul "Abwärtskompatibilität" installieren.'; +$_MODULE['<{paypal}prestashop>paypal_ea5eb3f904bf42377277255cbd0e2251'] = 'Damit das Modul ordnungsgemäß funktioniert, muss das Modul "Abwärtskompatibilität" aktiviert sein.'; +$_MODULE['<{paypal}prestashop>paypal_48878e69ef59b9e9d2d9a8c18e4de520'] = 'Damit das Modul ordnungsgemäß funktioniert, muss mindestens das Modul V für die Abwärtskompatibilität installiert sein.'; +$_MODULE['<{paypal}prestashop>paypal_9b88c95a15e018c3f8038a7d0160145c'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_20fda49ece75d93bea97648ab1f1f1cf'] = 'Produktauswahl verwerfen:'; +$_MODULE['<{paypal}prestashop>paypal_90ab0cfd410722553c79e614207a789a'] = 'Einige Felder sind leer.'; +$_MODULE['<{paypal}prestashop>paypal_ce0e2b401002ca796d2e8aca7deb8f00'] = 'Die Felder für Zugangsdaten dürfen nicht leer sein.'; +$_MODULE['<{paypal}prestashop>paypal_3f7145179c909f0e87a911a3171986b6'] = 'Das Feld "Geschäftliche E-Mail-Adresse" darf nicht leer sein.'; +$_MODULE['<{paypal}prestashop>paypal_e5d5d9f40763cfe6549bef705e3529a7'] = 'Zahlungstext ungültig, überprüfen Sie Ihr Modul.'; +$_MODULE['<{paypal}prestashop>paypal_ee9dc1e678d54c517f481583c3fb2db8'] = 'Keine gültige Währung'; +$_MODULE['<{paypal}prestashop>paypal_eec39bf42bd135971fb2d838c67d1449'] = 'Ergebnis des Vorgangs "Rückzahlung":'; +$_MODULE['<{paypal}prestashop>paypal_2ab62d1a578713d0862b56819295630e'] = 'PayPal-Rückzahlung war erfolgreich.'; +$_MODULE['<{paypal}prestashop>paypal_a64db959966ba8d07c8b5d9493fcc21f'] = 'Transaktionsfehler'; +$_MODULE['<{paypal}prestashop>paypal_67962779da962e3d4225055afc05e7bd'] = 'Ergebnis des Vorgangs "Einziehen":'; +$_MODULE['<{paypal}prestashop>paypal_8778ee03f6592d5fec9a1f2ee851e476'] = 'Bestellung mit PayPal abgeschlossen'; +$_MODULE['<{paypal}prestashop>paypal_672d40feac6437e49f771019bc330790'] = 'Status der Verifizierung:'; +$_MODULE['<{paypal}prestashop>paypal_1828820cc60e36b6f9fdf60cab103ed7'] = 'Sie verwenden die Standard-E-Mail-Adresse von PayPal. Geben Sie Ihre eigene E-Mail-Adresse ein.'; +$_MODULE['<{paypal}prestashop>paypal_11582f323e3cac72252135e07b353c1c'] = 'Aktivieren Sie cURL (PHP-Erweiterung), damit Sie Ihr Modul verwenden können.'; +$_MODULE['<{paypal}prestashop>paypal_984482eb9ff11e6310fef641d2268a2a'] = 'Bank'; +$_MODULE['<{paypal}prestashop>paypal_6efcd68714a32084673e2c866291e3ae'] = 'Kontoinhaber'; +$_MODULE['<{paypal}prestashop>paypal_350e17d65ded375d643259e7eed26e2a'] = 'IBAN'; +$_MODULE['<{paypal}prestashop>paypal_bec758a8de99a38d16087f2196b48103'] = 'BIC'; +$_MODULE['<{paypal}prestashop>paypal_94f34a1bf4a7ce662b73f1893dcf9c30'] = 'Betrag'; +$_MODULE['<{paypal}prestashop>paypal_8954ee128da85cc61168898695ea0a3b'] = 'Zahlung fällig am'; +$_MODULE['<{paypal}prestashop>paypal_b8af13ea9c8fe890c9979a1fa8dbde22'] = 'Referenz'; +$_MODULE['<{paypal}prestashop>paypal_connect_d1f14cc4a2dade80c92421d26422fea0'] = 'Neue Verbindung herstellen zu'; +$_MODULE['<{paypal}prestashop>paypal_connect_94a27811a721ef512ad7bfa06cab34e0'] = 'Verbindung fehlgeschlagen mit CURL Methode'; +$_MODULE['<{paypal}prestashop>paypal_connect_70215486455daee13382c68b1a230b82'] = 'Verbindung erfolgreich mit CURL Methode'; +$_MODULE['<{paypal}prestashop>paypal_connect_e4c4ad49bced42265b5facc2175cdafd'] = 'Senden dieser Parameter:'; +$_MODULE['<{paypal}prestashop>paypal_connect_445583f6641da98fc7ac8fd9d13a564b'] = 'Sendung mit CURL Methode fehlgeschlagen! Fehler:'; +$_MODULE['<{paypal}prestashop>paypal_connect_ef4fbf36eaa2083442d386990ba063c2'] = 'Sendung mit CURL Methode erfolgreich'; +$_MODULE['<{paypal}prestashop>paypal_connect_bf059c9751bb1a20b449b7917b1df374'] = 'Verbindung fehlgeschlagen mit fsockopen Methode'; +$_MODULE['<{paypal}prestashop>paypal_connect_6e9aa4cb541e09b07602d4ea96080811'] = 'Sendung mit fsockopen Methode fehlgeschlagen!'; +$_MODULE['<{paypal}prestashop>paypal_connect_842a183be225d415b2b4375ba1dd1c94'] = 'Sendung mit fsockopen Methode erfolgreich'; +$_MODULE['<{paypal}prestashop>paypal_lib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'PayPal Antwort:'; +$_MODULE['<{paypal}prestashop>submit_67a3fcdb7708219b9d5d6269ad8c4a86'] = 'Beim Verarbeiten Ihrer Zahlung ist ein Fehler aufgetreten.'; +$_MODULE['<{paypal}prestashop>payment_d141a42a5e72c871a3116414bb5c64c1'] = 'Neuer Warenkorb kann nicht erstellt werden.'; +$_MODULE['<{paypal}prestashop>payment_5b5adcef5e3f2e5e1b6f60eb3e7e41ed'] = 'Fehler:'; +$_MODULE['<{paypal}prestashop>payment_dca16503c563d9fdec70d18f2ab653a4'] = 'Fehler bei der Vorbereitung der PayPal Express-Zahlung'; +$_MODULE['<{paypal}prestashop>payment_51da74120dd5e11817ef21e27d2599bc'] = 'Kundenkonto kann nicht erstellt werden.'; +$_MODULE['<{paypal}prestashop>payment_bcf08b34ab427cb871635151c6976eb0'] = 'Adresse kann nicht erstellt werden.'; +$_MODULE['<{paypal}prestashop>payment_ca5cecfc8fd8e585ba1e684757168158'] = 'Bestehender Warenkorb kann nicht aktualisiert werden.'; +$_MODULE['<{paypal}prestashop>payment_ada2b5d5bbf3065de283d61526141780'] = 'Offene Zahlung einziehen'; +$_MODULE['<{paypal}prestashop>payment_36ec50c0e914dd2fb48a1b27540512ce'] = 'Zahlung akzeptiert'; +$_MODULE['<{paypal}prestashop>payment_c8a31175ee6991be6a0d7a6d32ca4268'] = 'Offene Zahlung bestätigen'; +$_MODULE['<{paypal}prestashop>payment_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Die Preise bei PayPal und PrestaShop sind nicht identisch.'; +$_MODULE['<{paypal}prestashop>payment_98825385aadb1d0dd0fd133ef8acd23d'] = 'Bestellung kann nicht erstellt werden.'; +$_MODULE['<{paypal}prestashop>payment_085b78e060c3ef4cc37bd25abd06ff66'] = 'Warenkorb geändert seit der letzten PayPal Express-Zahlung – nehmen Sie eine neue PayPal-Zahlung vor.'; +$_MODULE['<{paypal}prestashop>payment_572da7ef1411f2a12409e752f3eb2f7a'] = 'Ihr Warenkorb ist leer.'; +$_MODULE['<{paypal}prestashop>process_ee9dc1e678d54c517f481583c3fb2db8'] = 'Keine gültige Währung'; +$_MODULE['<{paypal}prestashop>process_484f5a79672cebe198ebdde45a1d672f'] = 'Geschenkverpackung'; +$_MODULE['<{paypal}prestashop>notifier_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Die Preise bei PayPal und PrestaShop sind nicht identisch.'; +$_MODULE['<{paypal}prestashop>notifier_572f9af7615560af2cba038cc1948287'] = 'Warenkorb geändert, versuchen Sie es erneut.'; +$_MODULE['<{paypal}prestashop>notifier_36ec50c0e914dd2fb48a1b27540512ce'] = 'Zahlung akzeptiert.'; +$_MODULE['<{paypal}prestashop>back_office_e9f91995a69772872f7a386c6909403d'] = 'Mehr Kunden akquirieren'; +$_MODULE['<{paypal}prestashop>back_office_bbf54c5f55856a290f0deae540368071'] = '15 Millionen PayPal-Kunden in Deutschland'; +$_MODULE['<{paypal}prestashop>back_office_ad78c46c5d6edc542ad2153e23518478'] = 'Mehr Sicherheit genießen'; +$_MODULE['<{paypal}prestashop>back_office_2b91c701cecf505dc5af4e35d7067f1f'] = 'Der PayPal-Verkäuferschutz sichert Sie im Fall der Fälle ab'; +$_MODULE['<{paypal}prestashop>back_office_3a73e92a81de06fba19ab722bd500675'] = 'Mehr Schutz schaffen'; +$_MODULE['<{paypal}prestashop>back_office_d5f5f5c138165b223c4e6481752c7748'] = 'Ihre Warenkorb-Informationen werden nicht weitergegeben'; +$_MODULE['<{paypal}prestashop>back_office_421fe69f8b38a3c361835747e6215227'] = 'Mehr Umsatz generieren. Steigern Sie Ihren Umsatz um durchschnittlich 18,7%'; +$_MODULE['<{paypal}prestashop>back_office_ae3cebe661e92cdfd12516419fef4f2d'] = 'Laden Sie den'; +$_MODULE['<{paypal}prestashop>back_office_e73756d0d2306110f29ccf28cb69c412'] = 'Integrationsleitfaden'; +$_MODULE['<{paypal}prestashop>back_office_6506302a6e11077ecbc04b5932a65c4c'] = 'aus dem PrestaShop herunter und führen Sie die Konfigurationsschritte durch.'; +$_MODULE['<{paypal}prestashop>back_office_516710946f5fb35af6496ad0b7582980'] = 'PayPal in Ihrem Shop zu aktivieren dauert nur 5 Minuten'; +$_MODULE['<{paypal}prestashop>back_office_56564e0a106b0e0e2dc57b5a105ed639'] = 'Ihr Land'; +$_MODULE['<{paypal}prestashop>back_office_eb399bcaca686f8609137153307eecf1'] = 'Ändern'; +$_MODULE['<{paypal}prestashop>back_office_a7bb58222222b064f0721e6e0fe4c486'] = 'Land auswählen'; +$_MODULE['<{paypal}prestashop>back_office_93140d7ca5171ede9b8a94f07f0363ec'] = 'Haben Sie bereits ein PayPal-Konto'; +$_MODULE['<{paypal}prestashop>back_office_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Nein'; +$_MODULE['<{paypal}prestashop>back_office_93cba07454f06a4a960172bbd6e2a435'] = 'Ja'; +$_MODULE['<{paypal}prestashop>back_office_73878c19cdc6ef2ab0d0fac6943cc958'] = 'Haben Sie Fragen?'; +$_MODULE['<{paypal}prestashop>back_office_c040d088d1d6370e2dbad78b71fb1b74'] = 'Rufen Sie uns an: 01805 23 32 05'; +$_MODULE['<{paypal}prestashop>back_office_7215ee9c7d9dc229d2921a40e899ec5f'] = '(Maximal 14 Cent/Min. aus dem Festnetz. Für Anrufe aus Mobilfunknetzen fallen Gebühren von maximal 42 Cent/Min. an.)'; +$_MODULE['<{paypal}prestashop>back_office_240fdce652f09de611fc997971dea41e'] = 'Wählen Sie Ihre PayPal-Lösung aus'; +$_MODULE['<{paypal}prestashop>back_office_1cffab4d640162187298937736df1fec'] = 'https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=13'; +$_MODULE['<{paypal}prestashop>back_office_d59048f21fd887ad520398ce677be586'] = 'Mehr erfahren'; +$_MODULE['<{paypal}prestashop>back_office_cd5ee0ac6f3296c551e631268af2915b'] = 'Möchten Sie PayPal in Ihrem Online-Shop anbieten ?'; +$_MODULE['<{paypal}prestashop>back_office_961f2247a2070bedff9f9cd8d64e2650'] = 'Wählen Sie'; +$_MODULE['<{paypal}prestashop>back_office_d30abcb258277c6028d040b073276da1'] = 'PayPal Express'; +$_MODULE['<{paypal}prestashop>back_office_4d647b4406dba3d579ac2ef165c05196'] = 'Sie profitieren von weniger Kaufabbrüchen'; +$_MODULE['<{paypal}prestashop>back_office_e331bc26b25860e255aac1225fc5c639'] = 'und profitieren so von mehr Umsatz.'; +$_MODULE['<{paypal}prestashop>back_office_d5e2ec9a0a842a49d3258d6e355d3b55'] = 'Website Payments Pro'; +$_MODULE['<{paypal}prestashop>back_office_366520e0e4a3ce5469c0ed737ae032ef'] = 'Eine professionelle Plattform für eingehende Kreditkarten- und PayPal-Zahlungen, inklusive Verkäuferschutz.'; +$_MODULE['<{paypal}prestashop>back_office_3014bd9d081fc92e6ab6bb7e91336749'] = 'Angepasste Zahlungsseiten. 25,00 EUR monatlich.'; +$_MODULE['<{paypal}prestashop>back_office_b9b242f30b7f3cf333e57f359ca3c9bc'] = 'Klicken Sie erst dann auf "Speichern", nachdem PayPal dieses Produkt für Sie freigeschaltet hat. Das dauert in der Regel 3-5 Tage.'; +$_MODULE['<{paypal}prestashop>back_office_53f61475efdd0c433443262f0d7cdcbf'] = 'PayPal Plus'; +$_MODULE['<{paypal}prestashop>back_office_cc84ef735c1a521fe731773a700a87ec'] = 'Steigern Sie Ihre Online-Umsätze um 30%*'; +$_MODULE['<{paypal}prestashop>back_office_e8c466b9c179e229ae67f339a8e2476a'] = 'Eröffnen Sie ein PayPal-Geschäftskonto'; +$_MODULE['<{paypal}prestashop>back_office_0e96222f0238ebd077c0e983e91ab4ee'] = 'https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=14'; +$_MODULE['<{paypal}prestashop>back_office_d67850bd126f070221dcfd5fa6317043'] = 'JETZT ANMELDEN'; +$_MODULE['<{paypal}prestashop>back_office_b26917587d98330d93f87808fc9d7267'] = 'Abonnieren'; +$_MODULE['<{paypal}prestashop>back_office_109a4d46d869464f431abe4cf7228c24'] = 'https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=3'; +$_MODULE['<{paypal}prestashop>back_office_5c57ba1861701e5a630dd5006acb30e2'] = 'Sobald Sie das Konto eröffnet haben, fahren Sie bitte mit Schritt 3 fort.'; +$_MODULE['<{paypal}prestashop>back_office_ff7e05b87636d641663fb2f590d9f2bd'] = 'Klicken Sie erst dann auf "Speichern", nachdem PayPal dieses Produkt für Sie freigeschaltet hat.'; +$_MODULE['<{paypal}prestashop>back_office_78ba94e61abed0cbb6349b37ec9ed59e'] = 'Falls PayPal für Sie Website Payments Pro bereits freigeschaltet hat, gehen Sie direkt zu Schritt 3 fort'; +$_MODULE['<{paypal}prestashop>back_office_5b0e8271bd4b23a6bd7a7f49725ed926'] = 'So aktivieren Sie PayPal in Ihrem Online-Shop oder auf Ihrer Webseite'; +$_MODULE['<{paypal}prestashop>back_office_b4e69ef9df8f20b984309ee73f78953b'] = 'Übermitteln Sie die Daten Ihrer API-Schnittstelle an PrestaShop'; +$_MODULE['<{paypal}prestashop>back_office_2ffe0ef69fd047d0884f98faa52c1bd3'] = 'API Informationen abrufen'; +$_MODULE['<{paypal}prestashop>back_office_36461ebc9ebcd269f3909fa49a4b0a57'] = 'Nachdem Sie auf "API Informationen abrufen" geklickt haben, geben Sie bitte Ihren PayPal Login-Namen und das Passwort in das Pop-Up ein, kopieren Sie dann die Infos, um Sie in die unten stehenden Felder einzusetzen.'; +$_MODULE['<{paypal}prestashop>back_office_266ba5df48aed68af0cce5f735035291'] = 'API-Name'; +$_MODULE['<{paypal}prestashop>back_office_37e31370e4ab230ff6fba12cc6390aff'] = 'API-Passwort'; +$_MODULE['<{paypal}prestashop>back_office_195ca49498f0b30d3a8967eff22fa9b3'] = 'API-Signatur'; +$_MODULE['<{paypal}prestashop>back_office_74cec07ee40362f7605816fdcfbf194d'] = 'Bitte überprüfen Sie Ihre Angaben auf Vollständigkeit.'; +$_MODULE['<{paypal}prestashop>back_office_94ae34a9c107a078c63df4be1394e49d'] = 'Übermitteln Sie die Daten Ihrer API-Schnittstelle an PrestaShop'; +$_MODULE['<{paypal}prestashop>back_office_67f0dc0ff3d7b1fa4bb975b8831f54a9'] = 'Geben Sie dieselbe E-Mail-Adresse an wie bei der Eröffnung Ihres PayPal-Geschäftskontos.'; +$_MODULE['<{paypal}prestashop>back_office_671bb93f14482ae559c736818605f445'] = 'API business e-mail'; +$_MODULE['<{paypal}prestashop>back_office_0e55f1779fe0d4169ab51bcb0ade306f'] = 'Schließen Sie den Anmeldeprozess für Ihr PayPal-Konto ab'; +$_MODULE['<{paypal}prestashop>back_office_258da42945130420ae78d4494d549e42'] = 'Bestätigen Sie Ihre E-Mail-Adresse: PayPal hat Ihnen nach der Kontoeröffnung eine mail mit weiteren Informatonen gesendet.'; +$_MODULE['<{paypal}prestashop>back_office_f9a8989b19d6c0db2e1cdfe2d54827c2'] = 'Fügen Sie in Ihrem PayPal-Konto Ihr Bankkonto oder Ihre Kreditkarte hinzu. Loggen Sie sich in Ihren PayPal Account ein und klicken auf "Mein Geschäftskonto einrichten".'; +$_MODULE['<{paypal}prestashop>back_office_50f33d14f129e4548c1c270fd6725a78'] = 'Weitere Einstellungen'; +$_MODULE['<{paypal}prestashop>back_office_113269a2fc804aeae74a99e168309e8b'] = 'Bitte wählen Sie, welche Lösung Sie nutzen möchten'; +$_MODULE['<{paypal}prestashop>back_office_a025e05161bb17cbab898f0e77b09a2b'] = 'Iframe'; +$_MODULE['<{paypal}prestashop>back_office_d63bbf35e72f644c8752d4f2304f89e8'] = 'Vollständige Weiterleitung'; +$_MODULE['<{paypal}prestashop>back_office_c7c6643c2c48aabc724f019ea0ef26cc'] = 'Bitte wählen Sie Ihr Template'; +$_MODULE['<{paypal}prestashop>back_office_684c41bec3eaa8b8bc929c829c602157'] = 'Nutzen Sie Express Checkout Shortcut'; +$_MODULE['<{paypal}prestashop>back_office_76cfbdf3f35eb2368b8cbabfdd9f55db'] = 'Per Klick gelangen Ihre Kunden ohne Umwege direkt zur PayPal-Zahlungsseite'; +$_MODULE['<{paypal}prestashop>back_office_748eadce9cf4f2bde207b63c5441da07'] = 'Nutzen Sie die Funktion "PayPal-Login"'; +$_MODULE['<{paypal}prestashop>back_office_cded4ac9f77c68c750c243af1f5263c5'] = '(*siehe'; +$_MODULE['<{paypal}prestashop>back_office_606d8f704cf61d29bffd5195f28af29e'] = 'Integrationsleitfaden)'; +$_MODULE['<{paypal}prestashop>back_office_a1694ad810c4ac5b56b59c47db01cb05'] = 'und folgen Sie den Anweisungen.'; +$_MODULE['<{paypal}prestashop>back_office_3650f874df7e9c6e822a872d02cee6d5'] = 'Diese Funktion ermöglicht Ihren Kunden einen Login mit den PayPal-Zugangsdaten und somit eine schnellere Kaufabwicklung.'; +$_MODULE['<{paypal}prestashop>back_office_9be4e88898c4e88363208d2472f4a406'] = 'Geben Sie Ihre PayPal-Kontodaten ein.'; +$_MODULE['<{paypal}prestashop>back_office_4ff2e716a7d06ce5274b4090b39abad3'] = 'Siehe'; +$_MODULE['<{paypal}prestashop>back_office_8646a5d7b2817d30950357da8d80a11f'] = 'Integrationsleitfaden'; +$_MODULE['<{paypal}prestashop>back_office_69f768e6b78f82d0eaf3f415d1c515bf'] = 'Übersetzt in Ihre Sprache'; +$_MODULE['<{paypal}prestashop>back_office_705995576030bd6e0d95c02dcdea8e90'] = 'Nutzen Sie die Sandbox'; +$_MODULE['<{paypal}prestashop>back_office_4b7472c730be779d64f3721de7e254ba'] = 'Damit können Sie den PayPal-Bezahlfluss in einer Test-Umgebung ausprobieren.'; +$_MODULE['<{paypal}prestashop>back_office_cebd5bbe0ffdecc270a8a324e5a277dd'] = 'Reale Umgebung (empfohlen)'; +$_MODULE['<{paypal}prestashop>back_office_4245499695408b974322be6f01b0d17a'] = 'Test-Umgebung'; +$_MODULE['<{paypal}prestashop>back_office_4dbcb38bbbff5d4a402f2575c57a35e6'] = 'Zahlungsweise'; +$_MODULE['<{paypal}prestashop>back_office_0eae1e85287701bf8071e06bfb65b933'] = 'Wählen Sie Ihren Weg der Zahlungsabwicklung (automatische oder manuelle Autorisierung). Der PayPal-Verkäuferschutz sichert Sie ab, wenn Ihre Käufer mit PayPal bezahlen.'; +$_MODULE['<{paypal}prestashop>back_office_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{paypal}prestashop>back_office_13e8a61381ef71ee7f101ded231c9628'] = 'Wenn Sie die Test-Umgebung aktivieren'; +$_MODULE['<{paypal}prestashop>back_office_588a39011a111cf61f2230841807f04c'] = 'Können Sie keine Zahlungen empfangen.'; +$_MODULE['<{paypal}prestashop>back_office_97ce37634025467f01c4eec75c93eda6'] = 'Müssen Sie auf diese Seite zurückkehren, um Schritt 3 abzuschließen.'; +$_MODULE['<{paypal}prestashop>back_office_bfbf9731adfef44a1f1a5dc048f33a20'] = 'Sollten Sie einen Zugang zur PayPal-Sanbox einrichten.'; +$_MODULE['<{paypal}prestashop>back_office_d8fd35f628f2099aeaf3e5253e4acdba'] = 'Mehr erfahren'; +$_MODULE['<{paypal}prestashop>back_office_0693f3a913aa574276ae343ccdb15a7d'] = 'Sollten Sie Programierkenntnisse mitbringen.'; +$_MODULE['<{paypal}prestashop>back_office_ff0d39d63c036426d6833917d512ef22'] = 'Sind Sie sicher, die Test-Umgebung jetzt zu aktivieren ?'; +$_MODULE['<{paypal}prestashop>back_office_980d7b730b063eabd43e8954e4e072ad'] = 'Herzlichen Glückwunsch !'; +$_MODULE['<{paypal}prestashop>back_office_bb945e9f42acb423adb3d7535d491444'] = 'Nun ist PayPal aktiviert und Sie können Zahlungen empfangen.'; +$_MODULE['<{paypal}prestashop>back_office_10479c32ebaae1b49b512189d88e9fdd'] = 'Jetzt können Sie die PayPal-Lösungen ausprobieren. Vergessen Sie bitte nicht, hierher zurückzukommen, um die reale Umgebung zu aktivieren. Denn sonst können Sie keine Zahlungen empfangen.'; +$_MODULE['<{paypal}prestashop>back_office_2d801c24938b12e4ca9a2cf9b980c759'] = 'Fehler!'; +$_MODULE['<{paypal}prestashop>back_office_9dff3a2f8c5760586559e4f28223d7ee'] = 'Sie können keine Zahlungen empfangen, wenn Sie nicht die notwendigen Informationen in Schritt 3 angeben.'; +$_MODULE['<{paypal}prestashop>back_office_261fa91388f4f40fe010e174aba10c36'] = '* Quelle: Forrester-Studie vom März 2011'; +$_MODULE['<{paypal}prestashop>capture_81e826adb70e2e6b189c2eef739d52d4'] = 'PayPal-Zahlungseinzug'; +$_MODULE['<{paypal}prestashop>capture_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Hinweis:'; +$_MODULE['<{paypal}prestashop>capture_ce64b2ea82cf4fa861a6512e2c32b84b'] = 'Betrag, der vor dem Versand eingezogen werden kann.'; +$_MODULE['<{paypal}prestashop>capture_a61a9250ef6cc54f0d7dc8dd0c13da98'] = 'Möchten Sie das Geld wirklich einziehen?'; +$_MODULE['<{paypal}prestashop>capture_99e64593868df2b7b32231c1ae5ddc04'] = 'Geld einziehen'; +$_MODULE['<{paypal}prestashop>refund_8ba079f305b81b172792bc0469b6a690'] = 'PayPal-Rückzahlung'; +$_MODULE['<{paypal}prestashop>refund_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Hinweis:'; +$_MODULE['<{paypal}prestashop>refund_016e1f278eccd700eaf33f74a501d050'] = 'Zahlung akzeptiert'; +$_MODULE['<{paypal}prestashop>refund_a8b1cc445942a2e1a7d7cca641c86d67'] = 'Bei Rückzahlungen wird standardmäßig eine Teilrückzahlung vorgenommen, sofern Sie nicht die Option "Gutschein ausstellen" wählen.'; +$_MODULE['<{paypal}prestashop>refund_729a51874fe901b092899e9e8b31c97a'] = 'Sind Sie sicher?'; +$_MODULE['<{paypal}prestashop>refund_c2a5e2e23d8ec9cad779d657b7d33fc1'] = 'Gesamten Transaktionsbetrag zurückzahlen'; +$_MODULE['<{paypal}prestashop>validation_b630aa9b5e25da971949cae62dd109aa'] = 'PayPal-Prüfung'; +$_MODULE['<{paypal}prestashop>validation_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Hinweis:'; +$_MODULE['<{paypal}prestashop>validation_9119a92adbbf6c67bfb8a3aee0bdb720'] = 'Offener Einzugsbetrag – ohne Versandkosten'; +$_MODULE['<{paypal}prestashop>validation_c14eb95a724174f336b8ffdd98ef2f35'] = 'Offene Zahlung – ohne Versandkosten'; +$_MODULE['<{paypal}prestashop>validation_5b18ff32c2aaaf4b79bdead10b10fe29'] = 'Zahlungsstatus abrufen'; +$_MODULE['<{paypal}prestashop>about_e816e21c1c8e0eba0620fa3df6bd6795'] = 'Was ist PayPal?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal ist ein bewährter Marktführer bei Online-Shop-Zahlungen, der es Käufern und Unternehmen ermöglicht, Geld online zu senden und zu empfangen. PayPal hat über 100 Millionen Mitgliedskonten in 190 Ländern und Regionen. Es wird von Händlern allerorten, sowohl auf als auch außerhalb von eBay, akzeptiert.'; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = 'Ist es sicher?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal schützt Ihre Kreditkarteninformationen mit branchenweit führenden Sicherheits-und Betrugsbekämpfungssystemen. Wenn Sie PayPal verwenden, werden Ihre finanziellen Informationen dem Händler niemals sichtbar gemacht.'; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = 'Warum PayPal?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = 'Gebührenfrei einkaufen oder Geld senden mit PayPal'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Bequem einkaufen und zahlen durch gespeicherte Daten bei PayPal'; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'PayPal wird von Millionen von Händlern weltweit akzeptiert und ist die bevorzugte Zahlungsmethode bei eBay'; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = 'Nutzen Sie PayPal noch heute!'; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Ihr Warenkorb'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>error_f47106270a2928f350f357e255a2c2ac'] = 'Setzen Sie sich mit dem Händler in Verbindung:'; +$_MODULE['<{paypal}prestashop>error_d5860edcd3078f86ee963c27654bc6cf'] = 'Gesamter Transaktionsbetrag (inkl. Steuer) :'; +$_MODULE['<{paypal}prestashop>error_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Ihre Bestellnummer lautet:'; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Zurück'; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_fb077ecba55e5552916bde26d8b9e794'] = 'Bestellbestätigung'; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_d5860edcd3078f86ee963c27654bc6cf'] = 'Gesamter Transaktionsbetrag (inkl. Steuer) :'; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Ihre Bestellnummer lautet:'; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_6e860dc1cf94ca08b3fd99993aa2dc68'] = 'Ihr PayPal-Transaktionscode lautet:'; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_300225ee958b6350abc51805dab83c24'] = 'Einkauf fortsetzen'; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_9390390581f54c65d6acfc8da4e17362'] = 'Zurück zu Bestellungen'; +$_MODULE['<{paypal}prestashop>order-confirmation_fb077ecba55e5552916bde26d8b9e794'] = 'Bestellbestätigung'; +$_MODULE['<{paypal}prestashop>order-confirmation_d5860edcd3078f86ee963c27654bc6cf'] = 'Gesamter Transaktionsbetrag (inkl. Steuer) :'; +$_MODULE['<{paypal}prestashop>order-confirmation_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Ihre Bestellnummer lautet:'; +$_MODULE['<{paypal}prestashop>order-confirmation_6e860dc1cf94ca08b3fd99993aa2dc68'] = 'Ihr PayPal-Transaktionscode lautet:'; +$_MODULE['<{paypal}prestashop>order-confirmation_4082ea29b4f196c4f60533500139725a'] = 'Bestellung verfolgen'; +$_MODULE['<{paypal}prestashop>order-confirmation_9390390581f54c65d6acfc8da4e17362'] = 'Zurück zu Bestellungen'; +$_MODULE['<{paypal}prestashop>order-summary_a40cab5994f36d4c48103a22ca082e8f'] = 'Ihr Warenkorb'; +$_MODULE['<{paypal}prestashop>order-summary_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>order-summary_f1d3b424cd68795ecaa552883759aceb'] = 'Bestellübersicht'; +$_MODULE['<{paypal}prestashop>order-summary_dd23adc5fb6bda9c384397b31e57fc53'] = 'PayPal-Zahlung'; +$_MODULE['<{paypal}prestashop>order-summary_62d74398cb6ebaa69ab7339052ca5c92'] = 'Sie möchten mit PayPal bezahlen.'; +$_MODULE['<{paypal}prestashop>order-summary_c884ed19483d45970c5bf23a681e2dd2'] = 'Ihre Bestellübersicht:'; +$_MODULE['<{paypal}prestashop>order-summary_0c458988127eb2150776881e2ef3f0c4'] = 'Liefeadresse'; +$_MODULE['<{paypal}prestashop>order-summary_e2867a925cba382f1436d1834bb52a1c'] = 'Der Gesamtbetrag Ihrer Bestellung:'; +$_MODULE['<{paypal}prestashop>order-summary_1f87346a16cf80c372065de3c54c86d9'] = '(inkl. Steuer)'; +$_MODULE['<{paypal}prestashop>order-summary_8ed356c32b198c9cb2abab7c3d262b93'] = 'Wir akzeptieren die folgende Währung:'; +$_MODULE['<{paypal}prestashop>order-summary_0881a11f7af33bc1b43e437391129d66'] = 'Bestätigen Sie Ihre Bestellung durch Klicken auf "Bestellung bestätigen".'; +$_MODULE['<{paypal}prestashop>order-summary_46b9e3665f187c739c55983f757ccda0'] = 'Bestellung bestätigen'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Mit PayPal bezahlen'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Ihre Bestellung vom'; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'ist abgeschlossen.'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'Sie haben die PayPal-Methode gewählt.'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Ihre Bestellung wird sehr bald geschickt werden.'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Bei Fragen oder für weitere Informationen, kontaktieren Sie bitte unseren'; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Kunden-Support'; +$_MODULE['<{paypal}prestashop>express_checkout_payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Mit PayPal bezahlen'; +$_MODULE['<{paypal}prestashop>express_checkout_payment_83a1a5a403aed4b7ead866d253aef998'] = 'Mit PayPal bezahlen'; +$_MODULE['<{paypal}prestashop>express_checkout_payment_eu_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Mit PayPal bezahlen'; +$_MODULE['<{paypal}prestashop>express_checkout_shortcut_form_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Mit PayPal bezahlen'; +$_MODULE['<{paypal}prestashop>integral_evolution_payment_83a1a5a403aed4b7ead866d253aef998'] = 'Mit PayPal bezahlen'; +$_MODULE['<{paypal}prestashop>integral_evolution_payment_ecab922bc1f9b5726e2a6deb4acaec4e'] = 'Zurück zur Website des Händlers'; +$_MODULE['<{paypal}prestashop>integral_evolution_payment_eu_ecab922bc1f9b5726e2a6deb4acaec4e'] = 'Zurück zur Website des Händlers'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_abstract_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Zahlungen per Kreditkarte (CB, Visa, MasterCard, Amex, Aurore, Cofinoga, 4 stars) mit PayPal akzeptieren'; +$_MODULE['<{paypal}prestashop>paypal_abstract_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Sind Sie sicher, dass Sie Ihre Details löschen möchten?'; +$_MODULE['<{paypal}prestashop>paypal_abstract_32af90c3cfef1bacf43b0c3a8f60a4da'] = 'Geldbetrag wurde überwiesen'; +$_MODULE['<{paypal}prestashop>paypal_abstract_d238649ac5ec14afc894fad36c0b50fc'] = 'Die Anfrage nach Geldüberweisung war nicht erfolgreich, bitte lesen Sie die Protokollnachricht!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_05b998de2c4fb46a7bdd37bd378b81d9'] = 'Die Bestätigung ist erfolgt, siehe Protokollnachricht!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_aeca7e93a1b3d77e38c3cffa131774d5'] = 'Der Betrag wurde überwiesen'; +$_MODULE['<{paypal}prestashop>paypal_abstract_cba030a50c8a99c7e224adbe1cf58544'] = 'Die Anfrage nach Geldüberweisung war nicht erfolgreich, bitte lesen Sie die Protokollnachricht!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_20fda49ece75d93bea97648ab1f1f1cf'] = 'Produktergebnisse löschen'; +$_MODULE['<{paypal}prestashop>paypal_abstract_e5d5d9f40763cfe6549bef705e3529a7'] = 'Die Zahlungsnachricht ist nicht gültig, prüfen Sie bitte Ihr Modul!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ee9dc1e678d54c517f481583c3fb2db8'] = 'Keine gültige Währung'; +$_MODULE['<{paypal}prestashop>paypal_abstract_eec39bf42bd135971fb2d838c67d1449'] = 'Ergebnis Rückerstattungsoperation'; +$_MODULE['<{paypal}prestashop>paypal_abstract_2ab62d1a578713d0862b56819295630e'] = 'Rückerstattung abgeschlossen mit PayPal!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_a64db959966ba8d07c8b5d9493fcc21f'] = 'Fehler bei der Transaktion!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_67962779da962e3d4225055afc05e7bd'] = 'Ergebnis Einzugsoperation'; +$_MODULE['<{paypal}prestashop>paypal_abstract_8778ee03f6592d5fec9a1f2ee851e476'] = 'Bestellung mit PayPal abgeschlossen!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_672d40feac6437e49f771019bc330790'] = 'Überprüfungsstatus:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_1828820cc60e36b6f9fdf60cab103ed7'] = 'Sie nutzenzur Zeit die Standard-PayPal-Mail-Adresse, Sie müssen Ihre eigene E-Mail-Adresse verwenden'; +$_MODULE['<{paypal}prestashop>validation_20dfea1a472e5be3f15f6b5f36ca335c'] = 'Problem beim Verbinden mit dem PayPal-Server.'; +$_MODULE['<{paypal}prestashop>validation_f7799c2ded739cf3c3e9babffc5f315b'] = 'Verbindung über cURL fehlgeschlagen'; +$_MODULE['<{paypal}prestashop>validation_eca77e208634d52703b07672abbf16ec'] = 'Fehler in der Überprüfung (mit cURL). Zurückgegeben:'; +$_MODULE['<{paypal}prestashop>validation_8358ec19f397d4cdd632688d4f79e535'] = 'Fehler in der Überprüfung (mit fsockopen). Zurückgegeben:'; +$_MODULE['<{paypal}prestashop>validation_76ee8dc73701e846f7bccdf98dae079b'] = 'Keine Kommunikationsmittel zur Verfügung.'; +$_MODULE['<{paypal}prestashop>validation_bd0e34e5be6447844e6f262d51f1a9dc'] = 'Zahlung:'; +$_MODULE['<{paypal}prestashop>validation_e0395c4ce35d0b1e59ca3f2d5e260d23'] = 'Paypal Schlüssel \'custom\' nicht angegeben, kann keine Verbindung zum Warenkorb herstellen'; +$_MODULE['<{paypal}prestashop>validation_765261b630ee773659fae89e9ad762f5'] = 'Paypal-Schlüssel \'txn_id\' nicht angegeben, Transaktion unbekannt'; +$_MODULE['<{paypal}prestashop>validation_01634612f84d2b7ba56ccdf467e604b7'] = 'Paypal-Schlüssel \'mc_currency\' nicht angegeben, Währung unbekannt'; +$_MODULE['<{paypal}prestashop>validation_e61f52d02b9f52fbe1fd41ed320e29c3'] = 'Warenkorb nicht gefunden'; +$_MODULE['<{paypal}prestashop>validation_0617900b1aff826081d07f5a3e2e7cd0'] = 'Bestellauftrag wurde bereits gestellt'; +$_MODULE['<{paypal}prestashop>validation_f5209b3301a46f3057ffbf34d903e205'] = 'PayPal-Transaktion-ID:'; +$_MODULE['<{paypal}prestashop>validation_7b19e875ff64b09d80ee05dcc84b9975'] = 'Die PayPal-Transaktion konnte nicht VERIFIZIERT werden.'; +$_MODULE['<{paypal}prestashop>paypal_connect_ea800e3536f81238a4cbc32eb6db4eaf'] = 'Verbindung erfolgreich mit fsockopen Methode'; +$_MODULE['<{paypal}prestashop>paypal_express_checkout_ee9dc1e678d54c517f481583c3fb2db8'] = 'Keine gültige Währung'; +$_MODULE['<{paypal}prestashop>paypal_express_checkout_484f5a79672cebe198ebdde45a1d672f'] = 'Geschenkverpackung:'; +$_MODULE['<{paypal}prestashop>submit_36ec50c0e914dd2fb48a1b27540512ce'] = 'Zahlung akzeptiert.'; +$_MODULE['<{paypal}prestashop>error_425551a2289ed60c9260933d1c45ef00'] = 'Bitte lesen Sie die Protokolle:'; +$_MODULE['<{paypal}prestashop>express_checkout_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Mit PayPal bezahlen'; +$_MODULE['<{paypal}prestashop>payment_a40cab5994f36d4c48103a22ca082e8f'] = 'Ihr Warenkorb'; +$_MODULE['<{paypal}prestashop>payment_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>payment_f1d3b424cd68795ecaa552883759aceb'] = 'Bestellsumme'; +$_MODULE['<{paypal}prestashop>payment_dd23adc5fb6bda9c384397b31e57fc53'] = 'PayPal-Zahlung'; +$_MODULE['<{paypal}prestashop>payment_62d74398cb6ebaa69ab7339052ca5c92'] = 'Sie haben PayPal für Ihre Zahlung gewählt.'; +$_MODULE['<{paypal}prestashop>payment_c884ed19483d45970c5bf23a681e2dd2'] = 'Hier ist eine kurze Zusammenfassung Ihrer Bestellung:'; +$_MODULE['<{paypal}prestashop>payment_e2867a925cba382f1436d1834bb52a1c'] = 'Der Gesamtbetrag Ihrer Bestellung beträgt'; +$_MODULE['<{paypal}prestashop>payment_1f87346a16cf80c372065de3c54c86d9'] = '(inkl. MwSt.)'; +$_MODULE['<{paypal}prestashop>payment_8ed356c32b198c9cb2abab7c3d262b93'] = 'Wir akzeptieren die folgenden Währungen über PayPal:'; +$_MODULE['<{paypal}prestashop>payment_0881a11f7af33bc1b43e437391129d66'] = 'Bitte bestätigen Sie Ihre Bestellung durch Klicken auf \"BESTELLEN\"'; +$_MODULE['<{paypal}prestashop>payment_46b9e3665f187c739c55983f757ccda0'] = 'BESTELLEN'; +$_MODULE['<{paypal}prestashop>payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Bezahlen mit PayPal'; +$_MODULE['<{paypal}prestashop>payment_a3f2caee6ef8e68fbd26e42d83f2bf65'] = 'Bezahlen Sie mit Ihrem PayPal-Konto, Kreditkarte (CB, Visa, Mastercard ...), oder privaten Kreditkarte'; +$_MODULE['<{paypal}prestashop>payment_b08008a2de4331ba13f006c9bcf37b62'] = 'Bezahlen Sie mit Ihrem PayPal-Konto'; +$_MODULE['<{paypal}prestashop>paypal_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Bezahlen mit PayPal'; diff --git a/modules/paypal/en.php b/modules/paypal/en.php new file mode 100644 index 000000000..acd71f6db --- /dev/null +++ b/modules/paypal/en.php @@ -0,0 +1,277 @@ +ipn_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Price paid on paypal is not the same that on PrestaShop.'; +$_MODULE['<{paypal}default-bootstrap>ipn_572f9af7615560af2cba038cc1948287'] = 'Cart changed, please retry.'; +$_MODULE['<{paypal}default-bootstrap>ipn_ada2b5d5bbf3065de283d61526141780'] = 'Pending payment capture.'; +$_MODULE['<{paypal}default-bootstrap>ipn_36ec50c0e914dd2fb48a1b27540512ce'] = 'Payment accepted.'; +$_MODULE['<{paypal}default-bootstrap>ipn_c8a31175ee6991be6a0d7a6d32ca4268'] = 'Pending payment confirmation.'; +$_MODULE['<{paypal}default-bootstrap>paypal_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}default-bootstrap>paypal_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Accepts payments by credit cards (CB, Visa, MasterCard, Amex, Aurore, Cofinoga, 4 stars) with PayPal.'; +$_MODULE['<{paypal}default-bootstrap>paypal_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Are you sure you want to delete your details?'; +$_MODULE['<{paypal}default-bootstrap>paypal_8b57f95f1e9cf09dc028fa5a671781ff'] = 'All features of Paypal API module are included in the new Paypal module. In order to do not have any conflict, please do not use and remove PayPalAPI module.'; +$_MODULE['<{paypal}default-bootstrap>paypal_c91f1fb5e06286c3e0a33fc552dffbea'] = 'You must set your PayPal Integral credentials in order to have the mobile theme work correctly.'; +$_MODULE['<{paypal}default-bootstrap>paypal_bd6b3cca1e559117a964cdfab6a977cf'] = 'The mobile theme only works with the PayPal\'s payment module at this time. Please activate the module to enable payments.'; +$_MODULE['<{paypal}default-bootstrap>paypal_c9d8a8d3c76c69e9a5ba6387acb8655a'] = 'In order to use the module you need to install the backward compatibility.'; +$_MODULE['<{paypal}default-bootstrap>paypal_ea5eb3f904bf42377277255cbd0e2251'] = 'To work properly the module requires the backward compatibility module enabled'; +$_MODULE['<{paypal}default-bootstrap>paypal_48878e69ef59b9e9d2d9a8c18e4de520'] = 'To work properly the module requires at least the backward compatibility module v'; +$_MODULE['<{paypal}default-bootstrap>paypal_20fda49ece75d93bea97648ab1f1f1cf'] = 'Cancel products result:'; +$_MODULE['<{paypal}default-bootstrap>paypal_90ab0cfd410722553c79e614207a789a'] = 'Some fields are empty.'; +$_MODULE['<{paypal}default-bootstrap>paypal_ce0e2b401002ca796d2e8aca7deb8f00'] = 'Credentials fields cannot be empty'; +$_MODULE['<{paypal}default-bootstrap>paypal_3f7145179c909f0e87a911a3171986b6'] = 'Business e-mail field cannot be empty'; +$_MODULE['<{paypal}default-bootstrap>paypal_e5d5d9f40763cfe6549bef705e3529a7'] = 'Payment message is not valid, please check your module.'; +$_MODULE['<{paypal}default-bootstrap>paypal_ee9dc1e678d54c517f481583c3fb2db8'] = 'Not a valid currency'; +$_MODULE['<{paypal}default-bootstrap>paypal_eec39bf42bd135971fb2d838c67d1449'] = 'Refund operation result:'; +$_MODULE['<{paypal}default-bootstrap>paypal_2ab62d1a578713d0862b56819295630e'] = 'PayPal refund successful!'; +$_MODULE['<{paypal}default-bootstrap>paypal_a64db959966ba8d07c8b5d9493fcc21f'] = 'Transaction error!'; +$_MODULE['<{paypal}default-bootstrap>paypal_67962779da962e3d4225055afc05e7bd'] = 'Capture operation result:'; +$_MODULE['<{paypal}default-bootstrap>paypal_8778ee03f6592d5fec9a1f2ee851e476'] = 'Order finished with PayPal!'; +$_MODULE['<{paypal}default-bootstrap>paypal_672d40feac6437e49f771019bc330790'] = 'Verification status :'; +$_MODULE['<{paypal}default-bootstrap>paypal_1828820cc60e36b6f9fdf60cab103ed7'] = 'You are currently using the default PayPal e-mail address, please enter your own e-mail address.'; +$_MODULE['<{paypal}default-bootstrap>paypal_11582f323e3cac72252135e07b353c1c'] = 'In order to use your module, please activate cURL (PHP extension)'; +$_MODULE['<{paypal}default-bootstrap>paypal_connect_d1f14cc4a2dade80c92421d26422fea0'] = 'Making new connection to'; +$_MODULE['<{paypal}default-bootstrap>paypal_connect_94a27811a721ef512ad7bfa06cab34e0'] = 'Connect failed with CURL method'; +$_MODULE['<{paypal}default-bootstrap>paypal_connect_70215486455daee13382c68b1a230b82'] = 'Connect with CURL method successful'; +$_MODULE['<{paypal}default-bootstrap>paypal_connect_e4c4ad49bced42265b5facc2175cdafd'] = 'Sending this params:'; +$_MODULE['<{paypal}default-bootstrap>paypal_connect_445583f6641da98fc7ac8fd9d13a564b'] = 'Send with CURL method failed ! Error:'; +$_MODULE['<{paypal}default-bootstrap>paypal_connect_ef4fbf36eaa2083442d386990ba063c2'] = 'Send with CURL method successful'; +$_MODULE['<{paypal}default-bootstrap>paypal_connect_bf059c9751bb1a20b449b7917b1df374'] = 'Connect failed with fsockopen method'; +$_MODULE['<{paypal}default-bootstrap>paypal_connect_6e9aa4cb541e09b07602d4ea96080811'] = 'Send with fsockopen method failed !'; +$_MODULE['<{paypal}default-bootstrap>paypal_connect_842a183be225d415b2b4375ba1dd1c94'] = 'Send with fsockopen method successful'; +$_MODULE['<{paypal}default-bootstrap>paypal_lib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'PayPal response:'; +$_MODULE['<{paypal}default-bootstrap>tlsverificator_94a27811a721ef512ad7bfa06cab34e0'] = ' Connect failed with CURL method'; +$_MODULE['<{paypal}default-bootstrap>tlsverificator_70215486455daee13382c68b1a230b82'] = 'Connect with CURL method successful'; +$_MODULE['<{paypal}default-bootstrap>tlsverificator_e4c4ad49bced42265b5facc2175cdafd'] = 'Sending this params:'; +$_MODULE['<{paypal}default-bootstrap>tlsverificator_445583f6641da98fc7ac8fd9d13a564b'] = 'Send with CURL method failed ! Error:'; +$_MODULE['<{paypal}default-bootstrap>tlsverificator_ef4fbf36eaa2083442d386990ba063c2'] = 'Send with CURL method successful'; +$_MODULE['<{paypal}default-bootstrap>submit_67a3fcdb7708219b9d5d6269ad8c4a86'] = 'An error occurred while processing payment.'; +$_MODULE['<{paypal}default-bootstrap>submitplus_2aca594991b613a9cff3818024bb0911'] = 'An error occured during the payment'; +$_MODULE['<{paypal}default-bootstrap>submitplus_795199051a09267451a5896d157e9490'] = 'Your payment has been taken into account'; +$_MODULE['<{paypal}default-bootstrap>submitplus_2758fccb8c7506009717e9834717c238'] = 'Your order has been canceled'; +$_MODULE['<{paypal}default-bootstrap>payment_d141a42a5e72c871a3116414bb5c64c1'] = 'Cannot create new cart'; +$_MODULE['<{paypal}default-bootstrap>payment_5b5adcef5e3f2e5e1b6f60eb3e7e41ed'] = 'Une erreur est survenue :'; +$_MODULE['<{paypal}default-bootstrap>payment_dca16503c563d9fdec70d18f2ab653a4'] = 'Error occurred:'; +$_MODULE['<{paypal}default-bootstrap>payment_51da74120dd5e11817ef21e27d2599bc'] = 'Cannot create customer'; +$_MODULE['<{paypal}default-bootstrap>payment_bcf08b34ab427cb871635151c6976eb0'] = 'Cannot create Address'; +$_MODULE['<{paypal}default-bootstrap>payment_ca5cecfc8fd8e585ba1e684757168158'] = 'Cannot update existing cart'; +$_MODULE['<{paypal}default-bootstrap>payment_ada2b5d5bbf3065de283d61526141780'] = 'Pending payment capture.'; +$_MODULE['<{paypal}default-bootstrap>payment_36ec50c0e914dd2fb48a1b27540512ce'] = 'Payment accepted.'; +$_MODULE['<{paypal}default-bootstrap>payment_719073527bcc898d5e7cc63fd6d16ce4'] = 'eCheck'; +$_MODULE['<{paypal}default-bootstrap>payment_c8a31175ee6991be6a0d7a6d32ca4268'] = 'Pending payment confirmation.'; +$_MODULE['<{paypal}default-bootstrap>payment_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Price paid on paypal is not the same that on PrestaShop.'; +$_MODULE['<{paypal}default-bootstrap>payment_98825385aadb1d0dd0fd133ef8acd23d'] = 'Cannot create order'; +$_MODULE['<{paypal}default-bootstrap>payment_085b78e060c3ef4cc37bd25abd06ff66'] = 'Cart changed since the last checkout express, please make a new Paypal checkout payment'; +$_MODULE['<{paypal}default-bootstrap>payment_572da7ef1411f2a12409e752f3eb2f7a'] = 'Your cart is empty.'; +$_MODULE['<{paypal}default-bootstrap>process_ee9dc1e678d54c517f481583c3fb2db8'] = ' Not a valid currency'; +$_MODULE['<{paypal}default-bootstrap>process_484f5a79672cebe198ebdde45a1d672f'] = 'Gift wrapping'; +$_MODULE['<{paypal}default-bootstrap>notifier_8a34d4a5b0c3928059f6f92ead9e8aa6'] = ' Price paid on paypal is not the same that on PrestaShop.'; +$_MODULE['<{paypal}default-bootstrap>notifier_572f9af7615560af2cba038cc1948287'] = 'Cart changed, please retry.'; +$_MODULE['<{paypal}default-bootstrap>notifier_36ec50c0e914dd2fb48a1b27540512ce'] = 'Payment accepted.'; +$_MODULE['<{paypal}default-bootstrap>submit_795199051a09267451a5896d157e9490'] = 'Your payment has been taken into account'; +$_MODULE['<{paypal}default-bootstrap>submit_2aca594991b613a9cff3818024bb0911'] = 'An error occured during the payment'; +$_MODULE['<{paypal}default-bootstrap>submit_2758fccb8c7506009717e9834717c238'] = 'Your order has been canceled'; +$_MODULE['<{paypal}default-bootstrap>back_office_d596ba73f24775101da736d526c2a295'] = 'Leader in'; +$_MODULE['<{paypal}default-bootstrap>back_office_1271028061aa0c0b68441949c78007a2'] = 'online payments'; +$_MODULE['<{paypal}default-bootstrap>back_office_e03365ca8f60ac963c10adf77ad89623'] = 'Easy, secure, fast payments for your buyers.'; +$_MODULE['<{paypal}default-bootstrap>back_office_e9f91995a69772872f7a386c6909403d'] = 'Get more buyers'; +$_MODULE['<{paypal}default-bootstrap>back_office_bbf54c5f55856a290f0deae540368071'] = '100 million-plus PayPal accounts worldwide'; +$_MODULE['<{paypal}default-bootstrap>back_office_ad78c46c5d6edc542ad2153e23518478'] = 'Access international buyers'; +$_MODULE['<{paypal}default-bootstrap>back_office_2b91c701cecf505dc5af4e35d7067f1f'] = '190 countries, 25 currencies'; +$_MODULE['<{paypal}default-bootstrap>back_office_3a73e92a81de06fba19ab722bd500675'] = 'Reassure your buyers'; +$_MODULE['<{paypal}default-bootstrap>back_office_aa2c2878f81beff707ddef76776a92fd'] = 'Buyers don\'t need to share their private data'; +$_MODULE['<{paypal}default-bootstrap>back_office_421fe69f8b38a3c361835747e6215227'] = 'Accept all major payment method'; +$_MODULE['<{paypal}default-bootstrap>back_office_fa089c4e68a80073a4548d133d7d526d'] = 'Your configuration use version 1.2 of protocol TLS'; +$_MODULE['<{paypal}default-bootstrap>back_office_432cfbdc035243b5a1ef9f95c3cf807f'] = 'Click here to know more'; +$_MODULE['<{paypal}default-bootstrap>back_office_071c77a3ce64ef511e953b5edd4f0207'] = 'Your configuration use version 1.0 to communicate with PayPal.From July, all payments will be blocked.Thank you to approach your hosting company to enable the TLS version 1.2'; +$_MODULE['<{paypal}default-bootstrap>back_office_ae3cebe661e92cdfd12516419fef4f2d'] = 'Download the'; +$_MODULE['<{paypal}default-bootstrap>back_office_e73756d0d2306110f29ccf28cb69c412'] = 'Paypal Integration Guide'; +$_MODULE['<{paypal}default-bootstrap>back_office_6506302a6e11077ecbc04b5932a65c4c'] = 'on PrestaShop and follow the configuration step by step'; +$_MODULE['<{paypal}default-bootstrap>back_office_516710946f5fb35af6496ad0b7582980'] = 'Getting started with PayPal only takes 5 minutes'; +$_MODULE['<{paypal}default-bootstrap>back_office_56564e0a106b0e0e2dc57b5a105ed639'] = 'Your country'; +$_MODULE['<{paypal}default-bootstrap>back_office_eb399bcaca686f8609137153307eecf1'] = 'change'; +$_MODULE['<{paypal}default-bootstrap>back_office_a7bb58222222b064f0721e6e0fe4c486'] = 'Select your country'; +$_MODULE['<{paypal}default-bootstrap>back_office_93140d7ca5171ede9b8a94f07f0363ec'] = 'You already have a PayPal business account'; +$_MODULE['<{paypal}default-bootstrap>back_office_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{paypal}default-bootstrap>back_office_93cba07454f06a4a960172bbd6e2a435'] = 'Yes'; +$_MODULE['<{paypal}default-bootstrap>back_office_73878c19cdc6ef2ab0d0fac6943cc958'] = 'Need help ?'; +$_MODULE['<{paypal}default-bootstrap>back_office_c040d088d1d6370e2dbad78b71fb1b74'] = 'Give us a call : xxxx'; +$_MODULE['<{paypal}default-bootstrap>back_office_240fdce652f09de611fc997971dea41e'] = 'Select your solution'; +$_MODULE['<{paypal}default-bootstrap>back_office_d59048f21fd887ad520398ce677be586'] = 'Learn more'; +$_MODULE['<{paypal}default-bootstrap>back_office_cd5ee0ac6f3296c551e631268af2915b'] = 'Need PayPal to process all your card payments ?'; +$_MODULE['<{paypal}default-bootstrap>back_office_961f2247a2070bedff9f9cd8d64e2650'] = 'Choose'; +$_MODULE['<{paypal}default-bootstrap>back_office_d30abcb258277c6028d040b073276da1'] = 'Website Payments Standard'; +$_MODULE['<{paypal}default-bootstrap>back_office_4d647b4406dba3d579ac2ef165c05196'] = 'Start accepting payments immediately.'; +$_MODULE['<{paypal}default-bootstrap>back_office_e331bc26b25860e255aac1225fc5c639'] = 'No subscription fees, pay only when you get paid.'; +$_MODULE['<{paypal}default-bootstrap>back_office_d5e2ec9a0a842a49d3258d6e355d3b55'] = 'Website Payments Pro'; +$_MODULE['<{paypal}default-bootstrap>back_office_366520e0e4a3ce5469c0ed737ae032ef'] = 'A professional platform to accept payments through credit cards and PayPal account, covered by seller protection.'; +$_MODULE['<{paypal}default-bootstrap>back_office_3014bd9d081fc92e6ab6bb7e91336749'] = 'Customized payments pages. Monthly subscription of 25€.'; +$_MODULE['<{paypal}default-bootstrap>back_office_b9b242f30b7f3cf333e57f359ca3c9bc'] = 'Click on the SAVE button only when PayPal has approved your subscription for this product. This process can take up to 3-5 days.'; +$_MODULE['<{paypal}default-bootstrap>back_office_53f61475efdd0c433443262f0d7cdcbf'] = 'PayPal Plus'; +$_MODULE['<{paypal}default-bootstrap>back_office_69d7974bb0bacddb986bbf8d734238c4'] = 'Need PayPal in addition to your existing card processor ?'; +$_MODULE['<{paypal}default-bootstrap>back_office_2e3e721e530a957f81d5b5dcff0bf0e1'] = 'Express Checkout'; +$_MODULE['<{paypal}default-bootstrap>back_office_cc84ef735c1a521fe731773a700a87ec'] = 'Boost your online sales by 30%*.'; +$_MODULE['<{paypal}default-bootstrap>back_office_e8c466b9c179e229ae67f339a8e2476a'] = 'Souscrivez ou ouvrez un compte PayPal Professionnel'; +$_MODULE['<{paypal}default-bootstrap>back_office_d67850bd126f070221dcfd5fa6317043'] = 'Sign Up'; +$_MODULE['<{paypal}default-bootstrap>back_office_b26917587d98330d93f87808fc9d7267'] = 'Subscribe'; +$_MODULE['<{paypal}default-bootstrap>back_office_5c57ba1861701e5a630dd5006acb30e2'] = 'Once your account is created, come back to this page in order to complete step 3.'; +$_MODULE['<{paypal}default-bootstrap>back_office_ff7e05b87636d641663fb2f590d9f2bd'] = 'Click on the SAVE button only when PayPal has approved your subscription for this product, otherwise you won\'t be able to process payment. This process can take up to 3-5 days.'; +$_MODULE['<{paypal}default-bootstrap>back_office_78ba94e61abed0cbb6349b37ec9ed59e'] = 'If your application for Website Payments Pro has already been approved by PayPal, please go directly to step 3'; +$_MODULE['<{paypal}default-bootstrap>back_office_5b0e8271bd4b23a6bd7a7f49725ed926'] = 'Process payments on your online shop'; +$_MODULE['<{paypal}default-bootstrap>back_office_b4e69ef9df8f20b984309ee73f78953b'] = 'Communicate your PayPal identification info to PrestaShop'; +$_MODULE['<{paypal}default-bootstrap>back_office_2ffe0ef69fd047d0884f98faa52c1bd3'] = 'Get my PayPal identification info'; +$_MODULE['<{paypal}default-bootstrap>back_office_36461ebc9ebcd269f3909fa49a4b0a57'] = 'fter clicking on the “Get my PayPal identification info” button, enter your login and password in the pop up, copy your PayPal identification info from the pop up and paste them is the below fields.'; +$_MODULE['<{paypal}default-bootstrap>back_office_266ba5df48aed68af0cce5f735035291'] = 'API username'; +$_MODULE['<{paypal}default-bootstrap>back_office_37e31370e4ab230ff6fba12cc6390aff'] = 'API password'; +$_MODULE['<{paypal}default-bootstrap>back_office_195ca49498f0b30d3a8967eff22fa9b3'] = 'API signature'; +$_MODULE['<{paypal}default-bootstrap>back_office_74cec07ee40362f7605816fdcfbf194d'] = 'Please check once more that you pasted all the characters.'; +$_MODULE['<{paypal}default-bootstrap>back_office_94ae34a9c107a078c63df4be1394e49d'] = 'Provide your PayPal API credentials to PrestaShop'; +$_MODULE['<{paypal}default-bootstrap>back_office_76525f0f34b48475e5ca33f71d296f3b'] = 'Client ID'; +$_MODULE['<{paypal}default-bootstrap>back_office_1e6947ac7fb3a9529a9726eb692c8cc5'] = 'Secret'; +$_MODULE['<{paypal}default-bootstrap>back_office_90912596e1deb86b1f39bb30013e2f8b'] = 'Use personnalisation (uses your logo and your shop name on Paypal) :'; +$_MODULE['<{paypal}default-bootstrap>back_office_67f0dc0ff3d7b1fa4bb975b8831f54a9'] = 'Indicate the email you used when you signed up for a PayPal Business account'; +$_MODULE['<{paypal}default-bootstrap>back_office_671bb93f14482ae559c736818605f445'] = 'API business e-mail'; +$_MODULE['<{paypal}default-bootstrap>back_office_0e55f1779fe0d4169ab51bcb0ade306f'] = 'To finalize setting up your PayPal account, you need to'; +$_MODULE['<{paypal}default-bootstrap>back_office_258da42945130420ae78d4494d549e42'] = 'Confirm your email address : check the email sent by PayPal when you created your account'; +$_MODULE['<{paypal}default-bootstrap>back_office_f9a8989b19d6c0db2e1cdfe2d54827c2'] = 'Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to \"My business setup\"'; +$_MODULE['<{paypal}default-bootstrap>back_office_50f33d14f129e4548c1c270fd6725a78'] = 'Configuration options'; +$_MODULE['<{paypal}default-bootstrap>back_office_113269a2fc804aeae74a99e168309e8b'] = 'Choose the solution you want to use'; +$_MODULE['<{paypal}default-bootstrap>back_office_a025e05161bb17cbab898f0e77b09a2b'] = 'Iframe'; +$_MODULE['<{paypal}default-bootstrap>back_office_d63bbf35e72f644c8752d4f2304f89e8'] = 'Full page redirect'; +$_MODULE['<{paypal}default-bootstrap>back_office_c7c6643c2c48aabc724f019ea0ef26cc'] = 'Choose a template'; +$_MODULE['<{paypal}default-bootstrap>back_office_684c41bec3eaa8b8bc929c829c602157'] = 'Use express checkout shortcut'; +$_MODULE['<{paypal}default-bootstrap>back_office_76cfbdf3f35eb2368b8cbabfdd9f55db'] = 'Offer your customers a 2-click payment option'; +$_MODULE['<{paypal}default-bootstrap>back_office_c5192977219fb2eea3b1b41f8ce9f57d'] = 'Use PayPal In Context Checkout'; +$_MODULE['<{paypal}default-bootstrap>back_office_9229ae1bb2c5f0b221ac8f7f131aadc5'] = 'Make your client pay without leaving your website'; +$_MODULE['<{paypal}default-bootstrap>back_office_229a7ec501323b94db7ff3157a7623c9'] = 'Merchant ID'; +$_MODULE['<{paypal}default-bootstrap>back_office_748eadce9cf4f2bde207b63c5441da07'] = 'Use the PayPal Login functionnality'; +$_MODULE['<{paypal}default-bootstrap>back_office_cded4ac9f77c68c750c243af1f5263c5'] = '(*see the'; +$_MODULE['<{paypal}default-bootstrap>back_office_606d8f704cf61d29bffd5195f28af29e'] = 'integration guide'; +$_MODULE['<{paypal}default-bootstrap>back_office_a1694ad810c4ac5b56b59c47db01cb05'] = 'and follow the steps'; +$_MODULE['<{paypal}default-bootstrap>back_office_3650f874df7e9c6e822a872d02cee6d5'] = 'This function allows to your clients to connect with their PayPal credentials to shorten the check out'; +$_MODULE['<{paypal}default-bootstrap>back_office_9be4e88898c4e88363208d2472f4a406'] = 'Fill in the informations of your PayPal account'; +$_MODULE['<{paypal}default-bootstrap>back_office_4ff2e716a7d06ce5274b4090b39abad3'] = 'See'; +$_MODULE['<{paypal}default-bootstrap>back_office_8646a5d7b2817d30950357da8d80a11f'] = 'Integration Guide'; +$_MODULE['<{paypal}default-bootstrap>back_office_69f768e6b78f82d0eaf3f415d1c515bf'] = 'Translated in your language'; +$_MODULE['<{paypal}default-bootstrap>back_office_705995576030bd6e0d95c02dcdea8e90'] = 'Use Sand box'; +$_MODULE['<{paypal}default-bootstrap>back_office_4b7472c730be779d64f3721de7e254ba'] = 'Activate a test environment in your PayPal account (only if you are a developer).'; +$_MODULE['<{paypal}default-bootstrap>back_office_cebd5bbe0ffdecc270a8a324e5a277dd'] = 'Live mode'; +$_MODULE['<{paypal}default-bootstrap>back_office_4245499695408b974322be6f01b0d17a'] = 'Test mode'; +$_MODULE['<{paypal}default-bootstrap>back_office_4dbcb38bbbff5d4a402f2575c57a35e6'] = 'Payment type'; +$_MODULE['<{paypal}default-bootstrap>back_office_0eae1e85287701bf8071e06bfb65b933'] = 'Choose your way of processing payments (automatically vs.manual authorization).'; +$_MODULE['<{paypal}default-bootstrap>back_office_339bb3a6443078c1fd5a88d0a0d97096'] = 'Direct sales (recommended)'; +$_MODULE['<{paypal}default-bootstrap>back_office_9a901d2379aac144a2693dc7bf5c8caf'] = 'Authorization/Manual capture (payment shipping)'; +$_MODULE['<{paypal}default-bootstrap>back_office_c9cc8cce247e49bae79f15173ce97354'] = 'Save'; +$_MODULE['<{paypal}default-bootstrap>back_office_13e8a61381ef71ee7f101ded231c9628'] = 'Activating the test mode implies that'; +$_MODULE['<{paypal}default-bootstrap>back_office_f0b2074a9f1d017f7d5a7320f2c94a51'] = 'You won\'t be able to accept payment'; +$_MODULE['<{paypal}default-bootstrap>back_office_97ce37634025467f01c4eec75c93eda6'] = 'You will need to come back to the PayPal module page in order to complete the Step 3 before going live.'; +$_MODULE['<{paypal}default-bootstrap>back_office_4eb833f98c44cadf0b5ab6e576e06fe6'] = 'You\'ll need to create an account on the PayPal sandbox site'; +$_MODULE['<{paypal}default-bootstrap>back_office_d8fd35f628f2099aeaf3e5253e4acdba'] = 'learn more'; +$_MODULE['<{paypal}default-bootstrap>back_office_c53a1cbd15d24e03392bebd5eda7fb63'] = 'You\'ll need programming skills'; +$_MODULE['<{paypal}default-bootstrap>back_office_ff0d39d63c036426d6833917d512ef22'] = 'Are you sure you want to activate the test mode ?'; +$_MODULE['<{paypal}default-bootstrap>back_office_980d7b730b063eabd43e8954e4e072ad'] = 'Congratulation !'; +$_MODULE['<{paypal}default-bootstrap>back_office_bb945e9f42acb423adb3d7535d491444'] = 'You can now start accepting Payment with PayPal.'; +$_MODULE['<{paypal}default-bootstrap>back_office_b89192773139ddf85c519d20255e7cf4'] = 'You can now start testing PayPal solutions. Don\'t forget to comeback to this page and activate the live mode in order to start accepting payements.'; +$_MODULE['<{paypal}default-bootstrap>back_office_2d801c24938b12e4ca9a2cf9b980c759'] = 'Error !'; +$_MODULE['<{paypal}default-bootstrap>back_office_c21d57906c025cdec22f69835b0c3c60'] = 'You need to complete the PayPal identification Information in step 3 otherwise you won\'t be able to accept payment.'; +$_MODULE['<{paypal}default-bootstrap>back_office_261fa91388f4f40fe010e174aba10c36'] = '*Source: Forrester research realized in march 2011'; +$_MODULE['<{paypal}default-bootstrap>back_office_3927e4ef139e9ffedccd66289344b4e3'] = 'Your country is not available for this module please go on Prestashop addons to see the different possibilities.'; +$_MODULE['<{paypal}default-bootstrap>capture_81e826adb70e2e6b189c2eef739d52d4'] = 'PayPal Capture'; +$_MODULE['<{paypal}default-bootstrap>capture_3f8c6ecb084eea3b83d659fab7155e86'] = 'Capture date'; +$_MODULE['<{paypal}default-bootstrap>capture_f0b7cad3b2f0f29dcb4f2cad27cba2f8'] = 'Capture Amount'; +$_MODULE['<{paypal}default-bootstrap>capture_4746a3312ea207c919decf4e4ed5bb81'] = 'Result Capture'; +$_MODULE['<{paypal}default-bootstrap>capture_8e400d2b91f0c78c6a3a47d4d765f9ab'] = 'There is still'; +$_MODULE['<{paypal}default-bootstrap>capture_c6219ecef36e5dea2a7b634be290c526'] = 'to capture.'; +$_MODULE['<{paypal}default-bootstrap>capture_91744988bc81fc8a22b19b97c54587cb'] = 'How many do you want to capture :'; +$_MODULE['<{paypal}default-bootstrap>capture_7c9275196098d2ed4edc8d6425190707'] = 'Enter the money you want to capture (ex: 200.00)'; +$_MODULE['<{paypal}default-bootstrap>capture_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Information:'; +$_MODULE['<{paypal}default-bootstrap>capture_ce64b2ea82cf4fa861a6512e2c32b84b'] = 'Funds ready to be captured before shipping'; +$_MODULE['<{paypal}default-bootstrap>capture_a61a9250ef6cc54f0d7dc8dd0c13da98'] = 'Are you sure you want to capture?'; +$_MODULE['<{paypal}default-bootstrap>capture_99e64593868df2b7b32231c1ae5ddc04'] = 'Get the money'; +$_MODULE['<{paypal}default-bootstrap>refund_8ba079f305b81b172792bc0469b6a690'] = 'PayPal Refund'; +$_MODULE['<{paypal}default-bootstrap>refund_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Information:'; +$_MODULE['<{paypal}default-bootstrap>refund_016e1f278eccd700eaf33f74a501d050'] = 'Payment accepted'; +$_MODULE['<{paypal}default-bootstrap>refund_a8b1cc445942a2e1a7d7cca641c86d67'] = 'When you refund a product, a partial refund is made unless you select \"Generate a voucher\".'; +$_MODULE['<{paypal}default-bootstrap>refund_729a51874fe901b092899e9e8b31c97a'] = 'Are you sure?'; +$_MODULE['<{paypal}default-bootstrap>refund_c2a5e2e23d8ec9cad779d657b7d33fc1'] = 'Refund total transaction'; +$_MODULE['<{paypal}default-bootstrap>validation_b630aa9b5e25da971949cae62dd109aa'] = 'PayPal Validation'; +$_MODULE['<{paypal}default-bootstrap>validation_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Information:'; +$_MODULE['<{paypal}default-bootstrap>validation_9119a92adbbf6c67bfb8a3aee0bdb720'] = 'Pending Capture - No shipping'; +$_MODULE['<{paypal}default-bootstrap>validation_c14eb95a724174f336b8ffdd98ef2f35'] = 'Pending Payment - No shipping'; +$_MODULE['<{paypal}default-bootstrap>validation_5b18ff32c2aaaf4b79bdead10b10fe29'] = 'Get payment status'; +$_MODULE['<{paypal}default-bootstrap>about_e816e21c1c8e0eba0620fa3df6bd6795'] = ' What Is PayPal?'; +$_MODULE['<{paypal}default-bootstrap>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal, the trusted leader in online payments, enables buyers and businesses to send and receive money online. PayPal has over 100 million member accounts in 190 countries and regions. It\'s accepted by merchants everywhere, both on and off eBay.'; +$_MODULE['<{paypal}default-bootstrap>about_d20adade7baa1b60b713521031ea676c'] = 'Is it safe to use?'; +$_MODULE['<{paypal}default-bootstrap>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal helps protect your credit card information with industry-leading security and fraud prevention systems. When you use PayPal, your financial information is never shared with the merchant.'; +$_MODULE['<{paypal}default-bootstrap>about_5ef30813484389e4200640c2f006004d'] = 'Why use PayPal?'; +$_MODULE['<{paypal}default-bootstrap>about_86550d4ea832930db4366f03b90bdfb8'] = 'Make purchases or send money with PayPal - it\'s free'; +$_MODULE['<{paypal}default-bootstrap>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Shop and pay conveniently by saving your information with PayPal'; +$_MODULE['<{paypal}default-bootstrap>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'PayPal is accepted by millions of businesses worldwide and is the preferred payment method on eBay'; +$_MODULE['<{paypal}default-bootstrap>about_7934d7d1280bfbb8778743e39292af30'] = 'Start using PayPal today!'; +$_MODULE['<{paypal}default-bootstrap>error_a40cab5994f36d4c48103a22ca082e8f'] = ' Your shopping cart'; +$_MODULE['<{paypal}default-bootstrap>error_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}default-bootstrap>error_f47106270a2928f350f357e255a2c2ac'] = 'Please try to contact the merchant:'; +$_MODULE['<{paypal}default-bootstrap>error_d5860edcd3078f86ee963c27654bc6cf'] = 'Total of the transaction (taxes incl.) :'; +$_MODULE['<{paypal}default-bootstrap>error_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Your order ID is :'; +$_MODULE['<{paypal}default-bootstrap>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Back'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-mobile_fb077ecba55e5552916bde26d8b9e794'] = 'Order confirmation'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-mobile_d5860edcd3078f86ee963c27654bc6cf'] = 'Total of the transaction (taxes incl.) :'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-mobile_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Your order ID is :'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-mobile_6e860dc1cf94ca08b3fd99993aa2dc68'] = 'Your PayPal transaction ID is :'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-mobile_300225ee958b6350abc51805dab83c24'] = 'Continue shopping'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-mobile_9390390581f54c65d6acfc8da4e17362'] = 'Back to orders'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus-mobile_fb077ecba55e5552916bde26d8b9e794'] = 'Order confirmation'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus-mobile_1bdf0a578085305bfc89204c35a2e282'] = 'Order confirmation ?'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus-mobile_705c8bbd1b017c7aef55f271497c46f3'] = 'Do you want to confirm your order for total amount of'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus-mobile_3ead062a94f740e432db35289dc3ac8a'] = 'Cancel you order'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus-mobile_e1007b413aa77c8b67f874ede13915d9'] = 'Confirm your payment'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus-mobile_4082ea29b4f196c4f60533500139725a'] = 'Follow my order'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus-mobile_9390390581f54c65d6acfc8da4e17362'] = 'Back to orders'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus-mobile_996762d40f1a6ef751e51c58f72c2ed2'] = 'An error occured during your payment'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus-mobile_2758fccb8c7506009717e9834717c238'] = 'Your order has been canceled'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus_fb077ecba55e5552916bde26d8b9e794'] = 'Order confirmation'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus_dbf8de5592ae3e932edd8b56ac3fda05'] = 'Order Confirmation ?'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus_705c8bbd1b017c7aef55f271497c46f3'] = 'Do you want to confirm your order for total amount of'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus_154c197e501e1f61ef5f82b7e420da8b'] = 'Cancel your order'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus_e1007b413aa77c8b67f874ede13915d9'] = 'Confirm your payment'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus_4082ea29b4f196c4f60533500139725a'] = 'Follow my order'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus_9390390581f54c65d6acfc8da4e17362'] = 'Back to orders'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus_996762d40f1a6ef751e51c58f72c2ed2'] = 'An error occured during your payment'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation-plus_2758fccb8c7506009717e9834717c238'] = 'Your order has been canceled'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation_fb077ecba55e5552916bde26d8b9e794'] = 'Order confirmation'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation_d5860edcd3078f86ee963c27654bc6cf'] = 'Total of the transaction (taxes incl.) :'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Your order ID is :'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation_6e860dc1cf94ca08b3fd99993aa2dc68'] = 'Your PayPal transaction ID is :'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation_4082ea29b4f196c4f60533500139725a'] = 'Follow my order'; +$_MODULE['<{paypal}default-bootstrap>order-confirmation_9390390581f54c65d6acfc8da4e17362'] = 'Back to orders'; +$_MODULE['<{paypal}default-bootstrap>order-summary_a40cab5994f36d4c48103a22ca082e8f'] = 'Your shopping cart'; +$_MODULE['<{paypal}default-bootstrap>order-summary_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}default-bootstrap>order-summary_f1d3b424cd68795ecaa552883759aceb'] = 'Order summary'; +$_MODULE['<{paypal}default-bootstrap>order-summary_dd23adc5fb6bda9c384397b31e57fc53'] = 'PayPal payment'; +$_MODULE['<{paypal}default-bootstrap>order-summary_0881a11f7af33bc1b43e437391129d66'] = 'Please confirm your order by clicking \'I confirm my order\''; +$_MODULE['<{paypal}default-bootstrap>order-summary_46b9e3665f187c739c55983f757ccda0'] = 'I confirm my order'; +$_MODULE['<{paypal}default-bootstrap>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pay with PayPal'; +$_MODULE['<{paypal}default-bootstrap>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Your order on'; +$_MODULE['<{paypal}default-bootstrap>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'is complete.'; +$_MODULE['<{paypal}default-bootstrap>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'You have chosen the PayPal method.'; +$_MODULE['<{paypal}default-bootstrap>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Your order will be sent very soon.'; +$_MODULE['<{paypal}default-bootstrap>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'For any questions or for further information, please contact our'; +$_MODULE['<{paypal}default-bootstrap>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'customer support'; +$_MODULE['<{paypal}default-bootstrap>express_checkout_payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pay with PayPal'; +$_MODULE['<{paypal}default-bootstrap>express_checkout_payment_83a1a5a403aed4b7ead866d253aef998'] = 'Pay with your card or your PayPal account'; +$_MODULE['<{paypal}default-bootstrap>express_checkout_payment_eu_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pay with PayPal'; +$_MODULE['<{paypal}default-bootstrap>express_checkout_shortcut_form_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pay with PayPal'; +$_MODULE['<{paypal}default-bootstrap>integral_evolution_payment_83a1a5a403aed4b7ead866d253aef998'] = 'Pay with your card or your PayPal account'; +$_MODULE['<{paypal}default-bootstrap>integral_evolution_payment_ecab922bc1f9b5726e2a6deb4acaec4e'] = 'Return back to the merchant\'s website'; +$_MODULE['<{paypal}default-bootstrap>integral_evolution_payment_eu_ecab922bc1f9b5726e2a6deb4acaec4e'] = 'Return back to the merchant\'s website'; +$_MODULE['<{paypal}default-bootstrap>paypal_cart_summary_62d74398cb6ebaa69ab7339052ca5c92'] = 'You have chosen to pay with PayPal.'; +$_MODULE['<{paypal}default-bootstrap>paypal_cart_summary_c884ed19483d45970c5bf23a681e2dd2'] = 'Here is a short summary of your order:'; +$_MODULE['<{paypal}default-bootstrap>paypal_cart_summary_0c458988127eb2150776881e2ef3f0c4'] = 'Shipping address'; +$_MODULE['<{paypal}default-bootstrap>paypal_cart_summary_1fbc7e5f1b92c7ec072397b59a0bb5da'] = 'Billing address'; +$_MODULE['<{paypal}default-bootstrap>paypal_cart_summary_9254cd9a15c6cc29d90cf5e585628e0f'] = 'Your cart'; +$_MODULE['<{paypal}default-bootstrap>paypal_cart_summary_be53a0541a6d36f6ecb879fa2c584b08'] = 'Image'; +$_MODULE['<{paypal}default-bootstrap>paypal_cart_summary_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{paypal}default-bootstrap>paypal_cart_summary_694e8d1f2ee056f98ee488bdc4982d73'] = 'Quantity'; +$_MODULE['<{paypal}default-bootstrap>paypal_cart_summary_e2867a925cba382f1436d1834bb52a1c'] = 'The total amount of your order is'; +$_MODULE['<{paypal}default-bootstrap>paypal_cart_summary_1f87346a16cf80c372065de3c54c86d9'] = '(tax incl.)'; +$_MODULE['<{paypal}default-bootstrap>paypal_cart_summary_8ed356c32b198c9cb2abab7c3d262b93'] = 'We accept the following currency to be sent by PayPal:'; diff --git a/modules/paypal/es.php b/modules/paypal/es.php new file mode 100644 index 000000000..299ae9f52 --- /dev/null +++ b/modules/paypal/es.php @@ -0,0 +1,93 @@ +paypal_connect_d1f14cc4a2dade80c92421d26422fea0'] = 'Abrir una nueva conexión con'; +$_MODULE['<{paypal}prestashop>paypal_connect_94a27811a721ef512ad7bfa06cab34e0'] = 'Error de la conexión con el método cURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_70215486455daee13382c68b1a230b82'] = 'La conexión con el método cURL se ha desarrollado con éxito'; +$_MODULE['<{paypal}prestashop>paypal_connect_e4c4ad49bced42265b5facc2175cdafd'] = 'Envío de parámetros:'; +$_MODULE['<{paypal}prestashop>paypal_connect_445583f6641da98fc7ac8fd9d13a564b'] = 'Error de envío con el método cURL. Error:'; +$_MODULE['<{paypal}prestashop>paypal_connect_ef4fbf36eaa2083442d386990ba063c2'] = 'Envío con éxito con el método cURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_bf059c9751bb1a20b449b7917b1df374'] = 'Error de la conexión con el método fsockopen'; +$_MODULE['<{paypal}prestashop>paypal_connect_6e9aa4cb541e09b07602d4ea96080811'] = 'Error de envío con el método fsockopen. Error:'; +$_MODULE['<{paypal}prestashop>paypal_connect_842a183be225d415b2b4375ba1dd1c94'] = 'Envío con éxito con el método fsockopen'; +$_MODULE['<{paypal}prestashop>paypal_lib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'Respuesta de PayPal :'; +$_MODULE['<{paypal}prestashop>notifier_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pago aceptado'; +$_MODULE['<{paypal}prestashop>about_e816e21c1c8e0eba0620fa3df6bd6795'] = '¿Qué es PayPal?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal es el líder indiscutible de pagos por Internet: tiene más de 100 millones de cuentas repartidas en 190 países de todo el mundo. Es aceptado como forma de pago por muchos vendedores, tanto dentro como fuera de eBay.'; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = '¿Es un servicio seguro?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal protege sus datos financieros con los mejores sistemas de seguridad y prevención de fraude del mercado. PayPal nunca revela sus datos financieros al vendedor.'; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = '¿Por qué utilizar PayPal?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = 'Haga compras y envíe pagos con PayPal: es gratuito (consulte las condicio'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Registre sus datos en PayPal y compre con toda tranquilidad .'; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'Millones de vendedores de todo el mundo aceptan PayPal y es la forma de pago más utilizada en eBay.'; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = '¡Utilice PayPal ya!'; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Carrito de la compra'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Anterior'; +$_MODULE['<{paypal}prestashop>paypal_98aba438b26738216a5674199a9a4159'] = 'Su servidor no es compatible con la futura versión del módulo de PayPal". Puede ponerse en contacto con su empresa de hosting para actualizar a la versión PHP 5.4 como mínimo o las siguientes versiones'; +$_MODULE['<{paypal}prestashop>order-confirmation_fb077ecba55e5552916bde26d8b9e794'] = 'Confirmación de pedido'; +$_MODULE['<{paypal}prestashop>order-confirmation_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Su ID de pedido es:'; +$_MODULE['<{paypal}prestashop>order-confirmation_4082ea29b4f196c4f60533500139725a'] = 'Seguimiento de mi pedido'; +$_MODULE['<{paypal}prestashop>order-confirmation_9390390581f54c65d6acfc8da4e17362'] = 'Volver a pedidos'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pagar con PayPal'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'El pedido de'; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'se ha guardado correctamente'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'Ha seleccionado PayPal como forma de pago'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Le enviaremos el pedido lo antes posible'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Si tiene dudas o necesita información adicional, póngase en contacto con nuestro'; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'servicio de atención al cliente'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_abstract_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Acepta pagos con tarjetas de débito y crédito (Visa, MasterCard, Amex, Aurora) con PayPal'; +$_MODULE['<{paypal}prestashop>paypal_abstract_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = '¿Está seguro de querer borrar los detalles?'; +$_MODULE['<{paypal}prestashop>paypal_abstract_32af90c3cfef1bacf43b0c3a8f60a4da'] = 'Se han recuperado los fondos'; +$_MODULE['<{paypal}prestashop>paypal_abstract_d238649ac5ec14afc894fad36c0b50fc'] = 'La solicitud de recuperación de fondos no se ha hecho correctamente, consulte el mensaje de registro.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_05b998de2c4fb46a7bdd37bd378b81d9'] = 'Se ha completado la validación, consulte el mensaje de registro.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_aeca7e93a1b3d77e38c3cffa131774d5'] = 'Se ha hecho un reintegro.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_cba030a50c8a99c7e224adbe1cf58544'] = 'La solicitud de reintegro no se ha hecho correctamente, consulte el mensaje de registro.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_20fda49ece75d93bea97648ab1f1f1cf'] = 'Cancelar resultados de productos:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_e5d5d9f40763cfe6549bef705e3529a7'] = 'El mensaje de pago no es válido, compruebe su módulo.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ee9dc1e678d54c517f481583c3fb2db8'] = 'Divisa incorrecta'; +$_MODULE['<{paypal}prestashop>paypal_abstract_eec39bf42bd135971fb2d838c67d1449'] = 'Resultado de la operación de reintegro:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_2ab62d1a578713d0862b56819295630e'] = 'Reintegro completado con PayPal.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_a64db959966ba8d07c8b5d9493fcc21f'] = 'Error de transacción.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_67962779da962e3d4225055afc05e7bd'] = 'Resultado de la operación de captura:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_8778ee03f6592d5fec9a1f2ee851e476'] = 'Pedido completado con PayPal'; +$_MODULE['<{paypal}prestashop>paypal_abstract_672d40feac6437e49f771019bc330790'] = 'Estado de verificación:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_1828820cc60e36b6f9fdf60cab103ed7'] = 'Actualmente está utilizando la dirección email PayPal por defecto, debe sustituirla por sus propia dirección'; +$_MODULE['<{paypal}prestashop>validation_20dfea1a472e5be3f15f6b5f36ca335c'] = 'Error de conexión con el servidor de PayPal.'; +$_MODULE['<{paypal}prestashop>validation_f7799c2ded739cf3c3e9babffc5f315b'] = 'Error de conexión con protocolo cURL.'; +$_MODULE['<{paypal}prestashop>validation_eca77e208634d52703b07672abbf16ec'] = 'Error de verificación (protocolo cURL) . Retroceso:'; +$_MODULE['<{paypal}prestashop>validation_8358ec19f397d4cdd632688d4f79e535'] = 'Error de verificación (protocolo fsockopen) . Retroceso:'; +$_MODULE['<{paypal}prestashop>validation_76ee8dc73701e846f7bccdf98dae079b'] = 'No hay protocolos de comunicación disponibles.'; +$_MODULE['<{paypal}prestashop>validation_bd0e34e5be6447844e6f262d51f1a9dc'] = 'Pago:'; +$_MODULE['<{paypal}prestashop>validation_e0395c4ce35d0b1e59ca3f2d5e260d23'] = 'El token proporcionado por PayPal no es el mismo que el del cookie'; +$_MODULE['<{paypal}prestashop>validation_765261b630ee773659fae89e9ad762f5'] = 'No se ha especificado la clave PayPal \'txn_id\', transacción no reconocida'; +$_MODULE['<{paypal}prestashop>validation_01634612f84d2b7ba56ccdf467e604b7'] = 'No se ha especificado la clave PayPal \'mc_currency\', divisa no reconocida'; +$_MODULE['<{paypal}prestashop>validation_e61f52d02b9f52fbe1fd41ed320e29c3'] = 'No se puede encontrar el carro de la compra'; +$_MODULE['<{paypal}prestashop>validation_0617900b1aff826081d07f5a3e2e7cd0'] = 'Ya se ha procesado el pedido'; +$_MODULE['<{paypal}prestashop>validation_f5209b3301a46f3057ffbf34d903e205'] = 'Id. de la transacción de PayPal:'; +$_MODULE['<{paypal}prestashop>validation_7b19e875ff64b09d80ee05dcc84b9975'] = 'No se ha podido verificar la transacción de PayPal.'; +$_MODULE['<{paypal}prestashop>paypal_connect_ea800e3536f81238a4cbc32eb6db4eaf'] = 'La conexión con el método fsockopen se ha desarrollado con éxito'; +$_MODULE['<{paypal}prestashop>paypal_express_checkout_ee9dc1e678d54c517f481583c3fb2db8'] = 'Divisa incorrecta'; +$_MODULE['<{paypal}prestashop>paypal_express_checkout_484f5a79672cebe198ebdde45a1d672f'] = 'Mensaje para regalo:'; +$_MODULE['<{paypal}prestashop>submit_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pago aceptado'; +$_MODULE['<{paypal}prestashop>error_425551a2289ed60c9260933d1c45ef00'] = 'Compruebe los registros:'; +$_MODULE['<{paypal}prestashop>express_checkout_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pagar con PayPal'; +$_MODULE['<{paypal}prestashop>payment_a40cab5994f36d4c48103a22ca082e8f'] = 'Su cesta'; +$_MODULE['<{paypal}prestashop>payment_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>payment_f1d3b424cd68795ecaa552883759aceb'] = 'Resumen del pedido'; +$_MODULE['<{paypal}prestashop>payment_dd23adc5fb6bda9c384397b31e57fc53'] = 'Pago con PayPal'; +$_MODULE['<{paypal}prestashop>payment_62d74398cb6ebaa69ab7339052ca5c92'] = 'Ha elegido pagar con PayPal.'; +$_MODULE['<{paypal}prestashop>payment_c884ed19483d45970c5bf23a681e2dd2'] = 'Resumen de su pedido:'; +$_MODULE['<{paypal}prestashop>payment_e2867a925cba382f1436d1834bb52a1c'] = 'El importe total de su pedido asciende a'; +$_MODULE['<{paypal}prestashop>payment_1f87346a16cf80c372065de3c54c86d9'] = 'con IVA'; +$_MODULE['<{paypal}prestashop>payment_8ed356c32b198c9cb2abab7c3d262b93'] = 'Aceptamos esta divisa para el pago :'; +$_MODULE['<{paypal}prestashop>payment_0881a11f7af33bc1b43e437391129d66'] = 'Por favor, confirme su pedido pulsando en \"Confirmo mi pedido\"'; +$_MODULE['<{paypal}prestashop>payment_46b9e3665f187c739c55983f757ccda0'] = 'Confirmo mi pedido'; +$_MODULE['<{paypal}prestashop>payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pagar con PayPal'; +$_MODULE['<{paypal}prestashop>payment_a3f2caee6ef8e68fbd26e42d83f2bf65'] = 'Pague con su cuenta PayPal, tarjeta de crédito (CB, Visa, Mastercard ...), o tarjeta de crédito privado'; +$_MODULE['<{paypal}prestashop>payment_b08008a2de4331ba13f006c9bcf37b62'] = 'Pague con su cuenta PayPal'; +$_MODULE['<{paypal}prestashop>paypal_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pagar con PayPal'; diff --git a/modules/paypal/express_checkout/ajax.php b/modules/paypal/express_checkout/ajax.php new file mode 100644 index 000000000..332921fbb --- /dev/null +++ b/modules/paypal/express_checkout/ajax.php @@ -0,0 +1,58 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once dirname(__FILE__).'/../../../config/config.inc.php'; +include_once _PS_ROOT_DIR_.'/init.php'; +include_once dirname(__FILE__).'/../paypal.php'; + +// Ajax query +$quantity = Tools::getValue('get_qty'); + +if (Configuration::get('PS_CATALOG_MODE') == 1) { + die('0'); +} + +if ($quantity && $quantity > 0) { + /* Ajax response */ + $id_product = (int) Tools::getValue('id_product'); + $id_product_attribute = (int) Tools::getValue('id_product_attribute'); + $product_quantity = Product::getQuantity($id_product, $id_product_attribute); + $product = new Product($id_product); + + if (!$product->available_for_order) { + die('0'); + } + + if ($product_quantity > 0) { + die('1'); + } + + if ($product_quantity <= 0 && $product->isAvailableWhenOutOfStock((int) $product->out_of_stock)) { + die('1'); + } + +} +die('0'); diff --git a/modules/paypal/express_checkout/index.php b/modules/paypal/express_checkout/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/express_checkout/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/express_checkout/payment.php b/modules/paypal/express_checkout/payment.php new file mode 100644 index 000000000..287f8acc7 --- /dev/null +++ b/modules/paypal/express_checkout/payment.php @@ -0,0 +1,456 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once dirname(__FILE__).'/../../../config/config.inc.php'; +include_once _PS_ROOT_DIR_.'/init.php'; + +include_once _PS_MODULE_DIR_.'paypal/express_checkout/process.php'; +include_once _PS_MODULE_DIR_.'paypal/express_checkout/submit.php'; +include_once _PS_MODULE_DIR_.'paypal/paypal_login/PayPalLoginUser.php'; + +/* Normal payment process */ +$id_cart = Tools::getValue('id_cart'); +$id_order = Tools::getValue('id_order'); +$id_module = Tools::getValue('id_module'); +$paypal_key = Tools::getValue('key'); + +if ($id_cart && $id_order && $id_module && $paypal_key) { + if (version_compare(_PS_VERSION_, '1.5', '<')) { + new PayPalExpressCheckoutSubmit(); + } + + return; +} + +$request_type = Tools::getValue('express_checkout'); +$ppec = new PaypalExpressCheckout($request_type); + +$token = Tools::getValue('token'); +$payer_id = Tools::getValue('PayerID'); + +function setContextData($ppec) +{ + // Create new Cart to avoid any refresh or other bad manipulations + $ppec->context->cart = new Cart(); + $ppec->context->cart->id_currency = (int) $ppec->context->currency->id; + $ppec->context->cart->id_lang = (int) $ppec->context->language->id; + + // Customer settings + $ppec->context->cart->id_guest = (int) $ppec->context->cookie->id_guest; + $ppec->context->cart->id_customer = (int) $ppec->context->customer->id; + + // Secure key information + $secure_key = isset($ppec->context->customer) ? $ppec->context->customer->secure_key : null; + $ppec->context->cart->secure_key = $secure_key; +} + +/** + * Set customer information + * Used to create user account with PayPal account information + */ +function setCustomerInformation($ppec, $email) +{ + $customer = new Customer(); + $customer->email = $email; + $customer->lastname = $ppec->result['LASTNAME']; + $customer->firstname = $ppec->result['FIRSTNAME']; + $customer->passwd = Tools::encrypt(Tools::passwdGen()); + return $customer; +} + +/** + * Set customer address (when not logged in) + * Used to create user address with PayPal account information + */ +function setCustomerAddress($ppec, $customer, $id = null) +{ + $address = new Address($id); + $address->id_country = Country::getByIso($ppec->result['PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE']); + if ($id == null) { + $address->alias = 'Paypal_Address'; + } + + $name = trim($ppec->result['PAYMENTREQUEST_0_SHIPTONAME']); + $name = explode(' ', $name); + if (isset($name[1])) { + $firstname = $name[0]; + unset($name[0]); + $lastname = implode(' ', $name); + } else { + $lastname = $ppec->result['LASTNAME']; + $firstname = $ppec->result['FIRSTNAME']; + } + + $address->lastname = $lastname; + $address->firstname = $firstname; + $address->address1 = $ppec->result['PAYMENTREQUEST_0_SHIPTOSTREET']; + if (isset($ppec->result['PAYMENTREQUEST_0_SHIPTOSTREET2'])) { + $address->address2 = $ppec->result['PAYMENTREQUEST_0_SHIPTOSTREET2']; + } + + $address->city = $ppec->result['PAYMENTREQUEST_0_SHIPTOCITY']; + if (Country::containsStates($address->id_country)) { + $address->id_state = (int) State::getIdByIso($ppec->result['PAYMENTREQUEST_0_SHIPTOSTATE'], $address->id_country); + } + + $address->postcode = $ppec->result['PAYMENTREQUEST_0_SHIPTOZIP']; + if (isset($ppec->result['PAYMENTREQUEST_0_SHIPTOPHONENUM'])) { + $address->phone = $ppec->result['PAYMENTREQUEST_0_SHIPTOPHONENUM']; + } + + $address->id_customer = $customer->id; + return $address; +} + +function checkAndModifyAddress($ppec, $customer) +{ + $context = Context::getContext(); + $customer_addresses = $customer->getAddresses($context->cookie->id_lang); + $paypal_address = false; + if (count($customer_addresses) == 0) { + $paypal_address = setCustomerAddress($ppec, $customer); + } else { + foreach ($customer_addresses as $address) { + if ($address['alias'] == 'Paypal_Address') { +//If a PayPal address already exists we use it to override new address from paypal + $paypal_address = setCustomerAddress($ppec, $customer, $address['id_address']); + break; + } else { +//We check if an address exists with the same country / city / street + + if ($address['firstname'] == $ppec->result['FIRSTNAME'] && + $address['lastname'] == $ppec->result['LASTNAME'] && + $address['id_country'] == Country::getByIso($ppec->result['PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE']) && + $address['address1'] == $ppec->result['PAYMENTREQUEST_0_SHIPTOSTREET'] && + $address['address2'] == $ppec->result['PAYMENTREQUEST_0_SHIPTOSTREET2'] && + $address['city'] == $ppec->result['PAYMENTREQUEST_0_SHIPTOCITY']) { + $paypal_address = new Address($address['id_address']); + break; + } + } + } + } + if ($paypal_address == false) { + $paypal_address = setCustomerAddress($ppec, $customer); + } + + $paypal_address->save(); + return $paypal_address; +} + +if ($request_type && $ppec->type) { + $id_product = (int) Tools::getValue('id_product'); + $product_quantity = (int) Tools::getValue('quantity'); + $id_product_attribute = Tools::getValue('id_p_attr'); + + if (($id_product > 0) && $id_product_attribute !== false && ($product_quantity > 0)) { + setContextData($ppec); + + if (!$ppec->context->cart->add()) { + $ppec->logs[] = $ppec->l('Cannot create new cart'); + $display = (_PS_VERSION_ < '1.5') ? new BWDisplay() : new FrontController(); + + $ppec->context->smarty->assign( + array( + 'logs' => $ppec->logs, + 'message' => $ppec->l('Error occurred:'), + 'use_mobile' => (bool) $ppec->useMobile(), + ) + ); + + $template = 'error.tpl'; + } else { + $ppec->context->cookie->id_cart = (int) $ppec->context->cart->id; + } + + $ppec->context->cart->updateQty((int) $product_quantity, (int) $id_product, (int) $id_product_attribute); + $ppec->context->cart->update(); + } + + $login_user = PaypalLoginUser::getByIdCustomer((int) $ppec->context->customer->id); + + if ($login_user && $login_user->expires_in <= time()) { + $obj = new PayPalLogin(); + $login_user = $obj->getRefreshToken(); + } + + /* Set details for a payment */ + $ppec->setExpressCheckout(($login_user ? $login_user->access_token : false)); + + if (Tools::getValue('ajax') && $ppec->useInContextCheckout()) { + $ppec->displayPaypalInContextCheckout(); + } + if ($ppec->hasSucceedRequest() && !empty($ppec->token)) { + $ppec->redirectToAPI(); + } else { + // Display Error and die with this method + $ppec->displayPayPalAPIError($ppec->l('Error during the preparation of the Express Checkout payment'), $ppec->logs); + } + +} elseif (!empty($ppec->token) && ($ppec->token == $token) && ($ppec->payer_id = $payer_id)) { + + + //If a token exist with payer_id, then we are back from the PayPal API + /* Get payment infos from paypal */ + $ppec->getExpressCheckout(); + + if ($ppec->hasSucceedRequest() && !empty($ppec->token)) { + $address = $customer = null; + $email = $ppec->result['EMAIL']; + + /* Create Customer if not exist with address etc */ + if ($ppec->context->cookie->logged) { + $id_customer = Paypal::getPayPalCustomerIdByEmail($email); + if (!$id_customer) { + PayPal::addPayPalCustomer($ppec->context->customer->id, $email); + } + + $customer = $ppec->context->customer; + } elseif ($id_customer = Customer::customerExists($email, true)) { + $customer = new Customer($id_customer); + } else { + $customer = setCustomerInformation($ppec, $email); + $customer->add(); + + PayPal::addPayPalCustomer($customer->id, $email); + } + + if (!$customer->id) { + $ppec->logs[] = $ppec->l('Cannot create customer'); + } + + if (!isset($ppec->result['PAYMENTREQUEST_0_SHIPTOSTREET']) || !isset($ppec->result['PAYMENTREQUEST_0_SHIPTOCITY']) + || !isset($ppec->result['SHIPTOZIP']) || !isset($ppec->result['COUNTRYCODE'])) { + $ppec->redirectToCheckout($customer, ($ppec->type != 'payment_cart')); + } + + $addresses = $customer->getAddresses($ppec->context->language->id); + foreach ($addresses as $address) { + if ($address['alias'] == 'Paypal_Address') { + //If address has already been created + $address = new Address($address['id_address']); + break; + } + } + + /* Create address */ + if (is_array($address) && isset($address['id_address'])) { + $address = new Address($address['id_address']); + } + + if ((!$address || !$address->id) && $customer->id) { + //If address does not exists, we create it + $address = setCustomerAddress($ppec, $customer); + $address->add(); + } else if ($ppec->type != 'payment_cart') { + //We used Express Checkout Shortcut => we override address + $address = checkAndModifyAddress($ppec, $customer); + } + + if ($customer->id && !$address->id) { + $ppec->logs[] = $ppec->l('Cannot create Address'); + } + + /* Create Order */ + if ($customer->id && $address->id) { + if ($ppec->type != 'payment_cart') { + $ppec->context->cart->id_customer = $customer->id; + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $ppec->context->cart->id_address_delivery = $address->id; + $ppec->context->cart->id_address_invoice = $address->id; + } else { + $ppec->context->cart->updateAddressId($ppec->context->cart->id_address_delivery, $address->id); + $ppec->context->cart->updateAddressId($ppec->context->cart->id_address_invoice, $address->id); + } + + $ppec->context->cart->id_guest = $ppec->context->cookie->id_guest; + } + + if (!$ppec->context->cart->update()) { + $ppec->logs[] = $ppec->l('Cannot update existing cart'); + } else { + $payment_cart = (bool) ($ppec->type != 'payment_cart'); + $ppec->redirectToCheckout($customer, $payment_cart); + } + } + } +} +/** + * Check payment return + */ +function validateOrder($customer, $cart, $ppec) +{ + $amount_match = $ppec->rightPaymentProcess(); + // Payment succeed + if ($ppec->hasSucceedRequest() && !empty($ppec->token) && $amount_match) { + if ((bool) Configuration::get('PAYPAL_CAPTURE')) { + $payment_type = (int) Configuration::get('PS_OS_PAYPAL'); + $payment_status = 'Pending_capture'; + $message = $ppec->l('Pending payment capture.').'
'; + } else { + if (isset($ppec->result['PAYMENTINFO_0_PAYMENTSTATUS'])) { + $payment_status = $ppec->result['PAYMENTINFO_0_PAYMENTSTATUS']; + } else { + $payment_status = 'Error'; + } + + if ((strcasecmp($payment_status, 'Completed') === 0) || (strcasecmp($payment_status, 'Completed_Funds_Held') === 0)) { + $payment_type = (int) Configuration::get('PS_OS_PAYMENT'); + $message = $ppec->l('Payment accepted.').'
'; + } elseif (Tools::getValue('banktxnpendingurl') && Tools::getValue('banktxnpendingurl') == 'true') { + $payment_type = (int) Configuration::get('PS_OS_PAYPAL'); + $message = $ppec->l('eCheck').'
'; + } elseif (strcasecmp($payment_status, 'Pending') === 0) { + $payment_type = (int) Configuration::get('PS_OS_PAYPAL'); + $message = $ppec->l('Pending payment confirmation.').'
'; + } + } + } else { + // Payment error + //Check if error is 10486, if it is redirect user to paypal + if ($ppec->result['L_ERRORCODE0'] == 10486) { + $ppec->redirectToAPI(); + } + + $payment_status = isset($ppec->result['PAYMENTINFO_0_PAYMENTSTATUS']) ? $ppec->result['PAYMENTINFO_0_PAYMENTSTATUS'] : false; + $payment_type = (int) Configuration::get('PS_OS_ERROR'); + + if ($amount_match) { + $message = implode('
', $ppec->logs).'
'; + } else { + $message = $ppec->l('Price paid on paypal is not the same that on PrestaShop.').'
'; + } + + } + + $transaction = PayPalOrder::getTransactionDetails($ppec, $payment_status); + $ppec->context->cookie->id_cart = $cart->id; + + $ppec->validateOrder( + (int) $cart->id, + $payment_type, + $transaction['total_paid'], + $ppec->displayName, + $message, + $transaction, + (int) $cart->id_currency, + false, + $customer->secure_key, + $ppec->context->shop + ); +} +/* If Previous steps succeed, ready (means 'ready to pay') will be set to true */ +if ($ppec->ready && !empty($ppec->token) && (Tools::isSubmit('confirmation') || $ppec->type == 'payment_cart')) { + /* Check modification on the product cart / quantity */ + if ($ppec->isProductsListStillRight()) { + $cart = $ppec->context->cart; + $customer = new Customer((int) $cart->id_customer); + + // When all information are checked before, we can validate the payment to paypal + // and create the prestashop order + $ppec->doExpressCheckout(); + + if (isset($ppec->result['RedirectRequired']) && $ppec->result['RedirectRequired'] == 'true') { + $ppec->redirectToAPI(); + } + + validateOrder($customer, $cart, $ppec); + + unset($ppec->context->cookie->{PaypalExpressCheckout::$cookie_name}); + + if (!$ppec->currentOrder) { + $ppec->logs[] = $ppec->l('Cannot create order'); + } else { + $id_order = (int) $ppec->currentOrder; + $order = new Order($id_order); + } + + /* Check payment details to display the appropriate content */ + if (isset($order) && ($ppec->result['ACK'] != 'Failure')) { + $values = array( + 'key' => $customer->secure_key, + 'id_module' => (int) $ppec->id, + 'id_cart' => (int) $cart->id, + 'id_order' => (int) $ppec->currentOrder, + ); + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $query = http_build_query($values, '', '&'); + Tools::redirectLink(_MODULE_DIR_.$ppec->name.'/express_checkout/payment.php?'.$query); + } else { + $link = $ppec->context->link->getModuleLink('paypal', 'submit', $values); + Tools::redirect($link); + } + } elseif ($ppec->result['ACK'] != 'Failure') { + $ppec->context->smarty->assign(array( + 'logs' => $ppec->logs, + 'message' => $ppec->l('Error occurred:'), + )); + + $template = 'error.tpl'; + } + } else { + /* If Cart changed, no need to keep the paypal data */ + unset($ppec->context->cookie->{PaypalExpressCheckout::$cookie_name}); + $ppec->logs[] = $ppec->l('Cart changed since the last checkout express, please make a new Paypal checkout payment'); + } +} + +$display = (_PS_VERSION_ < '1.5') ? new BWDisplay() : new FrontController(); +$payment_confirmation = Tools::getValue('get_confirmation'); + +if ($ppec->ready && $payment_confirmation && (_PS_VERSION_ < '1.5')) { + $shop_domain = PayPal::getShopDomainSsl(true, true); + $form_action = $shop_domain._MODULE_DIR_.$ppec->name.'/express_checkout/payment.php'; + + $ppec->assignCartSummary(); + $ppec->context->smarty->assign(array( + 'form_action' => $form_action, + )); + + $template = 'order-summary.tpl'; +} else { + /* Display result if error occurred */ + if (!$ppec->context->cart->id) { + $ppec->context->cart->delete(); + $ppec->logs[] = $ppec->l('Your cart is empty.'); + } + $ppec->context->smarty->assign(array( + 'logs' => $ppec->logs, + 'message' => $ppec->l('Error occurred:'), + )); + + $template = 'error.tpl'; +} + +/** + * Detect if we are using mobile or not + * Check the 'ps_mobile_site' parameter. + */ +$ppec->context->smarty->assign('use_mobile', (bool) $ppec->useMobile()); + +$display->setTemplate(_PS_MODULE_DIR_.'paypal/views/templates/front/'.$template); +$display->run(); diff --git a/modules/paypal/express_checkout/process.php b/modules/paypal/express_checkout/process.php new file mode 100644 index 000000000..5dbc39515 --- /dev/null +++ b/modules/paypal/express_checkout/process.php @@ -0,0 +1,599 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once _PS_MODULE_DIR_.'paypal/paypal.php'; +include_once _PS_MODULE_DIR_.'paypal/api/paypal_lib.php'; + +class PaypalExpressCheckout extends Paypal +{ + public $logs = array(); + + public $method_version = '106'; + + public $method; + + /** @var currency Currency used for the payment process **/ + public $currency; + + /** @var decimals Used to set prices precision **/ + public $decimals; + + /** @var result Contains the last request result **/ + public $result; + + /** @var token Contains the last token **/ + public $token; + + /* Depending of the type set, id_cart or id_product will be set */ + public $id_cart; + + // Depending of the type set, id_cart or id_product will be set + public $id_product; + + public $id_p_attr; + + public $quantity; + + public $payer_id; + + public $available_type = array('cart', 'product', 'payment_cart'); + + public $total_different_product; + + public $product_list = array(); + + /* Used to know if user can validated his payment after shipping / address selection */ + public $ready = false; + + /* Take for now cart or product value */ + public $type = false; + + public static $cookie_name = 'express_checkout'; + + public $cookie_key = array( + 'token', 'id_product', 'id_p_attr', + 'quantity', 'type', 'total_different_product', + 'secure_key', 'ready', 'payer_id', + ); + + public function __construct($type = false) + { + parent::__construct(); + + // If type is sent, the cookie has to be delete + if ($type) { + unset($this->context->cookie->{self::$cookie_name}); + $this->setExpressCheckoutType($type); + } + + // Store back the PayPal data if present under the cookie + if (isset($this->context->cookie->{self::$cookie_name})) { + $paypal = unserialize($this->context->cookie->{self::$cookie_name}); + + foreach ($this->cookie_key as $key) { + $this->{$key} = $paypal[$key]; + } + } + + $this->currency = new Currency((int) $this->context->cart->id_currency); + + if (!Validate::isLoadedObject($this->currency)) { + $this->_errors[] = $this->l('Not a valid currency'); + } + + if (count($this->_errors)) { + return false; + } + + $currency_decimals = is_array($this->currency) ? (int) $this->currency['decimals'] : (int) $this->currency->decimals; + $this->decimals = $currency_decimals * _PS_PRICE_DISPLAY_PRECISION_; + } + + // Will build the product_list depending of the type + private function initParameters() + { + if (!$this->context->cart || !$this->context->cart->id) { + return false; + } + + $cart_currency = new Currency((int) $this->context->cart->id_currency); + $currency_module = $this->getCurrency((int) $this->context->cart->id_currency); + + if ($cart_currency !== $currency_module) { + $this->context->cart->id_currency = $currency_module->id; + $this->context->cart->update(); + } + + $this->context->currency = $currency_module; + $this->product_list = $this->context->cart->getProducts(true); + return (bool) count($this->product_list); + } + + public function setExpressCheckout($access_token = false) + { + $this->method = 'SetExpressCheckout'; + $fields = array(); + $this->setCancelUrl($fields); + + // Only this call need to get the value from the $_GET / $_POST array + if (!$this->initParameters(true) || !$fields['CANCELURL']) { + return false; + } + + // Set payment detail (reference) + $this->_setPaymentDetails($fields); + $fields['SOLUTIONTYPE'] = 'Sole'; + $fields['LANDINGPAGE'] = 'Login'; + + // Seller informations + $fields['USER'] = Configuration::get('PAYPAL_API_USER'); + $fields['PWD'] = Configuration::get('PAYPAL_API_PASSWORD'); + $fields['SIGNATURE'] = Configuration::get('PAYPAL_API_SIGNATURE'); + + if ($access_token) { + $fields['IDENTITYACCESSTOKEN'] = $access_token; + } + + if (Country::getIsoById(Configuration::get('PAYPAL_COUNTRY_DEFAULT')) == 'de') { + $fields['BANKTXNPENDINGURL'] = 'payment.php?banktxnpendingurl=true'; + } + + $this->callAPI($fields); + $this->_storeToken(); + } + + public function setCancelUrl(&$fields) + { + $url = urldecode(Tools::getValue('current_shop_url')); + $parsed_data = parse_url($url); + + $parsed_data['scheme'] .= '://'; + + if (isset($parsed_data['path'])) { + $parsed_data['path'] .= '?paypal_ec_canceled=1&'; + $parsed_data['query'] = isset($parsed_data['query']) ? $parsed_data['query'] : null; + } else { + $parsed_data['path'] = '?paypal_ec_canceled=1&'; + $parsed_data['query'] = '/'.(isset($parsed_data['query']) ? $parsed_data['query'] : null); + } + + $cancel_url = implode($parsed_data); + + if (!empty($cancel_url)) { + $fields['CANCELURL'] = $cancel_url; + } + } + + public function getExpressCheckout() + { + $this->method = 'GetExpressCheckoutDetails'; + $fields = array(); + $fields['TOKEN'] = $this->token; + + $this->initParameters(); + $this->callAPI($fields); + + // The same token of SetExpressCheckout + $this->_storeToken(); + } + + public function doExpressCheckout() + { + $this->method = 'DoExpressCheckoutPayment'; + $fields = array(); + $fields['TOKEN'] = $this->token; + $fields['PAYERID'] = $this->payer_id; + + if (Configuration::get('PAYPAL_COUNTRY_DEFAULT') == 1) { + $fields['BANKTXNPENDINGURL'] = ''; + } + + if (count($this->product_list) <= 0) { + $this->initParameters(); + } + + // Set payment detail (reference) + $this->_setPaymentDetails($fields); + + $this->callAPI($fields); + + $this->result += $fields; + } + + private function callAPI($fields) + { + $this->logs = array(); + $paypal_lib = new PaypalLib(); + + $this->result = $paypal_lib->makeCall($this->getAPIURL(), $this->getAPIScript(), $this->method, $fields, $this->method_version); + $this->logs = array_merge($this->logs, $paypal_lib->getLogs()); + + $this->_storeToken(); + } + + private function _setPaymentDetails(&$fields) + { + // Required field + $fields['RETURNURL'] = PayPal::getShopDomainSsl(true, true)._MODULE_DIR_.$this->name.'/express_checkout/payment.php'; + $fields['NOSHIPPING'] = '1'; + $fields['BUTTONSOURCE'] = $this->getTrackingCode((int) Configuration::get('PAYPAL_PAYMENT_METHOD')); + + // Products + $taxes = $total = 0; + $index = -1; + + // Set cart products list + $this->setProductsList($fields, $index, $total, $taxes); + $this->setDiscountsList($fields, $index, $total, $taxes); + $this->setGiftWrapping($fields, $index, $total); + + // Payment values + $this->setPaymentValues($fields, $index, $total, $taxes); + + $id_address = (int) $this->context->cart->id_address_delivery; + + if (($id_address == 0) && ($this->context->customer)) { + $id_address = Address::getFirstCustomerAddressId($this->context->customer->id); + } + + if ($id_address && method_exists($this->context->cart, 'isVirtualCart') && !$this->context->cart->isVirtualCart()) { + $this->setShippingAddress($fields, $id_address); + } else { + $fields['NOSHIPPING'] = '0'; + } + + foreach ($fields as &$field) { + if (is_numeric($field)) { + $field = str_replace(',', '.', $field); + } + } + } + + private function setShippingAddress(&$fields, $id_address) + { + $address = new Address($id_address); + + //We allow address modification when using express checkout shortcut + if ($this->type != 'payment_cart') { + $fields['ADDROVERRIDE'] = '0'; + $fields['NOSHIPPING'] = '0'; + } else { + $fields['ADDROVERRIDE'] = '1'; + } + + $fields['EMAIL'] = $this->context->customer->email; + $fields['PAYMENTREQUEST_0_SHIPTONAME'] = $address->firstname.' '.$address->lastname; + $fields['PAYMENTREQUEST_0_SHIPTOPHONENUM'] = (empty($address->phone)) ? $address->phone_mobile : $address->phone; + $fields['PAYMENTREQUEST_0_SHIPTOSTREET'] = $address->address1; + $fields['PAYMENTREQUEST_0_SHIPTOSTREET2'] = $address->address2; + $fields['PAYMENTREQUEST_0_SHIPTOCITY'] = $address->city; + + if ($address->id_state) { + $state = new State((int) $address->id_state); + $fields['PAYMENTREQUEST_0_SHIPTOSTATE'] = $state->iso_code; + } + + $country = new Country((int) $address->id_country); + $fields['PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE'] = $country->iso_code; + $fields['PAYMENTREQUEST_0_SHIPTOZIP'] = $address->postcode; + } + + private function setProductsList(&$fields, &$index, &$total) + { + // ojects needed to get advance paid amount + $objCustomerAdv = new HotelCustomerAdvancedPayment(); + $objAdvPayment = new HotelAdvancedPayment(); + $objCartBooking = new HotelCartBookingData(); + + foreach ($this->product_list as $product) { + $fields['L_PAYMENTREQUEST_0_NUMBER'.++$index] = (int) $product['id_product']; + + $fields['L_PAYMENTREQUEST_0_NAME'.$index] = $product['name']; + + if (isset($product['attributes']) && (empty($product['attributes']) === false)) { + $fields['L_PAYMENTREQUEST_0_NAME'.$index] .= ' - '.$product['attributes']; + } + + $fields['L_PAYMENTREQUEST_0_DESC'.$index] = Tools::substr(strip_tags($product['description_short']), 0, 50).'...'; + + // set advance product price if customer chhoses advance payment + if (Configuration::get('WK_ALLOW_ADVANCED_PAYMENT') + && $objCustomerAdv->getClientAdvPaymentDtl($this->context->cart->id, $this->context->cart->id_guest) + ) { + $product['price_wt'] = $objAdvPayment->getProductMinAdvPaymentAmountByIdCart( + $this->context->cart->id, + $product['id_product'] + ); + $product['quantity'] = 1; + } elseif ($productRoomTypes = $objCartBooking->getCartInfoIdCartIdProduct( + $this->context->cart->id, + $product['id_product'] + )) { + $product['price_wt'] = 0; + foreach ($productRoomTypes as $cartRoomInfo) { + if ($roomTotalPrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice( + $cartRoomInfo['id_product'], + $cartRoomInfo['date_from'], + $cartRoomInfo['date_to'] + )) { + $product['price_wt'] += $roomTotalPrice['total_price_tax_incl']; + $product['price'] += $roomTotalPrice['total_price_tax_excl']; + } + } + $product['quantity'] = 1; + } + $fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($product['price_wt'], $this->decimals); + $fields['L_PAYMENTREQUEST_0_QTY'.$index] = $product['quantity']; + + $total = $total + ($fields['L_PAYMENTREQUEST_0_AMT'.$index] * $product['quantity']); + } + } + + private function setDiscountsList(&$fields, &$index, &$total) + { + $discounts = (_PS_VERSION_ < '1.5') ? $this->context->cart->getDiscounts() : $this->context->cart->getCartRules(); + + if (count($discounts) > 0) { + foreach ($discounts as $discount) { + $fields['L_PAYMENTREQUEST_0_NUMBER'.++$index] = $discount['id_discount']; + + $fields['L_PAYMENTREQUEST_0_NAME'.$index] = $discount['name']; + if (isset($discount['description']) && !empty($discount['description'])) { + $fields['L_PAYMENTREQUEST_0_DESC'.$index] = Tools::substr(strip_tags($discount['description']), 0, 50).'...'; + } + + /* It is a discount so we store a negative value */ + $fields['L_PAYMENTREQUEST_0_AMT'.$index] = -1 * Tools::ps_round($discount['value_real'], $this->decimals); + $fields['L_PAYMENTREQUEST_0_QTY'.$index] = 1; + + $total = Tools::ps_round($total + $fields['L_PAYMENTREQUEST_0_AMT'.$index], $this->decimals); + } + } + } + + private function setGiftWrapping(&$fields, &$index, &$total) + { + if ($this->context->cart->gift == 1) { + $gift_wrapping_price = $this->getGiftWrappingPrice(); + + $fields['L_PAYMENTREQUEST_0_NAME'.++$index] = $this->l('Gift wrapping'); + + $fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($gift_wrapping_price, $this->decimals); + $fields['L_PAYMENTREQUEST_0_QTY'.$index] = 1; + + $total = Tools::ps_round($total + $gift_wrapping_price, $this->decimals); + } + } + + private function setPaymentValues(&$fields, &$index, &$total, &$taxes) + { + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $shipping_cost_wt = $this->context->cart->getOrderShippingCost(); + } else { + $shipping_cost_wt = $this->context->cart->getTotalShippingCost(); + } + + if ((bool) Configuration::get('PAYPAL_CAPTURE')) { + $fields['PAYMENTREQUEST_0_PAYMENTACTION'] = 'Authorization'; + } else { + $fields['PAYMENTREQUEST_0_PAYMENTACTION'] = 'Sale'; + } + + $currency = new Currency((int) $this->context->cart->id_currency); + $fields['PAYMENTREQUEST_0_CURRENCYCODE'] = $currency->iso_code; + + /** + * If the total amount is lower than 1 we put the shipping cost as an item + * so the payment could be valid. + */ + if ($total <= 1) { + $carrier = new Carrier($this->context->cart->id_carrier); + $fields['L_PAYMENTREQUEST_0_NUMBER'.++$index] = $carrier->id_reference; + $fields['L_PAYMENTREQUEST_0_NAME'.$index] = $carrier->name; + $fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($shipping_cost_wt, $this->decimals); + $fields['L_PAYMENTREQUEST_0_QTY'.$index] = 1; + + $fields['PAYMENTREQUEST_0_ITEMAMT'] = Tools::ps_round($total, $this->decimals) + Tools::ps_round($shipping_cost_wt, $this->decimals); + $fields['PAYMENTREQUEST_0_AMT'] = $total + Tools::ps_round($shipping_cost_wt, $this->decimals); + } else { + if ($currency->iso_code == 'HUF') { + $fields['PAYMENTREQUEST_0_SHIPPINGAMT'] = round($shipping_cost_wt); + $fields['PAYMENTREQUEST_0_ITEMAMT'] = Tools::ps_round($total, $this->decimals); + $fields['PAYMENTREQUEST_0_AMT'] = sprintf('%.2f', ($total + $fields['PAYMENTREQUEST_0_SHIPPINGAMT'])); + } else { + $fields['PAYMENTREQUEST_0_SHIPPINGAMT'] = sprintf('%.2f', $shipping_cost_wt); + $fields['PAYMENTREQUEST_0_ITEMAMT'] = Tools::ps_round($total, $this->decimals); + $fields['PAYMENTREQUEST_0_AMT'] = sprintf('%.2f', ($total + $fields['PAYMENTREQUEST_0_SHIPPINGAMT'])); + } + } + } + + public function rightPaymentProcess() + { + $total = $this->getTotalPaid(); + + // float problem with php, have to use the string cast. + if ((isset($this->result['AMT']) && ((string) $this->result['AMT'] != (string) $total)) || + (isset($this->result['PAYMENTINFO_0_AMT']) && ((string) $this->result['PAYMENTINFO_0_AMT'] != (string) $total))) { + return false; + } + + return true; + } + + /** + * @return mixed + */ + public function getTotalPaid() + { + $total = 0.00; + + foreach ($this->product_list as $product) { + $price = Tools::ps_round($product['price_wt'], $this->decimals); + $quantity = Tools::ps_round($product['quantity'], $this->decimals); + $total = Tools::ps_round($total + ($price * $quantity), $this->decimals); + } + + if ($this->context->cart->gift == 1) { + $total = Tools::ps_round($total + $this->getGiftWrappingPrice(), $this->decimals); + } + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $discounts = $this->context->cart->getDiscounts(); + $shipping_cost = $this->context->cart->getOrderShippingCost(); + } else { + $discounts = $this->context->cart->getCartRules(); + $shipping_cost = $this->context->cart->getTotalShippingCost(); + } + + if (count($discounts) > 0) { + foreach ($discounts as $product) { + $price = -1 * Tools::ps_round($product['value_real'], $this->decimals); + $total = Tools::ps_round($total + $price, $this->decimals); + } + } + + return Tools::ps_round($shipping_cost, $this->decimals) + $total; + } + + private function _storeToken() + { + if (is_array($this->result) && isset($this->result['TOKEN'])) { + $this->token = (string) $this->result['TOKEN']; + } + } + + // Store data for the next reloading page + private function _storeCookieInfo() + { + $tab = array(); + + foreach ($this->cookie_key as $key) { + $tab[$key] = $this->{$key}; + } + + $this->context->cookie->{self::$cookie_name} = serialize($tab); + } + + public function displayPaypalInContextCheckout() + { + $this->secure_key = $this->getSecureKey(); + $this->_storeCookieInfo(); + echo $this->token; + die; + } + + public function hasSucceedRequest() + { + if (is_array($this->result)) { + foreach (array('ACK', 'PAYMENTINFO_0_ACK') as $key) { + if (isset($this->result[$key]) && Tools::strtoupper($this->result[$key]) == 'SUCCESS') { + return true; + } + } + } + + return false; + } + + private function getSecureKey() + { + if (!count($this->product_list)) { + $this->initParameters(); + } + + $key = array(); + + foreach ($this->product_list as $product) { + $id_product = $product['id_product']; + $id_product_attribute = $product['id_product_attribute']; + $quantity = $product['quantity']; + + $key[] = $id_product.$id_product_attribute.$quantity._COOKIE_KEY_; + } + + return md5(serialize($key)); + } + + public function isProductsListStillRight() + { + return $this->secure_key == $this->getSecureKey(); + } + + public function setExpressCheckoutType($type) + { + if (in_array($type, $this->available_type)) { + $this->type = $type; + return true; + } + return false; + } + + public function redirectToAPI() + { + $this->secure_key = $this->getSecureKey(); + $this->_storeCookieInfo(); + + if ($this->useMobile()) { + $url = '/cgi-bin/webscr?cmd=_express-checkout-mobile'; + } else { + $url = '/websc&cmd=_express-checkout'; + } + + if (($this->method == 'SetExpressCheckout') && (Configuration::get('PAYPAL_COUNTRY_DEFAULT') == 1) && ($this->type == 'payment_cart')) { + $url .= '&useraction=commit'; + } + + Tools::redirectLink('https://'.$this->getPayPalURL().$url.'&token='.urldecode($this->token)); + exit(0); + } + + public function redirectToCheckout($customer, $redirect = false) + { + $this->ready = true; + $this->_storeCookieInfo(); + + $this->context->cookie->id_customer = (int) $customer->id; + $this->context->cookie->customer_lastname = $customer->lastname; + $this->context->cookie->customer_firstname = $customer->firstname; + $this->context->cookie->passwd = $customer->passwd; + $this->context->cookie->email = $customer->email; + $this->context->cookie->is_guest = $customer->isGuest(); + $this->context->cookie->logged = 1; + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + Module::hookExec('authentication'); + } else { + Hook::exec('authentication'); + } + + if ($redirect) { + $link = $this->context->link->getPageLink('order.php', false, null, array('step' => '1')); + Tools::redirectLink($link); + exit(0); + } + } +} diff --git a/modules/paypal/express_checkout/submit.php b/modules/paypal/express_checkout/submit.php new file mode 100644 index 000000000..4ae45bc4a --- /dev/null +++ b/modules/paypal/express_checkout/submit.php @@ -0,0 +1,99 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once dirname(__FILE__).'/../../../config/config.inc.php'; +include_once _PS_ROOT_DIR_.'/init.php'; + +if (version_compare(_PS_VERSION_, '1.5', '<')) { + require_once _PS_ROOT_DIR_.'/controllers/OrderConfirmationController.php'; +} + +/** + * 1.4 Retro-compatibility class + */ +class PayPalExpressCheckoutSubmit extends OrderConfirmationControllerCore +{ + public function __construct() + { + $this->paypal = new PayPal(); + $this->context = $this->paypal->context; + + parent::__construct(); + + $this->run(); + } + + public function displayContent() + { + $id_order = (int) Tools::getValue('id_order'); + + $order = new Order($id_order); + $paypal_order = PayPalOrder::getOrderById($id_order); + + $price = Tools::displayPrice($paypal_order['total_paid'], $this->context->currency); + + $order_state = new OrderState($id_order); + + if ($order_state) { + $order_state_message = $order_state->template[$this->context->language->id]; + } + + if (!$order || !$order_state || (isset($order_state_message) && ($order_state_message == 'payment_error'))) { + $this->context->smarty->assign( + array( + 'logs' => array($this->paypal->l('An error occurred while processing payment.')), + 'order' => $paypal_order, + 'price' => $price, + ) + ); + + if (isset($order_state_message) && $order_state_message) { + $this->context->smarty->assign('message', $order_state_message); + } + + $template = 'error.tpl'; + } else { + $this->context->smarty->assign( + array( + 'order' => $paypal_order, + 'price' => $price, + ) + ); + + if (version_compare(_PS_VERSION_, '1.5', '>')) { + + $this->context->smarty->assign(array( + 'reference_order' => Order::getUniqReferenceOf($paypal_order['id_order']), + )); + } + + $template = 'order-confirmation.tpl'; + } + + $this->context->smarty->assign('use_mobile', (bool) $this->paypal->useMobile()); + echo $this->paypal->fetchTemplate($template); + } +} diff --git a/modules/paypal/fr.php b/modules/paypal/fr.php new file mode 100644 index 000000000..aba02db27 --- /dev/null +++ b/modules/paypal/fr.php @@ -0,0 +1,352 @@ +ipn_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Le prix payé sur PayPal n\'est le même que sur PrestaShop'; +$_MODULE['<{paypal}prestashop>ipn_572f9af7615560af2cba038cc1948287'] = 'Le panier a été modifié, merci de réessayer'; +$_MODULE['<{paypal}prestashop>ipn_ada2b5d5bbf3065de283d61526141780'] = 'En attente de capture'; +$_MODULE['<{paypal}prestashop>ipn_36ec50c0e914dd2fb48a1b27540512ce'] = 'Paiement accepté'; +$_MODULE['<{paypal}prestashop>ipn_c8a31175ee6991be6a0d7a6d32ca4268'] = 'En attente de confirmation de paiement'; +$_MODULE['<{paypal}prestashop>paypal_50ec53203f5ee4849b7d326bcbf413e5'] = 'Développez votre activité avec PayPal et bénéficiez d’une solution clé en main pour votre activité en ligne, sur mobile et à l’international et découvrez une nouvelle expérience de paiement avec Braintree. Acceptez de nombreuses méthodes de paiements via PayPal et Braintree'; +$_MODULE['<{paypal}prestashop>paypal_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Acceptez le paiements par cartes de crédits (CB, Visa, MasterCard, Amex, Aurore, Cofinoga, 4 stars) avec PayPal.'; +$_MODULE['<{paypal}prestashop>paypal_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Êtes-vous certain de vouloir supprimer vos informations ?'; +$_MODULE['<{paypal}prestashop>paypal_8b57f95f1e9cf09dc028fa5a671781ff'] = 'Toutes les fonctionnalités du module PayPal API sont incluses dans le nouveau module PayPal. Avant tout, pour ne pas rencontrer de conflits, veuillez ne pas utiliser ou supprimer le module PayPal API.'; +$_MODULE['<{paypal}prestashop>paypal_c91f1fb5e06286c3e0a33fc552dffbea'] = 'Vous devez renseigner vos identifiants PayPal Integral pour que votre thème mobile fonctionne correctement.'; +$_MODULE['<{paypal}prestashop>paypal_bd6b3cca1e559117a964cdfab6a977cf'] = 'Le thème mobile fonctionne seulement avec la solution de paiement mobile PayPal. Veuillez activer le module pour bénéficier de possibilités de paiements.'; +$_MODULE['<{paypal}prestashop>paypal_c9d8a8d3c76c69e9a5ba6387acb8655a'] = 'Avant d\'utiliser le module vous devez installer le module \"\"Rétro-compatibilité\"\".\"\"'; +$_MODULE['<{paypal}prestashop>paypal_ea5eb3f904bf42377277255cbd0e2251'] = 'Pour fonctionner correctement le module \"\"Rétro-compatibilité\"\" doit être activé.\"\"'; +$_MODULE['<{paypal}prestashop>paypal_48878e69ef59b9e9d2d9a8c18e4de520'] = 'Pour fonctionner correctement ce module requiert le module \"\"Rétro-compatibilité\"\" v\"\"'; +$_MODULE['<{paypal}prestashop>paypal_98aba438b26738216a5674199a9a4159'] = 'Votre serveur n\'est pas compatible avec la prochaine version du module paypal. Merci de vous rapprocher de votre hébergeur pour mettre la version 5.4 de PHP au minimum.'; +$_MODULE['<{paypal}prestashop>paypal_3561ead2eb61bae51846055b28d11bb7'] = 'Votre compte Braintree est maintenant configuré en mode sandbox. Uniquement l\'Euro est utilisé. Si vous rencontrez un problème, contactez-nous au 08 05 54 27 14.'; +$_MODULE['<{paypal}prestashop>paypal_e3b6254241629c649ac441fb85ecf695'] = 'Votre compte Braintree est maintenant configuré en mode production. Si vous rencontrez un problème, contactez-nous au 08 05 54 27 14.'; +$_MODULE['<{paypal}prestashop>paypal_7c52f2d084c19bb0511be6eba8f7387c'] = 'Braintree n\'est pas configuré. Si vous rencontrez un problème, contactez-nous au 08 05 54 27 14.'; +$_MODULE['<{paypal}prestashop>paypal_9b88c95a15e018c3f8038a7d0160145c'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_a93d958df2932f0740ef598317304fab'] = 'PayPal, Carte de débit, Carte de crédit, Facture'; +$_MODULE['<{paypal}prestashop>paypal_20fda49ece75d93bea97648ab1f1f1cf'] = 'Annulation des produits :'; +$_MODULE['<{paypal}prestashop>paypal_90ab0cfd410722553c79e614207a789a'] = 'Certains champs sont vides.'; +$_MODULE['<{paypal}prestashop>paypal_ce0e2b401002ca796d2e8aca7deb8f00'] = 'Les champs des identifiants ne peuvent être vides'; +$_MODULE['<{paypal}prestashop>paypal_3f7145179c909f0e87a911a3171986b6'] = 'Le champs E-mail professionnel ne peut être vide'; +$_MODULE['<{paypal}prestashop>paypal_9a72316572c496c86845144ebf360d8c'] = 'Le champ %s du compte Braintree ne peut pas être vide'; +$_MODULE['<{paypal}prestashop>paypal_11e9dc1c1ac9c799e68d3eae4123dfd8'] = 'Vous avez activé le mode test, veuillez reconfigurer votre module.'; +$_MODULE['<{paypal}prestashop>paypal_45cfef5aff92533727d5e9a6e59d25f9'] = 'Vous avez basculé de la sandbox vers l\'environnement de production. Veuillez reconfigurer vos produits.'; +$_MODULE['<{paypal}prestashop>paypal_e5d5d9f40763cfe6549bef705e3529a7'] = 'Le message de paiement n\'est pas valide, veuillez vérifier votre module'; +$_MODULE['<{paypal}prestashop>paypal_ee9dc1e678d54c517f481583c3fb2db8'] = 'Devise invalide'; +$_MODULE['<{paypal}prestashop>paypal_eec39bf42bd135971fb2d838c67d1449'] = 'Opération de remboursement :'; +$_MODULE['<{paypal}prestashop>paypal_4fd060ce6ff88adac7b6112a5bf1283c'] = 'Remboursement Braintree confirmé !'; +$_MODULE['<{paypal}prestashop>paypal_2ab62d1a578713d0862b56819295630e'] = 'Remboursement PayPal confirmé !'; +$_MODULE['<{paypal}prestashop>paypal_a64db959966ba8d07c8b5d9493fcc21f'] = 'Erreur de transaction !'; +$_MODULE['<{paypal}prestashop>paypal_c5e5dfcc54400e4018e03590067f6ba4'] = 'L\'autorisation de la transaction bancaire a expiré. Pour plus d\'informations, veuillez vous référer aux cas d\'expiration.'; +$_MODULE['<{paypal}prestashop>paypal_8778ee03f6592d5fec9a1f2ee851e476'] = 'Commande terminée avec PayPal !'; +$_MODULE['<{paypal}prestashop>paypal_67962779da962e3d4225055afc05e7bd'] = 'Résultat de la capture :'; +$_MODULE['<{paypal}prestashop>paypal_672d40feac6437e49f771019bc330790'] = 'Statu de la vérification :'; +$_MODULE['<{paypal}prestashop>paypal_1828820cc60e36b6f9fdf60cab103ed7'] = 'Vous utilisez actuellement l\'adresse PayPal par défaut, veuillez entrer votre propre adresse.'; +$_MODULE['<{paypal}prestashop>paypal_11582f323e3cac72252135e07b353c1c'] = 'Merci d\'activer cURL (extension PHP) afin d\'utiliser le module'; +$_MODULE['<{paypal}prestashop>paypal_984482eb9ff11e6310fef641d2268a2a'] = 'Banque'; +$_MODULE['<{paypal}prestashop>paypal_6efcd68714a32084673e2c866291e3ae'] = 'Nom du titulaire du compte'; +$_MODULE['<{paypal}prestashop>paypal_350e17d65ded375d643259e7eed26e2a'] = 'IBAN'; +$_MODULE['<{paypal}prestashop>paypal_bec758a8de99a38d16087f2196b48103'] = 'BIC'; +$_MODULE['<{paypal}prestashop>paypal_94f34a1bf4a7ce662b73f1893dcf9c30'] = 'Montant / devise'; +$_MODULE['<{paypal}prestashop>paypal_8954ee128da85cc61168898695ea0a3b'] = 'Date limite de paiement'; +$_MODULE['<{paypal}prestashop>paypal_b8af13ea9c8fe890c9979a1fa8dbde22'] = 'Reference'; +$_MODULE['<{paypal}prestashop>paypal_connect_d1f14cc4a2dade80c92421d26422fea0'] = 'Ouvre une nouvelle connection vers'; +$_MODULE['<{paypal}prestashop>paypal_connect_94a27811a721ef512ad7bfa06cab34e0'] = 'Echec de la connection avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_70215486455daee13382c68b1a230b82'] = 'Connection réussie avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_e4c4ad49bced42265b5facc2175cdafd'] = 'Envoie des paramètres :'; +$_MODULE['<{paypal}prestashop>paypal_connect_445583f6641da98fc7ac8fd9d13a564b'] = 'Echec de l\'envoie avec la méthode cURL ! Erreur :'; +$_MODULE['<{paypal}prestashop>paypal_connect_ef4fbf36eaa2083442d386990ba063c2'] = 'Envoie réussi avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_bf059c9751bb1a20b449b7917b1df374'] = 'Echec de la connection avec la méthode fsockopen'; +$_MODULE['<{paypal}prestashop>paypal_connect_6e9aa4cb541e09b07602d4ea96080811'] = 'Echec de l\'envoie avec la méthode fsockopen ! Erreur :'; +$_MODULE['<{paypal}prestashop>paypal_connect_842a183be225d415b2b4375ba1dd1c94'] = 'Envoie réussi avec la méthode fsockopen'; +$_MODULE['<{paypal}prestashop>paypal_lib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'Réponse PayPal :'; +$_MODULE['<{paypal}prestashop>tlsverificator_94a27811a721ef512ad7bfa06cab34e0'] = 'Connection échouée avec la méthode CURL'; +$_MODULE['<{paypal}prestashop>tlsverificator_70215486455daee13382c68b1a230b82'] = 'CURL correctement configuré'; +$_MODULE['<{paypal}prestashop>tlsverificator_e4c4ad49bced42265b5facc2175cdafd'] = 'Envoi des paramètres :'; +$_MODULE['<{paypal}prestashop>tlsverificator_445583f6641da98fc7ac8fd9d13a564b'] = 'Echec de l\'envoi avec CURL. Erreur :'; +$_MODULE['<{paypal}prestashop>tlsverificator_ef4fbf36eaa2083442d386990ba063c2'] = 'Méthode CURL envoyé avec succès'; +$_MODULE['<{paypal}prestashop>braintreesubmit_a12a70a7be569c899ca4e9e28f1d2ab5'] = 'Erreur de chargement du panier'; +$_MODULE['<{paypal}prestashop>braintreesubmit_36ec50c0e914dd2fb48a1b27540512ce'] = 'Paiement accepté'; +$_MODULE['<{paypal}prestashop>braintreesubmit_4e5099da51c1331b25c0f616b368fdce'] = 'La carte utilisée a probablement été signalée par votre banque comme perdue, volée ou suspectée de fraude.'; +$_MODULE['<{paypal}prestashop>braintreesubmit_f64e1d2eb604ff0b93770700f58cfe73'] = 'Une erreur s\'est produite lors de l\'envoi de la transaction.'; +$_MODULE['<{paypal}prestashop>braintreesubmit_49d3178483237b5f626ae169f7ce8ff2'] = 'L\'autorisation de votre opération bancaire a expiré.'; +$_MODULE['<{paypal}prestashop>braintreesubmit_ca6afa99bf6d441a20a8e491c97d8777'] = 'Votre transaction a été rejetée pour des raisons de sécurité.'; +$_MODULE['<{paypal}prestashop>braintreesubmit_04cac0e052f0b2a7f21a9a3c6cd936c5'] = 'Votre transaction n\'est pas valide :'; +$_MODULE['<{paypal}prestashop>submit_67a3fcdb7708219b9d5d6269ad8c4a86'] = 'Une erreur s\'est produite lors de l\'envoi de la transaction.'; +$_MODULE['<{paypal}prestashop>submitplus_2aca594991b613a9cff3818024bb0911'] = 'Une erreur est survenue pendant le processus de paiement.'; +$_MODULE['<{paypal}prestashop>submitplus_795199051a09267451a5896d157e9490'] = 'Votre paiement a été pris en compte'; +$_MODULE['<{paypal}prestashop>submitplus_2758fccb8c7506009717e9834717c238'] = 'Votre commande a été annulée'; +$_MODULE['<{paypal}prestashop>payment_d141a42a5e72c871a3116414bb5c64c1'] = 'Création du nouveau panier impossible'; +$_MODULE['<{paypal}prestashop>payment_5b5adcef5e3f2e5e1b6f60eb3e7e41ed'] = 'Une erreur est survenue :'; +$_MODULE['<{paypal}prestashop>payment_dca16503c563d9fdec70d18f2ab653a4'] = 'Erreur lors de la préparation du paiement par Express Checkout'; +$_MODULE['<{paypal}prestashop>payment_51da74120dd5e11817ef21e27d2599bc'] = 'Impossible de créer un nouvel utilisateur'; +$_MODULE['<{paypal}prestashop>payment_bcf08b34ab427cb871635151c6976eb0'] = 'Impossible de créer la nouvelle adresse'; +$_MODULE['<{paypal}prestashop>payment_ca5cecfc8fd8e585ba1e684757168158'] = 'Impossible de mettre à jour le panier'; +$_MODULE['<{paypal}prestashop>payment_ada2b5d5bbf3065de283d61526141780'] = 'En attente de capture du paiement.'; +$_MODULE['<{paypal}prestashop>payment_36ec50c0e914dd2fb48a1b27540512ce'] = 'Paiement accepté.'; +$_MODULE['<{paypal}prestashop>payment_719073527bcc898d5e7cc63fd6d16ce4'] = 'eCheck'; +$_MODULE['<{paypal}prestashop>payment_c8a31175ee6991be6a0d7a6d32ca4268'] = 'Paiement en attente de confirmation.'; +$_MODULE['<{paypal}prestashop>payment_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Le prix payé sur PayPal est différent du prix renseigné sur la boutique.'; +$_MODULE['<{paypal}prestashop>payment_98825385aadb1d0dd0fd133ef8acd23d'] = 'Impossible de créer la commande'; +$_MODULE['<{paypal}prestashop>payment_085b78e060c3ef4cc37bd25abd06ff66'] = 'Le panier a changé depuis la dernière tentative de paiement. Veuillez recommencer le processus de paiement s\'il vous plait.'; +$_MODULE['<{paypal}prestashop>payment_572da7ef1411f2a12409e752f3eb2f7a'] = 'Votre panier et vide.'; +$_MODULE['<{paypal}prestashop>process_ee9dc1e678d54c517f481583c3fb2db8'] = 'Devise invalide.'; +$_MODULE['<{paypal}prestashop>process_484f5a79672cebe198ebdde45a1d672f'] = 'Emballage cadeau.'; +$_MODULE['<{paypal}prestashop>notifier_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Le prix payé sur PayPal est différent du prix renseigné sur la boutique.'; +$_MODULE['<{paypal}prestashop>notifier_572f9af7615560af2cba038cc1948287'] = 'Panier mis à jour, merci de ré-essayer.'; +$_MODULE['<{paypal}prestashop>notifier_36ec50c0e914dd2fb48a1b27540512ce'] = 'Paiement accepté.'; +$_MODULE['<{paypal}prestashop>submit_795199051a09267451a5896d157e9490'] = 'Votre paiement a été pris en compte'; +$_MODULE['<{paypal}prestashop>submit_2aca594991b613a9cff3818024bb0911'] = 'Une erreur est survenue pendant paiement.'; +$_MODULE['<{paypal}prestashop>submit_2758fccb8c7506009717e9834717c238'] = 'Votre commande a été annulée'; +$_MODULE['<{paypal}prestashop>back_office_d596ba73f24775101da736d526c2a295'] = 'Leader en'; +$_MODULE['<{paypal}prestashop>back_office_1271028061aa0c0b68441949c78007a2'] = 'paiements en ligne'; +$_MODULE['<{paypal}prestashop>back_office_e03365ca8f60ac963c10adf77ad89623'] = 'Paiements rapides, faciles et sécurisés.'; +$_MODULE['<{paypal}prestashop>back_office_e9f91995a69772872f7a386c6909403d'] = 'Touchez plus de clients'; +$_MODULE['<{paypal}prestashop>back_office_bbf54c5f55856a290f0deae540368071'] = 'Plus de 100 millions de comptes actifs à travers le monde'; +$_MODULE['<{paypal}prestashop>back_office_ad78c46c5d6edc542ad2153e23518478'] = 'Acceptez les paiements à l\'international'; +$_MODULE['<{paypal}prestashop>back_office_2b91c701cecf505dc5af4e35d7067f1f'] = '190 pays, 25 devises'; +$_MODULE['<{paypal}prestashop>back_office_3a73e92a81de06fba19ab722bd500675'] = 'Rassurez vos clients'; +$_MODULE['<{paypal}prestashop>back_office_aa2c2878f81beff707ddef76776a92fd'] = 'Les acheteurs n\'ont pas besoin de partager leurs données personnelles'; +$_MODULE['<{paypal}prestashop>back_office_421fe69f8b38a3c361835747e6215227'] = 'Acceptez les principaux moyens de paiements'; +$_MODULE['<{paypal}prestashop>back_office_fa089c4e68a80073a4548d133d7d526d'] = 'Votre configuration utilise la version 1.2 du protocole TLS'; +$_MODULE['<{paypal}prestashop>back_office_81ae10a9b4abcbbf4d007826fe1d8102'] = 'https://www.paypal-knowledge.com/infocenter/index?page=content&widgetview=true&id=FAQ1914&viewlocale=fr_FR'; +$_MODULE['<{paypal}prestashop>back_office_432cfbdc035243b5a1ef9f95c3cf807f'] = 'Cliquez ici pour en savoir plus'; +$_MODULE['<{paypal}prestashop>back_office_071c77a3ce64ef511e953b5edd4f0207'] = 'Votre configuration utilise la version 1.0 pour communiquer avec PayPal. À partir de juillet, tous les paiements seront bloqués. Merci de vous rapprocher de votre société d\'hébergement pour activer la version TLS 1.2'; +$_MODULE['<{paypal}prestashop>back_office_58093ce268e5d8ef98782b86452de4c3'] = 'Vérifiez votre version TLS'; +$_MODULE['<{paypal}prestashop>back_office_ae3cebe661e92cdfd12516419fef4f2d'] = 'Télécharger le'; +$_MODULE['<{paypal}prestashop>back_office_e73756d0d2306110f29ccf28cb69c412'] = 'Guide d\'intégration de PayPal'; +$_MODULE['<{paypal}prestashop>back_office_6506302a6e11077ecbc04b5932a65c4c'] = 'sur PrestaShop et suivez les étapes pas à pas'; +$_MODULE['<{paypal}prestashop>back_office_516710946f5fb35af6496ad0b7582980'] = 'Commencer avec PayPal ne prend que 5 minutes'; +$_MODULE['<{paypal}prestashop>back_office_56564e0a106b0e0e2dc57b5a105ed639'] = 'Votre pays'; +$_MODULE['<{paypal}prestashop>back_office_eb399bcaca686f8609137153307eecf1'] = 'change'; +$_MODULE['<{paypal}prestashop>back_office_a7bb58222222b064f0721e6e0fe4c486'] = 'Selectionner votre pays'; +$_MODULE['<{paypal}prestashop>back_office_93140d7ca5171ede9b8a94f07f0363ec'] = 'Vous possédez déjà un compte PayPal Professionnel'; +$_MODULE['<{paypal}prestashop>back_office_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Non'; +$_MODULE['<{paypal}prestashop>back_office_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{paypal}prestashop>back_office_73878c19cdc6ef2ab0d0fac6943cc958'] = 'Besoin d\'aide?'; +$_MODULE['<{paypal}prestashop>back_office_02d4482d332e1aef3437cd61c9bcc624'] = 'Contactez nous'; +$_MODULE['<{paypal}prestashop>back_office_240fdce652f09de611fc997971dea41e'] = 'Choisissez votre solution'; +$_MODULE['<{paypal}prestashop>back_office_1cffab4d640162187298937736df1fec'] = 'https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=1'; +$_MODULE['<{paypal}prestashop>back_office_d59048f21fd887ad520398ce677be586'] = 'En savoir plus'; +$_MODULE['<{paypal}prestashop>back_office_cd5ee0ac6f3296c551e631268af2915b'] = 'Besoin de PayPal pour accepter tous les paiements par carte ?'; +$_MODULE['<{paypal}prestashop>back_office_961f2247a2070bedff9f9cd8d64e2650'] = 'Choisissez'; +$_MODULE['<{paypal}prestashop>back_office_d30abcb258277c6028d040b073276da1'] = 'PayPal Intégral'; +$_MODULE['<{paypal}prestashop>back_office_4d647b4406dba3d579ac2ef165c05196'] = 'Acceptez immédiatement les principaux moyens de paiements du web'; +$_MODULE['<{paypal}prestashop>back_office_e331bc26b25860e255aac1225fc5c639'] = 'Pas de frais fixe ni d\'engagement de durée. Payez seulement à la réception des paiements'; +$_MODULE['<{paypal}prestashop>back_office_d5e2ec9a0a842a49d3258d6e355d3b55'] = 'PayPal Intégral Evolution'; +$_MODULE['<{paypal}prestashop>back_office_366520e0e4a3ce5469c0ed737ae032ef'] = 'Une plateforme de paiement complète, une protection des paiements en plus . Ayez la possibilité de personnaliser votre page de paiement'; +$_MODULE['<{paypal}prestashop>back_office_3014bd9d081fc92e6ab6bb7e91336749'] = 'Abonnement mensuel de 25€.'; +$_MODULE['<{paypal}prestashop>back_office_b9b242f30b7f3cf333e57f359ca3c9bc'] = 'PayPal Integral Evolution est soumis à conditions et le traitement de votre inscription peut prendre 3 à 5 jours ouvrés. Merci de ne cliquer sur le bouton \"\"Sauvegardez\"\" en bas de la page qu\'une fois votre inscription validée par PayPal.\"\"'; +$_MODULE['<{paypal}prestashop>back_office_53f61475efdd0c433443262f0d7cdcbf'] = 'PayPal Plus'; +$_MODULE['<{paypal}prestashop>back_office_69d7974bb0bacddb986bbf8d734238c4'] = 'Besoin d\'ajouter le bouton PayPal en tant que moyen de paiement supplémentaire ?'; +$_MODULE['<{paypal}prestashop>back_office_2e3e721e530a957f81d5b5dcff0bf0e1'] = 'PayPal Option +'; +$_MODULE['<{paypal}prestashop>back_office_cc84ef735c1a521fe731773a700a87ec'] = 'Ajoutez PayPal Option + peut générer 20 à 30 % de ventes additionnelles'; +$_MODULE['<{paypal}prestashop>back_office_7456b11991d56ba85ddbce1ee4bc9ea2'] = 'Vous souhaitez utiliser Braintree afin d\'offrir la possibilité à vos clients de payer par carte bancaire ?'; +$_MODULE['<{paypal}prestashop>back_office_6fce72640023539190a1b0d832079280'] = 'https://www.braintreepayments.com/'; +$_MODULE['<{paypal}prestashop>back_office_66a8e4c669a3afe22072141bd20a8e8f'] = 'Vous ne pouvez pas utiliser braintree parce que votre version PHP est trop ancienne (PHP 5.4 min)'; +$_MODULE['<{paypal}prestashop>back_office_87e8014ca4e3b9c66834e626c72caeb9'] = 'Vous ne pouvez pas utiliser braintree car vous n\'avez pas activé https'; +$_MODULE['<{paypal}prestashop>back_office_01d5f6aa1996398fc309837e6d7058c7'] = '(Euro uniquement)'; +$_MODULE['<{paypal}prestashop>back_office_da56bd27822c4be66ceefd6feab0de0c'] = 'Braintree'; +$_MODULE['<{paypal}prestashop>back_office_e8c466b9c179e229ae67f339a8e2476a'] = 'Souscrivez ou ouvrez un compte PayPal Professionnel'; +$_MODULE['<{paypal}prestashop>back_office_0e96222f0238ebd077c0e983e91ab4ee'] = 'S\'inscrire'; +$_MODULE['<{paypal}prestashop>back_office_d67850bd126f070221dcfd5fa6317043'] = 'S\'inscrire'; +$_MODULE['<{paypal}prestashop>back_office_cf64055b9b156287d8791c48c6ea3e13'] = 'https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=4'; +$_MODULE['<{paypal}prestashop>back_office_b26917587d98330d93f87808fc9d7267'] = 'Souscrivez'; +$_MODULE['<{paypal}prestashop>back_office_109a4d46d869464f431abe4cf7228c24'] = 'https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=3'; +$_MODULE['<{paypal}prestashop>back_office_5c57ba1861701e5a630dd5006acb30e2'] = 'Une fois votre compte créé, revenez sur cette page pour compléter l\'étape 3'; +$_MODULE['<{paypal}prestashop>back_office_ff7e05b87636d641663fb2f590d9f2bd'] = 'PayPal Integral Evolution est soumis à conditions et la validation de votre inscription peut prendre 3 à 5 jours ouvrés. Veuillez ne cliquer sur le bouton \"Sauvegardez\" en bas de la page qu\'une fois votre inscription validée par PayPal'; +$_MODULE['<{paypal}prestashop>back_office_78ba94e61abed0cbb6349b37ec9ed59e'] = 'Si votre souscription à PayPal Intégral Evolution a déjà été validée par PayPal, merci d\'aller directement à l\'étape 3'; +$_MODULE['<{paypal}prestashop>back_office_5b0e8271bd4b23a6bd7a7f49725ed926'] = 'Effectuez un paiement sur votre boutique en ligne'; +$_MODULE['<{paypal}prestashop>back_office_b4e69ef9df8f20b984309ee73f78953b'] = 'Communiquez vos informations d\'identification PayPal à PrestaShop'; +$_MODULE['<{paypal}prestashop>back_office_2ffe0ef69fd047d0884f98faa52c1bd3'] = 'Obtenir mes informations d\'identification PayPal'; +$_MODULE['<{paypal}prestashop>back_office_36461ebc9ebcd269f3909fa49a4b0a57'] = 'Après avoir cliqué sur le bouton, \"Obtenir mes informations d\'identification PayPal\" entrez vos identifiant et mot de passe PayPal dans la fenêtre qui s\'affichera, copier les informations fournies par PayPal et collez les dans les champs ci-dessous'; +$_MODULE['<{paypal}prestashop>back_office_266ba5df48aed68af0cce5f735035291'] = 'Identifiant API'; +$_MODULE['<{paypal}prestashop>back_office_37e31370e4ab230ff6fba12cc6390aff'] = 'Mot de passe API'; +$_MODULE['<{paypal}prestashop>back_office_195ca49498f0b30d3a8967eff22fa9b3'] = 'Signature'; +$_MODULE['<{paypal}prestashop>back_office_74cec07ee40362f7605816fdcfbf194d'] = 'Merci de vérifier que vous avez bien collé l\'ensemble des caractères, certain champs contiennent beaucoup de caractères'; +$_MODULE['<{paypal}prestashop>back_office_94ae34a9c107a078c63df4be1394e49d'] = 'Veuillez saisir vos identifiants PayPal API à PrestaShop'; +$_MODULE['<{paypal}prestashop>back_office_76525f0f34b48475e5ca33f71d296f3b'] = 'Client ID'; +$_MODULE['<{paypal}prestashop>back_office_1e6947ac7fb3a9529a9726eb692c8cc5'] = 'Secret'; +$_MODULE['<{paypal}prestashop>back_office_90912596e1deb86b1f39bb30013e2f8b'] = 'Use personnalisation (uses your logo and your shop name on Paypal) :'; +$_MODULE['<{paypal}prestashop>back_office_67f0dc0ff3d7b1fa4bb975b8831f54a9'] = 'Indiquez l\'email que vous avez utilisé pour créer votre compte PayPal professionnel'; +$_MODULE['<{paypal}prestashop>back_office_671bb93f14482ae559c736818605f445'] = 'E-mail compte PayPal professionnel'; +$_MODULE['<{paypal}prestashop>back_office_0e55f1779fe0d4169ab51bcb0ade306f'] = 'Pour finir la configuration de votre compte PayPal'; +$_MODULE['<{paypal}prestashop>back_office_258da42945130420ae78d4494d549e42'] = 'Confirmer votre adresse e-mail en suivant la procédure envoyée par PayPal lors de la création de votre compte'; +$_MODULE['<{paypal}prestashop>back_office_f9a8989b19d6c0db2e1cdfe2d54827c2'] = 'Lier votre compte PayPal à un compte bancaire ou à une carte bancaire. Connectez-vous à votre compte PayPal et rendez-vous dans la section \"Premier pas\"'; +$_MODULE['<{paypal}prestashop>back_office_50f33d14f129e4548c1c270fd6725a78'] = 'Choisissez votre solution'; +$_MODULE['<{paypal}prestashop>back_office_113269a2fc804aeae74a99e168309e8b'] = 'Choisissez votre solution'; +$_MODULE['<{paypal}prestashop>back_office_a025e05161bb17cbab898f0e77b09a2b'] = 'Iframe'; +$_MODULE['<{paypal}prestashop>back_office_d63bbf35e72f644c8752d4f2304f89e8'] = 'Redirection complète de la page'; +$_MODULE['<{paypal}prestashop>back_office_c7c6643c2c48aabc724f019ea0ef26cc'] = 'Choisissez un template'; +$_MODULE['<{paypal}prestashop>back_office_684c41bec3eaa8b8bc929c829c602157'] = 'Utilisez PayPal Express'; +$_MODULE['<{paypal}prestashop>back_office_76cfbdf3f35eb2368b8cbabfdd9f55db'] = 'Offrez à vos clients la possibilité de payer en 2 clics'; +$_MODULE['<{paypal}prestashop>back_office_c5192977219fb2eea3b1b41f8ce9f57d'] = 'Utilisez PayPal In Context Checkout'; +$_MODULE['<{paypal}prestashop>back_office_9229ae1bb2c5f0b221ac8f7f131aadc5'] = 'Faites payer votre client sans quitter votre site'; +$_MODULE['<{paypal}prestashop>back_office_229a7ec501323b94db7ff3157a7623c9'] = 'ID du marchant'; +$_MODULE['<{paypal}prestashop>back_office_748eadce9cf4f2bde207b63c5441da07'] = 'Utilisez la Fonction PayPal Login'; +$_MODULE['<{paypal}prestashop>back_office_cded4ac9f77c68c750c243af1f5263c5'] = '(*voir le'; +$_MODULE['<{paypal}prestashop>back_office_606d8f704cf61d29bffd5195f28af29e'] = 'Guide d\'Intégration'; +$_MODULE['<{paypal}prestashop>back_office_a1694ad810c4ac5b56b59c47db01cb05'] = 'et suivre les étapes de mise en place'; +$_MODULE['<{paypal}prestashop>back_office_3650f874df7e9c6e822a872d02cee6d5'] = 'Cette fonction permet à vos clients de se connecter avec leurs identifiants PayPal pour raccourcir le tunnel d\'achat'; +$_MODULE['<{paypal}prestashop>back_office_9be4e88898c4e88363208d2472f4a406'] = 'Renseignez les informations liées à votre compte PayPal'; +$_MODULE['<{paypal}prestashop>back_office_4ff2e716a7d06ce5274b4090b39abad3'] = 'Voir'; +$_MODULE['<{paypal}prestashop>back_office_8646a5d7b2817d30950357da8d80a11f'] = 'le Guide d\'Intégration'; +$_MODULE['<{paypal}prestashop>back_office_69f768e6b78f82d0eaf3f415d1c515bf'] = 'Traduis dans votre langue'; +$_MODULE['<{paypal}prestashop>back_office_705995576030bd6e0d95c02dcdea8e90'] = 'Utilisez la Sandbox'; +$_MODULE['<{paypal}prestashop>back_office_4b7472c730be779d64f3721de7e254ba'] = 'Mettez en place un environnement de test dans votre compte PayPal (seulement si vous êtes un développeur).'; +$_MODULE['<{paypal}prestashop>back_office_7c1fc486670e965e3d5fd8d2266483da'] = 'https://developer.paypal.com/'; +$_MODULE['<{paypal}prestashop>back_office_cebd5bbe0ffdecc270a8a324e5a277dd'] = 'Mode réel (recommandé)'; +$_MODULE['<{paypal}prestashop>back_office_4245499695408b974322be6f01b0d17a'] = 'Mode test'; +$_MODULE['<{paypal}prestashop>back_office_4dbcb38bbbff5d4a402f2575c57a35e6'] = 'Type de paiement'; +$_MODULE['<{paypal}prestashop>back_office_0eae1e85287701bf8071e06bfb65b933'] = 'Choisissez votre manière de valider les paiements (Automatique vs. Autorisation manuelle)'; +$_MODULE['<{paypal}prestashop>back_office_339bb3a6443078c1fd5a88d0a0d97096'] = 'Direct sales'; +$_MODULE['<{paypal}prestashop>back_office_9a901d2379aac144a2693dc7bf5c8caf'] = 'Authorization/Manual capture (payment shipping)'; +$_MODULE['<{paypal}prestashop>back_office_bbe7305fb801daa4bda35a3bebdd686f'] = 'Configuration Braintree'; +$_MODULE['<{paypal}prestashop>back_office_feadd388d5fc72934dbd9a4e337ca53e'] = 'Assurez-vous d\'avoir configurer la devise à utiliser sur votre compte. Si la devise choisie est incorrecte, la conversion aura lieu lors du retrait des fonds sur votre compte.'; +$_MODULE['<{paypal}prestashop>back_office_37c5b6e7c4291021b6100a6754ae7ffe'] = 'Clé publique'; +$_MODULE['<{paypal}prestashop>back_office_d2560860c51f895a9871741f0805c39e'] = 'Clé privée'; +$_MODULE['<{paypal}prestashop>back_office_2dbb2cdef30e5ee3f1cf7f6be57bee2d'] = 'ID du marchant'; +$_MODULE['<{paypal}prestashop>back_office_dfb97e0265705358ebcafe5d8cc10745'] = 'Obligatoire pour la devise par défaut'; +$_MODULE['<{paypal}prestashop>back_office_c9cc8cce247e49bae79f15173ce97354'] = 'Sauvegardez'; +$_MODULE['<{paypal}prestashop>back_office_13e8a61381ef71ee7f101ded231c9628'] = 'Activer le mode test implique que'; +$_MODULE['<{paypal}prestashop>back_office_f0b2074a9f1d017f7d5a7320f2c94a51'] = 'Vous ne pourrez pas accepter de paiement.'; +$_MODULE['<{paypal}prestashop>back_office_97ce37634025467f01c4eec75c93eda6'] = 'Vous devrez revenir à la page du module PayPal afin de terminer l\'étape 3 avant de passer en live.'; +$_MODULE['<{paypal}prestashop>back_office_4eb833f98c44cadf0b5ab6e576e06fe6'] = 'Vous devez créer un compte Sandbox sur le site PayPal.'; +$_MODULE['<{paypal}prestashop>back_office_d8fd35f628f2099aeaf3e5253e4acdba'] = 'Plus d\'infos'; +$_MODULE['<{paypal}prestashop>back_office_c53a1cbd15d24e03392bebd5eda7fb63'] = 'Vous aurez besoin de compétences en programmation'; +$_MODULE['<{paypal}prestashop>back_office_ff0d39d63c036426d6833917d512ef22'] = 'Êtes vous sûr de vouloir activer le mode test ?'; +$_MODULE['<{paypal}prestashop>back_office_980d7b730b063eabd43e8954e4e072ad'] = 'Bravo !'; +$_MODULE['<{paypal}prestashop>back_office_bb945e9f42acb423adb3d7535d491444'] = 'Vous pouvez maintenant commencer à accepter les paiements avec PayPal.'; +$_MODULE['<{paypal}prestashop>back_office_b89192773139ddf85c519d20255e7cf4'] = 'Vous pouvez maintenant commencer à tester les solutions PayPal. N\'oubliez pas de revenir à cette page et d\'activer le mode live afin de commencer à accepter les paiements.'; +$_MODULE['<{paypal}prestashop>back_office_2d801c24938b12e4ca9a2cf9b980c759'] = 'Erreur !'; +$_MODULE['<{paypal}prestashop>back_office_c21d57906c025cdec22f69835b0c3c60'] = 'Vous devez remplir les informations d\'identification PayPal à l\'étape 3 sinon vous ne serez pas en mesure d\'accepter le paiement.'; +$_MODULE['<{paypal}prestashop>back_office_3927e4ef139e9ffedccd66289344b4e3'] = 'Votre pays n\'est pas disponible pour ce module. Veuillez aller sur Prestashop addons pour voir les différentes possibilités.'; +$_MODULE['<{paypal}prestashop>button_braintree_8f096e6dc288af6c6cbf947540e3d9e3'] = 'Votre compte Braintree est configuré en mode test. Si vous rencontrez un problème, contactez-nous au 08 05 54 27 14.'; +$_MODULE['<{paypal}prestashop>button_braintree_19366aa55fb78cc02d3928ab546df32a'] = 'Votre compte Braintree est configuré en mode production. Vous pouvez vendre sur Euro seulement. Vous pouvez vous joindre le support Braintree au 08 05 54 27 14'; +$_MODULE['<{paypal}prestashop>capture_81e826adb70e2e6b189c2eef739d52d4'] = 'Capture PayPal'; +$_MODULE['<{paypal}prestashop>capture_3f8c6ecb084eea3b83d659fab7155e86'] = 'Date de capture'; +$_MODULE['<{paypal}prestashop>capture_f0b7cad3b2f0f29dcb4f2cad27cba2f8'] = 'Montant de la capture'; +$_MODULE['<{paypal}prestashop>capture_4746a3312ea207c919decf4e4ed5bb81'] = 'Résultat de la capture'; +$_MODULE['<{paypal}prestashop>capture_8e400d2b91f0c78c6a3a47d4d765f9ab'] = 'Il reste'; +$_MODULE['<{paypal}prestashop>capture_c6219ecef36e5dea2a7b634be290c526'] = 'à capturer.'; +$_MODULE['<{paypal}prestashop>capture_91744988bc81fc8a22b19b97c54587cb'] = 'Sommes à capturer :'; +$_MODULE['<{paypal}prestashop>capture_7c9275196098d2ed4edc8d6425190707'] = 'Saisissez le montant à capturer (ex: 200,00)'; +$_MODULE['<{paypal}prestashop>capture_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informations :'; +$_MODULE['<{paypal}prestashop>capture_ce64b2ea82cf4fa861a6512e2c32b84b'] = 'Les fonds sont prêts à être capturés avant expédition'; +$_MODULE['<{paypal}prestashop>capture_a61a9250ef6cc54f0d7dc8dd0c13da98'] = 'Êtes-vous certain de vouloir capturer ?'; +$_MODULE['<{paypal}prestashop>capture_99e64593868df2b7b32231c1ae5ddc04'] = 'Récupérer les fonds'; +$_MODULE['<{paypal}prestashop>refund_8ba079f305b81b172792bc0469b6a690'] = 'Remboursement PayPal'; +$_MODULE['<{paypal}prestashop>refund_3f8c6ecb084eea3b83d659fab7155e86'] = 'Date de capture'; +$_MODULE['<{paypal}prestashop>refund_f0b7cad3b2f0f29dcb4f2cad27cba2f8'] = 'Montant capturé'; +$_MODULE['<{paypal}prestashop>refund_4746a3312ea207c919decf4e4ed5bb81'] = 'Résultat de la capture'; +$_MODULE['<{paypal}prestashop>refund_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informations :'; +$_MODULE['<{paypal}prestashop>refund_016e1f278eccd700eaf33f74a501d050'] = 'Paiement accepté'; +$_MODULE['<{paypal}prestashop>refund_a8b1cc445942a2e1a7d7cca641c86d67'] = 'Lorsque vous remboursez un produit un remboursement partiel est effectué sauf si vous sélectionnez l\'option \"Générer un bon de réduction\"'; +$_MODULE['<{paypal}prestashop>refund_729a51874fe901b092899e9e8b31c97a'] = 'Etes-vous sûr ?'; +$_MODULE['<{paypal}prestashop>refund_c2a5e2e23d8ec9cad779d657b7d33fc1'] = 'Remboursement total de la transaction'; +$_MODULE['<{paypal}prestashop>validation_b630aa9b5e25da971949cae62dd109aa'] = 'Validation PayPal'; +$_MODULE['<{paypal}prestashop>validation_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informations :'; +$_MODULE['<{paypal}prestashop>validation_9119a92adbbf6c67bfb8a3aee0bdb720'] = 'Capture en attente - Pas d\'expédition'; +$_MODULE['<{paypal}prestashop>validation_c14eb95a724174f336b8ffdd98ef2f35'] = 'Paiement en attente - Pas d\'expédition'; +$_MODULE['<{paypal}prestashop>validation_5b18ff32c2aaaf4b79bdead10b10fe29'] = 'Vérifier l\'état du paiement'; +$_MODULE['<{paypal}prestashop>about_e816e21c1c8e0eba0620fa3df6bd6795'] = 'Qu\'est-ce que PayPal ?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal, leader incontesté en matière de paiement en ligne, permet aux acheteurs et aux vendeurs d\'envoyer et de recevoir des paiements en ligne. PayPal compte plus de 100 millions de comptes dans 190 pays et régions du monde. Il est accepté par les marchands partout, à la fois sur eBay et en dehors d\'eBay.'; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = 'Est-ce un service sécurisé ?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal contribue à protéger les informations concernant votre carte bancaire grâce aux meilleurs systèmes présents sur le marché pour la sécurité et la prévention contre la fraude. Lorsque vous utilisez PayPal, vos informations financières ne sont jamais communiquées au marchand.'; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = 'Pourquoi utiliser PayPal ?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = 'Effectuez des achats ou envoyez des paiements avec PayPal : c\'est gratuit.'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Achetez et payez en toute tranquillité en enregistrant vos informations auprès de PayPal.'; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'PayPal est accepté par des millions de marchands dans le monde et constitue le mode de paiement le plus utilisé sur eBay.'; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = 'Utilisez PayPal dès aujourd\'hui !'; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Votre panier'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>error_f47106270a2928f350f357e255a2c2ac'] = 'Veuillez contacter le marchant:'; +$_MODULE['<{paypal}prestashop>error_d5860edcd3078f86ee963c27654bc6cf'] = 'Montant total de la transaction (taxes incl) :'; +$_MODULE['<{paypal}prestashop>error_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'L\'ID de votre commande est :'; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Précédent'; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_fb077ecba55e5552916bde26d8b9e794'] = 'Confirmation de commande'; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_d5860edcd3078f86ee963c27654bc6cf'] = 'Total de la transaction (TTC) : '; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Votre ID de commande est : '; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_6e860dc1cf94ca08b3fd99993aa2dc68'] = 'Votre ID de transaction PayPal est : '; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_300225ee958b6350abc51805dab83c24'] = 'Continuez vos achats'; +$_MODULE['<{paypal}prestashop>order-confirmation-mobile_9390390581f54c65d6acfc8da4e17362'] = 'Retour aux commandes '; +$_MODULE['<{paypal}prestashop>order-confirmation-plus-mobile_fb077ecba55e5552916bde26d8b9e794'] = 'Confirmation de commande'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus-mobile_1bdf0a578085305bfc89204c35a2e282'] = 'Confirmation de commande ?'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus-mobile_705c8bbd1b017c7aef55f271497c46f3'] = 'Voulez vous confirmer votre commande d\'un total de '; +$_MODULE['<{paypal}prestashop>order-confirmation-plus-mobile_3ead062a94f740e432db35289dc3ac8a'] = 'Annulez votre commande'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus-mobile_e1007b413aa77c8b67f874ede13915d9'] = 'Confirmez votre paiement'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus-mobile_4082ea29b4f196c4f60533500139725a'] = 'Suivre ma commande'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus-mobile_9390390581f54c65d6acfc8da4e17362'] = 'Retour aux commandes'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus-mobile_996762d40f1a6ef751e51c58f72c2ed2'] = 'Une erreur a eu lieu durant votre paiement'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus-mobile_2758fccb8c7506009717e9834717c238'] = 'Votre commande a été annulée'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus_fb077ecba55e5552916bde26d8b9e794'] = 'Confirmation de commande'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus_dbf8de5592ae3e932edd8b56ac3fda05'] = 'Confirmation de commande ?'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus_705c8bbd1b017c7aef55f271497c46f3'] = 'Voulez vous confirmer votre commande d\'un total de '; +$_MODULE['<{paypal}prestashop>order-confirmation-plus_154c197e501e1f61ef5f82b7e420da8b'] = 'Annulez votre commande'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus_e1007b413aa77c8b67f874ede13915d9'] = 'Confirmez votre paiement'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus_4082ea29b4f196c4f60533500139725a'] = 'Suivre ma commande'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus_9390390581f54c65d6acfc8da4e17362'] = 'Retour aux commandes'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus_996762d40f1a6ef751e51c58f72c2ed2'] = 'Une erreur a eu lieu durant votre paiement'; +$_MODULE['<{paypal}prestashop>order-confirmation-plus_2758fccb8c7506009717e9834717c238'] = 'Votre commande a été annulée'; +$_MODULE['<{paypal}prestashop>order-confirmation_fb077ecba55e5552916bde26d8b9e794'] = 'Confirmation de commande'; +$_MODULE['<{paypal}prestashop>order-confirmation_d5860edcd3078f86ee963c27654bc6cf'] = 'Total de la transaction (TTC) :'; +$_MODULE['<{paypal}prestashop>order-confirmation_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Votre numéro de commande est le :'; +$_MODULE['<{paypal}prestashop>order-confirmation_6e860dc1cf94ca08b3fd99993aa2dc68'] = 'Votre numéro de transaction PayPal est :'; +$_MODULE['<{paypal}prestashop>order-confirmation_4082ea29b4f196c4f60533500139725a'] = 'Suivre ma commande'; +$_MODULE['<{paypal}prestashop>order-confirmation_9390390581f54c65d6acfc8da4e17362'] = 'Retour aux commandes'; +$_MODULE['<{paypal}prestashop>order-summary_a40cab5994f36d4c48103a22ca082e8f'] = 'Votre panier'; +$_MODULE['<{paypal}prestashop>order-summary_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>order-summary_f1d3b424cd68795ecaa552883759aceb'] = 'Résumé de la commande'; +$_MODULE['<{paypal}prestashop>order-summary_dd23adc5fb6bda9c384397b31e57fc53'] = 'Paiement par PayPal'; +$_MODULE['<{paypal}prestashop>order-summary_0881a11f7af33bc1b43e437391129d66'] = 'Veuillez confirmer votre commande en cliquant sur \"Je confirme ma commande\"'; +$_MODULE['<{paypal}prestashop>order-summary_46b9e3665f187c739c55983f757ccda0'] = 'Je confirme ma commande'; +$_MODULE['<{paypal}prestashop>braintree_confirm_d5860edcd3078f86ee963c27654bc6cf'] = 'Total de votre commande TTC : '; +$_MODULE['<{paypal}prestashop>braintree_confirm_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Votre ID de commande est :'; +$_MODULE['<{paypal}prestashop>braintree_confirm_34798c0df527a74a513487b204043c1b'] = 'Votre ID de Transaction est : '; +$_MODULE['<{paypal}prestashop>braintree_payment_ea537711be68b2437ddf72409ff91c7e'] = 'Payez avec votre carte'; +$_MODULE['<{paypal}prestashop>braintree_payment_99938b17c91170dfb0c2f3f8bc9f2a85'] = 'Payer'; +$_MODULE['<{paypal}prestashop>braintree_payment_4f5c9ccd92deed383dc5ece76515970d'] = 'Erreur lors de la création du client'; +$_MODULE['<{paypal}prestashop>braintree_payment_a44217022190f5734b2f72ba1e4f8a79'] = 'Numéro de carte'; +$_MODULE['<{paypal}prestashop>braintree_payment_5ea7f231296949070013bc43715aae01'] = 'CVC'; +$_MODULE['<{paypal}prestashop>braintree_payment_16aefbf48d8803216285343472025aed'] = 'MM/AA'; +$_MODULE['<{paypal}prestashop>braintree_payment_28f32d13232983d9fef5773f3be12851'] = 'Erreur lors de la création du Hosted fields'; +$_MODULE['<{paypal}prestashop>braintree_payment_602eca5bf7f4271e8accbcd1ee74e919'] = 'Tous les champs sont vides ! Veuillez remplir le formulaire.'; +$_MODULE['<{paypal}prestashop>braintree_payment_d29ae6715f1eff4efcca108ff2fbbabe'] = 'Certains champs ne sont pas valides :'; +$_MODULE['<{paypal}prestashop>braintree_payment_729cd05e50606aca11e38918222fdd82'] = 'La tokenisation a échoué côté serveur. La carte bancaire est-elle valide ?'; +$_MODULE['<{paypal}prestashop>braintree_payment_1519bda079ebc7a0352e12d5a218daef'] = 'Une erreur de réseau s\'est produite lors de la tokenisation.'; +$_MODULE['<{paypal}prestashop>braintree_payment_23d1e945d89f99ddf838f0b7921098c5'] = 'Tokenisation échoué'; +$_MODULE['<{paypal}prestashop>braintree_payment_4415d0f48a48bbe04bb7b0ea9dc88284'] = 'HTTPS est requis pour le 3D Secure'; +$_MODULE['<{paypal}prestashop>braintree_payment_b81f50c07c8d23bbd7b2107b36d83704'] = 'Chargement du 3DS échoué'; +$_MODULE['<{paypal}prestashop>braintree_payment_b999ae7b750a6857e6bea1618fb223c3'] = 'Un problème est survenue lors de votre appel.'; +$_MODULE['<{paypal}prestashop>braintree_payment_64a0a5788729fd5ba37db816f5a32f38'] = 'Échec de la sécurité 3D Secure'; +$_MODULE['<{paypal}prestashop>braintree_return_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{paypal}prestashop>braintree_return_75fbf512d744977d62599cc3f0ae2bb4'] = 'Est complète.'; +$_MODULE['<{paypal}prestashop>braintree_return_665447de5b77efad6f385dcb09600f51'] = 'Vous avez choisir de payer par carte'; +$_MODULE['<{paypal}prestashop>braintree_return_e6dc7945b557a1cd949bea92dd58963e'] = 'Votre commande sera bientôt envoyée'; +$_MODULE['<{paypal}prestashop>braintree_return_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toutes questions ou information , veuillez contacter notre'; +$_MODULE['<{paypal}prestashop>braintree_return_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Support'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payer par PayPal'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'est bien enregistrée.'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'Vous avez choisi de payer avec PayPal.'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Votre commande vous sera envoyée très prochainement.'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toute question ou information complémentaire merci de contacter notre'; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'support client'; +$_MODULE['<{paypal}prestashop>express_checkout_payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payez avec PayPal'; +$_MODULE['<{paypal}prestashop>express_checkout_payment_83a1a5a403aed4b7ead866d253aef998'] = 'Payez par carte ou par compte PayPal'; +$_MODULE['<{paypal}prestashop>express_checkout_payment_eu_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payer avec Paypal'; +$_MODULE['<{paypal}prestashop>express_checkout_shortcut_form_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payez avec PayPal'; +$_MODULE['<{paypal}prestashop>integral_evolution_payment_83a1a5a403aed4b7ead866d253aef998'] = 'Payez par carte ou par compte PayPal'; +$_MODULE['<{paypal}prestashop>integral_evolution_payment_ecab922bc1f9b5726e2a6deb4acaec4e'] = 'Retour au site du marchant.'; +$_MODULE['<{paypal}prestashop>integral_evolution_payment_eu_ecab922bc1f9b5726e2a6deb4acaec4e'] = 'Retour au site du marchant.'; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_62d74398cb6ebaa69ab7339052ca5c92'] = 'Vous avez choisi de payer avec PayPal'; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_c884ed19483d45970c5bf23a681e2dd2'] = 'Voici un résumé de votre commande'; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_0c458988127eb2150776881e2ef3f0c4'] = 'Adresse de livraison'; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_1fbc7e5f1b92c7ec072397b59a0bb5da'] = 'Adresse de facturation'; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_9254cd9a15c6cc29d90cf5e585628e0f'] = 'Votre panier'; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_be53a0541a6d36f6ecb879fa2c584b08'] = 'Image'; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_694e8d1f2ee056f98ee488bdc4982d73'] = 'Quantité'; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_e2867a925cba382f1436d1834bb52a1c'] = 'Le total de votre commande est de '; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_1f87346a16cf80c372065de3c54c86d9'] = '(TTC)'; +$_MODULE['<{paypal}prestashop>paypal_cart_summary_8ed356c32b198c9cb2abab7c3d262b93'] = 'Nous acceptons les devises suivantes : '; diff --git a/modules/paypal/img/fancybox/index.php b/modules/paypal/img/fancybox/index.php new file mode 100644 index 000000000..187d3649c --- /dev/null +++ b/modules/paypal/img/fancybox/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/img/index.php b/modules/paypal/img/index.php new file mode 100644 index 000000000..187d3649c --- /dev/null +++ b/modules/paypal/img/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/index.php b/modules/paypal/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/integral_evolution/confirm.php b/modules/paypal/integral_evolution/confirm.php new file mode 100644 index 000000000..41af4c0a5 --- /dev/null +++ b/modules/paypal/integral_evolution/confirm.php @@ -0,0 +1,43 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once dirname(__FILE__).'/../../../config/config.inc.php'; +include_once _PS_ROOT_DIR_.'/init.php'; + + +if ($id_cart = Tools::getValue('id_cart')) { + $id_order = Db::getInstance()->getValue(' + SELECT id_order + FROM `'._DB_PREFIX_.'paypal_order` + WHERE `id_order` = '.(int) Order::getOrderByCartId((int) $id_cart)); + + if ($id_order !== false) { + echo (int) $id_order; + } + +} + +die(); diff --git a/modules/paypal/integral_evolution/index.php b/modules/paypal/integral_evolution/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/integral_evolution/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/integral_evolution/notifier.php b/modules/paypal/integral_evolution/notifier.php new file mode 100644 index 000000000..be2f95eab --- /dev/null +++ b/modules/paypal/integral_evolution/notifier.php @@ -0,0 +1,113 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once dirname(__FILE__).'/../../../config/config.inc.php'; +include_once _PS_MODULE_DIR_.'paypal/paypal.php'; + +/* + * Instant payment notification class. + * (wait for PayPal payment confirmation, then validate order) + */ +class PayPalNotifier extends PayPal +{ + public function confirmOrder($custom) + { + $cart = new Cart((int) $custom['id_cart']); + + $cart_details = $cart->getSummaryDetails(null, true); + $cart_hash = sha1(serialize($cart->nbProducts())); + + $this->context->cart = $cart; + $address = new Address((int) $cart->id_address_invoice); + $this->context->country = new Country((int) $address->id_country); + $this->context->customer = new Customer((int) $cart->id_customer); + $this->context->language = new Language((int) $cart->id_lang); + $this->context->currency = new Currency((int) $cart->id_currency); + + if (isset($cart->id_shop)) { + $this->context->shop = new Shop($cart->id_shop); + } + + $result = $this->getResult(); + + if (strcmp(trim($result), "VERIFIED") == 0) { + $currency_decimals = is_array($this->context->currency) ? (int) $this->context->currency['decimals'] : (int) $this->context->currency->decimals; + $this->decimals = $currency_decimals * _PS_PRICE_DISPLAY_PRECISION_; + + $message = null; + $mc_gross = Tools::ps_round(Tools::getValue('mc_gross'), $this->decimals); + + $cart_details = $cart->getSummaryDetails(null, true); + + $shipping = $cart_details['total_shipping_tax_exc']; + $subtotal = $cart_details['total_price_without_tax'] - $cart_details['total_shipping_tax_exc']; + $tax = $cart_details['total_tax']; + + $total_price = Tools::ps_round($shipping + $subtotal + $tax, $this->decimals); + + if ($this->comp($mc_gross, $total_price, 2) !== 0) { + $payment = (int) Configuration::get('PS_OS_ERROR'); + $message = $this->l('Price paid on paypal is not the same that on PrestaShop.').'
'; + } elseif ($custom['hash'] != $cart_hash) { + $payment = (int) Configuration::get('PS_OS_ERROR'); + $message = $this->l('Cart changed, please retry.').'
'; + } else { + $payment = (int) Configuration::get('PS_OS_PAYMENT'); + $message = $this->l('Payment accepted.').'
'; + } + + $customer = new Customer((int) $cart->id_customer); + $transaction = PayPalOrder::getTransactionDetails(false); + + if (_PS_VERSION_ < '1.5') { + $shop = null; + } else { + $shop_id = $this->context->shop->id; + $shop = new Shop($shop_id); + } + + $this->validateOrder($cart->id, $payment, $total_price, $this->displayName, $message, $transaction, $cart->id_currency, false, $customer->secure_key, $shop); + } + } + + public function getResult() + { + if ((int) Configuration::get('PAYPAL_SANDBOX') == 1) { + $action_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate'; + } else { + $action_url = 'https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate'; + } + + $request = '&'.http_build_query($_POST, '&'); + return Tools::file_get_contents($action_url.$request); + } +} + +if ($custom = Tools::getValue('custom')) { + $notifier = new PayPalNotifier(); + $result = Tools::jsonDecode($custom, true); + $notifier->confirmOrder($result); +} diff --git a/modules/paypal/integral_evolution/submit.php b/modules/paypal/integral_evolution/submit.php new file mode 100644 index 000000000..ae8282e4f --- /dev/null +++ b/modules/paypal/integral_evolution/submit.php @@ -0,0 +1,101 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once dirname(__FILE__).'/../../../config/config.inc.php'; +include_once _PS_ROOT_DIR_.'/init.php'; + +if (version_compare(_PS_VERSION_, '1.5', '<')) { + require_once _PS_ROOT_DIR_.'/controllers/OrderConfirmationController.php'; +} + +class PayPalIntegralEvolutionSubmit extends OrderConfirmationControllerCore +{ + public $context; + + public function __construct() + { + /** Backward compatibility */ + include_once _PS_MODULE_DIR_.'paypal/backward_compatibility/backward.php'; + $this->context = Context::getContext(); + parent::__construct(); + } + + /* + * Display PayPal order confirmation page + */ + public function displayContent() + { + $id_order = (int) Tools::getValue('id_order'); + $order = PayPalOrder::getOrderById($id_order); + $price = Tools::displayPrice($order['total_paid'], $this->context->currency); + + $this->context->smarty->assign(array( + 'order' => $order, + 'price' => $price, + )); + if (version_compare(_PS_VERSION_, '1.5', '>')) { + $this->context->smarty->assign(array( + 'reference_order' => Order::getUniqReferenceOf($id_order), + )); + } + + echo $this->context->smarty->fetch(_PS_MODULE_DIR_.'paypal/views/templates/front/order-confirmation.tpl'); + } +} + +$id_cart = Tools::getValue('id_cart'); +$id_module = Tools::getValue('id_module'); +$id_order = Tools::getValue('id_order'); +$key = Tools::getValue('key'); + +if ($id_module && $id_order && $id_cart && $key) { + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $integral_evolution_submit = new PayPalIntegralEvolutionSubmit(); + $integral_evolution_submit->run(); + } +} elseif ($id_cart) { + // Redirection + $values = array( + 'id_cart' => (int) $id_cart, + 'id_module' => (int) Module::getInstanceByName('paypal')->id, + 'id_order' => (int) Order::getOrderByCartId((int) $id_cart), + ); + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $customer = new Customer(Context::getContext()->cookie->id_customer); + $values['key'] = $customer->secure_key; + $url = _MODULE_DIR_.'/paypal/integral_evolution/submit.php'; + Tools::redirectLink($url.'?'.http_build_query($values, '', '&')); + } else { + $values['key'] = Context::getContext()->customer->secure_key; + $link = Context::getContext()->link->getModuleLink('paypal', 'submit', $values); + Tools::redirect($link); + } +} else { + Tools::redirectLink(__PS_BASE_URI__); +} + +exit(0); diff --git a/modules/paypal/ipn.php b/modules/paypal/ipn.php new file mode 100644 index 000000000..55cb90d4b --- /dev/null +++ b/modules/paypal/ipn.php @@ -0,0 +1,240 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once dirname(__FILE__).'/../../config/config.inc.php'; +include_once _PS_ROOT_DIR_.'/init.php'; +include_once _PS_MODULE_DIR_.'paypal/paypal.php'; + +/* + * Instant payment notification class. + * (wait for PayPal payment confirmation, then validate order) + */ +class PayPalIPN extends PayPal +{ + + public function getIPNTransactionDetails($result) + { + if (is_array($result) || (strcmp(trim($result), "VERIFIED") === false)) { + $transaction_id = pSQL($result['txn_id']); + + return array( + 'id_transaction' => $transaction_id, + 'transaction_id' => $transaction_id, + 'id_invoice' => $result['invoice'], + 'currency' => pSQL($result['mc_currency']), + 'total_paid' => (float) $result['mc_gross'], + 'shipping' => (float) $result['mc_shipping'], + 'payment_date' => pSQL($result['payment_date']), + 'payment_status' => pSQL($result['payment_status']), + ); + } else { + $transaction_id = pSQL(Tools::getValue('txn_id')); + + return array( + 'id_transaction' => $transaction_id, + 'transaction_id' => $transaction_id, + 'id_invoice' => pSQL(Tools::getValue('invoice')), + 'currency' => pSQL(Tools::getValue('mc_currency')), + 'total_paid' => (float) Tools::getValue('mc_gross'), + 'shipping' => (float) Tools::getValue('mc_shipping'), + 'payment_date' => pSQL(Tools::getValue('payment_date')), + 'payment_status' => pSQL(Tools::getValue('payment_status')), + ); + } + } + + public function confirmOrder($custom) + { + $result = $this->getResult(); + + $payment_status = Tools::getValue('payment_status'); + $mc_gross = Tools::getValue('mc_gross'); + $txn_id = Tools::getValue('txn_id'); + + $id_order = (int) PayPalOrder::getIdOrderByTransactionId($txn_id); + + if ($id_order != 0) { + Context::getContext()->cart = new Cart((int) $id_order); + } elseif (isset($custom['id_cart'])) { + Context::getContext()->cart = new Cart((int) $custom['id_cart']); + } + + $address = new Address((int) Context::getContext()->cart->id_address_invoice); + Context::getContext()->country = new Country((int) $address->id_country); + Context::getContext()->customer = new Customer((int) Context::getContext()->cart->id_customer); + Context::getContext()->language = new Language((int) Context::getContext()->cart->id_lang); + Context::getContext()->currency = new Currency((int) Context::getContext()->cart->id_currency); + + if (isset(Context::getContext()->cart->id_shop)) { + Context::getContext()->shop = new Shop(Context::getContext()->cart->id_shop); + } + + if (strcmp(trim($result), "VERIFIED") === false) { + $details = $this->getIPNTransactionDetails($result); + + if ($id_order != 0) { + $history = new OrderHistory(); + $history->id_order = (int) $id_order; + + PayPalOrder::updateOrder($id_order, $details); + $history->changeIdOrderState((int) Configuration::get('PS_OS_ERROR'), $history->id_order); + + $history->addWithemail(); + $history->save(); + } + } elseif (strcmp(trim($result), "VERIFIED") === 0) { + $details = $this->getIPNTransactionDetails($result); + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $shop = null; + } else { + $shop_id = Context::getContext()->shop->id; + $shop = new Shop($shop_id); + } + + if ($id_order != 0) { + $order = new Order((int) $id_order); + $values = $this->checkPayment($payment_status, $mc_gross, false); + + if ((int) $order->current_state == (int) $values['payment_type']) { + return; + } + + $history = new OrderHistory(); + $history->id_order = (int) $id_order; + + PayPalOrder::updateOrder($id_order, $details); + $history->changeIdOrderState($values['payment_type'], $history->id_order); + + $history->addWithemail(); + $history->save(); + } else { + $values = $this->checkPayment($payment_status, $mc_gross, true); + $customer = new Customer((int) Context::getContext()->cart->id_customer); + $this->validateOrder(Context::getContext()->cart->id, $values['payment_type'], $values['total_price'], $this->displayName, $values['message'], $details, Context::getContext()->cart->id_currency, false, $customer->secure_key, $shop); + } + } + } + + public function checkPayment($payment_status, $mc_gross_not_rounded, $new_order) + { + $currency_decimals = is_array(Context::getContext()->currency) ? (int) Context::getContext()->currency['decimals'] : (int) Context::getContext()->currency->decimals; + $this->decimals = $currency_decimals * _PS_PRICE_DISPLAY_PRECISION_; + + $mc_gross = Tools::ps_round($mc_gross_not_rounded, $this->decimals); + + $cart_details = Context::getContext()->cart->getSummaryDetails(null, true); + $cart_hash = sha1(serialize(Context::getContext()->cart->nbProducts())); + $custom = Tools::jsonDecode(Tools::getValue('custom'), true); + + $shipping = $cart_details['total_shipping_tax_exc']; + $subtotal = $cart_details['total_price_without_tax'] - $cart_details['total_shipping_tax_exc']; + $tax = $cart_details['total_tax']; + + $total_price = Tools::ps_round($shipping + $subtotal + $tax, $this->decimals); + + if (($new_order == true) && ($this->comp($mc_gross, $total_price, 2) !== 0)) { + $payment_type = (int) Configuration::get('PS_OS_ERROR'); + $message = $this->l('Price paid on paypal is not the same that on PrestaShop.').'
'; + } elseif (($new_order == true) && ($custom['hash'] != $cart_hash)) { + $payment_type = (int) Configuration::get('PS_OS_ERROR'); + $message = $this->l('Cart changed, please retry.').'
'; + } else { + return $this->getDetails($payment_status) + array( + 'payment_status' => $payment_status, + 'total_price' => $total_price, + ); + } + + return array( + 'message' => $message, + 'payment_type' => $payment_type, + 'payment_status' => $payment_status, + 'total_price' => $total_price, + ); + } + + public function getDetails($payment_status) + { + if ((bool) Configuration::get('PAYPAL_CAPTURE')) { + $payment_type = (int) Configuration::get('PS_OS_WS_PAYMENT'); + $message = $this->l('Pending payment capture.').'
'; + } else { + if (strcmp($payment_status, 'Completed') === 0) { + $payment_type = (int) Configuration::get('PS_OS_PAYMENT'); + $message = $this->l('Payment accepted.').'
'; + } elseif (strcmp($payment_status, 'Pending') === 0) { + $payment_type = (int) Configuration::get('PS_OS_PAYPAL'); + $message = $this->l('Pending payment confirmation.').'
'; + } else { + $payment_type = (int) Configuration::get('PS_OS_ERROR'); + $message = $this->l('Cart changed, please retry.').'
'; + } + } + + return array( + 'message' => $message, + 'payment_type' => (int) $payment_type, + ); + } + + public function getResult() + { + if ((int) Configuration::get('PAYPAL_SANDBOX') == 1) { + $action_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate'; + } else { + $action_url = 'https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate'; + } + + $request = ''; + foreach ($_POST as $key => $value) { + $value = urlencode(Tools::stripslashes($value)); + $request .= "&$key=$value"; + } + + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_URL, $action_url.$request); + curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($curl, CURLOPT_TIMEOUT, 5); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); + + $content = curl_exec($curl); + curl_close($curl); + return $content; + } +} + + +if (Tools::getValue('receiver_email') == Configuration::get('PAYPAL_BUSINESS_ACCOUNT')) { + + if (Tools::getIsset('custom')) { + $ipn = new PayPalIPN(); + $custom = Tools::jsonDecode(Tools::getValue('custom'), true); + $ipn->confirmOrder($custom); + } +} diff --git a/modules/paypal/it.php b/modules/paypal/it.php new file mode 100644 index 000000000..7983a9beb --- /dev/null +++ b/modules/paypal/it.php @@ -0,0 +1,157 @@ +paypal_connect_d1f14cc4a2dade80c92421d26422fea0'] = 'Fare nuova connessione'; +$_MODULE['<{paypal}prestashop>paypal_connect_94a27811a721ef512ad7bfa06cab34e0'] = 'Connessione non riuscita con metodo CURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_70215486455daee13382c68b1a230b82'] = 'Connessione con metodo CURL riuscita'; +$_MODULE['<{paypal}prestashop>paypal_connect_e4c4ad49bced42265b5facc2175cdafd'] = 'Invio di questo param.:'; +$_MODULE['<{paypal}prestashop>paypal_connect_445583f6641da98fc7ac8fd9d13a564b'] = 'Invio con metodo CURL fallito! Errore:'; +$_MODULE['<{paypal}prestashop>paypal_connect_ef4fbf36eaa2083442d386990ba063c2'] = 'Invio con metodo CURL riuscito'; +$_MODULE['<{paypal}prestashop>paypal_connect_bf059c9751bb1a20b449b7917b1df374'] = 'Connessione non riuscita con metodo fsockopen'; +$_MODULE['<{paypal}prestashop>paypal_connect_6e9aa4cb541e09b07602d4ea96080811'] = 'Invio con metodo fsockopen non riuscito!'; +$_MODULE['<{paypal}prestashop>paypal_connect_842a183be225d415b2b4375ba1dd1c94'] = 'Invio con metodo fsockopen riuscito'; +$_MODULE['<{paypal}prestashop>paypal_lib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'risposta di PayPal:'; +$_MODULE['<{paypal}prestashop>notifier_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pagamento accettato.'; +$_MODULE['<{paypal}prestashop>back_office_e9f91995a69772872f7a386c6909403d'] = 'Conquista nuovi clienti'; +$_MODULE['<{paypal}prestashop>paypal_98aba438b26738216a5674199a9a4159'] = 'Il tuo server non è compatibile con la prossima versione del modulo PayPal. Si prega di contattare la società di hosting per aggiornare la versione di PHP almeno alla versione 5.4 o successiva'; +$_MODULE['<{paypal}prestashop>back_office_bbf54c5f55856a290f0deae540368071'] = 'Oltre 110 milioni di conti PayPal attivi nel mondo'; +$_MODULE['<{paypal}prestashop>back_office_ad78c46c5d6edc542ad2153e23518478'] = 'Espandi la tua base utenti anche all\'estero'; +$_MODULE['<{paypal}prestashop>back_office_2b91c701cecf505dc5af4e35d7067f1f'] = '190 Paesi e 25 valute diverse'; +$_MODULE['<{paypal}prestashop>back_office_3a73e92a81de06fba19ab722bd500675'] = 'Offri più protezione ai tuoi clienti'; +$_MODULE['<{paypal}prestashop>back_office_d5f5f5c138165b223c4e6481752c7748'] = 'Chi compra non condivide i dati personali'; +$_MODULE['<{paypal}prestashop>back_office_421fe69f8b38a3c361835747e6215227'] = 'Accetta le principali carte di credito e prepagate'; +$_MODULE['<{paypal}prestashop>back_office_516710946f5fb35af6496ad0b7582980'] = 'Inizia subito a vendere con PayPal. Bastano 5 minuti'; +$_MODULE['<{paypal}prestashop>back_office_56564e0a106b0e0e2dc57b5a105ed639'] = 'Il tuo Paese'; +$_MODULE['<{paypal}prestashop>back_office_eb399bcaca686f8609137153307eecf1'] = 'change'; +$_MODULE['<{paypal}prestashop>back_office_a7bb58222222b064f0721e6e0fe4c486'] = 'Select your country'; +$_MODULE['<{paypal}prestashop>back_office_93140d7ca5171ede9b8a94f07f0363ec'] = 'Hai già un conto PayPal Business'; +$_MODULE['<{paypal}prestashop>back_office_73878c19cdc6ef2ab0d0fac6943cc958'] = 'Hai bisogno di aiuto?'; +$_MODULE['<{paypal}prestashop>back_office_240fdce652f09de611fc997971dea41e'] = 'Seleziona il prodotto che fa per te'; +$_MODULE['<{paypal}prestashop>back_office_d59048f21fd887ad520398ce677be586'] = 'Scopri di più'; +$_MODULE['<{paypal}prestashop>back_office_cd5ee0ac6f3296c551e631268af2915b'] = 'Vuoi usare PayPal per elaborare tutti i tuoi i pagamenti online ?'; +$_MODULE['<{paypal}prestashop>back_office_961f2247a2070bedff9f9cd8d64e2650'] = 'Scegli'; +$_MODULE['<{paypal}prestashop>back_office_d30abcb258277c6028d040b073276da1'] = 'Pagamenti su sito web'; +$_MODULE['<{paypal}prestashop>back_office_4d647b4406dba3d579ac2ef165c05196'] = 'Inizia subito a vendere online.'; +$_MODULE['<{paypal}prestashop>back_office_e331bc26b25860e255aac1225fc5c639'] = 'Nessun costo iniziale né tariffe mensili. Paghi solo quando ricevi pagamenti.'; +$_MODULE['<{paypal}prestashop>back_office_d5e2ec9a0a842a49d3258d6e355d3b55'] = 'PayPal Pro'; +$_MODULE['<{paypal}prestashop>back_office_366520e0e4a3ce5469c0ed737ae032ef'] = 'Il POS Virtuale completo, protezione delle vendite inclusa.'; +$_MODULE['<{paypal}prestashop>back_office_3014bd9d081fc92e6ab6bb7e91336749'] = 'Abbonamento mensile: €29 EUR.'; +$_MODULE['<{paypal}prestashop>back_office_b9b242f30b7f3cf333e57f359ca3c9bc'] = 'Clicca il pulsante SALVA in fondo alla pagina solo dopo che PayPal avrà approvato la tua richiesta per PayPal Pro. Può richiedere 3-5 giorni.'; +$_MODULE['<{paypal}prestashop>back_office_53f61475efdd0c433443262f0d7cdcbf'] = 'Paypal Plus'; +$_MODULE['<{paypal}prestashop>back_office_69d7974bb0bacddb986bbf8d734238c4'] = 'Vuoi PayPal come metodo di pagamento aggiuntivo ?'; +$_MODULE['<{paypal}prestashop>back_office_2e3e721e530a957f81d5b5dcff0bf0e1'] = 'Pagamento express'; +$_MODULE['<{paypal}prestashop>back_office_e8c466b9c179e229ae67f339a8e2476a'] = 'Richiedi PayPal Pro o apri un conto PayPal Business'; +$_MODULE['<{paypal}prestashop>back_office_d67850bd126f070221dcfd5fa6317043'] = 'Registrati'; +$_MODULE['<{paypal}prestashop>back_office_b26917587d98330d93f87808fc9d7267'] = 'Richiedilo'; +$_MODULE['<{paypal}prestashop>back_office_5c57ba1861701e5a630dd5006acb30e2'] = 'Clicca il pulsante SALVA in fondo alla pagina solo dopo che PayPal avrà approvato la tua richiesta per PayPal Pro,altrimenti non potrai elaborare i pagamenti. Può richiedere 3-5 giorni.'; +$_MODULE['<{paypal}prestashop>back_office_b4e69ef9df8f20b984309ee73f78953b'] = 'Clicca il pulsante di seguito per fornire le tue credenziali PayPal a PrestaShop'; +$_MODULE['<{paypal}prestashop>back_office_2ffe0ef69fd047d0884f98faa52c1bd3'] = 'Richiedi le credenziali PayPal'; +$_MODULE['<{paypal}prestashop>back_office_36461ebc9ebcd269f3909fa49a4b0a57'] = 'Dopo aver cliccato il pulsante, inserisci nome utente e password nella finestra di pop up: da qui copia le credenziali PayPal ottenute e incollale nei campi di seguito.'; +$_MODULE['<{paypal}prestashop>back_office_266ba5df48aed68af0cce5f735035291'] = 'Username API'; +$_MODULE['<{paypal}prestashop>back_office_37e31370e4ab230ff6fba12cc6390aff'] = 'Password API'; +$_MODULE['<{paypal}prestashop>back_office_195ca49498f0b30d3a8967eff22fa9b3'] = 'Firma API'; +$_MODULE['<{paypal}prestashop>back_office_74cec07ee40362f7605816fdcfbf194d'] = 'Controlla di aver inserito correttamente tutti i caratteri.'; +$_MODULE['<{paypal}prestashop>back_office_90912596e1deb86b1f39bb30013e2f8b'] = 'Use personnalisation (uses your logo and your shop name on Paypal) :'; +$_MODULE['<{paypal}prestashop>back_office_671bb93f14482ae559c736818605f445'] = 'API business e-mail'; +$_MODULE['<{paypal}prestashop>back_office_0e55f1779fe0d4169ab51bcb0ade306f'] = 'Completa l\'attivazione del tuo conto PayPal'; +$_MODULE['<{paypal}prestashop>back_office_258da42945130420ae78d4494d549e42'] = 'Conferma il tuo indirizzo email: controlla l\'email inviata da PayPal quando hai creato il conto'; +$_MODULE['<{paypal}prestashop>back_office_f9a8989b19d6c0db2e1cdfe2d54827c2'] = 'Collega il conto bancario o la carta di credito al tuo conto PayPal: accedi alla sezione “Informazioni generali" del tuo conto.'; +$_MODULE['<{paypal}prestashop>back_office_50f33d14f129e4548c1c270fd6725a78'] = 'Opzioni di configurazione'; +$_MODULE['<{paypal}prestashop>back_office_113269a2fc804aeae74a99e168309e8b'] = 'Scegli la soluzione che vuoi utilizzare'; +$_MODULE['<{paypal}prestashop>back_office_a025e05161bb17cbab898f0e77b09a2b'] = 'Iframe'; +$_MODULE['<{paypal}prestashop>back_office_d63bbf35e72f644c8752d4f2304f89e8'] = 'Reindirizzamento completo della pagina'; +$_MODULE['<{paypal}prestashop>back_office_c7c6643c2c48aabc724f019ea0ef26cc'] = 'Scegli il template'; +$_MODULE['<{paypal}prestashop>back_office_684c41bec3eaa8b8bc929c829c602157'] = 'Scegli il pulsante di Pagamento express'; +$_MODULE['<{paypal}prestashop>back_office_76cfbdf3f35eb2368b8cbabfdd9f55db'] = 'I tuoi clienti pagano in soli 2 clic'; +$_MODULE['<{paypal}prestashop>back_office_4b7472c730be779d64f3721de7e254ba'] = 'Avrai a disposizione un ambiente di test sul tuo conto PayPal.'; +$_MODULE['<{paypal}prestashop>back_office_cebd5bbe0ffdecc270a8a324e5a277dd'] = 'Modalità Live'; +$_MODULE['<{paypal}prestashop>back_office_4245499695408b974322be6f01b0d17a'] = 'Modalità Test'; +$_MODULE['<{paypal}prestashop>back_office_4dbcb38bbbff5d4a402f2575c57a35e6'] = 'Tipo di pagamento'; +$_MODULE['<{paypal}prestashop>back_office_13e8a61381ef71ee7f101ded231c9628'] = 'Se attivi la modalità Test'; +$_MODULE['<{paypal}prestashop>back_office_588a39011a111cf61f2230841807f04c'] = 'Non potrai accettare pagamenti'; +$_MODULE['<{paypal}prestashop>back_office_97ce37634025467f01c4eec75c93eda6'] = 'Dovrai tornare alla pagina PayPal e completare il terzo passaggio prima di andare live.'; +$_MODULE['<{paypal}prestashop>back_office_bfbf9731adfef44a1f1a5dc048f33a20'] = 'Dovrai tornare alla pagina PayPal e completare il terzo passaggio prima di andare live.'; +$_MODULE['<{paypal}prestashop>back_office_0693f3a913aa574276ae343ccdb15a7d'] = 'Devi avere competenze informatiche'; +$_MODULE['<{paypal}prestashop>back_office_ff0d39d63c036426d6833917d512ef22'] = 'Sei sicuro di voler attivare la modalità test ?'; +$_MODULE['<{paypal}prestashop>back_office_980d7b730b063eabd43e8954e4e072ad'] = 'Complimenti.'; +$_MODULE['<{paypal}prestashop>back_office_bb945e9f42acb423adb3d7535d491444'] = 'Ora puoi ricevere pagamenti con PayPal.'; +$_MODULE['<{paypal}prestashop>back_office_10479c32ebaae1b49b512189d88e9fdd'] = 'Ora puoi provare i prodotti PayPal. Ricorda di tornare su questa pagina e attivare la modalità live per iniziare ad accettare pagamenti.'; +$_MODULE['<{paypal}prestashop>back_office_9dff3a2f8c5760586559e4f28223d7ee'] = 'Per ricevere i pagamenti online, devi completare il terzo passaggio.'; +$_MODULE['<{paypal}prestashop>about_e816e21c1c8e0eba0620fa3df6bd6795'] = 'Che cos\'è PayPal?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal, leader di fiducia nei pagamenti online, consente ad acquirenti e aziende di inviare e ricevere pagamenti online. PayPal vanta oltre 100 milioni di conti in 190 Paesi e territori. È accettato dai commercianti di tutto il mondo, dentro e fuori di eBay.'; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = 'E\' sicuro?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal consente di proteggere i dati della carta di credito con la sicurezza dei leader di settore e dei sistemi di prevenzione delle frodi. Quando utilizzi PayPal, le tue informazioni finanziarie non vengono mai condivise con il commerciante.'; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = 'Perché utilizzare PayPal?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = 'Fai acquisti o invia denaro con PayPal - è gratis'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Fai acquisti e paga comodamente salvando le tue informazioni con PayPal'; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'PayPal è accettato da milioni di aziende in tutto il mondo ed è il metodo di pagamento preferito su eBay'; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = 'Inizia a utilizzare PayPal oggi stesso!'; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Il tuo carrello'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Indietro'; +$_MODULE['<{paypal}prestashop>order-confirmation_fb077ecba55e5552916bde26d8b9e794'] = 'Conferma ordine'; +$_MODULE['<{paypal}prestashop>order-confirmation_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Il tuo numero di ordine è:'; +$_MODULE['<{paypal}prestashop>order-confirmation_4082ea29b4f196c4f60533500139725a'] = 'Segui il mio ordine'; +$_MODULE['<{paypal}prestashop>order-confirmation_9390390581f54c65d6acfc8da4e17362'] = 'Torna agli ordini'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Paga con PayPal'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Il tuo ordine'; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'è completo.'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'Hai scelto il metodo PayPal.'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Il tuo ordine verrà inviato al più presto.'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Per eventuali domande o per ulteriori informazioni, contatta la nostra'; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'assistenza clienti'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_abstract_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Si accettano pagamenti con carte di credito e prepagate (Visa, MasterCard, Amex, Aurora) associate al conto PayPal'; +$_MODULE['<{paypal}prestashop>paypal_abstract_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Sei sicuro di voler cancellare i tuoi dati?'; +$_MODULE['<{paypal}prestashop>paypal_abstract_32af90c3cfef1bacf43b0c3a8f60a4da'] = 'Il denaro è stato recuperato'; +$_MODULE['<{paypal}prestashop>paypal_abstract_d238649ac5ec14afc894fad36c0b50fc'] = 'La richiesta di recupero fondi non è andata a buon fine, vedi il messaggio nella cronologia.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_05b998de2c4fb46a7bdd37bd378b81d9'] = 'La convalida è stata eseguita, vedi il messaggio nella cronologia.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_aeca7e93a1b3d77e38c3cffa131774d5'] = 'Il rimborso è stato completato'; +$_MODULE['<{paypal}prestashop>paypal_abstract_cba030a50c8a99c7e224adbe1cf58544'] = 'La richiesta di rimborso non è andata a buon fine, vedi il messaggio nella cronologia.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_20fda49ece75d93bea97648ab1f1f1cf'] = 'Annulla i risultati per i prodotti:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_e5d5d9f40763cfe6549bef705e3529a7'] = 'Il messaggio di pagamento non è valido, rivedi il tuo modulo.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ee9dc1e678d54c517f481583c3fb2db8'] = 'Non è una valuta valida'; +$_MODULE['<{paypal}prestashop>paypal_abstract_eec39bf42bd135971fb2d838c67d1449'] = 'Risultato dell\'operazione di rimborso:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_2ab62d1a578713d0862b56819295630e'] = 'Rimborso PayPal completato.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_a64db959966ba8d07c8b5d9493fcc21f'] = 'Errore durante la transazione'; +$_MODULE['<{paypal}prestashop>paypal_abstract_67962779da962e3d4225055afc05e7bd'] = 'Risultato operazione di riscossione:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_8778ee03f6592d5fec9a1f2ee851e476'] = 'Ordine PayPal completato'; +$_MODULE['<{paypal}prestashop>paypal_abstract_672d40feac6437e49f771019bc330790'] = 'Stato della verifica:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_1828820cc60e36b6f9fdf60cab103ed7'] = 'Si sta attualmente utilizzando l\'indirizzo di posta elettronica predefinito, è necessario utilizzare il proprio indirizzo e-mail'; +$_MODULE['<{paypal}prestashop>validation_20dfea1a472e5be3f15f6b5f36ca335c'] = 'Problema di connessione al server di PayPal.'; +$_MODULE['<{paypal}prestashop>validation_f7799c2ded739cf3c3e9babffc5f315b'] = 'Collegamento tramite cURL non riuscita'; +$_MODULE['<{paypal}prestashop>validation_eca77e208634d52703b07672abbf16ec'] = 'Verifica fallimento (con cURL). Restituito:'; +$_MODULE['<{paypal}prestashop>validation_8358ec19f397d4cdd632688d4f79e535'] = 'Verifica fallimento (usando fsockopen). Restituito:'; +$_MODULE['<{paypal}prestashop>validation_76ee8dc73701e846f7bccdf98dae079b'] = 'Nessuna comunicazione di trasporto disponibile.'; +$_MODULE['<{paypal}prestashop>validation_bd0e34e5be6447844e6f262d51f1a9dc'] = 'Pagamento:'; +$_MODULE['<{paypal}prestashop>validation_e0395c4ce35d0b1e59ca3f2d5e260d23'] = 'Chiave Paypal \'Custom\' non specificata, non in grado di inoltrare al carrello'; +$_MODULE['<{paypal}prestashop>validation_765261b630ee773659fae89e9ad762f5'] = 'Chiave Paypal \'Txn_id\' non specificata, operazione sconosciuta'; +$_MODULE['<{paypal}prestashop>validation_01634612f84d2b7ba56ccdf467e604b7'] = 'Chiave Paypal \'Mc_currency\' non specificata, valuta sconosciuto'; +$_MODULE['<{paypal}prestashop>validation_e61f52d02b9f52fbe1fd41ed320e29c3'] = 'Carrello non trovato'; +$_MODULE['<{paypal}prestashop>validation_0617900b1aff826081d07f5a3e2e7cd0'] = 'Ordine è già stato effettuato'; +$_MODULE['<{paypal}prestashop>validation_f5209b3301a46f3057ffbf34d903e205'] = 'ID Transazione PayPal:'; +$_MODULE['<{paypal}prestashop>validation_7b19e875ff64b09d80ee05dcc84b9975'] = 'La transazione PayPal non è stata VERIFICATA.'; +$_MODULE['<{paypal}prestashop>paypal_connect_ea800e3536f81238a4cbc32eb6db4eaf'] = 'Connettiti con metodo fsockopen riuscita'; +$_MODULE['<{paypal}prestashop>paypal_express_checkout_ee9dc1e678d54c517f481583c3fb2db8'] = 'Non è una valuta valida'; +$_MODULE['<{paypal}prestashop>paypal_express_checkout_484f5a79672cebe198ebdde45a1d672f'] = 'Pacchetto regalo:'; +$_MODULE['<{paypal}prestashop>submit_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pagamento accettato.'; +$_MODULE['<{paypal}prestashop>error_425551a2289ed60c9260933d1c45ef00'] = 'Si prega di fare riferimento ai log:'; +$_MODULE['<{paypal}prestashop>express_checkout_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Paga con PayPal'; +$_MODULE['<{paypal}prestashop>payment_a40cab5994f36d4c48103a22ca082e8f'] = 'Il tuo carrello'; +$_MODULE['<{paypal}prestashop>payment_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>payment_f1d3b424cd68795ecaa552883759aceb'] = 'Riepilogo dell\'ordine'; +$_MODULE['<{paypal}prestashop>payment_dd23adc5fb6bda9c384397b31e57fc53'] = 'pagamento PayPal'; +$_MODULE['<{paypal}prestashop>payment_62d74398cb6ebaa69ab7339052ca5c92'] = 'Hai scelto di pagare con PayPal.'; +$_MODULE['<{paypal}prestashop>payment_c884ed19483d45970c5bf23a681e2dd2'] = 'Ecco un breve riepilogo del tuo ordine:'; +$_MODULE['<{paypal}prestashop>payment_e2867a925cba382f1436d1834bb52a1c'] = 'L\'importo totale del tuo ordine è'; +$_MODULE['<{paypal}prestashop>payment_1f87346a16cf80c372065de3c54c86d9'] = '(tasse incl.)'; +$_MODULE['<{paypal}prestashop>payment_8ed356c32b198c9cb2abab7c3d262b93'] = 'Accettiamo che la seguente valuta sia inviata tramite PayPal:'; +$_MODULE['<{paypal}prestashop>payment_0881a11f7af33bc1b43e437391129d66'] = 'Conferma l\'ordine cliccando su \'confermo il mio ordine\''; +$_MODULE['<{paypal}prestashop>payment_46b9e3665f187c739c55983f757ccda0'] = 'Confermo il mio ordine'; +$_MODULE['<{paypal}prestashop>payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Paga con PayPal'; +$_MODULE['<{paypal}prestashop>payment_a3f2caee6ef8e68fbd26e42d83f2bf65'] = 'Paga con il tuo conto PayPal, carta di credito (Visa, Mastercard ...), o carta di credito privata'; +$_MODULE['<{paypal}prestashop>payment_b08008a2de4331ba13f006c9bcf37b62'] = 'Paga con il tuo conto PayPal'; +$_MODULE['<{paypal}prestashop>paypal_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Paga con PayPal'; diff --git a/modules/paypal/log/braintree_log.txt b/modules/paypal/log/braintree_log.txt new file mode 100644 index 000000000..eba25fe65 --- /dev/null +++ b/modules/paypal/log/braintree_log.txt @@ -0,0 +1,6 @@ +### Braintree transaction error # 2018-11-23 09:09:40 ### +## cart id # 94 ## +## amount # 2000.000000 ## +## Braintree error message ## +# Unknown or expired payment_method_nonce. # +# error code: 91565 # message: Unknown or expired paymentMethodNonce. # \ No newline at end of file diff --git a/modules/paypal/log/index.php b/modules/paypal/log/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/log/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/logo.gif b/modules/paypal/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..8feb35cd4fe18dda96f604b16c9f4ac15456f75e GIT binary patch literal 6051 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 + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + /views/img/default_logos/default_horizontal.png + /views/img/default_logos/default_logo.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_AU/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_AU/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_AU/i/logo/PayPal_mark_60x38.gif + + https://www.paypalobjects.com/en_AU/AU/i/bnr/horizontal_solution_PP.gif + + + /views/img/default_logos/AU_vertical_solution_PP.png + + + + https://www.paypal.com/fr_FR/BE/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/fr_FR/BE/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/fr_FR/BE/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_US/BE/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/fr_FR/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/fr_FR/i/logo/PayPal_mark_60x38.gif + https://www.paypal.com/fr_FR/i/logo/PayPal_mark_180x113.gif + + + /views/img/default_logos/BE_horizontal_solution_PP.png + + + /views/img/default_logos/BE_vertical_solution_PP.png + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/zh_CN/CN/i/logo/PayPal_mark_60x38.gif + https://www.paypal.com/zh_CN/CN/i/logo/PayPal_mark_180x113.gif + + https://www.paypal.com/zh_CN/i/bnr/horizontal_solution_PP.gif + https://www.paypal.com/zh_CN/i/bnr/vertical_solution_PP.gif + + + + https://www.paypalobjects.com/webstatic/de_DE/i/de-pp-logo-100px.png + https://www.paypalobjects.com/webstatic/de_DE/i/de-pp-logo-150px.png + https://www.paypalobjects.com/webstatic/de_DE/i/de-pp-logo-200px.png + + https://www.paypalobjects.com/webstatic/de_DE/i/de-pp-logo-200px.png + /modules/paypal/views/img/default_logos/DE_horizontal_solution_PP.gif + + https://www.paypalobjects.com/webstatic/de_DE/i/de-btn-expresscheckout.gif + + https://www.paypalobjects.com/webstatic/mktg/logo/pp_cc_mark_37x23.jpg + https://www.paypalobjects.com/webstatic/mktg/logo/pp_cc_mark_74x46.jpg + https://www.paypalobjects.com/webstatic/mktg/logo/pp_cc_mark_111x69.jpg + + + /views/img/default_logos/DE_vertical_solution_PP.gif + + + + + https://www.paypal.com/es_ES/ES/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/es_ES/ES/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/es_ES/ES/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/es_ES/ES/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/es_ES/ES/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/es_ES/ES/i/logo/PayPal_mark_60x38.gif + + https://www.paypal.com/es_ES/ES/i/bnr/horizontal_solution_PP.gif + https://www.paypal.com/es_ES/ES/i/bnr/vertical_solution_PP.gif + + + + https://www.paypalobjects.com/webstatic/mktg/logo/pp_cc_mark_37x23.jpg + https://www.paypalobjects.com/webstatic/mktg/logo/pp_cc_mark_74x46.jpg + https://www.paypalobjects.com/webstatic/mktg/logo/pp_cc_mark_111x69.jpg + + https://www.paypalobjects.com/webstatic/mktg/logo/pp_cc_mark_37x23.jpg + https://www.paypalobjects.com/webstatic/mktg/logo/pp_cc_mark_74x46.jpg + https://www.paypalobjects.com/webstatic/mktg/logo/pp_cc_mark_111x69.jpg + + https://www.paypalobjects.com/webstatic/mktg/logo-center/logo_paypal_moyens_paiement_fr.jpg + + + + /views/img/default_logos/FR_vertical_solution_PP.png + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypal.com/en_GB/i/bnr/horizontal_solution_PP.gif + https://www.paypal.com/en_GB/i/bnr/vertical_solution_PP.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypal.com/en_GB/HK/i/bnr/horizontal_solution_4_hk.gif + https://www.paypalobjects.com/en_GB/HK/i/bnr/vertical_solution_4_hk.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypalobjects.com/en_US/PL/i/bnr/bnr_horizontal_solution_PP_166wx80h.gif + https://www.paypalobjects.com/en_US/PL/i/bnr/bnr_horizontal_solution_PP_166wx80h.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypal.com/en_GB/SG/i/bnr/horizontal_solution_mc_visa.gif + https://www.paypalobjects.com/en_GB/SG/i/bnr/vertical_solution_4_hk.gif + + + + https://www.paypal.com/it_IT/IT/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/it_IT/IT/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/it_IT/IT/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/it_IT/IT/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/it_IT/IT/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/it_IT/IT/i/logo/PayPal_mark_60x38.gif + + https://www.paypalobjects.com/it_IT/IT/Marketing/i/bnr/bnr_horizontal_solutiongraphic_335x80.gif + https://www.paypalobjects.com/it_IT/IT/Marketing/i/bnr/bnr_vertical_solutiongraphic_150x172.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypal.com/en_US/JP/i/bnr/horizontal_solution_4_jcb.gif + https://www.paypal.com/en_US/JP/i/bnr/vertical_solution_4_jcb.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypalobjects.com/en_GB/SG/i/bnr/horizontal_solution_4_hk.gif + https://www.paypalobjects.com/en_GB/SG/i/bnr/vertical_solution_4_hk.gif + + + + https://www.paypal.com/nl_NL/NL/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/nl_NL/NL/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/nl_NL/NL/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/nl_NL/NL/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/nl_NL/NL/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/nl_NL/NL/i/logo/PayPal_mark_60x38.gif + + https://www.paypalobjects.com/nl_NL/NL/i/bnr/horizontal_solution_PP.gif + + + + https://www.paypal.com/nl_NL/NL/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/nl_NL/NL/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/nl_NL/NL/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/nl_NL/NL/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/nl_NL/NL/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/nl_NL/NL/i/logo/PayPal_mark_60x38.gif + + https://www.paypalobjects.com/en_AU/AU/i/bnr/horizontal_solution_PP.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + + /views/img/default_logos/PL_horizontal_solution_PP.png + + + /views/img/default_logos/PL_vertical_solution_PP.png + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypalobjects.com/fr_XC/i/bnr/horizontal_solution_PPeCheck.gif + https://www.paypalobjects.com/fr_XC/i/bnr/vertical_solution_PPeCheck.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypalobjects.com/en_US/PL/i/bnr/bnr_horizontal_solution_PP_166wx80h.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + + /views/img/default_logos/RA_horizontal_solution_PP.png + + + /views/img/default_logos/RA_vertical_solution_PP.png + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + + /views/img/default_logos/RE_horizontal_solution_PP.png + + + /views/img/default_logos/RE_vertical_solution_PP.png + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypalobjects.com/en_GB/SG/i/bnr/horizontal_solution_4_hk.gif + https://www.paypalobjects.com/en_GB/SG/i/bnr/vertical_solution_4_hk.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypalobjects.com/en_GB/TH/i/bnr/horizontal_solution_4_hk.gif + https://www.paypalobjects.com/en_GB/TH/i/bnr/vertical_solution_4_hk.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypal.com/en_GB/HK/i/bnr/horizontal_solution_4_hk.gif + https://www.paypal.com/en_GB/HK/i/bnr/vertical_solution_4_hk.gif + + + + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_80x35.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_100x45.gif + https://www.paypal.com/en_GB/Marketing/i/logo/PayPal_logo_150x65.gif + + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_37x23.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_50x34.gif + https://www.paypal.com/en_GB/GB/i/logo/PayPal_mark_60x38.gif + + https://www.paypalobjects.com/fr_XC/i/bnr/horizontal_solution_PPeCheck.gif + https://www.paypalobjects.com/fr_XC/i/bnr/vertical_solution_PPeCheck.gif + + + diff --git a/modules/paypal/mails/br/error_reporting.html b/modules/paypal/mails/br/error_reporting.html new file mode 100644 index 000000000..d4d7b307d --- /dev/null +++ b/modules/paypal/mails/br/error_reporting.html @@ -0,0 +1,43 @@ + + + + + Mensagem de {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {shop_name} +
 
Hi,
 
Relatório de erro do seu módulo PayPalAPI
 
+ Um cliente encontrou um problema com o módulo PayPalAPI, veja relatório: +
 
+ {logs} +
 
+ {shop_name} provido por PrestaShop™ + +
+ + diff --git a/modules/paypal/mails/br/error_reporting.txt b/modules/paypal/mails/br/error_reporting.txt new file mode 100644 index 000000000..12949b181 --- /dev/null +++ b/modules/paypal/mails/br/error_reporting.txt @@ -0,0 +1,9 @@ + Oi, + + Relatório de erro do seu módulo PayPalAPI + + Um cliente encontrou um problem com o módulo PayPalAPI, veja relatório: + + {logs} + + {shop_url} provido por PrestaShop™ diff --git a/modules/paypal/mails/br/index.php b/modules/paypal/mails/br/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/mails/br/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/mails/de/error_reporting.html b/modules/paypal/mails/de/error_reporting.html new file mode 100644 index 000000000..cd5fe9fff --- /dev/null +++ b/modules/paypal/mails/de/error_reporting.html @@ -0,0 +1,46 @@ + + + + + Nachricht von {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{shop_name}
 
Hallo,
 
Fehlerbericht aus Ihrem PayPalAPI Modul
 
Bei einem Kunden ist ein Problem mit dem PayPalAPI Modul aufgetreten, lesen Sie den Bericht:
 
{logs}
 
{shop_name} powered with PrestaShop™
+ + \ No newline at end of file diff --git a/modules/paypal/mails/de/error_reporting.txt b/modules/paypal/mails/de/error_reporting.txt new file mode 100644 index 000000000..c8f23e331 --- /dev/null +++ b/modules/paypal/mails/de/error_reporting.txt @@ -0,0 +1,9 @@ + Hallo, + + Fehlerbericht aus Ihrem PayPalAPI Modul + + Bei einem Kunden ist ein Problem mit dem PayPalAPI Modul aufgetreten, lesen Sie den Bericht: + + {logs} + + {shop_url} powered by PrestaShop™ diff --git a/modules/paypal/mails/de/index.php b/modules/paypal/mails/de/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/mails/de/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/mails/en/error_reporting.html b/modules/paypal/mails/en/error_reporting.html new file mode 100644 index 000000000..139e8749b --- /dev/null +++ b/modules/paypal/mails/en/error_reporting.html @@ -0,0 +1,42 @@ + + + + + Message from {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {shop_name} +
 
Hi,
 
Error reporting from your PayPalAPI module
 
+ A client has encountered a problem with the module PayPalAPI, see the report: +
 
+ {logs} +
 
+ {shop_name} powered with PrestaShop™ +
+ + diff --git a/modules/paypal/mails/en/error_reporting.txt b/modules/paypal/mails/en/error_reporting.txt new file mode 100644 index 000000000..802ac51ab --- /dev/null +++ b/modules/paypal/mails/en/error_reporting.txt @@ -0,0 +1,9 @@ + Hi, + + Error reporting from your PayPalAPI module + + A client has encountered a problem with the module PayPalAPI, see the report: + + {logs} + + {shop_url} powered by PrestaShop™ diff --git a/modules/paypal/mails/en/index.php b/modules/paypal/mails/en/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/mails/en/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/mails/es/error_reporting.html b/modules/paypal/mails/es/error_reporting.html new file mode 100644 index 000000000..8ce92cc22 --- /dev/null +++ b/modules/paypal/mails/es/error_reporting.html @@ -0,0 +1,46 @@ + + + + + Message from {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{shop_name}
 
Hola,
 
Informe de error a partir de su módulo PayPalAPI
 
Un cliente ha encontrado un problema con el módulo PayPalAPI:
 
{logs}
 
{shop_name} lanzado por PrestaShop™
+ + \ No newline at end of file diff --git a/modules/paypal/mails/es/error_reporting.txt b/modules/paypal/mails/es/error_reporting.txt new file mode 100644 index 000000000..a293fc640 --- /dev/null +++ b/modules/paypal/mails/es/error_reporting.txt @@ -0,0 +1,9 @@ + Hola, + + Informe de error a partir de su módulo PayPalAPI + + Un cliente ha encontrado un problema con el módulo PayPalAPI: + + {logs} + + {shop_url} lanzado por PrestaShop™ diff --git a/modules/paypal/mails/es/index.php b/modules/paypal/mails/es/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/mails/es/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/mails/fr/error_reporting.html b/modules/paypal/mails/fr/error_reporting.html new file mode 100644 index 000000000..4ff398be4 --- /dev/null +++ b/modules/paypal/mails/fr/error_reporting.html @@ -0,0 +1,42 @@ + + + + + Message from {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {shop_name} +
 
Bonjour,
 
Rapport d'erreur à partir de votre module PayPalAPI
 
+ Un client a rencontré un problème avec le module PayPalAPI: +
 
+ {logs} +
 
+ {shop_name} propulsé par PrestaShop™ +
+ + \ No newline at end of file diff --git a/modules/paypal/mails/fr/error_reporting.txt b/modules/paypal/mails/fr/error_reporting.txt new file mode 100644 index 000000000..87cf56505 --- /dev/null +++ b/modules/paypal/mails/fr/error_reporting.txt @@ -0,0 +1,9 @@ + Bonjour, + + Rapport d'erreur à partir de votre module PayPalAPI + + Un client a rencontré un problème avec le module PayPalAPI: + + {logs} + + {shop_url} propulsé par PrestaShop™ diff --git a/modules/paypal/mails/fr/index.php b/modules/paypal/mails/fr/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/mails/fr/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/mails/index.php b/modules/paypal/mails/index.php new file mode 100644 index 000000000..49f4e1b29 --- /dev/null +++ b/modules/paypal/mails/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/mails/it/error_reporting.html b/modules/paypal/mails/it/error_reporting.html new file mode 100644 index 000000000..e13a5ed80 --- /dev/null +++ b/modules/paypal/mails/it/error_reporting.html @@ -0,0 +1,46 @@ + + + + + Messaggio da {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{shop_name}
Salve,
Errore dal tuo modulo PayPalAPI
Un cliente ha avuto un problema con il modulo PayPalAPI, vedi il rapporto:
{logs}
{shop_name} powered with PrestaShop™
+ + \ No newline at end of file diff --git a/modules/paypal/mails/it/error_reporting.txt b/modules/paypal/mails/it/error_reporting.txt new file mode 100644 index 000000000..56b40ddf2 --- /dev/null +++ b/modules/paypal/mails/it/error_reporting.txt @@ -0,0 +1,9 @@ + Salve, + + Errore dal tuo modulo PayPalAPI + + Un cliente ha avuto un problema con il modulo PayPalAPI, vedi il rapporto: + + {logs} + + {shop_url} powered by PrestaShop™ diff --git a/modules/paypal/mails/it/index.php b/modules/paypal/mails/it/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/mails/it/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/mails/nl/index.php b/modules/paypal/mails/nl/index.php new file mode 100644 index 000000000..187d3649c --- /dev/null +++ b/modules/paypal/mails/nl/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/mails/pl/index.php b/modules/paypal/mails/pl/index.php new file mode 100644 index 000000000..187d3649c --- /dev/null +++ b/modules/paypal/mails/pl/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/mails/pt/error_reporting.html b/modules/paypal/mails/pt/error_reporting.html new file mode 100644 index 000000000..d4d7b307d --- /dev/null +++ b/modules/paypal/mails/pt/error_reporting.html @@ -0,0 +1,43 @@ + + + + + Mensagem de {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {shop_name} +
 
Hi,
 
Relatório de erro do seu módulo PayPalAPI
 
+ Um cliente encontrou um problema com o módulo PayPalAPI, veja relatório: +
 
+ {logs} +
 
+ {shop_name} provido por PrestaShop™ + +
+ + diff --git a/modules/paypal/mails/pt/error_reporting.txt b/modules/paypal/mails/pt/error_reporting.txt new file mode 100644 index 000000000..12949b181 --- /dev/null +++ b/modules/paypal/mails/pt/error_reporting.txt @@ -0,0 +1,9 @@ + Oi, + + Relatório de erro do seu módulo PayPalAPI + + Um cliente encontrou um problem com o módulo PayPalAPI, veja relatório: + + {logs} + + {shop_url} provido por PrestaShop™ diff --git a/modules/paypal/mails/pt/index.php b/modules/paypal/mails/pt/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/mails/pt/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/nl.php b/modules/paypal/nl.php new file mode 100644 index 000000000..fd126a25b --- /dev/null +++ b/modules/paypal/nl.php @@ -0,0 +1,182 @@ +paypal_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Acceptez le paiements par cartes de crédits (CB, Visa, MasterCard, Amex, Aurore, Cofinoga, 4 stars) avec PayPal.'; +$_MODULE['<{paypal}prestashop>paypal_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Êtes-vous certain de vouloir supprimer vos informations ?'; +$_MODULE['<{paypal}prestashop>paypal_8b57f95f1e9cf09dc028fa5a671781ff'] = 'Toutes les fonctionnalités du module PayPal API sont incluses dans le nouveau module PayPal. Avant tout, pour ne pas rencontrer de conflits, veuillez ne pas utiliser ou supprimer le module PayPal API.'; +$_MODULE['<{paypal}prestashop>paypal_c91f1fb5e06286c3e0a33fc552dffbea'] = 'Vous devez renseigner vos identifiants PayPal Integral pour que votre thème mobile fonctionne correctement.'; +$_MODULE['<{paypal}prestashop>paypal_bd6b3cca1e559117a964cdfab6a977cf'] = 'Le thème mobile fonctionne seulement avec la solution de paiement mobile PayPal. Veuillez activer le module pour bénéficier de possibilités de paiements.'; +$_MODULE['<{paypal}prestashop>paypal_c9d8a8d3c76c69e9a5ba6387acb8655a'] = 'Avant d\'utiliser le module vous devez installer le module \"Rétro-compatibilité\".'; +$_MODULE['<{paypal}prestashop>paypal_ea5eb3f904bf42377277255cbd0e2251'] = 'Pour fonctionner correctement le module \"Rétro-compatibilité\" doit être activé.'; +$_MODULE['<{paypal}prestashop>paypal_48878e69ef59b9e9d2d9a8c18e4de520'] = 'Pour fonctionner correctement ce module requiert le module \"Rétro-compatibilité\" v'; +$_MODULE['<{paypal}prestashop>paypal_20fda49ece75d93bea97648ab1f1f1cf'] = 'Annulation des produits :'; +$_MODULE['<{paypal}prestashop>paypal_90ab0cfd410722553c79e614207a789a'] = 'Certains champs sont vides.'; +$_MODULE['<{paypal}prestashop>paypal_ce0e2b401002ca796d2e8aca7deb8f00'] = 'Les champs des identifiants ne peuvent être vides'; +$_MODULE['<{paypal}prestashop>paypal_3f7145179c909f0e87a911a3171986b6'] = 'Le champs E-mail professionnel ne peut être vide'; +$_MODULE['<{paypal}prestashop>paypal_e5d5d9f40763cfe6549bef705e3529a7'] = 'Le message de paiement n\'est pas valide, veuillez vérifier votre module'; +$_MODULE['<{paypal}prestashop>paypal_ee9dc1e678d54c517f481583c3fb2db8'] = 'Devise invalide'; +$_MODULE['<{paypal}prestashop>paypal_eec39bf42bd135971fb2d838c67d1449'] = 'Opération de remboursement :'; +$_MODULE['<{paypal}prestashop>paypal_2ab62d1a578713d0862b56819295630e'] = 'Remboursement PayPal confirmé !'; +$_MODULE['<{paypal}prestashop>paypal_a64db959966ba8d07c8b5d9493fcc21f'] = 'Erreur de transaction !'; +$_MODULE['<{paypal}prestashop>paypal_67962779da962e3d4225055afc05e7bd'] = 'Résultat de la capture :'; +$_MODULE['<{paypal}prestashop>paypal_8778ee03f6592d5fec9a1f2ee851e476'] = 'Commande terminée avec PayPal !'; +$_MODULE['<{paypal}prestashop>paypal_672d40feac6437e49f771019bc330790'] = 'Statu de la vérification :'; +$_MODULE['<{paypal}prestashop>paypal_1828820cc60e36b6f9fdf60cab103ed7'] = 'Vous utilisez actuellement l\'adresse PayPal par défaut, veuillez entrer votre propre adresse.'; +$_MODULE['<{paypal}prestashop>paypal_connect_d1f14cc4a2dade80c92421d26422fea0'] = 'Ouvre une nouvelle connection vers'; +$_MODULE['<{paypal}prestashop>paypal_connect_94a27811a721ef512ad7bfa06cab34e0'] = 'Echec de la connection avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_70215486455daee13382c68b1a230b82'] = 'Connection réussie avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_e4c4ad49bced42265b5facc2175cdafd'] = 'Envoie des paramètres :'; +$_MODULE['<{paypal}prestashop>paypal_connect_445583f6641da98fc7ac8fd9d13a564b'] = 'Echec de l\'envoie avec la méthode cURL ! Erreur :'; +$_MODULE['<{paypal}prestashop>paypal_connect_ef4fbf36eaa2083442d386990ba063c2'] = 'Envoie réussi avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_bf059c9751bb1a20b449b7917b1df374'] = 'Echec de la connection avec la méthode fsockopen'; +$_MODULE['<{paypal}prestashop>paypal_connect_6e9aa4cb541e09b07602d4ea96080811'] = 'Echec de l\'envoie avec la méthode fsockopen ! Erreur :'; +$_MODULE['<{paypal}prestashop>paypal_connect_842a183be225d415b2b4375ba1dd1c94'] = 'Envoie réussi avec la méthode fsockopen'; +$_MODULE['<{paypal}prestashop>paypal_lib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'Réponse PayPal :'; +$_MODULE['<{paypal}prestashop>submit_67a3fcdb7708219b9d5d6269ad8c4a86'] = 'Une erreur est survenue pendant le processus de paiement.'; +$_MODULE['<{paypal}prestashop>payment_d141a42a5e72c871a3116414bb5c64c1'] = 'Création du nouveau panier impossible'; +$_MODULE['<{paypal}prestashop>payment_5b5adcef5e3f2e5e1b6f60eb3e7e41ed'] = 'Une erreur est survenue :'; +$_MODULE['<{paypal}prestashop>payment_dca16503c563d9fdec70d18f2ab653a4'] = 'Erreur lors de la préparation du paiement par Express Checkout'; +$_MODULE['<{paypal}prestashop>payment_51da74120dd5e11817ef21e27d2599bc'] = 'Impossible de créer un nouvel utilisateur'; +$_MODULE['<{paypal}prestashop>payment_bcf08b34ab427cb871635151c6976eb0'] = 'Impossible de créer la nouvelle adresse'; +$_MODULE['<{paypal}prestashop>payment_ca5cecfc8fd8e585ba1e684757168158'] = 'Impossible de mettre à jour le panier'; +$_MODULE['<{paypal}prestashop>payment_ada2b5d5bbf3065de283d61526141780'] = 'En attente de capture du paiement.'; +$_MODULE['<{paypal}prestashop>payment_36ec50c0e914dd2fb48a1b27540512ce'] = 'Paiement accepté.'; +$_MODULE['<{paypal}prestashop>payment_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Le prix payé sur PayPal est différent du prix renseigné sur la boutique.'; +$_MODULE['<{paypal}prestashop>payment_98825385aadb1d0dd0fd133ef8acd23d'] = 'Impossible de créer la commande'; +$_MODULE['<{paypal}prestashop>payment_085b78e060c3ef4cc37bd25abd06ff66'] = 'Le panier a changé depuis la dernière tentative de paiement. Veuillez recommencer le processus de paiement s\'il vous plait.'; +$_MODULE['<{paypal}prestashop>payment_572da7ef1411f2a12409e752f3eb2f7a'] = 'Votre panier et vide.'; +$_MODULE['<{paypal}prestashop>process_ee9dc1e678d54c517f481583c3fb2db8'] = 'Devise invalide.'; +$_MODULE['<{paypal}prestashop>process_484f5a79672cebe198ebdde45a1d672f'] = 'Emballage cadeau.'; +$_MODULE['<{paypal}prestashop>notifier_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Le prix payé sur PayPal est différent du prix renseigné sur la boutique.'; +$_MODULE['<{paypal}prestashop>notifier_572f9af7615560af2cba038cc1948287'] = 'Panier mis à jour, merci de ré-essayer.'; +$_MODULE['<{paypal}prestashop>notifier_36ec50c0e914dd2fb48a1b27540512ce'] = 'Paiement accepté.'; +$_MODULE['<{paypal}prestashop>back_office_e9f91995a69772872f7a386c6909403d'] = 'De ideale manier om te betalen en betaald te worden.'; +$_MODULE['<{paypal}prestashop>back_office_ad78c46c5d6edc542ad2153e23518478'] = 'Miljoenen kopers kiezen PayPal vanwege de veilige en snelle koopervaring'; +$_MODULE['<{paypal}prestashop>back_office_ae3cebe661e92cdfd12516419fef4f2d'] = 'Télécharger le'; +$_MODULE['<{paypal}prestashop>back_office_e73756d0d2306110f29ccf28cb69c412'] = 'Guide d\'intégration de PayPal'; +$_MODULE['<{paypal}prestashop>back_office_6506302a6e11077ecbc04b5932a65c4c'] = 'sur PrestaShop et suivez les étapes pas à pas'; +$_MODULE['<{paypal}prestashop>back_office_516710946f5fb35af6496ad0b7582980'] = 'Het openen van een PayPal-rekening neemt maar enkele minuten in beslag<'; +$_MODULE['<{paypal}prestashop>back_office_56564e0a106b0e0e2dc57b5a105ed639'] = 'Land'; +$_MODULE['<{paypal}prestashop>back_office_eb399bcaca686f8609137153307eecf1'] = 'Wijzig'; +$_MODULE['<{paypal}prestashop>back_office_a7bb58222222b064f0721e6e0fe4c486'] = 'Selecteer uw land'; +$_MODULE['<{paypal}prestashop>back_office_93140d7ca5171ede9b8a94f07f0363ec'] = 'Heeft u al een zakelijke PayPal-rekening'; +$_MODULE['<{paypal}prestashop>back_office_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Non'; +$_MODULE['<{paypal}prestashop>back_office_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{paypal}prestashop>back_office_73878c19cdc6ef2ab0d0fac6943cc958'] = 'Hulp nodig?'; +$_MODULE['<{paypal}prestashop>back_office_240fdce652f09de611fc997971dea41e'] = 'Kies het product wat bij u past'; +$_MODULE['<{paypal}prestashop>back_office_d59048f21fd887ad520398ce677be586'] = 'Meer info'; +$_MODULE['<{paypal}prestashop>back_office_cd5ee0ac6f3296c551e631268af2915b'] = 'U wilt betalingen via creditcard en bankoverschrijving accepteren?'; +$_MODULE['<{paypal}prestashop>back_office_961f2247a2070bedff9f9cd8d64e2650'] = 'Kies'; +$_MODULE['<{paypal}prestashop>back_office_d30abcb258277c6028d040b073276da1'] = 'PayPal Standard Checkout'; +$_MODULE['<{paypal}prestashop>back_office_4d647b4406dba3d579ac2ef165c05196'] = 'als u binnen enkele minuten met online verkopen wilt beginnen.'; +$_MODULE['<{paypal}prestashop>back_office_e331bc26b25860e255aac1225fc5c639'] = 'Geen vaste, opstart- of annuleringskosten: enkel een laag tarief voor het ontvangen van betalingen.'; +$_MODULE['<{paypal}prestashop>back_office_53f61475efdd0c433443262f0d7cdcbf'] = 'PayPal Plus'; +$_MODULE['<{paypal}prestashop>back_office_69d7974bb0bacddb986bbf8d734238c4'] = 'Wilt u PayPal als aanvulling op uw huidige betaalsysteem?'; +$_MODULE['<{paypal}prestashop>back_office_2e3e721e530a957f81d5b5dcff0bf0e1'] = 'Express Checkout'; +$_MODULE['<{paypal}prestashop>back_office_cc84ef735c1a521fe731773a700a87ec'] = 'u vergroot uw omzet en ontvangt uw betaling in slechts drie klikken (ook op mobiele apparaten).'; +$_MODULE['<{paypal}prestashop>back_office_e8c466b9c179e229ae67f339a8e2476a'] = 'Open nu uw zakelijke PayPal-rekening.'; +$_MODULE['<{paypal}prestashop>back_office_d67850bd126f070221dcfd5fa6317043'] = 'Rekening openen'; +$_MODULE['<{paypal}prestashop>back_office_b26917587d98330d93f87808fc9d7267'] = 'Rekening openen'; +$_MODULE['<{paypal}prestashop>back_office_5c57ba1861701e5a630dd5006acb30e2'] = 'Zodra u uw PayPal-rekening geopend heeft, kunt u op deze pagina stap 3 voltooien'; +$_MODULE['<{paypal}prestashop>back_office_b4e69ef9df8f20b984309ee73f78953b'] = 'Vul uw identificatiegegevens van PayPal in de PrestaShop omgeving'; +$_MODULE['<{paypal}prestashop>back_office_2ffe0ef69fd047d0884f98faa52c1bd3'] = 'Vraag mijn identificatiegegevens op bij PayPal'; +$_MODULE['<{paypal}prestashop>back_office_36461ebc9ebcd269f3909fa49a4b0a57'] = 'Klik op de knop "Vraag mijn identificatiegegevens op bij PayPal" en kopieer je gebruikersnaam en wachtwoord uit het informatieveld in de onderstaande velden.'; +$_MODULE['<{paypal}prestashop>back_office_266ba5df48aed68af0cce5f735035291'] = 'API gebruikersnaam'; +$_MODULE['<{paypal}prestashop>back_office_37e31370e4ab230ff6fba12cc6390aff'] = 'API wachtwoord'; +$_MODULE['<{paypal}prestashop>back_office_195ca49498f0b30d3a8967eff22fa9b3'] = 'Handtekening'; +$_MODULE['<{paypal}prestashop>back_office_74cec07ee40362f7605816fdcfbf194d'] = 'Kijk de gegevens die je net hebt gekopieerd goed na. Sommige velden bevatten namelijk veel karakters.'; +$_MODULE['<{paypal}prestashop>back_office_90912596e1deb86b1f39bb30013e2f8b'] = 'Use personnalisation (uses your logo and your shop name on Paypal) :'; +$_MODULE['<{paypal}prestashop>back_office_67f0dc0ff3d7b1fa4bb975b8831f54a9'] = 'Indicate the email you used when you signed up for a PayPal Business account'; +$_MODULE['<{paypal}prestashop>back_office_671bb93f14482ae559c736818605f445'] = 'API business e-mail'; +$_MODULE['<{paypal}prestashop>back_office_0e55f1779fe0d4169ab51bcb0ade306f'] = 'Om de configuratie van je PayPal account te finaliseren zijn onderstaande acties noodzakelijk'; +$_MODULE['<{paypal}prestashop>back_office_258da42945130420ae78d4494d549e42'] = 'Volg de procedure die via PayPal verstuurd is tijdens het aanmaken van je account om je e-mail te bevestigen.'; +$_MODULE['<{paypal}prestashop>back_office_f9a8989b19d6c0db2e1cdfe2d54827c2'] = 'Koppel je PayPal account aan een bankrekening of bankkaart. Om dit te doen log je in in je PayPal account en ga je naar de sectie "eerste stappen".'; +$_MODULE['<{paypal}prestashop>back_office_50f33d14f129e4548c1c270fd6725a78'] = 'PayPal configuratieopties'; +$_MODULE['<{paypal}prestashop>back_office_113269a2fc804aeae74a99e168309e8b'] = 'Kies de betaaloplossing die u wilt gebruiken'; +$_MODULE['<{paypal}prestashop>back_office_a025e05161bb17cbab898f0e77b09a2b'] = 'Iframe'; +$_MODULE['<{paypal}prestashop>back_office_d63bbf35e72f644c8752d4f2304f89e8'] = 'Full page redirect'; +$_MODULE['<{paypal}prestashop>back_office_c7c6643c2c48aabc724f019ea0ef26cc'] = 'Kies uw sjabloon'; +$_MODULE['<{paypal}prestashop>back_office_684c41bec3eaa8b8bc929c829c602157'] = 'Gebruik PayPal Express Checkout Shortcut'; +$_MODULE['<{paypal}prestashop>back_office_76cfbdf3f35eb2368b8cbabfdd9f55db'] = 'Geef je klanten de mogelijkheid om in twee stappen te betalen'; +$_MODULE['<{paypal}prestashop>back_office_748eadce9cf4f2bde207b63c5441da07'] = 'Utilisez la Fonction PayPal Login'; +$_MODULE['<{paypal}prestashop>back_office_cded4ac9f77c68c750c243af1f5263c5'] = '(*voir le'; +$_MODULE['<{paypal}prestashop>back_office_606d8f704cf61d29bffd5195f28af29e'] = 'Guide d\'Intégration'; +$_MODULE['<{paypal}prestashop>back_office_a1694ad810c4ac5b56b59c47db01cb05'] = 'et suivre les étapes de mise en place'; +$_MODULE['<{paypal}prestashop>back_office_3650f874df7e9c6e822a872d02cee6d5'] = 'Cette fonction permet à vos clients de se connecter avec leurs identifiants PayPal pour raccourcir le tunnel d\'achat'; +$_MODULE['<{paypal}prestashop>back_office_9be4e88898c4e88363208d2472f4a406'] = 'Renseignez les informations liées à votre compte PayPal'; +$_MODULE['<{paypal}prestashop>back_office_4ff2e716a7d06ce5274b4090b39abad3'] = 'Voir'; +$_MODULE['<{paypal}prestashop>back_office_8646a5d7b2817d30950357da8d80a11f'] = 'le Guide d\'Intégration'; +$_MODULE['<{paypal}prestashop>back_office_cebd5bbe0ffdecc270a8a324e5a277dd'] = 'Productieomgeving (aanbevolen)'; +$_MODULE['<{paypal}prestashop>back_office_4245499695408b974322be6f01b0d17a'] = 'Testomgeving'; +$_MODULE['<{paypal}prestashop>back_office_4dbcb38bbbff5d4a402f2575c57a35e6'] = 'Payment type'; +$_MODULE['<{paypal}prestashop>back_office_0eae1e85287701bf8071e06bfb65b933'] = 'Kies de manier waarop je betaling wordt verwerkt (automatisch of handmatige autorisatie).'; +$_MODULE['<{paypal}prestashop>back_office_339bb3a6443078c1fd5a88d0a0d97096'] = 'Direct sales (aanbevolen)'; +$_MODULE['<{paypal}prestashop>back_office_9a901d2379aac144a2693dc7bf5c8caf'] = 'Authorization/Manual capture (automatische of handmatige autorisatie)'; +$_MODULE['<{paypal}prestashop>back_office_13e8a61381ef71ee7f101ded231c9628'] = 'Bij activeren van de test-modus'; +$_MODULE['<{paypal}prestashop>back_office_588a39011a111cf61f2230841807f04c'] = 'Bent u nog niet in staat om betalingen te accepteren.'; +$_MODULE['<{paypal}prestashop>back_office_97ce37634025467f01c4eec75c93eda6'] = 'Dient u, voor u live kunt gaan, de PayPal-identificatie gegevens in te vullen bij stap 3.'; +$_MODULE['<{paypal}prestashop>back_office_bfbf9731adfef44a1f1a5dc048f33a20'] = 'Dient u kennis van programmeren of een programmeur beschikbaar te hebben.'; +$_MODULE['<{paypal}prestashop>back_office_d8fd35f628f2099aeaf3e5253e4acdba'] = 'Meer info'; +$_MODULE['<{paypal}prestashop>back_office_2d801c24938b12e4ca9a2cf9b980c759'] = 'Erreur !'; +$_MODULE['<{paypal}prestashop>capture_81e826adb70e2e6b189c2eef739d52d4'] = 'Capture PayPal'; +$_MODULE['<{paypal}prestashop>capture_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informations :'; +$_MODULE['<{paypal}prestashop>capture_ce64b2ea82cf4fa861a6512e2c32b84b'] = 'Les fonds sont prêts à être capturés avant expédition'; +$_MODULE['<{paypal}prestashop>capture_99e64593868df2b7b32231c1ae5ddc04'] = 'Récupérer les fonds'; +$_MODULE['<{paypal}prestashop>refund_8ba079f305b81b172792bc0469b6a690'] = 'Remboursement PayPal'; +$_MODULE['<{paypal}prestashop>refund_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informations :'; +$_MODULE['<{paypal}prestashop>refund_016e1f278eccd700eaf33f74a501d050'] = 'Paiement accepté'; +$_MODULE['<{paypal}prestashop>refund_a8b1cc445942a2e1a7d7cca641c86d67'] = 'Lorsque vous remboursez un produit, un remboursement partiel est effectué sauf si vous sélectionnez l\'option \"Générer un bon de réduction\"'; +$_MODULE['<{paypal}prestashop>refund_729a51874fe901b092899e9e8b31c97a'] = 'Etes-vous sûr ?'; +$_MODULE['<{paypal}prestashop>refund_c2a5e2e23d8ec9cad779d657b7d33fc1'] = 'Remboursement total de la transaction'; +$_MODULE['<{paypal}prestashop>validation_b630aa9b5e25da971949cae62dd109aa'] = 'Validation PayPal'; +$_MODULE['<{paypal}prestashop>validation_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informations :'; +$_MODULE['<{paypal}prestashop>validation_9119a92adbbf6c67bfb8a3aee0bdb720'] = 'Capture en attente - Pas d\'expédition'; +$_MODULE['<{paypal}prestashop>validation_c14eb95a724174f336b8ffdd98ef2f35'] = 'Paiement en attente - Pas d\'expédition'; +$_MODULE['<{paypal}prestashop>validation_5b18ff32c2aaaf4b79bdead10b10fe29'] = 'Vérifier l\'état du paiement'; +$_MODULE['<{paypal}prestashop>about_e816e21c1c8e0eba0620fa3df6bd6795'] = 'Qu\'est-ce que PayPal ?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal, leader incontesté en matière de paiement en ligne, permet aux acheteurs et aux vendeurs d\'envoyer et de recevoir des paiements en ligne. PayPal compte plus de 100 millions de comptes dans 190 pays et régions du monde. Il est accepté par les marchands partout, à la fois sur eBay et en dehors d\'eBay.'; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = 'Est-ce un service sécurisé ?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal contribue à protéger les informations concernant votre carte bancaire grâce aux meilleurs systèmes présents sur le marché pour la sécurité et la prévention contre la fraude. Lorsque vous utilisez PayPal, vos informations financières ne sont jamais communiquées au marchand.'; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = 'Pourquoi utiliser PayPal ?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = 'Effectuez des achats ou envoyez des paiements avec PayPal : c\'est gratuit.'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Achetez et payez en toute tranquillité en enregistrant vos informations auprès de PayPal.'; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'PayPal est accepté par des millions de marchands dans le monde et constitue le mode de paiement le plus utilisé sur eBay.'; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = 'Utilisez PayPal dès aujourd\'hui !'; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Votre panier'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>error_f47106270a2928f350f357e255a2c2ac'] = 'Veuillez contacter le marchant:'; +$_MODULE['<{paypal}prestashop>error_d5860edcd3078f86ee963c27654bc6cf'] = 'Montant total de la transaction (taxes incl) :'; +$_MODULE['<{paypal}prestashop>error_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'L\'ID de votre commande est :'; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Précédent'; +$_MODULE['<{paypal}prestashop>order-confirmation_fb077ecba55e5552916bde26d8b9e794'] = 'Confirmation de commande'; +$_MODULE['<{paypal}prestashop>order-confirmation_d5860edcd3078f86ee963c27654bc6cf'] = 'Total de la transaction (TTC) :'; +$_MODULE['<{paypal}prestashop>order-confirmation_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Votre numéro de commande est le :'; +$_MODULE['<{paypal}prestashop>order-confirmation_6e860dc1cf94ca08b3fd99993aa2dc68'] = 'Votre numéro de transaction PayPal est :'; +$_MODULE['<{paypal}prestashop>order-confirmation_4082ea29b4f196c4f60533500139725a'] = 'Suivre ma commande'; +$_MODULE['<{paypal}prestashop>order-confirmation_9390390581f54c65d6acfc8da4e17362'] = 'Retour aux commandes'; +$_MODULE['<{paypal}prestashop>order-summary_a40cab5994f36d4c48103a22ca082e8f'] = 'Votre panier'; +$_MODULE['<{paypal}prestashop>order-summary_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>order-summary_f1d3b424cd68795ecaa552883759aceb'] = 'Résumé de la commande'; +$_MODULE['<{paypal}prestashop>order-summary_dd23adc5fb6bda9c384397b31e57fc53'] = 'Paiement par PayPal'; +$_MODULE['<{paypal}prestashop>order-summary_62d74398cb6ebaa69ab7339052ca5c92'] = 'Vous avez choisi de payer par PayPal'; +$_MODULE['<{paypal}prestashop>order-summary_c884ed19483d45970c5bf23a681e2dd2'] = 'Voici un résumé de votre commande'; +$_MODULE['<{paypal}prestashop>order-summary_0c458988127eb2150776881e2ef3f0c4'] = 'Adresse de livraison'; +$_MODULE['<{paypal}prestashop>order-summary_e2867a925cba382f1436d1834bb52a1c'] = 'Le montant total de votre commande est'; +$_MODULE['<{paypal}prestashop>order-summary_1f87346a16cf80c372065de3c54c86d9'] = '(tax incl.)'; +$_MODULE['<{paypal}prestashop>order-summary_8ed356c32b198c9cb2abab7c3d262b93'] = 'Nous acceptons les devises suivantes avec PayPal :'; +$_MODULE['<{paypal}prestashop>order-summary_0881a11f7af33bc1b43e437391129d66'] = 'Veuillez confirmer votre commande en cliquant sur \"Je confirme ma commande\"'; +$_MODULE['<{paypal}prestashop>order-summary_46b9e3665f187c739c55983f757ccda0'] = 'Je confirme ma commande'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payer par PayPal'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'est bien enregistrée.'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'Vous avez choisi de payer avec PayPal.'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Votre commande vous sera envoyée très prochainement.'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toute question ou information complémentaire merci de contacter notre'; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'support client'; +$_MODULE['<{paypal}prestashop>express_checkout_payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payez avec PayPal'; +$_MODULE['<{paypal}prestashop>express_checkout_shortcut_form_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payez avec PayPal'; +$_MODULE['<{paypal}prestashop>integral_evolution_payment_ecab922bc1f9b5726e2a6deb4acaec4e'] = 'Retour au site du marchant.'; diff --git a/modules/paypal/paypal.php b/modules/paypal/paypal.php new file mode 100644 index 000000000..47bcfd354 --- /dev/null +++ b/modules/paypal/paypal.php @@ -0,0 +1,2649 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +include_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php'; + +include_once _PS_MODULE_DIR_.'paypal/api/paypal_lib.php'; +include_once _PS_MODULE_DIR_.'paypal/api/CallApiPaypalPlus.php'; +include_once _PS_MODULE_DIR_.'paypal/paypal_logos.php'; +include_once _PS_MODULE_DIR_.'paypal/paypal_orders.php'; +include_once _PS_MODULE_DIR_.'paypal/paypal_tools.php'; +include_once _PS_MODULE_DIR_.'paypal/paypal_login/paypal_login.php'; +include_once _PS_MODULE_DIR_.'paypal/paypal_login/PayPalLoginUser.php'; +include_once _PS_MODULE_DIR_.'paypal/classes/PaypalCapture.php'; +include_once _PS_MODULE_DIR_.'paypal/classes/AuthenticatePaymentMethods.php'; +include_once _PS_MODULE_DIR_.'paypal/classes/PaypalPlusPui.php'; + +define('WPS', 1); //Paypal Integral +define('HSS', 2); //Paypal Integral Evolution +define('ECS', 4); //Paypal Option + +define('PPP', 5); //Paypal Plus +define('PVZ', 6); //Braintree ONLY + +define('PROD_PROXY_HOST', 'https://pp-ps-auth.com/'); +define('SANDBOX_PROXY_HOST', 'https://sandbox.pp-ps-auth.com/'); + +/* Tracking */ +define('TRACKING_INTEGRAL_EVOLUTION', 'FR_PRESTASHOP_H3S'); +define('TRACKING_INTEGRAL', 'PRESTASHOP_EC'); +define('TRACKING_OPTION_PLUS', 'PRESTASHOP_ECM'); +define('TRACKING_PAYPAL_PLUS', 'PRESTASHOP_PPP'); +define('PAYPAL_HSS_REDIRECTION', 0); +define('PAYPAL_HSS_IFRAME', 1); +define('TRACKING_EXPRESS_CHECKOUT_SEAMLESS', 'PrestaShopCEMEA_Cart_LIPP'); + +define('TRACKING_CODE', 'FR_PRESTASHOP_H3S'); +define('SMARTPHONE_TRACKING_CODE', 'Prestashop_Cart_smartphone_EC'); +define('TABLET_TRACKING_CODE', 'Prestashop_Cart_tablet_EC'); + +/* Traking APAC */ +define('APAC_TRACKING_INTEGRAL_EVOLUTION', 'PSAPAC_PRESTASHOP_H3S'); +define('APAC_TRACKING_INTEGRAL', 'PSAPAC_PRESTASHOP_EC'); +define('APAC_TRACKING_OPTION_PLUS', 'PSAPAC_PRESTASHOP_ECM'); +define('APAC_TRACKING_PAYPAL_PLUS', 'PSAPAC_PRESTASHOP_PPP'); +define('APAC_TRACKING_EXPRESS_CHECKOUT_SEAMLESS', 'PSAPAC_PRESTASHOP_LIPP'); + +define('APAC_TRACKING_CODE', 'PSAPAC_PRESTASHOP_H3S'); +define('APAC_SMARTPHONE_TRACKING_CODE', 'PSAPAC_PRESTASHOP_MOB_EC'); +define('APAC_TABLET_TRACKING_CODE', 'PSAPAC_PRESTASHOP_TAB_EC'); + +define('_PAYPAL_LOGO_XML_', 'logos.xml'); +define('_PAYPAL_MODULE_DIRNAME_', 'paypal'); +define('_PAYPAL_TRANSLATIONS_XML_', 'translations.xml'); + +class PayPal extends PaymentModule +{ + + protected $_html = ''; + public $_errors = array(); + public $context; + public $iso_code; + public $default_country; + public $paypal_logos; + public $module_key = '336225a5988ad434b782f2d868d7bfcd'; + + const BACKWARD_REQUIREMENT = '0.4'; + const ONLY_PRODUCTS = 1; + const ONLY_DISCOUNTS = 2; + const BOTH = 3; + const BOTH_WITHOUT_SHIPPING = 4; + const ONLY_SHIPPING = 5; + const ONLY_WRAPPING = 6; + const ONLY_PRODUCTS_WITHOUT_SHIPPING = 7; + + public function __construct() + { + $this->name = 'paypal'; + $this->tab = 'payments_gateways'; + $this->version = '1.0.0'; + $this->author = 'PrestaShop'; + $this->is_eu_compatible = 1; + + $this->currencies = true; + $this->currencies_mode = 'radio'; + + parent::__construct(); + $country = new Country(Configuration::get('PS_COUNTRY_DEFAULT')); + + if ($country->iso_code == 'FR') { + $this->description = $this->l('Benefit from PayPal\'s complete payments platform and grow your business online, on mobile and internationally and discover a new payment experience with Braintree.Accept credit cards, debit cards and PayPal payments.'); + + } else { + $this->description = $this->l('Accepts payments by credit cards (CB, Visa, MasterCard, Amex, Aurore, Cofinoga, 4 stars) with PayPal.'); + + } + $this->displayName = $this->l('PayPal'); + $this->confirmUninstall = $this->l('Are you sure you want to delete your details?'); + + $this->page = basename(__FILE__, '.php'); + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $mobile_enabled = (int) Configuration::get('PS_MOBILE_DEVICE'); + require _PS_MODULE_DIR_.$this->name.'/backward_compatibility/backward.php'; + } else { + $mobile_enabled = (int) Configuration::get('PS_ALLOW_MOBILE_DEVICE'); + } + + if (self::isInstalled($this->name)) { + $this->loadDefaults(); + if ($mobile_enabled && $this->active) { + $this->checkMobileCredentials(); + } elseif ($mobile_enabled && !$this->active) { + $this->checkMobileNeeds(); + } + + } else { + $this->checkMobileNeeds(); + } + } + + public function install() + { + if (!parent::install() + || !$this->registerHook('payment') + || !$this->registerHook('paymentReturn') + || !$this->registerHook('shoppingCartExtra') + || !$this->registerHook('backBeforePayment') + || !$this->registerHook('rightColumn') + || !$this->registerHook('cancelProduct') + || !$this->registerHook('productFooter') + || !$this->registerHook('header') + || !$this->registerHook('adminOrder') + || !$this->registerHook('backOfficeHeader') + || !$this->registerHook('displayPDFInvoice') + || !$this->registerHook('PDFInvoice')) { + + return false; + } + + if ((_PS_VERSION_ >= '1.5') && (!$this->registerHook('displayMobileHeader') + || !$this->registerHook('displayMobileShoppingCartTop') + || !$this->registerHook('displayMobileAddToCartTop') + || !$this->registerHook('displayPaymentEU') + || !$this->registerHook('actionPSCleanerGetModulesTables') + || !$this->registerHook('actionOrderStatusPostUpdate') + || !$this->registerHook('displayOrderConfirmation') + )) { + return false; + } + + include_once _PS_MODULE_DIR_.$this->name.'/paypal_install.php'; + $paypal_install = new PayPalInstall(); + $paypal_install->createTables(); + $paypal_install->updateConfiguration($this->version); + $paypal_install->createOrderState(); + + $paypal_tools = new PayPalTools($this->name); + $paypal_tools->moveTopPayments(1); + $paypal_tools->moveRightColumn(3); + + $this->runUpgrades(true); + + return true; + } + + public function uninstall() + { + include_once _PS_MODULE_DIR_.$this->name.'/paypal_install.php'; + $paypal_install = new PayPalInstall(); + $paypal_install->deleteConfiguration(); + return parent::uninstall(); + } + + /** + * Launch upgrade process + */ + public function runUpgrades($install = false) + { + if (version_compare(_PS_VERSION_, '1.5', '<')) { + foreach (array('2.8', '3.0', '3.7', '3.8.3', '3.9', '3.10.1', '3.10.4','3.10.10') as $version) { + $file = dirname(__FILE__).'/upgrade/install-'.$version.'.php'; + if (version_compare(Configuration::get('PAYPAL_VERSION'), $version, '<') && file_exists($file)) { + include_once $file; + call_user_func('upgrade_module_'.str_replace('.', '_', $version), $this, $install); + } + } + } + + } + + private function compatibilityCheck() + { + if (file_exists(_PS_MODULE_DIR_.'paypalapi/paypalapi.php') && $this->active) { + $this->warning = $this->l('All features of Paypal API module are included in the new Paypal module. In order to do not have any conflict, please do not use and remove PayPalAPI module.').'
'; + } + + /* For 1.4.3 and less compatibility */ + $update_config = array('PS_OS_CHEQUE' => 1, 'PS_OS_PAYMENT' => 2, 'PS_OS_PREPARATION' => 3, + 'PS_OS_SHIPPING' => 4, + 'PS_OS_DELIVERED' => 5, 'PS_OS_CANCELED' => 6, 'PS_OS_REFUND' => 7, 'PS_OS_ERROR' => 8, + 'PS_OS_OUTOFSTOCK' => 9, + 'PS_OS_BANKWIRE' => 10, 'PS_OS_PAYPAL' => 11, 'PS_OS_WS_PAYMENT' => 12); + + foreach ($update_config as $key => $value) { + if (!Configuration::get($key) || (int) Configuration::get($key) < 1) { + if (defined('_'.$key.'_') && (int) constant('_'.$key.'_') + > 0) { + Configuration::updateValue($key, constant('_'.$key.'_')); + } else { + Configuration::updateValue($key, $value); + } + + } + } + + } + + public function isPayPalAPIAvailable() + { + $payment_method = Configuration::get('PAYPAL_PAYMENT_METHOD'); + + if (($payment_method == WPS || $payment_method == ECS) && (!is_null(Configuration::get('PAYPAL_API_USER')) + && !is_null(Configuration::get('PAYPAL_API_PASSWORD')) && !is_null(Configuration::get('PAYPAL_API_SIGNATURE')))) { + return true; + } + + if ($payment_method == PPP && (!is_null(Configuration::get('PAYPAL_PLUS_CLIENT_ID')) + || !is_null(Configuration::get('PAYPAL_PLUS_SECRET')))) { + return true; + } + + if ($payment_method == HSS && !is_null(Configuration::get('PAYPAL_BUSINESS_ACCOUNT'))) { + return true; + } + + if ($payment_method == PVZ || Configuration::get('PAYPAL_BRAINTREE_ENABLED')) { + return true; + } + return false; + } + + /** + * Initialize default values + */ + protected function loadDefaults() + { + $this->loadLangDefault(); + $this->paypal_logos = new PayPalLogos($this->iso_code); + $payment_method = Configuration::get('PAYPAL_PAYMENT_METHOD'); + $order_process_type = (int) Configuration::get('PS_ORDER_PROCESS_TYPE'); + + if (Tools::getValue('paypal_ec_canceled') || $this->context->cart === false) { + unset($this->context->cookie->express_checkout); + } + + if (version_compare(_PS_VERSION_, '1.5.0.2', '>=')) { + $version = Db::getInstance()->getValue('SELECT version FROM `'._DB_PREFIX_.'module` WHERE name = \''.pSQL($this->name).'\''); + if (empty($version) === true) { + Db::getInstance()->execute(' + UPDATE `'._DB_PREFIX_.'module` m + SET m.version = \''.bqSQL($this->version).'\' + WHERE m.name = \''.bqSQL($this->name).'\''); + } + + } + + if (defined('_PS_ADMIN_DIR_')) { + /* Backward compatibility */ + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $this->backwardCompatibilityChecks(); + } + + /* Upgrade and compatibility checks */ + $this->runUpgrades(); + $this->compatibilityCheck(); + $this->warningsCheck(); + } else { + if (isset($this->context->cookie->express_checkout)) { + $this->context->smarty->assign('paypal_authorization', true); + } + + $isECS = false; + if (isset($this->context->cookie->express_checkout)) { + $cookie_ECS = unserialize($this->context->cookie->express_checkout); + if (isset($cookie_ECS['token']) && isset($cookie_ECS['payer_id'])) { + $isECS = true; + } + } + + if (($order_process_type == 1) && ((int) $payment_method == HSS) && !$this->useMobile()) { + $this->context->smarty->assign('paypal_order_opc', true); + } elseif (($order_process_type == 1) && ((bool) Tools::getValue('isPaymentStep') == true || $isECS)) { + $shop_url = PayPal::getShopDomainSsl(true, true); + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $link = $shop_url._MODULE_DIR_.$this->name.'/express_checkout/payment.php'; + $this->context->smarty->assign( + 'paypal_confirmation', + $link.'?'.http_build_query(array('get_confirmation' => true), '', '&') + ); + } else { + $values = array('fc' => 'module', 'module' => 'paypal', 'controller' => 'confirm', + 'get_confirmation' => true); + $this->context->smarty->assign('paypal_confirmation', $shop_url.__PS_BASE_URI__.'?'.http_build_query($values)); + } + } + } + } + + protected function checkMobileCredentials() + { + $payment_method = Configuration::get('PAYPAL_PAYMENT_METHOD'); + + if (((int) $payment_method == HSS) && ( + (!(bool) Configuration::get('PAYPAL_API_USER')) && + (!(bool) Configuration::get('PAYPAL_API_PASSWORD')) && + (!(bool) Configuration::get('PAYPAL_API_SIGNATURE')))) { + $this->warning .= $this->l('You must set your PayPal Integral credentials in order to have the mobile theme work correctly.').'
'; + } + + } + + protected function checkMobileNeeds() + { + $iso_code = Country::getIsoById((int) Configuration::get('PS_COUNTRY_DEFAULT')); + $paypal_countries = array('ES', 'FR', 'PL', 'IT'); + + if (method_exists($this->context->shop, 'getTheme')) { + if (($this->context->shop->getTheme() == 'default') && in_array($iso_code, $paypal_countries)) { + $this->warning .= $this->l('The mobile theme only works with the PayPal\'s payment module at this time. Please activate the module to enable payments.').'
'; + } + + } else { + $this->warning .= $this->l('In order to use the module you need to install the backward compatibility.').'
'; + } + + } + + /* Check status of backward compatibility module */ + + protected function backwardCompatibilityChecks() + { + if (Module::isInstalled('backwardcompatibility')) { + $backward_module = Module::getInstanceByName('backwardcompatibility'); + if (!$backward_module->active) { + $this->warning .= $this->l('To work properly the module requires the backward compatibility module enabled').'
'; + } elseif ($backward_module->version < PayPal::BACKWARD_REQUIREMENT) { + $this->warning .= $this->l('To work properly the module requires at least the backward compatibility module v').PayPal::BACKWARD_REQUIREMENT.'.
'; + } + + } else { + $this->warning .= $this->l('In order to use the module you need to install the backward compatibility.').'
'; + } + + } + + public static function countryIso2to3($iso2) + { + //ISO 3166-1 alpha-2 -> alpha-3 correspondence array + $iso2to3 = array( + 'AW' => 'ABW', + 'AO' => 'AGO', + 'AI' => 'AIA', + 'AX' => 'ALA', + 'AL' => 'ALB', + 'AD' => 'AND', + 'AN' => 'ANT', + 'AE' => 'ARE', + 'AR' => 'ARG', + 'AM' => 'ARM', + 'AS' => 'ASM', + 'AQ' => 'ATA', + 'TF' => 'ATF', + 'AG' => 'ATG', + 'AU' => 'AUS', + 'AT' => 'AUT', + 'AZ' => 'AZE', + 'BI' => 'BDI', + 'BE' => 'BEL', + 'BJ' => 'BEN', + 'BF' => 'BFA', + 'BD' => 'BGD', + 'BG' => 'BGR', + 'BH' => 'BHR', + 'BS' => 'BHS', + 'BA' => 'BIH', + 'BL' => 'BLM', + 'BY' => 'BLR', + 'BZ' => 'BLZ', + 'BM' => 'BMU', + 'BO' => 'BOL', + 'BR' => 'BRA', + 'BB' => 'BRB', + 'BN' => 'BRN', + 'BT' => 'BTN', + 'BV' => 'BVT', + 'BW' => 'BWA', + 'CF' => 'CAF', + 'CA' => 'CAN', + 'CC' => 'CCK', + 'CH' => 'CHE', + 'CL' => 'CHL', + 'CN' => 'CHN', + 'CI' => 'CIV', + 'CM' => 'CMR', + 'CD' => 'COD', + 'CG' => 'COG', + 'CK' => 'COK', + 'CO' => 'COL', + 'KM' => 'COM', + 'CV' => 'CPV', + 'CR' => 'CRI', + 'CU' => 'CUB', + 'CX' => 'CXR', + 'KY' => 'CYM', + 'CY' => 'CYP', + 'CZ' => 'CZE', + 'DE' => 'DEU', + 'DJ' => 'DJI', + 'DM' => 'DMA', + 'DK' => 'DNK', + 'DO' => 'DOM', + 'DZ' => 'DZA', + 'EC' => 'ECU', + 'EG' => 'EGY', + 'ER' => 'ERI', + 'EH' => 'ESH', + 'ES' => 'ESP', + 'EE' => 'EST', + 'ET' => 'ETH', + 'FI' => 'FIN', + 'FJ' => 'FJI', + 'FK' => 'FLK', + 'FR' => 'FRA', + 'FO' => 'FRO', + 'FM' => 'FSM', + 'GA' => 'GAB', + 'GB' => 'GBR', + 'GE' => 'GEO', + 'GG' => 'GGY', + 'GH' => 'GHA', + 'GI' => 'GIB', + 'GN' => 'GIN', + 'GP' => 'GLP', + 'GM' => 'GMB', + 'GW' => 'GNB', + 'GQ' => 'GNQ', + 'GR' => 'GRC', + 'GD' => 'GRD', + 'GL' => 'GRL', + 'GT' => 'GTM', + 'GF' => 'GUF', + 'GU' => 'GUM', + 'GY' => 'GUY', + 'HK' => 'HKG', + 'HM' => 'HMD', + 'HN' => 'HND', + 'HR' => 'HRV', + 'HT' => 'HTI', + 'HU' => 'HUN', + 'ID' => 'IDN', + 'IM' => 'IMN', + 'IN' => 'IND', + 'IO' => 'IOT', + 'IE' => 'IRL', + 'IR' => 'IRN', + 'IQ' => 'IRQ', + 'IS' => 'ISL', + 'IL' => 'ISR', + 'IT' => 'ITA', + 'JM' => 'JAM', + 'JE' => 'JEY', + 'JO' => 'JOR', + 'JP' => 'JPN', + 'KZ' => 'KAZ', + 'KE' => 'KEN', + 'KG' => 'KGZ', + 'KH' => 'KHM', + 'KI' => 'KIR', + 'KN' => 'KNA', + 'KR' => 'KOR', + 'KW' => 'KWT', + 'LA' => 'LAO', + 'LB' => 'LBN', + 'LR' => 'LBR', + 'LY' => 'LBY', + 'LC' => 'LCA', + 'LI' => 'LIE', + 'LK' => 'LKA', + 'LS' => 'LSO', + 'LT' => 'LTU', + 'LU' => 'LUX', + 'LV' => 'LVA', + 'MO' => 'MAC', + 'MF' => 'MAF', + 'MA' => 'MAR', + 'MC' => 'MCO', + 'MD' => 'MDA', + 'MG' => 'MDG', + 'MV' => 'MDV', + 'MX' => 'MEX', + 'MH' => 'MHL', + 'MK' => 'MKD', + 'ML' => 'MLI', + 'MT' => 'MLT', + 'MM' => 'MMR', + 'ME' => 'MNE', + 'MN' => 'MNG', + 'MP' => 'MNP', + 'MZ' => 'MOZ', + 'MR' => 'MRT', + 'MS' => 'MSR', + 'MQ' => 'MTQ', + 'MU' => 'MUS', + 'MW' => 'MWI', + 'MY' => 'MYS', + 'YT' => 'MYT', + 'NC' => 'NCL', + 'NE' => 'NER', + 'NF' => 'NFK', + 'NG' => 'NGA', + 'NI' => 'NIC', + 'NU' => 'NIU', + 'NL' => 'NLD', + 'NO' => 'NOR', + 'NP' => 'NPL', + 'NR' => 'NRU', + 'NZ' => 'NZL', + 'OM' => 'OMN', + 'PK' => 'PAK', + 'PA' => 'PAN', + 'PN' => 'PCN', + 'PE' => 'PER', + 'PH' => 'PHL', + 'PW' => 'PLW', + 'PG' => 'PNG', + 'PL' => 'POL', + 'PR' => 'PRI', + 'KP' => 'PRK', + 'PT' => 'PRT', + 'PY' => 'PRY', + 'PS' => 'PSE', + 'PF' => 'PYF', + 'QA' => 'QAT', + 'RE' => 'REU', + 'RO' => 'ROU', + 'RU' => 'RUS', + 'RW' => 'RWA', + 'SA' => 'SAU', + 'SD' => 'SDN', + 'SN' => 'SEN', + 'SG' => 'SGP', + 'GS' => 'SGS', + 'SH' => 'SHN', + 'SJ' => 'SJM', + 'SB' => 'SLB', + 'SL' => 'SLE', + 'SV' => 'SLV', + 'SM' => 'SMR', + 'SO' => 'SOM', + 'PM' => 'SPM', + 'RS' => 'SRB', + 'SS' => 'SSD', + 'ST' => 'STP', + 'SR' => 'SUR', + 'SK' => 'SVK', + 'SI' => 'SVN', + 'SE' => 'SWE', + 'SZ' => 'SWZ', + 'SC' => 'SYC', + 'SY' => 'SYR', + 'TC' => 'TCA', + 'TD' => 'TCD', + 'TG' => 'TGO', + 'TH' => 'THA', + 'TJ' => 'TJK', + 'TK' => 'TKL', + 'TM' => 'TKM', + 'TL' => 'TLS', + 'TO' => 'TON', + 'TT' => 'TTO', + 'TN' => 'TUN', + 'TR' => 'TUR', + 'TV' => 'TUV', + 'TW' => 'TWN', + 'TZ' => 'TZA', + 'UG' => 'UGA', + 'UA' => 'UKR', + 'UM' => 'UMI', + 'UY' => 'URY', + 'US' => 'USA', + 'UZ' => 'UZB', + 'VA' => 'VAT', + 'VC' => 'VCT', + 'VE' => 'VEN', + 'VG' => 'VGB', + 'VI' => 'VIR', + 'VN' => 'VNM', + 'VU' => 'VUT', + 'WF' => 'WLF', + 'WS' => 'WSM', + 'YE' => 'YEM', + 'ZA' => 'ZAF', + 'ZM' => 'ZMB', + 'ZW' => 'ZWE' + ); + + return $iso2to3[$iso2]; + } + + public function getContent() + { + if (Tools::getIsset('BRAINTREE_ENABLED')) { + Configuration::updateValue('VZERO_ENABLED', 1); + } + + $output = $this->_postProcess(); + + $braintree_message = ''; + $braintree_style = ''; + if(version_compare(phpversion(),'5.4','<')) + { + if (version_compare(_PS_VERSION_, '1.6.1', '>=')) { + $output = $this->displayWarning($this->l('Your server is not compatible with PayPal module upcoming release. Please contact your hosting company in order to upgrade PHP version to at least version 5.4 or latest.')); + } else { + $output = $this->displayError($this->l('Your server is not compatible with PayPal module upcoming release. Please contact your hosting company in order to upgrade PHP version to at least version 5.4 or latest.')); + } + } + + if (!Tools::isSubmit('submitButton') && Tools::getIsset('accessToken') && Tools::getIsset('expiresAt') && Tools::getIsset('refreshToken')) { + $output = $this->displayConfirmation((Configuration::get('PAYPAL_SANDBOX')?$this->l('Your Braintree account is now configured in sandbox mode. You can sell on Euro only. If you have problems, you can join Braintree support on 08 05 54 27 14'):$this->l('Your Braintree account is now configured in live mode. If you have problems, you can join Braintree support on 08 05 54 27 14') )); + } + + if (!Tools::isSubmit('submitButton') && Tools::getValue('error')) { + $output = $this->displayError($this->l('Braintree is not configured. If you have problems, you can join Braintree support on 08 05 54 27 14')); + + $braintree_message = $this->l('Braintree is not configured. If you have problems, you can join Braintree support on 08 05 54 27 14'); + $braintree_style = 'color:#dc143c;'; + } + + // Check if all Braintree credentials are present + $braintree_configured = false; + if (Configuration::get('PAYPAL_BRAINTREE_ACCESS_TOKEN') && Configuration::get('PAYPAL_BRAINTREE_EXPIRES_AT') && Configuration::get('PAYPAL_BRAINTREE_REFRESH_TOKEN')) { + $braintree_configured = true; + } + + $admin_dir = explode('/', _PS_ADMIN_DIR_); + + $braintree_redirect_url = _PS_BASE_URL_.__PS_BASE_URI__. $admin_dir[ ( count($admin_dir) - 1 ) ] .'/index.php?controller=AdminModules&tab_module=payments_gateways&configure='.$this->name.'&module_name='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules'); + + if (($id_lang = Language::getIdByIso('EN')) == 0) { + $english_language_id = (int) $this->context->employee->id_lang; + } else { + $english_language_id = (int) $id_lang; + } + + $this->context->smarty->assign(array( + 'PayPal_WPS' => (int) WPS, + 'PayPal_HSS' => (int) HSS, + 'PayPal_ECS' => (int) ECS, + 'PayPal_PPP' => (int) PPP, + 'PayPal_PVZ' => (int) PVZ, + 'PP_errors' => $this->_errors, + 'PayPal_logo' => $this->paypal_logos->getLogos(), + 'PayPal_allowed_methods' => $this->getPaymentMethods(), + 'PayPal_country' => Country::getNameById((int) $english_language_id, (int) $this->default_country), + 'PayPal_country_id' => (int) $this->default_country, + 'PayPal_business' => Configuration::get('PAYPAL_BUSINESS'), + 'PayPal_payment_method' => (int) Configuration::get('PAYPAL_PAYMENT_METHOD'), + 'PayPal_api_username' => Configuration::get('PAYPAL_API_USER'), + 'PayPal_api_password' => Configuration::get('PAYPAL_API_PASSWORD'), + 'PayPal_api_signature' => Configuration::get('PAYPAL_API_SIGNATURE'), + 'PayPal_api_business_account' => Configuration::get('PAYPAL_BUSINESS_ACCOUNT'), + 'PayPal_express_checkout_shortcut' => (int) Configuration::get('PAYPAL_EXPRESS_CHECKOUT_SHORTCUT'), + 'PayPal_in_context_checkout' => (int) Configuration::get('PAYPAL_IN_CONTEXT_CHECKOUT'), + 'use_paypal_in_context' => (int) $this->useInContextCheckout(), + 'PayPal_in_context_checkout_merchant_id' => Configuration::get('PAYPAL_IN_CONTEXT_CHECKOUT_M_ID'), + 'PayPal_sandbox_mode' => (int) Configuration::get('PAYPAL_SANDBOX'), + 'PayPal_payment_capture' => (int) Configuration::get('PAYPAL_CAPTURE'), + 'PayPal_country_default' => (int) $this->default_country, + 'PayPal_change_country_url' => 'index.php?tab=AdminCountries&token='.Tools::getAdminTokenLite('AdminCountries').'#footer', + 'Countries' => Country::getCountries($english_language_id), + 'One_Page_Checkout' => (int) Configuration::get('PS_ORDER_PROCESS_TYPE'), + 'PayPal_integral_evolution_template' => Configuration::get('PAYPAL_HSS_TEMPLATE'), + 'PayPal_integral_evolution_solution' => Configuration::get('PAYPAL_HSS_SOLUTION'), + 'PayPal_login' => (int) Configuration::get('PAYPAL_LOGIN'), + 'PayPal_login_client_id' => Configuration::get('PAYPAL_LOGIN_CLIENT_ID'), + 'PayPal_login_secret' => Configuration::get('PAYPAL_LOGIN_SECRET'), + 'PayPal_login_tpl' => (int) Configuration::get('PAYPAL_LOGIN_TPL'), + 'default_lang_iso' => Language::getIsoById($this->context->employee->id_lang), + 'PayPal_plus_client' => Configuration::get('PAYPAL_PLUS_CLIENT_ID'), + 'PayPal_plus_secret' => Configuration::get('PAYPAL_PLUS_SECRET'), + 'PayPal_plus_webprofile' => (Configuration::get('PAYPAL_WEB_PROFILE_ID') != '0') ? Configuration::get('PAYPAL_WEB_PROFILE_ID') : 0, + //'PayPal_version_tls_checked' => $tls_version, + 'Presta_version' => _PS_VERSION_, + 'Currencies' => Currency::getCurrencies(), + 'PayPal_account_braintree' => (array) Tools::jsonDecode(Configuration::get('PAYPAL_ACCOUNT_BRAINTREE')), + 'Currency_default'=> Configuration::get('PS_CURRENCY_DEFAULT'), + //*TO DELETE* 'PayPal_braintree_public_key'=> Configuration::get('PAYPAL_BRAINTREE_PUBLIC_KEY'), + //*TO DELETE* 'PayPal_braintree_private_key'=> Configuration::get('PAYPAL_BRAINTREE_PRIVATE_KEY'), + 'PayPal_braintree_merchant_id'=> Configuration::get('PAYPAL_BRAINTREE_MERCHANT_ID'), + 'PayPal_check3Dsecure'=> Configuration::get('PAYPAL_USE_3D_SECURE'), + 'PayPal_braintree_enabled'=> Configuration::get('PAYPAL_BRAINTREE_ENABLED'), + // Pour le bouton Braintree + 'User_Country' => PayPal::countryIso2to3(Context::getContext()->country->iso_code), + 'User_Mail' => Context::getContext()->employee->email, + 'Business_Name' => Configuration::get('PS_SHOP_NAME'), + 'Business_Country' => PayPal::countryIso2to3(Context::getContext()->country->iso_code), + 'Proxy_Host' => (Configuration::get('PAYPAL_SANDBOX')?SANDBOX_PROXY_HOST:PROD_PROXY_HOST), + 'Alternate_Proxy_Host' => (Configuration::get('PAYPAL_SANDBOX')?PROD_PROXY_HOST:SANDBOX_PROXY_HOST), + 'Braintree_Redirect_Url' => $braintree_redirect_url, + 'Braintree_Configured' => $braintree_configured, + 'Braintree_Message' => $braintree_message, + 'Braintree_Style' => $braintree_style, + 'Braintree_Access_Token' => Configuration::get('PAYPAL_BRAINTREE_ACCESS_TOKEN'), + 'Braintree_Refresh_Token' => Configuration::get('PAYPAL_BRAINTREE_REFRESH_TOKEN'), + 'Braintree_Expires_At' => strtotime(Configuration::get('PAYPAL_BRAINTREE_EXPIRES_AT')), + 'ps_ssl_active' => Configuration::get('PS_SSL_ENABLED'), + )); + + $this->getTranslations(); + + $output .= $this->fetchTemplate('/views/templates/admin/back_office.tpl'); + + if ($this->active == false) { + return $output.$this->hookBackOfficeHeader(); + } + + return $output; + } + + /** + * Hooks methods + */ + public function hookHeader($params) + { + if ($this->useMobile()) { + $id_hook = (int) Configuration::get('PS_MOBILE_HOOK_HEADER_ID'); + if ($id_hook > 0) { + $module = Hook::getModulesFromHook($id_hook, $this->id); + if (!$module) { + $this->registerHook('displayMobileHeader'); + } + + } + } + + if (isset($this->context->cart) && $this->context->cart->id) { + $this->context->smarty->assign('id_cart', (int) $this->context->cart->id); + } + + + + /* Added for PrestaBox */ + if (method_exists($this->context->controller, 'addCSS')) { + $this->context->controller->addCSS(_MODULE_DIR_.$this->name.'/views/css/paypal.css'); + } else { + Tools::addCSS(_MODULE_DIR_.$this->name.'/views/css/paypal.css'); + } + + $smarty = $this->context->smarty; + $smarty->assign(array( + 'ssl_enabled' => Configuration::get('PS_SSL_ENABLED'), + 'PAYPAL_SANDBOX' => Configuration::get('PAYPAL_SANDBOX'), + 'PayPal_in_context_checkout' => Configuration::get('PAYPAL_IN_CONTEXT_CHECKOUT'), + 'use_paypal_in_context' => (int) $this->useInContextCheckout(), + 'PayPal_in_context_checkout_merchant_id' => Configuration::get('PAYPAL_IN_CONTEXT_CHECKOUT_M_ID'), + )); + + $process = ''; + if ($this->useInContextCheckout()) { + $process .= ''; + } + + if (( + (method_exists($smarty, 'getTemplateVars') && ($smarty->getTemplateVars('page_name') + == 'authentication' || $smarty->getTemplateVars('page_name') == 'order-opc')) + || (isset($smarty->_tpl_vars) && ($smarty->_tpl_vars['page_name'] + == 'authentication' || $smarty->_tpl_vars['page_name'] == 'order-opc'))) + && + (int) Configuration::get('PAYPAL_LOGIN') == 1) { + $this->context->smarty->assign(array( + 'paypal_locale' => $this->getLocale(), + 'PAYPAL_LOGIN_CLIENT_ID' => Configuration::get('PAYPAL_LOGIN_CLIENT_ID'), + 'PAYPAL_LOGIN_TPL' => Configuration::get('PAYPAL_LOGIN_TPL'), + 'PAYPAL_RETURN_LINK' => PayPalLogin::getReturnLink(), + )); + $process .= ' + + '; + } + + + if (Configuration::get('PAYPAL_PAYMENT_METHOD') == PPP) { + + $this->context->smarty->assign(array( + 'paypal_locale' => $this->getLocalePayPalPlus(), + 'PAYPAL_LOGIN_CLIENT_ID' => Configuration::get('PAYPAL_LOGIN_CLIENT_ID'), + 'PAYPAL_LOGIN_TPL' => Configuration::get('PAYPAL_LOGIN_TPL'), + 'PAYPAL_RETURN_LINK' => PayPalLogin::getReturnLink(), + )); + $process .= ''; + } + + // JS FOR OPC BRAINTREE + if ((Configuration::get('PAYPAL_PAYMENT_METHOD') == PVZ || Configuration::get('PAYPAL_BRAINTREE_ENABLED')) && version_compare(PHP_VERSION, '5.4.0', '>=') && $this->context->controller instanceof OrderOpcController) { + $process .= ' + + + '; + } + + return $process; + } + + public function useInContextCheckout() + { + return Configuration::get('PAYPAL_IN_CONTEXT_CHECKOUT') && Configuration::get('PAYPAL_IN_CONTEXT_CHECKOUT_M_ID') + != null; + } + + public function getLocalePayPalPlus() + { + switch (Tools::strtolower($this->getCountryCode())) { + case 'fr': + return 'fr_FR'; + case 'hk': + return 'zh_HK'; + case 'cn': + return 'zh_CN'; + case 'tw': + return 'zh_TW'; + case 'xc': + return 'zh_XC'; + case 'dk': + return 'da_DK'; + case 'nl': + return 'nl_NL'; + case 'gb': + return 'en_GB'; + case 'de': + return 'de_DE'; + case 'il': + return 'he_IL'; + case 'id': + return 'id_ID'; + case 'it': + return 'it_IT'; + case 'jp': + return 'ja_JP'; + case 'no': + return 'no_NO'; + case 'pt': + return 'pt_PT'; + case 'pl': + return 'pl_PL'; + case 'ru': + return 'ru_RU'; + case 'es': + return 'es_ES'; + case 'se': + return 'sv_SE'; + case 'th': + return 'th_TH'; + case 'tr': + return 'tr_TR'; + default: + return 'en_GB'; + } + } + + public function getLocale() + { + switch (Language::getIsoById($this->context->language->id)) { + case 'fr': + return 'fr-fr'; + case 'hk': + return 'zh-hk'; + case 'cn': + return 'zh-cn'; + case 'tw': + return 'zh-tw'; + case 'xc': + return 'zh-xc'; + case 'dk': + return 'da-dk'; + case 'nl': + return 'nl-nl'; + case 'gb': + return 'en-gb'; + case 'de': + return 'de-de'; + case 'il': + return 'he-il'; + case 'id': + return 'id-id'; + case 'il': + return 'it-it'; + case 'jp': + return 'ja-jp'; + case 'no': + return 'no-no'; + case 'pt': + return 'pt-pt'; + case 'pl': + return 'pl-pl'; + case 'ru': + return 'ru-ru'; + case 'es': + return 'es-es'; + case 'se': + return 'sv-se'; + case 'th': + return 'th-th'; + case 'tr': + return 'tr-tr'; + default: + return 'en-gb'; + } + } + + public function canBeUsed() + { + if (!$this->active) { + return false; + } + + + //If merchant has not upgraded and payment method is out of country's specs + if (!Configuration::get('PAYPAL_UPDATED_COUNTRIES_OK') && !in_array((int) Configuration::get('PAYPAL_PAYMENT_METHOD'), $this->getPaymentMethods())) { + return false; + } + + return true; + } + + public function hookDisplayMobileHeader($params = null) + { + return $this->hookHeader($params); + } + + public function hookDisplayMobileShoppingCartTop() + { + return $this->renderExpressCheckoutButton('cart').$this->renderExpressCheckoutForm('cart'); + } + + public function hookDisplayMobileAddToCartTop() + { + return $this->renderExpressCheckoutButton('cart'); + } + + public function hookProductFooter() + { + $content = (!$this->useMobile()) ? $this->renderExpressCheckoutButton('product') + : null; + return $content.$this->renderExpressCheckoutForm('product'); + } + + public function hookActionOrderStatusPostUpdate($params) + { + if ($params['newOrderStatus']->id == Configuration::get('PS_OS_CANCELED')) { + $transction_id = Db::getInstance()->getValue('SELECT transaction FROM '._DB_PREFIX_.'paypal_braintree WHERE id_order = '.(int)$params['id_order']); + + if ($transction_id) { + include_once _PS_MODULE_DIR_.'paypal/classes/Braintree.php'; + $braintree = new PrestaBraintree(); + $braintree->void($transction_id); + } + } + } + + public function hookPayment($params) + { + if (!$this->canBeUsed()) { + return; + } + + $use_mobile = $this->useMobile(); + + if ($use_mobile) { + $method = ECS; + } else { + $method = (int) Configuration::get('PAYPAL_PAYMENT_METHOD'); + } + if (isset($this->context->cookie->express_checkout)) { + $this->redirectToConfirmation(); + } + + $iso_lang = array( + 'en' => 'en_US', + 'fr' => 'fr_FR', + 'de' => 'de_DE', + ); + + $this->context->smarty->assign( + array( + 'logos' => $this->paypal_logos->getLogos(), + 'sandbox_mode' => Configuration::get('PAYPAL_SANDBOX'), + 'use_mobile' => $use_mobile, + 'PayPal_lang_code' => (isset($iso_lang[$this->context->language->iso_code])) + ? $iso_lang[$this->context->language->iso_code] : 'en_US', + ) + ); + + if (($method == PVZ || Configuration::get('PAYPAL_BRAINTREE_ENABLED')) + && version_compare(PHP_VERSION, '5.4.0', '>') + && $this->context->currency->iso_code == 'EUR' + ) { + $id_account_braintree = $this->set_good_context(); + + include_once _PS_MODULE_DIR_.'paypal/classes/Braintree.php'; + + $braintree = new PrestaBraintree(); + + $clientToken = $braintree->createToken($id_account_braintree); + + $this->reset_context(); + + if (!$clientToken) { + $return_braintree = ''; + } else { + $this->context->smarty->assign( + array( + 'opc' => Configuration::get('PS_ORDER_PROCESS_TYPE'), + 'error_msg' => Tools::getValue('bt_error_msg'), + 'braintreeToken' => $clientToken, + 'braintreeSubmitUrl' => $this->context->link->getModuleLink('paypal', 'braintreesubmit', array(), true), + 'braintreeAmount' => $braintree->getCartPaymentTotal(), + 'check3Dsecure' => Configuration::get('PAYPAL_USE_3D_SECURE'), + ) + ); + $return_braintree = $this->fetchTemplate('braintree_payment.tpl'); + } + } else { + $return_braintree = ''; + } + + if ($method == HSS) { + $billing_address = new Address($this->context->cart->id_address_invoice); + $delivery_address = new Address($this->context->cart->id_address_delivery); + $billing_address->country = new Country($billing_address->id_country); + $delivery_address->country = new Country($delivery_address->id_country); + $billing_address->state = new State($billing_address->id_state); + $delivery_address->state = new State($delivery_address->id_state); + + $cart = $this->context->cart; + $cart_details = $cart->getSummaryDetails(null, true); + + if ((int) Configuration::get('PAYPAL_SANDBOX') == 1) { + $action_url = 'https://securepayments.sandbox.paypal.com/acquiringweb'; + } else { + $action_url = 'https://securepayments.paypal.com/acquiringweb'; + } + + $shop_url = PayPal::getShopDomainSsl(true, true); + + $this->context->smarty->assign( + array( + 'action_url' => $action_url, + 'cart' => $cart, + 'cart_details' => $cart_details, + 'currency' => new Currency((int) $cart->id_currency), + 'customer' => $this->context->customer, + 'business_account' => Configuration::get('PAYPAL_BUSINESS_ACCOUNT'), + 'custom' => Tools::jsonEncode(array('id_cart' => $cart->id, 'hash' => sha1(serialize($cart->nbProducts())))), + 'gift_price' => (float) $this->getGiftWrappingPrice(), + 'billing_address' => $billing_address, + 'delivery_address' => $delivery_address, + 'shipping' => $cart_details['total_shipping_tax_exc'], + 'subtotal' => $cart_details['total_price_without_tax'] - $cart_details['total_shipping_tax_exc'], + 'time' => time(), + 'cancel_return' => $this->context->link->getPageLink('order.php'), + 'notify_url' => $shop_url._MODULE_DIR_.$this->name.'/ipn.php', + 'return_url' => $shop_url._MODULE_DIR_.$this->name.'/integral_evolution/submit.php?id_cart='.(int) $cart->id, + 'tracking_code' => $this->getTrackingCode($method), + 'iso_code' => Tools::strtoupper($this->context->language->iso_code), + 'payment_hss_solution' => Configuration::get('PAYPAL_HSS_SOLUTION'), + 'payment_hss_template' => Configuration::get('PAYPAL_HSS_TEMPLATE'), + ) + ); + $this->getTranslations(); + return $return_braintree.$this->fetchTemplate('integral_evolution_payment.tpl'); + } elseif ($method == WPS || $method == ECS) { + $this->getTranslations(); + $this->context->smarty->assign( + array( + 'PayPal_integral' => WPS, + 'PayPal_express_checkout' => ECS, + 'PayPal_payment_method' => $method, + 'PayPal_payment_type' => 'payment_cart', + 'PayPal_current_page' => $this->getCurrentUrl(), + 'PayPal_tracking_code' => $this->getTrackingCode($method), + 'PayPal_in_context_checkout' => Configuration::get('PAYPAL_IN_CONTEXT_CHECKOUT'), + 'use_paypal_in_context' => (int) $this->useInContextCheckout(), + 'PayPal_in_context_checkout_merchant_id' => Configuration::get('PAYPAL_IN_CONTEXT_CHECKOUT_M_ID'), + ) + ); + return $return_braintree.$this->fetchTemplate('express_checkout_payment.tpl'); + } elseif ($method == PPP) { + $CallApiPaypalPlus = new CallApiPaypalPlus(); + $CallApiPaypalPlus->setParams($params); + $approuval_url = $CallApiPaypalPlus->getApprovalUrl(); + $this->context->smarty->assign( + array( + 'approval_url' => $approuval_url, + 'language' => $this->getLocalePayPalPlus(), + 'country' => $this->getCountryCode(), + 'mode' => Configuration::get('PAYPAL_SANDBOX') ? 'sandbox': 'live', + 'ajaxUrl' => $this->context->link->getModuleLink('paypal', 'pluspatch', array('id_cart'=>$this->context->cart->id,'id_payment'=>$CallApiPaypalPlus->id_payment)), + 'img_loader' => _PS_IMG_.'loader.gif', + ) + ); + return $return_braintree.$this->fetchTemplate('paypal_plus_payment.tpl'); + } + } + + public function hookDisplayPaymentEU($params) + { + if (!$this->active) { + return; + } + + if ($this->hookPayment($params) == null) { + return null; + } + + $use_mobile = $this->useMobile(); + + if ($use_mobile) { + $method = ECS; + } else { + $method = (int) Configuration::get('PAYPAL_PAYMENT_METHOD'); + } + + if (isset($this->context->cookie->express_checkout)) { + $this->redirectToConfirmation(); + } + + $logos = $this->paypal_logos->getLogos(); + + if (isset($logos['LocalPayPalHorizontalSolutionPP']) && $method == WPS) { + $logo = $logos['LocalPayPalHorizontalSolutionPP']; + } else { + $logo = $logos['LocalPayPalLogoMedium']; + } + + if ($method == HSS) { + return array( + 'cta_text' => $this->l('Paypal'), + 'logo' => $logo, + 'form' => $this->fetchTemplate('integral_evolution_payment_eu.tpl'), + ); + } elseif ($method == WPS || $method == ECS) { + return array( + 'cta_text' => $this->l('Paypal'), + 'logo' => $logo, + 'form' => $this->fetchTemplate('express_checkout_payment_eu.tpl'), + ); + } elseif ($method == PPP) { + if (Module::isEnabled('eu_legal') || Module::isEnabled('advancedeucompliance')) { + $this->context->smarty->assign( + array( + 'eu_legal_active' => Module::isEnabled('eu_legal'), + 'advancedeucompliance_active' => Module::isEnabled('advancedeucompliance'), + ) + ); + + return array( + 'cta_text' => $this->l('Paypal, Lastschrift, Kreditkarte, Rechnung'), + 'logo' => $logo, + 'form' => $this->fetchTemplate('paypal_plus_payment_eu_legal.tpl'), + ); + } + return array( + 'cta_text' => $this->l('Paypal, Lastschrift, Kreditkarte, Rechnung'), + 'logo' => $logo, + 'form' => $this->fetchTemplate('paypal_plus_payment_eu.tpl'), + ); + } + + + } + + public function hookShoppingCartExtra() + { + if (!$this->active + || (((int) Configuration::get('PAYPAL_PAYMENT_METHOD') == HSS) && !$this->context->getMobileDevice()) + || !Configuration::get('PAYPAL_EXPRESS_CHECKOUT_SHORTCUT') + || !in_array(ECS, $this->getPaymentMethods()) + || isset($this->context->cookie->express_checkout) + || Configuration::get('PAYPAL_PAYMENT_METHOD') == PVZ) { + return null; + } + + $values = array('en' => 'en_US', 'fr' => 'fr_FR', 'de' => 'de_DE'); + $paypal_logos = $this->paypal_logos->getLogos(); + + $this->context->smarty->assign(array( + 'PayPal_payment_type' => 'cart', + 'paypal_express_checkout_shortcut_logo' => isset($paypal_logos['ExpressCheckoutShortcutButton']) + ? $paypal_logos['ExpressCheckoutShortcutButton'] : false, + 'PayPal_current_page' => $this->getCurrentUrl(), + 'PayPal_lang_code' => (isset($values[$this->context->language->iso_code]) + ? $values[$this->context->language->iso_code] : 'en_US'), + 'PayPal_tracking_code' => $this->getTrackingCode((int) Configuration::get('PAYPAL_PAYMENT_METHOD')), + 'include_form' => true, + 'template_dir' => dirname(__FILE__).'/views/templates/hook/')); + + return $this->fetchTemplate('express_checkout_shortcut_button.tpl'); + } + + public function hookPaymentReturn() + { + if (!$this->active) { + return null; + } + if (Tools::getValue('braintree')) { + return $this->fetchTemplate('braintree_return.tpl'); + } else { + return $this->fetchTemplate('confirmation.tpl'); + + } + } + + public function hookRightColumn() + { + $this->context->smarty->assign('logo', $this->paypal_logos->getCardsLogo(true)); + return $this->fetchTemplate('column.tpl'); + } + + public function hookLeftColumn() + { + return $this->hookRightColumn(); + } + + public function hookBackBeforePayment($params) + { + if (!$this->active) { + return null; + } + + /* Only execute if you use PayPal API for payment */ + if (((int) Configuration::get('PAYPAL_PAYMENT_METHOD') != HSS) && $this->isPayPalAPIAvailable()) { + if ($params['module'] != $this->name || !$this->context->cookie->paypal_token + || !$this->context->cookie->paypal_payer_id) { + return false; + } + + Tools::redirect('modules/'.$this->name.'/express_checkout/submit.php?confirm=1&token='.$this->context->cookie->paypal_token.'&payerID='.$this->context->cookie->paypal_payer_id); + } + } + + public function setPayPalAsConfigured() + { + Configuration::updateValue('PAYPAL_CONFIGURATION_OK', true); + } + + public function hookAdminOrder($params) + { + if (Tools::isSubmit('submitPayPalCapture')) { + if ($capture_amount = Tools::getValue('totalCaptureMoney')) { + if ($capture_amount = PaypalCapture::parsePrice($capture_amount)) { + if (Validate::isFloat($capture_amount)) { + $capture_amount = Tools::ps_round($capture_amount, '6'); + $ord = new Order((int) $params['id_order']); + $cpt = new PaypalCapture(); + + if (($capture_amount > Tools::ps_round(0, '6')) && (Tools::ps_round($cpt->getRestToPaid($ord), '6') >= $capture_amount)) { + $complete = false; + + if ($capture_amount > Tools::ps_round((float) $ord->total_paid, '6')) { + $capture_amount = Tools::ps_round((float) $ord->total_paid, '6'); + $complete = true; + } + if ($capture_amount == Tools::ps_round($cpt->getRestToPaid($ord), '6')) { + $complete = true; + } + + $this->_doCapture($params['id_order'], $capture_amount, $complete); + } + } + } + } + } elseif (Tools::isSubmit('submitPayPalRefund')) { + $this->_doTotalRefund($params['id_order']); + } + + + $admin_templates = array(); + if ($this->isPayPalAPIAvailable()) { + if ($this->_needValidation((int) $params['id_order'])) { + $admin_templates[] = 'validation'; + } + + if ($this->_needCapture((int) $params['id_order'])) { + $admin_templates[] = 'capture'; + } + + if ($this->_canRefund((int) $params['id_order'])) { + $admin_templates[] = 'refund'; + } + } + + if (count($admin_templates) > 0) { + $order = new Order((int) $params['id_order']); + $currency = new Currency($order->id_currency); + $cpt = new PaypalCapture(); + $cpt->id_order = (int) $order->id; + + if (version_compare(_PS_VERSION_, '1.5', '>=')) { + $order_state = $order->current_state; + } else { + $order_state = OrderHistory::getLastOrderState($order->id); + } + + $order_payment = Tools::strtolower($order->payment); + + $this->context->smarty->assign( + array( + 'authorization' => (int) Configuration::get('PAYPAL_OS_AUTHORIZATION'), + 'base_url' => Tools::getHttpHost(true).__PS_BASE_URI__, + 'module_name' => $this->name, + 'order_state' => $order_state, + 'order_payment' => $order_payment, + 'params' => $params, + 'id_currency' => $currency->getSign(), + 'rest_to_capture' => Tools::ps_round($cpt->getRestToPaid($order), '6'), + 'list_captures' => $cpt->getListCaptured(), + 'ps_version' => _PS_VERSION_, + ) + ); + + foreach ($admin_templates as $admin_template) { + $this->_html .= $this->fetchTemplate('/views/templates/admin/admin_order/'.$admin_template.'.tpl'); + $this->_postProcess(); + $this->_html .= ''; + } + } + + return $this->_html; + } + + public function hookCancelProduct($params) + { + if (Tools::isSubmit('generateDiscount') || !$this->isPayPalAPIAvailable() + || Tools::isSubmit('generateCreditSlip')) { + return false; + } elseif ($params['order']->module != $this->name || !($order = $params['order']) + || !Validate::isLoadedObject($order)) { + return false; + } elseif (!$order->hasBeenPaid()) { + return false; + } + + $order_detail = new OrderDetail((int) $params['id_order_detail']); + if (!$order_detail || !Validate::isLoadedObject($order_detail)) { + return false; + } + + $paypal_order = PayPalOrder::getOrderById((int) $order->id); + if (!$paypal_order) { + return false; + } + + $products = $order->getProducts(); + $cancel_quantity = Tools::getValue('cancelQuantity'); + $message = $this->l('Cancel products result:').'
'; + + $amount = (float) ($products[(int) $order_detail->id]['product_price_wt'] + * (int) $cancel_quantity[(int) $order_detail->id]); + $refund = $this->_makeRefund($paypal_order['id_transaction'], (int) $order->id, $amount); + $this->formatMessage($refund, $message); + $this->_addNewPrivateMessage((int) $order->id, $message); + } + + public function hookActionPSCleanerGetModulesTables() + { + return array('paypal_customer', 'paypal_order'); + } + + public function hookBackOfficeHeader() + { + if ((strcmp(Tools::getValue('configure'), $this->name) === 0) || + (strcmp(Tools::getValue('module_name'), $this->name) === 0)) { + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $output = ' + + + '; + } else { + $this->context->controller->addJquery(); + $this->context->controller->addJQueryPlugin('fancybox'); + $this->context->controller->addCSS(_MODULE_DIR_.$this->name.'/views/css/paypal.css'); + } + + $this->context->smarty->assign(array( + 'PayPal_module_dir' => _MODULE_DIR_.$this->name, + 'PayPal_WPS' => (int) WPS, + 'PayPal_HSS' => (int) HSS, + 'PayPal_ECS' => (int) ECS, + 'PayPal_PPP' => (int) PPP, + 'PayPal_PVZ' => (int) PVZ, + )); + + return (isset($output) ? $output : null).$this->fetchTemplate('/views/templates/admin/header.tpl'); + } + return null; + } + + public function renderExpressCheckoutButton($type) + { + if ((!Configuration::get('PAYPAL_EXPRESS_CHECKOUT_SHORTCUT') && !$this->useMobile())) { + return null; + } + + if (!in_array(ECS, $this->getPaymentMethods()) || (((int) Configuration::get('PAYPAL_BUSINESS') + == 1) && + (int) Configuration::get('PAYPAL_PAYMENT_METHOD') == HSS) && !$this->useMobile()) { + return null; + } + + $paypal_logos = $this->paypal_logos->getLogos(); + $iso_lang = array( + 'en' => 'en_US', + 'fr' => 'fr_FR', + 'de' => 'de_DE', + ); + + $this->context->smarty->assign(array( + 'use_mobile' => (bool) $this->useMobile(), + 'PayPal_payment_type' => $type, + 'PayPal_current_page' => $this->getCurrentUrl(), + 'PayPal_lang_code' => (isset($iso_lang[$this->context->language->iso_code])) + ? $iso_lang[$this->context->language->iso_code] : 'en_US', + 'PayPal_tracking_code' => $this->getTrackingCode((int) Configuration::get('PAYPAL_PAYMENT_METHOD')), + 'paypal_express_checkout_shortcut_logo' => isset($paypal_logos['ExpressCheckoutShortcutButton']) + ? $paypal_logos['ExpressCheckoutShortcutButton'] : false, + )); + + return $this->fetchTemplate('express_checkout_shortcut_button.tpl'); + } + + public function renderExpressCheckoutForm($type) + { + if ((!Configuration::get('PAYPAL_EXPRESS_CHECKOUT_SHORTCUT') && !$this->useMobile()) + || !in_array(ECS, $this->getPaymentMethods()) || + (((int) Configuration::get('PAYPAL_BUSINESS') == 1) && ((int) Configuration::get('PAYPAL_PAYMENT_METHOD') + == HSS) && !$this->useMobile())) { + return; + } + + $id_product = (int) Tools::getValue('id_product'); + $id_product_attribute = (int) Product::getDefaultAttribute($id_product); + if ($id_product_attribute) { + $minimal_quantity = Attribute::getAttributeMinimalQty($id_product_attribute); + } else { + $product = new Product($id_product); + $minimal_quantity = $product->minimal_quantity; + } + + $this->context->smarty->assign(array( + 'PayPal_payment_type' => $type, + 'PayPal_current_page' => $this->getCurrentUrl(), + 'id_product_attribute_ecs' => $id_product_attribute, + 'product_minimal_quantity' => $minimal_quantity, + 'PayPal_tracking_code' => $this->getTrackingCode((int) Configuration::get('PAYPAL_PAYMENT_METHOD')), + )); + + return $this->fetchTemplate('express_checkout_shortcut_form.tpl'); + } + + public function useMobile() + { + if ((method_exists($this->context, 'getMobileDevice') && $this->context->getMobileDevice()) + || Tools::getValue('ps_mobile_site')) { + return true; + } + + return false; + } + + public function isCountryAPAC() + { + $country = new Country(Configuration::get('PS_COUNTRY_DEFAULT')); + + $tabCountryApac = array('CN', 'JP', 'AU', 'HK', 'TW', 'NZ', 'BU', 'BN', 'KH', + 'ID', 'LA', 'MY', 'PH', 'SG', 'TH', + 'TL', 'VN'); + + if (in_array($country->iso_code, $tabCountryApac)) { + return true; + } + return false; + } + + public function getTrackingCode($method) + { + $isApacCountry = $this->isCountryAPAC(); + + if ((_PS_VERSION_ < '1.5') && (_THEME_NAME_ == 'prestashop_mobile' || Tools::getValue('ps_mobile_site') + == 1)) { + if (_PS_MOBILE_TABLET_) { + return $isApacCountry ? APAC_TABLET_TRACKING_CODE : TABLET_TRACKING_CODE; + } elseif (_PS_MOBILE_PHONE_) { + return $isApacCountry ? APAC_SMARTPHONE_TRACKING_CODE : SMARTPHONE_TRACKING_CODE; + } + + } + //Get Seamless checkout + + $login_user = false; + if (Configuration::get('PAYPAL_LOGIN')) { + $login_user = PaypalLoginUser::getByIdCustomer((int) $this->context->customer->id); + + if ($login_user && $login_user->expires_in <= time()) { + $obj = new PayPalLogin(); + $login_user = $obj->getRefreshToken(); + } + } + + if ($method == WPS) { + if ($login_user) { + return $isApacCountry ? APAC_TRACKING_EXPRESS_CHECKOUT_SEAMLESS : TRACKING_EXPRESS_CHECKOUT_SEAMLESS; + } else { + return $isApacCountry ? APAC_TRACKING_INTEGRAL : TRACKING_INTEGRAL; + } + + } + if ($method == HSS) { + return $isApacCountry ? APAC_TRACKING_INTEGRAL_EVOLUTION : TRACKING_INTEGRAL_EVOLUTION; + } + + if ($method == ECS) { + if ($login_user) { + return $isApacCountry ? APAC_TRACKING_EXPRESS_CHECKOUT_SEAMLESS : TRACKING_EXPRESS_CHECKOUT_SEAMLESS; + } else { + return $isApacCountry ? APAC_TRACKING_OPTION_PLUS : TRACKING_OPTION_PLUS; + } + + } + if ($method == PPP) { + return $isApacCountry ? APAC_TRACKING_PAYPAL_PLUS : TRACKING_PAYPAL_PLUS; + } + + return TRACKING_CODE; + } + + public function hookDisplayOrderConfirmation($params) + { + + $id_order = (int) Tools::getValue('id_order'); + $transactionId = Db::getInstance()->getValue('SELECT transaction FROM `'._DB_PREFIX_.'paypal_braintree` WHERE id_order = '.(int)$id_order); + if (!isset($transactionId) || empty($transactionId)) { + return; + } + $order = new Order($id_order); + + $price = Tools::displayPrice($order->total_paid_tax_incl, $this->context->currency); + + $this->context->smarty->assign(array( + 'transaction_id'=> $transactionId, + 'order' => (array)$order, + 'price' => $price, + + )); + return $this->fetchTemplate('braintree_confirm.tpl'); + } + + public function getTranslations() + { + $file = dirname(__FILE__).'/'._PAYPAL_TRANSLATIONS_XML_; + if (file_exists($file)) { + $xml = simplexml_load_file($file); + if (isset($xml) && $xml) { + $index = -1; + $content = $default = array(); + + while (isset($xml->country[++$index])) { + $country = $xml->country[$index]; + $country_iso = $country->attributes()->iso_code; + + if (($this->iso_code != 'default') && ($country_iso == $this->iso_code)) { + $content = (array) $country; + } elseif ($country_iso == 'default') { + $default = (array) $country; + } + + } + + $content += $default; + $this->context->smarty->assign('PayPal_content', $content); + + return true; + } + } + return false; + } + + public function getPayPalURL() + { + return 'www'.(Configuration::get('PAYPAL_SANDBOX') ? '.sandbox' : '').'.paypal.com'; + } + + public function getPaypalIntegralEvolutionUrl() + { + if (Configuration::get('PAYPAL_SANDBOX')) { + return 'https://'.$this->getPayPalURL().'/cgi-bin/acquiringweb'; + } + + return 'https://securepayments.paypal.com/acquiringweb?cmd=_hosted-payment'; + } + + public function getPaypalStandardUrl() + { + return 'https://'.$this->getPayPalURL().'/cgi-bin/webscr'; + } + + public function getAPIURL() + { + return 'api-3t'.(Configuration::get('PAYPAL_SANDBOX') ? '.sandbox' : '').'.paypal.com'; + } + + public function getAPIScript() + { + return '/nvp'; + } + + public function getPaymentMethods() + { + if (Configuration::get('PAYPAL_UPDATED_COUNTRIES_OK')) { + return AuthenticatePaymentMethods::authenticatePaymentMethodByLang(Tools::strtoupper($this->context->language->iso_code)); + } else { + $country = new Country((int) Configuration::get('PS_COUNTRY_DEFAULT')); + return AuthenticatePaymentMethods::authenticatePaymentMethodByCountry($country->iso_code); + } + } + + public function getCountryCode() + { + $cart = new Cart((int) $this->context->cookie->id_cart); + $address = new Address((int) $cart->id_address_invoice); + $country = new Country((int) $address->id_country); + + return $country->iso_code; + } + + public function displayPayPalAPIError($message, $log = false) + { + $send = true; + // Sanitize log + foreach ($log as $key => $string) { + if ($string == 'ACK -> Success') { + $send = false; + } elseif (Tools::substr($string, 0, 6) == 'METHOD') { + $values = explode('&', $string); + foreach ($values as $key2 => $value) { + $values2 = explode('=', $value); + foreach ($values2 as $key3 => $value2) { + if ($value2 == 'PWD' || $value2 == 'SIGNATURE') { + $values2[$key3 + 1] = '*********'; + } + } + + $values[$key2] = implode('=', $values2); + } + $log[$key] = implode('&', $values); + } + } + + $this->context->smarty->assign(array('message' => $message, 'logs' => $log)); + + if ($send) { + $id_lang = (int) $this->context->language->id; + $iso_lang = Language::getIsoById($id_lang); + + if (!is_dir(dirname(__FILE__).'/mails/'.Tools::strtolower($iso_lang))) { + $id_lang = Language::getIdByIso('en'); + } + + Mail::Send( + $id_lang, + 'error_reporting', + Mail::l('Error reporting from your PayPal module', (int) $this->context->language->id), + array('{logs}' => implode('
', $log)), + Configuration::get('PS_SHOP_EMAIL'), + null, + null, + null, + null, + null, + _PS_MODULE_DIR_.$this->name.'/mails/' + ); + } + + return $this->fetchTemplate('error.tpl'); + } + + private function _canRefund($id_order) + { + if (!(bool) $id_order) { + return false; + } + + $paypal_order = Db::getInstance()->getRow(' + SELECT `payment_status`, `capture` + FROM `'._DB_PREFIX_.'paypal_order` + WHERE `id_order` = '.(int) $id_order); + + + return ($paypal_order && in_array($paypal_order['payment_status'], array('Completed','approved','settled','submitted_for_settlement')) && $paypal_order['capture'] == 0); + } + + private function _needValidation($id_order) + { + if (!(int) $id_order) { + return false; + } + + $order = Db::getInstance()->getRow(' + SELECT `payment_method`, `payment_status` + FROM `'._DB_PREFIX_.'paypal_order` + WHERE `id_order` = '.(int) $id_order); + + return $order && $order['payment_method'] != HSS && $order['payment_status'] + == 'Pending_validation'; + } + + private function _needCapture($id_order) + { + if (!(int) $id_order) { + return false; + } + + $result = Db::getInstance()->getRow(' + SELECT `payment_method`, `payment_status` + FROM `'._DB_PREFIX_.'paypal_order` + WHERE `id_order` = '.(int) $id_order.' AND `capture` = 1'); + + return $result && ($result['payment_method'] != HSS && $result['payment_status'] == 'Pending_capture' || ($result['payment_method'] == PVZ || Configuration::get('PAYPAL_BRAINTREE_ENABLED')) && $result['payment_status'] == 'authorized'); + } + + private function _preProcess() + { + if (Tools::isSubmit('submitPaypal')) { + $business = Tools::getValue('business') !== false ? (int) Tools::getValue('business') + : false; + $payment_method = Tools::getValue('paypal_payment_method') !== false + ? (int) Tools::getValue('paypal_payment_method') : false; + $payment_capture = Tools::getValue('payment_capture') !== false ? (int) Tools::getValue('payment_capture') + : false; + $sandbox_mode = Tools::getValue('sandbox_mode') !== false ? (int) Tools::getValue('sandbox_mode') + : false; + if ($this->default_country === false || $sandbox_mode === false || $payment_capture + === false || $business === false || $payment_method === false) { + + $this->_errors[] = $this->l('Some fields are empty.'); + } elseif ($business == 0) { + $this->_errors[] = $this->l('Credentials fields cannot be empty'); + } elseif ($business == 1) { + + if (($payment_method == WPS || $payment_method == ECS) && (!Tools::getValue('api_username') + || !Tools::getValue('api_password') || !Tools::getValue('api_signature'))) { + $this->_errors[] = $this->l('Credentials fields cannot be empty'); + } + + if ($payment_method == PPP && (Tools::getValue('paypalplus_webprofile') + != 0 && (!Tools::getValue('client_id') && !Tools::getValue('secret')))) { + $this->_errors[] = $this->l('Credentials fields cannot be empty'); + } + + if ($payment_method == HSS && !Tools::getValue('api_business_account')) { + $this->_errors[] = $this->l('Business e-mail field cannot be empty'); + } + + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + $account_braintree = Tools::getValue('account_braintree'); + if ($payment_method == PVZ && empty($account_braintree[$currency->iso_code])) { + $this->_errors[] = sprintf($this->l('Braintree Account %s field cannot be empty'), $currency->iso_code); + } + + } + } + + return !count($this->_errors); + } + + private function _postProcess() + { + if (Tools::isSubmit('submitPaypal')) { + if (Tools::getValue('paypal_country_only')) { + Configuration::updateValue('PAYPAL_COUNTRY_DEFAULT', (int) Tools::getValue('paypal_country_only')); + } elseif ($this->_preProcess()) { + if ((int) Tools::getValue('paypal_payment_method') == 5) { + $refresh_webprofile = Configuration::get('PAYPAL_PLUS_CLIENT_ID') != Tools::getValue('client_id') + || Configuration::get('PAYPAL_PLUS_SECRET') != Tools::getValue('secret') + || Configuration::get('PAYPAL_SANDBOX') != (int) Tools::getValue('sandbox_mode'); + } else { + $refresh_webprofile = false; + } + Configuration::updateValue('PAYPAL_BUSINESS', (int) Tools::getValue('business')); + Configuration::updateValue('PAYPAL_PAYMENT_METHOD', (int) Tools::getValue('paypal_payment_method')); + Configuration::updateValue('PAYPAL_API_USER', trim(Tools::getValue('api_username'))); + Configuration::updateValue('PAYPAL_API_PASSWORD', trim(Tools::getValue('api_password'))); + Configuration::updateValue('PAYPAL_API_SIGNATURE', trim(Tools::getValue('api_signature'))); + Configuration::updateValue('PAYPAL_BUSINESS_ACCOUNT', trim(Tools::getValue('api_business_account'))); + Configuration::updateValue('PAYPAL_EXPRESS_CHECKOUT_SHORTCUT', (int) Tools::getValue('express_checkout_shortcut')); + Configuration::updateValue('PAYPAL_IN_CONTEXT_CHECKOUT_M_ID', Tools::getValue('in_context_checkout_merchant_id')); + + $sandbox = (int)Configuration::get('PAYPAL_SANDBOX'); + $switch_sandbox = false; + + Configuration::updateValue('PAYPAL_SANDBOX', (int) Tools::getValue('sandbox_mode')); + Configuration::updateValue('PAYPAL_CAPTURE', (int) Tools::getValue('payment_capture')); + /* USE PAYPAL LOGIN */ + Configuration::updateValue('PAYPAL_LOGIN', (int) Tools::getValue('paypal_login')); + Configuration::updateValue('PAYPAL_LOGIN_CLIENT_ID', Tools::getValue('paypal_login_client_id')); + Configuration::updateValue('PAYPAL_LOGIN_SECRET', Tools::getValue('paypal_login_client_secret')); + Configuration::updateValue('PAYPAL_LOGIN_TPL', (int) Tools::getValue('paypal_login_client_template')); + + Configuration::updateValue('PAYPAL_BRAINTREE_ENABLED', (int) Tools::getValue('braintree_enabled')); + Configuration::updateValue('PAYPAL_USE_3D_SECURE', (int) Tools::getValue('use_threedsecure')); + + if ($sandbox && $sandbox != (int) Tools::getValue('sandbox_mode')) { + $switch_sandbox = true; + + Configuration::updateValue('PAYPAL_BRAINTREE_ACCESS_TOKEN', null); + Configuration::updateValue('PAYPAL_BRAINTREE_EXPIRES_AT', null); + Configuration::updateValue('PAYPAL_BRAINTREE_REFRESH_TOKEN', null); + Configuration::updateValue('PAYPAL_BRAINTREE_MERCHANT_ID', null); + } + + //*TO DELETE* Configuration::updateValue('PAYPAL_BRAINTREE_ENABLED',Tools::getValue('braintree_enabled')); + //*TO DELETE* Configuration::updateValue('PAYPAL_BRAINTREE_PUBLIC_KEY', Tools::getValue('braintree_public_key')); + //*TO DELETE* Configuration::updateValue('PAYPAL_BRAINTREE_PRIVATE_KEY', Tools::getValue('braintree_private_key')); + // TO DELETE* Configuration::updateValue('PAYPAL_BRAINTREE_MERCHANT_ID', Tools::getValue('braintree_merchant_id')); + // TO DELETE* Configuration::updateValue('PAYPAL_USE_3D_SECURE',Tools::getValue('check3Dsecure')); + + /* USE PAYPAL PLUS */ + if ((int) Tools::getValue('paypal_payment_method') == 5) { + + Configuration::updateValue('PAYPAL_PLUS_CLIENT_ID', Tools::getValue('client_id')); + Configuration::updateValue('PAYPAL_PLUS_SECRET', Tools::getValue('secret')); + if ((int) Tools::getValue('paypalplus_webprofile') == 1 || $refresh_webprofile) { + unset($this->context->cookie->paypal_access_token_time_max); + unset($this->context->cookie->paypal_access_token_access_token); + $ApiPaypalPlus = new ApiPaypalPlus(); + $idWebProfile = $ApiPaypalPlus->getWebProfile(); + if ($idWebProfile) { + Configuration::updateValue('PAYPAL_WEB_PROFILE_ID', $idWebProfile); + } else { + Configuration::updateValue('PAYPAL_WEB_PROFILE_ID', '0'); + } + + } + } + /* IS IN_CONTEXT_CHECKOUT ENABLED */ + if ((int) Tools::getValue('paypal_payment_method') != 2) { + Configuration::updateValue('PAYPAL_IN_CONTEXT_CHECKOUT', (int) Tools::getValue('in_context_checkout')); + } else { + Configuration::updateValue('PAYPAL_IN_CONTEXT_CHECKOUT', 0); + } + + /* /IS IN_CONTEXT_CHECKOUT ENABLED */ + + //EXPRESS CHECKOUT TEMPLATE + Configuration::updateValue('PAYPAL_HSS_SOLUTION', (int) Tools::getValue('integral_evolution_solution')); + if (Tools::getValue('integral_evolution_solution') == PAYPAL_HSS_IFRAME) { + Configuration::updateValue('PAYPAL_HSS_TEMPLATE', 'D'); + } else { + Configuration::updateValue('PAYPAL_HSS_TEMPLATE', Tools::getValue('integral_evolution_template')); + } + + $account_brain = Tools::getValue('account_braintree'); + Configuration::updateValue('PAYPAL_ACCOUNT_BRAINTREE', Tools::jsonEncode($account_brain)); + + $this->context->smarty->assign('PayPal_save_success', true); + + if ($switch_sandbox) { + if ((int) Tools::getValue('sandbox_mode') == 1) { + return $this->displayWarning($this->l('You have switched from live to sandbox mode. Please reconfigure your products.')); + } else { + return $this->displayWarning($this->l('You have switched from sandbox to live mode. Please reconfigure your products.')); + } + } + + } else { + $this->_html = $this->displayError(implode('
', $this->_errors)); // Not displayed at this time + $this->context->smarty->assign('PayPal_save_failure', true); + } + } else if (Tools::getValue('accessToken')) { + Configuration::updateValue('PAYPAL_BRAINTREE_ENABLED', 1); + + Configuration::updateValue('PAYPAL_BRAINTREE_ACCESS_TOKEN', Tools::getValue('accessToken')); + Configuration::updateValue('PAYPAL_BRAINTREE_EXPIRES_AT', Tools::getValue('expiresAt')); + Configuration::updateValue('PAYPAL_BRAINTREE_REFRESH_TOKEN', Tools::getValue('refreshToken')); + Configuration::updateValue('PAYPAL_BRAINTREE_MERCHANT_ID', Tools::getValue('merchantId')); + + } + + return $this->loadLangDefault(); + } + + private function _makeRefund($id_transaction, $id_order, $amt = false) + { + if (!$this->isPayPalAPIAvailable()) { + die(Tools::displayError('Fatal Error: no API Credentials are available')); + } elseif (!$id_transaction) { + die(Tools::displayError('Fatal Error: id_transaction is null')); + } + + $payment_method = Configuration::get('PAYPAL_PAYMENT_METHOD'); + + $id_paypal_braintree = Db::getInstance()->getValue(' + SELECT `id_paypal_braintree` + FROM `'._DB_PREFIX_.'paypal_braintree` + WHERE `id_order` = '.(int) $id_order); + + if (Configuration::get('PAYPAL_BRAINTREE_ENABLED') && $id_paypal_braintree) { + if (!$amt) { + $amt = Db::getInstance()->getValue(' + SELECT total_paid + FROM `'._DB_PREFIX_.'orders` o + WHERE o.`id_order` = '.(int) $id_order); + } + include_once(_PS_MODULE_DIR_.'paypal/classes/Braintree.php'); + $braintree = new PrestaBraintree(); + + $transaction_status = $braintree->getTransactionStatus($id_transaction); + + if ($transaction_status == 'submitted_for_settlement') { + $result = $braintree->void($id_transaction); + } else { + $result = $braintree->refund($id_transaction, $amt); + } + + return $result; + } elseif ($payment_method != PPP) { + + if (!$amt) { + $params = array('TRANSACTIONID' => $id_transaction, 'REFUNDTYPE' => 'Full'); + } else { + $iso_currency = Db::getInstance()->getValue(' + SELECT `iso_code` + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'currency` c ON (o.`id_currency` = c.`id_currency`) + WHERE o.`id_order` = '.(int) $id_order); + + $params = array('TRANSACTIONID' => $id_transaction, 'REFUNDTYPE' => 'Partial', + 'AMT' => (float) $amt, 'CURRENCYCODE' => Tools::strtoupper($iso_currency)); + } + + $paypal_lib = new PaypalLib(); + + return $paypal_lib->makeCall( + $this->getAPIURL(), + $this->getAPIScript(), + 'RefundTransaction', + '&'.http_build_query($params, '', '&') + ); + } else { + + if (!$amt) { + + $params = new stdClass(); + } else { + + $result = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_.'paypal_order WHERE id_transaction = "'.pSQL($id_transaction).'"'); + $result = current($result); + + $amount = new stdClass(); + $amount->total = $amt; + $amount->currency = $result['currency']; + + $params = new stdClass(); + $params->amount = $amount; + } + + $callApiPaypalPlus = new CallApiPaypalPlus(); + + return Tools::jsonDecode($callApiPaypalPlus->executeRefund($id_transaction, $params)); + } + } + + public function _addNewPrivateMessage($id_order, $message) + { + if (!(bool) $id_order) { + return false; + } + + $new_message = new Message(); + $message = strip_tags($message, '
'); + + if (!Validate::isCleanHtml($message)) { + $message = $this->l('Payment message is not valid, please check your module.'); + } + + $new_message->message = $message; + $new_message->id_order = (int) $id_order; + $new_message->private = 1; + + return $new_message->add(); + } + + private function _doTotalRefund($id_order) + { + $paypal_order = PayPalOrder::getOrderById((int) $id_order); + if (!$this->isPayPalAPIAvailable() || !$paypal_order) { + return false; + } + + $order = new Order((int) $id_order); + if (!Validate::isLoadedObject($order)) { + return false; + } + + $products = $order->getProducts(); + $currency = new Currency((int) $order->id_currency); + if (!Validate::isLoadedObject($currency)) { + $this->_errors[] = $this->l('Not a valid currency'); + } + + if (count($this->_errors)) { + return false; + } + + $decimals = (is_array($currency) ? (int) $currency['decimals'] : (int) $currency->decimals) * _PS_PRICE_DISPLAY_PRECISION_; + + // Amount for refund + $amt = 0.00; + + foreach ($products as $product) { + $amt += (float) ($product['product_price_wt']) * ($product['product_quantity'] - $product['product_quantity_refunded']); + } + + $amt += (float) ($order->total_shipping) + (float) ($order->total_wrapping) - (float) ($order->total_discounts); + + // check if total or partial + if (Tools::ps_round($order->total_paid_real, $decimals) == Tools::ps_round($amt, $decimals)) { + $response = $this->_makeRefund($paypal_order['id_transaction'], $id_order); + } else { + $response = $this->_makeRefund($paypal_order['id_transaction'], $id_order, (float) ($amt)); + } + + $message = $this->l('Refund operation result:')." \r\n"; + foreach ($response as $key => $value) { + if (is_object($value) || is_array($value)) { + $message .= $key.': '.Tools::jsonEncode($value)." \r\n"; + } else { + $message .= $key.': '.$value." \r\n"; + } + } + if ((array_key_exists('ACK', $response) && $response['ACK'] == 'Success' && $response['REFUNDTRANSACTIONID'] != '') || (isset($response->state) && $response->state == 'completed') || ((Configuration::get('PAYPAL_PAYMENT_METHOD') || Configuration::get('PAYPAL_BRAINTREE_ENABLED')) && $response)) { + + if (Configuration::get('PAYPAL_BRAINTREE_ENABLED') && !is_array($response)) { + $message .= $this->l('Braintree refund successful!'); + } else { + $message .= $this->l('PayPal refund successful!'); + } + + if (!Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'paypal_order` SET `payment_status` = \'Refunded\' WHERE `id_order` = '.(int) $id_order)) { + die(Tools::displayError('Error when updating PayPal database')); + } + + $history = new OrderHistory(); + $history->id_order = (int) $id_order; + $history->changeIdOrderState((int) Configuration::get('PS_OS_REFUND'), $history->id_order); + $history->addWithemail(); + $history->save(); + } else { + $message .= $this->l('Transaction error!'); + } + + $this->_addNewPrivateMessage((int) $id_order, $message); + + Tools::redirect($_SERVER['HTTP_REFERER']); + } + + private function _doCapture($id_order, $capture_amount = false, $is_complete = false) + { + $paypal_order = PayPalOrder::getOrderById((int) $id_order); + if (!$this->isPayPalAPIAvailable() || !$paypal_order) { + return false; + } + + $order = new Order((int) $id_order); + $currency = new Currency((int) $order->id_currency); + + if (!$capture_amount) { + $capture_amount = (float) $order->total_paid; + } + + $sql = 'SELECT transaction + FROM '._DB_PREFIX_.'paypal_braintree + WHERE id_order = '.(int)$id_order; + + $transaction_braintree = Db::getInstance()->getValue($sql); + + if ($transaction_braintree) { + include_once(_PS_MODULE_DIR_.'paypal/classes/Braintree.php'); + $braintree = new PrestaBraintree(); + $result_transaction = $braintree->submitForSettlement($transaction_braintree, $amount); + if (!$result_transaction) { + if ($braintree->error == 'Authorization_expired') { + die(Tools::displayError($this->l('The authorization of the banking transaction has expired. For more information, please refer to the expiration cases.'))); + } + } + + $captureBraintree = new PaypalCapture(); + $captureBraintree->id_order = (int)$id_order; + $captureBraintree->capture_amount = (float)$capture_amount; + $captureBraintree->result = 'Completed'; + $captureBraintree->save(); + + + if (!($captureBraintree->getRestToCapture($captureBraintree->id_order))) { + //plus d'argent a capturer + if (!Db::getInstance()->Execute( + 'UPDATE `' . _DB_PREFIX_ . 'paypal_order` + SET `capture` = 0, `payment_status` = \'Completed\' + WHERE `id_order` = ' . (int)$id_order + ) + ) { + die(Tools::displayError('Error when updating PayPal database')); + } + + $order_history = new OrderHistory(); + $order_history->id_order = (int)$id_order; + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $order_history->changeIdOrderState(Configuration::get('PAYPAL_BT_OS_AUTHORIZATION'), (int)$id_order); + } else { + $order_history->changeIdOrderState(Configuration::get('PAYPAL_BT_OS_AUTHORIZATION'), $order); + } + + $order_history->addWithemail(); + $message = $this->l('Order finished with PayPal!'); + } + + } else { + $complete = 'Complete'; + if (!$is_complete) { + $complete = 'NotComplete'; + } + + $paypal_lib = new PaypalLib(); + $response = $paypal_lib->makeCall( + $this->getAPIURL(), + $this->getAPIScript(), + 'DoCapture', + '&' . http_build_query(array('AMT' => $capture_amount, 'AUTHORIZATIONID' => $paypal_order['id_transaction'], 'CURRENCYCODE' => $currency->iso_code, 'COMPLETETYPE' => $complete), '', '&') + ); + $message = $this->l('Capture operation result:') . '
'; + + foreach ($response as $key => $value) { + $message .= $key . ': ' . $value . '
'; + } + + $capture = new PaypalCapture(); + $capture->id_order = (int)$id_order; + $capture->capture_amount = (float)$capture_amount; + + if ((array_key_exists('ACK', $response)) && ($response['ACK'] == 'Success') + && ($response['PAYMENTSTATUS'] == 'Completed') + ) { + $capture->result = pSQL($response['PAYMENTSTATUS']); + if ($capture->save()) { + if (!($capture->getRestToCapture($capture->id_order))) { + //plus d'argent a capturer + if (!Db::getInstance()->Execute( + 'UPDATE `' . _DB_PREFIX_ . 'paypal_order` + SET `capture` = 0, `payment_status` = \'' . pSQL($response['PAYMENTSTATUS']) . '\', `id_transaction` = \'' . pSQL($response['TRANSACTIONID']) . '\' + WHERE `id_order` = ' . (int)$id_order + ) + ) { + die(Tools::displayError('Error when updating PayPal database')); + } + + $order_history = new OrderHistory(); + $order_history->id_order = (int)$id_order; + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $order_history->changeIdOrderState(Configuration::get('PS_OS_WS_PAYMENT'), (int)$id_order); + } else { + $order_history->changeIdOrderState(Configuration::get('PS_OS_WS_PAYMENT'), $order); + } + + $order_history->addWithemail(); + $message .= $this->l('Order finished with PayPal!'); + } + } + } elseif (isset($response['PAYMENTSTATUS'])) { + $capture->result = pSQL($response['PAYMENTSTATUS']); + $capture->save(); + $message .= $this->l('Transaction error!'); + } + + $this->_addNewPrivateMessage((int)$id_order, $message); + } + Tools::redirect($_SERVER['HTTP_REFERER']); + } + + private function _updatePaymentStatusOfOrder($id_order) + { + if (!(bool) $id_order || !$this->isPayPalAPIAvailable()) { + return false; + } + + $paypal_order = PayPalOrder::getOrderById((int) $id_order); + if (!$paypal_order) { + return false; + } + + $paypal_lib = new PaypalLib(); + $response = $paypal_lib->makeCall( + $this->getAPIURL(), + $this->getAPIScript(), + 'GetTransactionDetails', + '&'.http_build_query(array('TRANSACTIONID' => $paypal_order['id_transaction']), '', '&') + ); + + if (array_key_exists('ACK', $response)) { + if ($response['ACK'] == 'Success' && isset($response['PAYMENTSTATUS'])) { + $history = new OrderHistory(); + $history->id_order = (int) $id_order; + + if ($response['PAYMENTSTATUS'] == 'Completed') { + $history->changeIdOrderState(Configuration::get('PS_OS_PAYMENT'), (int) $id_order); + } elseif (($response['PAYMENTSTATUS'] == 'Pending') && ($response['PENDINGREASON'] + == 'authorization')) { + $history->changeIdOrderState((int) (Configuration::get('PAYPAL_OS_AUTHORIZATION')), (int) $id_order); + } elseif ($response['PAYMENTSTATUS'] == 'Reversed') { + $history->changeIdOrderState(Configuration::get('PS_OS_ERROR'), (int) $id_order); + } + + $history->addWithemail(); + + if (!Db::getInstance()->Execute( + 'UPDATE `'._DB_PREFIX_.'paypal_order` + SET `payment_status` = \''.pSQL($response['PAYMENTSTATUS']).($response['PENDINGREASON'] == 'authorization' ? '_authorization' : '').'\' + WHERE `id_order` = '.(int) $id_order + ) + ) { + die(Tools::displayError('Error when updating PayPal database')); + } + + } + + $message = $this->l('Verification status :').'
'; + $this->formatMessage($response, $message); + $this->_addNewPrivateMessage((int) $id_order, $message); + + return $response; + } + + return false; + } + + public function fetchTemplate($name) + { + if (version_compare(_PS_VERSION_, '1.4', '<')) { + $this->context->smarty->currentTemplate = $name; + } elseif (version_compare(_PS_VERSION_, '1.5', '<')) { + $views = 'views/templates/'; + if (@filemtime(dirname(__FILE__).'/'.$name)) { + return $this->display(__FILE__, $name); + } elseif (@filemtime(dirname(__FILE__).'/'.$views.'hook/'.$name)) { + return $this->display(__FILE__, $views.'hook/'.$name); + } elseif (@filemtime(dirname(__FILE__).'/'.$views.'front/'.$name)) { + return $this->display(__FILE__, $views.'front/'.$name); + } elseif (@filemtime(dirname(__FILE__).'/'.$views.'admin/'.$name)) { + return $this->display(__FILE__, $views.'admin/'.$name); + } + + } + + return $this->display(__FILE__, $name); + } + + public static function getPayPalCustomerIdByEmail($email) + { + return Db::getInstance()->getValue( + 'SELECT `id_customer` + FROM `'._DB_PREFIX_.'paypal_customer` + WHERE paypal_email = \''.pSQL($email).'\'' + ); + } + + public static function getPayPalEmailByIdCustomer($id_customer) + { + return Db::getInstance()->getValue( + 'SELECT `paypal_email` + FROM `'._DB_PREFIX_.'paypal_customer` + WHERE `id_customer` = '.(int) $id_customer + ); + } + + public static function addPayPalCustomer($id_customer, $email) + { + if (!PayPal::getPayPalEmailByIdCustomer($id_customer)) { + Db::getInstance()->Execute( + 'INSERT INTO `'._DB_PREFIX_.'paypal_customer` (`id_customer`, `paypal_email`) + VALUES('.(int) $id_customer.', \''.pSQL($email).'\')' + ); + + return Db::getInstance()->Insert_ID(); + } + + return false; + } + + private function warningsCheck() + { + if (Configuration::get('PAYPAL_PAYMENT_METHOD') == HSS && Configuration::get('PAYPAL_BUSINESS_ACCOUNT') == 'paypal@prestashop.com') { + $this->warning = $this->l('You are currently using the default PayPal e-mail address, please enter your own e-mail address.').'
'; + } + + /* Check preactivation warning */ + if (Configuration::get('PS_PREACTIVATION_PAYPAL_WARNING')) { + $this->warning .= (!empty($this->warning)) ? ', ' : Configuration::get('PS_PREACTIVATION_PAYPAL_WARNING').'
'; + } + + if (!function_exists('curl_init')) { + $this->warning .= $this->l('In order to use your module, please activate cURL (PHP extension)'); + } + + } + + private function loadLangDefault() + { + if (Configuration::get('PAYPAL_UPDATED_COUNTRIES_OK')) { + $this->iso_code = Tools::strtoupper($this->context->language->iso_code); + if ($this->iso_code == 'EN') { + $iso_code = 'GB'; + } else { + $iso_code = $this->iso_code; + } + + $this->default_country = Country::getByIso($iso_code); + } else { + $this->default_country = (int) Configuration::get('PS_COUNTRY_DEFAULT'); + $country = new Country($this->default_country); + $this->iso_code = Tools::strtoupper($country->iso_code); + } + + //$this->iso_code = AuthenticatePaymentMethods::getCountryDependency($iso_code); + } + + public function formatMessage($response, &$message) + { + foreach ($response as $key => $value) { + $message .= $key.': '.$value.'
'; + } + + } + + private function checkCurrency($cart) + { + $currency_module = $this->getCurrency((int) $cart->id_currency); + + if ((int) $cart->id_currency == (int) $currency_module->id) { + return true; + } else { + return false; + } + + } + + public static function getShopDomainSsl($http = false, $entities = false) + { + if (method_exists('Tools', 'getShopDomainSsl')) { + return Tools::getShopDomainSsl($http, $entities); + } else { + if (!($domain = Configuration::get('PS_SHOP_DOMAIN_SSL'))) { + $domain = self::getHttpHost(); + } + + if ($entities) { + $domain = htmlspecialchars($domain, ENT_COMPAT, 'UTF-8'); + } + + if ($http) { + $domain = (Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').$domain; + } + + return $domain; + } + } + + public function validateOrder($id_cart, $id_order_state, $amount_paid, $payment_method = 'Unknown', $message = null, $transaction = array(), $currency_special = null, $dont_touch_amount = false, $secure_key = false, Shop $shop = null) + { + if ($this->active) { + // Set transaction details if pcc is defined in PaymentModule class_exists + if (isset($this->pcc)) { + $this->pcc->transaction_id = (isset($transaction['transaction_id']) ? $transaction['transaction_id'] : ''); + } + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + parent::validateOrder( + (int) $id_cart, + (int) $id_order_state, + (float) $amount_paid, + $payment_method, + $message, + $transaction, + $currency_special, + $dont_touch_amount, + $secure_key + ); + } else { + parent::validateOrder( + (int) $id_cart, + (int) $id_order_state, + (float) $amount_paid, + $payment_method, + $message, + $transaction, + $currency_special, + $dont_touch_amount, + $secure_key, + $shop + ); + } + + if (count($transaction) > 0) { + PayPalOrder::saveOrder((int) $this->currentOrder, $transaction); + } + + $this->setPayPalAsConfigured(); + } + } + + protected function getGiftWrappingPrice() + { + if (version_compare(_PS_VERSION_, '1.5.3.0', '>=')) { + $wrapping_fees_tax_inc = $this->context->cart->getGiftWrappingPrice(); + } else { + $wrapping_fees = (float) (Configuration::get('PS_GIFT_WRAPPING_PRICE')); + $wrapping_fees_tax = new Tax((int) (Configuration::get('PS_GIFT_WRAPPING_TAX'))); + $wrapping_fees_tax_inc = $wrapping_fees * (1 + (((float) ($wrapping_fees_tax->rate) / 100))); + } + + return (float) Tools::convertPrice($wrapping_fees_tax_inc, $this->context->currency); + } + + public function redirectToConfirmation() + { + $shop_url = PayPal::getShopDomainSsl(true, true); + + // Check if user went through the payment preparation detail and completed it + $detail = unserialize($this->context->cookie->express_checkout); + + if (!empty($detail['payer_id']) && !empty($detail['token'])) { + $values = array('get_confirmation' => true); + $link = $shop_url._MODULE_DIR_.$this->name.'/express_checkout/payment.php'; + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + Tools::redirectLink($link.'?'.http_build_query($values, '', '&')); + } else { + Tools::redirect(Context::getContext()->link->getModuleLink('paypal', 'confirm', $values)); + } + + } + } + + /** + * Check if the current page use SSL connection on not + * + * @return bool uses SSL + */ + public function usingSecureMode() + { + if (isset($_SERVER['HTTPS'])) { + return ($_SERVER['HTTPS'] == 1 || Tools::strtolower($_SERVER['HTTPS']) == 'on'); + } + + // $_SERVER['SSL'] exists only in some specific configuration + if (isset($_SERVER['SSL'])) { + return ($_SERVER['SSL'] == 1 || Tools::strtolower($_SERVER['SSL']) == 'on'); + } + + return false; + } + + protected function getCurrentUrl() + { + $protocol_link = $this->usingSecureMode() ? 'https://' : 'http://'; + $request = $_SERVER['REQUEST_URI']; + $pos = strpos($request, '?'); + + if (($pos !== false) && ($pos >= 0)) { + $request = Tools::substr($request, 0, $pos); + } + + $params = urlencode($_SERVER['QUERY_STRING']); + + return $protocol_link.Tools::getShopDomainSsl().$request.'?'.$params; + } + + /** + * Use $this->comp instead of bccomp which is not added in all versions of PHP + * @param float $num1 number 1 to compare + * @param float $num2 number 2 to compare + * @param [type] $scale [description] + */ + public function comp($num1, $num2, $scale = null) + { + // check if they're valid positive numbers, extract the whole numbers and decimals + if (!preg_match("/^\+?(\d+)(\.\d+)?$/", $num1, $tmp1) || !preg_match("/^\+?(\d+)(\.\d+)?$/", $num2, $tmp2)) { + return ('0'); + } + + // remove leading zeroes from whole numbers + $num1 = ltrim($tmp1[1], '0'); + $num2 = ltrim($tmp2[1], '0'); + + // first, we can just check the lengths of the numbers, this can help save processing time + // if $num1 is longer than $num2, return 1.. vice versa with the next step. + if (Tools::strlen($num1) > Tools::strlen($num2)) { + return 1; + } else { + if (Tools::strlen($num1) < Tools::strlen($num2)) { + return -1; + } else { + // if the two numbers are of equal length, we check digit-by-digit + + // remove ending zeroes from decimals and remove point + $dec1 = isset($tmp1[2]) ? rtrim(Tools::substr($tmp1[2], 1), '0') : ''; + $dec2 = isset($tmp2[2]) ? rtrim(Tools::substr($tmp2[2], 1), '0') : ''; + + // if the user defined $scale, then make sure we use that only + if ($scale != null) { + $dec1 = Tools::substr($dec1, 0, $scale); + $dec2 = Tools::substr($dec2, 0, $scale); + } + + // calculate the longest length of decimals + $d_len = max(Tools::strlen($dec1), Tools::strlen($dec2)); + + // append the padded decimals onto the end of the whole numbers + $num1 .= str_pad($dec1, $d_len, '0'); + $num2 .= str_pad($dec2, $d_len, '0'); + + // check digit-by-digit, if they have a difference, return 1 or -1 (greater/lower than) + for ($i = 0; $i < Tools::strlen($num1); $i++) { + if ((int) $num1{$i} > (int) $num2{$i}) { + return 1; + } elseif ((int) $num1{$i} < (int) $num2{$i}) { + return -1; + } + + } + // if the two numbers have no difference (they're the same).. return 0 + return 0; + } + } + } + + public function assignCartSummary() + { + $currency = new Currency((int) $this->context->cart->id_currency); + + $this->context->smarty->assign(array( + 'total' => Tools::displayPrice($this->context->cart->getOrderTotal(true), $currency), + 'logos' => $this->paypal_logos->getLogos(), + 'use_mobile' => (bool) $this->useMobile(), + 'address_shipping' => new Address($this->context->cart->id_address_delivery), + 'address_billing' => new Address($this->context->cart->id_address_invoice), + 'cart' => $this->context->cart, + 'patternRules' => array('avoid' => array()), + 'cart_image_size' => version_compare(_PS_VERSION_, '1.5', '<') ? 'small' : version_compare(_PS_VERSION_, '1.6', '<') ? 'small_default' : 'cart_default', + 'useStyle14' => version_compare(_PS_VERSION_, '1.5', '<'), + 'useStyle15' => version_compare(_PS_VERSION_, '1.5', '>') && version_compare(_PS_VERSION_, '1.6', '<'), + )); + + $this->context->smarty->assign(array( + 'paypal_cart_summary' => $this->display(__FILE__, 'views/templates/hook/paypal_cart_summary.tpl'), + )); + } + + public function set_good_context() + { + $account_braintree = Tools::jsonDecode(Configuration::get('PAYPAL_ACCOUNT_BRAINTREE'), true); + $currency = new Currency($this->context->cart->id_currency); + $this->context_modified = false; + $this->id_currency_origin_cart = $this->context->cart->id_currency; + $this->id_currency_origin_cookie = $this->context->cookie->id_currency; + + return $account_braintree[$currency->iso_code]; + } + + public function reset_context() + { + if ($this->context_modified) { + $this->context->cart->id_currency = $this->id_currency_origin_cart; + $this->context->cookie->id_currency = $this->id_currency_origin_cookie; + } + } + + // FOR PRESTASHOP 1.4 + public function hookPDFInvoice($params) + { + return $this->hookDisplayPDFInvoice($params); + } + + public function hookDisplayPDFInvoice($params) + { + + $order_detail = PaypalPlusPui::getByIdOrder($params['object']->id_order); + $information = Tools::jsonDecode($order_detail['pui_informations'], true); + $tab = ' + + + + + + + + + + +
'.$this->l('Bank name').''.$information['recipient_banking_instruction']['bank_name'].'
'.$this->l('Account holder name').''.$information['recipient_banking_instruction']['account_holder_name'].'
'.$this->l('IBAN').''.$information['recipient_banking_instruction']['international_bank_account_number'].'
'.$this->l('BIC').''.$information['recipient_banking_instruction']['bank_identifier_code'].'
'.$this->l('Amount due / currency').''.$information['amount']['value'].' '.$information['amount']['currency'].'
'.$this->l('Payment due date').''.$information['payment_due_date'].'
'.$this->l('reference').''.$information['reference_number'].'
'; + return $tab; + } +} diff --git a/modules/paypal/paypal_install.php b/modules/paypal/paypal_install.php new file mode 100644 index 000000000..4de3e2e6e --- /dev/null +++ b/modules/paypal/paypal_install.php @@ -0,0 +1,287 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +class PayPalInstall +{ + /** + * Create PayPal tables + */ + public function createTables() + { + /* Set database */ + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_order` ( + `id_order` int(10) unsigned NOT NULL, + `id_transaction` varchar(255) NOT NULL, + `id_invoice` varchar(255) DEFAULT NULL, + `currency` varchar(10) NOT NULL, + `total_paid` varchar(50) NOT NULL, + `shipping` varchar(50) NOT NULL, + `capture` int(2) NOT NULL, + `payment_date` varchar(50) NOT NULL, + `payment_method` int(2) unsigned NOT NULL, + `payment_status` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id_order`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8')) { + return false; + } + + /* Set database */ + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_customer` ( + `id_paypal_customer` int(10) unsigned NOT NULL AUTO_INCREMENT, + `id_customer` int(10) unsigned NOT NULL, + `paypal_email` varchar(255) NOT NULL, + PRIMARY KEY (`id_paypal_customer`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 AUTO_INCREMENT=1')) { + return false; + } + + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_login_user` ( + `id_paypal_login_user` INT(11) AUTO_INCREMENT, + `id_customer` INT(11) NOT NULL, + `token_type` VARCHAR(255) NOT NULL, + `expires_in` VARCHAR(255) NOT NULL, + `refresh_token` VARCHAR(255) NOT NULL, + `id_token` VARCHAR(255) NOT NULL, + `access_token` VARCHAR(255) NOT NULL, + `account_type` VARCHAR(255) NOT NULL, + `user_id` VARCHAR(255) NOT NULL, + `verified_account` VARCHAR(255) NOT NULL, + `zoneinfo` VARCHAR(255) NOT NULL, + `age_range` VARCHAR(255) NOT NULL, + PRIMARY KEY (`id_paypal_login_user`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8')) { + return false; + } + + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_capture` ( + `id_paypal_capture` int(11) NOT NULL AUTO_INCREMENT, + `id_order` int(11) NOT NULL, + `capture_amount` float NOT NULL, + `result` text NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_paypal_capture`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;')) { + return false; + } + + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_braintree` ( + `id_paypal_braintree` int(11) NOT NULL AUTO_INCREMENT, + `id_cart` int(11) NOT NULL, + `nonce_payment_token` varchar(255) NOT NULL, + `client_token` text NOT NULL, + `transaction` varchar(255) NULL, + `datas` varchar(255) NULL, + `id_order` int(11) NULL, + PRIMARY KEY (`id_paypal_braintree`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;')) { + return false; + } + + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_plus_pui` ( + `id_paypal_plus_pui` int(11) NOT NULL AUTO_INCREMENT, + `id_order` int(11) NOT NULL, + `pui_informations` text NOT NULL, + PRIMARY KEY (`id_paypal_plus_pui`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; + ')) { + return false; + } + } + + /** + * Set configuration table + */ + public function updateConfiguration($paypal_version) + { + Configuration::updateValue('PAYPAL_SANDBOX', 0); + Configuration::updateValue('PAYPAL_HEADER', ''); + Configuration::updateValue('PAYPAL_BUSINESS', 0); + Configuration::updateValue('PAYPAL_BUSINESS_ACCOUNT', 'paypal@prestashop.com'); + Configuration::updateValue('PAYPAL_API_USER', ''); + Configuration::updateValue('PAYPAL_API_PASSWORD', ''); + Configuration::updateValue('PAYPAL_API_SIGNATURE', ''); + Configuration::updateValue('PAYPAL_EXPRESS_CHECKOUT', 0); + Configuration::updateValue('PAYPAL_CAPTURE', 0); + Configuration::updateValue('PAYPAL_PAYMENT_METHOD', WPS); + Configuration::updateValue('PAYPAL_NEW', 1); + Configuration::updateValue('PAYPAL_DEBUG_MODE', 0); + Configuration::updateValue('PAYPAL_SHIPPING_COST', 20.00); + Configuration::updateValue('PAYPAL_VERSION', $paypal_version); + Configuration::updateValue('PAYPAL_COUNTRY_DEFAULT', (int) Configuration::get('PS_COUNTRY_DEFAULT')); + Configuration::updateValue('PAYPAL_USE_3D_SECURE', 0); + // PayPal v3 configuration + Configuration::updateValue('PAYPAL_EXPRESS_CHECKOUT_SHORTCUT', 0); + //$paypal = new Paypal(); + //$ssl_verif = new TLSVerificator(true, $paypal); + //Configuration::updateValue('PAYPAL_VERSION_TLS_CHECKED', $ssl_verif->getVersion()); + + Configuration::updateValue('VZERO_ENABLED', 0); + Configuration::updateValue('PAYPAL_BRAINTREE_ENABLED', 0); + } + + /** + * Delete PayPal configuration + */ + public function deleteConfiguration() + { + Configuration::deleteByName('PAYPAL_SANDBOX'); + Configuration::deleteByName('PAYPAL_HEADER'); + Configuration::deleteByName('PAYPAL_BUSINESS'); + Configuration::deleteByName('PAYPAL_API_USER'); + Configuration::deleteByName('PAYPAL_API_PASSWORD'); + Configuration::deleteByName('PAYPAL_API_SIGNATURE'); + Configuration::deleteByName('PAYPAL_BUSINESS_ACCOUNT'); + Configuration::deleteByName('PAYPAL_EXPRESS_CHECKOUT'); + Configuration::deleteByName('PAYPAL_PAYMENT_METHOD'); + Configuration::deleteByName('PAYPAL_TEMPLATE'); + Configuration::deleteByName('PAYPAL_CAPTURE'); + Configuration::deleteByName('PAYPAL_DEBUG_MODE'); + Configuration::deleteByName('PAYPAL_COUNTRY_DEFAULT'); + Configuration::deleteByName('PAYPAL_VERSION'); + + /* USE PAYPAL LOGIN */ + Configuration::deleteByName('PAYPAL_LOGIN'); + Configuration::deleteByName('PAYPAL_LOGIN_CLIENT_ID'); + Configuration::deleteByName('PAYPAL_LOGIN_SECRET'); + Configuration::deleteByName('PAYPAL_LOGIN_TPL'); + /* /USE PAYPAL LOGIN */ + + // PayPal v3 configuration + Configuration::deleteByName('PAYPAL_EXPRESS_CHECKOUT_SHORTCUT'); + + Configuration::deleteByName('PAYPAL_BRAINTREE_ENABLED'); + + // Braintree access credentials + Configuration::deleteByName('PAYPAL_BRAINTREE_ACCESS_TOKEN'); + Configuration::deleteByName('PAYPAL_BRAINTREE_EXPIRE_AT'); + Configuration::deleteByName('PAYPAL_BRAINTREE_REFRESH_TOKEN'); + Configuration::deleteByName('PAYPAL_BRAINTREE_MERCHANT_ID'); + } + + /** + * Create a new order state + */ + public function createOrderState() + { + if (!Configuration::get('PAYPAL_OS_AUTHORIZATION')) { + $order_state = new OrderState(); + $order_state->name = array(); + + foreach (Language::getLanguages() as $language) { + if (Tools::strtolower($language['iso_code']) == 'fr') { + $order_state->name[$language['id_lang']] = 'Autorisation acceptée par PayPal'; + } else { + $order_state->name[$language['id_lang']] = 'Authorization accepted from PayPal'; + } + + } + + $order_state->send_email = false; + $order_state->color = '#DDEEFF'; + $order_state->hidden = false; + $order_state->delivery = false; + $order_state->logable = true; + $order_state->invoice = true; + + if ($order_state->add()) { + $source = dirname(__FILE__).'/../../img/os/'.Configuration::get('PS_OS_PAYPAL').'.gif'; + $destination = dirname(__FILE__).'/../../img/os/'.(int) $order_state->id.'.gif'; + copy($source, $destination); + } + Configuration::updateValue('PAYPAL_OS_AUTHORIZATION', (int) $order_state->id); + } + + // OS BRAINTREE + + if (!Configuration::get('PAYPAL_BT_OS_AUTHORIZATION', false)) { + $order_state_auth = new OrderState(); + $order_state_auth->name = array(); + + + foreach (Language::getLanguages() as $language) { + if (Tools::strtolower($language['iso_code']) == 'fr') { + $order_state_auth->name[$language['id_lang']] = 'Autorisation acceptée par Braintree'; + } else { + $order_state_auth->name[$language['id_lang']] = 'Authorization accepted from Braintree'; + } + + } + $order_state_auth->send_email = false; + $order_state_auth->color = '#4169E1'; + $order_state_auth->hidden = false; + $order_state_auth->delivery = false; + $order_state_auth->logable = true; + $order_state_auth->invoice = true; + if ($order_state_auth->add()) { + $source = _PS_MODULE_DIR_.'paypal/views/img/logos/os_braintree.png'; + $destination = _PS_ROOT_DIR_.'/img/os/'.(int) $order_state_auth->id.'.gif'; + copy($source, $destination); + } + Configuration::updateValue('PAYPAL_BT_OS_AUTHORIZATION', (int) $order_state_auth->id); + } + + + if (!Configuration::get('PAYPAL_BRAINTREE_OS_AWAITING', false)) { + $order_state_wait = new OrderState(); + $order_state_wait->name = array(); + + + foreach (Language::getLanguages() as $language) { + if (Tools::strtolower($language['iso_code']) == 'fr') { + $order_state_wait->name[$language['id_lang']] = 'En attente de paiement Braintree'; + } else { + $order_state_wait->name[$language['id_lang']] = 'Awaiting for Braintree payment'; + } + + } + $order_state_wait->send_email = false; + $order_state_wait->color = '#4169E1'; + $order_state_wait->hidden = false; + $order_state_wait->delivery = false; + $order_state_wait->logable = true; + $order_state_wait->invoice = false; + if ($order_state_wait->add()) { + $source = _PS_MODULE_DIR_.'paypal/views/img/logos/os_braintree.png'; + $destination = _PS_ROOT_DIR_.'/img/os/'.(int) $order_state_wait->id.'.gif'; + copy($source, $destination); + + } + Configuration::updateValue('PAYPAL_BRAINTREE_OS_AWAITING', (int) $order_state_wait->id); + } + + } +} diff --git a/modules/paypal/paypal_login/PayPalLoginUser.php b/modules/paypal/paypal_login/PayPalLoginUser.php new file mode 100644 index 000000000..d93c70807 --- /dev/null +++ b/modules/paypal/paypal_login/PayPalLoginUser.php @@ -0,0 +1,141 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + die(header('HTTP/1.0 404 Not Found')); +} + +/** + * Description of totRules + * + * @author 202-ecommerce + */ +class PaypalLoginUser extends ObjectModel +{ + + public $id_customer; + public $token_type; + public $expires_in; + public $refresh_token; + public $id_token; + public $access_token; + public $account_type; + public $user_id; + public $verified_account; + public $zoneinfo; + public $age_range; + + protected $table = 'paypal_login_user'; + protected $identifier = 'id_paypal_login_user'; + protected $fieldsRequired = array( + 'id_customer', + 'token_type', + 'expires_in', + 'refresh_token', + 'id_token', + 'access_token', + 'user_id', + 'verified_account', + 'zoneinfo', + ); + + protected $fieldsValidate = array( + 'id_customer' => 'isInt', + 'token_type' => 'isString', + 'expires_in' => 'isString', + 'refresh_token' => 'isString', + 'id_token' => 'isString', + 'access_token' => 'isString', + 'account_type' => 'isString', + 'user_id' => 'isString', + 'verified_account' => 'isString', + 'zoneinfo' => 'isString', + 'age_range' => 'isString', + + ); + + public function __construct($id = false, $id_lang = false) + { + parent::__construct($id, $id_lang); + } + + public function getFields() + { + parent::validateFields(); + $fields = array(); + foreach (array_keys($this->fieldsValidate) as $field) { + $fields[$field] = $this->$field; + } + + return $fields; + } + + public static function getPaypalLoginUsers($id_paypal_login_user = false, $id_customer = false, $refresh_token = false) + { + $sql = " + SELECT `id_paypal_login_user` + FROM `"._DB_PREFIX_."paypal_login_user` + WHERE 1 + "; + + if ($id_paypal_login_user && Validate::isInt($id_paypal_login_user)) { + $sql .= " AND `id_paypal_login_user` = '".(int) $id_paypal_login_user."' "; + } + + if ($id_customer && Validate::isInt($id_customer)) { + $sql .= " AND `id_customer` = '".(int) $id_customer."' "; + } + + if ($refresh_token) { + $sql .= " AND `refresh_token` = '".pSQL($refresh_token)."' "; + } + + $results = DB::getInstance()->executeS($sql); + $logins = array(); + + if ($results && count($results)) { + foreach ($results as $result) { + $logins[$result['id_paypal_login_user']] = new PaypalLoginUser((int) $result['id_paypal_login_user']); + } + + } + + return $logins; + } + + public static function getByIdCustomer($id_customer) + { + $login = self::getPaypalLoginUsers(false, $id_customer); + + if ($login && count($login)) { + $login = current($login); + } else { + $login = false; + } + + return $login; + } +} diff --git a/modules/paypal/paypal_login/index.php b/modules/paypal/paypal_login/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/paypal_login/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/paypal_login/paypal_login.php b/modules/paypal/paypal_login/paypal_login.php new file mode 100644 index 000000000..c497066dc --- /dev/null +++ b/modules/paypal/paypal_login/paypal_login.php @@ -0,0 +1,255 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +class PayPalLogin +{ + private $_logs = array(); + private $enable_log = false; + + private $paypal_connect = null; + + public function __construct() + { + $this->paypal_connect = new PayPalConnect(); + } + + public function getIdentityAPIURL() + { + if (Configuration::get('PAYPAL_SANDBOX')) { + //return 'www.sandbox.paypal.com'; + return 'api.sandbox.paypal.com'; + } else { + return 'api.paypal.com'; + } + + } + + public function getTokenServiceEndpoint() + { + if (Configuration::get('PAYPAL_SANDBOX')) { + // return '/webapps/auth/protocol/openidconnect/v1/tokenservice'; + return '/v1/identity/openidconnect/tokenservice'; + } else { + return '/v1/identity/openidconnect/tokenservice'; + } + + } + + public function getUserInfoEndpoint() + { + return '/v1/identity/openidconnect/userinfo'; + } + + public static function getReturnLink() + { + // return 'http://requestb.in/1jlaizq1'; + if (method_exists(Context::getContext()->shop, 'getBaseUrl')) { + return Context::getContext()->shop->getBaseUrl().'modules/paypal/paypal_login/paypal_login_token.php'; + } else { + return 'http://'.Configuration::get('PS_SHOP_DOMAIN').'/modules/paypal/paypal_login/paypal_login_token.php'; + } + + } + + public function getAuthorizationCode() + { + unset($this->_logs); + + $context = Context::getContext(); + $is_logged = (method_exists($context->customer, 'isLogged') ? $context->customer->isLogged() : $context->cookie->isLogged()); + + if ($is_logged) { + return $this->getRefreshToken(); + } + + $params = array( + 'grant_type' => 'authorization_code', + 'code' => Tools::getValue('code'), + 'redirect_url' => PayPalLogin::getReturnLink(), + ); + + $request = http_build_query($params, '', '&'); + $result = $this->paypal_connect->makeConnection($this->getIdentityAPIURL(), $this->getTokenServiceEndpoint(), $request, false, false, true); + + /* + if ($this->enable_log === true) { + $handle = fopen(dirname(__FILE__).'/Results.txt', 'a+'); + fwrite($handle, "Request => ".print_r($request, true)."\r\n"); + fwrite($handle, "Result => ".print_r($result, true)."\r\n"); + fwrite($handle, "Journal => ".print_r($this->_logs, true."\r\n")); + fclose($handle); + }*/ + + $result = Tools::jsonDecode($result); + + if ($result) { + + $login = new PayPalLoginUser(); + + $customer = $this->getUserInformations($result->access_token, $login); + + if (!$customer) { + return false; + } + + $temp = PaypalLoginUser::getByIdCustomer((int) $context->customer->id); + + if ($temp) { + $login = $temp; + } + + $login->id_customer = $customer->id; + $login->token_type = $result->token_type; + $login->expires_in = (string) (time() + (int) $result->expires_in); + $login->refresh_token = $result->refresh_token; + $login->id_token = $result->id_token; + $login->access_token = $result->access_token; + + $login->save(); + + return $login; + } + } + + public function getRefreshToken() + { + unset($this->_logs); + $login = PaypalLoginUser::getByIdCustomer((int) Context::getContext()->customer->id); + + if (!is_object($login)) { + return false; + } + + $params = array( + 'grant_type' => 'refresh_token', + 'refresh_token' => $login->refresh_token, + ); + + $request = http_build_query($params, '', '&'); + $result = $this->paypal_connect->makeConnection($this->getIdentityAPIURL(), $this->getTokenServiceEndpoint(), $request, false, false, true); + + /* + if ($this->enable_log === true) { + $handle = fopen(dirname(__FILE__).'/Results.txt', 'a+'); + fwrite($handle, "Request => ".print_r($request, true)."\r\n"); + fwrite($handle, "Result => ".print_r($result, true)."\r\n"); + fwrite($handle, "Journal => ".print_r($this->_logs, true."\r\n")); + fclose($handle); + } + */ + + $result = Tools::jsonDecode($result); + + if ($result) { + $login->access_token = $result->access_token; + $login->expires_in = (string) (time() + $result->expires_in); + $login->save(); + return $login; + } + + return false; + } + + private function getUserInformations($access_token, &$login) + { + unset($this->_logs); + $headers = array( + // 'Content-Type:application/json', + 'Authorization: Bearer '.$access_token, + ); + + $params = array( + 'schema' => 'openid', + ); + + $request = http_build_query($params, '', '&'); + $result = $this->paypal_connect->makeConnection($this->getIdentityAPIURL(), $this->getUserInfoEndpoint(), $request, false, $headers, true); + + /* + if ($this->enable_log === true) { + $handle = fopen(dirname(__FILE__).'/Results.txt', 'a+'); + fwrite($handle, "Request => ".print_r($request, true)."\r\n"); + fwrite($handle, "Result => ".print_r($result, true)."\r\n"); + fwrite($handle, "Headers => ".print_r($headers, true)."\r\n"); + fwrite($handle, "Journal => ".print_r($this->_logs, true."\r\n")); + fclose($handle); + } + */ + + $result = Tools::jsonDecode($result); + + if ($result) { + $customer = new Customer(); + $customer = $customer->getByEmail($result->email); + + if (!$customer) { + $customer = $this->setCustomer($result); + } + + $login->account_type = $result->account_type; + $login->user_id = $result->user_id; + $login->verified_account = $result->verified_account; + $login->zoneinfo = $result->zoneinfo; + $login->age_range = $result->age_range; + + return $customer; + } + + return false; + } + + private function setCustomer($result) + { + $customer = new Customer(); + $customer->firstname = $result->given_name; + $customer->lastname = $result->family_name; + if (version_compare(_PS_VERSION_, '1.5.3.1', '>')) { + $customer->id_lang = Language::getIdByIso(strstr($result->language, '_', true)); + } + + $customer->birthday = $result->birthday; + $customer->email = $result->email; + $customer->passwd = Tools::encrypt(Tools::passwdGen()); + $customer->save(); + + $result_address = $result->address; + + $address = new Address(); + $address->id_customer = $customer->id; + $address->id_country = Country::getByIso($result_address->country); + $address->alias = 'My address'; + $address->lastname = $customer->lastname; + $address->firstname = $customer->firstname; + $address->address1 = $result_address->street_address; + $address->postcode = $result_address->postal_code; + $address->city = $result_address->locality; + $address->phone = $result->phone_number; + + $address->save(); + + return $customer; + } +} diff --git a/modules/paypal/paypal_login/paypal_login_token.php b/modules/paypal/paypal_login/paypal_login_token.php new file mode 100644 index 000000000..2ddbc949e --- /dev/null +++ b/modules/paypal/paypal_login/paypal_login_token.php @@ -0,0 +1,59 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +header('Content-Type: text/html; charset=utf-8'); +include_once dirname(__FILE__).'/../../../config/config.inc.php'; +include_once _PS_ROOT_DIR_.'/init.php'; + + +include_once _PS_MODULE_DIR_.'paypal/paypal.php'; +include_once _PS_MODULE_DIR_.'paypal/paypal_login/paypal_login.php'; +include_once _PS_MODULE_DIR_.'paypal/paypal_login/PayPalLoginUser.php'; + +$login = new PayPalLogin(); + +$obj = $login->getAuthorizationCode(); +if ($obj) { + $context = Context::getContext(); + $customer = new Customer((int) $obj->id_customer); + $context->cookie->id_customer = (int) ($customer->id); + $context->cookie->customer_lastname = $customer->lastname; + $context->cookie->customer_firstname = $customer->firstname; + $context->cookie->logged = 1; + $customer->logged = 1; + $context->cookie->is_guest = $customer->isGuest(); + $context->cookie->passwd = $customer->passwd; + $context->cookie->email = $customer->email; + $context->customer = $customer; + $context->cookie->write(); +} + +?> + + diff --git a/modules/paypal/paypal_logos.php b/modules/paypal/paypal_logos.php new file mode 100644 index 000000000..470f48dc1 --- /dev/null +++ b/modules/paypal/paypal_logos.php @@ -0,0 +1,153 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +class PayPalLogos +{ + private $iso_code = null; + + const LOCAL = 'Local'; + const HORIZONTAL = 'Horizontal'; + const VERTICAL = 'Vertical'; + + public function __construct($iso_code) + { + $this->iso_code = $iso_code; + } + + public function getLogos() + { + $file = dirname(__FILE__).'/'._PAYPAL_LOGO_XML_; + + if (!file_exists($file)) { + return false; + } + + $xml = simplexml_load_file($file); + $logos = array(); + + if (isset($xml) && $xml != false) { + foreach ($xml->country as $item) { + $tmp_iso_code = (string) $item->attributes()->iso_code; + $logos[$tmp_iso_code] = (array) $item; + } + + if (!isset($logos[$this->iso_code])) { + $result = $this->getLocalLogos($logos['default'], 'default'); + } else { + $result = $this->getLocalLogos($logos[$this->iso_code], $this->iso_code); + } + + $result['default'] = $this->getLocalLogos($logos['default'], 'default'); + + return $result; + } + + return false; + } + + public function getCardsLogo($vertical = false) + { + $logos = $this->getLogos(); + + $orientation = $vertical === true ? self::VERTICAL : self::HORIZONTAL; + $logo_ref = self::LOCAL.'PayPal'.$orientation.'SolutionPP'; + + if (array_key_exists($logo_ref, $logos)) { + return $logos[$logo_ref]; + } elseif (($vertical !== false) && isset($logos[self::LOCAL.'PayPal'.self::HORIZONTAL.'SolutionPP'])) { + return $logos[self::LOCAL.'PayPal'.self::HORIZONTAL.'SolutionPP']; + } + + if (isset($logos['default'][self::LOCAL.'Local'.$orientation.'SolutionPP'])) { + return _MODULE_DIR_._PAYPAL_MODULE_DIRNAME_.$logos['default'][self::LOCAL.'Local'.$orientation.'SolutionPP']; + } + + return false; + } + + public function getLocalLogos(array $values, $iso_code) + { + foreach ($values as $key => $value) { + if (!is_array($value)) { + // Search for image file name + preg_match('#.*/([\w._-]*)$#', $value, $logo); + + if ((count($logo) == 2) && (strstr($key, 'Local') === false)) { + $destination = _PAYPAL_MODULE_DIRNAME_.'/views/img/logos/'.$iso_code.'_'.$logo[1]; + $this->updatePictures($logo[0], $destination); + + // Define the local path after picture have been downloaded + $values['Local'.$key] = _MODULE_DIR_.$destination; + + // Load back office cards path + if (file_exists(dirname(__FILE__).'/views/img/bo-cards/'.Tools::strtoupper($iso_code).'_bo_cards.png')) { + $values['BackOfficeCards'] = _MODULE_DIR_._PAYPAL_MODULE_DIRNAME_.'/views/img/bo-cards/'.Tools::strtoupper($iso_code).'_bo_cards.png'; + } else if (file_exists(dirname(__FILE__).'/views/img/bo-cards/default.png')) { + $values['BackOfficeCards'] = _MODULE_DIR_._PAYPAL_MODULE_DIRNAME_.'/views/img/bo-cards/default.png'; + } + + } else if (isset($values['Local'.$key])) { + // Use the local version + $values['Local'.$key] = _MODULE_DIR_._PAYPAL_MODULE_DIRNAME_.$values['Local'.$key]; + } + + } + } + + return $values; + } + + private function updatePictures($source, $destination, $force = false) + { + $wrappers = stream_get_wrappers(); + $https_wrapper = in_array('https', $wrappers) ? true : false; + + // 604800 => One week timestamp + if (!file_exists(_PS_MODULE_DIR_.$destination) || ((time() - filemtime(_PS_MODULE_DIR_.$destination)) > 604800) || $force) { + $picture = Tools::file_get_contents($source); + if ((bool) $picture !== false) { + if ($handle = @fopen(_PS_MODULE_DIR_.$destination, 'w+')) { + $size = fwrite($handle, $picture); + if ($size > 0 || (file_exists(_MODULE_DIR_.$destination) && (@filesize(_MODULE_DIR_.$destination) > 0))) { + return _MODULE_DIR_.$destination; + } + + } + } elseif (strstr($source, 'https')) { + return $this->updatePictures(str_replace('https', 'http', $source), $destination); + } else { + return false; + } + + } + + return _MODULE_DIR_.$destination; + } +} diff --git a/modules/paypal/paypal_orders.php b/modules/paypal/paypal_orders.php new file mode 100644 index 000000000..6d16de26d --- /dev/null +++ b/modules/paypal/paypal_orders.php @@ -0,0 +1,155 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +/* + * PayPal notification fields + */ +define('ID_INVOICE', 'invoice'); +define('ID_PAYER', 'payer_id'); +define('ID_TRANSACTION', 'txn_id'); +define('CURRENCY', 'mc_currency'); +define('PAYER_EMAIL', 'payer_email'); +define('PAYMENT_DATE', 'payment_date'); +define('TOTAL_PAID', 'mc_gross'); +define('SHIPPING', 'shipping'); +define('VERIFY_SIGN', 'verify_sign'); + +class PayPalOrder +{ + /* + * Get PayPal order data + * - ID Order + * - ID Transaction + * - ID Invoice + * - Currency (ISO) + * - Total paid + * - Shipping + * - Capture (bool) + * - Payment date + * - Payment method (int) + * - Payment status + */ + + public static function getTransactionDetails($ppec = false, $payment_status = false) + { + if ($ppec && $payment_status) { + $transaction_id = pSQL($ppec->result['PAYMENTINFO_0_TRANSACTIONID']); + return array( + 'currency' => pSQL($ppec->result['PAYMENTINFO_0_CURRENCYCODE']), + 'id_invoice' => null, + 'id_transaction' => $transaction_id, + 'transaction_id' => $transaction_id, + 'total_paid' => (float) $ppec->result['PAYMENTINFO_0_AMT'], + 'shipping' => (float) $ppec->result['PAYMENTREQUEST_0_SHIPPINGAMT'], + 'payment_date' => pSQL($ppec->result['PAYMENTINFO_0_ORDERTIME']), + 'payment_status' => pSQL($payment_status), + ); + } else { + $transaction_id = pSQL(Tools::getValue(ID_TRANSACTION)); + return array( + 'currency' => pSQL(Tools::getValue(CURRENCY)), + 'id_invoice' => pSQL(Tools::getValue(ID_INVOICE)), + 'id_transaction' => $transaction_id, + 'transaction_id' => $transaction_id, + 'total_paid' => (float) Tools::getValue(TOTAL_PAID), + 'shipping' => (float) Tools::getValue(SHIPPING), + 'payment_date' => pSQL(Tools::getValue(PAYMENT_DATE)), + 'payment_status' => pSQL($payment_status), + ); + } + } + + public static function getOrderById($id_order) + { + return Db::getInstance()->getRow( + 'SELECT * FROM `'._DB_PREFIX_.'paypal_order` + WHERE `id_order` = '.(int) $id_order + ); + } + + public static function getIdOrderByTransactionId($id_transaction) + { + $sql = 'SELECT `id_order` + FROM `'._DB_PREFIX_.'paypal_order` + WHERE `id_transaction` = \''.pSQL($id_transaction).'\''; + + $result = Db::getInstance()->getRow($sql); + + if ($result != false) { + return (int) $result['id_order']; + } + + return 0; + } + + public static function saveOrder($id_order, $transaction) + { + $order = new Order((int) $id_order); + $total_paid = (float) $transaction['total_paid']; + + if (!isset($transaction['payment_status']) || !$transaction['payment_status']) { + $transaction['payment_status'] = 'NULL'; + } + + Db::getInstance()->Execute( + 'INSERT INTO `'._DB_PREFIX_.'paypal_order` + (`id_order`, `id_transaction`, `id_invoice`, `currency`, `total_paid`, `shipping`, `capture`, `payment_date`, `payment_method`, `payment_status`) + VALUES ('.(int) $id_order.', \''.pSQL($transaction['id_transaction']).'\', \''.pSQL($transaction['id_invoice']).'\', + \''.pSQL($transaction['currency']).'\', + \''.$total_paid.'\', + \''.(float) $transaction['shipping'].'\', + \''.(int) Configuration::get('PAYPAL_CAPTURE').'\', + \''.pSQL($transaction['payment_date']).'\', + \''.(int) Configuration::get('PAYPAL_PAYMENT_METHOD').'\', + \''.pSQL($transaction['payment_status']).'\')' + ); + } + + public static function updateOrder($id_order, $transaction) + { + $total_paid = (float) $transaction['total_paid']; + + if (!isset($transaction['payment_status']) || !$transaction['payment_status']) { + $transaction['payment_status'] = 'NULL'; + } + + $sql = 'UPDATE `'._DB_PREFIX_.'paypal_order` + SET `payment_status` = \''.pSQL($transaction['payment_status']).'\' + WHERE `id_order` = \''.(int) $id_order.'\' + AND `id_transaction` = \''.pSQL($transaction['id_transaction']).'\' + AND `currency` = \''.pSQL($transaction['currency']).'\''; + if ((int) Configuration::get('PAYPAL_SANDBOX') != 1) { + $sql .= 'AND `total_paid` = \''.pSQL($transaction['total_paid']).'\' + AND `shipping` = \''.(float) $transaction['shipping'].'\';'; + } + + Db::getInstance()->Execute($sql); + } +} diff --git a/modules/paypal/paypal_plus/index.php b/modules/paypal/paypal_plus/index.php new file mode 100644 index 000000000..187d3649c --- /dev/null +++ b/modules/paypal/paypal_plus/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/paypal_plus/submit.php b/modules/paypal/paypal_plus/submit.php new file mode 100644 index 000000000..edd6e6cfe --- /dev/null +++ b/modules/paypal/paypal_plus/submit.php @@ -0,0 +1,237 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +include_once dirname(__FILE__).'/../../../config/config.inc.php'; +include_once _PS_ROOT_DIR_.'/init.php'; + + +/* + * Init var + */ + +if (version_compare(_PS_VERSION_, '1.5', '<')) { + include_once _PS_MODULE_DIR_.'paypal/backward_compatibility/backward.php'; + $context = Context::getContext(); + $ajax = Tools::getValue('ajax'); + /* + * Pour la version 1.4 + */ + if ($ajax) { + displayAjax($context); + } else { + displayConfirm($context); + } +} else { + $values = array( + 'id_cart' => (int) Tools::getValue('id_cart'), + 'id_module' => (int) Module::getInstanceByName('paypal')->id, + 'paymentId' => Tools::getValue('paymentId'), + 'token' => Tools::getValue('token'), + ); + $values['key'] = Context::getContext()->customer->secure_key; + $link = Context::getContext()->link->getModuleLink('paypal', 'submitplus', $values); + Tools::redirect($link); + die(); +} + +function displayConfirm($context) +{ + include _PS_ROOT_DIR_.'/header.php'; + + $paypal = new PayPal(); + + $id_module = (int) Module::getInstanceByName('paypal')->id; + $id_cart = Tools::getValue('id_cart'); + $paymentId = Tools::getValue('paymentId'); + $token = Tools::getValue('token'); + + if (!empty($id_cart) && !empty($paymentId) && !empty($token)) { + $CallApiPaypalPlus = new CallApiPaypalPlus(); + $payment = Tools::jsonDecode($CallApiPaypalPlus->lookUpPayment($paymentId)); + + if (isset($payment->state)) { + $context->smarty->assign('state', $payment->state); + + $paypal->assignCartSummary(); + + $transaction = array( + 'id_transaction' => $payment->id, + 'payment_status' => $payment->state, + 'currency' => $payment->transactions[0]->amount->currency, + 'payment_date' => date("Y-m-d H:i:s"), + 'total_paid' => $payment->transactions[0]->amount->total, + 'id_invoice' => 0, + 'shipping' => 0, + ); + + switch ($payment->state) { + case 'created': + /* LookUp OK */ + /* Affichage bouton confirmation */ + + $context->smarty->assign(array( + 'PayerID' => $payment->payer->payer_info->payer_id, + 'paymentId' => $paymentId, + 'id_cart' => $id_cart, + 'totalAmount' => Tools::displayPrice(Cart::getTotalCart($id_cart)), + 'linkSubmitPlus' => _MODULE_DIR_.'paypal/paypal_plus/submit.php', + )); + break; + + case 'canceled': + /* LookUp cancel */ + $paypal->validateOrder( + $id_cart, + getOrderStatus('order_canceled'), + $payment->transactions[0]->amount->total, + $payment->payer->payment_method, + null, + $transaction + ); + break; + + default: + /* Erreur de payment */ + $paypal->validateOrder( + $id_cart, + getOrderStatus('payment_error'), + $payment->transactions[0]->amount->total, + $payment->payer->payment_method, + null, + $transaction + ); + + break; + } + } else { + $context->smarty->assign('state', 'failed'); + } + } else { + $context->smarty->assign('state', 'failed'); + } + + echo $context->smarty->fetch(_PS_MODULE_DIR_.'paypal/views/templates/front/order-confirmation-plus.tpl'); + + include _PS_ROOT_DIR_.'/footer.php'; + + die(); +} + +function displayAjax($context) +{ + $id_cart = Tools::getValue('id_cart'); + $payerID = Tools::getValue('payerID'); + $paymentId = Tools::getValue('paymentId'); + $submit = Tools::getValue('submit'); + $paypal = new PayPal(); + $return = array(); + + if ( + (!empty($id_cart) && $context->cart->id == $id_cart) && + !empty($payerID) && + !empty($paymentId) && + !empty($submit) + ) { + include_once _PS_MODULE_DIR_.'paypal/paypal.php'; + + $CallApiPaypalPlus = new CallApiPaypalPlus(); + $payment = Tools::jsonDecode($CallApiPaypalPlus->executePayment($payerID, $paymentId)); + + if (isset($payment->state)) { + $transaction = array( + 'id_transaction' => $payment->transactions[0]->related_resources[0]->sale->id, + 'payment_status' => $payment->state, + 'total_paid' => $payment->transactions[0]->amount->total, + 'id_invoice' => 0, + 'shipping' => 0, + 'currency' => $payment->transactions[0]->amount->currency, + 'payment_date' => date("Y-m-d H:i:s"), + ); + + if ($submit == 'confirmPayment') { + if ($payment->state == 'approved') { + $paypal->validateOrder( + $id_cart, + getOrderStatus('payment'), + $payment->transactions[0]->amount->total, + $payment->payer->payment_method, + null, + $transaction + ); + $return['success'][] = $paypal->l('Your payment has been taken into account'); + } else { + $paypal->validateOrder( + $id_cart, + getOrderStatus('payment_error'), + $payment->transactions[0]->amount->total, + $payment->payer->payment_method, + null, + $transaction + ); + $return['error'][] = $paypal->l('An error occured during the payment'); + } + + if (isset($payment->payment_instruction)) { + $order = Order::getOrderByCartId($id_cart); + $paypal_plus_pui = new PaypalPlusPui(); + $paypal_plus_pui->id_order = $order->id; + $paypal_plus_pui->pui_informations = Tools::jsonEncode($payment->payment_instruction); + } + } elseif ($submit == 'confirmCancel') { + $paypal->validateOrder( + $id_cart, + getOrderStatus('order_canceled'), + $payment->transactions[0]->amount->total, + $payment->payer->payment_method, + null, + $transaction + ); + $return['success'][] = $paypal->l('Your order has been canceled'); + } else { + $return['error'][] = $paypal->l('An error occured during the payment'); + } + } else { + $return['error'][] = $paypal->l('An error occured during the payment'); + } + } else { + $return['error'][] = $paypal->l('An error occured during the payment'); + } + + echo Tools::jsonEncode($return); + die(); +} + +function getOrderStatus($template) +{ + /* + * payment + * payment_error + * order_canceled + * refund + */ + $context = Context::getContext(); + return Db::getInstance()->getValue('SELECT id_order_state FROM '._DB_PREFIX_.'order_state_lang WHERE template = "'.pSQL($template).'" AND id_lang = "'.(int) $context->cookie->id_lang.'"'); +} diff --git a/modules/paypal/paypal_tools.php b/modules/paypal/paypal_tools.php new file mode 100644 index 000000000..b32389a31 --- /dev/null +++ b/modules/paypal/paypal_tools.php @@ -0,0 +1,88 @@ + + * @copyright 2007-2018 PrestaShop SA + * @version Release: $Revision: 14390 $ + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +class PayPalTools +{ + protected $name = null; + + public function __construct($module_name) + { + $this->name = $module_name; + } + + public function moveTopPayments($position) + { + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $hook_payment = (int) Hook::get('payment'); + } else { + $hook_payment = (int) Hook::getIdByName('payment'); + } + + $module_instance = Module::getInstanceByName($this->name); + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $module_info = Hook::getModuleFromHook($hook_payment, $module_instance->id); + } else { + $module_info = Hook::getModulesFromHook($hook_payment, $module_instance->id); + } + + if ((isset($module_info['position']) && (int) $module_info['position'] > (int) $position) || + (isset($module_info['m.position']) && (int) $module_info['m.position'] > (int) $position)) { + return $module_instance->updatePosition($hook_payment, 0, (int) $position); + } + + return $module_instance->updatePosition($hook_payment, 1, (int) $position); + } + + public function moveRightColumn($position) + { + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $hook_right = (int) Hook::get('rightColumn'); + } else { + $hook_right = (int) Hook::getIdByName('rightColumn'); + } + + $module_instance = Module::getInstanceByName($this->name); + + if (version_compare(_PS_VERSION_, '1.5', '<')) { + $module_info = Hook::getModuleFromHook($hook_right, $module_instance->id); + } else { + $module_info = Hook::getModulesFromHook($hook_right, $module_instance->id); + } + + if ((isset($module_info['position']) && (int) $module_info['position'] > (int) $position) || + (isset($module_info['m.position']) && (int) $module_info['m.position'] > (int) $position)) { + return $module_instance->updatePosition($hook_right, 0, (int) $position); + } + + return $module_instance->updatePosition($hook_right, 1, (int) $position); + } +} diff --git a/modules/paypal/pl.php b/modules/paypal/pl.php new file mode 100644 index 000000000..1cdae56c6 --- /dev/null +++ b/modules/paypal/pl.php @@ -0,0 +1,128 @@ +paypal_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Acceptez le paiements par cartes de crédits (CB, Visa, MasterCard, Amex, Aurore, Cofinoga, 4 stars) avec PayPal.'; +$_MODULE['<{paypal}prestashop>paypal_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Êtes-vous certain de vouloir supprimer vos informations ?'; +$_MODULE['<{paypal}prestashop>paypal_8b57f95f1e9cf09dc028fa5a671781ff'] = 'Toutes les fonctionnalités du module PayPal API sont incluses dans le nouveau module PayPal. Avant tout, pour ne pas rencontrer de conflits, veuillez ne pas utiliser ou supprimer le module PayPal API.'; +$_MODULE['<{paypal}prestashop>paypal_c91f1fb5e06286c3e0a33fc552dffbea'] = 'Vous devez renseigner vos identifiants PayPal Integral pour que votre thème mobile fonctionne correctement.'; +$_MODULE['<{paypal}prestashop>paypal_bd6b3cca1e559117a964cdfab6a977cf'] = 'Le thème mobile fonctionne seulement avec la solution de paiement mobile PayPal. Veuillez activer le module pour bénéficier de possibilités de paiements.'; +$_MODULE['<{paypal}prestashop>paypal_c9d8a8d3c76c69e9a5ba6387acb8655a'] = 'Avant d\'utiliser le module vous devez installer le module \"Rétro-compatibilité\".'; +$_MODULE['<{paypal}prestashop>paypal_ea5eb3f904bf42377277255cbd0e2251'] = 'Pour fonctionner correctement le module \"Rétro-compatibilité\" doit être activé.'; +$_MODULE['<{paypal}prestashop>paypal_48878e69ef59b9e9d2d9a8c18e4de520'] = 'Pour fonctionner correctement ce module requiert le module \"Rétro-compatibilité\" v'; +$_MODULE['<{paypal}prestashop>paypal_20fda49ece75d93bea97648ab1f1f1cf'] = 'Annulation des produits :'; +$_MODULE['<{paypal}prestashop>paypal_90ab0cfd410722553c79e614207a789a'] = 'Certains champs sont vides.'; +$_MODULE['<{paypal}prestashop>paypal_ce0e2b401002ca796d2e8aca7deb8f00'] = 'Les champs des identifiants ne peuvent être vides'; +$_MODULE['<{paypal}prestashop>paypal_3f7145179c909f0e87a911a3171986b6'] = 'Le champs E-mail professionnel ne peut être vide'; +$_MODULE['<{paypal}prestashop>paypal_e5d5d9f40763cfe6549bef705e3529a7'] = 'Le message de paiement n\'est pas valide, veuillez vérifier votre module'; +$_MODULE['<{paypal}prestashop>paypal_ee9dc1e678d54c517f481583c3fb2db8'] = 'Devise invalide'; +$_MODULE['<{paypal}prestashop>paypal_eec39bf42bd135971fb2d838c67d1449'] = 'Opération de remboursement :'; +$_MODULE['<{paypal}prestashop>paypal_2ab62d1a578713d0862b56819295630e'] = 'Remboursement PayPal confirmé !'; +$_MODULE['<{paypal}prestashop>paypal_a64db959966ba8d07c8b5d9493fcc21f'] = 'Erreur de transaction !'; +$_MODULE['<{paypal}prestashop>paypal_67962779da962e3d4225055afc05e7bd'] = 'Résultat de la capture :'; +$_MODULE['<{paypal}prestashop>paypal_8778ee03f6592d5fec9a1f2ee851e476'] = 'Commande terminée avec PayPal !'; +$_MODULE['<{paypal}prestashop>paypal_672d40feac6437e49f771019bc330790'] = 'Statu de la vérification :'; +$_MODULE['<{paypal}prestashop>paypal_1828820cc60e36b6f9fdf60cab103ed7'] = 'Vous utilisez actuellement l\'adresse PayPal par défaut, veuillez entrer votre propre adresse.'; +$_MODULE['<{paypal}prestashop>paypal_connect_d1f14cc4a2dade80c92421d26422fea0'] = 'Ouvre une nouvelle connection vers'; +$_MODULE['<{paypal}prestashop>paypal_connect_94a27811a721ef512ad7bfa06cab34e0'] = 'Echec de la connection avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_70215486455daee13382c68b1a230b82'] = 'Connection réussie avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_e4c4ad49bced42265b5facc2175cdafd'] = 'Envoie des paramètres :'; +$_MODULE['<{paypal}prestashop>paypal_connect_445583f6641da98fc7ac8fd9d13a564b'] = 'Echec de l\'envoie avec la méthode cURL ! Erreur :'; +$_MODULE['<{paypal}prestashop>paypal_connect_ef4fbf36eaa2083442d386990ba063c2'] = 'Envoie réussi avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_bf059c9751bb1a20b449b7917b1df374'] = 'Echec de la connection avec la méthode fsockopen'; +$_MODULE['<{paypal}prestashop>paypal_connect_6e9aa4cb541e09b07602d4ea96080811'] = 'Echec de l\'envoie avec la méthode fsockopen ! Erreur :'; +$_MODULE['<{paypal}prestashop>paypal_connect_842a183be225d415b2b4375ba1dd1c94'] = 'Envoie réussi avec la méthode fsockopen'; +$_MODULE['<{paypal}prestashop>paypal_lib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'Réponse PayPal :'; +$_MODULE['<{paypal}prestashop>submit_67a3fcdb7708219b9d5d6269ad8c4a86'] = 'Une erreur est survenue pendant le processus de paiement.'; +$_MODULE['<{paypal}prestashop>payment_d141a42a5e72c871a3116414bb5c64c1'] = 'Création du nouveau panier impossible'; +$_MODULE['<{paypal}prestashop>payment_5b5adcef5e3f2e5e1b6f60eb3e7e41ed'] = 'Une erreur est survenue :'; +$_MODULE['<{paypal}prestashop>payment_dca16503c563d9fdec70d18f2ab653a4'] = 'Erreur lors de la préparation du paiement par Express Checkout'; +$_MODULE['<{paypal}prestashop>payment_51da74120dd5e11817ef21e27d2599bc'] = 'Impossible de créer un nouvel utilisateur'; +$_MODULE['<{paypal}prestashop>payment_bcf08b34ab427cb871635151c6976eb0'] = 'Impossible de créer la nouvelle adresse'; +$_MODULE['<{paypal}prestashop>payment_ca5cecfc8fd8e585ba1e684757168158'] = 'Impossible de mettre à jour le panier'; +$_MODULE['<{paypal}prestashop>payment_ada2b5d5bbf3065de283d61526141780'] = 'En attente de capture du paiement.'; +$_MODULE['<{paypal}prestashop>payment_36ec50c0e914dd2fb48a1b27540512ce'] = 'Paiement accepté.'; +$_MODULE['<{paypal}prestashop>payment_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Le prix payé sur PayPal est différent du prix renseigné sur la boutique.'; +$_MODULE['<{paypal}prestashop>payment_98825385aadb1d0dd0fd133ef8acd23d'] = 'Impossible de créer la commande'; +$_MODULE['<{paypal}prestashop>payment_085b78e060c3ef4cc37bd25abd06ff66'] = 'Le panier a changé depuis la dernière tentative de paiement. Veuillez recommencer le processus de paiement s\'il vous plait.'; +$_MODULE['<{paypal}prestashop>payment_572da7ef1411f2a12409e752f3eb2f7a'] = 'Votre panier et vide.'; +$_MODULE['<{paypal}prestashop>process_ee9dc1e678d54c517f481583c3fb2db8'] = 'Devise invalide.'; +$_MODULE['<{paypal}prestashop>process_484f5a79672cebe198ebdde45a1d672f'] = 'Emballage cadeau.'; +$_MODULE['<{paypal}prestashop>notifier_8a34d4a5b0c3928059f6f92ead9e8aa6'] = 'Le prix payé sur PayPal est différent du prix renseigné sur la boutique.'; +$_MODULE['<{paypal}prestashop>notifier_572f9af7615560af2cba038cc1948287'] = 'Panier mis à jour, merci de ré-essayer.'; +$_MODULE['<{paypal}prestashop>notifier_36ec50c0e914dd2fb48a1b27540512ce'] = 'Paiement accepté.'; +$_MODULE['<{paypal}prestashop>back_office_ae3cebe661e92cdfd12516419fef4f2d'] = 'Télécharger le'; +$_MODULE['<{paypal}prestashop>back_office_e73756d0d2306110f29ccf28cb69c412'] = 'Guide d\'intégration de PayPal'; +$_MODULE['<{paypal}prestashop>back_office_6506302a6e11077ecbc04b5932a65c4c'] = 'sur PrestaShop et suivez les étapes pas à pas'; +$_MODULE['<{paypal}prestashop>back_office_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Non'; +$_MODULE['<{paypal}prestashop>back_office_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{paypal}prestashop>back_office_748eadce9cf4f2bde207b63c5441da07'] = 'Utilisez la Fonction PayPal Login'; +$_MODULE['<{paypal}prestashop>back_office_cded4ac9f77c68c750c243af1f5263c5'] = '(*voir le'; +$_MODULE['<{paypal}prestashop>back_office_606d8f704cf61d29bffd5195f28af29e'] = 'Guide d\'Intégration'; +$_MODULE['<{paypal}prestashop>back_office_a1694ad810c4ac5b56b59c47db01cb05'] = 'et suivre les étapes de mise en place'; +$_MODULE['<{paypal}prestashop>back_office_3650f874df7e9c6e822a872d02cee6d5'] = 'Cette fonction permet à vos clients de se connecter avec leurs identifiants PayPal pour raccourcir le tunnel d\'achat'; +$_MODULE['<{paypal}prestashop>back_office_9be4e88898c4e88363208d2472f4a406'] = 'Renseignez les informations liées à votre compte PayPal'; +$_MODULE['<{paypal}prestashop>back_office_4ff2e716a7d06ce5274b4090b39abad3'] = 'Voir'; +$_MODULE['<{paypal}prestashop>back_office_8646a5d7b2817d30950357da8d80a11f'] = 'le Guide d\'Intégration'; +$_MODULE['<{paypal}prestashop>back_office_2d801c24938b12e4ca9a2cf9b980c759'] = 'Erreur !'; +$_MODULE['<{paypal}prestashop>capture_81e826adb70e2e6b189c2eef739d52d4'] = 'Capture PayPal'; +$_MODULE['<{paypal}prestashop>capture_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informations :'; +$_MODULE['<{paypal}prestashop>capture_ce64b2ea82cf4fa861a6512e2c32b84b'] = 'Les fonds sont prêts à être capturés avant expédition'; +$_MODULE['<{paypal}prestashop>capture_99e64593868df2b7b32231c1ae5ddc04'] = 'Récupérer les fonds'; +$_MODULE['<{paypal}prestashop>refund_8ba079f305b81b172792bc0469b6a690'] = 'Remboursement PayPal'; +$_MODULE['<{paypal}prestashop>refund_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informations :'; +$_MODULE['<{paypal}prestashop>refund_016e1f278eccd700eaf33f74a501d050'] = 'Paiement accepté'; +$_MODULE['<{paypal}prestashop>refund_a8b1cc445942a2e1a7d7cca641c86d67'] = 'Lorsque vous remboursez un produit, un remboursement partiel est effectué sauf si vous sélectionnez l\'option \"Générer un bon de réduction\"'; +$_MODULE['<{paypal}prestashop>refund_729a51874fe901b092899e9e8b31c97a'] = 'Etes-vous sûr ?'; +$_MODULE['<{paypal}prestashop>refund_c2a5e2e23d8ec9cad779d657b7d33fc1'] = 'Remboursement total de la transaction'; +$_MODULE['<{paypal}prestashop>validation_b630aa9b5e25da971949cae62dd109aa'] = 'Validation PayPal'; +$_MODULE['<{paypal}prestashop>validation_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informations :'; +$_MODULE['<{paypal}prestashop>validation_9119a92adbbf6c67bfb8a3aee0bdb720'] = 'Capture en attente - Pas d\'expédition'; +$_MODULE['<{paypal}prestashop>validation_c14eb95a724174f336b8ffdd98ef2f35'] = 'Paiement en attente - Pas d\'expédition'; +$_MODULE['<{paypal}prestashop>validation_5b18ff32c2aaaf4b79bdead10b10fe29'] = 'Vérifier l\'état du paiement'; +$_MODULE['<{paypal}prestashop>about_e816e21c1c8e0eba0620fa3df6bd6795'] = 'Qu\'est-ce que PayPal ?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal, leader incontesté en matière de paiement en ligne, permet aux acheteurs et aux vendeurs d\'envoyer et de recevoir des paiements en ligne. PayPal compte plus de 100 millions de comptes dans 190 pays et régions du monde. Il est accepté par les marchands partout, à la fois sur eBay et en dehors d\'eBay.'; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = 'Est-ce un service sécurisé ?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal contribue à protéger les informations concernant votre carte bancaire grâce aux meilleurs systèmes présents sur le marché pour la sécurité et la prévention contre la fraude. Lorsque vous utilisez PayPal, vos informations financières ne sont jamais communiquées au marchand.'; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = 'Pourquoi utiliser PayPal ?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = 'Effectuez des achats ou envoyez des paiements avec PayPal : c\'est gratuit.'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Achetez et payez en toute tranquillité en enregistrant vos informations auprès de PayPal.'; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'PayPal est accepté par des millions de marchands dans le monde et constitue le mode de paiement le plus utilisé sur eBay.'; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = 'Utilisez PayPal dès aujourd\'hui !'; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Votre panier'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>error_f47106270a2928f350f357e255a2c2ac'] = 'Veuillez contacter le marchant:'; +$_MODULE['<{paypal}prestashop>error_d5860edcd3078f86ee963c27654bc6cf'] = 'Montant total de la transaction (taxes incl) :'; +$_MODULE['<{paypal}prestashop>error_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'L\'ID de votre commande est :'; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Précédent'; +$_MODULE['<{paypal}prestashop>order-confirmation_fb077ecba55e5552916bde26d8b9e794'] = 'Confirmation de commande'; +$_MODULE['<{paypal}prestashop>order-confirmation_d5860edcd3078f86ee963c27654bc6cf'] = 'Total de la transaction (TTC) :'; +$_MODULE['<{paypal}prestashop>order-confirmation_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'Votre numéro de commande est le :'; +$_MODULE['<{paypal}prestashop>order-confirmation_6e860dc1cf94ca08b3fd99993aa2dc68'] = 'Votre numéro de transaction PayPal est :'; +$_MODULE['<{paypal}prestashop>order-confirmation_4082ea29b4f196c4f60533500139725a'] = 'Suivre ma commande'; +$_MODULE['<{paypal}prestashop>order-confirmation_9390390581f54c65d6acfc8da4e17362'] = 'Retour aux commandes'; +$_MODULE['<{paypal}prestashop>order-summary_a40cab5994f36d4c48103a22ca082e8f'] = 'Votre panier'; +$_MODULE['<{paypal}prestashop>order-summary_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>order-summary_f1d3b424cd68795ecaa552883759aceb'] = 'Résumé de la commande'; +$_MODULE['<{paypal}prestashop>order-summary_dd23adc5fb6bda9c384397b31e57fc53'] = 'Paiement par PayPal'; +$_MODULE['<{paypal}prestashop>order-summary_62d74398cb6ebaa69ab7339052ca5c92'] = 'Vous avez choisi de payer par PayPal'; +$_MODULE['<{paypal}prestashop>order-summary_c884ed19483d45970c5bf23a681e2dd2'] = 'Voici un résumé de votre commande'; +$_MODULE['<{paypal}prestashop>order-summary_0c458988127eb2150776881e2ef3f0c4'] = 'Adresse de livraison'; +$_MODULE['<{paypal}prestashop>order-summary_e2867a925cba382f1436d1834bb52a1c'] = 'Le montant total de votre commande est'; +$_MODULE['<{paypal}prestashop>order-summary_1f87346a16cf80c372065de3c54c86d9'] = '(tax incl.)'; +$_MODULE['<{paypal}prestashop>order-summary_8ed356c32b198c9cb2abab7c3d262b93'] = 'Nous acceptons les devises suivantes avec PayPal :'; +$_MODULE['<{paypal}prestashop>order-summary_0881a11f7af33bc1b43e437391129d66'] = 'Veuillez confirmer votre commande en cliquant sur \"Je confirme ma commande\"'; +$_MODULE['<{paypal}prestashop>order-summary_46b9e3665f187c739c55983f757ccda0'] = 'Je confirme ma commande'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payer par PayPal'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'est bien enregistrée.'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'Vous avez choisi de payer avec PayPal.'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Votre commande vous sera envoyée très prochainement.'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toute question ou information complémentaire merci de contacter notre'; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'support client'; +$_MODULE['<{paypal}prestashop>express_checkout_payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payez avec PayPal'; +$_MODULE['<{paypal}prestashop>express_checkout_shortcut_form_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payez avec PayPal'; +$_MODULE['<{paypal}prestashop>integral_evolution_payment_ecab922bc1f9b5726e2a6deb4acaec4e'] = 'Retour au site du marchant.'; diff --git a/modules/paypal/pt.php b/modules/paypal/pt.php new file mode 100644 index 000000000..43bc52085 --- /dev/null +++ b/modules/paypal/pt.php @@ -0,0 +1,202 @@ +paypal_connect_d1f14cc4a2dade80c92421d26422fea0'] = 'Fazendo nova conexão com'; +$_MODULE['<{paypal}prestashop>paypal_connect_94a27811a721ef512ad7bfa06cab34e0'] = 'Falha ao conectar com método CURL'; +$_MODULE['<{paypal}prestashop>paypal_connect_70215486455daee13382c68b1a230b82'] = 'Conexão com método CURL com sucesso'; +$_MODULE['<{paypal}prestashop>paypal_connect_e4c4ad49bced42265b5facc2175cdafd'] = 'Enviando este params:'; +$_MODULE['<{paypal}prestashop>paypal_connect_445583f6641da98fc7ac8fd9d13a564b'] = 'Envio com método CURL falhou! Erro:'; +$_MODULE['<{paypal}prestashop>paypal_connect_ef4fbf36eaa2083442d386990ba063c2'] = 'Envio com método CURL com sucesso'; +$_MODULE['<{paypal}prestashop>paypal_connect_bf059c9751bb1a20b449b7917b1df374'] = 'Conexão com método fsockopen falhou'; +$_MODULE['<{paypal}prestashop>paypal_connect_6e9aa4cb541e09b07602d4ea96080811'] = 'Envio com método fsockopen falhou!'; +$_MODULE['<{paypal}prestashop>paypal_connect_842a183be225d415b2b4375ba1dd1c94'] = 'Envio com método fsockopen com sucesso!'; +$_MODULE['<{paypal}prestashop>paypal_lib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'Resposta do Paypal'; +$_MODULE['<{paypal}prestashop>notifier_572f9af7615560af2cba038cc1948287'] = 'Carrinho mudou, por favor entre dados novamente.'; +$_MODULE['<{paypal}prestashop>notifier_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pagamento aceito.'; +$_MODULE['<{paypal}prestashop>back_office_e9f91995a69772872f7a386c6909403d'] = 'Conquiste mais clientes'; +$_MODULE['<{paypal}prestashop>back_office_bbf54c5f55856a290f0deae540368071'] = 'Mais de 100 milhões de contas ativas no Paypal mundialmente'; +$_MODULE['<{paypal}prestashop>back_office_ad78c46c5d6edc542ad2153e23518478'] = 'Acesse clientes internacionais'; +$_MODULE['<{paypal}prestashop>back_office_2b91c701cecf505dc5af4e35d7067f1f'] = '190 países, 25 moedas'; +$_MODULE['<{paypal}prestashop>back_office_3a73e92a81de06fba19ab722bd500675'] = 'Dê garantia aos seus clientes'; +$_MODULE['<{paypal}prestashop>back_office_d5f5f5c138165b223c4e6481752c7748'] = 'Compradores não precisam compartilhar informações privadas'; +$_MODULE['<{paypal}prestashop>back_office_421fe69f8b38a3c361835747e6215227'] = 'Aceite todos os principais métodos de pagamento'; +$_MODULE['<{paypal}prestashop>back_office_516710946f5fb35af6496ad0b7582980'] = 'Só leva alguns minutos para começar com o PayPal'; +$_MODULE['<{paypal}prestashop>back_office_56564e0a106b0e0e2dc57b5a105ed639'] = 'Seu país'; +$_MODULE['<{paypal}prestashop>back_office_eb399bcaca686f8609137153307eecf1'] = 'Mudar'; +$_MODULE['<{paypal}prestashop>back_office_a7bb58222222b064f0721e6e0fe4c486'] = 'Selecione seu país'; +$_MODULE['<{paypal}prestashop>back_office_93140d7ca5171ede9b8a94f07f0363ec'] = 'Já tem uma conta PayPal para empresa'; +$_MODULE['<{paypal}prestashop>back_office_73878c19cdc6ef2ab0d0fac6943cc958'] = 'Precisa de Ajuda?'; +$_MODULE['<{paypal}prestashop>back_office_240fdce652f09de611fc997971dea41e'] = 'Selecione sua solução'; +$_MODULE['<{paypal}prestashop>back_office_d59048f21fd887ad520398ce677be586'] = 'Saiba mais'; +$_MODULE['<{paypal}prestashop>back_office_cd5ee0ac6f3296c551e631268af2915b'] = 'Precisa do Paypal para processar todos seus pagamentos por cartão?'; +$_MODULE['<{paypal}prestashop>back_office_961f2247a2070bedff9f9cd8d64e2650'] = 'Escolher'; +$_MODULE['<{paypal}prestashop>back_office_d30abcb258277c6028d040b073276da1'] = 'Website Payments Standard'; +$_MODULE['<{paypal}prestashop>back_office_4d647b4406dba3d579ac2ef165c05196'] = 'Comece a aceitar pagamentos imediatamente.'; +$_MODULE['<{paypal}prestashop>back_office_e331bc26b25860e255aac1225fc5c639'] = 'Sem taxa de assinatura, somente uma pequena taxa de transação quando você recebe pagamento.'; +$_MODULE['<{paypal}prestashop>back_office_53f61475efdd0c433443262f0d7cdcbf'] = 'PayPal Plus'; +$_MODULE['<{paypal}prestashop>back_office_69d7974bb0bacddb986bbf8d734238c4'] = 'Precisa do Paypal além do seu processador de cartão de crédito atual?'; +$_MODULE['<{paypal}prestashop>back_office_2e3e721e530a957f81d5b5dcff0bf0e1'] = 'Checkout Express'; +$_MODULE['<{paypal}prestashop>back_office_cc84ef735c1a521fe731773a700a87ec'] = 'Aumente em 30% suas vendas on-line * com um simples processo de 3 cliques para a finalização da compra.'; +$_MODULE['<{paypal}prestashop>back_office_e8c466b9c179e229ae67f339a8e2476a'] = 'Registre-se para sua conta para empresa gratuíta do Paypal'; +$_MODULE['<{paypal}prestashop>back_office_d67850bd126f070221dcfd5fa6317043'] = 'Cadastre-se'; +$_MODULE['<{paypal}prestashop>back_office_5c57ba1861701e5a630dd5006acb30e2'] = 'Uma vez que sua conta for criada, volte nesta página para completar o passo 3.'; +$_MODULE['<{paypal}prestashop>back_office_ff7e05b87636d641663fb2f590d9f2bd'] = 'Importante: Por favor clique no botão SALVAR no pé da página quando o Paypal aprovar seu pedido de cadastro para este produto, ao contrário você não conseguirá processar nenhum pagamento por cartão. Este processo pode levar de 3 a 5 dias.'; +$_MODULE['<{paypal}prestashop>back_office_78ba94e61abed0cbb6349b37ec9ed59e'] = 'Se o seu pedido de cadastro para Website Payments Pro já foi aprovado pelo Paypal, por favor vá diretamente para o passo 3.'; +$_MODULE['<{paypal}prestashop>back_office_5b0e8271bd4b23a6bd7a7f49725ed926'] = 'Processe pagamentos na sua loja virtual'; +$_MODULE['<{paypal}prestashop>back_office_b4e69ef9df8f20b984309ee73f78953b'] = 'Forneça suas credenciais da API do Paypal para o PrestaShop'; +$_MODULE['<{paypal}prestashop>back_office_2ffe0ef69fd047d0884f98faa52c1bd3'] = 'Obtenha minhas credenciais da API do PayPal'; +$_MODULE['<{paypal}prestashop>back_office_36461ebc9ebcd269f3909fa49a4b0a57'] = 'Clique aqui e coloque no pop-up seu email e senha de login no Paypal, então copie e cole suas credenciais da API do PayPal nos campos abaixo.'; +$_MODULE['<{paypal}prestashop>back_office_266ba5df48aed68af0cce5f735035291'] = 'API usuário'; +$_MODULE['<{paypal}prestashop>back_office_37e31370e4ab230ff6fba12cc6390aff'] = 'API senha'; +$_MODULE['<{paypal}prestashop>back_office_195ca49498f0b30d3a8967eff22fa9b3'] = 'API assinatura'; +$_MODULE['<{paypal}prestashop>back_office_74cec07ee40362f7605816fdcfbf194d'] = 'Por favor verifique que você tenha copiado todos os caractéres.'; +$_MODULE['<{paypal}prestashop>back_office_90912596e1deb86b1f39bb30013e2f8b'] = 'Use personnalisation (uses your logo and your shop name on Paypal) :'; +$_MODULE['<{paypal}prestashop>back_office_67f0dc0ff3d7b1fa4bb975b8831f54a9'] = 'Indique o email que você usou quando você se cadastrou para uma conta para empresa do Paypa'; +$_MODULE['<{paypal}prestashop>back_office_671bb93f14482ae559c736818605f445'] = 'API e-mail da empresa'; +$_MODULE['<{paypal}prestashop>back_office_0e55f1779fe0d4169ab51bcb0ade306f'] = 'Para finalizar a configuração da sua conta Paypal, você precisa'; +$_MODULE['<{paypal}prestashop>back_office_258da42945130420ae78d4494d549e42'] = 'Confirmar seu endereço de email : veja o email enviado pelo Paypal quando você criou sua conta'; +$_MODULE['<{paypal}prestashop>back_office_f9a8989b19d6c0db2e1cdfe2d54827c2'] = 'Vincule sua conta do Paypal à uma conta bancária ou uma conta de cartão de crédito: Acesse sua conta PayPal e vá à “My business setup”'; +$_MODULE['<{paypal}prestashop>back_office_50f33d14f129e4548c1c270fd6725a78'] = 'Opções de Configuração'; +$_MODULE['<{paypal}prestashop>back_office_113269a2fc804aeae74a99e168309e8b'] = 'Escolha a solução que quer utilizar'; +$_MODULE['<{paypal}prestashop>back_office_a025e05161bb17cbab898f0e77b09a2b'] = 'Iframe'; +$_MODULE['<{paypal}prestashop>back_office_d63bbf35e72f644c8752d4f2304f89e8'] = 'Redireccionamento de página completa'; +$_MODULE['<{paypal}prestashop>back_office_c7c6643c2c48aabc724f019ea0ef26cc'] = 'Seleccione um template'; +$_MODULE['<{paypal}prestashop>back_office_684c41bec3eaa8b8bc929c829c602157'] = 'Atalho para Checkout Express'; +$_MODULE['<{paypal}prestashop>back_office_cebd5bbe0ffdecc270a8a324e5a277dd'] = 'Modo Live (recomendado)'; +$_MODULE['<{paypal}prestashop>back_office_4245499695408b974322be6f01b0d17a'] = 'Modo teste'; +$_MODULE['<{paypal}prestashop>back_office_0eae1e85287701bf8071e06bfb65b933'] = 'Escolha sua maneira de processar pagamentos (automaticamente vs.autorização manual).'; +$_MODULE['<{paypal}prestashop>back_office_339bb3a6443078c1fd5a88d0a0d97096'] = 'Vendas diretas (recomendado)'; +$_MODULE['<{paypal}prestashop>back_office_9a901d2379aac144a2693dc7bf5c8caf'] = 'Autorização/Captura manual (payment shipping)'; +$_MODULE['<{paypal}prestashop>back_office_c9cc8cce247e49bae79f15173ce97354'] = 'Salvar'; +$_MODULE['<{paypal}prestashop>back_office_13e8a61381ef71ee7f101ded231c9628'] = 'Por favor note que se você escolher ativar o modo teste'; +$_MODULE['<{paypal}prestashop>back_office_588a39011a111cf61f2230841807f04c'] = 'Você ainda não poderá aceitar pagamentos'; +$_MODULE['<{paypal}prestashop>back_office_97ce37634025467f01c4eec75c93eda6'] = 'Você vai precisar voltar para a página do módulo PayPal para poder completar o Passo 3 antes de colocar no ar'; +$_MODULE['<{paypal}prestashop>back_office_bfbf9731adfef44a1f1a5dc048f33a20'] = 'Você vai precisar criar uma conta no site sandbox do PayPal'; +$_MODULE['<{paypal}prestashop>back_office_d8fd35f628f2099aeaf3e5253e4acdba'] = 'saiba mais'; +$_MODULE['<{paypal}prestashop>back_office_0693f3a913aa574276ae343ccdb15a7d'] = 'Você vai precisar entender de programação'; +$_MODULE['<{paypal}prestashop>back_office_ff0d39d63c036426d6833917d512ef22'] = 'Você tem certeza que você quer ativar o modo teste?'; +$_MODULE['<{paypal}prestashop>back_office_980d7b730b063eabd43e8954e4e072ad'] = 'Parabéns !'; +$_MODULE['<{paypal}prestashop>back_office_bb945e9f42acb423adb3d7535d491444'] = 'Você pode começar agora a aceitar pagamentos com PayPal.'; +$_MODULE['<{paypal}prestashop>back_office_10479c32ebaae1b49b512189d88e9fdd'] = 'Você pode começar agora a testar as soluções do PayPal. Uma vez que você realizar seus testes, não esqueça de voltar para esta página e ativar o modo live para começar a aceitar pagamentos.'; +$_MODULE['<{paypal}prestashop>back_office_2d801c24938b12e4ca9a2cf9b980c759'] = 'Erro!'; +$_MODULE['<{paypal}prestashop>back_office_9dff3a2f8c5760586559e4f28223d7ee'] = 'Você precisa fornecer suas credenciais da API do Paypal no passo 3 para poder aceitar pagamentos.'; +$_MODULE['<{paypal}prestashop>back_office_261fa91388f4f40fe010e174aba10c36'] = 'Fonte1: Pesquisa Forrester conduzida em março de 2011'; +$_MODULE['<{paypal}prestashop>capture_81e826adb70e2e6b189c2eef739d52d4'] = 'Captura Paypal'; +$_MODULE['<{paypal}prestashop>capture_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informação:'; +$_MODULE['<{paypal}prestashop>capture_ce64b2ea82cf4fa861a6512e2c32b84b'] = 'Fundos prontos para serem capturados antes do envio'; +$_MODULE['<{paypal}prestashop>capture_99e64593868df2b7b32231c1ae5ddc04'] = 'Obter o dinheiro'; +$_MODULE['<{paypal}prestashop>refund_8ba079f305b81b172792bc0469b6a690'] = 'Reembolso Paypal'; +$_MODULE['<{paypal}prestashop>refund_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informação:'; +$_MODULE['<{paypal}prestashop>refund_016e1f278eccd700eaf33f74a501d050'] = 'Pagamento aceito'; +$_MODULE['<{paypal}prestashop>refund_a8b1cc445942a2e1a7d7cca641c86d67'] = 'Quando você reembolsa um produto, um reembolso parcial é feito a menos que você selecione \"Generate a voucher\".'; +$_MODULE['<{paypal}prestashop>refund_729a51874fe901b092899e9e8b31c97a'] = 'Você tem certeza?'; +$_MODULE['<{paypal}prestashop>refund_c2a5e2e23d8ec9cad779d657b7d33fc1'] = 'Reembolso total da transação'; +$_MODULE['<{paypal}prestashop>validation_b630aa9b5e25da971949cae62dd109aa'] = 'Validação Paypal'; +$_MODULE['<{paypal}prestashop>validation_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informação:'; +$_MODULE['<{paypal}prestashop>validation_9119a92adbbf6c67bfb8a3aee0bdb720'] = 'Captura Pendente - Sem meio de envio'; +$_MODULE['<{paypal}prestashop>validation_c14eb95a724174f336b8ffdd98ef2f35'] = 'Pagamento Pendente - Sem meio de envio'; +$_MODULE['<{paypal}prestashop>validation_5b18ff32c2aaaf4b79bdead10b10fe29'] = 'Obtenha o status do pagamento'; +$_MODULE['<{paypal}prestashop>about_e816e21c1c8e0eba0620fa3df6bd6795'] = 'O que é Paypal?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal, uma confiável empresa líder em pagamentos on-line, permite que compradores e empresas enviem e recebam dinheiro online. PayPal tem mais de 100 milhões de contas de membros em 190 países e regiões. Ele é aceito por comerciantes em toda parte, dentro e fora do eBay.'; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = 'É seguro para usar?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal ajuda a proteger suas informações de cartão de crédito com líderes de mercado em segurança e sistemas de prevenção de fraude. Quando você usa o PayPal, suas informações financeiras nunca são compartilhadas com o comerciante.'; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = 'Porque usar Paypal?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = 'Faça compras ou envie dinheiro com o Paypal - é grátis!'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Compre e pague de forma conveniente salvando suas informações com o Paypal'; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'O Paypal é aceito por milhões de empresas em todo o mundo e é o método preferido no eBay'; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = 'Comece a usar o Paypal hoje!'; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Seu carrinho de compra'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'Paypal'; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Voltar'; +$_MODULE['<{paypal}prestashop>order-confirmation_fb077ecba55e5552916bde26d8b9e794'] = 'Confirmação do Pedido'; +$_MODULE['<{paypal}prestashop>order-confirmation_d5860edcd3078f86ee963c27654bc6cf'] = 'Total da transação (impostos incluídos) :'; +$_MODULE['<{paypal}prestashop>order-confirmation_a378cd7a0839cbd4ec3e45bbdeeb69be'] = 'A ID do seu pedido é:'; +$_MODULE['<{paypal}prestashop>order-confirmation_6e860dc1cf94ca08b3fd99993aa2dc68'] = 'A ID da sua transação Paypal é:'; +$_MODULE['<{paypal}prestashop>order-confirmation_4082ea29b4f196c4f60533500139725a'] = 'Acompanhar meu pedido'; +$_MODULE['<{paypal}prestashop>order-confirmation_9390390581f54c65d6acfc8da4e17362'] = 'Voltar para pedidos'; +$_MODULE['<{paypal}prestashop>order-summary_a40cab5994f36d4c48103a22ca082e8f'] = 'Seu carrinho de compra'; +$_MODULE['<{paypal}prestashop>order-summary_ad69e733ebae8d264bccaa38d68830e8'] = 'Paypal'; +$_MODULE['<{paypal}prestashop>order-summary_f1d3b424cd68795ecaa552883759aceb'] = 'Resumo do pedido'; +$_MODULE['<{paypal}prestashop>order-summary_dd23adc5fb6bda9c384397b31e57fc53'] = 'Pagamento Paypal'; +$_MODULE['<{paypal}prestashop>order-summary_62d74398cb6ebaa69ab7339052ca5c92'] = 'Você escolheu pagar com Paypal.'; +$_MODULE['<{paypal}prestashop>order-summary_c884ed19483d45970c5bf23a681e2dd2'] = 'Aqui está um curto resumo do seu pedido:'; +$_MODULE['<{paypal}prestashop>order-summary_e2867a925cba382f1436d1834bb52a1c'] = 'O valor total do seu pedido é'; +$_MODULE['<{paypal}prestashop>order-summary_1f87346a16cf80c372065de3c54c86d9'] = '(imposto incluído)'; +$_MODULE['<{paypal}prestashop>order-summary_8ed356c32b198c9cb2abab7c3d262b93'] = 'Nós aceitamos as seguintes moedas para serem enviadas pelo Paypal:'; +$_MODULE['<{paypal}prestashop>order-summary_0881a11f7af33bc1b43e437391129d66'] = 'Por favor confirme seu pedido clicando \'Eu confirmo meu pedido\''; +$_MODULE['<{paypal}prestashop>order-summary_46b9e3665f187c739c55983f757ccda0'] = 'Eu confirmo meu pedido'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pague com Paypal'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Seu pedido no'; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'está completo.'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'Você escolheu o método Paypal.'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Seu pedido será enviado em breve.'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Para qualquer pergunta ou mais informações, por favor contate nosso'; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'serviço de atendimento ao cliente'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ad69e733ebae8d264bccaa38d68830e8'] = 'Paypal'; +$_MODULE['<{paypal}prestashop>paypal_abstract_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Aceita pagamentos por cartão de crédito (CB, Visa, MasterCard, Amex, Aurore, Cofinoga, 4 stars) com Paypal.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Você tem certeza que você quer deletar seus dados?'; +$_MODULE['<{paypal}prestashop>paypal_abstract_c91f1fb5e06286c3e0a33fc552dffbea'] = 'Você deve definir suas credenciais do PayPal Integral, para que o tema de telefonia móvel funcione corretamente.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_bd6b3cca1e559117a964cdfab6a977cf'] = 'O tema de telefonia móvel somente funciona com o módulo de pagamento Paypal neste momento. Por favor, ative o módulo para permitir pagamentos.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ea5eb3f904bf42377277255cbd0e2251'] = 'Para funcionar corretamente o módulo requer o módulo de compatibilidade com versões anteriores habilitado'; +$_MODULE['<{paypal}prestashop>paypal_abstract_48878e69ef59b9e9d2d9a8c18e4de520'] = 'Para funcionar corretamente o módulo requer pelo menos o módulo de compatibilidade com versões anteriores v'; +$_MODULE['<{paypal}prestashop>paypal_abstract_c9d8a8d3c76c69e9a5ba6387acb8655a'] = 'Para usar o módulo você precisa instalar o módulo de compatibilidade com versões anteriores.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_d739f6e2d6351c3a587d44190a8253af'] = 'Todos recursos do módulo API do Paypal estão incluídos no novo módulo Paypal. Para que não haja nenhum conflito, por favor, não use e remova o módulo PaypalAPI.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_32af90c3cfef1bacf43b0c3a8f60a4da'] = 'Fundos foram recuperados.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_d238649ac5ec14afc894fad36c0b50fc'] = 'Sem sucesso na recuperação dos fundos solicitados. Por favor, veja mensagem de registro!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_05b998de2c4fb46a7bdd37bd378b81d9'] = 'Validação bem sucedida. Por favor, veja mensagem de registro!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_aeca7e93a1b3d77e38c3cffa131774d5'] = 'Reembolso foi efetuado.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_cba030a50c8a99c7e224adbe1cf58544'] = 'Reembolso solicitado sem sucesso. Por favor, veja mensagem de registro!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_20fda49ece75d93bea97648ab1f1f1cf'] = 'Resultado de cancelamento de produtos:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_90ab0cfd410722553c79e614207a789a'] = 'Alguns campos estão vazios.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ce0e2b401002ca796d2e8aca7deb8f00'] = 'Campos de credenciais não podem estar vazios'; +$_MODULE['<{paypal}prestashop>paypal_abstract_3f7145179c909f0e87a911a3171986b6'] = 'Campo para e-mail comercial não pode estar vazio'; +$_MODULE['<{paypal}prestashop>paypal_abstract_e5d5d9f40763cfe6549bef705e3529a7'] = 'Mensagem de pagamento não é válida, por favor verifique seu módulo.'; +$_MODULE['<{paypal}prestashop>paypal_abstract_ee9dc1e678d54c517f481583c3fb2db8'] = 'Não é uma moeda válida'; +$_MODULE['<{paypal}prestashop>paypal_abstract_eec39bf42bd135971fb2d838c67d1449'] = 'Resultado de operação de reembolso:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_2ab62d1a578713d0862b56819295630e'] = 'Reembolso do Paypal efetuado com sucesso!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_a64db959966ba8d07c8b5d9493fcc21f'] = 'Erro de transação!'; +$_MODULE['<{paypal}prestashop>paypal_abstract_67962779da962e3d4225055afc05e7bd'] = 'Resultado de operação de captura:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_8778ee03f6592d5fec9a1f2ee851e476'] = 'Terminado o pedido com Paypal'; +$_MODULE['<{paypal}prestashop>paypal_abstract_672d40feac6437e49f771019bc330790'] = 'Status de verificação:'; +$_MODULE['<{paypal}prestashop>paypal_abstract_1828820cc60e36b6f9fdf60cab103ed7'] = 'Você está usando o e-mail padrão que vem com o Paypal, por favor coloque seu próprio e-mail.'; +$_MODULE['<{paypal}prestashop>validation_20dfea1a472e5be3f15f6b5f36ca335c'] = 'Problema conectando com o servidor do Paypal.'; +$_MODULE['<{paypal}prestashop>validation_f7799c2ded739cf3c3e9babffc5f315b'] = 'Conexão usando cURL falhou'; +$_MODULE['<{paypal}prestashop>validation_eca77e208634d52703b07672abbf16ec'] = 'Falha na verificação (usando cURL). Retornou:'; +$_MODULE['<{paypal}prestashop>validation_8358ec19f397d4cdd632688d4f79e535'] = 'Falha na verificação (usando fsockopen). Retornou:'; +$_MODULE['<{paypal}prestashop>validation_76ee8dc73701e846f7bccdf98dae079b'] = 'Sem transporte de comunicação disponível.'; +$_MODULE['<{paypal}prestashop>validation_2818bed1f235637049f4d46fd455dc1c'] = 'A chave Paypal \'mc_gross\' não foi especificada, não pode controlar a quantia paga.'; +$_MODULE['<{paypal}prestashop>validation_be59cbfbf305dc45cd0c3e9841b17ecf'] = 'A chave Paypal \'payment_status\' não foi especificada, não pode controlar a validade de pagamento'; +$_MODULE['<{paypal}prestashop>validation_bd0e34e5be6447844e6f262d51f1a9dc'] = 'Pagamento:'; +$_MODULE['<{paypal}prestashop>validation_e0395c4ce35d0b1e59ca3f2d5e260d23'] = 'A chave Paypal \'custom\' não foi especificada, não pode transmitir ao carrinho'; +$_MODULE['<{paypal}prestashop>validation_765261b630ee773659fae89e9ad762f5'] = 'A chave Paypal \'txn_id\' não foi especificada, transação desconhecida'; +$_MODULE['<{paypal}prestashop>validation_01634612f84d2b7ba56ccdf467e604b7'] = 'A chave Paypal \'mc_currency\' não foi especificada, moeda desconhecida'; +$_MODULE['<{paypal}prestashop>validation_e61f52d02b9f52fbe1fd41ed320e29c3'] = 'Carrinho não foi encontrado'; +$_MODULE['<{paypal}prestashop>validation_0617900b1aff826081d07f5a3e2e7cd0'] = 'Pedido já foi feito'; +$_MODULE['<{paypal}prestashop>validation_f5209b3301a46f3057ffbf34d903e205'] = 'ID de Transação Paypal:'; +$_MODULE['<{paypal}prestashop>validation_7b19e875ff64b09d80ee05dcc84b9975'] = 'A transação do Paypal não pode ser VERIFICADA.'; +$_MODULE['<{paypal}prestashop>paypal_connect_ea800e3536f81238a4cbc32eb6db4eaf'] = 'Conexão com método fsockopen com sucesso'; +$_MODULE['<{paypal}prestashop>paypal_express_checkout_ee9dc1e678d54c517f481583c3fb2db8'] = 'Não é uma moeda válida'; +$_MODULE['<{paypal}prestashop>paypal_express_checkout_484f5a79672cebe198ebdde45a1d672f'] = 'Papel de presente'; +$_MODULE['<{paypal}prestashop>submit_1e97d97a923eaddd810e056c828e99ea'] = 'Erro no pagamento'; +$_MODULE['<{paypal}prestashop>submit_7ef8c0c75056a5d1f988e352efcd0f09'] = 'Este produto não está mais em estoque com estes atributos mas está disponível com outros'; +$_MODULE['<{paypal}prestashop>submit_d141a42a5e72c871a3116414bb5c64c1'] = 'Não é possível criar novo carrinho'; +$_MODULE['<{paypal}prestashop>submit_5b5adcef5e3f2e5e1b6f60eb3e7e41ed'] = 'Ocorreu um erro:'; +$_MODULE['<{paypal}prestashop>submit_58f53d0306ffc9cc9820eab866e90efe'] = 'Erro durante a preparação do pagamento express checkout'; +$_MODULE['<{paypal}prestashop>submit_51da74120dd5e11817ef21e27d2599bc'] = 'Não foi possível criar cliente'; +$_MODULE['<{paypal}prestashop>submit_bcf08b34ab427cb871635151c6976eb0'] = 'Não foi possível criar endereço'; +$_MODULE['<{paypal}prestashop>submit_ca5cecfc8fd8e585ba1e684757168158'] = 'Não foi possível atualizar o carrinho existente'; +$_MODULE['<{paypal}prestashop>submit_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pagamento aceito.'; +$_MODULE['<{paypal}prestashop>submit_28060413b9f346d871b633018d03c7b0'] = 'Preço pago no Paypal não é o mesmo que no PrestaShop.'; +$_MODULE['<{paypal}prestashop>submit_98825385aadb1d0dd0fd133ef8acd23d'] = 'Não é possível criar pedido'; +$_MODULE['<{paypal}prestashop>submit_085b78e060c3ef4cc37bd25abd06ff66'] = 'Carrinho mudou desde o último checkout express, por favor faça um novo pagamento no checkout Paypal'; +$_MODULE['<{paypal}prestashop>notifier_28060413b9f346d871b633018d03c7b0'] = 'Preço pago no Paypal não é o msmo que no PrestaShop.'; +$_MODULE['<{paypal}prestashop>error_425551a2289ed60c9260933d1c45ef00'] = 'Por favor consulte os registros:'; +$_MODULE['<{paypal}prestashop>express_checkout_form_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pague com o Paypal'; +$_MODULE['<{paypal}prestashop>paypal_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pague com o Paypal'; +$_MODULE['<{paypal}prestashop>iframe_ecab922bc1f9b5726e2a6deb4acaec4e'] = 'Volte para o website do comerciante'; +$_MODULE['<{paypal}prestashop>payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pague com o Paypal'; +$_MODULE['<{paypal}prestashop>payment_a3f2caee6ef8e68fbd26e42d83f2bf65'] = 'Pague com sua conta Paypal, cartão de crédito (CB, Visa, Mastercard...), ou cartão de crédito privado'; +$_MODULE['<{paypal}prestashop>payment_b08008a2de4331ba13f006c9bcf37b62'] = 'Pague com sua conta Paypal'; diff --git a/modules/paypal/sdk/index.php b/modules/paypal/sdk/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/sdk/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/sdk/paypalREST/index.php b/modules/paypal/sdk/paypalREST/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/sdk/paypalREST/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/sdk/paypalREST/vendor/index.php b/modules/paypal/sdk/paypalREST/vendor/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/sdk/paypalREST/vendor/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/sdk/paypalREST/vendor/paypal/index.php b/modules/paypal/sdk/paypalREST/vendor/paypal/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/sdk/paypalREST/vendor/paypal/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/index.php b/modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/var/auth.cache b/modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/var/auth.cache new file mode 100644 index 000000000..9c7d766a9 --- /dev/null +++ b/modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/var/auth.cache @@ -0,0 +1 @@ +{"Abo09iM3mztHtrPo1-JHEnnfWFEQiOhoPax8a-nBkNuyS5ejD1CfU0W6o03dqnloKlKpiJK411KYytsu":{"clientId":"Abo09iM3mztHtrPo1-JHEnnfWFEQiOhoPax8a-nBkNuyS5ejD1CfU0W6o03dqnloKlKpiJK411KYytsu","accessTokenEncrypted":"NWExYzRmMzc2ZjQ4NDMuMlVDNXVEM1Z3VFE0V1RvOEU4elZYYjZvSTFCWGJ6akVFdE4rK2JUd3hRRHFKZDhZalB2REE5S1RSaUVkK0NZTUxlV2NwcVZFNGN3dE0reVF3ZjlFcmoyMFE5WHpoWHZJLzFDZDlrUEtFZVJkWEkxK0JaTnl4WlhETHpVWU5UTms0ZnB6c21Yek5CekVLeXRpbXhMcWFQZz09","tokenCreateTime":1511804727,"tokenExpiresIn":32341}} \ No newline at end of file diff --git a/modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/var/index.php b/modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/var/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/sdk/paypalREST/vendor/paypal/rest-api-sdk-php/var/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/tr.php b/modules/paypal/tr.php new file mode 100644 index 000000000..3cab860e4 --- /dev/null +++ b/modules/paypal/tr.php @@ -0,0 +1,69 @@ +back_office_e9f91995a69772872f7a386c6909403d'] = 'Müşteri tabanınızı genişletin'; +$_MODULE['<{paypal}prestashop>back_office_bbf54c5f55856a290f0deae540368071'] = 'PayPal ile başlıca kredi kartlarından ödeme alın ve PayPal\'ı tercih eden 100 milyondan fazla aktif kullanıcıya erişin'; +$_MODULE['<{paypal}prestashop>back_office_ad78c46c5d6edc542ad2153e23518478'] = 'Uluslararası pazarlara açılın'; +$_MODULE['<{paypal}prestashop>back_office_2b91c701cecf505dc5af4e35d7067f1f'] = 'PayPal 190 ülkede ve 25 para birimi ile kullanılıyor'; +$_MODULE['<{paypal}prestashop>back_office_3a73e92a81de06fba19ab722bd500675'] = 'Müşterilerinizi güvende hissettirin'; +$_MODULE['<{paypal}prestashop>back_office_421fe69f8b38a3c361835747e6215227'] = 'PayPal ile müşterileriniz kart bilgileri gibi hassas bilgileri paylaşmadan alışveriş yapabilirler'; +$_MODULE['<{paypal}prestashop>back_office_516710946f5fb35af6496ad0b7582980'] = 'ayPal ile satış yapmaya başlamak yalnızca birkaç dakikanızı alır'; +$_MODULE['<{paypal}prestashop>back_office_56564e0a106b0e0e2dc57b5a105ed639'] = 'your country'; +$_MODULE['<{paypal}prestashop>back_office_eb399bcaca686f8609137153307eecf1'] = 'Değiştir'; +$_MODULE['<{paypal}prestashop>back_office_a7bb58222222b064f0721e6e0fe4c486'] = 'Select your country'; +$_MODULE['<{paypal}prestashop>back_office_93140d7ca5171ede9b8a94f07f0363ec'] = 'Zaten PayPal Ticari hesap sahibi misiniz'; +$_MODULE['<{paypal}prestashop>back_office_73878c19cdc6ef2ab0d0fac6943cc958'] = 'Yardıma mı ihtiyacınız var ?'; +$_MODULE['<{paypal}prestashop>back_office_240fdce652f09de611fc997971dea41e'] = 'Bir ödeme çözümü seçin'; +$_MODULE['<{paypal}prestashop>back_office_d59048f21fd887ad520398ce677be586'] = 'Daha fazla bilgi alın'; +$_MODULE['<{paypal}prestashop>back_office_cd5ee0ac6f3296c551e631268af2915b'] = 'Tüm kart işlenmesini PayPal tarafından işlenmesini mi istiyorsunuz ?'; +$_MODULE['<{paypal}prestashop>back_office_961f2247a2070bedff9f9cd8d64e2650'] = 'choose'; +$_MODULE['<{paypal}prestashop>back_office_d30abcb258277c6028d040b073276da1'] = 'PayPal Website Payments Standard'; +$_MODULE['<{paypal}prestashop>back_office_4d647b4406dba3d579ac2ef165c05196'] = 'Hemen ödeme almaya başlayın. Hayır.'; +$_MODULE['<{paypal}prestashop>back_office_53f61475efdd0c433443262f0d7cdcbf'] = 'PayPal Plus'; +$_MODULE['<{paypal}prestashop>back_office_69d7974bb0bacddb986bbf8d734238c4'] = 'Varolan ödeme çözümünüze ek olarak PayPal\'ı mı eklemek istiyorsunuz?'; +$_MODULE['<{paypal}prestashop>back_office_2e3e721e530a957f81d5b5dcff0bf0e1'] = 'PayPal Express Checkout'; +$_MODULE['<{paypal}prestashop>back_office_cc84ef735c1a521fe731773a700a87ec'] = 'Satışlarınızı artırmanın güvenli yolu'; +$_MODULE['<{paypal}prestashop>back_office_e8c466b9c179e229ae67f339a8e2476a'] = 'PayPal Tícarí hesabı açın'; +$_MODULE['<{paypal}prestashop>back_office_d67850bd126f070221dcfd5fa6317043'] = 'HESAP AÇIN'; +$_MODULE['<{paypal}prestashop>back_office_5c57ba1861701e5a630dd5006acb30e2'] = 'Hesabınızı açtıktan sonra 3. adımı tamamlamak için aşağıdaki adrese gidin:'; +$_MODULE['<{paypal}prestashop>back_office_5b0e8271bd4b23a6bd7a7f49725ed926'] = 'ÖDEME ALABİLMEK İÇİN WEB MAĞAZANIZI ETKİNLEŞTİRİN'; +$_MODULE['<{paypal}prestashop>back_office_b4e69ef9df8f20b984309ee73f78953b'] = 'PayPal kimlik bilgilerinizi PrestaShop\'a gönderin:'; +$_MODULE['<{paypal}prestashop>back_office_2ffe0ef69fd047d0884f98faa52c1bd3'] = 'PAYPAL KİMLİK BİLGİLERİMİ GÖRMEK İSTİYORUM'; +$_MODULE['<{paypal}prestashop>back_office_36461ebc9ebcd269f3909fa49a4b0a57'] = 'Yukarıdaki düğmeyi tıkladıktan sonra açılan sayfada PayPal kullanıcı adınızı ve şifrenizi girin. PayPal kimlik bilgilerinizi kopyalayın ve aşağıdaki alanlara yapıştırın.'; +$_MODULE['<{paypal}prestashop>back_office_266ba5df48aed68af0cce5f735035291'] = 'API kullanıcı ismi'; +$_MODULE['<{paypal}prestashop>back_office_37e31370e4ab230ff6fba12cc6390aff'] = 'API şifresi'; +$_MODULE['<{paypal}prestashop>back_office_195ca49498f0b30d3a8967eff22fa9b3'] = 'API imzanız'; +$_MODULE['<{paypal}prestashop>back_office_74cec07ee40362f7605816fdcfbf194d'] = 'Lütfen doğru karakterleri girdiğinizden emin olun.'; +$_MODULE['<{paypal}prestashop>back_office_94ae34a9c107a078c63df4be1394e49d'] = 'PayPal kimlik bilgilerinizi PrestaShop\'a gönderin: <'; +$_MODULE['<{paypal}prestashop>back_office_90912596e1deb86b1f39bb30013e2f8b'] = 'Use personnalisation (uses your logo and your shop name on Paypal) :'; +$_MODULE['<{paypal}prestashop>back_office_67f0dc0ff3d7b1fa4bb975b8831f54a9'] = 'Indicate the email you used when you signed up for a PayPal Business account'; +$_MODULE['<{paypal}prestashop>back_office_671bb93f14482ae559c736818605f445'] = 'API business e-mail'; +$_MODULE['<{paypal}prestashop>back_office_0e55f1779fe0d4169ab51bcb0ade306f'] = 'PayPal hesabınızın kurulumunu tamamlamak için'; +$_MODULE['<{paypal}prestashop>back_office_258da42945130420ae78d4494d549e42'] = 'E-posta adresinizi onaylayın: PayPal\'dan size gönderilecek onay e-postasındaki adımları izleyin'; +$_MODULE['<{paypal}prestashop>back_office_f9a8989b19d6c0db2e1cdfe2d54827c2'] = 'PayPal hesabınıza kredi kartınızı ekleyin ve onaylayın: PayPal hesabınıza giriş yapın ve Hesap Araçlarım kutusundaki "Ticari Ayarlarım" bağlantısını tıklayın'; +$_MODULE['<{paypal}prestashop>back_office_50f33d14f129e4548c1c270fd6725a78'] = 'Hesap ayarı seçenekleriniz'; +$_MODULE['<{paypal}prestashop>back_office_113269a2fc804aeae74a99e168309e8b'] = 'Choose the solution you want to use'; +$_MODULE['<{paypal}prestashop>back_office_a025e05161bb17cbab898f0e77b09a2b'] = 'Iframe'; +$_MODULE['<{paypal}prestashop>back_office_d63bbf35e72f644c8752d4f2304f89e8'] = 'Full page redirect'; +$_MODULE['<{paypal}prestashop>back_office_c7c6643c2c48aabc724f019ea0ef26cc'] = 'Choose your template'; +$_MODULE['<{paypal}prestashop>back_office_684c41bec3eaa8b8bc929c829c602157'] = 'PayPal Express Checkout kullanın'; +$_MODULE['<{paypal}prestashop>back_office_76cfbdf3f35eb2368b8cbabfdd9f55db'] = 'Müşterilerinize 2 tıkla ödeme seçeneği sunun'; +$_MODULE['<{paypal}prestashop>back_office_cebd5bbe0ffdecc270a8a324e5a277dd'] = 'Canlı mod'; +$_MODULE['<{paypal}prestashop>back_office_4245499695408b974322be6f01b0d17a'] = 'Test modu'; +$_MODULE['<{paypal}prestashop>back_office_4dbcb38bbbff5d4a402f2575c57a35e6'] = 'Ödeme türü'; +$_MODULE['<{paypal}prestashop>back_office_339bb3a6443078c1fd5a88d0a0d97096'] = 'Direct sales (recommended)'; +$_MODULE['<{paypal}prestashop>back_office_9a901d2379aac144a2693dc7bf5c8caf'] = 'Authorization/Manual capture (payment shipping)'; +$_MODULE['<{paypal}prestashop>back_office_13e8a61381ef71ee7f101ded231c9628'] = 'Test modunu aktive etmek'; +$_MODULE['<{paypal}prestashop>back_office_588a39011a111cf61f2230841807f04c'] = 'Ödeme alamayacağınız'; +$_MODULE['<{paypal}prestashop>back_office_97ce37634025467f01c4eec75c93eda6'] = '3. adımı tamamlamak için PayPal modül sayfasına geri gelmeniz gerektiği'; +$_MODULE['<{paypal}prestashop>back_office_bfbf9731adfef44a1f1a5dc048f33a20'] = 'PayPal sandbox hesabı oluşturmanız (daha fazla bilgi alın)'; +$_MODULE['<{paypal}prestashop>back_office_d8fd35f628f2099aeaf3e5253e4acdba'] = 'Daha fazla bilgi alın'; +$_MODULE['<{paypal}prestashop>back_office_0693f3a913aa574276ae343ccdb15a7d'] = 'Programlama becerilerine sahip olduğunuz'; +$_MODULE['<{paypal}prestashop>back_office_ff0d39d63c036426d6833917d512ef22'] = 'anlamına gelir. Test modunu aktive etmek istediğinizden emin misiniz?'; +$_MODULE['<{paypal}prestashop>back_office_980d7b730b063eabd43e8954e4e072ad'] = 'Tebrikler !'; +$_MODULE['<{paypal}prestashop>back_office_bb945e9f42acb423adb3d7535d491444'] = 'Artık PayPal ile ödeme almaya başlayabilirsiniz.'; +$_MODULE['<{paypal}prestashop>back_office_10479c32ebaae1b49b512189d88e9fdd'] = 'Artık PayPal ödeme çözümlerini test edebilirsiniz. Daha sonra bu sayfaya gelip canlı modu aktive ederek ödeme almayı unutmayın.'; +$_MODULE['<{paypal}prestashop>back_office_9dff3a2f8c5760586559e4f28223d7ee'] = '3. adımda açıklanan PayPal kimlik bilgilerini tamamlamanız gerekmektedir. Aksi halde ödeme alamazsınız.'; diff --git a/modules/paypal/translations.xml b/modules/paypal/translations.xml new file mode 100644 index 000000000..d98a1abff --- /dev/null +++ b/modules/paypal/translations.xml @@ -0,0 +1,4008 @@ + + + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + Getting started with PayPal only takes 5 minutes + + Get more buyers
100 million-plus PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment method
  • + ]]> +
    + + Your country + change + Select your country + + + Use PayPal In Context Checkout + Make your client pay without leaving your website + Merchant ID + + Translated in your language + + Need help ?]]> Give us a call : xxxx + call + + + You already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, pay only when you get paid. + + + Website Payments Pro + + A professional platform to accept payments through credit cards and PayPal account, covered by seller protection.]]> + Customized payments pages. Monthly subscription of 25€. + + Click on the SAVE button only when PayPal has approved your subscription for this product. This process can take up to 3-5 days. + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%*. + *Source: Forrester research realized in march 2011 + + Apply or open your PayPal Business account + + Enable your online shop to process payments + Give your PayPal Identification info, finish to set-up your account and start accepting payments + Communicate your PayPal identification info to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal identification info + After clicking on the "Get my PayPal identification info" button, enter your login and password in the pop up, copy your PayPal identification info from the pop up and paste them is the below fields. + API username + API password + API signature + API business e-mail + Please check once more that you pasted all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Use express checkout shortcut + Offer your customers a 2-click payment option + + Use Sand box + (recommanded) + Activate a test environment in your PayPal account (only if you are a developer). + Learn more + https://developer.paypal.com/ + Live mode + Test mode + + Activating the test mode implies that + + You won’t be able to accept payment +
  • You will need to come back to the PayPal module page in order to complete the Step 3 before going live.
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to complete the PayPal identification Information in step 3 otherwise you won’t be able to accept payment. + + Congratulation ! + You can now start accepting Payment with PayPal. + You can now start testing PayPal solutions. Don’t forget to comeback to this page and activate the live mode in order to start accepting payements. + Client ID + Secret + PayPal Blue + Neutral + + + Sign Up + Once your account is created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=2 + + + Subscribe + + Click on the SAVE button only when PayPal has approved your subscription for this product,]]> + otherwise you won't be able to process payment. This process can take up to 3-5 days. + + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=4 + + + Sign Up + Once your account is created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=3 + + + + + + + + Subscribe + + Click on the SAVE button only when PayPal has approved your subscription for this product,]]> + otherwise you won’t be able to process payment. This process can take up to 3-5 days.]]> + ]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to ]]>step 3]]>. + + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=4 + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call : 1800-073-263 + + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + Website Payments Pro - Hosted Solution + A professional platform that enables you to accept debit card, credit card and PayPal payments.]]>Customised payment pages. Monthly subscription of 25$. + Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days. + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=48 + + + Apply + Please only click the SAVE button at the bottom of the page once PayPal has approved your application for this product, otherwise you won't be able to process any card payments. This process can take up to 3-5 days + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=50 + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=49 + + + Sign Up + + + + + Apply + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to step 3]]>. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=50 + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call : 0800 50970 + call + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=42 + + + + + + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=43 + + + Sign Up + + + + + Apply + + + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call : 400-680-6220 + call + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=58 + + + + + + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=59 + + + Sign Up + + + + + Apply + + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to step 3. + + + + + + + + +
    + + + Ja + Nein + Schnell, einfach, sicher + Mit Sicherheit + mehr Umsatz + + PayPal in Ihrem Shop zu aktivieren dauert nur 5 Minuten + + Mehr Kunden akquirieren
    15 Millionen PayPal-Kunden in Deutschland +
  • Mehr Sicherheit genießen
    Der PayPal-Verkäuferschutz sichert Sie im Fall der Fälle ab
  • +
  • Mehr Umsatz generieren
    Steigern Sie Ihren Umsatz um durchschnittlich 18,7%
  • +
  • Mehr Schutz schaffen
    Ihre Warenkorb-Informationen werden nicht weitergegeben
  • + ]]> +
    + + Ihr Land + Ändern + Land auswählen + + Übersetzt in Ihre Sprache + + Haben Sie Fragen?]]> Rufen Sie uns an: 01805 23 32 05 + call + (Maximal 14 Cent/Min. aus dem Festnetz. Für Anrufe aus Mobilfunknetzen fallen Gebühren von maximal 42 Cent/Min. an.) + + Haben Sie bereits ein PayPal-Konto + Wählen Sie Ihre PayPal-Lösung aus + Mehr erfahren]]> + + Möchten Sie PayPal in Ihrem Online-Shop anbieten ? + Need PayPal in addition to your existing card processor ? + + Wählen Sie + + PayPal Express + + Sie profitieren von weniger Kaufabbrüchen und profitieren so von mehr Umsatz. + + + Website Payments Pro + Eine professionelle Plattform für eingehende Kreditkarten- und PayPal-Zahlungen, inklusive Verkäuferschutz.]]>Angepasste Zahlungsseiten. 25,00 EUR monatlich. + Klicken Sie erst dann auf "Speichern", nachdem PayPal dieses Produkt für Sie freigeschaltet hat. Das dauert in der Regel 3-5 Tage. + + Website Paypal Plus + Tagline + Disclaimer + Client ID + Secret + + Express Checkout + Steigern Sie Ihre Online-Umsätze um 30%* + * Quelle: Forrester-Studie vom März 2011 + + Eröffnen Sie ein PayPal-Geschäftskonto + + So aktivieren Sie PayPal in Ihrem Online-Shop oder auf Ihrer Webseite + Einfach Ihre PayPal-Daten eingeben, Konto einrichten und sofort Zahlungen akzeptieren + Übermitteln Sie die Daten Ihrer API-Schnittstelle an PrestaShop + Geben Sie dieselbe E-Mail-Adresse an wie bei der Eröffnung Ihres PayPal-Geschäftskontos. + API Informationen abrufen + Nachdem Sie auf "API Informationen abrufen" geklickt haben, geben Sie bitte Ihren PayPal Login-Namen und das Passwort in das Pop-Up ein, kopieren Sie dann die Infos, um Sie in die unten stehenden Felder einzusetzen. + API-Name + API-Passwort + API-Signatur + API business e-mail + Bitte überprüfen Sie Ihre Angaben auf Vollständigkeit. + + Schließen Sie den Anmeldeprozess für Ihr PayPal-Konto ab + Bestätigen Sie Ihre E-Mail-Adresse: PayPal hat Ihnen nach der Kontoeröffnung eine mail mit weiteren Informatonen gesendet. + Fügen Sie in Ihrem PayPal-Konto Ihr Bankkonto oder Ihre Kreditkarte hinzu. Loggen Sie sich in Ihren PayPal Account ein und klicken auf "Mein Geschäftskonto einrichten". + + Weitere Einstellungen + + Bitte wählen Sie, welche Lösung Sie nutzen möchten + iFrame + Vollständige Weiterleitung + Bitte wählen Sie Ihr Template + + + Nutzen Sie Express Checkout Shortcut + Per Klick gelangen Ihre Kunden ohne Umwege direkt zur PayPal-Zahlungsseite + + Nutzen Sie die Sandbox + (empfohlen) + Damit können Sie den PayPal-Bezahlfluss in einer Test-Umgebung ausprobieren. + Mehr erfahren. + http://www.paypalobjects.com/de_DE/html/IntegrationCenter/ic_sandbox.html + Reale Umgebung (empfohlen) + Test-Umgebung + + Wenn Sie die Test-Umgebung aktivieren + + Können Sie keine Zahlungen empfangen. +
  • Müssen Sie auf diese Seite zurückkehren, um Schritt 3 abzuschließen.
  • +
  • Sollten Sie einen Zugang zur PayPal-Sanbox einrichten. (Mehr erfahren)
  • +
  • Sollten Sie Programierkenntnisse mitbringen.
  • + ]]> +
    + Sind Sie sicher, die Test-Umgebung jetzt zu aktivieren ? + + Zahlungsweise + + Wählen Sie Ihren Weg der Zahlungsabwicklung (automatische oder manuelle Autorisierung).]]> + Der PayPal-Verkäuferschutz sichert Sie ab, wenn Ihre Käufer mit PayPal bezahlen. ]]>Und so funktioniert es]]>. + + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Speichern + + Sie können keine Zahlungen empfangen, wenn Sie nicht die notwendigen Informationen in Schritt 3 angeben. + + Herzlichen Glückwunsch ! + Nun ist PayPal aktiviert und Sie können Zahlungen empfangen. + Jetzt können Sie die PayPal-Lösungen ausprobieren. Vergessen Sie bitte nicht, hierher zurückzukommen, um die reale Umgebung zu aktivieren. Denn sonst können Sie keine Zahlungen empfangen. + + + JETZT ANMELDEN + Sobald Sie das Konto eröffnet haben, fahren Sie bitte mit Schritt 3 fort. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=14 + + + Abonnieren + Klicken Sie erst dann auf "Speichern", nachdem PayPal dieses Produkt für Sie freigeschaltet hat.]]> + Andernfalls werden Sie keine Zahlungen verarbeiten können. Das dauert in der Regel 3-5 Tage. + + + Anmelden + Nachdem Sie Ihr Konto erstellt haben, schließen Sie auf dieser Seite Schritt 3 ab. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=3 + + + + + + + + Abonnieren + Klicken Sie erst dann auf "Speichern", nachdem PayPal dieses Produkt für Sie freigeschaltet hat.]]>Andernfalls werden Sie keine Zahlungen verarbeiten können. Das dauert in der Regel 3-5 Tage.]]>]]>Falls PayPal für Sie Website Payments Pro bereits freigeschaltet hat, gehen Sie direkt zu + + + + + + + +
    + + + + No + Pague con su tarjeta de débito, crédito o su cuenta PayPal + + + La forma rápida y segura de pagar en Internet + Aceptar pagos con PayPal sólo le llevará ]]>unos minutos]]> + + Consiga más clientes
    Más de 100 millones de cuentas activas en el mundo +
  • Acceda a clientes internacionales
    En 190 países y en 25 divisas
  • +
  • Facilite y mejore la experiencia de compra a sus clientes
    Sus clientes pagan en dos clicos
  • +
  • Pagos sin compartir los datos financieros.
    Acepte pagos con tarjeta y cuenta bancaria
  • + ]]> +
    + + Su país + change + Select your country + + ¿Necesita ayuda? Póngase en contacto con nosotros]]> + mail + + + ¿Ya tiene una cuenta PayPal Empresas? + Seleccione su solución + Más información]]> + + ¿Necesita PayPal para procesar todos sus pagos con tarjeta? + ¿Desea aceptar PayPal como forma de pago adicional a su pasarela actual? + + Elija + + Pago estándar + Comience a aceptar pagos al instante. Sin comisiones de alta, mantenimiento o cancelación, la única tarifa que se paga es cuando se recibe un pago. + + PayPal Pasarela Integral + + Una pasarela todo en uno para aceptar pagos con tarjetas y con cuenta PayPal.]]> + Además de poder personalizar su flujo de pago, cuenta con un programa de protección*.]]> + Flujo de pago personalizado. Todo por una tarifa mensual de 15 eur.]]> + * Ver téminos y condiciones de Pasarela Integral de PayPal]]> + + Haga clic en el botón GUARDAR solo cuando PayPal apruebe su suscripción para este producto. Este proceso puede tardar 3-5 días. + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Pago exprés + Aumente sus ventas online en un 18%* + *Fuente: Estudio independiente realizado por Ipsos Public Affairs en julio de 2010, los vendedores online reportaron un incremento medio del 18% en sus ventas al añadir Pago exprés en su web. + + Abra su cuenta PayPal Empresas + + Active su tienda online para aceptar pagos con PayPal + + Comunique su información de identificación de PayPal a PrestaShop + Indique el correo electrónico asociado a su cuenta PayPal Empresas + Obtener mis datos de Identificación de PayPal + Después de hacer clic en el botón "Obtener mis datos de identificación en PayPal", introduzca su nombre de usuario y contraseña en la ventana emergente, copie sus datos de identificación de la ventana emergente y péguelos en los campos correspondientes. + Nombre de usuario de API + Contraseña de API + Firma + Correo electrónico en PayPal + Asegúrese de incluir todos los caracteres, comprueba una vez más que ha pegado todos los caracteres. + + Para finalizar configure su cuenta PayPal siguiendo estos pasos + Confirme su dirección de correo electrónico: compruebe el correo electrónico enviado por PayPal al crear su cuenta + Añada una tarjeta o cuenta bancaria a su cuenta PayPal: inicie sesión en su cuenta PayPal y vaya a "Verificar mi tarjeta" + + Opciones de configuración + + Seleccione la solución que desea usar + Iframe + Redirección de página completa + Seleccione una plantilla + + Utilice Pago exprés (acceso rápido) + Ofrezca a sus clientes una opción de pago con tan solo 2 clics + + Utilice el entorno de prueba Sandbox + (recomendado) + Active un entorno de prueba en su cuenta PayPal (solo si es programador). + Más Información + Modo real (recomendado) + Modo de prueba + + La activación del modo de prueba implica que + + No podrá aceptar pagos. +
  • Tendrá que regresar a la página de PayPal para completar el paso 3 antes de estar en modo real.
  • +
  • Tendrá que crear una cuenta en el entorno Sandbox de PayPal (Más información)
  • +
  • Necesitará conocimientos de programación
  • + ]]> +
    + ¿Está seguro que desea activar el modo de prueba? + + Método de pago + Elija su forma de procesar los pagos (autorización automática o manual). + Direct sales + Authorization/Manual capture (payment shipping) + + Guardar + + Tiene que completar los datos de Identificación de PayPal en el paso 3 para que pueda aceptar pagos. + + Enhorabuena ! + Ya puede aceptar pagos con PayPal. + Ya puede probar las soluciones de PayPal. No olvide volver a esta página para activar el modo real y poder aceptar pagos. + + + Abrir una cuenta + Una vez que haya abierto su cuenta, regrese a esta página para completar el paso 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=10 + + + Solicitar + + Haga clic en el botón GUARDAR solo cuando PayPal apruebe su suscripción para este producto. Este proceso puede tardar 3-5 días. + + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=12 + + + Abrir una cuenta + Una vez que haya abierto su cuenta, regrese a esta página para completar el paso 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=11 + + + + Solicitar + + Haga clic en el botón GUARDAR solo cuando PayPal apruebe su suscripción para este producto. Este proceso puede tardar 3-5 días]]> + Si PayPal ya ha aprobado su solicitud de Pasarela integral, vaya directamente ]]>al paso 3.]]>. + + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=12 + + +
    + + + Oui + Non + Payez par carte ou par compte PayPal + Leader des + paiements en ligne + Plus simple, plus rapide et plus sûr pour vos clients. + Commencer avec PayPal ne prend que ]]>5 minutes]]> + + Touchez plus de clients
    Plus de 100 millions de comptes actifs à travers le monde +
  • Acceptez les paiements à l'international
    190 pays, 25 devises
  • +
  • Rassurez vos clients
    Ils n'ont pas besoin de partager leurs informations confidentielles
  • +
  • Acceptez les principaux moyens de paiements
    Visa, Mastercard, Carte Bleue, Aurore, Cofinoga, 4 Etoiles, PayPal
  • + ]]> +
    + + Traduis dans votre langue + + Votre pays + changer + Select your country + + Besoin d'aide ?]]> Appelez nous au 0800 942 850* + call + * Appel gratuit depuis un poste fixe, 7 jours /7 de 9h00 à 18h30. + + Vous possédez déjà un compte PayPal Professionnel + Choisissez votre solution + En savoir plus]]> + + Besoin de PayPal pour accepter tous les paiements par carte ? + Besoin d'ajouter le bouton PayPal en tant que moyen de paiement supplémentaire ? + + Choisissez + + PayPal Intégral + + Acceptez immédiatement les principaux moyens de paiements du web. Pas de frais fixe ni d'engagement de durée. Payez seulement à la réception des paiements. + + + PayPal Intégral Evolution + + Une plateforme de paiement complète, une protection des paiements en plus*.]]> + Ayez la possibilité de personnaliser votre page de paiement. Abonnement mensuel de 25€. + ]]>*Soumis à conditions, voir les ]]>conditions d'utilisation]]> + + PayPal Integral Evolution est soumis à conditions et le traitement de votre inscription peut prendre 3 à 5 jours ouvrés. Merci de ne cliquer sur le bouton "Sauvegardez" en bas de la page qu'une fois votre inscription validée par PayPal. + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + PayPal Option + + Ajoutez PayPal Option + peut générer 20 à 30 % de ventes additionnelles*. + *Source: Étude Forrester réalisée en mars 2011 + + Souscrivez ou ouvrez un compte PayPal Professionnel + + Configurez votre solution pour commencer à accepter les paiements + + Communiquez vos informations d'identification PayPal à PrestaShop + Indiquez l'email que vous avez utilisé pour créer votre compte PayPal professionnel + Obtenir mes informations d'identification PayPal + Après avoir cliqué sur le bouton "Obtenir mes informations d'identification PayPal", entrez vos identifiant et mot de passe PayPal dans la fenêtre qui s'affichera, copier les informations fournies par PayPal et collez les dans les champs ci-dessous. + Identifiant API + Mot de passe API + Signature + E-mail compte PayPal professionnel + Merci de vérifier que vous avez bien collé l'ensemble des caractères, certain champs contiennent beaucoup de caractères. + + Pour finir la configuration de votre compte PayPal + Confirmer votre adresse e-mail en suivant la procédure envoyée par PayPal lors de la création de votre compte + Lier votre compte PayPal à un compte bancaire ou à une carte bancaire. Connectez-vous à votre compte PayPal et rendez-vous dans la section "Premier pas" + + Options de configuration PayPal + + Choisissez votre solution + Iframe + Redirection complète de la page + Choisissez un template + + Utilisez PayPal Express + Offrez à vos clients la possibilité de payer en 2 clics + + Utilisez PayPal In Context Checkout + Faites payer votre client sans quitter votre site + ID du marchant + + Utilisez la Sandbox + (recommandé) + Mettez en place un environnement de test dans votre compte PayPal (seulement si vous êtes un développeur). + Plus d'infos + Mode réel (recommandé) + Mode test + + Activer le mode test implique que + + Vous ne serez pas en mesure d'accepter les paiements immédiatement +
  • Vous devrez créer un compte test sur le site PayPal sandbox. (plus d'infos)
  • +
  • Vous aurez besoin de compétences en développement
  • +
  • Vous devrez revenir à la page du module PayPal afin de compléter l'étape 3 avec les informations d'identification de votre compte test
  • +
  • Pour passer en mode réel, vous devrez revenir sur la page du module PayPal et indiquer vos informations d'identification PayPal à nouveau
  • + ]]> +
    + Êtes vous sûr de vouloir activer le mode test ? + + Type de paiement + Choisissez votre manière de valider les paiements (Automatique vs. Autorisation manuelle). + Direct sales + Authorization/Manual capture (payment shipping) + + Sauvegardez + + Vous devrez compléter l'ensemble des informations d'identification PayPal durant l'étape 3 autrement vous ne serez pas en mesure d'accepter les paiements. + + Bravo ! + Vous pouvez maintenant commencer à accepter les paiements avec PayPal. + Vous pouvez maintenant commencer à tester les solutions PayPal. N'oubliez surtout pas de revenir sur cette page et d'activer le mode réel afin de commencer à accepter les paiements. + + + Ouvrez un compte + Une fois votre compte créé, revenez sur cette page pour compléter l'étape 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=2 + + + Souscrivez + + PayPal Integral Evolution est soumis à conditions et la validation de votre inscription peut prendre 3 à 5 jours ouvrés.]]> + Veuillez ne cliquer sur le bouton "Sauvegardez" en bas de la page qu'une fois votre inscription validée par PayPal + + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=4 + + + Ouvrez un compte + Une fois votre compte créé, revenez sur cette page pour compléter l'étape 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=3 + + + + Souscrivez + + PayPal Integral Evolution est soumis à conditions et la validation de votre inscription peut prendre 3 à 5 jours ouvrés.]]> + Veuillez ne cliquer sur le bouton "Sauvez" en bas de la page qu'une fois votre inscription validée par PayPal sinon vous ne serez pas en mesure d'accepter les paiements.]]> + Si votre souscription à PayPal Intégral Evolution a déjà été validée par PayPal, merci d'aller directement à ]]>l'étape 3]]>. + + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=4 + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call on 0844 338 0470 + call + + + Already have a PayPal Business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + Website Payments Pro Hosted + A professional platform that enables you to accept debit card, credit card and PayPal payments. Customised payment pages.]]> Monthly subscription of £20. + Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days. + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + PayPal Business account e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=39 + + + Apply + Please only click the SAVE button at the bottom of the page once PayPal has approved your application for this product, otherwise you won't be able to process any card payments. This process can take up to 3-5 days + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=40 + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=39 + + + Sign Up + + + + + Apply + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to ]]>step 3]]>. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=40 + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call : 852-3550-8574 + call + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + Website Payments Pro Hosted Solution + A professional platform that enables you to accept debit card, credit card and PayPal payments. Customised payment pages.]]>Monthly subscription of HKD$200. To sign-up, please contact a PayPal customer service representative. + Please only click the SAVE button at the bottom of the page once PayPal has approved your application for this product, otherwise you won't be able to process any card payments. This process can take up to 3-5 days + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=61 + + + Apply + + "Contact a PayPal sales representative at +852 3550 8584 or email us via the following button]]> + Please only click the SAVE button at the bottom of the page once PayPal has approved your application for this product, otherwise you won't be able to process any card payments. This process can take up to 3-5 days" + + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=81 + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=62 + + + Sign Up + + + + + Apply + + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to step 3. + + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=81 + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Visit www.Paypal.com]]> + + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=23 + + + + + + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=24 + + + Sign Up + + + + + Apply + + + + + + + + +
    + + + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call : +1 402 938-3740]]>(a US telephone number) + call + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=76 + + + + + + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=77 + + + Sign Up + + + + + Apply + + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to step 3. + + + + + + + + +
    + + + + No + Paga con la carta o con il tuo conto PayPal + Il metodo ideale + per farsi pagare online + Rapido, affidabile, innovativo + Inizia subito a vendere con PayPal. Bastano 5 minuti + + Conquista nuovi clienti
    Oltre 110 milioni di conti PayPal attivi nel mondo +
  • Espandi la tua base utenti anche all'estero
    190 Paesi e 25 valute diverse
  • +
  • Offri più protezione ai tuoi clienti
    Chi compra non condivide i dati personali
  • +
  • Accetta le principali carte di credito e prepagate
    Visa, Mastecard, Amex, Aura, PayPal, etc.
  • + ]]> +
    + + Il tuo Paese + change + Select your country + + Hai bisogno di aiuto?]]> Chiamaci: 848 390 110 + call + * Costo da rete fissa: 6,8 cent. di euro per il primo minuto e 1,6 cent. di euro per quelli successivi. Per conoscere il costo della chiamata da telefono cellulare, contatta il tuo gestore mobile. Per le chiamate internazionali, rivolgiti al numero: + 353 1436 9021 (possono essere applicate le tariffe internazionali). + + Hai già un conto PayPal Business + Seleziona il prodotto che fa per te + Scopri di più]]> + + Vuoi usare PayPal per elaborare tutti i tuoi i pagamenti online ? + Vuoi PayPal come metodo di pagamento aggiuntivo ? + + Scegli + + Pagamenti su sito web + + Inizia subito a vendere online.]]> + Nessun costo iniziale né tariffe mensili. Paghi solo quando ricevi pagamenti. + + + PayPal Pro + + Il POS Virtuale completo, protezione delle vendite inclusa.]]> + *Accetti le principali carte di credito o prepagate e personalizzi la pagina di pagamento.]]> + Abbonamento mensile: €29 EUR. + *Soggetto ai termini e alle limitazioni delle ]]>Condizioni d'Uso]]>. + + Clicca il pulsante SALVA in fondo alla pagina solo dopo che PayPal avrà approvato la tua richiesta per PayPal Pro. Può richiedere 3-5 giorni. + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Pagamento express + Puoi conquistare nuovi clienti in tutto il mondo e aumentare le vendite. Gli acquirenti pagano in 3 clic e tu vendi anche su cellulare. + + + Richiedi PayPal Pro o apri un conto PayPal Business + + Accetta pagamenti online sul tuo sito + + Clicca il pulsante di seguito per fornire le tue credenziali PayPal a PrestaShop + + Richiedi le credenziali PayPal + Dopo aver cliccato il pulsante, inserisci nome utente e password nella finestra di pop up: da qui copia le credenziali PayPal ottenute e incollale nei campi di seguito. + Username API + Password API + Firma API + API business e-mail + Controlla di aver inserito correttamente tutti i caratteri. + + Completa l'attivazione del tuo conto PayPal + Conferma il tuo indirizzo email: controlla l'email inviata da PayPal quando hai creato il conto + Collega il conto bancario o la carta di credito al tuo conto PayPal: accedi alla sezione “Informazioni generali" del tuo conto. + + Opzioni di configurazione + + Scegli la soluzione che vuoi utilizzare + iFrame + Reindirizzamento completo della pagina + Scegli il template + + Scegli il pulsante di Pagamento express + I tuoi clienti pagano in soli 2 clic + + Scegli Sand box + (consigliato) + Avrai a disposizione un ambiente di test sul tuo conto PayPal. + Scopri di più + Modalità Live (consigliato) + Modalità Test + + Se attivi la modalità Test + + Non potrai accettare pagamenti +
  • Dovrai tornare alla pagina PayPal e completare il terzo passaggio prima di andare live.
  • +
  • Dovrai creare un conto sul sito Sandbox di PayPal. (Scopri di più)
  • +
  • Devi avere competenze informatiche
  • + ]]> + + Sei sicuro di voler attivare la modalità test ? + + Tipo di pagamento + Scegli il tuo metodo per processare pagamenti: (automatico vs autorizzazione manuale). + Direct sales + Authorization/Manual capture (payment shipping) + + Salva + + Per ricevere i pagamenti online, devi completare il terzo passaggio. + + Complimenti. + Ora puoi ricevere pagamenti con PayPal. + Ora puoi provare i prodotti PayPal. Ricorda di tornare su questa pagina e attivare la modalità live per iniziare ad accettare pagamenti. + + + Registrati + Quando avrai aperto il conto, torna su questa pagina e completa il terzo passaggio. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=6 + + + Richiedilo + + Clicca il pulsante SALVA in fondo alla pagina solo dopo che PayPal avrà approvato la tua richiesta per PayPal Pro,]]> + altrimenti non potrai elaborare i pagamenti. Può richiedere 3-5 giorni. + + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=8 + + + Registrati + Quando avrai aperto il conto, torna in questa pagina e completa il terzo passaggio. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=7 + + + + Richiedilo + + Importante! Clicca il pulsante SALVA in fondo alla pagina solo dopo che PayPal avrà approvato la tua richiesta per PayPal Pro,]]> + altrimenti non potrai elaborare il pagamento. Può richiedere 3-5 giorni.]]> + ]]> + Se invece PayPal ha già approvato la tua richiesta per PayPal Pro, vai direttamente al ]]>terzo passaggio]]>. + + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=8 + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call : 03-6739-7360 or 0120-271-888 + call + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + Website Payments Plus + A professional platform that enables you to accept debit card, credit card and PayPal payments. Customised payment pages. Monthly subscription of JPY 3,000. To sign-up, please contact a PayPal customer service representative. + Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days. + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=55 + + + Apply + + "Contact a PayPal sales representative at 03-6739-7360 or 0120-271-888]]> + Please only click the SAVE button at the bottom of the page once PayPal has approved your application for this product, otherwise you won't be able to process any card payments. This process can take up to 3-5 days" + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=82 + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=56 + + + Sign Up + + + + + Apply + Contact a PayPal sales representative at 03-6739-7360 or 0120-271-888 + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=39 + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call : 60-3-77237155 + call + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=70 + + + + + + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=71 + + + Sign Up + + + + + Apply + + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to step 3. + + + + + + + + +
    + + + Ja + Nee + Betaal met uw creditcard of PayPal-account + Het + Nieuwe Betalen + Makkelijk, Veilig en Overal. + Het openen van een PayPal-rekening neemt maar enkele minuten in beslag + + De ideale manier om te betalen en betaald te worden. +
  • Miljoenen kopers kiezen PayPal vanwege de veilige en snelle koopervaring.
  • +
  • Verkopers zijn dol op PayPal, omdat ze daarmee hun omzet kunnen vergroten en betalingen beter kunnen beheren.
  • + ]]> +
    + + Land + Wijzig + Selecteer uw land + + Hulp nodig?]]> Neem contact op met een van onze adviseurs: 0900 265 8950 + call + + + Heeft u al een zakelijke PayPal-rekening + Kies het product wat bij u past + Meer weten]]> + + U wilt betalingen via creditcard en bankoverschrijving accepteren? + Wilt u PayPal als aanvulling op uw huidige betaalsysteem? + + Kies + + PayPal Standard Checkout + als u binnen enkele minuten met online verkopen wilt beginnen. ]]> + Geen vaste, opstart- of annuleringskosten: enkel een laag tarief voor het ontvangen van betalingen. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + u vergroot uw omzet en ontvangt uw betaling in slechts drie klikken (ook op mobiele apparaten). + + + Open nu uw zakelijke PayPal-rekening. + + Configureer uw instellingen om betalingen te kunnen accepteren + + Vul uw identificatiegegevens van PayPal in de PrestaShop omgeving + Indicate the email you used when you signed up for a PayPal Business account + Vraag mijn identificatiegegevens op bij PayPal + Klik op de knop "Vraag mijn identificatiegegevens op bij PayPal" en kopieer je gebruikersnaam en wachtwoord uit het informatieveld in de onderstaande velden. + API gebruikersnaam + API wachtwoord + Handtekening + API business e-mail + Kijk de gegevens die je net hebt gekopieerd goed na. Sommige velden bevatten namelijk veel karakters. + + Om de configuratie van je PayPal account te finaliseren zijn onderstaande acties noodzakelijk + Volg de procedure die via PayPal verstuurd is tijdens het aanmaken van je account om je e-mail te bevestigen. + Koppel je PayPal account aan een bankrekening of bankkaart. Om dit te doen log je in in je PayPal account en ga je naar de sectie "eerste stappen". + + PayPal configuratieopties + + Kies de betaaloplossing die u wilt gebruiken + Iframe + Full page redirect + Kies uw sjabloon + + Gebruik PayPal Express Checkout Shortcut + Geef je klanten de mogelijkheid om in twee stappen te betalen + + Gebruik de Sandbox + (aanbevolen) + Stel een testomgeving in in je PayPal account (enkel voor ontwikkelaars) + Meer info + Productieomgeving (aanbevolen) + Testomgeving + + Bij activeren van de test-modus + + Bent u nog niet in staat om betalingen te accepteren. +
  • Dient u, voor u live kunt gaan, de PayPal-identificatie gegevens in te vullen bij stap 3.
  • +
  • Heeft u een PayPal Sandbox account nodig (learn more).
  • +
  • Dient u kennis van programmeren of een programmeur beschikbaar te hebben.
  • + ]]> +
    + Weet u zeker dat de test wilt activeren ? + + Payment type + Kies de manier waarop je betaling wordt verwerkt (automatisch of handmatige autorisatie). + Direct sales (aanbevolen) + Authorization/Manual capture (automatische of handmatige autorisatie) + + Opslaan + + Om betalingen te kunnen ontvangen, dient u de PayPal-identificatie gegevens in te vullen bij stap 3. + + Gefeliciteerd ! + U kunt nu betalingen met PayPal ontvangen! + U kunt nu beginnen met het testen van PayPal oplossingen. Indien u de live-modus wilt activeren, kunt u de instelling op deze pagina + wijzigen en direct beginnen met het accepteren van betalingen via PayPal. + + + Rekening openen + Zodra u uw PayPal-rekening geopend heeft, kunt u op deze pagina stap 3 voltooien. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=17 + + + Rekening openen + + + + + Rekening openen + Zodra u uw PayPal-rekening geopend heeft, kunt u op deze pagina stap 3 voltooien + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=18 + + + Rekening openen + Overslaan + + + + Overslaan + + + + Rekening openen + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call : (888) 221-1161 + call + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=52 + + + + + + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=53 + + + Sign Up + + + + + Apply + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to step 3. + + + + + + + +
    + + + Tak + Nie + Pay with your card or your PayPal account + ŚWIATOWY LIDER + PŁATNOŚCI ONLINE + Łatwiejsze, szybsze i bezpieczniejsze płatności dla Twoich kupujących. + Wdrożenie płatności PayPal zajmie Ci tylko kilka minut + + Dodatkowi klienci
    Na świecie jest już ponad 100 milionów aktywnych kont PayPal +
  • Międzynarodowy zasięg
    PayPal jest dostępny w 190 krajach i 25 walutach
  • +
  • Bezpieczeństwo dla Twoich klientów
    Kupujący nie muszą ujawniać swoich danych finansowych
  • +
  • Lokalne metody płatności
    Ulubione, lokalne metody płatności są podane jak na tacy
  • + ]]> +
    + + Twój kraj + Zmień + Select your country + + Potrzebujesz pomocy ?]]> Zadzwoń do nas pod numer 801 386 686 + call + + + Masz już firmowe konto PayPal + WYBIERZ ROZWIĄZANIE DOPASOWANE DO TWOICH POTRZEB + Dowiedz się więcej]]> + + Chcesz akceptować płatności za pomocą systemu PayPal? + Chcesz akceptować PayPal jako dodatkową metodę płatności? + + Wybierz + + PayPal Standard + + Akceptuj płatności PayPal już dziś. Możesz wykorzystać gotowe przyciski płatności PayPal lub samodzielnie dostosować rozwiązanie oparte na kodzie HTML.]]> + Bez opłat abonamentowych. Opłaty naliczane są tylko za odbiór płatności. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + PayPal Express + + Dzięki prostocie procesu realizacji transakcji klienci częściej i regularniej kupują w Twoim sklepie, a Twoja sprzedaż wzrasta nawet o 30%*.]]> + Bez opłat abonamentowych. Opłaty naliczane są tylko za odbiór płatności. + + *Źródło: badania firmy Forrester zrealizowane w marcu 2011 + + ZAŁÓŻ FIRMOWE KONTO PAYPAL + + ODBIERAJ PŁATNOŚCI BEZPOŚREDNIO ZA POMOCĄ SWOJEGO SKLEPU INTERNETOWEGO + + Przekaż dane uwierzytelniające API swojego konta PayPal do systemu PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + UZYSKAJ DANE UWIERZYTELNIAJĄCE SWOJEGO KONTA PAYPAL + Po kliknięciu przycisku Uzyskaj dane uwierzytelniające swojego konta PayPal wprowadź w małym oknie pojawiającym się na tle bieżącej strony adres e-mail i hasło swojego konta PayPal, skopiuj dane uwierzytelniające API swojego konta PayPal, a następnie wklej w polach poniżej. + Użytkownik API + Hasło API + Podpis API + API business e-mail + Upewnij się, że wszystkie znaki zostały przez Ciebie poprawnie skopiowane i wklejone. + + Aby zakończyć konfigurację konta PayPal, musisz + Potwierdzić swój adres email: odszukaj wiadomość e-mail wysłaną przez system PayPal po założeniu konta PayPal. + Powiąż ze swoim kontem PayPal kartę kredytową lub rachunek bankowy: zaloguj się do swojego konta PayPal i kliknij łącze ]]>Powiąż kartę z kontem PayPal]]> i potwierdź ją lub łącze ]]>Powiąż rachunek bankowy z kontem PayPal]]> i potwierdź go. + + Opcje konfiguracji + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Wybierz PayPal Express + pozwól swoim klientom płacić dwoma kliknięciami + + Skorzystaj z platformy testowej Sandbox + + skorzystaj ze środowiska testowego, aby wypróbować system PayPal. + Dowiedz się więcej + Tryb rzeczywisty + Tryb testowy + + W środowisku testowym Sandbox + + konieczne będzie stworzenie testowych kont PayPal dla sprzedawcy i kupującego (dowiedz sie więcej) +
  • nie będzie można akceptować rzeczywistych płatności
  • +
  • Aby akceptować rzeczywiste płatności, przejdź do kroku numer 3 na tej stronie.
  • + ]]> +
    + Chcesz skorzystać ze środowiska testowego ? + + Metoda płatności + Wybierz sposób dokonywania płatności (automatycznie vs. ręczna autoryzacja). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Zachowaj + + Musisz uzupełnić dane uwierzytelniające swojego konta PayPal w kroku numer 3, aby móc akceptować rzeczywiste płatności. + + Konfiguracja przebiegła pomyślnie ! + Teraz możesz już akceptować płatności PayPal. + Teraz możesz już testować płatności PayPal. Pamiętaj, że musisz wrócić do tej strony, aby aktywować tryb rzeczywisty i akceptować płatności PayPal. + + + Załóż konto + Po założeniu konta, wróć do tej strony, aby dokończyć proces. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=32 + + + + + + + + Załóż konto + Po założeniu konta, wróć do tej strony, aby dokończyć proces. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=33 + + + + + + + + + + + + + Pomiń ten krok + + + +
    + + + Sim + Não + Pague com o PayPal em 8x sem juros + Líder em + Pagamentos online + Fácil, seguro, rápido pagamento para seus clientes. + Só leva alguns minutos para começar com o PayPal + + Conquiste mais clientes
    Mais de 100 milhões de contas ativas no Paypal mundialmente +
  • Acesse clientes internacionais
    190 países, 25 moedas
  • +
  • Dê garantia aos seus clientes
    Compradores não precisam compartilhar informações privadas
  • +
  • Aceite todos os principais métodos de pagamento
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Seu país + Mudar + Selecione seu país + + Precisa de Ajuda?]]> Entre em contato:08008921555]]>(Serviço de atendimento ao cliente) + Ligue + + + Já tem uma conta PayPal para empresa + Selecione sua solução + Saiba mais]]> + + Precisa do Paypal para processar todos seus pagamentos por cartão? + Precisa do Paypal além do seu processador de cartão de crédito atual? + + Escolher + + Website Payments Standard + + Comece a aceitar pagamentos imediatamente.]]> + Sem taxa de assinatura, somente uma pequena taxa de transação quando você recebe pagamento. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Checkout Express + Aumente em 30% suas vendas on-line * com um simples processo de 3 cliques para a finalização da compra. + *Fonte1: Pesquisa Forrester conduzida em março de 2011 + + Registre-se para sua conta para empresa gratuíta do Paypal + + Processe pagamentos na sua loja virtual + + Forneça suas credenciais da API do Paypal para o PrestaShop + Indique o email que você usou quando você se cadastrou para uma conta para empresa do Paypal + Obtenha minhas credenciais da API do PayPal + Clique aqui e coloque no pop-up seu email e senha de login no Paypal, então copie e cole suas credenciais da API do PayPal nos campos abaixo. + API usuário + API senha + API assinatura + API e-mail da empresa + Por favor verifique que você tenha copiado todos os caractéres. + + Para finalizar a configuração da sua conta Paypal, você precisa + Confirmar seu endereço de email : veja o email enviado pelo Paypal quando você criou sua conta + Vincule sua conta do Paypal à uma conta bancária ou uma conta de cartão de crédito: Acesse sua conta PayPal e vá à “My business setup” + + Opções de Configuração + + Escolha a solução que quer utilizar + iFrame + Redireccionamento de página completa + Seleccione um template + + Atalho para Checkout Express + Ofereça ao seu cliente uma experiência de 3 cliques para finalização da compra + + Use uma Sandbox + + Ative um ambiente teste em sua conta Paypal (somente para desenvolvedores). + Saiba mais + Modo Live (recomendado) + Modo teste + + Por favor note que se você escolher ativar o modo teste + + Você ainda não poderá aceitar pagamentos +
  • Você vai precisar voltar para a página do módulo PayPal para poder completar o Passo 3 antes de colocar no ar
  • +
  • Você vai precisar criar uma conta no site sandbox do PayPal (saiba mais)
  • +
  • Você vai precisar entender de programação
  • + ]]> +
    + Você tem certeza que você quer ativar o modo teste? + + Tipo de pagamento + Escolha sua maneira de processar pagamentos (automaticamente vs.autorização manual). + Vendas diretas (recomendado) + Autorização/Captura manual (payment shipping) + + Salvar + + Você precisa fornecer suas credenciais da API do Paypal no passo 3 para poder aceitar pagamentos. + + Parabéns! + Você pode começar agora a aceitar pagamentos com PayPal. + Você pode começar agora a testar as soluções do PayPal. Uma vez que você realizar seus testes, não esqueça de voltar para esta página e ativar o modo live para começar a aceitar pagamentos. + + + Cadastre-se + Uma vez que você abriu sua conta PayPal, ou se você já tem uma, continue no passo 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=79 + + + + + + + + Cadastre-se + Uma vez que sua conta for criada, volte nesta página para completar o passo 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=80 + + + Cadastre-se + + + + + Cadastre-se + + Importante: Por favor clique no botão SALVAR no pé da página quando o Paypal aprovar seu pedido de cadastro para este produto, ao contrário você não conseguirá processar nenhum pagamento por cartão. Este processo pode levar de 3 a 5 dias.]]> + Se o seu pedido de cadastro para Website Payments Pro já foi aprovado pelo Paypal, por favor vá diretamente para o passo 3. + + + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call :+65 6510 4584]]>(a Singapore telephone number) + call + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=79 + + + + + + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=80 + + + Sign Up + + + + + Apply + + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to step 3. + + + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Visit www.Paypal.com]]> + + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=45 + + + + + + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=46 + + + Sign Up + + + + + Apply + + + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call : 65-6510-4650 + call + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=67 + + + + + + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=68 + + + Sign Up + + + + + Apply + + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to step 3. + + + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call : +65 6590-5502]]>(a Singapore telephone number) + call + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=73 + + + + + + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=74 + + + Sign Up + + + + + Apply + + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to step 3. + + + + + + + + +
    + + + Evet + Hayır + Pay with your card or your PayPal account + ONLINE ÖDEME + ÇÖZÜMLERİNDE LİDER MARKA + Müşterileriniz için güvenli ve pratik ödeme yöntemi. + PayPal ile satış yapmaya başlamak yalnızca birkaç dakikanızı alır + + Müşteri tabanınızı genişletin
    PayPal ile başlıca kredi kartlarından ödeme alın ve PayPal'ı tercih eden 100 milyondan fazla aktif kullanıcıya erişin +
  • Uluslararası pazarlara açılın
    PayPal 190 ülkede ve 25 para birimi ile kullanılıyor
  • +
  • Müşterilerinizi güvende hissettirin
  • +
  • PayPal ile müşterileriniz kart bilgileri gibi hassas bilgileri paylaşmadan alışveriş yapabilirler
  • + ]]> +
    + + Ülkeniz + Değiştir + Select your country + + Yardıma mı ihtiyacınız var ?]]> Bize ulaşın : 444 77 01 + call + + + Zaten PayPal Ticari hesap sahibi misiniz + Bir ödeme çözümü seçin + Daha fazla bilgi alın]]> + + Tüm kart işlenmesini PayPal tarafından işlenmesini mi istiyorsunuz ? + Varolan ödeme çözümünüze ek olarak PayPal'ı mı eklemek istiyorsunuz? + + Önerimiz + + PayPal Website Payments Standard + Hemen ödeme almaya başlayın. Hayır. + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + PayPal Express Checkout + Satışlarınızı artırmanın güvenli yolu + + + PayPal Tícarí hesabı açın + + ÖDEME ALABİLMEK İÇİN WEB MAĞAZANIZI ETKİNLEŞTİRİN + + PayPal kimlik bilgilerinizi PrestaShop'a gönderin: + Indicate the email you used when you signed up for a PayPal Business account + PAYPAL KİMLİK BİLGİLERİMİ GÖRMEK İSTİYORUM + Yukarıdaki düğmeyi tıkladıktan sonra açılan sayfada PayPal kullanıcı adınızı ve şifrenizi girin. PayPal kimlik bilgilerinizi kopyalayın ve aşağıdaki alanlara yapıştırın. + API kullanıcı ismi + API şifresi + API imzanız + API business e-mail + Lütfen doğru karakterleri girdiğinizden emin olun. + + PayPal hesabınızın kurulumunu tamamlamak için + E-posta adresinizi onaylayın: PayPal'dan size gönderilecek onay e-postasındaki adımları izleyin + PayPal hesabınıza kredi kartınızı ekleyin ve onaylayın: PayPal hesabınıza giriş yapın ve Hesap Araçlarım kutusundaki "Ticari Ayarlarım" bağlantısını tıklayın + + Hesap ayarı seçenekleriniz + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + PayPal Express Checkout kullanın + Müşterilerinize 2 tıkla ödeme seçeneği sunun + + Sandbox kullanın + + PayPal hesabınızda bir test ortamı oluşturun (programlamcılar içindir) + Daha fazla bilgi alın + Canlı mod + Test modu + + Test modunu aktive etmek + + Ödeme alamayacağınız +
  • 3. adımı tamamlamak için PayPal modül sayfasına geri gelmeniz gerektiği
  • +
  • PayPal sandbox hesabı oluşturmanız (daha fazla bilgi alın)
  • +
  • Programlama becerilerine sahip olduğunuz
  • + ]]> +
    + anlamına gelir. Test modunu aktive etmek istediğinizden emin misiniz? + + Ödeme türü + Ödemelerin nasıl işlenmesini istediğinizi seçin (otomatik olarak veya manuel yetkilendirme). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Kaydedin + + 3. adımda açıklanan PayPal kimlik bilgilerini tamamlamanız gerekmektedir. Aksi halde ödeme alamazsınız. + + Tebrikler ! + Artık PayPal ile ödeme almaya başlayabilirsiniz. + Artık PayPal ödeme çözümlerini test edebilirsiniz. Daha sonra bu sayfaya gelip canlı modu aktive ederek ödeme almayı unutmayın. + + + HESAP AÇIN + Hesabınızı açtıktan sonra ödeme çözümünüzü eklemek için aşağıdaki adrese gidin + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=35 + + + + + + + + HESAP AÇIN + Hesabınızı açtıktan sonra 3. adımı tamamlamak için aşağıdaki adrese gidin: + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=36 + + + HESAP AÇIN + Bu adımı atlayın + + + + + + + + + + Bu adımı atlayın + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call : 02-8729-6625 + call + + + Already have a PayPal business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + + + + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + API business e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=64 + + + + + + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=65 + + + Sign Up + + + + + Apply + + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to step 3. + + + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call on 1-877-419-7765 + call + + + Already have a PayPal Business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + Website Payments Pro Hosted + A professional platform that enables you to accept debit card, credit card and PayPal payments. Customised payment pages.]]> Monthly subscription of £20. + Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days. + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + PayPal Business account e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=84 + + + Apply + Please only click the SAVE button at the bottom of the page once PayPal has approved your application for this product, otherwise you won't be able to process any card payments. This process can take up to 3-5 days + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=85 + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=86 + + + Sign Up + + + + + Apply + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to ]]>step 3]]>. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=85 + + + + + + +
    + + + Yes + No + Pay with your card or your PayPal account + Leader in + online payments + Easy, secure, fast payments for your buyers. + It only takes a few minutes to get started with PayPal + + Get more buyers
    Over 100 million active PayPal accounts worldwide +
  • Access international buyers
    190 countries, 25 currencies
  • +
  • Reassure your buyers
    Buyers don’t need to share their private data
  • +
  • Accept all major payment methods
    Visa, Mastercard, PayPal, etc.
  • + ]]> +
    + + Your country + change + Select your country + + Need help?]]> Give us a call on 1-877-419-7765 + call + + + Already have a PayPal Business account + Select your solution + Learn more]]> + + Need PayPal to process all your card payments ? + Need PayPal in addition to your existing card processor ? + + Choose + + Website Payments Standard + + Start accepting payments immediately.]]> + No subscription fees, only a small transaction fee when you get paid. + + + Website Payments Pro Hosted + A professional platform that enables you to accept debit card, credit card and PayPal payments. Customised payment pages.]]> Monthly subscription of £20. + Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days. + + PayPal Plus + + + Client ID + Secret + Use personnalisation (uses your logo and your shop name on Paypal) : + + Express Checkout + Boost your online sales by 30%* with a simple 3-click checkout process. + *Source: Forrester research conducted in March 2011 + + Sign up for your free PayPal Business account + + Process payments on your online shop + + Provide your PayPal API credentials to PrestaShop + Indicate the email you used when you signed up for a PayPal Business account + Get my PayPal API credentials + Click here and enter your PayPal email login and password in the pop-up, then copy and paste your PayPal API credentials into the fields below. + API username + API password + API signature + PayPal Business account e-mail + Please check that you have copied in all the characters. + + To finalize setting up your PayPal account, you need to + Confirm your email address : check the email sent by PayPal when you created your account + Link your PayPal account to a bank account or a credit card : log into your PayPal account and go to “My business setup” + + Configuration options + + Choose the solution you want to use + Iframe + Full page redirect + Choose your template + + Express Checkout shortcut + Offer your customers a 3-click checkout experience + + Use a Sandbox + + Activate a test environment in your PayPal account (developer only). + Learn more + Live mode (recommended) + Test mode + + Please note that if you choose to activate the test mode + + You won’t be able to accept payments yet +
  • You will need to come back to the PayPal module page in order to complete Step 3 before going live
  • +
  • You’ll need to create an account on the PayPal sandbox site (learn more)
  • +
  • You’ll need programming skills
  • + ]]> +
    + Are you sure you want to activate the test mode ? + + Payment type + Choose your way of processing payments (automatically vs.manual authorization). + Direct sales (recommended) + Authorization/Manual capture (payment shipping) + + Save + + You need to provide your PayPal API credentials in step 3 in order to accept payments. + + Congratulation ! + You can now start accepting payments with PayPal. + You can now start testing PayPal solutions. Once you've carried out your tests, don’t forget to come back to this page and activate the live mode in order to start accepting payments. + + + Sign Up + Once you've opened your PayPal account or if you have one already, then continue to step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=84 + + + Apply + Please only click the SAVE button at the bottom of the page once PayPal has approved your application for this product, otherwise you won't be able to process any card payments. This process can take up to 3-5 days + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=86 + + + Sign Up + Once your account has been created, come back to this page in order to complete step 3. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=85 + + + Sign Up + + + + + Apply + Important: Please click on the SAVE button at the bottom of the page only once PayPal has approved your application for this product, otherwise you won’t be able to process any card payments. This process can take up to 3-5 days.]]> + If your application for Website Payments Pro has already been approved by PayPal, please go directly to ]]>step 3]]>. + https://altfarm.mediaplex.com/ad/ck/3484-148727-12439-23?ID=40 + + + + + + +
    + +
    diff --git a/modules/paypal/translations/index.php b/modules/paypal/translations/index.php new file mode 100644 index 000000000..187d3649c --- /dev/null +++ b/modules/paypal/translations/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/upgrade/index.php b/modules/paypal/upgrade/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/upgrade/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/upgrade/install-2.8.php b/modules/paypal/upgrade/install-2.8.php new file mode 100644 index 000000000..799d43e10 --- /dev/null +++ b/modules/paypal/upgrade/install-2.8.php @@ -0,0 +1,129 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_2_8($object, $install = false) +{ + if (!Configuration::get('PAYPAL_NEW') && ($object->active || $install)) { + $result = true; + + /* Check PayPal API */ + if (file_exists(_PS_MODULE_DIR_.'paypalapi/paypalapi.php')) { + $confs = Configuration::getMultiple(array('PAYPAL_HEADER', 'PAYPAL_SANDBOX', 'PAYPAL_API_USER', 'PAYPAL_API_PASSWORD', + 'PAYPAL_API_SIGNATURE', 'PAYPAL_EXPRESS_CHECKOUT')); + + include_once _PS_MODULE_DIR_.'paypalapi/paypalapi.php'; + $paypalapi = new PayPalAPI(); + + if ($paypalapi->active) { + if (Configuration::get('PAYPAL_INTEGRAL') == 1) { + Configuration::updateValue('PAYPAL_PAYMENT_METHOD', WPS); + } elseif (Configuration::get('PAYPAL_INTEGRAL') == 0) { + Configuration::updateValue('PAYPAL_PAYMENT_METHOD', ECS); + } + + $paypalapi->uninstall(); + Configuration::loadConfiguration(); + + foreach ($confs as $key => $value) { + Configuration::updateValue($key, $value); + } + + } + } + + /* Create Table */ + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_order` ( + `id_order` int(10) unsigned NOT null auto_increment, + `id_transaction` varchar(255) NOT null, + PRIMARY KEY (`id_order`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8')) { + $result = false; + } + + if (!Db::getInstance()->Execute(' + ALTER TABLE `'._DB_PREFIX_.'paypal_order` ADD `payment_method` INT NOT null, + ADD `payment_status` VARCHAR(255) NOT null, + ADD `capture` INT NOT null')) { + $result = false; + } + + /* Hook */ + $object->registerHook('cancelProduct'); + $object->registerHook('adminOrder'); + + /* Create OrderState */ + if (!Configuration::get('PAYPAL_OS_AUTHORIZATION')) { + $order_state = new OrderState(); + $order_state->name = array(); + + foreach (Language::getLanguages() as $language) { + if (Tools::strtolower($language['iso_code']) == 'fr') { + $order_state->name[$language['id_lang']] = 'Autorisation acceptée par PayPal'; + } else { + $order_state->name[$language['id_lang']] = 'Authorization accepted from PayPal'; + } + + } + + $order_state->send_email = false; + $order_state->color = '#DDEEFF'; + $order_state->hidden = false; + $order_state->delivery = false; + $order_state->logable = true; + $order_state->invoice = true; + + if ($order_state->add()) { + copy(_PS_ROOT_DIR_.'/img/os/'.Configuration::get('PS_OS_PAYPAL').'.gif', _PS_ROOT_DIR_.'/img/os/'.(int) $order_state->id.'.gif'); + } + + Configuration::updateValue('PAYPAL_OS_AUTHORIZATION', (int) $order_state->id); + } + /* Delete unseless configuration */ + Configuration::deleteByName('PAYPAL_INTEGRAL'); + + /* Add new Configurations */ + if (!Configuration::get('PAYPAL_PAYMENT_METHOD')) { + Configuration::updateValue('PAYPAL_PAYMENT_METHOD', WPS); + } + + Configuration::updateValue('PAYPAL_CAPTURE', 0); + Configuration::updateValue('PAYPAL_TEMPLATE', 'A'); + + if ($result) { + Configuration::updateValue('PAYPAL_NEW', 1); + } + + return $result; + } + + $object->upgrade_detail['2.8'][] = 'PayPalAPI upgrade error !'; + return false; +} diff --git a/modules/paypal/upgrade/install-3.0.php b/modules/paypal/upgrade/install-3.0.php new file mode 100644 index 000000000..06e8773e5 --- /dev/null +++ b/modules/paypal/upgrade/install-3.0.php @@ -0,0 +1,83 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_3_0($object, $install = false) +{ + $paypal_version = Configuration::get('PAYPAL_VERSION'); + + if ((!$paypal_version) || (empty($paypal_version)) || ($paypal_version < $object->version)) { + /* Update hooks */ + $object->registerHook('payment'); + $object->registerHook('paymentReturn'); + $object->registerHook('shoppingCartExtra'); + $object->registerHook('backBeforePayment'); + $object->registerHook('cancelProduct'); + $object->registerHook('productFooter'); + $object->registerHook('header'); + $object->registerHook('adminOrder'); + $object->registerHook('backOfficeHeader'); + + Configuration::updateValue('PAYPAL_VERSION', $object->version); + + $payment_method = (int) Configuration::get('PAYPAL_PAYMENT_METHOD'); + $payment_methods = array(0 => WPS, 2 => HSS, 1 => ECS); + + Configuration::updateValue('PAYPAL_PAYMENT_METHOD', (int) $payment_methods[$payment_method]); + Configuration::updateValue('PAYPAL_BUSINESS_ACCOUNT', Configuration::get('PAYPAL_BUSINESS')); + Configuration::updateValue('PAYPAL_BUSINESS', 0); + } + + if (count(Db::getInstance()->ExecuteS('SHOW TABLES FROM `'._DB_NAME_.'` LIKE \''._DB_PREFIX_.'paypal_order\'')) > 0) { + $columns = array(array('name' => 'id_invoice', 'type' => 'varchar(255) DEFAULT NULL'), + array('name' => 'currency', 'type' => 'varchar(10) NOT NULL'), + array('name' => 'total_paid', 'type' => 'varchar(50) NOT NULL'), + array('name' => 'shipping', 'type' => 'varchar(50) NOT NULL'), + array('name' => 'payment_date', 'type' => 'varchar(50) NOT NULL'), + array('name' => 'capture', 'type' => 'int(2) NOT NULL')); + + foreach ($columns as $column) { + if (!Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'._DB_PREFIX_.'paypal_order` LIKE \''.pSQL($column['name']).'\'')) { + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'paypal_order` ADD `'.pSQL($column['name']).'` '.pSQL($column['type'])); + } + } + + } + + if (count(Db::getInstance()->ExecuteS('SHOW TABLES FROM `'._DB_NAME_.'` LIKE \''._DB_PREFIX_.'paypal_customer\'')) <= 0) { + Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_customer` ( + `id_paypal_customer` int(10) unsigned NOT NULL AUTO_INCREMENT, + `id_customer` int(10) unsigned NOT NULL, + `paypal_email` varchar(255) NOT NULL, + PRIMARY KEY (`id_paypal_customer`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 AUTO_INCREMENT=1'); + } + return true; +} diff --git a/modules/paypal/upgrade/install-3.10.1.php b/modules/paypal/upgrade/install-3.10.1.php new file mode 100644 index 000000000..2acc00ffd --- /dev/null +++ b/modules/paypal/upgrade/install-3.10.1.php @@ -0,0 +1,42 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_3_10_1($object, $install = false) +{ + $paypal_version = Configuration::get('PAYPAL_VERSION'); + + if (Configuration::get('PAYPAL_IN_CONTEXT_CHECKOUT_MERCHANT_ID') != false) { + Configuration::updateValue('PAYPAL_IN_CONTEXT_CHECKOUT_M_ID', Configuration::get('PAYPAL_IN_CONTEXT_CHECKOUT_MERCHANT_ID')); + Configuration::deleteByName('PAYPAL_IN_CONTEXT_CHECKOUT_MERCHANT_ID'); + } + + Configuration::updateValue('PAYPAL_VERSION', '3.10.1'); + return true; +} diff --git a/modules/paypal/upgrade/install-3.10.10.php b/modules/paypal/upgrade/install-3.10.10.php new file mode 100644 index 000000000..4c58da6e2 --- /dev/null +++ b/modules/paypal/upgrade/install-3.10.10.php @@ -0,0 +1,38 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_3_10_10($object, $install = false) +{ + if (file_exists(_PS_MODULE_DIR_.'paypal/api/Results.txt')) { + unlink(_PS_MODULE_DIR_.'paypal/api/Results.txt'); + } + Configuration::updateValue('PAYPAL_VERSION', '3.10.10'); + return true; +} diff --git a/modules/paypal/upgrade/install-3.10.4.php b/modules/paypal/upgrade/install-3.10.4.php new file mode 100644 index 000000000..d290cbc8c --- /dev/null +++ b/modules/paypal/upgrade/install-3.10.4.php @@ -0,0 +1,35 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_3_10_4($object, $install = false) +{ + Configuration::updateValue('PAYPAL_VERSION', '3.10.4'); + return Configuration::updateValue('PAYPAL_UPDATED_COUNTRIES_OK', true); +} diff --git a/modules/paypal/upgrade/install-3.11.2.php b/modules/paypal/upgrade/install-3.11.2.php new file mode 100644 index 000000000..46641309d --- /dev/null +++ b/modules/paypal/upgrade/install-3.11.2.php @@ -0,0 +1,87 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_3_11_2($object, $install = false) +{ + $paypal_version = Configuration::get('PAYPAL_VERSION'); + + if ((!$paypal_version) || (empty($paypal_version)) || ($paypal_version < $object->version)) { + // OS BRAINTREE + + $order_state_auth = new OrderState(); + $order_state_auth->name = array(); + + $order_state_wait = new OrderState(); + $order_state_wait->name = array(); + + + foreach (Language::getLanguages() as $language) { + if (Tools::strtolower($language['iso_code']) == 'fr') { + $order_state_auth->name[$language['id_lang']] = 'Autorisation acceptée par Braintree'; + $order_state_wait->name[$language['id_lang']] = 'En attente de paiement Braintree'; + } else { + $order_state_auth->name[$language['id_lang']] = 'Authorization accepted from Braintree'; + $order_state_wait->name[$language['id_lang']] = 'Awaiting for Braintree payment'; + } + + } + + $order_state_auth->send_email = false; + $order_state_auth->color = '#DDEEFF'; + $order_state_auth->hidden = false; + $order_state_auth->delivery = false; + $order_state_auth->logable = true; + $order_state_auth->invoice = true; + + $order_state_wait->send_email = false; + $order_state_wait->color = '#4169E1'; + $order_state_wait->hidden = false; + $order_state_wait->delivery = false; + $order_state_wait->logable = true; + $order_state_wait->invoice = false; + + if ($order_state_auth->add()) { + $source = _PS_MODULE_DIR_.'paypal/views/img/logos/os_braintree.png'; + $destination = _PS_ROOT_DIR_.'/img/os/'.(int) $order_state_auth->id.'.gif'; + copy($source, $destination); + } + Configuration::updateValue('PAYPAL_BT_OS_AUTHORIZATION', (int) $order_state_auth->id); + + if ($order_state_wait->add()) { + + $source = _PS_MODULE_DIR_.'paypal/views/img/logos/os_braintree.png'; + $destination = _PS_ROOT_DIR_.'/img/os/'.(int) $order_state_wait->id.'.gif'; + copy($source, $destination); + } + Configuration::updateValue('PAYPAL_BRAINTREE_OS_AWAITING', (int) $order_state_wait->id); + + } + return true; +} diff --git a/modules/paypal/upgrade/install-3.11.php b/modules/paypal/upgrade/install-3.11.php new file mode 100644 index 000000000..e1d11e4f2 --- /dev/null +++ b/modules/paypal/upgrade/install-3.11.php @@ -0,0 +1,68 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_3_11($object, $install = false) +{ + $paypal_version = Configuration::get('PAYPAL_VERSION'); + + if ((!$paypal_version) || (empty($paypal_version)) || ($paypal_version < $object->version)) { + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_braintree` ( + `id_paypal_braintree` int(11) NOT NULL AUTO_INCREMENT, + `id_cart` int(11) NOT NULL, + `nonce_payment_token` varchar(255) NOT NULL, + `client_token` text NOT NULL, + `transaction` varchar(255) NULL, + `datas` varchar(255) NULL, + `id_order` int(11) NULL, + PRIMARY KEY (`id_paypal_braintree`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;')) { + return false; + } + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_plus_pui` ( + `id_paypal_plus_pui` int(11) NOT NULL AUTO_INCREMENT, + `id_order` int(11) NOT NULL, + `pui_informations` text NOT NULL, + PRIMARY KEY (`id_paypal_plus_pui`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;')) { + return false; + } + + if (_PS_VERSION_ >= '1.5') { + $object->registerHook('actionOrderStatusPostUpdate'); + $object->registerHook('displayOrderConfirmation'); + } + + Configuration::updateValue('PAYPAL_VERSION', '3.11.0'); + + } + return true; +} diff --git a/modules/paypal/upgrade/install-3.7.php b/modules/paypal/upgrade/install-3.7.php new file mode 100644 index 000000000..a3dc06f15 --- /dev/null +++ b/modules/paypal/upgrade/install-3.7.php @@ -0,0 +1,59 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_3_7($object, $install = false) +{ + $paypal_version = Configuration::get('PAYPAL_VERSION'); + + if ((!$paypal_version) || (empty($paypal_version)) || ($paypal_version < $object->version)) { + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_login_user` ( + `id_paypal_login_user` INT(11) AUTO_INCREMENT, + `id_customer` INT(11) NOT NULL, + `token_type` VARCHAR(255) NOT NULL, + `expires_in` VARCHAR(255) NOT NULL, + `refresh_token` VARCHAR(255) NOT NULL, + `id_token` VARCHAR(255) NOT NULL, + `access_token` VARCHAR(255) NOT NULL, + `account_type` VARCHAR(255) NOT NULL, + `user_id` VARCHAR(255) NOT NULL, + `verified_account` VARCHAR(255) NOT NULL, + `zoneinfo` VARCHAR(255) NOT NULL, + `age_range` VARCHAR(255) NOT NULL, + PRIMARY KEY (`id_paypal_login_user`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8')) { + return false; + } + + Configuration::updateValue('PAYPAL_VERSION', '3.7.0'); + } + + return true; +} diff --git a/modules/paypal/upgrade/install-3.8.3.php b/modules/paypal/upgrade/install-3.8.3.php new file mode 100644 index 000000000..542b7bad9 --- /dev/null +++ b/modules/paypal/upgrade/install-3.8.3.php @@ -0,0 +1,60 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_3_8_3($object, $install = false) +{ + $paypal_version = Configuration::get('PAYPAL_VERSION'); + + if ((!$paypal_version) || (empty($paypal_version)) || ($paypal_version < $object->version)) { + if (Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'._DB_PREFIX_.'paypal_order` LIKE \'id_invoice\'') == false) { + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'paypal_order` ADD `id_invoice` varchar(255) DEFAULT NULL'); + } + + if (Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'._DB_PREFIX_.'paypal_order` LIKE \'currency\'') == false) { + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'paypal_order` ADD `currency` varchar(10) DEFAULT NULL'); + } + + if (Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'._DB_PREFIX_.'paypal_order` LIKE \'total_paid\'') == false) { + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'paypal_order` ADD `total_paid` varchar(50) DEFAULT NULL'); + } + + if (Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'._DB_PREFIX_.'paypal_order` LIKE \'shipping\'') == false) { + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'paypal_order` ADD `shipping` varchar(50) DEFAULT NULL'); + } + + if (Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'._DB_PREFIX_.'paypal_order` LIKE \'payment_date\'') == false) { + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'paypal_order` ADD `payment_date` varchar(50) DEFAULT NULL'); + } + + Configuration::updateValue('PAYPAL_VERSION', '3.8.3'); + } + + return true; +} diff --git a/modules/paypal/upgrade/install-3.9.php b/modules/paypal/upgrade/install-3.9.php new file mode 100644 index 000000000..5a26dc9a5 --- /dev/null +++ b/modules/paypal/upgrade/install-3.9.php @@ -0,0 +1,53 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_3_9($object, $install = false) +{ + $paypal_version = Configuration::get('PAYPAL_VERSION'); + + if ((!$paypal_version) || (empty($paypal_version)) || ($paypal_version < $object->version)) { + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_capture` ( + `id_paypal_capture` int(11) NOT NULL AUTO_INCREMENT, + `id_order` int(11) NOT NULL, + `capture_amount` float NOT NULL, + `result` text NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_paypal_capture`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;')) { + return false; + } + + Configuration::updateValue('PAYPAL_VERSION', '3.9.0'); + } + + return true; +} diff --git a/modules/paypal/views/css/index.php b/modules/paypal/views/css/index.php new file mode 100644 index 000000000..43c400b20 --- /dev/null +++ b/modules/paypal/views/css/index.php @@ -0,0 +1,35 @@ + + * @copyright 2007-2018 PrestaShop SA + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/modules/paypal/views/css/paypal-cart-summary.css b/modules/paypal/views/css/paypal-cart-summary.css new file mode 100644 index 000000000..ee25b5efe --- /dev/null +++ b/modules/paypal/views/css/paypal-cart-summary.css @@ -0,0 +1,8 @@ +.paypal_total_amount +{ + margin-top:20px; +} + +.paypal_logo { + margin-bottom: 5px; +} \ No newline at end of file diff --git a/modules/paypal/views/css/paypal.css b/modules/paypal/views/css/paypal.css new file mode 100644 index 000000000..ef3ce1c4c --- /dev/null +++ b/modules/paypal/views/css/paypal.css @@ -0,0 +1,242 @@ +#paypal-column-block p{text-align:center} +.paypal-bold{font-weight:700} +.paypal-clear{clear:both} +#paypal-wrapper .half{width:44%} +#paypal-wrapper{font-size:1.1em;position:relative} +#paypal-wrapper ul li{text-align:left} +#paypal-wrapper hr{border-top:1px solid #ccc!important;margin-bottom:0;margin-top:20px} +#paypal-wrapper .toolbox{background:#fff2cf;border:1px solid #aaa;color:#000;display:none;font-size:10px;font-weight:400;left:730px;line-height:12px;padding:6px!important;position:absolute;text-transform:none;top:-10px!important;width:180px;z-index:100} +.paypal-disabled,.paypal-disabled *,.paypal-disabled * *,.paypal-disabled * * *{color:#888!important} +.paypal-disabled .paypal-button,.paypal-disabled input[type=submit]{background:#DDD!important;border:1px solid #999!important} +#paypal-wrapper .inline{display:inline;margin-right:5px} +#paypal-wrapper .box{margin:6px 1%;padding:12px;text-align:left} +#paypal-wrapper .box ul{list-style:none;margin:0;padding:0} +#paypal-wrapper .box ul.tick li{background:url(../img/blue_tick.png) no-repeat left 3px;padding:4px 26px} +span.paypal-section{background:url(../img/sprites.png) no-repeat 0 0;color:#FFF!important;float:left;height:24px;line-height:24px;margin-right:8px;text-align:center;width:24px} +.paypal-disabled span.paypal-section{background:url(../img/sprites.png) 0 24px} +#paypal-slogan{font-size:1.8em;margin:0 0 5px;text-transform:uppercase} +#paypal-slogan .light{color:#369} +#paypal-slogan .dark{color:#036} +#paypal-call-button{margin:-6px 0 0;padding:0} +#paypal-call,#paypal-call-foonote{background:#e1e1e1 url(../img/bg-call-button.png) repeat-x;border:1px solid #d2d2d2;border-left-color:#ddd;border-radius:5px;border-right-color:#ddd;border-top-color:#e9e9e9;color:#369;display:block;margin:0;padding:10px 20px;width:auto} +#paypal-call-foonote{background:none;border:none;font-size:.8em;max-width:320px;padding:2px 10px;text-align:justify} +#paypal-get-identification{display:block;min-width:378px;text-align:center} +#paypal-wrapper a,#paypal-test-mode-confirmation a{color:#036;text-decoration:underline} +#paypal-wrapper h1,#paypal-wrapper h2,#paypal-wrapper h3,#paypal-wrapper h4,#paypal-wrapper h5,#paypal-wrapper h6,#paypal-country-form h1, #paypal-test-mode-confirmation h1,#paypal-country-form h2, #paypal-test-mode-confirmation h2,#paypal-country-form h3, #paypal-test-mode-confirmation h3,#paypal-country-form h4, #paypal-test-mode-confirmation h4,#paypal-country-form h5, #paypal-test-mode-confirmation h5,#paypal-country-form h6, #paypal-test-mode-confirmation h6{color:#036;font-family:Arial, Verdana, Helvetica, sans-serif;font-weight:400;text-transform:uppercase} +#paypal-country-form h3, #paypal-test-mode-confirmation h3,#paypal-wrapper h3{font-size:1.4em;line-height:24px} +#paypal-country-form h4, #paypal-test-mode-confirmation h4,#paypal-wrapper h4{font-size:1.2em;margin-bottom:5px;text-transform:none} +#paypal-wrapper h1.inline + img,#paypal-wrapper h2.inline + img,#paypal-wrapper h3.inline + img,#paypal-wrapper h4.inline + img,#paypal-wrapper h5.inline + img,#paypal-wrapper h6.inline + img{vertical-align:-6px} +#paypal-wrapper p{margin-top:10px;padding-bottom:0} +#paypal-wrapper .form-block{margin-top:5px} +#paypal-wrapper .form-block input{vertical-align:top} +#paypal-wrapper dl dt{clear:both;line-height:20px;margin-bottom:2px;text-align:right;width:220px} +#paypal-wrapper dl dd{margin:0 0 16px 10px} +#paypal-wrapper label{display:inline-block;float:none;font-size:.9em;font-weight:400;margin-bottom:5px;padding-left:6px;padding-top:0;position:relative;text-align:left;width:auto} +#paypal-wrapper dl dt label{margin:0;padding:0} +#paypal-wrapper .description,#paypal-wrapper .paypal-signup-content{color:#666;font-size:.9em;font-weight:400;margin:2px 0;font-size:11px; font-style:italic;} +label span.description{display:block;padding-left:16px} +#paypal-wrapper input[type=submit],#paypal-country-form button, #paypal-test-mode-confirmation button,#paypal-wrapper .paypal-button{background:url(../img/bg-button.png) repeat-x;border:1px solid #f29116;border-radius:4px;color:#292929;cursor:pointer;display:inline-block;font-weight:700;height:25px;line-height:26px;padding:0 10px;text-decoration:none;text-shadow:0 1px 1px #DDD;text-transform:uppercase} +#paypal-country-form ul, #paypal-test-mode-confirmation ul{font-size:1.1em;padding-left:10px} +#paypal-country-form button, #paypal-test-mode-confirmation button{line-height:20px} +#paypal-test-mode-confirmation{margin:30px;text-align:left;width:500px} +#paypal-country-form #buttons, paypal-test-mode-confirmation#buttons{margin-top:20px;text-align:right} +#paypal-test-mode-confirmation button + button{margin-left:20px;margin-right:20px} +#paypal-save-success,#paypal-save-failure{width:450px} +#container_express_checkout{margin:auto;text-align:left} +#payment_paypal_express_checkout{cursor:pointer} +.paypal_error span{color:red;font-weight:bolder} +.paypal_payment_acccepted span{color:green;font-weight:bolder} +#paypal_configuration > .box{margin-left:0;margin-right:0;padding-left:0;padding-right:0} +#paypal-wrapper .left,#paypal-wrapper dl > *{float:left} +#paypal-wrapper .right,.box ul.tick{float:right} +.paypal-hide{display:none} +#paypal-wrapper .merchant_id { + margin-top: 0px; +} +#paypal-wrapper .merchant_id label { + padding-left: 0px; +} + +.inforeturn .alert { + padding: 15px; + margin-bottom: 18px; + border: 1px solid transparent; + border-radius: 0px; } + .inforeturn .alert h4 { + margin-top: 0; + color: inherit; } + .inforeturn .alert.alert-link { + font-weight: bold; } + .inforeturn .alert > p, + .inforeturn .alert > ul { + margin-bottom: 0; } + .inforeturn .alert > p + p { + margin-top: 5px; } + +.inforeturn .alert-dismissable { + padding-right: 35px; } + .inforeturn .alert-dismissable.close { + position: relative; + top: -2px; + right: -21px; + color: inherit; } + +.inforeturn .alert-success { + background-color: #55c65e; + border-color: #48b151; + color: #fff; } + .inforeturn .alert-success hr { + border-top-color: #419f49; } + .inforeturn .alert-success.alert-link { + color: #e6e6e6; } + +.inforeturn .alert-info { + background-color: #5192f3; + border-color: #4b80c3; + color: #fff; } + .inforeturn .alert-info hr { + border-top-color: #3d73b7; } + .inforeturn .alert-info.alert-link { + color: #e6e6e6; } + +.inforeturn .alert-warning { + background-color: #fe9126; + border-color: #e4752b; + color: #fff; } + .inforeturn .alert-warning hr { + border-top-color: #da681c; } + .inforeturn .alert-warning.alert-link { + color: #e6e6e6; } + +.inforeturn .alert-danger { + background-color: #f3515c; + border-color: #d4323d; + color: #fff; } + .inforeturn .alert-danger hr { + border-top-color: #c32933; } + .inforeturn .alert-danger.alert-link { + color: #e6e6e6; } + +.braintree-row-payment { + padding:5px 5px 5px 10px; + border:solid 1px #d6d4d4; + border-radius: 4px; + margin:0 0 10px 0; +} + +.braintree-row-payment .block_field{ + width: 46%; + display: block; + margin-top: 10px; + margin-right:1%; + float: left; +} + +.braintree-row-payment .block_field.half_block_field{ + width:20%; + margin-right:1%; +} + + +.braintree-row-payment label{ + float: left; + margin: 9px 20px 0 0; + display:block; + width: 200px; + /*text-align:right;*/ +} + +.braintree-row-payment .half_block_field .hosted_field { + width:100%; +} + +.braintree-row-payment .hosted_field { + /*width: 250px;*/ + height: 34px; + padding: 6px 12px 6px 12px; + border: 1px solid #cccccc; + -webkit-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: rgba(0, 0, 0, 0.0745098) 0px 1px 1px 0px inset; + box-shadow: rgba(0, 0, 0, 0.0745098) 0px 1px 1px 0px inset; + -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + float:left; +} + +.braintree-row-payment .braintree-hosted-fields-focused +{ + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} + +.braintree-row-payment #braintree_submit{ + margin-top: 20px; + color: #fff; + background-color: #337ab7; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: 400; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid #2e6da4; + border-radius: 4px; + width: 250px; + clear: both; +} +.paypal_clear{ + clear:both; +} + +.braintree_logo{ + vertical-align: bottom; +} + +.braintree_title_bo{ + color:#000; +} + +.braintree_error{ + background-color: #F11; + color: white; + padding: 5px; + opacity: 0.5; + border: solid 3px red; +} + +#paypal-wrapper .bo_paypal_help{ + border-radius:50%; + border: 2px solid #036; + width: 21px; + display: inline-block; + height: 21px; + font-size: 17px; + text-decoration: none; + text-align: center; +} + +#paypal-wrapper .braintree_link{ + text-decoration: none; +} + +.paypal_title_pay_card{ + font-size:17px; + color:#333; +} + +#error_version_php { + margin-left : 23px; +} \ No newline at end of file diff --git a/modules/paypal/views/css/paypal_1_4.css b/modules/paypal/views/css/paypal_1_4.css new file mode 100644 index 000000000..61182ebdb --- /dev/null +++ b/modules/paypal/views/css/paypal_1_4.css @@ -0,0 +1,6 @@ +#formConfirm input.button_large +{ + +display:inline-block; + +} \ No newline at end of file diff --git a/modules/paypal/views/css/paypal_1_4_paypal-cart-summary.css b/modules/paypal/views/css/paypal_1_4_paypal-cart-summary.css new file mode 100644 index 000000000..2f1020f53 --- /dev/null +++ b/modules/paypal/views/css/paypal_1_4_paypal-cart-summary.css @@ -0,0 +1,31 @@ +.shipping_address{ + width:35%; + float:left; +} +.billing_address{ + width:35%; + float:left; +} +.clearfix +{ + clear:both; +} +.cart_container +{ + margin-top:30px; +} + +.cart_container .title +{ + margin-bottom:20px; + display:block; +} + +#cart_summary +{ + width:100%; +} + +input.button_large[disabled="disabled"] { + opacity: 0.2; +} \ No newline at end of file diff --git a/modules/paypal/views/css/paypal_1_5_paypal-cart-summary.css b/modules/paypal/views/css/paypal_1_5_paypal-cart-summary.css new file mode 100644 index 000000000..4e9ac1823 --- /dev/null +++ b/modules/paypal/views/css/paypal_1_5_paypal-cart-summary.css @@ -0,0 +1,4 @@ + #cart_summary, .cart_container +{ + width:100%; +} \ No newline at end of file diff --git a/modules/paypal/views/img/bg-button.png b/modules/paypal/views/img/bg-button.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b1a9a096afb5bf7fef43293715b3e11e1821a2 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{O!3HEhOmL|O2^0spJ29*~C-V}>VN3FMcVYMs zf(!O8p9~b?EbxddW?DTyW6-`o=^Bs1YZe*UE7|?rO;oIDZ@Fe>aIjt3<}i4=`njxgN@xNAwL>{f literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bg-call-button.png b/modules/paypal/views/img/bg-call-button.png new file mode 100644 index 0000000000000000000000000000000000000000..e0455ae766e61e3b747883182c978a3ee473bb60 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^OhBy6!3HGvx!v9lq!^2X+?^QKos)S9lS| zxv6<249-QVi6yBi3gww484B*6z5(HleBwYw>Ygr+ArhC9|NQ^|zn%>U)Yvp61lYK* oi1O(C|Mz!si=%3BN1-vps;ed(GfZ{jfLa(lUHx3vIVCg!0P4OszW@LL literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/blue_tick.png b/modules/paypal/views/img/blue_tick.png new file mode 100644 index 0000000000000000000000000000000000000000..9b27b4962e287a80ea55fd2d68fc6aa6444e4b33 GIT binary patch literal 1194 zcmaJ>TWs4@73ASmvd{UC zzVG|5$8U^{zR=s#*F#ZMZy_%g$x3@~cYu6D_gV^Bp2WjtJdP%DO|c=B(NG0~f}u>o zB2=`wnd@+nqWp|rD&w+zL{yOxQ9MkcibTMGSOKna!gNG8#cb$`WbYlb4A_9+=@j!I zsIoi;a>#}t5#horH^6}bKElW1f*>3MQI6+WF3R%JFfWL)sK{|(^I?cLTbmS%(#WPS zVx^cW#+JykwOTDwi$#z<#q!By($k1W!vqm_=1i=(Vbj^)R*;~h+PZ~xWCBl7si0Y$ zVo0P9QZTG7S<~4p6Db($Di+H}I4`9(P?rB6Y8YE+2N&VPc>hz_Da~1sEkXy)+A3+> zzXJG z3yG0TA|WJ_0?!ZghqGByDQP5=%SiEfOlWf@q|O@9#BHwjkUP+k>y3h85zi8|^;e)a zVj}}=q%7*4V~KUt+vIAUV~Ka2zp_VB6 z)2`;@m-b9N()hbx?q2+5+YFPZC+j=t*6IGQ1Lt3NpIiC$XnOCXjgS(k$3v(4Z~KqE z9elO!hUt6$wd3F=s?nvqb0q(6roQv?t)6erP|Xj=Zh+liP|c!tGqd#N&W3Pt;qIya zpL-g=)emo9{OjV&L;j@@-O3J7t0&p?$NmO7dmytQXTJ{?Zw4DbEc?5jSPa!~b@zSt z+VaZ!j^;<{+i!*OxewNQSI*Yb>yH)ouHK)h?zxkw`}*?Fq}TUd_O0H>VByV!GZQc7 x0eir|CV(q}=CMDEyYIGIt!J-)8>D;z>ii$cJD+?v`=j^wC=8EESF#f){{h?KjR^n% literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/AU_bo_cards.png b/modules/paypal/views/img/bo-cards/AU_bo_cards.png new file mode 100644 index 0000000000000000000000000000000000000000..665df4c52f327e0443a7c596a98f288dc38c9e6d GIT binary patch literal 18609 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 IM6N<$f;i1q5C8xG literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/CN_bo_cards.png b/modules/paypal/views/img/bo-cards/CN_bo_cards.png new file mode 100644 index 0000000000000000000000000000000000000000..be7071ff560e991303e7fbd4a39885ecfc6212d6 GIT binary patch literal 18922 zcmV)WK(4=uP)4Tx04R}-Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p zf>lBKrT@xGngaM0&#RUbMf^S>WQmLbN%5o9=3jnR>T&z4nFUz_R6-rr+zO2n7 zLCWH@TviM^GMz^CycWKZ;ENT$R)ZqVFQBMDe~DZ_5uo9F70tEiEJT%pDxYOB50s3$l*3=K z@zqr;i+JU7(P~;!R<|=LWmV~AIxFu5!jokd%T+6V>Ka=^ei}Mp>=+75bG7i1OP@`sL+Z6@6QU2o?Ow z6(OorzJk2SV*}hZd20Dxw!<>pQkEYZAS?1!LRoD`qHIT%^|LI?a(ZKZ)k?GSz06jF zaz*+px-Q#sg(B;0PF7VOLR7cK)p)J3#(G|mb-Y#au&ldE!7BNp#^zSxyQtd=`&w?( zD>5jc@{QcFuzG@{C?6s1a*C4N`u zqS3o@b&JOG*GD{!@r!cV<@`mfTn-c@wel{%D7N}q{wkVY&9@@5a)S`n`D^P@EX#1Y zprMLNMK)1Ww9*Eu+j|wqwWLH%o_c;)oL_BvB{alc!E8~_4eE_*{Wqeν2S5!HH- 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 Hu0mjf6r=*^ literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/ES_bo_cards.png b/modules/paypal/views/img/bo-cards/ES_bo_cards.png new file mode 100644 index 0000000000000000000000000000000000000000..e1fe0c5e0379f9f6d32f425441463d6c03cf580e GIT binary patch literal 22210 zcmV*AKySZ^P)4Tx04R}-Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p z!BX*yW!k>&pqGSdw+XhVT>sQ_p^;{Y-1bSc&FnmaOg+fh#vu-w}D%MFaD@o zvW;zQV;kGJA^tJ&Pkz*m_z~bglRxSfY-1bS*v2-taU*P#)i$=Vjcsh>9S{3Q-GFUu zV;kGp#@3*g((hX3)O{!@+~ zJ^H%q%(fCfbEe5kR}pK26cQ=>E(tcSuF?i=AW0O;fYF9XDH5eoS`(`DH?1@xR$w$T zi6PbqtszNBH#Ep30b@Yx{xY2&NT+{=F?{U(huFWf#F5?Q*KL0Jh^j_|hwLZ{@kMo>wTkR%Cq_cC^O8mImO zPOyNmUF^N@0mnyVhu+y_g@LFGQ3n&XG0hpw@-r9=A~OV|cZ0NlvdF5@=<@hCPm_>r zk*oxQ)DLVSk?89_tOn3XlB*u+>+OGIYg=lBARRnKx~>!kV????Bhmp>8}wC#cH?&Y zxoNV+%Z!bUVcAcM6s~2K(o=j;kv!VaIO|J-%1D)jpJCUf4omt0NQ{?qm&_z z6^Sw^Z3vYjiWN$0+L1;jiX>6UC;_dJaRgz4P#O`(kZ8~b8ONYaN@6PM&pG5HBl4+_ua_;4$K=I&V@nrx7A1x zDs7*UtoK{dx8VBgne{VS>x*w)KwoJ|5^It;-RJsceGBR8tt9xj651GEPsq1fXCP%t zR%_PP+J~r#?9L%=ki|(vZVbFKI5}{9-q~472BZU)i^z^3io4RT*qQ-52RZ`WpG>lP zZKOA}NI;2z!>n+a24y0~>5)ZYU8lRoNSe5u!J|foGYoT{A=?CsNFv*3lpfCItB90(zfH2!+wE=;J#ziwij}bcTr^;a(3=lI$ zgv0eayh6|+0325E2(YQ)BQf;wa2-X?i#a&d{z-9=yg97R&}E-j)<{aoO#`6>p;;#+Aps-$vwE?M}$TpPc? z)$yHvDMwn<}*uLY$wS{YisXk8sAgus%LjOUPXZKT|2+na6W+m*#+jM-9HLI6suS1AIO zQW$Mg*S6(@TS_ezA^Gufr1slsxv7`J_7F0i=$ojCkb0Y}Hej=ZRSvSu$C+i2kSsA) zKTaihJ^6&eC*d{}hJgEN@3`#$J$!gcPzt)4>r*U zTKw8w75?E@r+B4O;2Y=v_PO`oF02VEqyS+_WItwQ$$q@b7_<9qh-^kNTnYiu2zrsE)wXE1 z9O{h{O1Wqxo);o4jj&@-HW-PyX>rl3&&4Q>*<@LzH2K;V+e)Lu+-j50Jo*BwwKkPn z8_%;D8!YgiyAN^d=q?6}8*#yRDp|o6^=~%f2vD4lVHi4@A4_J89ZC_Gq+YbJQ`q2!P8epsP){N-rr9e)+X!eRZPjqq{6-Q zw~b)T<`v)8!Rc=jsk<(XiO6d6Ke?=n>uk*hx7D@@Ez-o_egg1S z`Bnn3taN7fj*d^=2%Fs|IA$C=|EY8{0Kqa?Vt;zRqF$?ed1 zW!)bH-W=Y4puy3xE{KSkMviu55vv~uzx0m=>k9I|G#z77pC7XC23xz=n;9z|fM3mG zS3_+2O_>JB-H6oDq>^-U=DLdAlU2rs+MK*)mVKikd0#PB4sm4~t7?Z4 z)pmxZYL?T3Z7$3XaA9tM>BSKeZILJ&*;lo`dA8~gz-nu;FQqk?W>mXGrBBU$jf`vCC}UV$ZSkEKrg`e68TRfNVq&O3Iq#u$I!RD^Bc3S`xQ?}M z;cw~EttHPIjqY1io85pK0k#YBZ|_*}6HZn(lhioC3O~mpMdG)FsMZh%hVy?NA}z49 zaN;*CEbqo}XkZ7H{3sdF!hDmmnRi>|Aem%TC_ub@)^#@hcAH>!cBQY4X(5$hQ z!A6_3XM2uj|ISrz*|Wk2?wVnIsK>#5EnKPBV^;Lzp~li^LK4;DJ$F_(eWeQ-KdvTpU-)sgmQSunxvn3fQO2OQAT)>)#krYPE-yCd1u?(; zo?}c77csz&(Gp`r1&;0;BT<@HW-9!v|L<|`yL}Ij+;fQGQkHK#bB=F5caeLJ?Ph$i zz>&S9eEMt8bAEP()mj^XobU3;sly!JHNxa@f#3hrZ&UAt*tW$=wT00J*RlAe_ufGv z=kaep`#q}79$}pDfBeZ~96L10k^SQ=R+?0sU0%7k2!L%#3i%8lea{{2nHXTWl)a9d z`8qIt!AY`FY6&*i1H2}1+DD=^t#14(0f&@=e8xdaaaCOJW?+mViqmH$QdjTawNrtT zXN%W4KSM7}(?o>ah${<7UBc#S;p{txtdur%!i1#XNC3x{IF`hB-=5imjbelz`)N`n z#(fLi8I}WnNn&NqRYDxg|X+Y*YN=E!Idr7ga9IieLhBzlt~t&b>*s8lM{Yc--M z0w9~qk;!D3nwp|otx~O4$!4=?t?Bi81ifBby2X<0*|V2SCPSl9r&g=eXf%kUh;q41 zd0>Fiasf-n=++9vA;xHg;~|S9#Mqpjo*|pfQYaJ{8X87xO}$=cVSXO1HICz~E1Liu z$H8`-^)?70a2y9ICDO7O8yh1Cf-PUGls`=0vN8xQQ}QB}m#>l4hFdWGuKVJGHGWyQ zv&?3T>MH-@)rQ&H_iN`5*K<3*0bFf3ZFDRnQXzyE^kwJ*kZ7r~rD3?(X3vfWNA|6< zd!ofaF(RLd5$Oi$6CnFUBLx=V2u-G-86WKtDmb)I#rHHTD|sR$2^Q8Sauh;hgg}^0 z?KH11Auyz>OtXdgmQJA6jfi4}Wl73;pM2KCXi`f^N<7D=(&!LH3Cpz(txiasXtaiI zFJ`6Dq1}sVbVHV_9V(43-7sOKoTt$ZQ3hrfYK)ijj1Lr8ZT6_Q1N@9jIiDqo6Do}^ zm0E`=))WgFdSOhQD9S~jLe?YeIOKf~r3@qGJOELguv~3ZZS^P@vkc_3SX=Pg2~1zP zs@GM3Yw@bJdV$x&>`I3}ee4oJbal#2G3)Y+5ALCy_bB@I8zQWBkZ^XkO}(SIupF~y z6g!q+$B0M4x43I>o{W3_eaDI6J7=0ynh9A?lFdjwOXFFF!Fs@82v!C%q&0a#Bq-Q-;@E9q1>>Dfb2Fd?5Au$vQxRX_WfqC4w$SUzmlKl_6$Uj_*A2 zIDh$=W4zA{cP@bKjI1s0O@`bc9iT3=`GzX5ff znAP4cR=2Zf=O&yewK99zC>TdgKsq~ z@G`&l3#S+x$WzF@+Kuwc^b-HeA3nH&!|B=H7W36WZVAV^d?MRRNm&$0T?ky&>hG&(UW&5&wau~dsu zee2J$1X3D0S&Po3kHHWno7*h#9YLZDE6s?7YDhWfpp8Rp8DdM5i~APWrgOcDtW4u9 zy7n?^@hRxlp>a*g9?ON?DDFf5JoRh!@%YP&Joe%oPyb+sAWRwj)`Me|i#~(J3{QT4 zhSho(fRjfix$oFc-gkTli8j16Q{xZ5_yWtd4wcmoiQ33HaBNB5clgzxJHd(lLmZhJ z0HD^6cs}uc55r03*iDVhbrOBwD0&Ueg>Ob! zPn+xZ!LgHq@jI`XO0DJjzJW?Jc{kx>$7cER8TiJ<+^c?%qKJis1=`IvXv3*@-On@6 zKEsPIy@(JnGc&{a3l~^eoTuCEapA&6e(@t8!Ert6^%_e{%hak>e*gFXABx2y_uY4j zoja${ z#+K|Gba~$%m%NiI0Ub+VTY`F^*6Ac8Qm#WuT+_ zRiO-swdY~OrKuf*<$~o3CS(h{lkl^nXVJ5oxiF88Ewt75{uvuB1X{?xH!#g{Gtzp^ zDWR4YDsBFap#&MvMkR_yyGN@V<7X6^YpS*Ajd{fS+(N6q1=l~dSZS)wF00ix3rlr= z?_Ym~MmHpkVmiHuB+=dFEV`7tb&Ag-6fgXB_UiV+V1fdE(g_q!4s^F@>B< zKI_phevTz2yT)>4T#K2d4zbc4o+@$2{vj5tJr=56!l+M#J;UjRh;E=+ZADm?pqO=0 z%J5g!9{Ef}4Ce2?4r7C3pRxIUS&!-!JY#rVPc zO}yH&(hOm_*oE6}`5(yfA4SR~-Mh{6=a?Y<1)h?}O?^PGw_Z&X>V3&hIX?>e$=?u|@MO2Y&#N<>IZDw#Aobz{+YpGbkxHy6b+ zCXI_EuTcpox%LzV7@1~p38F0@XAO>JI6Ttfxw#NqDiVG5yj5#W5CkMDL0T4j_wD1^ z=boe4X!61f&(mzR=yuwKL63H)L#0wdS~i(XhFmUBtJx%uV=i92$cf`8*uQ^2hi|== zs9i_Zm(i7JlnruZ3Yi~3I1V~!rdC#?OUV-~Ej3tNsnKXOsaC68zI>5laRA40SgEey zXR=5sDV0jZaY7hHbbB3a+hSmFfJU=P*7wO~v-lYg%i6j_z>$K%jKx&Zq2#3jb zOWM7Jj3cq6;BuwQS**F;RXZN{A*ldU?rZb+gvVOyg66+BE=ZyGhPQRE5G5`-hLT|q7%QA`ZG zgBm-7RZI{Q2?u2hv=E?e5^4261}!CtaEYW@cT*a%7QgCi6-`=NOz9gxYX(Ecv9P2d zNi@xF4?kn$Ge zBwdk;wC&D058WLsb^wJuW)n-Vf4DDWmAie9NKN0dho6C#M)UBDdnHtHl zxY}W6sg2eGWhBi2sx3trYr@!IDF|&vqM*@END@P%t4K6dnh{ZwdM<1!SRVDrdXjo4 zq1}y1l*YAWdVDFclYXknrs3?Wa~I`Xu}X)q_Iwmn7u}g-`b)oq-I-;FUW7P?poLz3 z8ZmejQP=~(^jwX{pPeR%;`M#~(gSIR*guXD%Vq1U~U9x)|)+(n&9dI%x0 zhepudHoDVBl0!NUV!$V4z@VITIZ>`0+*^oTu-{1$z;e54)ANg{u}t&EHC}=MLzr4&*Eo& z1_#Ov4~^h?KC|8|pZe4%866wrr{4Wjy!`UZ1VN9{kr6)d!4LB5zy2FomPN8UL$Y`d z{phm@DX@1QK#m_oxIVJ6gi)G;)8Loxb@}ACUgV3{`zoueE4+OA48Q%`|2<(4 z@P#jYj?0&)xpYZ0zc9~%{Rfzw+<`GLH#f&~&ptyKh71o6bL){KjEs&EZ|Y|^Le3G~ zG2*e8H7D7&rdE7bX^Xy`eYN(iL#gsjXZwZF8_D0OgD2kp<$(4NX zN{f0o=F&=+q9YhDxV-z|AWxmIQSC&a4W+D&Yr&H*RXDbHfMm}Ak3Kt3yZ6Sdc!|L^ z5l*a-TH))2OcLQI5d%?^QWQ`Mdki#sWVE74h-)GwiVP8BBE**p`#XvnnwWk78-c_D zR62mZUcQt_<6j*C!Xz9t^ZaVEOvhNXa0rD%f<=N$7nhE3XcirMwo4^5$Z{r2WI1#l zkHB(Bge10Xv;e7Wx{5fj`tE6d z?%~_WWgLt#ELB^)cz&MhaEZm02Hh|r3Sw;A!nJJ5r7Q<_4f8ASKXKKu9NVH3gsDnV zKpaGLf`DESqWa;AB-ZqTm^fBwZCGt|@N7xwIXwCNMPjXa=+1o{KR8Lf)#H!9_zWsh zL_thD2ywO&v;r(4a5KqO@349;bb2u_U8-@*p- z+DOOO>De*nR(t&L>@qK&tFU+H0DGqf=tP3~nu~2&3>F*^5G0yJ8C*wTSunpE;@E<- zb6q-tVzC+!#+uVtI{2Q&d^Na>=`Li%DNb!-VRx=b+|HL zBMh$|w3N~;t#+;=$Lk?WNRfacBJ7=0boT7y$ouYR`Kf1EeCk<-9(WI#!2yaB!_+?W z8REHFyo^T_Mktk_I~|1UB0Uc;s82Mp^ z>Dp^_;J!P?^E~1xBnWyN`XM1Hm5NMEPH^|#cXRg48G1p$GtWH3z`(%z?8b2%GMUtU zB^?LpScI}K-*e(`|UIv4ZiRN zC=U$cWip(+^8|xKLpY9$5Q639Wu%mhj104H-(F6fI6;yT0$ZdrWK8;Zshd#iCgf~M!Ih}QB8d&L zNUbnS3T9V3%vS@ljzu@HDR>q;hI1rJb8fy#uP-3F83#bt7SFmd}MuIMW5|h^< zSrd^{5k;LY%c_`M5@H)o21VcbhJ(UGVJSlr%f8(tH&w>iD4Jw8O?0lMt zgqQ&Y0XE5c3cVyo5@XTp+C_Jb3wHoNqKm~I%+2~v^6$Y37dvv3{B#Bh;rFX9Jh=b2lsGr!uzwgidR__o8I zi871T2K8o-uRnDzJwE}SW3zi=fbqe6KlYW%-or2P1jsB26zy2qQ%|NQh&FWu>vIAW{gR)(n}iv{|losWt+3j;WN46VcZf^b14xPeTgG z`ZlgDX?9{PDF|at6f3%cA_x`rPE3$!bpP4$T#LNF@lmcMxyH15ZL3n)2zP*IqWh_J z#>rQfnDRU15{>LEAfhITHoP!hWp<^rUVzf`Y<5hR87*fi`!1bMv|jH^ASh>D#>*K_ zUtZ+Q;Nj4k=)IsmVgM%bw93rEEGwTBvuKUu{#VY?$jJ)ykl> zX0h6)bpx{U2`JE|OiVJho6dueu;Vv>h1wtIs9#xT^rIiapW4C5u1VU@zev)H$czj? zyNl`tglZP6P{t__lF56hT!GGxeU$GzhMK*?m4ER(*fyr0pl6a8;slxX7)`Rs;T%?B z2aF#>9se&_npQ-eCS#>4mIl$Q6K4jnn+u2}A-3{J$Hgj^5Xl_IaxkTF=4*!tym59N z|9P@6f0d!amtQj-&}f5Jif*^d>S~p0wT7R~;<{=4C!5W&Yu9c*_@STX>tFjCXU?4F zQ-AtNZaH*_TrNwJB!po|r_(`7i4H?ltQS5nI{*M607*naR4^u;o3Bf`Op>}&(O9;{ zjy?OC+FfOQY>sb#>)U`~$BvyGIdXJe@G&$v$l%Zrr%s(pXQtIELI@i5Ix30THMN`F zQ@c5GHvH{oJ4=0kgO{R;R%Kjxs!npFk$ zAVJ3(7r1|S0UP?UuXM(%v|*(YF<)LoP41fizaO7P#IDB$}z_ z5(BjbO4SMnnhlCcNRf~%5jo<1%}R~LV56>539cO_AT0~l>r>7K>7>W#%Q4pfy5AURqb#N@n)WiT+7HgcJsj#%_fe_?;7a_oRZT3zM^76$+ zE;nj?{i(C*c?dxv=W)N@!(cwM;kGq~IEqn8g56J?w5-&XT*$iQe2?eP&C>}&;&_D7 z!92BQm*>ySa%G{0Wl3^bFU_w~hA@gz^2X=9<{sOsBQOXPre_;0Ryw$DDnN;&E`G-4 z6CXN86vJcRU#8uSh`JrLNr^*B!N^b!&$Z};Ig&)NT!;U6JO`)BeE3~^xUdlN z@_dCrYr3(b;M?pT%VPJhM-XYAJY6SFG!sLwW?3PikhO3u$#B7DqU5};D)EMAer)eB zFR6r2KY1^nfur3P|IyxQvLjVurTO|ZmpL=D5jPqtX87=Z`xz=`(Av>>tjlV%OSQET!0Ckv7w4)JvxnF}QDEm_j{6U%xe~>kiv)s5@kd`h!z-6oHl1*~ z-#Apnv1aoW7Nm? zv+JjSmhqCo>(&YX{Ig_FoFH@O-JE~^MS77TaLV}i--=k8XLxam_5%;0M#iwcGSzQB zO5@4LIsOm+9?ee7m3jw%_Z<{7Ee>7&6Plm<2CIt|RtJ3KEg!`l+Q;tQ`w+`NL@d38 zJ9!M5$ztX6l*M^svQ#)mRy*W{BIuq+L~U}Gx;i^`6Pk@C3-j~**5CVY_~y61MX%T6 z=YQ_!Sy-6o^5tn>IsGy(z48*D``lk}y=7l-dH@JQry>C!a0e4Y<~_-Dvw zHv~GhdX-+-Aq9q=*MG_gjju*+pA5JwRnU9?5px|Qi4$^!s~3ec}YSVn@KjsvkVq--$L7LFN#fD zt`VR{U}LaI$k1ejbfepw7Kso9UX4|)(Kk_;x0vzBjXC_s?>~{of-vi^e{o$K*R~J> zK5*B;^|;jLoFC71u=@A(r|&z|f0xsjP77NbLXdSP1OJ`B_Ag3%ZuuuPgGmC0BrAQA$t)3{eAPnQX)h`5T-G$4J&l*>h|AjAtkmYacqfogQ^KPB&%C?mT9#D+Hr;_ zEBjfB+dQ;fV`QucrHJ!0tE|*IfWUSHLuH@$-Z4olNT}3Obsznloq=+WtncDjl0!R( zP_f~{#R>p%tXNrT^SQ^)^8J?=xa-IyM|Tf$cxU=@x>X2>T#2}_ z2YJgXzD~&P-N)SX=eclUncHvA;fWROvtMG5Im?jWWhES-)$I~{G3~^{vPY4H1UYz+ zAk?hoOr4$0CvbgzSuU9f$egZCoxLy#Y4?;**oN>sl&t4u zb^5{KI8x+28!4dGjj;rHwqUgpvi8Q1FivQ+BbuGm^1oi+d^HSyl#s+Rg0xbBMqsf~ zjW1?Htf1I5*!KU@7qUwLTVQN~u_3Y3+#PMD$9eUUH<0F>8&KdR5}^emN{juPep2;D zvE2>J%3`A+uv(v+Z@3g~otDv&DyFtp)_#kSQeczjRJ|VZ{Sdwuw!(bvEdw*)fVkeNZ6Gu0*7`DaQiKzOpKJ7t7j4asWXc%J3e98yYN zs!g#R^f=S?z?4_Cr&SMVX=wst9zuB43@KGGY*y| zxqaU-MrpqFw4J`-E>Se@^Q#?xQSE1HBu~z>=|zfaD_~}!#^OpUwJVi; zN~J8f?i*oosY$z&3Lz@ZfHU)TCWms^*7Yxf1{yfz{St0znCY1YSwF|vv0G>~1A_W0 z_S_6^V~I=%^(%99CriXxpYx@IXxqbYc4$2FeVlTM($9W~mA`x(cd*RFCq9Z;X<*s` z9ceHFWB5mo;yW(g-}LzodE3ZZc#0!Jo%fHGJzjWR=Zw=+Gg$-7fWd9f0G zoxGc+rA2}uy?5nOnL@F^sZ*yob?OxN-gh6byz(;LZikghg*Xnm8FgkoP<-=Bix=j4 zv_g&VT4WrFXQx+cPuXR6*-a~#nDjLjy+jc!O}D40bz?Fz&8QEf)Os&^shmBD6)V*) z0z=W2{TwYr5G1&^AnRIWT#4)}?gWA;Rs>O!RtMiwU|kSnkzgbGPQH|wbU)9^Y~=m| zM)s|TwUPk+zApPQ4?Ky^fc6Z=Hy8_qcl~x;of$)FUc~~dXCV`?I_dtE0uyR5R-e$5 z4Q;rw*3-@UFG@xjiCQNy`e&2A0_A#SwU+OulupYOZNY8!&OutwFNzhGowogrmR*xK z@xBy6>YmPJT=wlOad2meTXzrR_1&4$7_y!uw*nS2u8|2V*^=woi1@iKW|Dh zRQ5SAH9)c8_X`kM!2-KRI!sKKs8m|CB8xwIae)0v$k_5FI{myV+mhUOe2U|T#sFBZ2P{;3 z>q&WzE!nqYfWeZFYfCGU?@OuZoH(Z|oRxX|RuR~GqSfAthU zoT>8I3$xVf0dbhl-0nHLgFQRSObr)!_W2o>``fQHdz_hT@W8F(@EQ_fBP2~P%h*VX zsa=Cy`QB4xb`CH+HOSn#D=4ApKJZ=+AHRpV)#ckyoMFU1fU6bD|NOUTp1hAM?|p=a z|KMNZXKXZv>2?h->oY!ih^6m+p6cZ*T%7wnxs1bLImcalhOy6|!9I5yDSUKxgkbCz z)cFcn1#bDf{|x8FS$b_v&Jl!45TPkXvqbSCg6Apb|3h-xFm|{}<#vG{glzjItYqoB z=UFP1c;LZ@xaZ#c*0bDQ*Tu3dY}@9xW5+mj%Pnafs-GDjg&|=Wva-5LHkYN-X;CN? zIDY&Nc1%t(K0bkv5+MYO)fPqxTEnNv@Ah#Wm(t)M7p7;4<}Y%~5uawWMWfN+cYpUE zVT@sB<_g9ba=9EI|HQAXzoHw`NsSQc1MYbqp6BuLPy9+6#Fi4@GAzu^-Kg8HBaAgO zOFdTWJ=&pKALv9sApEYe5k7WHne+9KxF1Uz$=bLwEyWb{bFR8kS`l1gI56T9Cz|P% z9%^TvqHlBCjv_B#Y0~V*7^N5~XBfyiOfPn@ElI|aLS&$b{vS8R?_}}b zA=1yaID4hSmE}4wo}cGqkKDo3XnD)`f6I7-1hN&(uQd7e*PiFp9ebG?EwgL1c=J0E zYm%6)P1J7PJHWsB2k*g_lHqbDmG*Cn2M!cG{{DY@H{Bpk)zFrpoU`#w?~`c5?qLVV z5+rH8GJMZk_bf;uQZ?ZXaKop?w$cQ=fl`)wtxFUOuC$8ig@h`r#BoX-QVRA@Zrq4o z7}E)&4IiZt zY@I0H7}%_SPGl#DugcHph6&YHZ{4c977q+s6h;>ajX)((9v{FNEa2sQbS6ifaZp+zhK5P9K9%_j%5iZ@Me?;8mhF-VkEGGU zYBljXEtZ$7=s_rs-$T%tL+K11y%Wn1@kNZWT%shV*NYG)LFyhNsb` zwOVC)d6{;*O%z2eEiExQIhp1{bz^21mPnEqFPmd|d6`OOg?sL~n>dQNc<}-g6XW>4 zPcE0gQ5U3GEP_ffy#~qR4Dsyr4Yyf?F@_{j=vZN5g_3>WIRYUix=%o=ucpYm7IuFI z8$>BFSi<1h0@Zitb%KOQrFk@hbeUrbf-s>MCJf{pq)2PnxsD{`rnAQ&O#5lhw{aZ7 zmJ9>|R@tCC0?UzU?HSu(c^0A|5oL)rtdUuP%nF=A3y~2xLl)MMg>d_BKu;nqfpFI> zF9G&i3(?_LBBkg?G4*zU()ulZA>*~z`t5*YSqv6^vYvzM$T!q} zL3+=&`ZAVM&g0Z=NMNgT&wpqOENsKB1_ zt8-ZQjK11^Dy3kk;865!4)03G`~9Ofj{W8?@Rp`_*^I-HeIqO_Ht2M0&Q^DEwi?3o zFRicR+7=%8xk96|h|2u&gX87$3+|@HZHA$54*{@@H=2!}sjs<(V4)=b!z6 zmrgIx>?a4$E!1f@dnlzjJ5%MWPhO%IY{=DDTOm~1ygXf{-rmTCsx|{I%{TiqDZ{Nx?%U7llcvCV3wM{8~YcX^(X)kPlr z#^a0~J)DoGe0pWxEPi!3ZIaNntSarW#P zo_PG*0Mu$Vo_+RN9(w3uhK7b{wVLE|d2HL}$tR!Wm6u;;`tmft^E>~LUa!lSzw{*@ zc;LY;5!D(@uR(O~JM_NwDcTn=ZT&=y!AcUWIL3-q8m*LTeltb29dWi6aB(Fd>qsWX zvn)0vT4BQJ`8N9peF~mM!LvwWMK?@%=G-dAK+d(&oGRZT=URN{m1UaUnD?KU;Nn7y zS}WwhWD(bP$T)(>o~>Zpf}?u}aBPXY73G@+-f@k+*I

    SbHRtK<==ya}p-y$zTeE%NIhx%W-( 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 V)n(hyPQU;F002ovPDHLkV1j(&Q^)`S literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/FR_bo_cards.png b/modules/paypal/views/img/bo-cards/FR_bo_cards.png new file mode 100644 index 0000000000000000000000000000000000000000..088bdcb17ada34ae4f26d4e76f2ac53f6a99cc5b GIT binary patch literal 13225 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/GB_bo_cards.png b/modules/paypal/views/img/bo-cards/GB_bo_cards.png new file mode 100644 index 0000000000000000000000000000000000000000..52fb111bc8bcef62f7fabd1ce39361254419a88a GIT binary patch literal 16845 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%0AK{g3 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 LdGSh7{eb@g!35Dx literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/MY_bo_cards.png b/modules/paypal/views/img/bo-cards/MY_bo_cards.png new file mode 100644 index 0000000000000000000000000000000000000000..63a9693f410005d0af736701cfa4e47ee4c1c426 GIT binary patch literal 6787 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/NZ_bo_cards.png b/modules/paypal/views/img/bo-cards/NZ_bo_cards.png new file mode 100644 index 0000000000000000000000000000000000000000..0a820b0f3dffca1537e911ff944d0b8d5a4dbc02 GIT binary patch literal 17860 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/PL_bo_cards.png b/modules/paypal/views/img/bo-cards/PL_bo_cards.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d47f8f8039c990251fd49cee9c63319b4074bd GIT binary patch literal 16354 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/PayPal_bo_cards.png b/modules/paypal/views/img/bo-cards/PayPal_bo_cards.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e6392fb3ee53ee7a13cf9f1785dfdd7c6a68e1 GIT binary patch literal 3031 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 Z_CKPEXUCUP`UwC4002ovPDHLkV1gEuxC8(I literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/RA_bo_cards.png b/modules/paypal/views/img/bo-cards/RA_bo_cards.png new file mode 100644 index 0000000000000000000000000000000000000000..0eea77fa2e4c62a3f707099abbc77d8a278b1283 GIT binary patch literal 10788 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/TH_bo_cards.png b/modules/paypal/views/img/bo-cards/TH_bo_cards.png new file mode 100644 index 0000000000000000000000000000000000000000..483d63faa06b0b8c08f2a90cf8a303df3f9ccdd6 GIT binary patch literal 6768 zcmV-$8jt0PP)4Tx04R}-Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p ze@QX~~weoJO#iLyT#u@M9U^1(K2BQX#l`H&{MrL%bnew z;qL4*nLp6e)zwwir|$jVbIv{YoEo9E)*Rv>Q2|;{T8M*$e9{6O;{SadlI#$V9fu@4 z#AAo?qy;#{L*vt`5Yj`EeL7G9HlDN)`$Xl_Iyw&VDZ-&9`;_4BNYj&!JP9H0`*}MK zN%kp05Co)Yiq@JmO-a-AiOC{_KnQ_SYOpP(L`pf>&W?j!NVfe(k|ZHXlEMCiMkZ)> zL)m+FLz!HejG4Sz>!(Iu=*y~gLc86jTCMK+x=E4@NEXL&e>?7Bu6-ZXxq(OnaErk1 z8s$+TBbE@N|8p92*daA?$jTAYk-vp-hVD-?U_i1sj)|h^iFF$EZ^|^y9R#}@+dCkN zqQU1U0VyS>X>J?Y0q;1O^mg-kx3Uy6L62VdF)72*jz+g zMbhz?k%cKRT(I)MJxG>yR1gHjag67Abh};RI3C>SL3Lh6D5Vs+Tn^JTaa|Y7viias z#$YgPm$%pJ4dgvYqGg&(DMdb?$1n_B*Tpalgb;*bxUcIro6P~ak|ZIDA_@zCgxR}_ zwfP>#v%iWgPNLiqxQ}o2*q|YeH_@B7i7)>N>HGg4O2?3Aeg|Q=_ts>Y28-hu%d${P z4K%|+ciMKF4-iGsfOv4nR7O$6!hC~2{nK}7uC@q+h&0t`4H|()Z2i@kGTdQQQUpwIJQ{u^l(=;NKlmQYH#YEleXWrq0D(YYkYJEd zG`mRdn66kGbmANl1}OrK9+2Bm8pn*NS2{b0xzTb6B1I5eB)Tt0c1Qt zRO9{S8duiuXeX%!#hypE>*4$UfUv&r)9G~fb^n>R&iY0>C9rGAd>y2@uWLSX2#GLq zP#OW#AZlL3N=A2g{I}04p9W;6I`hG{o9)5=Bt@tF=IfmLahXxU^Cv))I{z z$gy44%%|Nen$6~5@DFC0LV_?s7#zfm^5G!*KA|u`Do6rgWA_k7X8WHOWZ{%-`koDd zYm1@j-L%UamFKG+47}>oo9^H6Oiz;r+Qpl zTIIq`hu{0gOEf~8aLX^s+A&EIgb<%-&}K8{L5N10Anko$?;vsD!Ps69p#dcXmZ^|? z^!0X|eB8a?CE^u6MoPi-NP%L` zVx*j7(+g>KLmJHcGY7UOdBj$ibySC&XnKkTX+GjrO>>+@qHFkfO9_x$lQ;5N&^D@WYf=C+6KNtHdc-rlRMCOb-`0 zf4oK%o5(GanT7-eagtyf3foi!QG(VGC7OkX$4V>a!-WVb1g0VIqlBp;3sVWgIQv~e z-V&@fLoO|Jm>za^;;xqigot)5yfN3q0jOs zKlq3rTw3An3yZw+*;$Hti#Oi6%~ZX>vy(&oou4_vLc`-<{r3y}Lae}0LfYMzrv>io0cc#)x^y=RYOm>xA+yvj1p9;Wp6FgV5j zcF=&R4f#nBxd)u6!Bm>Bp4hoIilzRX8!Q~bgZ*1^K|LX&0Co3GEt?}*e zUZa?|SZa8biq^nl%uSTB48^6}8$3T(m_u2&5v({w7rD&c0{Gnk1G7P zH#&6uX{PE9A1wzYsm3w{UpQCg&G(!9@mtIM#xG3tH6~E^d@ReOur(0wPcqS;nil4M zn#g~i_kJ`+y!gKnjqmeJ{XL8@A$HI6{daEj_QfUI-Ht6P1 zcg(QCgx#j_nV0(%GfbSBS$ZGM<6XUhv$}yuA_M`tR7RAF7}KLDeF=2?&V{rfjvR1@ z5vM;()ZRcuo7lk>Xoaw4nzR6M>`w8mj=r)zqZLoOHI5WCQkcP zo+wTT!UQi&SiRjMjuJdC;>N8eQVMP^ZPMumbp4pWc>5-K*P&2wS= z98LcNf`-kw*TnXlgnq=zT8G9)k9@u#4@%RNPRk?oBNDB-zO>2e$|f7@ZSu}E#iB#e zwWyaI^0rC47qQ&va%-tYw-=FUpH-)a7siB1f_+b?Xm^zGsj3h)J>9oumVm3jdA`X#h7Yb!$wStiRSilm#!Dm+UOyqKqo1U zR*xh}>G(0<{O(7bn5}a1=rE18g;WL;Lk?k*l4?!PF<5WMgo$Rc;j_5zv)&5n_%R#p z2t&c_sLRZ-%V^mk>^NxO8d#u*bNq!uS}ujTW4w0tbG&|2@Xvz<%I#G)FRrk((8Lw+ zm!4s?k|#(s-+1c^KfJO^uM<%i z$`eHi&1Q#N>s@Ter0DJ~&^V6Ilq=|d@yo=Mv&ejop`t-FG(tCD#rXW^QKmw+*C{S9 zf-q=LK7(2~gNy?tzfs;SUB?;3Pqn2$q%`F;Ub}~VNCu$)!96z({DakZ(`Bq zCT9ufFEP4u0V`TYMePSj`e<--ag%GeS~!k{k_k!#{O+&6%z7*0weQXodYhzMgdZCz zVq1z~zr_4%ho4+p!7vR@AFJ^zKYyG{|8<_8pU?{v=EidrT?5yWyz%38nw^N5v7Np{ z&QauS#nh0=Na^0n;Gt)iN(#n?3KU9J0&|%E^EWNrydW$r&MX6aX{>da zU+YlJSsWkRn-kr}poIdfh;oYv*Ck9MM7e@{WC}_}!bH;vZPe6JOrzg8-uMh@lCl;k z3Ra2Ikfd{S8Bywzx;<*6bwV*hFjOTfjSwk=ba{!;GI1P>qSzp^*D;(1Lc~0Hs_|&B z*6?U<`n+&zgqNNj=H*j$MusX}{HVz{zV#uBet5?VB1S6?m6F41vrV@xNK?&=&y6x% zEz$7=iH6~_#ozt8QHDw;O2Un0A0Z%!G+jR?jQWJNl)yF=h7uS`?z$?pHI@OhfB^V+0Q7dq6Zj{$9FVpP?aPvBI&y92D^cZJms;oD=Tw7@3ESM4Ezl3oX8fNIl%fU*b8l=+Yd=KWoyteS_<7-XusrM`D%tEc<@& zZ~xKH5k@J+yos}IlJxA6Du3`VzJ!qAnu@WiOCe{nw(0Y`|9X*#9FyZEe)FrRC>Lx5 zl3#tff}!qAS{zIA$_sTSY6W^x%JDG^Df&L5Wy=1_un<)8yHjb;BpWK)92+mAq$Ej! zH08OOAx_WMkV4RG_GoN$v22q~Kjy>vCg1w2Ys9HW8H&Y~O*}uQP%SXO(q*;j6Z#?f zyiKu^!?7*GFv9aAZmo70ujThDB0Vf}kx%aGdpq_^*G1lkw1qktIf2>~*zF!xr_0gV z25HqtZ@h`+2Z(JBxX=-pQjU$6 z=ml|qdj61Dp}+>3KW2s-@>Hk6(f2n7gm6qwmM^xfFXKDLbhGTGag zZQflP;>!9IvD#bMU+vFL zmT7ts9WP|8n(M3QJ+woDAi?AsRaWWYlHhD*mTgDM&J@2Sf&jrv$DmYBDdjcF7X4(0 zyHDPBq8|&|q2k@e3O6q z$KX4hV3sZ|QhthbM;1m3_@r3K0bhJlyh!k)i!Lv{6f!jzB8yvXbypS!CIg}^E*V_7 z>GE&BeVS$8qLWG{oI7$o3Mi#8jIB;H3`A!g(j|1%K^QiD)%%p7y#~E?RIU!}l23N0 z%I48E(kDfha-AhmX7Xj*SxMI2c#Y%y6&~|kr;f)EAt&%Kw^qEHNV+JNF?o+FtGK+w z7~h!>IQjh^zn0vho{t#K$5ibE0faF$I*LxD_;4-Hn;#DG=A}BfJ&RD^kzsqzzYqe$ zFo>cD<$~P*{-K|d(RHWMk*0F}b&R9GjL41d>$;B;y0=1d^E+q>RAwM|1PbH3YcjRX zr+AW;N_S&>eP4z_-Jg;ODf)T#TjpbhA{`vAuudD34gn=8ut_0J=}MC}1~*fOD^yq^ z$4#nu-H_gz#o46|nuUO%8sp{qwE;m4E51c5GWBNgF6Oh0l0^`%toAT+k+&z zAPBbV2A^C>Tvm)>+xCu{gRBD`$H8?S3dJ0~c8IlOz0=_>Uf4PwD!DE)iJ;YiVu4uL zv^;lkbROshIW8_%_@|3g7)C-R*Q4yVk+QD=+g^bnGHLemXbr-KVkWPY6!SR>#XPR- z4s!f$+uj$^DwPWDcAGR!2c+$ezJebtW8L}>q(AzPC)J)c^Zx)* zJ>5?QV;7PsrEp!BIF9M{dONZ*51MEh=`%B#%jE_YRKP$(4r&`73&fTypo{^5T&0kPh0d1{b_H2E ziP$!%;6COuD?2kylUy!0Fjr4PlK}%wmYK?oe3|)h9H+n3VOfJZfG2@W-b~JZ>7E=6 zko{CERVtN%229g*PzO7xYjB=HlOpxwU6Sv&yFw~~6bfbZ2Y0FzrePtJvE%s|8FqCL zwm)}5Jq3Zq?WEf6d#&~0aRyHsJ0CtG2KzqA^)i#WU8D6~m;*ACu!BUVW%akEMBFv_ zx8s2!jHjW)9)#^9=joPLeIj$2X|C-Zd5{moxjVF#g^upteyFGV9OCJN<2ZxurzM

    {AUq|IK-pIA;}K$*l|d*Lp*jIlI#$V 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

    {AUq|IK-pIA;}K$*l|d*Lp*jIlI#$V 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

    {AUq|IK-pIA;}K$*l|d*Lp*jIlI#$V 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/bo-cards/index.php b/modules/paypal/views/img/bo-cards/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/views/img/bo-cards/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/views/img/braintree.png b/modules/paypal/views/img/braintree.png new file mode 100644 index 0000000000000000000000000000000000000000..a632eb94cf580bd69b6cb626a032baed3640630e GIT binary patch literal 1104 zcmV-W1h4yvP)WFU8GbZ8()Nlj2>E@cM*00Xp1L_t(&-tE?XtWa|t z$MILU2VHq8O{yu(@)&=p#;{S$(?-nWA86)bGa6eX!!VD_AC2{gusr;Mt@_KzLq@4cO!bAIQX@9+Ejem}qO_fRMl3WY+UP$(1% zg+ifFC=?2X!d{_Q&ihxcyV!|#bpFS4_Q#7kPeRK-{Jsww(T0va9k7O+7h@AP;47@b z2e|lun6ndGbNrhHpMljlc5f=}>STHzF2l8W2U~DV58n*NA>E80gpuf7Q*o6eaa7dO z69ZzWp*B7tex2|)*ERzEx*0zhhwbLOeQ|iy{1^H~U5{7B&ds(wKlih-1aojVzQ=kz zk>|tkEY@Npmg9=rJTtHY%kW4_K^MdECf>ti_#$(>g%dFZi=zIWQQ7kBh#|2t4h!%p zF2X1AWhutwokqM6-#5nQ$u&Qx;&c3f&v0WsaRXvtA#TNe_!b{lUc4p2=)@{qlK^yL zRF0*%3+Ki0O|`8vDFOZ{Y93Tm=F_R0ef4T7 zUx}4?Deo-8ued29LF03@EHvCkbyt@{?E}0x&8QalA5c)g`=jdXcs&L;=fj2gGLBA6N1KanF}ffb999X~>=e-{QRwg%XZm@@3P=7buLNKy&$z< zS~9dgMZO`w6Rr3r+n_m$m>(yPPj_mL!vmwHmGNzHRQPu4(P{DJw!AYkzdOsbg<8^W zS5^WxKl7gx8y)#On43U0#otr%&o?+heWr)qRVWk+g+ifFC=?2XLZMJ76bgmHp5RYi Wd<^Mc-Ww7C0000Px#24YJ`L;y1YW&oMmOXXVt000SaNLh0L01Zk201Zk3CqHVk00007bV*G`2iyb$ z2|FP%7rQe600i1eL_t(Y$Ay)9h*fnE$3JuKaqoI}_qJtOrj?k|!|IQ9Ng{-@H${;m zW~3Bh*Ft<0QUqlMmF5Gn5I2Ls$_G855>qU~kisY-VKvaCRtj@nTle1UKJIU3`s18? zcSW-w95|dazxmG0_d7Gff1HVP*3!Ol0RT5X{`OeF5CB0O5TgC>&;OnOIdZO#*UetT z!4DQOan9Pw2)7HoIcQx2z?~Nmzi|AtM_xGe$!6L&E<8WLwU4gi*GT+ZRG&vVVJmFp1-p2lfvj2hWYu~;S} zMkd$Dsgp${IwLk05RkTmA1$6YVb%%`ZC(OErfPAr{cFb0T)y6&0`Bf0#ZoU1-_^p_ zmu7IXJiv+t4{>SB4Q&5%4{@Bq&2Rum%-wNXN8EJxs6(5VY^(Z>0LD�{}BGn3=1Y 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 M22l^8&5^+OPyLd!YybcN literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/default_logos/DE_vertical_solution_PP.gif b/modules/paypal/views/img/default_logos/DE_vertical_solution_PP.gif new file mode 100644 index 0000000000000000000000000000000000000000..b4324141d84b071b252361e015b783d976ba152e GIT binary patch literal 1670 zcma)%>p$D~0)W3iNk}4*M569WkZ464jLtf$(+@|xcG+j=FF4PO=hgG(2?+A{_7PqJyTAkh zdc7Wah&)7f9v&Wbb#<^vw!FNo)oMi|k)*DDV`Jmity^{N+Ue_%x4pf+Onzzm;Iu^9D{CGcnO+oMx+9TDxcQA) zvSxuqIlZ{r*fZ8UGT+)e!sT+;H#RF9d&FWfPkc!(m%muuSl`&%*xCmF9}aJk{|gy^ z`L8EnsD~w4fefq4p@y8{^pBLf6(*@Ewzb+|m-8C!K#4jpJ-djP@Y4@{qU-mnT8a|# zdmby=P9NGg_a@Q&&iq;F#4Z0_Wu{K`xUJt-eICEL`73;k7= z{XAJ|UU1WpyTR*V3_xwi=c8CAhK|n5pwPviM}ilDOyVt~N(gv&8YbWQXqEodZb(2( zS$2~6_~&gs^%TpD94`#!>R=BY@zcs&s%5Zti0MjLjBI{RU=317luQDq zou$`sR)2v!4*|y;;A&=0j+m*e0YMuONp-a!IC^Rc*QBp!vFbJU?9-apVMTtkj)x&k zXcK|fvgCz~N#Re~k{U*nK1S0eF32#sOyi#dA}NC$7Xw%kK=8DjBoU+gAXGPp50P3w zoa7vMwbloag48Y3Ocx3Ian+$0|6WQv=(Z3S&T0B&Ai%FjDm~3+24cwT(os9oFotOY zG}7T&8-{0bG}Vv6=Uh4R`YMJ*dnvqVT4y$zY;hZuFP201X`d#sd2pgx+~FZY10}!v zzFo~ejf$0wmBbcx@)yb+oLv$V%{UE7XHIa`lqz!JC#o7F$8O3>j!P<^^JPe22&I!H zpzgk00N-UFLA<)t46s-7QbE`7MLj0=7i{rleZXo&FuB&}7<5~xJ(pP;Wbir)wP%m; zrHwONV4(?m=-y2FJpQ>O*}q)aXJqyK*Q~s-P2V9bqvP8t@}20>cN@9w@2_%m~jeZX?#o8-!$I$4} zet>im!eiW%Zpa6al|v`m(1O_qjDfBMY2=ix0pz^7&1SQP*!z-)~?0%1!*i8h(0$UZT&&7x@i+ zh5duxdE*ohjSZYJ4)q2&yW{8`Y+#&O<2laNp*hxeASdR)vgPFp7SHZkdd&B;Q4b43 zmoAS{%{ds{ZzotQU$1#F@9s2RK!x`ln}|hARu}f9#mj_v{6ETOBleV?du;Qh$zsqU z@Twcak4Yu*Rye*Upi*>q&baN#!I$#mV8OS+Y+~E{JKMGM-cCmm?@kOod$>2nng<|S zR!2J&mND+3F{CNJ#bJdPGIQsk#^j-WXL&{azO$pDmMa0QG3fKYu?r z9;x;fS?qSl+FO)qruaUq$Ra+Rk M22l^8&5^+OPyLd!YybcN literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/default_logos/FR_vertical_solution_PP.png b/modules/paypal/views/img/default_logos/FR_vertical_solution_PP.png new file mode 100644 index 0000000000000000000000000000000000000000..826baa201f0733f05bdde3cf3617eb183f184ea9 GIT binary patch literal 10725 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 XS*0xvRlMrb00000NkvXXu0mjfxBW_j literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/default_logos/PL_horizontal_solution_PP.png b/modules/paypal/views/img/default_logos/PL_horizontal_solution_PP.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab199cbb4db3035445890c8e513099a72ac8efd GIT binary patch literal 16413 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/default_logos/PL_vertical_solution_PP.png b/modules/paypal/views/img/default_logos/PL_vertical_solution_PP.png new file mode 100644 index 0000000000000000000000000000000000000000..dbdaf65e890d9f65f29b3cc76171dfe72df9fa9c GIT binary patch literal 16941 zcmV)?K!U%CP)r000B4Tx04R}-Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p z7pIH3 z&|RDiDN=u&C>}$U$e=kA6bXU^0T2Ya3#`GqnVs3$@vglq@9Vvn_eYt2RrRX6s=KFq zcBa1(yHou#^OwK;W&YCrewir=Aq4x_$3FH9@?JBrkA2+l*jK`R>|>9yuY~*9#~x!} z3HPy&J;uHg?qeT&jD02C$3FHL`%1Wvee5yzm2e;X*kh=B&A?v5vTZJ0x=pEUc8oU= z4bmSC5eRs9iL*O{^<;syWPxn4fQmqq1bJJg=B?qCZ6qLP%gh|;BjDBdlHL0T_pK6U za|IH~9M^6xkS~-w#!U`H$Yu)!0zNcNLDLlcUJr^QqwCr(alCa10hvOHm3W5RODR%? zJURjmK^B>s&y-IR$Otk*#;41K{RXluqp32Qsu1)UNRo6%cr2Dp3PqEAp@{A9;ZjwZ zpwEk{fDnR2GDpS9OF~gVmK79PA{g``-yz=aH11m^{OUK~sH1biNjO$~GE$QWPx%xOYCHG%aq;EwQ?uBv&YPolcS@3S}GV z)+*Utk+D8M6T=Z6d*I-X^SHd0;{7WN#8WwnrH$o5*|Ld-eMG~4@|sLvI80tIB7|Um zX${K~gaUp9A6*yd`%no5*<68GEXB&odTRs;Bq|LM0d|vrdor0OnM`xz<{XEoCYU@h z!9ZW=?p8v}VqtNWR4UUFCP|e7%ShM=5K!~!7eY`hmY7?LvAmWb|dg>3oq) zu0SSRzi{cG8DyQv~B{G$|m_j znWg15%BF?Y)M1Pb_mj>RDU?i1%W4Qy6qyI6hY1Hfj7I&84CTq>%giptSz1p~EN-lo z1&}Y6N#_czrt%yp1d(MyBAusDDq&fjr-Q00Lw z9Dn+aH~7lezRTP1p2svd8gi*vW^r+aQn5@vU*c=u`aa96Nm8jCXFj}&)zs)~Fm#Q< z{xF|<{xK#ehIsn18B|4~P%QB;|J@%FPi82TDx+37=;!3IDSq}Jyv(5kLoKw{Vrj15 zTH&{T?=M-8r^)8?4dK7=4?j;R93qv;wU}Z&hQ|N=(=RhI6semdvV}5#_R0nR%b&l& zt%cUvLbh1ugImiC^?Au;3;gXnSGaY1iL6Vf=0q^)=lIMNFF!WLXrI5n!BZ+*T)4i< zN-W!wW~|T0Q23)e!gY)LP69b7X>#J$;fh zXFqIELMM``4FBfe{~nfQV+)&d*=#ouB1samEb-=B?-L04dG>`*@cHK-;^_wuapwIG zNv3l3X_+iboPGZypMUwZs}g?q`{((+|N0$1_~0sqVhK?l2_t<`9(nq4VnsnJo~3D! z!4nJ<85$rI@Zs}pjIcgK;|rfS!C$`ezN-?}@Snc&3hRk1=dUkgT6WthdkwNI@%;~G z`HOGA&G=x1U-{)9!SB&2n-;_i!>xG%W6>e zLZL)HSEN`hVHkS79INXo<`>skSXd*Q%VSnIH55g`WGw*+L8NUR@;`Fi;h_ z!M-Mdl4;XUrxZ!TXK1X(v#iC_Wa{Pw3DvPibnC1N#WH5uLPBCOmgV4}f-MBeOpZda zb=Ni=^bqvly&GOTh5OEJ%`98oyg5fao@xnueC7bBrbb)7FR#V9aOGBuDML|Y0s%kQ zZY^@|;;k+5Q!EsD`+ILNck?!~Br!ZPNFeBMiMJX{v9y|~|DDg5_{MkM;mx-%aP#I| zT>%07eji6BNBQsn{_`l3U~XxxWuzJjDV!SB(Urzs#ZuYgoy$w4^X{e$LsvOC6lNun zXC<*Q^_67_ztImA$3fF~Y0jH)X2xamxu%h%`m_rLiS*9Hfbk+nY>W_>+DqN$UJCDN>} zCz+fWBA+j^vKr?rUweh?H|JaE{LrVK;lUGA1Oi^JEyOv0eWjK6P=JGDL#V2PWef7f zG8b;Fu&|os55IMWrPX93Z-CEhFcb;!*s&2#A0H)O7+|n3%!#RCB0*2xqecipDqG}@ z_pkH%+3Va`Oi*@=jKUV=^LcE`!a`nQ<*$#u@tvwmq|Jl zT9PZ%I^pNpxK$S15CBZjHI+1lMO*$Tv+7B}pP0 z_R}Bn6Ac&~91dezf{Bpuf_fP*#-961lAZ$UYY_*IcvMez&GQ@)? z4)f(7{{g~bAF8VI=*dGA^F{K-67QY6PArkGDE?YyB(N--QmN5JPL?DBfgpyVBg-<= z2S-_4T;*od?DpdPI&vt)i_e|nn}7En=PuqP7K=BS5e!{tcw~^zz4R2rLs8PXBI#U# zOs?4CPx8)%+nl{L$AA3eSAoh}(6R)!ZBsI>7Ns?Gl`ntc8IDX00Ps^k^bAnhU^;hW zmD?+6N+pxEc$&3j1_3Os#9igAs|qI$kFu61l1%4FrSlCtw|=k2%)x$i?fzIT-B(H& zTaB^0xQb{q9nEI*uHT*T2YmEJL;U#XKhCkk6NJNlZpUx4) zp-4VoB9kf9?S923B~%oJp}`1#zZXe@NH~Dk)7tx|G6iCZ9I-^2Gw)yF%=v2#Q#^oZ zB*4p`I88X{!?NMlQj&bpY*8qvc+r@aMJF$|n#aoY!~ipgMtJD(2+^RAc&5ntD|5ut zIc_f|ScqlG7t7eDO(tKcyT)a61v0sU>stE2V7RimlgMD%cEe7xrYb~3eq?!H3GX?? zR@PWuT;6m$y^g92n=DI6vW%{(3=Kw^o*L(iKlD6917U32=7SG!aplH5fAW{#WqE0p zLZQ)SCRbgaMS<$V5Uu9yxx17oM15daMuIwz<8M;yZ6$ z=GJ12*WSO?M587+3500r03@k$B4d2O&#lEZ){^O#II1Gk7yjs;is%*hl@iX*uWkEsNvuXb2>@2tDRvN-oRpIF; zAL7x6j_|RkPM|6ZtH~T!W>?7dpoD&}fyYpp91im6$!W$0BRuoaK_USkhN|*6?_A;H zjTL_X>u*suP1nxM&@~LhKo0g%NTp{e=7;7MEk(oLy@1@(K98JbK~? zx_*B&&-*rG{^%- z4l>Xe!sF4oaOpN5T)N5Gb61GPQxvOHFkRR1`8+&%`Xpn+QHBP>1VaH<))IWmN;3n3)`AFdC??35V&6G}d$113q5*#G}j{nLt%4 z8$YG8$AH%l$V3AM9`C{ zWpp4^cWt}Zv2`UZX5el*K4P>s+!}1lW@RlwHk+r|wCg8J5(9lD znM1>T>hVK_e3gU1-+bdLnRtv#jk9LP!a9?EIs#ZsmYI#08oYVxCnx#?$Vv}Nc-OVZ z0Cah>V{1xS%98to{|=E}-cs@%hwjJ!Q@;bcyJ5FjD)ap_mq}$BH(q2}Vt9Cn<1Y@&bwE6E%m&aM+r<;gjW_yLd3k%=f@c=jkWQ^WWS4M~zHl}yfG zy~Xlc>+a~-P#*_Ihe+p&q}EnQuP!1)MGI@EI%+2;)NYSU-G%MZ_mlq*QgFDd=vz}l zVI$JZh~&cNad!ho5JdZRo@LoAuOujy8Wlj2Bm$8T!AOXJqXBOQAt0MCkSnx0Etkp` z#ZsA4sZ7GOE7QW2bw2p;Cb?Xrz0TwH;PrVibQQ%h_0lvIug@Tt%Tnvzo2P7&EMe$6 zW5azsaAX3HrqwqxlG!4uT(M;;D$5d@rZ5-{5Dpl4^vx9zDyECFY1jQ?>v8}r8ww?p zT%k;{Xi+SeNoDfPFDFR39El1Cyo7^ZlGzfaQW@K9v=26)oahR7V|%pSeT?03U#tmB zWs`FkZ;;J3HVR2r7@s=C@WgnJ6a~3LfkLrW3Ew+^mE~B1!;_=r3ni9TV*KYn_y+5- zB$-U3lk(W;AO{bQwrs`w{aywJq9o$Uwx|9TMP_(pkWV~uoG*X=>4va#H&(ek8*53U zYbrsXhoc7~J93Frv1~EBn&Gu`x0zi@NQuE5t{J&&QQ$cjv{RHjfYVY=7`y@t+k z#7Cds;9IwrD%XTG#W_5EfP)9So5tNMxG$8@wgs7{yJRFuLRBP&`UCWZd%GY=mLvv; zqQsIZR87IM?7AylAzz@7FOW*6QB?(1RS-fTOEMPK{Hv~N{m~FZ{So9Qt4nQXq;;KN%vk)qHa4G{?ixSw$ED4{Sb{{cuU zmCI5p(;?d`kxZr=Mx)BEVw9JjeV7B|0~={;kQC~>TfzqHDqR~xm-ruk;s-eM!8NXa zaEZmm6$&ngTE|9*I506nCZ8vr%5uFrYO0DtAmHbz)5m%E!6T@OXvjaP!l+lJ-R9uT z(J78hkMr@TPHx<7)6BmMj!us9@^cTODWXy)Np?>ssa4rk6e;YL@r{P~*&lg^3)h$U zFMs|y;6!eppsU(-a;!Hi=(k5vASK*S>C01j$EO{daTi$5e@n23;T$MJdTTz+^WAdObA#{Lqd~kD()p!PB z+jt~_q#Nj(#^JFb0iTY?&{&IQ8l4g}rE-nNKnP7$Sc>OZkEQEwe6n0|+MXI4z|fU0 z{YIU&$mBnbw>UV=UY-Q!_lEe*DfSF%xb51OuVbUaX>T2GF2 zK7usf?`OP!yJrQfd`b$+_^EBu+8J24-tIZg?o3CW=7TotoQAlPM7M^{&1t#h=Vs1u z#_N=>#+!r2iDP3MOQ70Ft0=fGy=v(?$l?3%e#rm(yI&)fZroh)cyvDf15Yt?c#N^( z@YZj`?nTB;aScsoqTkC{M6Z6XjYc%CZQW!g$z7Gdfkq7t@x{iP)2$r6@TpHe%s?bixe}q9l|;K)XD8mA z>6~$^kz^!f#SyVi!%b#Rd5G4yoAK>T+Z--x-yQWRwMpYXX=vniGu}4)F4YM2hHWaL z0BVbGiSBO8s0q!k#&;bqnts<5z1uw6(Q5wgf+ zmXjF4fS=*PeqMO)q)SJz74(w67PnSb+3~GiXSvzmz4G5}J$933J9+i;y*upSbX2%c z^W5sHA+XoR(8e>yjZ9ahU3loZtvG0Gk&k4i$ii}xzkcN{7MIpq!oT$6FY)k$)9y0f zjJ2(Vx2-Rz)Pdu7xBXW){B#?yCA?Y(+tHsL>DP9BBy7%8xJ+Z(z&Uig%{JSml^lX@ zH^u0fXLB0SIoz2?+p>w)xZUvLpqonPm|t2ak;pVS6{xyKC=zD!;1Gu<1{$YyuDo>M zy}2A)Zgfr4%FQM-ykRc4Zb82&u8MZM)i#Y=@1|kx6~$s+!0)E8m@Qg;fccWLj>>t>xkN+nGl_ zybbRyWuYmZ&9kScIeqc~|M<&4&=6IYB@B;FIOyHr+pQd3?q=dD(tTw?8Y|QMG^gAvdJLK0*y5_WQGGz7g&c7FIo!6Z;QS1aZqt`CHmvpWhNIOuDJJDlz zqP^Ss?KbWP9=bt8+uHT%s6Yq{shiPU~b&u5W?<`Mx9jk5NJ0B=jwE|h0g|l zHfVx`B+0$y(G_o^C6A5owUJorT|Pn}aHHFfA7_5_kgi=hdy|zj-Dc>V$7XWdX>43t z)yU8Gui)5$HDR|?xwebFrhmK5vzNHe|Jw1>yjQ)|=|!i#aJT(%H{RURwF|d#r`zf8 zPSg5!f4lMJq}MHasqapCY$lhTM)Pu})6%9l?99eYwO0@wd!j0HwO3#rt~65Joyp#W zMkB4t?zmGRQng=n7ewO-utB4SIxQjUG=z{l=HcYmnQw)zX!%~F)i`U};K`ZJnWlC0 z+DI!^#`G%hRufNly&N4Ijw4-bIqasfS*p`@$_gRXOS}=YSw=N}nq}A+w~+@&M^nEx za)Sp!dwDx~c0)rxZh5zqpphRT?1pk|<=O6SE1}fTphVqYQV3dnCxviSzr)@qs*g3- z=sDw8KRSpsP((C%D^*42OjrHg=usye|1@af2HpB+yCn~hHm<3V8Y`&9yd(rd+W5NR z@@PAL(;&mR{!Yepd9tw*cKdh-p<2Ka+BKzR~uF#N8=XuMt+iTmHlSeArnP& z#ywhwg;kBV9k-*+yac-OBG@edPBhwCtQ`%rMJCWxy>0kvhjtd`PH^(G9dwdajsCX1 z0$lQGmuIK6y|#yTWpk5vukvrj4s6Uc_RtMIs>{^Mk+d~k{qSt#2Fiv(*llB?&Pm5S zx;Zx4HcpiX;bxbs4d^xA-S`w1b$eztTx`Z$7wxt+UGp@zi*)VcZ$_tjV7h5y()6W? zpW5%u>a>AOYneK-)=;!Ii^o*=Y@NP zj%D49&%3A`dyacq7P~$jbt=nFVyoTrokq9$Z#s-@myvr2`?A=9HDMPcp>0*B9qnu? zwgvL`Tz|F)QE``&ySs<8HC;EnZ#9p*8NHPMe!-q>%=D6Jr?`9BBQ{Tc??k$-=5aUU zUM$mgu@}?PE?+p>)FIZsQ&Za>&}~^-()GamR`a-cJU6_ z5sw++_w@&U{!iuNp18&Y*NC`klE-ooO!f~ElZ4zg*NW*Y_EmxAB9`I zX2*wS8P~3nxOZMeXnecq!F0F9+)+KgeP1xxjfL*{@48J}(v^pxsPj0Ln3GJ;gOqCBQ8u@?7G6e?y9 z_oSAw5W?F19q0RDhgyz^ zDorMV%KL=*kPxc`I78#hy$7Qijtr#unrlWP@0n?NgB{=X8-^l*GWV{R3044Fx^*RJk;(9uEw=m z(SnjKm_LwUF6qU#VI||o>U45oyZ3=^1$$qGcOGqTCfMnGdQY+gN13|WB-jCTD4c@L zW6be9D?G<~&!hubJW7g3Ns&P11Z#Yo2?`#apZ(Z8Panwg$Y^&8?ZlD(B1ig*eBpS4 z%WDSz_SIqj;Oq>UQk(bU1%S1CGOc5`^V?XqVeff-IYqHWR4(J) zS`X)^%n&(#j5$VJ?0;KD=xGCA6ow}n%^;r0&N??wgvFF@$H~@gY1(~gWzeIdI}0j@Pu5vu(tr8W^-(y$V52D zTuNst?Zs-i8LS(b*5b80-O-DTtKPq64pB})ei=J8i^wGr#W>g&lCY6fKQb0r1yGDS z-79l(-o3QUYwyovnijgIGBO^;&{RsM$@k7JkjYgZJ$?At5aFPgLdoLhQi{uSFnJM<9zSjJo(~=^TwgEFb^IZEi=p;}ly%GB;S1L{h~)i~tR@>J>WKS$ZD&Pv#sis0{s|; zbrh@Au(XofU8hsA>m$iCp%i10f7e#TJmt7Fk-)a(gk^Ko`I?ZDNTW zrn&cP++OezQ$m4^&4VO)m?T0skfUMLaEM&?25KOH(icUR73_SDa;|ZDmMbGd zIOyTvXo$X$2T77i5Y$*1@t+h6XFI z_^2w%!w;bi_7glg#kqg|YgmbdYu<`3ar{et$Oj`ZF$&N93K?mbtBW!xk9>u2`4Y;- zza*!Iux)|5dIe$H*g{4b90c1$O0J;{4w4|qx%?p>dhv@W!q3>(e~q<#ne`GCd0M-C z%3XF>e_fS1JsIH}3rG30D^RpFPGyRGY2qx{C062Pe*YWiSczxrX=WxOeD;Y+R7ED2 zF0i(g#1;Zsk911cL_4D)t<497)L?Hq3 zRDoan+Bx3(aH*b7)npW1rj#?u=1QEuxI#9!(I!RB1Ia4xj3n?@)KrC`J|DWOpsO+`Ci|G3Pms=3Hf#!oGHYuoe&?^wGd2+9#Nk1H@bO7}dZme$ zOp8pu$cNWgS&3zlknjZ!q9HHAfX>zHYm}>Y#)Y*Ew^vde913yokA%Q(7Er^Yk32Fq zrmR3;7}Fb|qg5 zxpWK7XP`xbcn(ZsJo*T-*N^pspF{EWAyOIE5?Laje2(DDpXA~j=aC1d@%0~IEb&`N zbC<}y`Auf~1E`@9vQPaYEVj zWrAt}L(v@a-0eo=o}a2J9377`81iGI@NR5^A}KB{B+xTuVyO~~%V_{4S;FJhm>iAp z=#gPwIX6ozy6!GEF6*7eqv2=m!v+Kl@c_djP8uc?V9AYTylY}^E@IAKXXVUQ(yK)xPfm0B z_-8RoCjFMh+_%2X#ozxkp86O696hnl&0qT}(HDOJ%j+ke&Qnl)m|BqWPkoM|BNO;# zmAP;I6+_QG&+t?P{k8v(;mmEma6HdkAx|2}&EKT#6BN7#*5F}0gM(<12(Nwhy96Qu zp8w(}x%!(wMMgv^JoG;?IC&X8f73CAsZO2llA}zjEHTy}WMn8v|4@kawKR)agWo!P zkSE6HScq>-V+~#9$x{;?7ztww!L6kf@#-iCplJ%jgCR6c!SB)e$rnzrp0zl8ZI!S8 z?WKkt)I>7R-@bN@f8o`5B=abP2O;V`vJWeP)W0z93#h;ng>< zldJ0d)ujx+V2bA-s@-2>@19&g`fpKel2;WaWJr<1V#}*UBmJQ26mKn&N#3Ar%UETz z@?WV)d36;EIW$ee5;n3e@FEi$omL5pw~J z5*b~fSxKaFtg&!=ah|Y)sYg{Ld|sV!&_g_yp=c@0W_B}im8)^xfmGjpJi!H5?j zAYCX^EL#pbGC`k#s>nzZ1id;l2ck$4tgWP2SWmN(%#q8Q*tQ^_FL8A?PM^QBV?4K- z;l@&`Y6cP23*uxfTTm#P4Q)S_FO$eR_9|-abXVlMC)Zo-&3s!?RmR3gNiQ#vzImPK zCmtuZ7$dc?M)Kehya#2TKm7#X{j1k0EMH?h^l{8T`VC^2Zt#xszjEs1FY>Wp`dL!z ztE_%_nG5k8V?*PZxe`n7e4DlF7bz7BsN>Uwl`>Jaj5)W0n$P18=;ZqjQL-fD*=2@* z=pQpQcm(xpZ(>Mg1U74c*Nzb|v*gS(csM{LAo0Rwwf z8q*T|#3zpOmG55RkN)lwA6{9dRH~$V`|K>+=%)@b@$n}qm5RK1E6%|$|0IWs1@zO8VwLlpf9)*6$w|!UIO8vUmUq7K zCWha~*k@j(f9V+IT%Ox&61Ht(-MGNvl^e{z^FHs79_1f??4My+1(wEcvc7TxI~L&Z zqtB620u;(J3v+9zszu0eGnBf4RW|vn@2qq1pHXM8RV9_5ve*Kb}wk#V$}-S)#bK1iA;iRKjl*Nz9N}&uLVmnOb@ZRyE8^6S0v@)0@q$Xo#f`$es>mkSP851aJTF9 z>b;UwxqP;iP_xN7)hb zTs+5De*LTXHJg*#66Mu2mSuDKoiG5FX;WB9aqEgfGHme4p;=P-IllSzzt8%6VG?S^ z9MK<{$Ijaf1yjHRHtqZ5(`lF?6Izmhj2MOph9^IYpi%(4P z=*%#B<<1X;5UeIkWF6B{zgOd-=|TSOpPuFH)m6Ur%4PZoLU?@|gCU)z)l7Y-wT5Gd z2hnteU;UH!m|JTM>x6hLLr|+ZNH{iRoMm>ErQ0L04jDJJQOECXVh46dJ5^xquEtH` z2+KWg!_Y3UkjY{&PL9K*Q4ow!BuW_tL4Phmu$V=&OcdKOyJm1Z9wb@N@ds+L}DpMdu2!f@}eMbYO$|A=GRG*CDk?@kMUp+ZkyB%I?K1Jc!ebZ<~(+w7i z3L}9sIGod#vj!_Em0U@~v^Q@0-Y9pw(-E6}+u02WS(4C|ik&Z8G_lNza129bs6W6+ z)W=|G!?RtYVx0FH8hAjJBtkwNRhIGVDnXA%DB!6Z@)4kGD!Q(s%L+cP#>hyRqhnFL zstQ8F>(P;A37=2r_@O>N{_sRSze3sKz1wkY0qdZhIQS?G(j!@z?8N-dzb&vK^V)*3QaQs=f=~ ziDnlgr$<-#r5`!P{CbWzuB-wO@M;_#k1{sUcraPh6u$7{1LR8|y@&&6{NMB}{9h(JHdU%tRj(1Abn5Xq=miX^N)JkALPtpkgjL5b^ND%y46V zip)!=#yK_;#_&{{w9jbvw%|gI(ULwi&Dr8888{;-FTw{h6l6q(OHK8a~n zj(CN=DiMDr&Oq3U&!h3_(+4S*tc}qSkR=$1_z3$nf@C6ciRF(*Eg(y?x31ZeaX|@X6ghE2Ff`O&TjE|PE_3bNQ z$&!fWRo-0;a&9@uYR*d*t>w!7{TsON6r6H(UL~>>bZXmsG7>ud9-RkS9j|L{6IOSS@eRV4Z@ACE49bI9A=x0^}QH5yPQ50QTPo`bA&Y>V3jX2 zPjCwtK)p+dTLk$gQ!L}hO3S?W+v7Yin&9CBasK(om+@%bj~Z(Qm4&Rv*Um+_vKHVk zE>4onYuG)!)YKbyJbtn3n~j4FSnCk-d_qZm+-Tm>*fxb?X0OclXtuD z`(h~M&X#lQn?F1BQtu``sc;#U+`e@tvT2NY!psxqdmO?;iE-kLlO{rehl#huw~#nb zgf;wJWS9hA?4}Vth0eLP0nV@W^Ecer9PbU?pgL9byR0;cWJqIXk(_`^s3e~$hh|s zwRCpV@7nQ`jiEh9kwOn|O_WfXC(1fO6l~5i;TkW4iituNy+r{VOCpg*=Xz3QAs^t< zQa`d(DUS~u*)bB@LSj9yQ7EYtdQm_}ZjG|)X8PLr7X8LIH@Q0VkU^M;QmjWFKN=9_ z6qp$*8-{K&>IKg9?SA);Z7HD;0wF|)rVFBK1ru%DhNQ~N@D0DEDn)1G9UV5XwmO&Z zu$fi!_2_JgYK5~qaP!v>8W42(-U*?AR<-hM$V%!c-3>V9R{NVKxjN}>$ehXuQBL*9 z?MDP=2F(1%g->k#OoW?^C70j5Vn?Q<0;^-m+FxdCJ9MM^TLMA#Ee413{P}M`-QZo( zEoxq-;v=vPFG&)CKx2;~B*CUnmsMp|Q7miY8{m{HLLeloF^#aGoWNRtW5>#IccJF2 zP}`uYmbq7rag#CCwqN_*;w0W3c4$rL;+0W1+;@P}j8XsXPBZ9N+|#+ybbgnlhLNC! zZ#RD0(e5>#8$WJz8p4}*nLF^=U>@3p*V<`V*F76S%MM~MGVYXbHyvlM=B&-)cdDOm z_XV5HW6f>6T^@VpJKCf5<(x*azqta~?f$gf=`xHitJ`ZZsPUH71H@YaoTxmC`_ zAMW&8;?%;G)^Io5XgB3_g>cWK8+25{cJv(OuPJJ`O4zG?w4oztmXGtCU>7plNZ6W3 zjYhL4nB+M1vQ4}0_LZ>Rvs$*j!JO1a5uIu6>Y1%tc{&;D+vVA*B3sf_^K$am%@bj5 z^QeB8*r4YYSJeMkJ=xGy&Te?<>M65o-fnqxgSL4HuI2&Ybs^}KhoKLrOot=U6^!{e)dhsTa zJJ54M!xX1!y3@czbE9|b_}YZuDQ}nty3Xr0oaJyEA>7&sY?QxUTWU92x{b(ga@x#H z=1jL)n-Grj%Z=&w?xH8Rj9sRGH37J;fow-S=UNdeLh012c02O8@!4jo+`tc1x78d` zTQ`7ucZ9Yb(-}9`EEoASL|}uV9`bJ32op`k-^#SA!_>8#x@nL>vx}LaK`B~f<(5Ym z?XkX8+N6Cn@Mbj)u+oMyZsl#fDz<;JzNHfBZKl|Ef#3YoC7#qis5i7B;N)8pO;MZI zdYdrOaVFUzZG)n_(dfW?rzrJC*c{%aFt;}IYLBirH{9CB7Eo_HU9>BwteSc0M5jya zknd=>y+FIT&hKvP1-JOk;m&XE1hQFg(J5{_bXvn~mabDT(p%o2>`k@@kiUtF$`B@6-m}(s#o{w|u(e4xA_K1)HoT8@}EB#`cdsI@QN+$$zu8 zc)PXTR`YUmKidxWYE8JAJa%&0a!2U4=>Gsa~PV&+{_D1%-<+qdkxNpkr zbX(XA+qM(BHK4tNp*df>-DXs+X-|h!&Zly&C+eJZhFT~wuSC#ZKd8m zQjdggj@qL8Zkl7=O}uoQZ#Ob**+SeT-FEAySL|e40k8p2{^*5P@A+;2o`sIaNwGkwWI>vq20$qBnt z9xZ8w%Qr_nH)rR~c-)LubDX-Zs*PORIb63Z$7c28R+erZ$G0N)ZrVU69(LklvCZ<{ z?6kxd^WMG^N|K{On<}n0ic3hzAWw)< z*|FPFM&XOF(=JBi%WsHB1@>e3l)PpI?bICbN_ zU0~rKQ_DO|m%!BDz1LyMONh%$Pvuf2gq#x~d*m-G^^)z>rUjxM4G~)%(jy$$Wdq;5 z{Bd$ottbN~$rZF#4MxaHL7^6h4O%O_=}0*%^KzbC$NQBj^+ZZbJ|nE^*YmFQN2@6{%4NGj#cx{^X~lq z6Vm7ZPW-$KN4Tv3hV$2&*(r%168r!aez;{5NZ5 zqwO>te-8;AwHS4nVo?OY6OF){!aEWkY=vrqv#~R?rkwbWcv~n7=9X(KQ%!nsg}pIi zNtyHYhhT0v)$0Kn%j3gfdU5R)lz@SyljWBclQAO74B$+zJ&yf{9EQ_jtJgAEL@nm_ z5pRNVvYe4auEtIYC=!K?)1&>RcS-CLhDf3o5gqN9T5+Q040kpjA9$JPsSa_2raN*) z^-ylBy%y)|{2pJ>tUeO5EvWL`!TX2cn$v;r-s@<;>Z$G<1Zlgynl3Mpq`52lDz++~ zmZ5H{Dq6x5-g#O=`&7h@Y)#`AxOqk6!_cP)bcam5z31(JfIVEJ+ei&(IM-RHyB*!M(zaYBUX@=}Ulm?uUv*zGjrSAnHC`p!iM)xmqjOdc zPmLa~f;_cW7-hP2mFP>No3%V8CMD^_>%>RK^Ok8~C5#sFmalfX+uXa|X~44kdsbGS z8`$dtHGyS8QQZZ?XxN)mLVv zHJD^Ly@X+)j@7UDoQ0lP{%zok% zT?4?ueVBZZ|F;A{+KX#A0RW&Q{TF~{d5galf&f55SU}l5`?|-X-gv@g?`5iMwYR%x zZ}rPluQV+qHy5;DADtgSTY9lrSP6xKi9j>eoN2JoLJP6=ZKTm$i4m7@G5IJTg@jaT z8zAs63>Zilfj=eyQ_zOj-fk~li`q`-ODW&7Yt_Z7R_9)p?^&&%@Jp8q)9u7`k_V$) zE_Vh+adIMU=b2&O!CEqSPSAgkPR=3CQMAt-or0Sp=pQ&bgx7^pKC!j&t_vf)Vrt@D zXNGx2RK+^Z4RZ^qi?p5Vr)N+W=sH*b-(lwPoWLKb8P1_RiO^{0np>%dDdb041XsMZM&0m z%I0?}rQO9L@h5AKxweurI1o@-L_ZUZELP@ULD?KV_xjK|@?rVpH`;dN;l0{k*HBJ} zitgu$*GdA4GNA*BxTct5KqXY6K#=@A2`03|^D9K2_dPlA#CYzJg9Xo&UaxD?ZLd#Q zi*oJvE;F<5dy^bPJOrZrzT3|~Iteq%C)Btw$aJut36Q*xqa+wuk{1%YTl7xBivTLp z3h7w2z3$oNN1QirhpoNLQdw5JrL1U0YR%|47z8M+v-fY4hD*s(G^Ooq-Q&sYH(VcV zSnx9$;d$p6r?4=HGpq%1{k4^E?}q7?36owom(b%D=`Wx8<+p9IS!CD?2w2-49eo!b zSblaS0(~qToK|wQsjlpz7yOSlP#yqdCQwy1)^>*n+S<#TGp#Aghm$Qe_uG3HPp^X` z-@7u8&xWCFPS#Gbjvl}E+Nqca z@gt9OF13wuW-FFRqI8TK6K4WZc{TT|BM|JBgy)zkHg#PI2m9Cl+LL2}0;*y>>DgNP zrux{!S7>tr{las~%F2WZWBZ&@i*m(48?N=%Ay3MwHeH{zTw(V-=n7*}6@8wiS_X{H z&{9egA~2CDLbb*Q>a0!3dPT|NWOZ8YJWWEq#tfYa`uJ!B$cwJTzC;rx^3;hVNg0{vhUPP}lGI7F5>58mX?G8!q)4Oe`dmXE%E$ofCs~o=YlkZ|<+%hP0xBuX zD+5a_pI$~1LoPdGX1_grd z0wAz8qE?&(o}A&fTpO-Tt6q*iIXePp9u?7)*dRciCtG7KC0jXHHNqoPv{gVN7p+O> z(k720(MA-VzMW-AtuIIl0RvYOJ~pJt*kn#WFm(u@{yyh;l$xb(?!G*cX0WqQ_kE%F z3A5vXP)L+LXm_zp{XE(A_8(WZiI-ug>Tfxu=VTD)NGj28eQv1r4sCjd9;Yzd>GVoW zSfWD#h$vv3$=N?I8_;Iw{+)mxgG^6RIA8O-lykq`BR6;B6e7_TMtHnflInB31Hc?+^a>l-&Jmgn}UBug4mm{?#m|Ne@IRbB0*1G6I&2rnt2;Wt5XY-%WDub zJI6@Z_E#JpZs%lMASoJ;K#-Cq+l1BmUBaTFt&N{ZQB&8tYWtxAp`od1=xQErK6Oo3 zn_}|JPle&}O)ftIt=UQ&YM`dbDyb+|P>aFA0$dArwkGUT`F&B^^*RNWq_|8TGd6b4 zdi+~QgsL5MEcM?h1ceYGM2Ja>7CDOmyL6h)C*<(E0ISL=g!UDC#96mCLgN03kV6L%^uAD|qGLkqlwdWIdzVVDWfM2!U$rDp* zHGM)N$L*R9&*PhXoWf#ihVH-v#KP4#OvdYtrzVNAfT3F5II}njM%VjD=|*NYaSZiD zKeXK8u8%NHFtveHyHy)5b`YB8#d>Ds22y*f+sDxgd9=W(DCqLhOe zkQpE{Ir8#kSWv5=lv?D!Z)Rj`k?K(&vcp<6T(TQKh}^GmIR3FqplY7m8v@MvRl3BM57XgZfAwh^FNTQ@~Yai|V9;DjtWf^kQ^=YH=?Pqqs$$-Y; zW0YmaI*u@-E1-g!%f>ne=krLAuP3zrP0lvGzEOPd{kqpfz7Nka?$IK|#5?t^59`|g zMaRgYLm>#laZ_mTJ1V*ltbRN$jsY{?H<$_IqlJ?Jr$;sfKoD8eu%*P)gDn=GPL-oFD z=p0NOL!!qTsS{A5N;(Z}Y+1$@MGI(p_IDxBW8qwnR)#`rhi2Ux4 z?f&Jk)fQGr8jxj3-`koRfgXE%9HUjFpSnv%L$WdNBxOl``Y^6{)IZfg-OC|MnrdoJG<2a6s!&#tSUO)tlth5Z1euOhpu~Yff^DOl zK9w?2T>_PK&2auRmSUxZ5;+s~Q(4K#zCIK%pbPeaL|xX1Qp4C9XL-v`o8)9AZL7H% z$!}39Nn-5iUY$p5h;i9liq7c9OUSq`&kcbclQoApVv1f z9kROJIqv%XP)J(c$LuXzP$7hD%!}a}R$VvOis`bVO31)2MuPpv_NRg9F9wDS2eU`j zx8nz4nUq*DU>wZ8{!-|%PWt&_Wwg1*hSuS~#FftPL(ctjCri7RcVco9?6`49w5*LR zqSngz0kk?XNIwK3wg+eG%4z`+HCXGGe`dn3sA|79`Tp{IvtEdq{+rDV8b&pEKdEB&XZK7&xy5N zeU=pBq^jyZ&w@%QfhB&((Rc{PswkO#Q+CPfx-@%sf1BUBqG7F6yG2qg2;u2@Fnp*0 zKvV$GApW5}O{rnLx};5`e$=gXDJ;T+gL!RsFc0XN!~j$(FwrPs0_DP|Mh6tC+p>It z(W%JxoE|DV&x~;mzmyg3`2G*!G!~x#i5?=8Q_9N1c82=lCWb>YcXpiK8K_jYU!H+E zMtr=uTC5&t<49$yj!LezE`gpbK2~aWx3qK+}22tncgpxFl}aP zZ%k9G#Nn^? zcIlU$(zCQoZS|`s{&+FLm}j^98Dz4HSB9#Cf`Cc-`48D=H;+VXb~B2NlQOAG z?$m=!X?TYf&|?@_SA=La%+1!loqvOitISTjt!7Kl*fWc{~SPfi8p7+fZ($Xq&05g$W30czhERhef}H zq`Fb2L;IICHa2%J9CfNG)xg6HpWjBT?m>$nK!G;kmeCfs+8Axk2*nanT0SAm<(8DO z1!%M&bkzYS)G8sE=M5eP#35d~*=G7cUB-#qR0B~QUUQEmFgS`u#zl2E^#ZL(oO zcNQ0qA0i+*vCxF6seN`?y9-@`1gE%57KOr0p0^_^O_fx;` z2{gN6trho2m+)W+S9JKWgt;kk|6*Bkr)*V<4TqV78|n1y>>0$FslD+4>ve~!=`2)&+&F#; zy~DvRx6ktlEvo9e@>$+4c?nr)TSwBtt-0u;FOjEoh*}Ax?xQSPG zI{|^GVLVo6j(LcmNyeN*yjYvIskwQSE6uL(606Dz(^hV_vA#XlhD+wcl^r9W4bkqw zNhMg29Zf`q4PW999Gru>x4$s+`eUzrqsCn7CMSXlVsH>Apw7sA>mEggAObVK2!(_}}w3JMgd?M}vt-sj0y7Qv8i~;{M)uLY(90xcJtGa_#uEW2XfftiMHh^phC9TfQg| zM(1QeFL~(hXAX$t8&O@4TiV)gR~H4W$nQe_^fV9z-4W>J>KRxz?C`mJTZa=P3*q8E z;+y`?kCN1wapO-_Wo1RM5FzjDGG;EfA5PCu1$fTCCcal@e7{fnhc;UVzCLNro!U*2 zA_G~RtbBQD1?tpxCpWM)7epYU1oARjoFigi3w3OKLBi1|)Dgsm1Q zr-R+8rz4NSDNv@6r&5Q48?x6%A)pS;M-&mmJc=kNFC@3hQ;uc6R&-TXB1MI=JKYl` zh$9TmZ{Fj=Vn#oSw7YvIJ9aQk!@rPW;7jXYT*OXN0?33k46rLo;&HJ`*Q(cYF_K5} zE1|p}0D2x6$jZRPPaI{&p1@#WmBGW#=Rpvou+JkGSZio=GO1Fe6(Yc3z`Te?gvDHt z7=CytgUMZyfA{q3bhnm0hHPITWb*hkJz<6HeSLuVz3Ual>RC@9!sf1m!E6wI>N@Z- zYl1h(oNedoo;)i*nBF$*^Aha?5cAUdYL%qWCBHt@^$gj4^7-}0Xu-B0TzZse3AJjM;6pWE9nk1bJinI-q`t{K&Iem z9}EAair#6ns2W;x_g8Z?phiZ~IyNOjk;CBVc^Tzh`2QgeXKwateb&VMQSk(VI1BWz z1>${h*Z8q>yKh=*RgBsjR4aarzIaK`AB+AKA)lH`|oImu2#wmYfCT%+%^V$Ye7uw;x~`|o}!&A z#q4~w21}q9E4Pe} z`(}->O_{;A+@i>3Yx+`pkZZ9@MN!o5q#ta~RDihvR+c(kybAEXOq4-@#aMn@n(SE$ z-X1$#w=E)_e2vDD`Et5g;Wn2pVD&w9scP=J?{-6DeIheolqR*5q20hfSb`6d)uz!h zx23Fh-{L-xa8@M4atX^^r?i+^vc`=%nF+RBSea!$PUleulN2tY2v5!|-5u2wIc$5S z+N7jAn@ruMuGo_-a>Z4{)+#nOr|$Fhy#8@BLz^(gx{M0Yk2m9e#=-v{$IRtr^Dix5 zIbUJLmWGbAdMgKSYlmySAI7HT7A@A~0EzLmZeU{-a$)`gO18fgT6)+Mk5{NUF?;_aY**hRNp`zl8ji3;HeFBWs0e zX~A}0!|P%7R;%Q$l(T#>Q8!I<{ubJ{xP9eAGp^KEv+v7n>5-EA(#VqAhSyry(6$a9 zTC_>ht&*aQfXC9@wvyqrLX^>HvD@qI}#`EQtyA^E3a=g6hS%ZyP=f!IprZat`ekZLLSJ-?T) z1O%$dpfEp7=85H8l;@0H@28xPssd-~wYT}W=TSLRJ;$Otv!TYtsa^z1w6mX_6|a zWo=u!f&%SRG+CFck}F3O*-EW=xfs~p(p6IC?}%6F!qvf1@Go;VPI@;eK05MfvodwO zX)xOXnb#{ayA$TK%2}UCv2;&>5%5q~9+%1B+a_0>yAk zA+ETddgfZ~r6fE}v)ogC3F{i2Y=*R*n3@;3I>Dqa5l!Xf=#PRUb<2xwoB_P&FUsC(|_FYg~3Uzc(LD zrIc#UTYBxjYDd>jJl=Kp2dcWB6ehOZxiloWf`NSTTgppM%VKpy3&1l7RpMB2SiFhx4TBnSvZd8`6-FJ;vv3}2IhZY9T zucNQr4yeAQ@8VnA+faUY&e!wtpR$UcdRByVaouV4vRy$BDR>dKQ9hbps6Kp*lu(x# zz7?P;66(8?M^<{^zOo$_04O7ToXMuJ?p~P=)!j{%v?{l-#I-Jg?eCs!aSic0)W3W_ zA*=H(X)hUp6Q=#!`&`pI+M<&)V8bkSWmJ2>(){%GI&>-QQ1Q$$w@s;&)G%~Ns`EX5 zh>jiEdfPv)dQ28zLEPNUjcjm&m|LQSuFwHFCo=hvanEXPV67`!wdV}J#lx#+0)|t( zsd1rBqi9H=ls7hW+9L;ru^v?KJxCww7bF&%zkOgmixi^PM}*dVGNK^v3<)GrVomU; z0+q4?lvEtr9U#3j!Le>@rSC%p5u{|UW4IB!a^0nzCGOhU4PN)<*`a!lyS>>Z1rndc zeUVW;fZ!i1IEV+AU=5cy^yik8k~=3-ClXEt@BoorF_^Y+@K6dCMnsZvfy6WsO~MRK z@?b6ztfPw;LQWhp#Gn9;rLu>TP;3>Dy-;tB6#jdNy&KH9(y_`K(rmHwkT8hX+!m%Q zetB8!6;Xp-6eIb1C&O zAXJ4Tnff{`3?*Z8_G;%d-!0)7hsB_8*<{ zF;6WWYT)5-e)HtB;9S!7}HX2gOO=!wCBas?r&8f462cwl! z{JUXxi@=@lc<-DL@9_g`SU7gz_wh(Qhf85^LNWdGt!CExJwC;TuPeSL$}JCj0$4PP zU*LM8qSST&*8BXupiO3@GS=<)rOa~cnewus2aBkJ`U1f5XM9m8qn~zK2}J(@iGraw zuN?pYd+a|ifI7$`)J=EH7BtC?9PT2jgx&bQx*VQ1JHm{syidtoU*_J`N0*h6U(u5| zZr}51%-Y1yMg{F0x!3Hb4?UR+H}teJw}J6WfTnvR87|f=@a}Gv=h=N}89uYVzEi44 zu1UhFd7smfZ-UPf5p*>GIA4MN8FCksnTIFy*g`JRUc1wn*i(%q!s4X@aV4>cO`B-S zn4o{>R}~IE*78Y_E^J}T^&9P+GXi4Ud(Prp?dHxPFq&dn4udY>qmkxTm#i1!7GkM1 zpNDUx1YG??has6TEe6Otis+xrx^{T$AI?-8LNxog+gvSU!lfx}r@#*B@`jF1V!E&T z7s^dn`krJ`HR>d~l=w!+bXPq_;raQqC>y&k53zVh)2LUk?pb(vO>ruzSKiyt z+%I3dr(O9vJl=+3aiY1FV~~(W#gYyk-N;dxsTT4%U(80O@MARxQ#%6a z7%J2d`T1sugF(9d>>qF$?NX9C&R`X-3OJDk#6l6t{ZnF#n2s zc)w2vS^TTxuw0(W;|WyTxw6-lJ-?WgV;I$nZ4&4Ir1{vp2R`rApM%4)2oNf^sUB~e zfGVZS&%B>+EtJR@N8hUn2Hvknke|0Ox#dIG(5|U#8Rd>Q1nBeHB8wOB`2$Tie*c4K}3LCOg0ZJ!BmUUo7y8U)McuG zB*PHfT(2Vv`_I3DN}+%gh^9IK>W4fOb_Dc9V)6q2(u0T*cw@75NuRGqnIFRdVXx5= zIWom}1R-HoZ9&%V>Fl3Ob5>}ZT&u01DOp(?Oa5xOjWx)S7v+_IpFhEV z+Z;5t(zOh2@rChp`|Q`arWIER&{;BFhPz!&gIR28>QZU-+-p>`HK^?^*(F!oMfuDY zaFQ#dsw`+N*U=7Jn=86qErUbk#kCjLZ2$q1nl;?G2$2jkdn1AwISL0sAX ziiq4VDXZs1S=#-KJO2;uQ9%A;dvY1@ZdyiDY&aTo019H5HSS_koG*Y94$5Ff&9;O~qt;gyty< zIXI!3!c??GOl*YA!OG0mW5+k!oJ~;{`HnmW?B@R(nufYx-%03b%IvL9|566_sv{_^ zwR852ruDicz1Y?PJsQix$}nhzL-EN|3o6F$;S_ zkJBJ+-`9O(?{RKEO$AtiMtlkU_)vs#a0I;XTgD>HDXCK`Vk8s8y3gHg^iIyJaBx!Ep7a zWUpmZeZ&6_(lDHF|2c)x78#!=OxYDY^NcvE{%dhF)zG6;tgXyJK7@>oCFNjG=U*|^ zkkon_&{P2-8}p>#O!Rv>cGHkVy*$_9<{Mp?kCw~BCNRemFSx&NAq`C=oRxVrGKU&z z92(S&rD{{{aJ51$8^I*ZqG@bSzQ;}IDSzC%IpKEXDJpaxh%>FxS;^@9!5;fHn5Rmu-x5tPX1lDw8*22$jPZJCJ9DRgKFg^t}fWrIr+QBG>B?eVe5L z<9*<0?BLFbfq5H16!r@oe=9PU?FKB+J?ela?~G8QY$N&HA00AQOJ&xhP|8dZx%oNyM8exPqnce z^TNfHwYTgB*FjE>GHI*;LW(FPKkJknUv7vpQDtpRz78d@HjW$~{8I!B>1iYo7%D)7 zMS?RA3GN(>P;DmV{WOEAx){<)Kv@}B2yxXY#i?azOVJb(@42?w_mj&j9xS}LJY@o?-T9D zs*dTA$uI5g+=I1tX8`IcpNt4(RFq*ZXABc}=xriT5SBFIoSF(-0}20wU_s6|+p2D7 zcwsR3gO0KDt`31|ZQSovq|}Spyn*l@{ReL%SHTlmp}GPv&B0oAoAqX=NV2t-hsXF<-r|95u3wLR4!6j#e zdHk+eErj{Fd_4+U# zzKQLbLuxMjsQ+R8BO4vVgP7jmb-Ev@6VcGFzB{quJfBeeTcv8_dz2MKYo5UZIiJvi zA|qjxl#xDPJeJ+5fG9Ki-tRn&Y1unsGU#a(Xk-73Hwqj;k$3x#IE1rXF*y?Vx4B*k z62yICzB`4R?<_q76WiE9r62Gw@H!)uo7U=u6|AM>i4hG-bx2f%1hS#8p zF+zGd#^!;BCN!!`liF?dQtK}A%6@v6@6{3^ZU^u9Hd`9TrtI1!$zNj-R%}rP6pum@ zzPn>~NC@+}^vHU$=3Igd`fJzEWuB9FVVn~g*c-mzfrMuvs*rlCyrBW<5S5*5!bGaP za>#BkIruyA<4DlwjN6U=7F;Zq$KeT3N8-pv#J7xO+eeqarBY?jaL`_5>l$w{-gk-$ zs@7V#$e{SSykt$%88k7d@fuq_3oa>Eft@o%Rr1)bx{%Tsx!Gd1%nW0nxguP!1P+%Z zIi9F#Q#B1OGNgz?Qctq&biB;YfGcP+ZgyjkQ3^RtoqoRI8IV{fc`Zq}ptU_v0W4yI zNuVv{5Y1sFm|zNdAwO$ZxMAu-GysDc=2|YPjkq&e2zlLtY5jUgYaxUHBN73|`~qxD zbP0VLq@z(uaD%qK!^~hKC9KX8vnLXv;XVMNkQt9wp+3urRcHYsTn72CEa4m*M}mnf z9#7XnU1RE?jXvh0p*~ZX#VN{vdcTZS^o0lqE1aPIQnj^G?2wOGD19pkIePkO+2 z5r&=zt_nrIeiIDH4hxZMZ1>k6z)^8w5Pa_RAxN_fE~|L$T%x3|4erDn^D0fV@<{!5 zGHE@#WMR4Flo6C$YLN*vnOux)BZ?J-LG$&aiKbsg?oaFGe+fr70T3Jn=EH-CqEbMI z_E(J0IWPk@ip`Gp0l)XrRH<{x>5`hd1TpgO!JWW&T3+Yy!>_nIJ99jVslrcCd>26m z&$x^{x~%g381hmNFqWdNHLf2D%OyvGwja?%hT(HVVO=$SEFy8W*yL^M z9^YRApPxFV?eWHV7X)sfM2z!(RM!6e4(slgd58ZB(gQt4aSAf7a_s}8r12RKf&*+`CQld28LXK>fTTq^P#L&*g6jazTJV*OCqcBvj8jps36nsl#%90vs=l|eP_Z9A8Q8o1nOJlO%z(D!v6{+6odQ(625al{ zq`BmI6p)LM_w#50_ZVESGod|6q+`8o!fnX7iZAjojqG=|G30%)O`gZe_p1*aquS2Y zIJy1#^8L6Ju==m9CW-VPl+2O94SW*mGcB)6{>9{5+{-R_;fVkN$v20Bs zb0v@c`M|s8GsvYLBywGP8}>!e*y>WcIUAGXJ@;o%c~A$0L;9Y70dYJ-BD(`tQi`e= z4cdI4{vcn#)&>;GVUc(UV^MU()Yda19yVe?K(JBR)Fb0@kWo-=fD(xj_JpjgL4o6S zoiJJ)M8q6pibK4Foa;eY7;tQcp2sC=xkN4>n>Ir{_xPAdkuw@6CD}Smn^20dOOoN* za3qq%BvacWC!|XW1fHw`Hb&eRRb!f13Qc3`-&N?{y<=5qQ_F5zG}u{Gm^?@_PD)}) zqNXLg2S%qLx3Rr9yX^S;aF4;u(!<_NnFBUJnQX=axo%5n{=)*EKiFlLCOhsgoCus zq2T<$_>sMG%G%x+8h~fV^uh+0_?U@A5>8h#nHgIA?YGmn@y#6MC9T;b=;TyNNl+Fr z!~F))n{`BQ0lQUGV6*+(SwHjnAPgPvPn*VVTp|8qc4xQKVqy3thgN*P{~1S=q-GKQ7v8 z6YBdC(M+E^0`Rbd&t0jt42?^s#4W;D^om?eijS6TzZIP#3ZD5 zsPlpq^j{=F*OmhDF!u@utYIHEf)#@1 zn1_C4*ia%9te5aX!&zgBnuIpzN!bhx{`$@CpvV z+{`Fu#hj6XCdHJgIM!VW;7V!{U@mBE_uCnJe`7AANYorbfH->?g1D3}kM2 zD2IR*P(=3MAF+-tzaR)P#DnQ!SCa6okED{Rv8Nn=_vMMl^36CfIyLxNo54A`4$UQ4 zT`!`3_IhJ+3FS3&WY3HOdvt}BbDxGUT>(}k5Gj{0HUk7w*hu(G+k;k6qwp##g zJ))>k7{f#Yp5TV+imSLN&O$|HY?EcQ(G075>+Uz4v{h0T_qiqrN@|ecu&Qf})i%na z9m}4vDD}?M~3f~Lxd;{B(p+DbxJ;8^{Ylgs_eP2|02N_F4Pp_a;`)l97 zeVF@IW;@+naDp7VyKAZ@ZFWv^qN}p^-67vanSI5M_kRYtNxks16S~$2g221Plk6T~ zuI~D-WbA0>fEaK3UB&O$fgNh zqCuTS!;M6Qz%a*ATAyK^%Hk4ekrRWE1Y(JaB4bnz?sd9{8x`?9jtr@{ZegSVs-QlK z1pS)4jSSfb^tr_+9NX`V($3K&v)J%Hi*Nu4>>Lbe7m%y& zC|g1qcoXU&Ai${zeiD{uR_VqsvsP75$-}q2w1vIVwf(d;)rZTWbBx41Q8$i_s~5FL z*B+6?oVfgPW6DW@Z-u_;F|?IDym9pRdplrAy(S>7FzmwHtnHEEwe17V>YPj>3+3>0 zF6ZS_205#g95=V+yo;ak`xrXCh%&FFq;Hwrwl60W^dp+SOCYiJIWJ7W)=^@pblNK_ zg8UPD$nD{sk3>regvppi_Aio%o#EGW$UbXEhg;nTZB7}wJ5WipvtwuF<>&tugtnLo zIy2WZ)8+Bu+bOznFBLzc9{|xNVV{j7F-bz<_Uh|pud}|6P;Ee<60!hHx~(JcL?c$O zI`8g9I5<;+F!e^j;f%Al+AxFXlf}~q02C^jzqHE=j{-Om?iawKl3xL&w0Ch79O(&- zz}zakG@oqwNt4+yT*T8(Ao2m|-*O|u+_Oz|Q}kE=)|GR9qw897-U0Z?=P#DeHerAU zPtUhe^)5OO_y7?Y9ep(F>f14X)|j-qeV!Rb4JvbPAL3z~9>-wJF~oUJ?%>}jv1{7& z%pfrvWI?N@I#{$_miJAzt%$C+b^MDPv^0txJ)zre3>xL$eu~5+k1P(}Asim{$7_3K zpAeFz;8)5pjX%Lz3hke_U>q#T2cNH4eXmzY6MvsoE>a3dwPjD|_9X0$NC(sE@JN)F z8`x}6Sho(7-1SZrKCp9MkJQAnMxKxlcE*C#+)ApW66%mweOgOqwh9Tt0{9svvZ<2A zm-9HNkXT;D~z0ruuZOor>rZr=!_`3@qFHIF; z!M9r44SvMPdEfDxlfwH}VXb^{Sd!UaKkd--jvLB}Xi3 z{7xG+&H-?XXb_0sdQ2D{wpEx|!szZ=9P^^;@xI%NAac1Q6xrzF^>AO)5(DMVH%q@u zc0s!mxQ3-LHT;>IY5@WfLWJhgx^8wB5HdgFpw!Q?6b$+gU4=Z#_6$5xTU2`HP?Md8Ch#> zla-TsNqZQe@O}}#9O$U2H!oG3!lxXZeeWU zwnO|vr(K)^GeDL7JV~2GHZqH`atnXzDvM-Hu-TJn5 z&3g;Wt?7MF;{7GUhmkB~Qnzo_tx_)i;;rVut7=nKY4d#+bnVoKrRUvkh51I}3r+cR zwEOL87Px23rTL`b*oTL&X0CR6OJc37_ZSz*c*?5|t7AvPel zjKG!deM$Ax3Ky=@EoU29rjOnC@$(91t7J{GsKr;C)h%;}=KHMzW#%~9@q_i%YlIg= zf=W7VWkH_#O^B7U6Y++X=a#&r^p-?XGVf7yZ*9>krYomeI~XDBs4YpVxY`f6FeEf@ zcEux?lxGUE#m?mEF>2<#^>l{LHbm`O@IuDOYl`RkxIE`-O}tK(?fdOv%Bzg~BTcB8 z=Oct|!5!b#fk&UPX1iJ2LJW09cy)zD;z9NTN~ze|XBU!tPbEbBpwD70OID^NwZ&x= zH@aNrtwsk#`EB8Id%-}dtP0=%aCexj?5@b;`w z^{3lKwhnEeN%l(0h^dptV%cLmv-YvLrOoL4ceMpNq}$T4yEHCqa;R6yvtPxhYOU8N z1;{biCuUSn@46lvnrvD!?>B9;txPiip!X@&+e!vGqAGh@jtM`(7*DWn30U-D>^c$6AFy;Xr2qf` literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/default_logos/RA_vertical_solution_PP.png b/modules/paypal/views/img/default_logos/RA_vertical_solution_PP.png new file mode 100644 index 0000000000000000000000000000000000000000..dbdaf65e890d9f65f29b3cc76171dfe72df9fa9c GIT binary patch literal 16941 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/default_logos/RE_vertical_solution_PP.png b/modules/paypal/views/img/default_logos/RE_vertical_solution_PP.png new file mode 100644 index 0000000000000000000000000000000000000000..dbdaf65e890d9f65f29b3cc76171dfe72df9fa9c GIT binary patch literal 16941 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/default_logos/default_vertical.png b/modules/paypal/views/img/default_logos/default_vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..ee99c0308f86628adbc4c95212aada1e7dbc1ece GIT binary patch literal 24518 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ξ2$5N@jh>VY|tKU zeQRQ2QxCbH7-~t~LoXgPEgftXxC`ym^sp}%QhsNMSnb$|2Hve78zw$!t=HapQXqs_ zbaKtx8Nyg>ZPRLrwh8OL8r+Tc5iK1`qSq4uxE>k|V^wt*Qij108`Dl3#uP#X@hjS2 zgF>pB=L+2%Qu}DJI56&B!>a4QhPvNL2sGk0=U5V`_9?Uw1oSV#c&ly8jh-~t&lJAb z-i4+FLM!wJ9mv-Wt%Get?ae8XO*XA}>Y%|5GiM{y5{(CaqIidL|n3eD7N)ndVF;VaGS z=W95Q2qOo>!PE>OM1%o_!AKPV&80W|u7zkF`raH=t!KKU0J}R)cdbuhtl?s&5bb}v z=*p%g2mb%|&OAo0BfsyTs`p;sJv}Ff98$awQKBU3UQ4UZTDvP_qlIPoiV-hhBuHZ9 zj|2&&fqfqU02^dUL_t&%z<&hDe?b8MV+V;hfPq|y*M=R#&L**yti2mc_O92mElLzc zN*vyt;W2mL-S4Q%AN9KDbx-$9_e_sSZu$!hId9&3RrRXsSM~eV?>ZW9a_UONQ6h!b zIx_bnys^;Di5#`~R+#4-36fcV11(zJv$Tks2{yj0K_~%Qil#AgbMgv|?m!r#(9Qm6 zn5Ra{4DXA`eJz?As<7Wp%|e3K0;!9k`&6{o22BtT%aN=$gJ@D<4VEaX)qsEejq5Dk zbWrZ@>_WSZm!C@VU;p*~aFTfV@&I+~2wvdhSiKE{M&pI!?SzD}UAS7~IH5PB-+@ip zW;aLM*Sr=2$F?BwNqQe4_1g9d|BSFZR)>nMhI?=VX%&x9=vwYt*w;Zg9|m*Y3I31_9W@ zADCFLF=25`9&V37`P5an(c7;5ROnCz#4K}C?l;97pU{^F*KIFo%MF0XCMP#rtj$=yfjjg2DM{voQ!(Pw#I9LEpsI4S`;F`gCN#Xts!KlUS>H z2iJF~S_uMeVWCV^!kr@Qs|JB9r3jRdv@BE*v~-2EEHl}Z0%?)Y7dUr$ft7rPdYEeW z@uO2rPh>eTJ=QD_A;Rb+#xqZ0f)A)5Kw8Ef)tsD1PJXmTE7fxRDWpUPL3q@uThawX zC@UyI5a_1-AUhmIcZ3Mol?dVk6iWukKJAkAss?nl!$mj{{q=$gnkJA^V_QDCM3v(+ zcZu5`LaYzc@_dG3HN^rGRO?PSei6Zb#|Vi+YkZ|}EDK+?E+~#=naQk-N8R=LWxo5~ zEO!=)1VKQc0t)3Sr;kpvKO~AkDTG{)yy2;aNKdn#KyBP}Rrs!LSp*?bSVB_seJWKS z%M!$6HkNGNGovXjMA+tDAW*v?SPvGDgzZz5*Hl{IW8ny|XVyj|a6@)!a%7D|dlvYS zGgo=)_#DTkJ|!JrPyBvk`8fAhC%JI#0RR2MbFADQ!K>Q{G%+z)vv3W#-bRBsFY>o? zrN*!S{`(|TXh_&OZcgq6=Gw z^>FK9l9HH2DF{LVz==szpsCdZF5FyXX{E&9`{Ls~d3-NY2o4>{@sIxYE4ZG|wVU_( z)!+Pce*VoDICFd&*Z2A5|MU)LpFGUtN2i$>N%3pn{J*RfDk!B$CSrW$wKKf&(qaDd zxBiN2b1P`AP3BpxIk<0(pM3op{@riC%i?m0x%+FJpS{DEUOj`iw#e1Hd9L3xIYUNA zQoM5Z2(O$yOfDTG=2&>XG8%jVF~`IW)=J~~%3Sx`U&^B=-e|K_5V{eOvbQ6(0ogt^ z@&mL-=2o<(3*IJLQfam73^W3Ni;qpkUEX}*9KY~mf6UC}5}8B=yUUlyq-k%$ae3{@ zk9aJ1gFpDeOZ@S<=efN!1z_Y1G=7_`V_d3&E(9C)g%w5}QGS!R_rq+U4c6UUgXag_ zm@kk@#Tn0K7)d4ZOtJ>j@ffxgtStL1t(Ga3D%9&PuCG{HD^sl0xpI4%S-r^8TA9D| z*7GdoYkYcpmA^Q5jn|&u&sw2MzFcQwY=po2)*1ff+${5JsKP8sI2lp^%RYhiN=;4RrKh{{T&ofn{AXfTxkO)%dDhfG6E@?yBu5X7F*TZGr63TVrg4(w`vK*uOQBqE zw!1Ml65a8;bkjqw6Ix}*{;(PGL^bnUW9K`CiZ~fHjK~HST|t7DEh=3N1Uh0~AT$Z# z;wTd+IUdwV1ZI#d9gt1C9GqC=Z;o9{Y_Fux|6**qKMESlxQfl-qW`hcqO z%=B&Ue`tb$DX~tN1t;6o4QK>a;w?nmFx?1Rbj{&%v4v@a5SodUMX^+6DPLtzxz5B$ z9Hq=I;(C6Qr~{?VkJf0V$t5gS3LbYC3lvIK{_Sslui1iRB8CbVj(E&wW_knz!Kc}9|BvYiJCmbw4xqP zl{ktTl6bg^)sW1Eb9;mWU)C4+8{S0#ZYQ(MC9?oT4cRS z8S=Nw=B7;#K2r2v?&Letz;YqSc`+Q1fx!=ws0a$ua5 zQkA8(66JCoOA7W*X4pHKCgBKutRdHA+eg*rd=^SrUH+td>M%$mP9daDi=ofvP6JwDLmi8 zu>+Kn_`$l6ZV8Pg4XZIZn&oS+o@@%)u5aO3>zejAoWPj;^#m`Fk*@4S9isJjY4`A46x~iu9wnJVNSf(LH-WZn zN_mS!Ah6Nlgq0n;z(e36@o^|cs>$ZeidW5OYJCLF9$69C5!Sz$w?ca&jU5V;4Zg)qQd4^!$T@5IS58JA^UnWGx(YIMSDq z1V9b6l=+~KWIHvw9o*~*P1&;T9{MOku7v_T0@~=7WQZ#kKNsm2yE~b@@|a?Ff$y!y-K~3y^EdK*@bOKaIkAVAo}6iUM+ghciQ&7QLv>2aK}xHo z%+~uhQra!|8)X6no}vCm9hMU_$Gnj-e(&QuT)4WxmtH)|q5YHCwgp-@%WN;Jy$)gc z#E$Lj85;;{uoz4*w5`zfBYIKHXtZ$AC#F%df)lTkO={`~T-2CCCLj^lWcLNc6E&QK zB#{v45i^h~UPHxO30DY+CAO$lLw01N$YYJKnJlS+MjWm)Q3c!euxbkVY@TWzoVgsb zC=o@Md|i;J)=3;MVH9`~<%pC>JF;`AfSRYsm+RDh)p9R)5dw;3 z7vB%{6GC8FkWM5}TI2dYzHe4&6=*C=V%rw!q(cyB>UE#GS4V|%SvqM}?{aayucQ>j zoq%LAPN`CF9^0xwlTOFjGdaTeXoh&q!SxlM7vM$0{il*(+ZMLfN|+7D!cCnrcVs;q zor62WfOd*T8m-3fy`q=1V}X-OaO$6Y8zPahJI&W-zLy7Na3%!gazJi9749*hSZv68 z4S_E}2(_`D;q_Xf%)5VmmG>{ru~w{-iaY$`&%8u35##sYxytOd+XR6^O36q%$_SPydKYJY87F@o1hflBE zHHm1vfH%MJI42HGapbY74d0fwb(pqoH&*(_iO9~~47NuU+HaaFXzhm{bmm}F_jTsh zDWzvSdUv`kmB6+kne3wpp8+x%5SB*kAnYq}B&3|SzKSRb&YYOx)#s04YsJ6$=AUx; z<{~E#P4bIxogoO!5zy?dWxnw{?{V{99^100);wI#<0rrT1X{tlPv*IDZH{vJB>(ff z=kWr`$s;rT{2QmJx`J%d!jhVo9-pS_3O>BL$nE>9e01|ZKN_|rolY^cXOyqMaf(>X zqEhpjy|oI!t4~bx`qO*yd`-R*@Vnprgqw>lN)~wXXj_hQFvfvl4vm3BgnUYv=X@s^ z$WEd4PNe>=-`T1Y110(7_F=BgO_55v%uKCv`mq}T)a&57kTnYE=5;1xi0E#9KLGo3 z^JFqmsX)1wWTCi^17kPHW|Xnv(`Ln=TRTi9R$w&Ms=O0oy^eN>CfgAC)()&h<2sv3 zGBcUx*xodrACSu?DAYB#mTTP0FY?~|SMh^@O4SRUh%{OnlZ~;_6i*$WVy)yeduzGr zBjI`hnM{KH(>c;fheX_X;LY7H@_&ACg|$MBV#UP^6v?5}#hX$4b7&;!26>=?Mar-ekA#(ZH`?=)sjbV3}gK(4EDqdk%M($GLdp0N3yC zAr-GvswSBkUt}azp-@S(nopu+&0Lq0tQL|?i8}We~z_v8ns*z2W2g<(r!Fu0T>pt`M3oPbq zq~aDqTenL~5_fE}sW^34VsCQXZAr+NJ?<`-nZ32dR4(1ZjyGO)Y>Py^^EA1;RAz3W z#J%MTNk}rwO;tI0@E+Hfj&o&h zFPUVW@sSc2ukYuX6E`VT$5<^-;QBU~Z|E@}2Kpz_KJ`BdMMy!s{;`<-(N(E?&FC zKmV0$0DS#xFLLt0I3IrO@Gt-UcStAWNGXXqy^ZZN$42?!(ma3p;XLOr-5`~WGci7j zkP;^z!>dO##R`aLphKjR?V@##G%R&@&b0`w^?SgJ{k~ZHvtPzN_v<9z`WHKH#O4qP zT>R=kZ8?1c`0LqItd_D^GT`j7D<;gymI#(oKbNx8ce9B0Wp*7A(jP;~?9u7^^pnG45` z*<=znLI|pEK&|FAgQy8hl5mWM*AD`eYS=Jos#TL6HJ43LsZ|LAL+lMdjBGkQ=B>IA zXuQBf2ykLC(lJ5R11Ti7EwO}8%!yNTeQIt%Jmz3YsJNPns}OF9cruACC6*M#9k3k- z5qf3&*f=8Ku=D4nt7K&`}aw__DkD&{qkVgr|9`|G_CHSpxe~SA@)x$ zGMURGg(jCS8CO*aiI|5SpX*wjB?BB=ar)3L#xf;hwvW<+WBcx)+U$qMQh8jz%6QJm z5b;>RXr|0zVOWgGOcC3jXL_Q_p0PF3X@%@I-i=uv#!6~m;e~*7!X};QJ}jA}B$Mps zXR!XBB?Ostj7;dtn@+?K!a{avTs&sp3qsAcv}}~`5sw=}G{?0@IhabsNJY-WV==*q z7Kp$o1FTy19#vfOj=oo{Ny#;iO zDYSQNWy9ZW8*Douox0cIjaEE1b-($$6uRZQ6)uykvv9d|iClX9I-OeN@V>>(E7K;P z2)eO$4q%%Hh=c>(43@RE!;Td($FZWCb^&%nW8KW%ZR(V06DBC~yc7cI#MZ-|4$BfqOEiNn^xG~I!Oz`b%HI*2&L`8K%{sAqE3*d-Ep;sc)ih3F(ah$HCsfi)V5JTFRyfY#-@zzQlI?%I*^xT6wck~$mohg;LNAeEsi$Yvwqwh7hs54-e{L6p zsd2NUHxJy*BgC#*F2X*Q2pNH`@6i%Zz&V?F<9bXh#~d%l@+u z1X^PfPM z;`ByW-|b>3Xb2Y_^;CiJgbIX%U1P5%Bu>n4S=p+pj)AH~(oXE^J@7 zc0PnBA`d?z{kh}*YbT68+VC(0E@;;(c6Kh=yo6SC{;2JIYNu9+miyfVaNXt^-t!(# z_touTA+)W=X8Q*R(Q$upU%PX6*ZvIxu}vJNh|)@E6-M6{5&cyU-O|nn3c1ND(|Q2r*y|=#M)kc z>vPRP(rr_#k9H0kqKmn?8MbzPMX$s>XqLH8g#9a;i>wR@0u;7!$fCC<_RT&C-LRVv z?dl;iu}$~&KG`}M8FoR}fNJf}(engu>~344p9$Rfb^&^Wv0y8!sUMP^V;$WLI(u9Y z`lx5{ZO8QU%M zL89k&ZYEE4EqH*~%xt7T0epK-Ms4n)W@ixV&-D!5`wp-R=x1fy&KbBEv|H{E5q4{j z+)%C{oMT3&5PIuSJblX)>#v2$MZztsDWpBrn$kAxH2U=r4-o`f2t@msYM<6=zV(#v z|46pEvaeSzvZ)}^F|i#D_Yfia=}+Aw zO*}kf(sJC~Y) +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/views/img/index.php b/modules/paypal/views/img/index.php new file mode 100644 index 000000000..5a686929c --- /dev/null +++ b/modules/paypal/views/img/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2018 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/paypal/views/img/logos/BRAINTREE.png b/modules/paypal/views/img/logos/BRAINTREE.png new file mode 100644 index 0000000000000000000000000000000000000000..d443a20b0fa5bb979cec27d91e28c52fe6cdff60 GIT binary patch literal 3088 zcmaJ@c{r4N8y@?RvLsuonIVx`F~dw`7d0bmiXpF=k-;p@41-9RgrbsVsDzN5RF)(T zLTKS+OAg9X(q^e?(L&$oROkES>wB+v`906|-1oEHf4nKKF56ZrXe)p~pq0)}_U_{E z8S$e9mKDEmwQtj3Hh2!Zc^<4F9v|S)KsHoXAPwTo0QS+`X#h29{~ekI2qdLP_uS3f zO(GH~ECv!-jzLB;*kUvYWMLJ_1}LF49wd;qkIuA&%{4T`AatrF%o|HWlh}5&V7gN@ zhvpIO;z@}PrQoSBtE~`=NP?JvLE{0CNJbcwONg|Dedi^J&&zHU4DvmM7itOnr>NZ| zSBM>pLxW(ECI|`|gMr|1NQ@~Khr_@j#%PQ&3N5~I2#hHKiz67DL4I5?aW)P$h~RGT z_#>CtvV;Zmcx(a+#pm;pd=n&#vk!&ANP71cDpI6QX%ALk#g>xw4#Rcgur(zTAI5dFA;&`%HVLzwn8qDIcxWOzo#Lfc;F(3gH zI&;}!_#Hta5uBM^9>Ao~ob4@PVh$voP9-?n*_dOoW_Tob7EqBZpu6 z%CS8iG!OD~bP7)yfSr!GX5!qXrIRYrl8FhacOi+%?vCvV3hJpvl7Vw&y2lENjB6|7 zolfZcohSmULR2#S4_nXv^(}`r#eWn#_b483a>q(U`p|ei_FGeqHC&yWdQqs5D!FcC zFFA8?BnhoNRUtTXbWcHmVM%hub%{c&yK7Umka$J!3}yYHu+T%wP@Vl3J$4(w?nXIl zS~(dcT6TBls~b+PjLf}yj(t;dDFPhlt&*fM`F?wRiazjFJ8);SL8^AT*5$nW^;6(( z@Dm{2SYaZ1N9xD@IN=NRpy&`JaCBGd(dsG+rasO@*?tM z_c+x;lZnk1X1$t7IMItJJTbH2d$=dx^$7deycF~vC7mQcy`sN4ZQgQX-#LBLw(%=6 zg+RoC8q|uJ_3b{I&6B<)Fd6agy)IB%c>FC`4K_camZk4G*mWsy#J|<8ZI2h{Z(sj? zn{550^QobDoq=8(i4v_kWqRA`k9cY|FC8|k zHvW)B zp7d*u+3!_NN|0O1)?dAjt5tlx1D?^R_?{0_%@2NYC z=c?Rf?0jgY_k4zw{0rz+_6bJ)f0AB}Ds)7)-3%k1;gcmQbm;~)dsp0BAjc^JwfA)H zL&G8foLpCvTRMeOmx?~15Z3qE)@Z=ttfAn6&la2+7gUmgzp4q-C$*de}ZeG#M zl%RS(2CRMw`uT;?HSN*M?r~T(Z(r}#K?~;6yRIv#S`|1r-Rx-=W z=TPgBFNX?QgE3=;f7*$x8lQuRE!#EZAJXB2aO`|=4t`w=@KlSexdz@PU9E2`nrJeZ zESSSptTGuiO76NqY20pDwipOBjs(t@uuT)2D}sgQ-^d2ViR$r;jbFdDr1&$uZY9+_ z#PmtWFavOMYcY>DT37Z4n!iXxYjhwth>&wd4;mBX9Jq>IrO#?)ePD{*OJ7R7EJu}^ z^+-<@q^j}gBe}y35rM0!5na!$*`JjkcZigM5*@&Cr}g=%hPoXMEkh}#xqKB~;Zco6uTN*jvm=#Ww2Z0JOfNI46!1HB-xZ?2@}T%S9ygC-AP#;DR~ zO?IAtQZ_<5I)0A-CZ3i-4w=+e=C!j|lVhe5TOR~KUxaNjaPhKWeu`KzfkjW~n71>X zyV~*yAMCI|kgreE-c5IF+ZL}pzp7N>@5=wH()?p>w!vQM1%|i0M8QB_3Av^?MSDmS z`KYA#75L%-;ATED$PM55X+JS_@sDe_{qD>Yoc9mHU-k&QRiHOg6&6o? zP4Th_S`d_ag{i#}_HV^75lT6&X(x;1FFoq5Qr3-;Moz(B{Wp$`$lgt?$a0`X+~n{Up$qvb~{-Iq6H`cXqZ3L)NVk zBq^le54Y#N-?}~64cKELxAK(>w#%?!-CziyCF>)ITG6Lf`o1_MugX^E!0DCEz7DUA z9Q@rbq$hu!)@~y8RLRG}V?8C~Ub{(lMAbQi_ece{!IF`ZJz(h3`@AdJ$9)B(yVT?g zhNtO4v?@x|EKt9$_taZ_2XyMDo5!YB(&iL{=jM8r9>pR06kS*z9uAEuvmlMk$?6&~ ztg_gMXF95si=Hi~hfG}1-i~;KmkuWtvvw6&4I565wRcNazhf^&H5g~impM^**5?3> zOFsAI<(%n-EbiO#9z;pjA7?j(Hbw2`TiSY)hCW%$_I%DQ#b{5vTG@=f5Qg$ANJiO7 zA+kXVbf7ZDy!vbAhs*heR}R^PH!RA|$xKsA>(>;A7q^=dU^?DD+qd(>(bnZhQQ1Ma zPs!A%Sr4hE1SKB~skgrr{pC(T^7_bGh3B{OfYiv#6qV@3;quzf8#4(b88T3yUKZU; zrf%fbOT?||$I6AZbO*GSs+Bz$UVm^G=*XG0l!GsYsQhY(mYY&%R7q!PjjV}MAIHL? z^W#Y=9htNX#b3%q_g|Gv1wfjYDAuA%VYaQVy<+HXb>vO*z)|{QJACV|oxyJ>ZnFq^ zrQ@$k_}4y)t~y?6^m|UJumVO^0t7E*kG7P4beN|0J$CHk&E4z^uab^{o5rl>IOPry zb%;&(Y@~Z35BJ}HZg%9n)|=$=+BU@~hrNsAsO+|uH|w4p0PE$o#-#)t{1jk3HO`gx z-I$(9R9@Ri)CrLaj*nqj*$#D$&5tVN>6gFPu#2m;peccKv?-@Wb6dO}NCD-4e#m~5 z5WZhp_0h?o@`Mks_c0T4$6i+}Ek$`~EYM4!nq5Xa1otC3qSSAwYeI#LCA9$1=3Q^6 U!&3?dm;ce79bD`$+Xf{32Xdt8!d8-6*6qM+8Y)D9w6niB+61QbI-!_;KuvS}+(Nl`fnq-4##>hjQ1ak&oK zftBepT}&-?TM3$_sfli-c2F#9`ISk_oNKH1!@kwNKfb=__x|4ZIb7Fu-}if8zh_-& z2#wA!1KfcdYk}ETieP)>wyN{5hf)S=*V`Vs4P7C_J}lhUeCPKzX7zwEtD$E0#pBmk zgEy?B&D5`m-Kjp+ko|=`^!2^{(35kMau5Fn(wi4>_fiBY_2y%w3wnXr7 z9KM2Y`ueX`O8E(?0tGH!kR%i{@zX!H;c>!5CO+CHf)pWT3zCK0ESX?a)`qBrtkeX0 zB7SWE&R@w;ilicef{#;*(!_Fxl8NUhO5z0!(|ms06OVfXQKT~Qf%6Br`Iu~pOn~zt zdJz&xWHOFQC6c{;s8q5CjzS_+JV~a9N+5ePe5eeHFYfPwH${^r?qF=>g!~=Lv|{3u z6$&ZC(=#(OlbGp6l*p1i$#gn>UV}m*m=FZ{F0q2IB#7lMZxuKKd4fzRRR|?w+`J+` zUb0ic#G5kxPYELFJ6W-u_@*3Uf<)x0b1`FIl3H$de^f9D5TL=N7?F5Q^tF z*1TavL@+|das^+UAPD6!@g@zTP?*RdvAsfqIkX^7FvXWl4)&r4`;gddUmBYl6ckJk zqQ2#FBndl30kGstzspRb=tN| z7k~Qkht`(n3+I~}8@|_^`>ww3Z0(tEYpPFIojUoA`o!^LM=L9i96ogL>+%C%m8nWg ziuZrHuc)vffA1H0xjEqH*`Mv%owZAunXywLm!(T3Vo_RZiZD58hafQ_o*%b;+oxM& zV?Nmuz4_y)O&dSrMQ(@)4_hC~U1w@AJ1CH~Hh}5x$Dq@EsXpFb6f((^Nbva3eT|#z z>QyUU@Xk1=70Z_`b#$;_ve<6X2MZV2+E`;TR+eZBbCekp0fzyA^B+jldoADrn8y5# z2cRJB2`SgZv9zm7)}6*Uq5oE~zCPyMa9u{vR92foqYNij_CIRM>U&B-*&N%m;oR-% zxu3H8r~iaL!!8fOpk3*OMf<+oUtChED*Ng{`Pb!GU=au7>PPoee{=Fw)#>V*Z_m`8 zt*fsqWaI_W0lxrdOY09m{&ewDn^xD}ak;Y-+r_qVWd>aD*AEQ-{L77-15P8iMph4v z>QUqO?u|81Jg{LiTxk!UPLDa+d(FJ?T8O-B9HgP)5Mbt^=4&fq3*a=4+oL`X!TYTQ9Z`m90cCz?^m1LfWXkDzW*zF4erDy4i-{9i!2t=SM(@ z1>A#fA8iB!VJ_^drhJzjmOI9z+`SHn^Sp3rL=}mBT_RS zaIKfxyBXrXQkSM@VrNJy@G{pftiE%<^6MBlQ23d`FAdAeO`^?A$;mGFF}AqXQK;B) zb}oiMu{8#&6>!Yy&VVpp1qiD$qk+=&Jn<7tvtUjktHZo_jFvn{_{c@-Q^Tu2Vl-$2 zG3F}*looO7*ygUg0LwQOzPAAB9dWp@Zg^xa`PHSMI32uW$bm@N(`OIXm;o_1y~z&| zS06f{hc9T&_x$lO2oMY7Vqq&i3`@{$7xyk@u&V$Tf6!w|9+rZ%g%FnBh0++fn*jjL z?GLK}g@+mdkxsKirh|BsLD2Rf4E3n>&;q1dl)*yUi<-*J?7GxtsU8#M1D1C7EudIq zXPaxWO3MSWd4Y$V?Y6nBPaqeD7;38vQ#y#3N!Nn$J6b$DU0*% z?G3qz6b2YrfoM6Ci?psA-ipN~8d%oYIh7WRzpM{3^JsTJViU3WWrF#J7`+aQ;{m!- z4^Ud4jY>o5kgkd&0wOXR=um@?$#0RXzrcRSi8g4!MDaevsliXb+PE(qZzRpaYJv;URxJ%uITyGUy?Ek&o|W3kNQi=0 zsCz!GI#^qob9ulBZ5~}T*dzC0J|XF_ZPU_rz_*2@JA}QX4t$0V*W{r;!05HpCXX|R zKJX@Kr+qO%b;2TaK7mLJ4d5~?HyWe5#(o^a1 zsWTT-K_URNt}8e~&+hngtwHy+o!f={t;7Kqu7;gFpZga~uiD`sD9chU4=A1DnW-(_lmdcW1awU?oTvV2u zR-&jBS5Zlp7Hy&|-D>J8b?yFVEY-cwooD9Eyzl$_e((N0&m_CL*e_PnQ<9O9S?uUw z>yCT_$VYF10`jEY9qE&ikzWsacnQ6nw@{co4weD%0zs^Z!$<5gGS=%wd5QsDq zsV)hFx5VJd9!P14mK1Y5mS|2uR22M7fJm?u7>WX=Sc@MjS9T-}F&QBd5FlhjT!_nL zgD@41nafLh3=|0k45siu{g5oNBn#rd{jeDXD%yfT04#`jyk#Js%mf21KoSW6EC358 z$s*8_Nw73GXAvxk=DS^0-1|+^45_24f2aK|)3d z4TeEv3t&D&AY@Dj1LL;vkQqUy2bh%s(BIY$2jKt^!{=i{ctJc25)og7otw^CuMj*F z5fv>Ign`prin2yVI)uRu3PaMAuI=pN(iuTB(##%*KsM7(tZ~vUMx+_!v@{2`#{G+G z2K>_%fSj7qAy*4>rQyEcX^8OsRs^}o1__WmPcx=gEF+`X;b=?qV0TH5FXS(=Te3fT z-)oHpuCj~c)A;+=sbTM#c%&2+pjU`&Rn%>$zTq?wP-j?uzjLyLsr^-qGt%uG35HMa{;1 z{c)u|p$vmg)mqt4v1)Fi2tRyJC z4bahX+SJkWasDBcTZKV#Q*Rik2Bdt}@bws0%$4&-$&+ei105RuW#(f|#{c+s617-( z_4ZgwceH~_S&JjQApUX}o0^!iDWPXr-BTuhUw4NnE#+{qV@S=hwa%ts0j=Aq;v^SG4f2LiNHgll?@E-@7zNw(g8Vc>XXBBSAT z!tNL~;AH=>so$sEP<5lx8YPYV!Q%d*n7>w8^`IT@nlC7)RlA&)981+-ZFP7vtv|gj zMqht2{;G~Mt<1BjbkbN?o#=RKC+hGK=Rl~YaWmocmw6AvMOEHWJ2)!?4yTinz&Y)Dfs<}SsjQ0eljN$rFDVt}Vski2-CAknjonfjo=9&@b32dI z%``w?>_sL28WdW$WvzoaE8d|b-~HoQ;$s^ZO+!bhOra)0wgAU&{I&+NLA?p}Om~(B9qID1VuR=gO_}Lvj;!FU4tjH2cHQ0^oeeuD!cqm4@hq;=^O9a&Q2#KY{0CvJ(zW;bcCdfj!!AY7*_4vZ>;EGxB`9A z^bH3m|K~Y!Ozq=Zdhp&%301Vnp7TG|6E|76s^Z7W3WqhbLYu@NPmO3)(H?b*(v8M% zcZ`U%pS$H;vWz~lx+&&XU5+pPSqR>KWMbLhpZ@&qU_H}1bzfH)*6F1#@NkbfCDx%g zX^(d0;PufAz+<<5p>pPvT&iIeJ!M#V(OQQXmOoBj_Z&G)uXJAaV0g;2?J~P!m&SON zMh)An6-&~|nz=;Dj`v3UP<7i{4sP%8IrwlKe{qyu=wO_^au6j$nlDF->u)+&pnl~8 zsD2?sUiW0@cB>;qyjgmTif#*|T5QtWthK&P-|4K78z2UW0v!LyQ<- zxrDe;#aG;O=dR{vRfVXvO{Vwb%wqcB>azbum>#%tPb?uFTda`7+j9r@b7LLZb;$j; z+K%yNuWp6ZWp_tbrRO&m$7V#v9fUiqmX4ozx_ zYA-2w!|UWe!z$kkCMAy|4Q;Gk&|g(G@^e>SER1b9eNycWO6$5^zZ}r=S7E)+KwnO6 zd!O_AMd(ZKi`WBSSR%O?JGgQK5>Mw9oK{^ol$R~n_ra=u zSuQzXk?81{<$$%DewUM9#pU)rExsd5FB`4n+=$yTJX$45TM&6xl$YUpLOi-`TqQMu z$!aXF*#=gON5joPM8b!vR5>w3fA;zdf<=A|90$ZE*G_S!q(2H_L9txb3| z-?3QdPGDP{k4^2g^O2XyH_xQjGj|0~7(8x>Zs^Nya~gY4@J_2GtA5YYT1FDVF6OA1~@$^DJR^oBBEWE5kOU7N_>I z)HI8*2Zf(I6_>sH*nC!$(WSMy{S)qwqj#v;30b~HQ*u62zxYINb?FQri#mHnTI3rY z`Xh#sDR}QVzG3UK<588QuO<`AVtpmKk^oZDzyz)m^SDnh6dNCtkkqYQvGBNL@Y<9~ z>S*Ud`L2O%7&O*J3*iusVro(UhR$jDurDR{MvwG>R z@}a6d8bDnCF`8d4vFbbII=B<^IxPJ0{$U3ark9>sB)C4wv$1B)JMZX0I2vc; zyI}lYb&p>btOyM_UyFzB2jP5$fjZcan=sTaNCs9VbziWz{<1%G%C^Wqozi;0cpK&R zN6UM!^j7_y? zCwnK9=)Ljzw3=#N?R<4Nm0M|J{{ErAjV_M?HtiFieErwAVb%D7)t0pPt0tuXhaBx( KY|qgH;{Ok8(2r68 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/DE_de-pp-logo-150px.png b/modules/paypal/views/img/logos/DE_de-pp-logo-150px.png new file mode 100644 index 0000000000000000000000000000000000000000..898bf58920f39a07d8a23fdc8f594a1e2a7aa1de GIT binary patch literal 4457 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 CwDxoW literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/DE_pp_cc_mark_111x69.jpg b/modules/paypal/views/img/logos/DE_pp_cc_mark_111x69.jpg new file mode 100644 index 0000000000000000000000000000000000000000..956bb454d6ed2b70a3cb9ca03e3b83c7cbce3c4a GIT binary patch literal 11005 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 WWBsd%t&23ZQ|TW$ literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/DE_pp_cc_mark_37x23.jpg b/modules/paypal/views/img/logos/DE_pp_cc_mark_37x23.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8feb35cd4fe18dda96f604b16c9f4ac15456f75e GIT binary patch literal 6051 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 iPS~$aDNISdchA3d_fn?9C_XTs@Az+hs~4aE literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/FR_logo_paypal_moyens_paiement_fr.jpg b/modules/paypal/views/img/logos/FR_logo_paypal_moyens_paiement_fr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c42d3f318f2b9083ea7f7d7b5a27ce0c9f5e69c GIT binary patch literal 11105 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 WWBsd%t&23ZQ|TW$ literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/FR_pp_cc_mark_37x23.jpg b/modules/paypal/views/img/logos/FR_pp_cc_mark_37x23.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8feb35cd4fe18dda96f604b16c9f4ac15456f75e GIT binary patch literal 6051 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 iPS~$aDNISdchA3d_fn?9C_XTs@Az+hs~4aE literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/US_PayPal_logo_100x45.gif b/modules/paypal/views/img/logos/US_PayPal_logo_100x45.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f9ff8bc7d0880076350ace8b166a1e444d206d8 GIT binary patch literal 1380 zcmV-q1)KUuNk%w1VPpU;0OoQ4P-u%~jIrY8>?K2PGf#I*d8Al_t8IavexJVi`}{&& zf%y9S=Iru|o3cJ|o^h7A)Y{@-b(FTr+RxkP+2ibzp|^{v#e9yan6t~s(A)C%`QGE{ z+~w`@^Y+`|=b5Lw*WKivxX$wQ_RQJk>F@O4=kNLY`^C-Jw!qJ_#@OfW^NyXg?eFu= z)ZXy)_|x9$v%SpZ>+<&Z`F4qhR3d-TM3ethmVP@bs|6*p92l*y8Nu=k4a|@6g=m*5K;7 z%iHDb@}jT7?eg}+(&5+K<(jCx(AMA4*x`ny!mGg5@bdM)$kp%h^f6|a7B*!6|Nj60 z00000000000000000000000000000000000000000000000000A^8LW0043TEC2ui z0Av6y000O7fO3L^goTEOh>41ejE#zJUI9}@2b8`@up;w7! zJ?O^|0lZlcCzQLWq}u@x0w5glmgH3j0Vq)}h!v+tN@9iLm`I5-j)QYw;*eNkpqztO z2^cV-z(HuOcubZBxH!@mtfsvh#F+u09)Sugn@YlvNxb|e$YxDHI8t* zl52Ep6Q}hu1FaE~9-0#{e?SvH=7rH1Hf8p`p-CDh)32i>p{hZEf#(Mk{|DuZJG zD?@}pU_TGUp+h+dY6E1A7i5*ehV=~KN;fBX=F19_J^7dcUKrUGZ%A0gn@|6pw5HSP+9N2~1~R023`ULL3+03*9KN zgDVkc7Egp+0wEa*5? zqrpKP`QpL0tVB2f5CWtD6)y_B1wuU+926sU_{LL0s#Gwb#lgvx5yu+mFcogWME~|x z@U`@C^%ge-@PU01hr1z(XrGq@2J-7%|eyr4S58%S92w z0RcX@2o#446x4m&Epcbksv?^zw+XMSI3n6s6$Wm2JUetl=HY?Mv>^fEFrG>r6?B8f m(UOA_#|i*+4ge9DXZ}gvqL*&^>8Pi!`s%E=?t12d0028bKC({$ literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/US_PayPal_logo_150x65.gif b/modules/paypal/views/img/logos/US_PayPal_logo_150x65.gif new file mode 100644 index 0000000000000000000000000000000000000000..1e2a9546aa2eb2eec471e3281a685b2d3d78e41e GIT binary patch literal 1633 zcmcJ~jX#qK0KoC*c{Y1Bd1=(Lj7E;>ye*FEv&m^prRcatCeiNG>P&jk+ie!69k-BH zDvC*w*31&h!zdcHh~``u6IVyImb!Fh_vw$g-#_sE{MJQA1b>%O1~7pkH^6b_4!`u% z7K7Qz&JHyFwRWQ zn9p2pRoykPv#SMV%?aYVutd?ZiaW{sO4}bkt5tVv;D<+wYNc1YdmoJg|68teNDu(r z0NPjK>l1*oFivK$Xr$kIsxy1}Ar<=Ctf*_8>xTOMx>twV$CL-7SCl_|p+3~Vr}des z`N)Rrqi;U89eeoZUnwNY5g*SvnkzY;S^%*iv^Ao*q_o5Zi$sgEA$zNe%8M6C7*yUi z$N^JVZ(FzyLI92GCXL#9!S($%c(5Jr=xoQ699p;D);jfsqi^aTx%3MlXRX12CqDjR z*noKoAspqEt!2Q!vBoml50yDbiksI3Y1luCI?!>F4Fq~fL zp~kIu5uxxq=_Zrcgb&KtGepb)|KfmmZ0<@i^}y;Hk}}d3ZT^-Hen9Pf5Q@*JysYt; zXb;!9Zs$9%&^kNv=o7%6?=ebWJ{U2e2}zuXV_kQ0J{=itX}eXHbHPDHW=m4MyPm*~ zG^cT(JUYSd(#t5x;buVJ4$2$&yFv#MW4qijaUI#6&kgdY$8Gq=nB^uP9-bSWHaF=#)Ey)NG5WIg!MSi|zeH7FaE+Ms^kp1)V%1DzwR7qKcu z4R!+eB_}(gQMw!BkwZ>}9UrXtYq}z;EK6dq+fPI#qr!CwH7fdIazxdNQheCN^VXQP z`C)5CK-T%*xTr#oP*}`t7*1NZffB8Cf7_)r50>+Iy zG?BLfK*RPtk`lzlcp|sV^bphbu6k=*?U2Au9h1EPFbiQPyr&RF zbI%E^Ip&wnJS!ycK2RLIC575(P7S+XTT3-uqZCNu)LocG5d}Pjrp{>E6EdkauUUT0=nSfA@&DtpET3 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/US_PayPal_logo_80x35.gif b/modules/paypal/views/img/logos/US_PayPal_logo_80x35.gif new file mode 100644 index 0000000000000000000000000000000000000000..a94b479cf0b1e2c7d86195f40f1c925a10715fc0 GIT binary patch literal 1188 zcmV;V1Y7$@Nk%w1VNd`g0OoiAB|~mYd89sYo~X3N@bdNX_4u;J*fURe;_C3l&Dla+ zf&2XYSc9wHnz+l`&DrLDpT6$!^vv1i zi<`1a%jIrzR^>~`Q#?IOB z^!JjXwqJFXp}Ek-&Di|?{`mU*_4oRWs>NGzl8L9pgQLN}$kq1w`?DlUp1019owV8G?3J*} zX?~mN?(^H==f~CK`~3aB$JDUI*qW%kx5?XvrNa37`%Y$wahABHvBR6Gyt&KUa+bLH z`~0oK)_RPlztG>Jufev-+T!Nyt+~nA;_U10^32oS(%$KIiKLaIxZUOLZIiZ|wakB! zs-dpHv%SnQW|tN=WdHyF000000000000000000000000000000A^8LW004LZEC2ui z08juU000O7fOvv~goTEOh>41ejE#C4|l4c zcLlDm1*&(Eva+KUcDcH_0A3)on|CmE#Kpt{ArruicL>D+%Xa{~)OG+3%b0fp#@)mS z*@<^g#UaZN)zu}@wS~5ZwKLw{(4*~ycLBv1z;`FRWe7;PLJfi{0#XtvJV8K~28C-p z;FF**!HF-%#N44^rkgSu6r5}r$%euzJPwSt80A72fPOr7#b}ex&H-#tbam<1VAp^Q z#RT*lR%}C-d36N5ndPilv@N8AaIBZ%tHxX3hpo{hNE8yV`;`Btz+cQ zg<>85mPObVWY!%N(|Fyyst^@a3c6)* z2T;V+unY>jj6nhcshp(2E&=LXSGAqE;OSD5!XbAUmJ5A?EU*g-7gmu@4|ZW-j1Ew0S4Ve(Bu2~xG8m)6C`9N&B|JFV^os;9 z5O(1i)d2A1g*6liB@@qZr~(*4(dN`Bf#pI(ID$mUo>YRMLydlo>Sj)u+ttCv9X`Ni zpe{Bd0s(2fBx*+v{ZMm21cS)4BqB8EMoa*f)nP?u#S{_E2m=hTgG7kjp~ex@h_J%~ zz4pp#qcqxq%_t@qV1NmXj?w}S3CdLIyS~21$bN{J@a4MG000000000000000A^8LV00000EC2ui z03`qy000O7fB=GngoTEOh=K`=jE#Odrb6ge6K zj2Iz;*flUJwF-$Z70Yb@^24`M0*wdkdpbQ_haj3C`gElPLVg|WGu0fG3 z9>`s3P$Gj-K@_sth(lpUfD>s>1Td2)+Xf0h8bE15fky)mEy6Sq(qIjRvw~Oz*f60j zjchiF*;2{IV#2t#6ReCYF|J1gAb17A34ua_VF^0$Xdx`&OMp3sF}OG^A&M6alDS}D za#+xV&!9tpP7$C@3el)jKM>@gwd>cd$JBuVySDAtf)?oB&AYen-@gSN7*4#n@#Dym q3u3^$x%21HqemB{pt|+z*t2WbE~tR_@8H9WA3r{k`SXYZ0RTJP=(0Ef literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/US_PayPal_mark_50x34.gif b/modules/paypal/views/img/logos/US_PayPal_mark_50x34.gif new file mode 100644 index 0000000000000000000000000000000000000000..9640eb0b54dbf615dfe6c7e6753b680b1e3bed2e GIT binary patch literal 1050 zcmV+#1m*ijNk%w1VKM+A0OkMy|CuxY|Nk2{WHV-${N}v;=f3;mvHRq<{`l?tf2_Csc?Lbn5(voqqB^p zy2Zu9%g@W0t-Nr4lVWm=zQn*(Wr1djs*IAFzsb+o)Wzc6)26q=vb?_W<<0Qo$;HCD z;@QSbc%bCp&PG{!RAhd#ySn1r&5f3(#>d9R!M2#Jy1v7{aDJA{&Bo;5((m8Ff0?bR zsi(5Q$SFc>@#xcXkg2z|u(!0X)6d6@l%JoevwxhmjFFeV$H&CJuvvhle~O;s*~xx~ zme|+JbCa)rg^#JOwYIXTVsVMS$jjl@zc)^FH%)W$?cl}3y}rf6A^8LV00000EC2ui z05Sj}000O7fB=GngoTEOh>3;)jE#6&VY*;#ZZjc=i(AOS1<_Tz(GmFAwPsPgkhqF3KcMZC{Zya2Z$U(V6qqxg~pPL zM)CwPVkE^05Hv2*0Ks%5hZ_xJaEP(ep+l$wesHMKP|d|49C84Sg7M;sAQwrJbjnr0 z4HIMkqMAU{0Y=n@Cag3Ra^fqAH)gc}>CncbjsZG4DDL2Nid6w4Wcb0u$Et^wMIc*A zQTAdFFDY7-1+ue;htnQLHfi{x$cnsASg&9>QH}VC0cVB6$aQ z6?J@(`m|hyG0i1T~ U>8GHEDk`Xolxpg!g#-csJI$U(s{jB1 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/US_PayPal_mark_60x38.gif b/modules/paypal/views/img/logos/US_PayPal_mark_60x38.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a5871650a7192df985c5435f75486f546c315a4 GIT binary patch literal 956 zcmV;t14H~rNk%w1VLSjP0M!5h|CuwDsI~m)!vFvOo3O(E`tkeYvS)UT8#ZM8?9BY> z#xY57{`czs^y4#Tm&eD%Mp=6O^4$II(f|DS`{uj<{rdj<_5c6={O7*=;ja7Sw*L6- z|Ni{@<+%Lo%E-gFw86;Z+sks2tc{kY*2KN7;nTTHcb>k* z!qd&bA^8LV00000EC2ui06YLD000L6K!9*aEELp zV5;y!E}PHjw0g}h3pwz(d`_?1@A$Z|!teY4fPsR8gndF2h>41ejE#55tzUx|-B^_P25v<>1S;%}1ZUB~ z!v-x)v_xkDMuUb9NMx*M??AWzmp&2bBPsOchz2?qbbEmFhCQ4Ca;S@et_F>BISe)s z5}~V7c_o4(C{bcXR}~@gAvh2L{Iv++mrrD;e&ToYZXdX}2>D?= zI0?bO%>a&$Id$DNZp2)1&II@F03=B8CPTk}<0KuRpLs&*_rN(l_~%~=k-ekBI|}M2 z#DFc#5TSl3=+i=ZE&Pz#fCK=B@SzL=1mMGk5>#eF3O|%6!wN25C`1A@)@b96I3}Q6 z3pw`aV~;|3Amorl7HQ-Rjmco-l1w%!q!0>3Ddm(@R{7NoRc5K>mQq5=C6_`m}aW!q(W%m>8GHED(a}DmTKy!LKvXxs;su^>Z`EED(kAL&T8we exV|bx2E6v_>#x8DE9|hu_PWHe$R@i)5CA*Ec=mMw literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/US_horizontal_solution_PPeCheck.gif b/modules/paypal/views/img/logos/US_horizontal_solution_PPeCheck.gif new file mode 100644 index 0000000000000000000000000000000000000000..55a93b4d7399f50ef9cf82481011bb316772f42a GIT binary patch literal 5015 zcmWlbc|6mN1INER?6A#7A*`n%N2n$xp$rj{qa>jkxk9BwAy3VHq)d_Aix7#q<(y+| zOifWjPa`~`G-r<4_xJohe|-LU|MU6l{d#>)SX&w#@z??!fIk56FaHA%0KWfRIpCM| zd3+vR7;NuigPV)siU6GFfz5}&t@Q$Dk6v$|tfI#2*8)ND7PvmonOYwFwSL0#_}*J@ z0l+u^Wg)ma3I68$hNL+{jt!1XEnUR!yIN}_&-|6N=ci^15`*D2joy<_tX&Qx#zdnJ9Z zb$*>iX1jR!N&knhOKDEv+MKxS^w8(w#UFF2&YFMf6MZ`7IfJXjj8CEQ`Hl};#r=UT zA7)ldZd22`@*4+q_v@T58M3XJ)_nOj@M(Pu`-6C_I_<-JTJ*)@Hx(9c zv~y8!#B&`Ut#h79wVI|^^-kUn?EY=)d@pxMDE?liUm|#vS=sXLo3fE#a%NH4&@V<= zTTe#tdFL}s_Lr$2zsjp?*Vi|-!dbQ+F`J?-vR|cg>WB4jeH}f0??1KkMrPJGL~E=J z>a8bxErKXF^B+`?nlUGn-*Ci#7I#19#lK=N<$5(vtfsaKl=4QH|18z_j)A3s>Mjx} zS^-6W#Q!#cqE+!!mH0=Kc(Ot~T_>I>0W$#LTpqZ!0g5-l<$u7XF>vt<_~(cCXLnB@ zZ)$3KbnNTfR#r@Ol(h7X2e0`U%r#S5{j;>E^2iI*-^TYt?7|_MgY8`M-O5TR_Qvre zgSvY~uT%-1g$GGaU>SlG_`0RMt0*LCYfC&aIhBssMprhd&^xmA6yU%6*b!|s62Co- zY|~v84ub=)!m|BgcI3yo)Ls&q|Hyw0U4 zLAI{KiiN}Y{faU>w5Psd*hx0LzinmhopC&|f?`2%uZh&(%U6Vde#FDHLBx^gx}Ey% zd%9K@*6v;@%eY>Ym8=%z)>XLgbfY`8>pH`y@&{ZW^k24*#eQC6v)KB6*Wqh(yAE#hoQdQ6&T%;IZqKfwNNO7P0`4I@WFOd^6gIv)$M0EXU+* zQoFg|c_-<(*z?rNT#ACH+KIbrW10j#wGe&Em50)Fw#j**>XFN?@ao7%2CFXT(p+RG z?7h#kE5|6>F74*BJ0~bTCN&<1I!z*$6JYm1hTbRr3%6esc(@S;t9{wd<{={3A+dX2~TOR1txwhJxDb%BfmIv<6lgZxE4n|Mg9^~cj&-c^7fDDld{MmLo$0iv1Tnf z;D+-64^uut8OKOZ5KdGY5OoQv5A_GE(Mb*3UxA=WWfo?#gOjYB8{sqWMD_B9nss@~ zB7L9(3NI<@KP0Rlo=O^$FdNQ4QWTh5yO4azGfjWN9`lm{9LSw4tA2;rtF37^KQnrX zr02E5p&ScX`APYfI5lia#tYl!4xoaBMf-22@ZY)L{k8I$8n<_K*em^l{sGCKOq$gW zO*&jQz{p9(`Qpy#>&{`>%DbGy9l?xq%CXqv!!CY1yWVHS9@TPYViJc0Jo&v83mHi& z@Bu2xP#$<{kd#fxuDBR8lv6rwvC)_JCY)dKz*=`sKjocbLKEFBIu?54ZjHGNVR?S@ zcdOE}h3whkO#b#0evJ3q4+zagGtPc#TBfm+1J-|~Xr;y}TyQubZxTA`p$!>7lTHx+ zD6SB1{H*^i-W2xa-Ip;6e@RpNo$RH&n^?aa1OY4qK*k?CtSM0C0211A92Vk$!|vU^ zi7@H}OVU*sxr4_*9Okr3h4CX9lQ>uc4iI3kQS zNP3}R*+BbiLl|d*<;sDp>RQi%g?KC5e3^7km%8CXf`jdZ)X|9qjo4^pb0|DNX$N~> z*uq09_PccPu(W;jM3SFvf#PRQw|?WoqoAY$;=fish9e7)LwMhnxEyKwq={r2_9Y2v z%`sD4q{rL7RFUU$EDaY^=t+~x>kZQOw23Frc`wxubGde5i%%KYLd_G_y{9u5Q(xIm zY3wPHwkHbGnBh}tkCyF_$1xaAwu#Wimiv4hs@ph4)r7&>SVS6 z9!)wfp(TLei4*A+qG?&kfa^fF$&c4a6A)3B5?zsyEVzlB_4 zE#>s^BjsXWfc6*1mU4!TY5QSeG-_)E3iWrCZpzz)QwNta2C{t)RUCPj62Fw5_dLe( zaPPq5u;qeXEq*#56Hs8LY)L$Veznm*Cv4;+%#@<=WDFm%qmv8e$2>iI z*;~89^0S>3#Ps5pKibQar?VCZpKy#bw4zEa5Ma0}MuMWB8Tt^=ZbD(fJ#TIFZ(obc zK2dhcjdh-s@FPN1CM8O34Kfg4MBApx#2hdN2EeuGdJ_-Y{msp90KS1GQU3d!uc1oT z>gwKbX_~eZRFQ>(mROvcMZ|ZOO`INC;(sm0!IDhUr9zKXJVc<$G(5T) zWD@dE9n-93>e02}>U-!T43-A;!jIz*Ch*WbYp+cz5i0^3?w(8MUxxLuhq6tj`?gD)@#_q{u^&jMLg>lHA z&}}DobP&jn3Ff~ic477ZY&gj}Y+hkQRA+98w*CE)}VJeDp+lTF57C^r;VT?ofpXm{dizU5<(6+cec5=5Ge7!q-6zk=%r-~#Y(CFlUC9abY=7(=D zFk=>&w@((MsT}yf0MrWwZ3Lq2yn$&S01SetQZcwyye7#5;edY3gg+KYK}{iCPv1JK z@5CL*R(&}5=Z*nW0s)}K1f&ZI#Rl{71~eqy0kvNcA4pOoXhxj&g!(d(dGrX?XdvGp zG2b9`m;#LOF~0zKhCIBDjL_y|uq5Cd3+SW6-je_iij)LDj73NJGo(uR7!$ztrB$MY zG`5t4ClLZcX7s5Y-p<|d(P=M|@aBj*p(iBCp6`GQ_K_hWd}FU3qCB4BppqEyB<7=h zlpE4RBGeObra_lb$p|J?la|cANk|i-f3Be;gJeSpNOkgEb%HXP6p^n-4+P+m06Ng& zU<3)3q^TA{L%Io)dtOCIjicWPQ%LJ6m~%KF2)D$*UZwyPp%jY(^pYT-f^b9tJ42G{ zpdocZ67C;9h6vyj1kisd08|K5mw%#sp5W-`ZLIR>%Nicazh|d@tKBDjP?KPJCDopW zvSg-#1iTFW?`>3=3>BtNy}H{024_5mQlLpeX}e|~BRnv8z}Gp*(~gurJq<_D?jTcO zM}_EXXnO7e7@Z1DrqI(OkTNKE!pxo+2ZhTF)b(=;XGv;$42V4N+>)Du8%LK5GZ^a` zMsmO~3HzP^3<0?J^h}5l+eO1;`2e4S-ATu7l5u8a+&+5P06pv@UD8lC^Tm0>{`6=l zB(T)u7+et0;^W;;CUoq{wx^=w9dbY+{9sVdc@jF40(H=UdRalwfa#A(gq%Edy2K60 z>^gAO4``zL;mObkQ~=LRhNYmM)1iBW=;?K|Y7jhz3RS0Bh(Bm;2=FKPSa~XxO2QoL zL|kH^LWHQ>Oe9E#L2QthS$Q4Y4D2|%f{?GGm|yVa@?Nz|i)py|gZZki1WP~fu|N1; zt6Qg@VOd3zRzO;RMmV%RUuOfZL34T*lyg!Zrq4h_NkFDBX`G8v0q&~^3X~IbHDFD=QhvZ>xeEcEuYh>6zK;MM=Rm!%=JV*4mhmtopE~`tZ^EzXR&^FtvzrbfrT>tXqSVl6{*H^G<+mV?uQ2?3x)8 zW^~*a0o05kk+NwQcdtQh;B8C*{tp2Y#HcIEstfF^W4JYJcS9!#Q0vz9RZV%X`#kmT zG&P*O%+PL-7)M_dHnBFFz=O?QZq1!a&FyY7oH@ipD%y~VD!kV?p4k}K)Z7+eHymL1 zDXV1+W7pT$1P8~_PUO}}x7O)Rg;T@XU9a_yDIyxQlB0Ps8SxoLc=-#Ox-f58CY1rIpJl1(k)JY+BnHhH- zcken9h+LzAaBgs>uqZlCaO zzwB=R=I+3;?rWm%AY#u=Ji4Et(XLAy7 zH*=E4IFCgfI*}VCf;GTot}em+Xp))D-0U%Ku87MZ_U0S+zI5*`3h#ZD-CNq+TUN&P zqi{__j_6<3uW|3I3-4>l?rUuBYj*Fu^3<{9 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/US_vertical_solution_PPeCheck.gif b/modules/paypal/views/img/logos/US_vertical_solution_PPeCheck.gif new file mode 100644 index 0000000000000000000000000000000000000000..eef2e61faf546dd625ebd5363c208c76352481f4 GIT binary patch literal 6122 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/default_PayPal_logo_150x65.gif b/modules/paypal/views/img/logos/default_PayPal_logo_150x65.gif new file mode 100644 index 0000000000000000000000000000000000000000..1e2a9546aa2eb2eec471e3281a685b2d3d78e41e GIT binary patch literal 1633 zcmcJ~jX#qK0KoC*c{Y1Bd1=(Lj7E;>ye*FEv&m^prRcatCeiNG>P&jk+ie!69k-BH zDvC*w*31&h!zdcHh~``u6IVyImb!Fh_vw$g-#_sE{MJQA1b>%O1~7pkH^6b_4!`u% z7K7Qz&JHyFwRWQ zn9p2pRoykPv#SMV%?aYVutd?ZiaW{sO4}bkt5tVv;D<+wYNc1YdmoJg|68teNDu(r z0NPjK>l1*oFivK$Xr$kIsxy1}Ar<=Ctf*_8>xTOMx>twV$CL-7SCl_|p+3~Vr}des z`N)Rrqi;U89eeoZUnwNY5g*SvnkzY;S^%*iv^Ao*q_o5Zi$sgEA$zNe%8M6C7*yUi z$N^JVZ(FzyLI92GCXL#9!S($%c(5Jr=xoQ699p;D);jfsqi^aTx%3MlXRX12CqDjR z*noKoAspqEt!2Q!vBoml50yDbiksI3Y1luCI?!>F4Fq~fL zp~kIu5uxxq=_Zrcgb&KtGepb)|KfmmZ0<@i^}y;Hk}}d3ZT^-Hen9Pf5Q@*JysYt; zXb;!9Zs$9%&^kNv=o7%6?=ebWJ{U2e2}zuXV_kQ0J{=itX}eXHbHPDHW=m4MyPm*~ zG^cT(JUYSd(#t5x;buVJ4$2$&yFv#MW4qijaUI#6&kgdY$8Gq=nB^uP9-bSWHaF=#)Ey)NG5WIg!MSi|zeH7FaE+Ms^kp1)V%1DzwR7qKcu z4R!+eB_}(gQMw!BkwZ>}9UrXtYq}z;EK6dq+fPI#qr!CwH7fdIazxdNQheCN^VXQP z`C)5CK-T%*xTr#oP*}`t7*1NZffB8Cf7_)r50>+Iy zG?BLfK*RPtk`lzlcp|sV^bphbu6k=*?U2Au9h1EPFbiQPyr&RF zbI%E^Ip&wnJS!ycK2RLIC575(P7S+XTT3-uqZCNu)LocG5d}Pjrp{>E6EdkauUUT0=nSfA@&DtpET3 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/default_PayPal_logo_80x35.gif b/modules/paypal/views/img/logos/default_PayPal_logo_80x35.gif new file mode 100644 index 0000000000000000000000000000000000000000..a94b479cf0b1e2c7d86195f40f1c925a10715fc0 GIT binary patch literal 1188 zcmV;V1Y7$@Nk%w1VNd`g0OoiAB|~mYd89sYo~X3N@bdNX_4u;J*fURe;_C3l&Dla+ zf&2XYSc9wHnz+l`&DrLDpT6$!^vv1i zi<`1a%jIrzR^>~`Q#?IOB z^!JjXwqJFXp}Ek-&Di|?{`mU*_4oRWs>NGzl8L9pgQLN}$kq1w`?DlUp1019owV8G?3J*} zX?~mN?(^H==f~CK`~3aB$JDUI*qW%kx5?XvrNa37`%Y$wahABHvBR6Gyt&KUa+bLH z`~0oK)_RPlztG>Jufev-+T!Nyt+~nA;_U10^32oS(%$KIiKLaIxZUOLZIiZ|wakB! zs-dpHv%SnQW|tN=WdHyF000000000000000000000000000000A^8LW004LZEC2ui z08juU000O7fOvv~goTEOh>41ejE#C4|l4c zcLlDm1*&(Eva+KUcDcH_0A3)on|CmE#Kpt{ArruicL>D+%Xa{~)OG+3%b0fp#@)mS z*@<^g#UaZN)zu}@wS~5ZwKLw{(4*~ycLBv1z;`FRWe7;PLJfi{0#XtvJV8K~28C-p z;FF**!HF-%#N44^rkgSu6r5}r$%euzJPwSt80A72fPOr7#b}ex&H-#tbam<1VAp^Q z#RT*lR%}C-d36N5ndPilv@N8AaIBZ%tHxX3hpo{hNE8yV`;`Btz+cQ zg<>85mPObVWY!%N(|Fyyst^@a3c6)* z2T;V+unY>jj6nhcshp(2E&=LXSGAqE;OSD5!XbAUmJ5A?EU*g-7gmu@4|ZW-j1Ew0S4Ve(Bu2~xG8m)6C`9N&B|JFV^os;9 z5O(1i)d2A1g*6liB@@qZr~(*4(dN`Bf#pI(ID$mUo>YRMLydlo>Sj)u+ttCv9X`Ni zpe{Bd0s(2fBx*+v{ZMm21cS)4BqB8EMoa*f)nP?u#S{_E2m=hTgG7kjp~ex@h_J%~ zz4pp#qcqxq%_t@qV1NmXj?w}S3CdLIyS~21$bN{J@a4MG000000000000000A^8LV00000EC2ui z03`qy000O7fB=GngoTEOh=K`=jE#Odrb6ge6K zj2Iz;*flUJwF-$Z70Yb@^24`M0*wdkdpbQ_haj3C`gElPLVg|WGu0fG3 z9>`s3P$Gj-K@_sth(lpUfD>s>1Td2)+Xf0h8bE15fky)mEy6Sq(qIjRvw~Oz*f60j zjchiF*;2{IV#2t#6ReCYF|J1gAb17A34ua_VF^0$Xdx`&OMp3sF}OG^A&M6alDS}D za#+xV&!9tpP7$C@3el)jKM>@gwd>cd$JBuVySDAtf)?oB&AYen-@gSN7*4#n@#Dym q3u3^$x%21HqemB{pt|+z*t2WbE~tR_@8H9WA3r{k`SXYZ0RTJP=(0Ef literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/default_PayPal_mark_50x34.gif b/modules/paypal/views/img/logos/default_PayPal_mark_50x34.gif new file mode 100644 index 0000000000000000000000000000000000000000..9640eb0b54dbf615dfe6c7e6753b680b1e3bed2e GIT binary patch literal 1050 zcmV+#1m*ijNk%w1VKM+A0OkMy|CuxY|Nk2{WHV-${N}v;=f3;mvHRq<{`l?tf2_Csc?Lbn5(voqqB^p zy2Zu9%g@W0t-Nr4lVWm=zQn*(Wr1djs*IAFzsb+o)Wzc6)26q=vb?_W<<0Qo$;HCD z;@QSbc%bCp&PG{!RAhd#ySn1r&5f3(#>d9R!M2#Jy1v7{aDJA{&Bo;5((m8Ff0?bR zsi(5Q$SFc>@#xcXkg2z|u(!0X)6d6@l%JoevwxhmjFFeV$H&CJuvvhle~O;s*~xx~ zme|+JbCa)rg^#JOwYIXTVsVMS$jjl@zc)^FH%)W$?cl}3y}rf6A^8LV00000EC2ui z05Sj}000O7fB=GngoTEOh>3;)jE#6&VY*;#ZZjc=i(AOS1<_Tz(GmFAwPsPgkhqF3KcMZC{Zya2Z$U(V6qqxg~pPL zM)CwPVkE^05Hv2*0Ks%5hZ_xJaEP(ep+l$wesHMKP|d|49C84Sg7M;sAQwrJbjnr0 z4HIMkqMAU{0Y=n@Cag3Ra^fqAH)gc}>CncbjsZG4DDL2Nid6w4Wcb0u$Et^wMIc*A zQTAdFFDY7-1+ue;htnQLHfi{x$cnsASg&9>QH}VC0cVB6$aQ z6?J@(`m|hyG0i1T~ U>8GHEDk`Xolxpg!g#-csJI$U(s{jB1 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/default_PayPal_mark_60x38.gif b/modules/paypal/views/img/logos/default_PayPal_mark_60x38.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a5871650a7192df985c5435f75486f546c315a4 GIT binary patch literal 956 zcmV;t14H~rNk%w1VLSjP0M!5h|CuwDsI~m)!vFvOo3O(E`tkeYvS)UT8#ZM8?9BY> z#xY57{`czs^y4#Tm&eD%Mp=6O^4$II(f|DS`{uj<{rdj<_5c6={O7*=;ja7Sw*L6- z|Ni{@<+%Lo%E-gFw86;Z+sks2tc{kY*2KN7;nTTHcb>k* z!qd&bA^8LV00000EC2ui06YLD000L6K!9*aEELp zV5;y!E}PHjw0g}h3pwz(d`_?1@A$Z|!teY4fPsR8gndF2h>41ejE#55tzUx|-B^_P25v<>1S;%}1ZUB~ z!v-x)v_xkDMuUb9NMx*M??AWzmp&2bBPsOchz2?qbbEmFhCQ4Ca;S@et_F>BISe)s z5}~V7c_o4(C{bcXR}~@gAvh2L{Iv++mrrD;e&ToYZXdX}2>D?= zI0?bO%>a&$Id$DNZp2)1&II@F03=B8CPTk}<0KuRpLs&*_rN(l_~%~=k-ekBI|}M2 z#DFc#5TSl3=+i=ZE&Pz#fCK=B@SzL=1mMGk5>#eF3O|%6!wN25C`1A@)@b96I3}Q6 z3pw`aV~;|3Amorl7HQ-Rjmco-l1w%!q!0>3Ddm(@R{7NoRc5K>mQq5=C6_`m}aW!q(W%m>8GHED(a}DmTKy!LKvXxs;su^>Z`EED(kAL&T8we exV|bx2E6v_>#x8DE9|hu_PWHe$R@i)5CA*Ec=mMw literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/express_checkout_mobile/CO_de_DE_orange_295x43.png b/modules/paypal/views/img/logos/express_checkout_mobile/CO_de_DE_orange_295x43.png new file mode 100644 index 0000000000000000000000000000000000000000..103b8253af253db4cb2d11f069c6f052c05ec065 GIT binary patch literal 7831 zcmbVxWmr^g*ETI6-H5<2l=RGyLr4wXjWi5{)DQzhcOwdnASEG42ndL@Al(vzlu}A} zmy|E}b3ga=e4fAk7KWRU2PRo;s?Z7SXiWLsxW;lENt$( zF&`np-C1&9JMr$q=&fYxZQ$Fhl?>E-4I=1c3nm zK7e;@D0>Gs|ck{OO z6L9ll{|5nv@Peb9JiMLU-2i_f+S<9Jy=8!Rk^Y?m(nCw@KfrEY{}$>_G9f=(4J? zV(SWXhog}QH*YnV4DjxWpuLm5q_ViUG8il_0uqOS#3aCAc?FP!vXU4?US2|22?|sE z2jjo_3PTlPVz4{a{|Ld#f=H+ec21oqE>vYHaw=Y=v z|MZnqL?LXw-BE__?ymn-fUcvvx4W04y9YqgKop>53wLt+YyQ{r{GBZffpYRe*ej#l zk$`{cE9vxK_(4iw2~jXiK~drFyrEzaR6oMP5!fa5N>xn26eYJ-aIHVz`}aarv{TZ^!u@6dEdg&==RS@`@N`MQ`h&yq3$z!caxou&m8G8t1mJ;{^60P zk`l{c*pY)DNs?{u(Dv=%Z1(TUVaLCN7@XBDeu3q^I@f{^qTe0XNWH3C4X{-0 zlo(5{CF#(=!*6tb2gO7ezf3V)`OvOg+7nfU8`GT-Q>cxPXQF+FmQE=`{(YDL(=%~V zS6k5|!L?TA1T%-?eIcX({QSty;X}ill==dbmGzqA=qsoo3lBvFkZWJPH>@He1TIGb zb#b6X6aX7tIXp2{K}4(G8DH7q3#5+hZ3HuxLbigU!Mu1gUvH2s2?{U!gB!P)f2PfE+V#8jfj<1R9f~GwkGjOoSeSGF-W`BMh zqc0({?f6Al?3_<#q_8_1V*teG`Nls4!KT;Io}ewr4tWF)G}KzKqAKi;Zf;wrn+}j} zZJc^O57jc27IpM^X^`{$8o6GS#8?aqvd21pGCh@;EqwYx>NiJf@Iw3%7k3PS0qzW! z>`{7owzA3>d1zV2=&e=Qi`t^bh43+q{!2IDKCfyHL3deaWkxlpoX2(u-A4^(miW?x zn^$or==onRKMFJcTnIjtF&O6ibIN#+PG{|`;rj~g3H$3bYXoP?i-^2*1~tW?p8~XO zoP)6@w%#U@J`4f}46FDX_d2UH7mPh2Bl z(OfFT#%_-z^pQ+e*F+WKF$53h7x~O!65jwZJ%S1e`0s>2AXBL^bj&b}FEJ0L;5*t} zqTSlGytIdGn-7FnZYtx!FlZ)bLrL4_BRibIzoC|03(2*ASHu^rfD-m12df`ZdWxXA zOwzK!pV|qjg9m$xj0~UcxvPTSVo>M4qiWPsJ8m#1#r+$Td+Hvu?lh)SQVfa_Pf{$; z6-3GM>Keb`UB({{v+G5<21!qO0v4Y~zpndg-uSHK=XYDxX9p3P$tq5`)}of_Fhljz z5bZ4erP$YfNu4n=K`4l1+_-1mn_=Egxb@|)zOq)O0q!1&1JxK>4EEd^?bOW03XQ{R zVrE*<+2@pUQp8U4TjdN}oDe}M>FuPXS?LN*!@+n7M>LhrMufLHQ$$6H^we9D1Nf!+ z_nr2NDwiu7i>hx@hnF43LEaN_EvFcgC(xo=ml-8(k@x3ibKGYQ6y6h~W0r6Clw-sVRcuExKrvxt&1= z@&y&TO7WU;I@WlM?kc8k#f5R15s>wxC$}`;AtC2xT)|OWCbE>I4pJgU6}lJxY+$Z_ zIE&XZDTWO=5!ybQXFk{8!mWHyp6!?_)gV;Ya5-$DyDdQ{{`_#}HoGPlxBAeT@hv|Y zt<+V^*1EAJ!96P($L^YAd(~$|%0AfB>pW%Wu3zf%Hi*EUmSXXy&!>$wIh@&J(VJU} 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/express_checkout_mobile/CO_en_EN_orange_295x43.png b/modules/paypal/views/img/logos/express_checkout_mobile/CO_en_EN_orange_295x43.png new file mode 100644 index 0000000000000000000000000000000000000000..57d24de9be8a94136514c5d7fb2e75263e33e776 GIT binary patch literal 7254 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/express_checkout_mobile/CO_fr_FR_orange_295x43.png b/modules/paypal/views/img/logos/express_checkout_mobile/CO_fr_FR_orange_295x43.png new file mode 100644 index 0000000000000000000000000000000000000000..194354675a7116bf2cd00844b33a57fd0349b2a2 GIT binary patch literal 7215 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 Js}$`b{s)w2PLcos literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/express_checkout_mobile/CO_it_IT_orange_295x43.png b/modules/paypal/views/img/logos/express_checkout_mobile/CO_it_IT_orange_295x43.png new file mode 100644 index 0000000000000000000000000000000000000000..d8b73d0d2657388217276f50f6c53105b190d0f2 GIT binary patch literal 7274 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 H^Pv9&eR4|v literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/express_checkout_mobile/CO_ja_JP_orange_295x43.png b/modules/paypal/views/img/logos/express_checkout_mobile/CO_ja_JP_orange_295x43.png new file mode 100644 index 0000000000000000000000000000000000000000..dc56332391a48ccc4b040575cfabeb70b1e1ec1c GIT binary patch literal 7635 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/express_checkout_mobile/CO_pl_PL_orange_295x43.png b/modules/paypal/views/img/logos/express_checkout_mobile/CO_pl_PL_orange_295x43.png new file mode 100644 index 0000000000000000000000000000000000000000..41f6ef53db7415ce94fd107f767b405f95681d98 GIT binary patch literal 8447 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/views/img/logos/express_checkout_mobile/CO_pt_BR_orange_295x43.png b/modules/paypal/views/img/logos/express_checkout_mobile/CO_pt_BR_orange_295x43.png new file mode 100644 index 0000000000000000000000000000000000000000..d59b9c23f9b73da1b94c1218d2bc7331519858e0 GIT binary patch literal 8391 zcmbVyRahL`wlxV3Ay|NoL!$}aSmW*%BsdA((0J3hO9&9$-8F%r!QH(f5ZoO?aCf`p zoW0NeAI^6l{(7idt7?uh$DC`fZ&iJ(Lf)#%;b4(rAt52*D9B4|AR#?tdTO&^pgo-h z4^<!hoqENB9U zv4j8Eu)D$Rp3q20!eVZAU=wSo6Ac7vZfPq5IBaSI&{&#^0Cad&I92SVpca<$9u81V z4^=G_4{H+vQ-GK#jj)^G69EkB1g3F=+1NS?x`_b(#Vh#K{&SlHK=UsXCub`B`azoLrn7oInmPAR8CIAU9BulauD}1MuX{ z!PHDpLt6H4Ur#*|fQ6HjogfE?tE(%!D>pmb!JLCjKtSLR2N1~iWWna>ZtDbgW3zRn z`-edq>S*F%Y3F1Kx25^R2!_C&okRdnO8*@K%uYq+Kg70(P7WCC zPh9`9c68E!{;!PxYVD}yZU^PifI7mR9Za6a!;J19@Kf&oZ%2O&pVSDdIaodo3fM*( zZsH7s+BzvnivXUUu$x+%3d-{H%W`q?^KkM5Ir%_bToRI;AXyncpo9d7TSh=y>K~5( zhUEf+KtOIj{wEMW7ncl|01pqR43LjUN>U00S;{lb1#XY+`Bqr~hYo{vE9})WOmPYAWjhhtd2i zzk-(k#lL{8G_NGTB(KEZaSL#93V>uJBsiaPA;~Sp1^63l`u~$Njwdl3e~RP(DVBe3 zJyqbJ=6_26sq>%71GRmcF%C~t<4e{vJR~HFO9g2OEw{NnBTQW_x!Q-OoE$&fi&6=3 zZPaJ@3vU4^>tX6cKoiEDzkVoBfCkdMM(N{7%pt *Cb3V(qdxe9AWtmfi0?y{!AQf$r{ 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

    - {if $smarty.foreach.myLoop.index % 2 && !$smarty.foreach.myLoop.last} + {if $smarty.foreach.myLoop.index % 2 && !$smarty.foreach.myLoop.last}
    {/if} diff --git a/themes/hotel-reservation-theme/css/global.css b/themes/hotel-reservation-theme/css/global.css index 4ebed384a..1a289a377 100644 --- a/themes/hotel-reservation-theme/css/global.css +++ b/themes/hotel-reservation-theme/css/global.css @@ -7899,7 +7899,7 @@ a.iframe { a.iframe:hover { text-decoration: none; } -p.payment_module { +p.p.payment_module { margin-bottom: 10px; } p.payment_module a { display: block; @@ -7907,47 +7907,54 @@ p.payment_module { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; - font-size: 17px; + font-size: 14px; line-height: 23px; color: #333; font-weight: bold; - padding: 33px 40px 34px 99px; + padding: 30px 25px 27px 100px; letter-spacing: -1px; position: relative; } - p.payment_module a.bankwire { - background: url(../img/bankwire.png) 15px 12px no-repeat #fbfbfb; } - p.payment_module a.cheque { - background: url(../img/cheque.png) 15px 15px no-repeat #fbfbfb; } - p.payment_module a.cash { - background: url(../img/cash.png) 15px 15px no-repeat #fbfbfb; } - p.payment_module a.cheque:after, p.payment_module a.bankwire:after, p.payment_module a.cash:after { - display: block; - content: "\f054"; - position: absolute; - right: 15px; - margin-top: -11px; - top: 50%; - font-family: "FontAwesome"; - font-size: 25px; - height: 22px; - width: 14px; - color: #777; } - p.payment_module a:hover { - background-color: #f6f6f6; } - p.payment_module a span { - font-weight: bold; - color: #777; } - -.payment_module.box { + p.payment_module a:after { + display: block; + content: "\f054"; + position: absolute; + right: 12px; + margin-top: -11px; + top: 50%; + font-family: "FontAwesome"; + font-size: 20px; + height: 22px; + width: 14px; + color: #777; } + p.payment_module a:hover { + background-color: #f6f6f6; } + p.payment_module a span { + font-weight: bold; + color: #777; } + p.payment_module a.bankwire { + background: url(../img/bankwire.png) 15px 8px no-repeat #fbfbfb; } + p.payment_module a.cheque { + background: url(../img/cheque.png) 15px 8px no-repeat #fbfbfb; } + p.payment_module a.cash { + background: url(../img/cash.png) 15px 8px no-repeat #fbfbfb; } + .payment_module.box { margin-top: 20px; } -p.cheque-indent { + p.cheque-indent { margin-bottom: 9px; } -.cheque-box .form-group { - margin-bottom: 0px; } - .cheque-box .form-group .form-control { - width: 269px; } +@media (max-width: 480px) { + p.payment_module a { + background-position: 12px 8px!important; + padding: 17px 25px 17px 90px; + } +} +@media (max-width: 355px) { + p.payment_module a { + background-position: 8px 8px!important; + padding: 7px 25px 7px 90px; + } +} .order-confirmation.box { line-height: 29px; } @@ -8041,7 +8048,6 @@ p.cheque-indent { #identity .gender-line, #account-creation_form .gender-line, #new_account_form .gender-line, -#opc_account_form .gender-line, #authentication .gender-line { margin-bottom: 4px; padding-top: 4px; } @@ -8052,7 +8058,7 @@ p.cheque-indent { #opc_account_form .gender-line > label, #authentication .gender-line > label { margin-right: 10px; - margin-bottom: 0; } + } #address .gender-line .radio-inline label, #identity .gender-line .radio-inline label, #account-creation_form .gender-line .radio-inline label, @@ -8063,13 +8069,11 @@ p.cheque-indent { color: #777777; } #identity #center_column form.std .row, -#authentication #center_column form.std .row, -#order-opc #center_column form.std .row { +#authentication #center_column form.std .row { margin-left: -5px; margin-right: -5px; } #identity #center_column form.std .row .col-xs-4, - #authentication #center_column form.std .row .col-xs-4, - #order-opc #center_column form.std .row .col-xs-4 { + #authentication #center_column form.std .row .col-xs-4 { padding-left: 5px; padding-right: 5px; max-width: 94px; } @@ -8881,4 +8885,17 @@ hr.theme-text-underline { .default-cursor { cursor: default!important; -} \ No newline at end of file +} + +/* for checkout page design change */ + +.card { + position: relative; + display: block; + margin-bottom: 30px; + background: #FFFFFF; + box-shadow: 0 2px 6px 0 rgba(0,0,0,0.20); + border: 1px solid rgba(0,0,0,.125); + border-radius: 4px; + padding: 15px; +} diff --git a/themes/hotel-reservation-theme/css/order-opc.css b/themes/hotel-reservation-theme/css/order-opc.css index de76a299b..b91b8455a 100644 --- a/themes/hotel-reservation-theme/css/order-opc.css +++ b/themes/hotel-reservation-theme/css/order-opc.css @@ -4,6 +4,10 @@ #order-opc { line-height: 20px; } +#order-opc input.form-control { + height: 40px; + border-radius: 4px; +} #order-opc .box { padding-bottom: 20px; } @@ -26,10 +30,10 @@ top: -14px; } #order-opc .form-group { - margin-bottom: 2px; + margin-bottom: 10px; } #order-opc .form-group .form-control { - max-width: 271px; + max-width: 100%; } #order-opc .lost_password { display: inline-block; @@ -44,9 +48,6 @@ color: #333; padding: 3px 0 6px; } -#order-opc .opc-button { - padding: 11px 0 0 0; -} #order-opc ul.bullet { line-height: 22px; margin-bottom: 5px; @@ -86,32 +87,6 @@ /* By Webkul */ -.table_head th { - font-size: 18px; - color: #3C3C3C; - font-weight: 700; -} -.table_body td { - font-size: 16px; - color: #3C3C3C; - font-weight: 400; -} -#voucher h4 { - font-size: 18px !important; - color: #404040 !important; - font-weight: 700 !important; -} -#voucher #discount_name { - width: 200px; - height: 35px; -} -#voucher button, #advanced-payment button { - border: none; - background-color: #379bf0; - font-size: 16px; - color: #FFFFFF; - font-weight: 700; -} #title { font-size: 13px; color: #3C3C3C; @@ -123,21 +98,6 @@ } #display_cart_vouchers span { font-weight: 700; - color: #3C3C3C !important; -} -.table_tfoot td { - font-size: 16px; - color: #3C3C3C; - background-color: #FFFFFF; -} -.table_total_tr td, .table_total_tr td span { - color: #333333 !important; -} -.account_txt { - font-size: 30px; - color: #3C3C3C; - font-weight: 700; - padding-left: 0px; } #login_form { background-color: #FFFFFF; @@ -148,30 +108,13 @@ font-weight: 700; margin-top: 5px; } -#login_form_content p label { - font-size: 16px; - color: #3C3C3C; - font-weight: 700; -} -#login_form_content p input.form-control, #opc_account_form div input.form-control { - height: 40px; -} #login_form_content a.lost_password { font-weight: bold; text-decoration: none; } -#SubmitLogin, #submitAccount { - background-color: #379bf0; - font-size: 18px; - color: #FFFFFF; - font-weight: 700; - border-color: none; -} -#SubmitLogin:hover, #SubmitLogin:focus, #SubmitLogin:active, #submitAccount:hover, #submitAccount:focus, #submitAccount:active { - border-color: none; -} #new_account_form fieldset div.box, #tc_cont { background-color: #FFFFFF; + margin-bottom: 20px; } #new_account_title, #opc_account_form h3, #choose_payment_txt { margin-top: 5px; @@ -179,64 +122,464 @@ color: #3C3C3C; font-weight: 700; } -#opc_account_form div label { - font-size: 16px; - color: #3C3C3C; - font-weight: 700; -} -.hard_disp_none { - display: none !important; -} -#tc_txt { - font-size: 16px; - color: #929292; - font-weight: 700; -} -#tc_link { - font-size: 16px; - color: #404040; - font-weight: 700; - text-decoration: none; +#opc_new_account form label { + font-size: 14px; + color: #333333; + font-weight: 400; } .opc-main-block h3.page-subheading { margin-top: 5px; } -.clear-both { +#order-opc .clear-both { clear: both; } -.partial_txt { - font-size: 16px; - font-weight: 700; - color: #585858; +#order-opc .partial_txt { + font-size: 14px; + color: #333333; } -.partial_mim_cost { +#order-opc .partial_min_cost { font-size: 16px; - font-weight: 400; - color: #585858; + color: #333333; } -#partial_data { +#order-opc #partial_data { display: none; } -.partial_subcont { +#order-opc .partial_subcont { margin-top: 10px; } -#current_amt_cont span.partial_txt { - transform: translate(0px, 6px); +#order-opc .room_type_old_price { + text-decoration: line-through; + color:#979797; + font-size:12px; +} +#order-opc .block-small-header { + font-size: 12px; + color: #777777; + font-weight: 600; +} +.order-detail-content .product-name a { + font-size: 22px; + color: #333333 !important; +} + +.order-detail-content .hotel-location { + font-size: 14px; + padding: 10px 0px 0px 0px; + color: #777777; +} +.order-detail-content .hotel-location > i { + font-size: 18px; +} +.order-detail-content .hotel-location > .htl-address-icon { + background-image: url(../../../modules/hotelreservationsystem/views/img/Slices/icon-contact.png); + padding: 1px 15px 0px 2px; + background-position: 1px; + margin-right: 5px; + font-size: 14px; } -#current_amt_cont div.input-group { - padding-left: 10px; +.order-detail-content div.room-type-features { + margin-bottom: 5px; +} +.order-detail-content span.room-type-feature { + white-space: nowrap; + line-height: 35px; + background-color: #eee; + border-radius: 10px; + margin-right: 10px; + padding: 3px 10px 6px 0px; + font-size: 14px; + color: #555555; +} +.order-detail-content .room_duration_block_head { + font-size: 12px; + color: #777777; + font-weight: 600; + margin-bottom: 4px; +} +.order-detail-content .room_duration_block_value { + font-size: 16px; + color: #333333; +} +.order-detail-content .room_duration_block { + margin-bottom: 15px; + float: left; + width: 100%; + background-color: #D8EDFF; + border-radius: 2px; + padding: 10px 0px 5px 0px; +} +.order-detail-content .cart_product_summary_line .room_duration_block { + background-color: #fff; +} +.order-detail-content .cart_product_summary_line .room_total_price { + font-size: 24px; + color: #333333; +} + +.order-detail-content .room_total_price { + font-size: 24px; + color: #333333; } -#current_amt_cont div.input-group span.input-group-addon { - padding: 6px 17px; +.order-detail-content .room_total_price_detial { + font-size: 14px; + color: #777777; } -#current_amt_cont div.input-group input { +.order-detail-content .unit_price_block { + display: inline-block; + padding: 10px 15px 0px; + background-color: #f2f2f2f2; + border-radius: 6px; +} +.order-detail-content .room_info_text { + font-size: 12px; + color: #777777; + text-transform: uppercase; + font-family: OpenSans-Semibold; +} +.order-detail-content .room_unit_price{ + font-size: 24px; + color: #333333; + text-align: right; +} +.order-detail-content .room_unit_price span { + font-size: 14px; +} +.order-detail-content .room_unit_price span.real_price { + color: #777777; + text-decoration: line-through; +} +.order-detail-content .room_unit_price_detail { + font-size: 14px; + color: #777777; +} +.order-detail-content .room_remove_block { + font-size: 12px; + color: #555; + text-align: center; + margin-top: 20px +} +.order-detail-content .room_remove_block i { + font-size: 18px; +} +#order-opc #guest-info-block div.info-head { + font-size: 14px; + color: #555555; +} +#order-opc #guest-info-block div.info-value { + font-size: 14px; + color: #333333; + overflow: auto; +} + +/* Guest Account Block */ +#order-opc .opc_dropdown_btn { height: 40px; + border-radius: 4px; +} +#order-opc .order_opc_ul { + font-size: 14px; + font-weight: 400; + top: 45px; + padding: 0px; + width: 100%; + border-bottom: 1px solid rgba(0, 0, 0, 1); + border-left: 1px solid rgba(0, 0, 0, 1); + border-right: 1px solid rgba(0, 0, 0, 1); + max-height: 145px; + overflow-y: auto; +} +#order-opc .order_opc_ul li { + cursor: default; + font-size: 14px; + color: rgba(0, 0, 0, 1); + font-weight: 400; + padding: 11px; +} +#order-opc .order_opc_ul li:hover, #order-opc .order_opc_ul li:focus, #order-opc .order_opc_ul li:active { + background-color: #379bf0; + color: #FFFFFF; +} +#order-opc .already_registered_block { + font-size: 14px; + line-height: 19px; + color: #333333; +} +#order-opc .already_registered_block #openLoginFormBlock { + color: #003AEF; + font-weight: 600; } -/* By Webkul */ +#new_account_form #opc_guestCheckout { + padding: 14px 25px; +} +#new_account_form #opc_createAccount { + padding: 14px 25px; + margin-left: 15px; +} +#order-opc #opc_new_account { + padding-bottom: 10px; +} +#order-opc .step-edit > a { + font-size: 14px; + color: #0000FF; + text-align: right; +} -.room_type_old_price { - text-decoration: line-through; - color:#979797; - font-size:12px; -} \ No newline at end of file +/* Voucher Bock Css */ +#order-opc .cart_voucher_detail_block { + font-size: 14px; + color: #555555; +} +#order-opc .cart_voucher_detail_block .cart_voucher_head { + font-size: 12px; + color: #777777; + text-transform: uppercase; + font-weight: 600; +} +#order-opc .cart_voucher_detail_block span.cart_discount_name { + font-size: 14px; + color: #459C3D; + background-color: #FFFFFF; + border: 2px dashed #459C3D; + padding: 10px; + display: inline-block; + width: 60%; + font-weight: 600; +} +#order-opc .cart_discount_name a.price_discount_delete { + color: #777777; + font-size: 16px; +} +#order-opc .cart_voucher_detail_block .cart_applied_voucher { + margin-bottom: 5px; +} +#order-opc .cart_voucher_detail_block span.voucher_apply_state { + background-color: #EDEDED; + padding: 10px 15px; + border-radius: 4px; + color: #459C3D; + display: inline-block; +} +#order-opc .avail_vouchers_block .avail_voucher_name { + font-size: 12px; + font-weight: 600; + color: #0000FF; + margin-bottom: 2px; +} +#order-opc .avail_vouchers_block .avail_voucher_name>.voucher_name { + cursor: pointer; +} +#order-opc .avail_vouchers_block .avail_voucher_des { + font-size: 12px; + color: #777777; + margin-bottom: 2px; +} +#order-opc .avail_vouchers_block .seperator { + margin-top: 10px; + margin-bottom: 10px; +} +#order-opc .cart_total_detail_block .cart_total_values { + float: right; +} +#order-opc .cart_total_detail_block .total_discount_block { + color: #459C3D; +} +#order-opc .cart_total_detail_block .cart_final_total_block { + line-height: 40px; +} +#order-opc .cart_total_detail_block .cart_final_total_block > .cart_total_values { + font-size: 28px; + color: #003AEF; +} +#order-opc .opc_advance_payment_block { + margin-bottom: 30px; +} +#order-opc #advanced-payment label > span { + font-size: 14px!important; + font-weight: normal!important; +} +@media (max-width: 767px) { + #order-opc .cart_voucher_detail_block .submit_discount_div { + margin-top: 10px; + } + #order-opc .room-type-img-block { + display: none; + } + #order-opc .cart_product_line .room-type-features { + display: none; + } + .order-detail-content .room-xs-img { + display: inline-block; + } + .order-detail-content .room-xs-info { + display: inline-block; + } + .order-detail-content .room-xs-img { + width: 9%; + margin-right: 2%; + } + .order-detail-content .room-xs-img img { + width: 60px; + } + .order-detail-content .room-xs-info { + width: 88%; + vertical-align: top; + } + .order-detail-content .hotel-location { + padding: 4px 0px 0px 0px; + } + .order-detail-content .room-xs-remove { + display: block; + font-size: 16px!important; + padding: 0px 4px; + } +} +@media (max-width: 480px) { + .order-detail-content .room-xs-info { + display: inline-block; + width: 76%; + vertical-align: top; + } + .order-detail-content .room-xs-img { + display: inline-block; + width: 20%; + margin-right: 2%; + } + .order-detail-content .room-xs-img img { + width: 60px; + } + .order-detail-content .hotel-location { + font-size: 13px; + } +} +@media (min-width: 481px) and (max-width: 650px) { + .order-detail-content .room-xs-info { + display: inline-block; + width: 85%; + vertical-align: top; + } + .order-detail-content .room-xs-img { + display: inline-block; + width: 12%; + margin-right: 2%; + } + .order-detail-content .room-xs-img img { + width: 60px; + } +} +@media (min-width: 768px) { + #order-opc .cart_product_line .unit_price_block { + float: right; + } + .order-detail-content .room_unit_price_detail { + text-align: right; + } + .order-detail-content .room-xs-img { + display: none; + } + .order-detail-content .room-xs-remove { + display: none; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + #order-opc .cart_voucher_detail_block .submit_discount_div { + margin-top: 10px; + } + #order-opc .cart_voucher_detail_block span.cart_discount_name { + width: 50%; + } +} +@media (max-width: 480px) { + #order-opc .cart_voucher_detail_block span.cart_discount_name { + width: 50%; + } + #order-opc #new_account_form #opc_guestCheckout { + width: 100%; + margin-bottom: 15px; + } + #order-opc #new_account_form #opc_createAccount { + width: 100%; + margin-left: 0px; + } +} +#order-opc .cart_total_detail_block { + font-size: 14px; + color: #333333; +} +@media (max-width: 350px) { + #order-opc .cart_total_detail_block { + font-size: 12px; + } + #order-opc .cart_total_detail_block .cart_final_total_block > .cart_total_values { + font-size: 24px; + } +} + +#order-opc #oprder-opc-accordion .accordion-header { + font-size: 20px; + color: #333333; + padding: 0px; + cursor: pointer; +} +#order-opc #oprder-opc-accordion .accordion-left-arrow { + font-size: 25px; +} +#order-opc #oprder-opc-accordion #shopping-cart-head .accordion-left-arrow { + display: none; +} +#order-opc #oprder-opc-accordion .card-header>h5 { + margin: 0px; +} +#order-opc #oprder-opc-accordion .card-body { + margin-top: 20px; +} +#order-opc .right-border { + border-right: 1px solid #ccc; +} +#order-opc select { + background-color: #fff; + height: 40px; + border-radius: 4px; + padding: 3px 5px; + color: #333; + border: 1px solid #d6d4d4; + width: 100%; +} +#order-opc #center_column form.std .row .col-xs-4 { + max-width: 127px; +} +#opc_account_form .gender-line { + padding-top: 0px; +} + +/* buttons css */ +#order-opc .opc-button-small { + border: none; + border-radius: 4px; + font-size: 14px; + padding: 10px 25px; + font-weight: 600; +} +#order-opc .opc-btn-primary { + background-color: #1292FF; + color: #FFFFFF; +} +#order-opc .opc-btn-default { + border: 1px solid #1292FF; + background-color: #fff; + color: #1292FF; +} +#order-opc .opc-button { + padding: 11px 0 0 0; +} +#order-opc .button-medium { + background-color: #1292FF; + box-shadow: 0 0px 20px 0 rgba(0,0,0,0.34); + border-radius: 2px; + padding: 5px 50px;} + #order-opc .button-medium > span { + font-size: 14px; + font-weight: 600; + color: #FFFFFF; + text-transform: uppercase; + text-align: center;} \ No newline at end of file diff --git a/themes/hotel-reservation-theme/guest-tracking.tpl b/themes/hotel-reservation-theme/guest-tracking.tpl index 11b81ca6c..2339087e6 100644 --- a/themes/hotel-reservation-theme/guest-tracking.tpl +++ b/themes/hotel-reservation-theme/guest-tracking.tpl @@ -55,7 +55,7 @@
    - {include file="./order-detail.tpl"} + {include file="./order-detail.tpl"}
    {/foreach} @@ -65,16 +65,16 @@ {include file="$tpl_dir./errors.tpl"} {if isset($transformSuccess)} -

    {l s='Your guest account has been successfully transformed into a customer account. You can now log in as a registered shopper. '} {l s='Log in now.'}

    +

    {l s='Your guest account has been successfully transformed into a customer account. You can now log in as a registered user. '} {l s='Log in now.'}

    {else}

    {l s='Transform your guest account into a customer account and enjoy:'}

      -
    • -{l s='Personalized and secure access'}
    • -
    • -{l s='Fast and easy checkout'}
    • -
    • -{l s='Easier merchandise return'}
    • +
    • - {l s='Personalized and secure access'}
    • +
    • - {l s='Fast and easy checkout'}
    • +
    • - {l s='Easier refund process'}
    @@ -106,7 +106,7 @@
    - {l s='For example: QIIXJXNUI or QIIXJXNUI#1'} + {l s='For example: QIIXJXNUI'}
    diff --git a/themes/hotel-reservation-theme/img/icon/form-ok-circle.svg b/themes/hotel-reservation-theme/img/icon/form-ok-circle.svg new file mode 100644 index 000000000..67e21b58f --- /dev/null +++ b/themes/hotel-reservation-theme/img/icon/form-ok-circle.svg @@ -0,0 +1,35 @@ + + + + icon-features + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/hotel-reservation-theme/js/order-opc.js b/themes/hotel-reservation-theme/js/order-opc.js index 072d0340c..b66e9bb7d 100644 --- a/themes/hotel-reservation-theme/js/order-opc.js +++ b/themes/hotel-reservation-theme/js/order-opc.js @@ -24,20 +24,29 @@ */ $(document).ready(function() { + $('.opc-collapse').on('show.bs.collapse', function () { + $(this).closest('.card').find('.accordion-left-arrow').addClass('hidden'); + $(this).closest('.card').find('.step-edit').removeClass('hidden'); + }); + $('.opc-collapse').on('hide.bs.collapse', function () { + $(this).closest('.card').find('.accordion-left-arrow').removeClass('hidden'); + $(this).closest('.card').find('.step-edit').addClass('hidden'); + }); + // BY WEBKUL // FOR ADVANCED PAYMENT var payment_type = $(".payment_type:checked").val(); - if (payment_type == 1) + if (payment_type == 1) $("#partial_data").hide(); - else if (payment_type == 2) + else if (payment_type == 2) $("#partial_data").show(); $(".payment_type").on('change',function() { var payment_type = $(".payment_type:checked").val(); - if (payment_type == 1) + if (payment_type == 1) $("#partial_data").slideUp(); - else if (payment_type == 2) + else if (payment_type == 2) $("#partial_data").slideDown(); }); @@ -90,7 +99,7 @@ $(document).ready(function() $(document).on('click', '#openLoginFormBlock', function(e){ e.preventDefault(); $('#openNewAccountBlock').show(); - $(this).hide(); + $('.already_registered_block').hide(); $('#login_form_content').slideDown('slow'); $('#new_account_form').slideUp('slow'); }); @@ -124,6 +133,7 @@ $(document).ready(function() // update token static_token = jsonData.token; updateNewAccountToAddressBlock(that.attr('data-adv-api')); + location.reload(); } }, error: function(XMLHttpRequest, textStatus, errorThrown) { @@ -274,7 +284,10 @@ $(document).ready(function() else updateNewAccountToAddressBlock(advApiParam); } - $('#opc_new_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeIn('slow'); + if (!jsonData.hasError) { + location.reload(); + } + //$('#guest-info-block, #opc_new_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeIn('slow'); }, error: function(XMLHttpRequest, textStatus, errorThrown) { if (textStatus !== 'abort') @@ -472,7 +485,9 @@ function updateAddressSelection(is_adv_api) updateHookShoppingCartExtra(jsonData.HOOK_SHOPPING_CART_EXTRA); if ($('#gift-price').length == 1) $('#gift-price').html(jsonData.gift_price); - $('#opc_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeOut('slow'); + $('#guest-info-block, #opc_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeOut('slow'); + + location.reload(); } }, error: function(XMLHttpRequest, textStatus, errorThrown) { @@ -493,7 +508,7 @@ function updateAddressSelection(is_adv_api) else alert(error); } - $('#opc_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeOut('slow'); + $('#guest-info-block, #opc_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeOut('slow'); } }); } @@ -751,7 +766,7 @@ function saveAddress(type) $.scrollTo('#opc_account_errors', 800); }); }); - $('#opc_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeOut('slow'); + $('#guest-info-block, #opc_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeOut('slow'); result = false; } else @@ -780,7 +795,7 @@ function saveAddress(type) else alert(error); } - $('#opc_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeOut('slow'); + $('#guest-info-block, #opc_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeOut('slow'); } }); @@ -789,7 +804,7 @@ function saveAddress(type) function updateNewAccountToAddressBlock(is_adv_api) { - $('#opc_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeOut('slow'); + //$('#guest-info-block, #opc_account-overlay, #opc_delivery_methods-overlay, #opc_payment_methods-overlay').fadeOut('slow'); $.ajax({ type: 'POST', @@ -817,7 +832,7 @@ function updateNewAccountToAddressBlock(is_adv_api) if (json.no_address == 1) document.location.href = addressUrl; - $('#opc_new_account').fadeOut('fast', function() + $('.guest-info-block').fadeOut('fast', function() { if (typeof json.formatedAddressFieldsValuesList !== 'undefined' && json.formatedAddressFieldsValuesList ) { @@ -846,18 +861,18 @@ function updateNewAccountToAddressBlock(is_adv_api) }); } - $(this).fadeIn('fast', function() + $(this).fadeIn('fast', function() { if ($('#gift-price').length == 1) $('#gift-price').html(json.gift_price); //After login, the products are automatically associated to an address - // $.each(json.summary.products, function() + // $.each(json.summary.products, function() // { // updateAddressId(this.id_product, this.id_product_attribute, '0', this.id_address_delivery); // }); // updateAddressesDisplay(true); - if (typeof is_adv_api === 'undefined' || !is_adv_api) + if (typeof is_adv_api === 'undefined' || !is_adv_api) { updateCarrierList(json.carrier_data); updateCarrierSelectionAndGift(); diff --git a/themes/hotel-reservation-theme/js/tools/statesManagement.js b/themes/hotel-reservation-theme/js/tools/statesManagement.js index 388c92a60..10b741b7a 100644 --- a/themes/hotel-reservation-theme/js/tools/statesManagement.js +++ b/themes/hotel-reservation-theme/js/tools/statesManagement.js @@ -140,7 +140,7 @@ function updateState(suffix) }); $('.id_state' + (typeof suffix !== 'undefined' ? '_' + suffix : '') + ':hidden').fadeIn('slow'); - $('#id_state, #id_state_invoice').uniform(); + $('#id_state_invoice').uniform(); } else $('.id_state' + (typeof suffix !== 'undefined' ? '_' + suffix : '')).fadeOut('fast'); diff --git a/themes/hotel-reservation-theme/order-detail.tpl b/themes/hotel-reservation-theme/order-detail.tpl index d6686430e..5ae44df76 100644 --- a/themes/hotel-reservation-theme/order-detail.tpl +++ b/themes/hotel-reservation-theme/order-detail.tpl @@ -29,7 +29,7 @@ - + {* {l s='Reorder'} --> + *} {if isset($cart_htl_data)} @@ -311,7 +321,7 @@ {/if}

    - {if isset($order_has_invoice) && $order_has_invoice && $order->payment != 'Free order'} + {if !$is_guest && isset($order_has_invoice) && $order_has_invoice && $order->payment != 'Free order'} {if isset($rm_v['stage_name']) && $rm_v['stage_name']}

    {l s="Request Sent.."}

    @@ -333,7 +343,7 @@ {if $rm_v['stage_name'] == 'Refunded' || $rm_v['stage_name'] == 'Rejected'} {l s="Done!"} {else if $rm_v['stage_name'] == 'Waitting' || $rm_v['stage_name'] == 'Accepted'} - {l s="Pending..."} + {l s="Pending.."} {else} -- {/if} @@ -352,7 +362,7 @@ {/foreach} {/if} - + {/foreach} *} {foreach from=$discounts item=discount} {$discount.name|escape:'html':'UTF-8'} @@ -618,7 +628,7 @@

    {l s='Add a message'}

    {l s='If you would like to add a comment about your order, please write it in the field below.'}

    - + - {l s='Full Payment'} - -

    -
    - +
    +

    {l s='PAYMENT TYPES'}

    +
    + +
    + +
    +
    + - {if isset($customer_adv_dtl)} - - {/if} - {if isset($customer_adv_product_dtl)} - - {/if} + {if isset($customer_adv_dtl)} + + {/if} + {if isset($customer_adv_product_dtl)} + + {/if} -
    -
    -
    - {l s='Currently Payment Amount'} - - {displayPrice price=$adv_amount} -
    -
    - - {if isset($customer_adv_dtl)} -
    -
    - {l s='Due Amount'} - - {displayPrice price=$customer_adv_dtl['due_amount']} -
    -
    - {/if} +
    +
    +
    + {l s='Advance Payment Amount'} - + {displayPrice price=$adv_amount}
    -
    - -
    - + + {if isset($customer_adv_dtl)} +
    +
    + {l s='Due Amount'} - + {displayPrice price=$customer_adv_dtl['due_amount']} +
    +
    + {/if} +
    +
    +
    +
    -
    +
    {/if} \ No newline at end of file diff --git a/themes/hotel-reservation-theme/order-opc-new-account.tpl b/themes/hotel-reservation-theme/order-opc-new-account.tpl index 71cd15f1e..585d23055 100644 --- a/themes/hotel-reservation-theme/order-opc-new-account.tpl +++ b/themes/hotel-reservation-theme/order-opc-new-account.tpl @@ -1,10 +1,14 @@
    -

    1 {l s='Account'}

    -
    +
    -

    {l s='Already registered?'}

    -

    » {l s='Click here'}

    +
    +

    + {l s='Already have an account? '} {l s='Login Now'} {l s='to make check process faster and time saving.'} +

    +

    {l s='Or'}

    +
    +

    -
    -
    -

    {l s='New Customer'}

    -
    -
    -

    {l s='Instant Checkout'}

    -

    - -

    -
    -
    -

    {l s='Create your account today and enjoy:'}

    -
      -
    • - {l s='Personalized and secure access'}
    • -
    • - {l s='A fast and easy check out process'}
    • -
    • - {l s='Separate billing and shipping addresses'}
    • -
    -

    - -

    -
    +
    +
    +
    + + + + + +
    -
    - {$HOOK_CREATE_ACCOUNT_TOP} - - - - - - - - -

    *{l s='Required field'}

    -
    - - -
    -
    - - - {l s='(five characters min.)'} -
    -
    - +
    +
    +
    + {$HOOK_CREATE_ACCOUNT_TOP} + + + + + + + + +

    *{l s='Required field'}

    + +
    +
    + + id_gender || (isset($guestInformations) && $guestInformations.id_gender == $gender->id_gender)} checked="checked"{/if} /> - {$gender->name}
    + {/foreach} -
    -
    - - -
    -
    - - -
    -
    + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + {l s='(five characters min.)'} +
    +
    +
    +
    + + +
    +
    + {if $PS_CUSTOMER_ADDRESS_CREATION} +
    +
    - {foreach from=$days item=day} {/foreach} - {* - {l s='January'} - {l s='February'} - {l s='March'} - {l s='April'} - {l s='May'} - {l s='June'} - {l s='July'} - {l s='August'} - {l s='September'} - {l s='October'} - {l s='November'} - {l s='December'} - *}
    - {foreach from=$months key=k item=month} @@ -119,7 +115,7 @@
    - {foreach from=$years item=year} @@ -128,7 +124,9 @@
    - {if isset($newsletter) && $newsletter} +
    + + {if isset($newsletter) && $newsletter}
    - {/if} - {if isset($optin) && $optin} + {/if} + {if isset($optin) && $optin}
    - {/if} -

    {l s='Residential address'}

    - {$stateExist = false} - {$postCodeExist = false} - {$dniExist = false} + {/if} + +

    {l s='RESIDENTIAL ADDRESS'}

    + {$stateExist = false} + {$postCodeExist = false} + {$dniExist = false} +
    {foreach from=$dlv_all_fields item=field_name} - {if $field_name eq "company"} -
    - - -
    - {elseif $field_name eq "vat_number"} - - {elseif $field_name eq "dni"} - {assign var='dniExist' value=true} -
    - - - {l s='DNI / NIF / NIE'} -
    - {elseif $field_name eq "firstname"} -
    - - -
    - {elseif $field_name eq "lastname"} -
    - - -
    - {elseif $field_name eq "address1"} -
    - - -
    - {elseif $field_name eq "address2"} -
    - - -
    - {elseif $field_name eq "postcode"} - {$postCodeExist = true} -
    - - -
    - {elseif $field_name eq "city"} -
    - - -
    - {elseif $field_name eq "country" || $field_name eq "Country:name"} -
    - - -
    - {elseif $field_name eq "state" || $field_name eq 'State:name'} - {$stateExist = true} - - {/if} + {if $field_name eq "firstname"} +
    + + +
    + {elseif $field_name eq "lastname"} +
    + + +
    + {elseif $field_name eq "address1"} +
    + + +
    + {elseif $field_name eq "address2"} +
    + + +
    + {elseif $field_name eq "city"} +
    + + +
    + {elseif $field_name eq "postcode"} + {$postCodeExist = true} +
    + + +
    + {elseif $field_name eq "company"} +
    + + +
    + {elseif $field_name eq "vat_number"} + + {elseif $field_name eq "dni"} + {assign var='dniExist' value=true} +
    + + + {l s='DNI / NIF / NIE'} +
    + {elseif $field_name eq "country" || $field_name eq "Country:name"} +
    + + +
    + {elseif $field_name eq "state" || $field_name eq 'State:name'} + {$stateExist = true} + + {/if} {/foreach} {if !$postCodeExist} -
    - - -
    +
    + + +
    {/if} {if !$stateExist} -
    - - -
    +
    + + +
    {/if} {if !$dniExist} -
    - - - {l s='DNI / NIF / NIE'} -
    +
    + + + {l s='DNI / NIF / NIE'} +
    {/if} -
    - - -
    -
    +
    -
    +
    - {if isset($one_phone_at_least) && $one_phone_at_least} - {assign var="atLeastOneExists" value=true} -

    ** {l s='You must register at least one phone number.'}

    - {/if} - - -
    - +
    + +
    +
    +
    +
    + {if isset($one_phone_at_least) && $one_phone_at_least} + {assign var="atLeastOneExists" value=true} +

    ** {l s='You must register at least one phone number.'}

    + {/if} + -
    - {assign var=stateExist value=false} - {assign var=postCodeExist value=false} - {assign var='dniExist' value=false} -

    {l s='Additional address'}

    - {foreach from=$inv_all_fields item=field_name} - {if $field_name eq "company"} + {*
    + +
    *} +

    + *{l s='Required field'} +

    +
    +
    + {/if} + {*
    + {assign var=stateExist value=false} + {assign var=postCodeExist value=false} + {assign var='dniExist' value=false} +

    {l s='Additional address'}

    + {foreach from=$inv_all_fields item=field_name} + {if $field_name eq "company"}
    - {elseif $field_name eq "vat_number"} + {elseif $field_name eq "vat_number"} - {elseif $field_name eq "dni"} + {elseif $field_name eq "dni"} {assign var='dniExist' value=true}
    {l s='DNI / NIF / NIE'}
    - {elseif $field_name eq "firstname"} + {elseif $field_name eq "firstname"}
    - {elseif $field_name eq "lastname"} + {elseif $field_name eq "lastname"}
    - {elseif $field_name eq "address1"} + {elseif $field_name eq "address1"}
    - {elseif $field_name eq "address2"} + {elseif $field_name eq "address2"}
    - {elseif $field_name eq "postcode"} + {elseif $field_name eq "postcode"} {$postCodeExist = true}
    - {elseif $field_name eq "city"} + {elseif $field_name eq "city"}
    - {elseif $field_name eq "country" || $field_name eq "Country:name"} + {elseif $field_name eq "country" || $field_name eq "Country:name"}
    - {elseif $field_name eq "state" || $field_name eq 'State:name'} + {elseif $field_name eq "state" || $field_name eq 'State:name'} {$stateExist = true} - {/if} - {/foreach} - {if !$postCodeExist} -
    - - -
    - {/if} - {if !$stateExist} -
    - - -
    - {/if} - {if !$dniExist} -
    - - - {l s='DNI / NIF / NIE'} -
    - {/if} -
    - - -
    - {if isset($one_phone_at_least) && $one_phone_at_least} -

    {l s='You must register at least one phone number.'}

    - {/if} -
    - - -
    -
    - - -
    - + {/if} + {/foreach} + {if !$postCodeExist} +
    + +
    - {$HOOK_CREATE_ACCOUNT_FORM} -
    -

    - *{l s='Required field'} -

    - - + {/if} + {if !$stateExist} +
    + + +
    + {/if} + {if !$dniExist} +
    + + + {l s='DNI / NIF / NIE'}
    - *} + {$HOOK_CREATE_ACCOUNT_FORM} +
    + +
    -
    + + +
    {strip} diff --git a/themes/hotel-reservation-theme/order-opc.tpl b/themes/hotel-reservation-theme/order-opc.tpl index b03fe31b4..6990b7ed7 100644 --- a/themes/hotel-reservation-theme/order-opc.tpl +++ b/themes/hotel-reservation-theme/order-opc.tpl @@ -29,95 +29,363 @@ {assign var="back_order_page" value="order.php"} {/if} -{if $PS_CATALOG_MODE} - {capture name=path}{l s='Your shopping cart'}{/capture} -

    {l s='Your shopping cart'}

    -

    {l s='Your new order was not accepted.'}

    -{else} - {if $productNumber && isset($cart_htl_data)} - - {if isset($cartChanged) && $cartChanged} -

    {l s='Your Booking Cart has been changed automatically as some rooms in your booking cart has been booked by another customer.'}

    - {/if} +
    +
    +
    +
    + {if $PS_CATALOG_MODE} + {capture name=path}{l s='Your shopping cart'}{/capture} +

    {l s='Your shopping cart'}

    +

    {l s='Your new order was not accepted.'}

    + {else} + {if $productNumber && isset($cart_htl_data)} - {include file="$tpl_dir./shopping-cart.tpl"} +
    + {include file="$tpl_dir./errors.tpl"} + {* Shopping Cart *} + {if isset($cartChanged) && $cartChanged} +

    {l s='Your Booking Cart has been changed automatically as some rooms in your booking cart has been booked by another customer.'}

    + {/if} - - {include file="$tpl_dir./order-opc-advanced-payment-option.tpl"} + {* Accordian for all blocks *} +
    + {if isset($checkout_process_steps) && $checkout_process_steps} + {foreach $checkout_process_steps as $step} + {if $step->step_key == 'checkout_rooms_summary'} +
    +
    +
    + {l s='Rooms & Price Summary'} + +
    +
    + {if $step->step_is_reachable} +
    +
    + {* This tpl includes room type lists in the orders *} + {include file="$tpl_dir./shopping-cart.tpl"} +
    +
    + {/if} +
    + {* End Shopping Cart *} + {elseif $step->step_key == 'checkout_customer'} +
    +
    +
    + {l s='Guest Information'} + + + {if $is_logged || $isGuest} + {if isset($delivery->id) && $delivery->id} + + {l s='edit'} + + {else} + + {l s='edit'} + + {/if} + {/if} + +
    +
    + {if $step->step_is_reachable} +
    +
    + {if $is_logged || $isGuest} +
    +
    {l s='Email'}
    +
    {$guestInformations['email']}
    +
    +
    +
    {l s='Address Details'}
    +
    +
      + {foreach from=$addressLayout.ordered name=adr_loop item=pattern} + {assign var=addressKey value=" "|explode:$pattern} +
    • + {foreach from=$addressKey item=key name="word_loop"} + {if isset($addressLayout.formated[$key|replace:',':''])} + + {$addressLayout.formated[$key|replace:',':'']|escape:'html':'UTF-8'} + + {/if} + {/foreach} +
    • + {/foreach} +
    +
    +
    +
    + + {else} + + {include file="$tpl_dir./order-opc-new-account.tpl"} + {/if} +
    +
    + {/if} +
    + {elseif $step->step_key == 'checkout_payment'} + {*
    + + {include file="$tpl_dir./order-carrier.tpl"} + +
    *} +
    +
    +
    + {l s='Payment Information'} + +
    +
    + {if $step->step_is_reachable} +
    +
    + + {include file="$tpl_dir./order-payment.tpl"} + +
    +
    + {/if} +
    + {/if} + {/foreach} + {/if} +
    +
    +
    + {* Total cart details, tax details, advance payment details and voucher details *} +
    +

    + {l s='Total Rooms Cost'} + {displayPrice price=$total_products} +

    + {if $use_taxes && $show_taxes && $total_tax != 0 } + {if $priceDisplay != 0} +

    + {if $display_tax_label}{l s='Total (tax excl.)'}{else}{l s='Total'}{/if} - + {displayPrice price=$total_price_without_tax} +

    + {/if} +

    + {l s='Tax'} + {displayPrice price=$total_tax} +

    + {/if} +

    + + {if $use_taxes} + {if $display_tax_label}{l s='Total gift wrapping (tax incl.)'}{else}{l s='Total gift-wrapping cost'}{/if} + {else} + {l s='Total gift-wrapping cost'} + {/if} + + + {if $use_taxes} + {if $priceDisplay} + {displayPrice price=$total_wrapping_tax_exc} + {else} + {displayPrice price=$total_wrapping} + {/if} + {else} + {displayPrice price=$total_wrapping_tax_exc} + {/if} + +

    + {if isset($customer_adv_dtl)} +

    + {l s='Advance Payment Amount'} + {displayPrice price=$adv_amount} +

    +

    + {l s='Due Amount'} + {displayPrice price=$customer_adv_dtl['due_amount']} +

    + {/if} +

    + + {if $display_tax_label} + {if $use_taxes && $priceDisplay == 0} + {l s='Total Discount (tax incl)'} + {else} + {l s='Total Discount (tax excl)'} + {/if} + {else} + {l s='Total Discount'} + {/if} + + + {if $use_taxes && $priceDisplay == 0} + {assign var='total_discounts_negative' value=$total_discounts * -1} + {else} + {assign var='total_discounts_negative' value=$total_discounts_tax_exc * -1} + {/if} + {displayPrice price=$total_discounts_negative} + +

    +

    + {if isset($customer_adv_dtl)} + {l s='Final Total'} + {displayPrice price=$customer_adv_dtl['total_to_be_paid']} + {else} + {l s='Final Total'} + + {if $use_taxes} + {displayPrice price=$total_price} + {else} + {displayPrice price=$total_price_without_tax} + {/if} + +

    + {hook h="displayCartTotalPriceLabel"} +
    + {/if} +

    +
    + {* Check if voucher feature is enabled currently *} + {if $voucherAllowed} + {* Cart vouchers block *} +
    +

    {l s='Apply Coupon'}

    +

    {l s='Have promocode ?'}

    + {* Applied vouchers to the cart *} + {if sizeof($discounts)} +
    + {foreach $discounts as $discount} + {if ((float)$discount.value_real == 0 && $discount.free_shipping != 1) || ((float)$discount.value_real == 0 && $discount.code == '')} + {continue} + {/if} - - {if !$is_logged} - - {include file="$tpl_dir./order-opc-new-account.tpl"} - - {/if} - - {include file="$tpl_dir./order-carrier.tpl"} - - - - {include file="$tpl_dir./order-payment.tpl"} - - {else} - {capture name=path}{l s='Your shopping cart'}{/capture} -

    {l s='Your shopping cart'}

    - {include file="$tpl_dir./errors.tpl"} +
    + + {$discount.name|escape:'html':'UTF-8'} + {if strlen($discount.code)} + + + + {/if} + + + {l s='Applied'} + +
    + {/foreach} +
    +
    + {/if} +
    + {* Form to apply voucher to the cart *} +
    +
    + + +
    +
    + +
    +
    +
    + + {* The available highlighted vouchers for the customer*} + {if $displayVouchers} +

    {l s='Available Coupons'}

    +
    + {foreach from=$displayVouchers key=key item=voucher name=availVoucher} +
    +

    + {$voucher.code|escape:'html':'UTF-8'} +

    +

    {$voucher['description']}

    + {if not $smarty.foreach.availVoucher.last} +
    + {/if} +
    + {/foreach} +
    + {/if} +
    + {/if} + {* End Voucher Block *} +
    + {else} + {capture name=path}{l s='Your shopping cart'}{/capture} +

    {l s='Your shopping cart'}

    + {include file="$tpl_dir./errors.tpl"} - {if isset($cartChanged) && $cartChanged} -

    {l s='Your booking cart has been changed automatically as some rooms in your booking cart has been booked by another customer.'}

    - {/if} + {if isset($cartChanged) && $cartChanged} +

    {l s='Your booking cart has been changed automatically as some rooms in your booking cart has been booked by another customer.'}

    + {/if} -

    {l s='Till now you did not enter any room in your cart.'}

    - {/if} -{strip} -{addJsDef imgDir=$img_dir} -{addJsDef authenticationUrl=$link->getPageLink("authentication", true)|escape:'quotes':'UTF-8'} -{addJsDef orderOpcUrl=$link->getPageLink("order-opc", true)|escape:'quotes':'UTF-8'} -{addJsDef historyUrl=$link->getPageLink("history", true)|escape:'quotes':'UTF-8'} -{addJsDef guestTrackingUrl=$link->getPageLink("guest-tracking", true)|escape:'quotes':'UTF-8'} -{addJsDef addressUrl=$link->getPageLink("address", true, NULL, "back={$back_order_page}")|escape:'quotes':'UTF-8'} -{addJsDef orderProcess='order-opc'} -{addJsDef guestCheckoutEnabled=$PS_GUEST_CHECKOUT_ENABLED|intval} -{addJsDef displayPrice=$priceDisplay} -{addJsDef taxEnabled=$use_taxes} -{addJsDef conditionEnabled=$conditions|intval} -{addJsDef vat_management=$vat_management|intval} -{addJsDef errorCarrier=$errorCarrier|@addcslashes:'\''} -{addJsDef errorTOS=$errorTOS|@addcslashes:'\''} -{addJsDef checkedCarrier=$checked|intval} -{addJsDef addresses=array()} -{addJsDef isVirtualCart=$isVirtualCart|intval} -{addJsDef isPaymentStep=$isPaymentStep|intval} -{addJsDefL name=txtWithTax}{l s='(tax incl.)' js=1}{/addJsDefL} -{addJsDefL name=txtWithoutTax}{l s='(tax excl.)' js=1}{/addJsDefL} -{addJsDefL name=txtHasBeenSelected}{l s='has been selected' js=1}{/addJsDefL} -{addJsDefL name=txtNoCarrierIsSelected}{l s='No carrier has been selected' js=1}{/addJsDefL} -{addJsDefL name=txtNoCarrierIsNeeded}{l s='No carrier is needed for this order' js=1}{/addJsDefL} -{addJsDefL name=txtConditionsIsNotNeeded}{l s='You do not need to accept the Terms of Service for this order.' js=1}{/addJsDefL} -{addJsDefL name=txtTOSIsAccepted}{l s='The service terms have been accepted' js=1}{/addJsDefL} -{addJsDefL name=txtTOSIsNotAccepted}{l s='The service terms have not been accepted' js=1}{/addJsDefL} -{addJsDefL name=txtThereis}{l s='There is' js=1}{/addJsDefL} -{addJsDefL name=txtErrors}{l s='Error(s)' js=1}{/addJsDefL} -{addJsDefL name=txtDeliveryAddress}{l s='Delivery address' js=1}{/addJsDefL} -{addJsDefL name=txtInvoiceAddress}{l s='Invoice address' js=1}{/addJsDefL} -{addJsDefL name=txtModifyMyAddress}{l s='Modify my address' js=1}{/addJsDefL} -{addJsDefL name=txtInstantCheckout}{l s='Instant checkout' js=1}{/addJsDefL} -{addJsDefL name=txtSelectAnAddressFirst}{l s='Please start by selecting an address.' js=1}{/addJsDefL} -{addJsDefL name=txtFree}{l s='Free' js=1}{/addJsDefL} +

    {l s='Till now you did not enter any room in your cart.'}

    + {/if} + {strip} + {addJsDef imgDir=$img_dir} + {addJsDef authenticationUrl=$link->getPageLink("authentication", true)|escape:'quotes':'UTF-8'} + {addJsDef orderOpcUrl=$link->getPageLink("order-opc", true)|escape:'quotes':'UTF-8'} + {addJsDef historyUrl=$link->getPageLink("history", true)|escape:'quotes':'UTF-8'} + {addJsDef guestTrackingUrl=$link->getPageLink("guest-tracking", true)|escape:'quotes':'UTF-8'} + {addJsDef addressUrl=$link->getPageLink("address", true, NULL, "back={$back_order_page}")|escape:'quotes':'UTF-8'} + {addJsDef orderProcess='order-opc'} + {addJsDef guestCheckoutEnabled=$PS_GUEST_CHECKOUT_ENABLED|intval} + {addJsDef displayPrice=$priceDisplay} + {addJsDef taxEnabled=$use_taxes} + {addJsDef conditionEnabled=$conditions|intval} + {addJsDef vat_management=$vat_management|intval} + {addJsDef errorCarrier=$errorCarrier|@addcslashes:'\''} + {addJsDef errorTOS=$errorTOS|@addcslashes:'\''} + {addJsDef checkedCarrier=$checked|intval} + {addJsDef addresses=array()} + {addJsDef isVirtualCart=$isVirtualCart|intval} + {addJsDef isPaymentStep=$isPaymentStep|intval} + {addJsDefL name=txtWithTax}{l s='(tax incl.)' js=1}{/addJsDefL} + {addJsDefL name=txtWithoutTax}{l s='(tax excl.)' js=1}{/addJsDefL} + {addJsDefL name=txtHasBeenSelected}{l s='has been selected' js=1}{/addJsDefL} + {addJsDefL name=txtNoCarrierIsSelected}{l s='No carrier has been selected' js=1}{/addJsDefL} + {addJsDefL name=txtNoCarrierIsNeeded}{l s='No carrier is needed for this order' js=1}{/addJsDefL} + {addJsDefL name=txtConditionsIsNotNeeded}{l s='You do not need to accept the Terms of Service for this order.' js=1}{/addJsDefL} + {addJsDefL name=txtTOSIsAccepted}{l s='The service terms have been accepted' js=1}{/addJsDefL} + {addJsDefL name=txtTOSIsNotAccepted}{l s='The service terms have not been accepted' js=1}{/addJsDefL} + {addJsDefL name=txtThereis}{l s='There is' js=1}{/addJsDefL} + {addJsDefL name=txtErrors}{l s='Error(s)' js=1}{/addJsDefL} + {addJsDefL name=txtDeliveryAddress}{l s='Delivery address' js=1}{/addJsDefL} + {addJsDefL name=txtInvoiceAddress}{l s='Invoice address' js=1}{/addJsDefL} + {addJsDefL name=txtModifyMyAddress}{l s='Modify my address' js=1}{/addJsDefL} + {addJsDefL name=txtInstantCheckout}{l s='Instant checkout' js=1}{/addJsDefL} + {addJsDefL name=txtSelectAnAddressFirst}{l s='Please start by selecting an address.' js=1}{/addJsDefL} + {addJsDefL name=txtFree}{l s='Free' js=1}{/addJsDefL} -{capture}{if $back}&mod={$back|urlencode}{/if}{/capture} -{capture name=addressUrl}{$link->getPageLink('address', true, NULL, 'back='|cat:$back_order_page|cat:'?step=1'|cat:$smarty.capture.default)|escape:'quotes':'UTF-8'}{/capture} -{addJsDef addressUrl=$smarty.capture.addressUrl} -{capture}{'&multi-shipping=1'|urlencode}{/capture} -{addJsDef addressMultishippingUrl=$smarty.capture.addressUrl|cat:$smarty.capture.default} -{capture name=addressUrlAdd}{$smarty.capture.addressUrl|cat:'&id_address='}{/capture} -{addJsDef addressUrlAdd=$smarty.capture.addressUrlAdd} -{addJsDef opc=$opc|boolval} -{capture}

    {l s='Your billing address' js=1}

    {/capture} -{addJsDefL name=titleInvoice}{$smarty.capture.default|@addcslashes:'\''}{/addJsDefL} -{capture}

    {l s='Your delivery address' js=1}

    {/capture} -{addJsDefL name=titleDelivery}{$smarty.capture.default|@addcslashes:'\''}{/addJsDefL} -{capture}{l s='Update' js=1}{/capture} -{addJsDefL name=liUpdate}{$smarty.capture.default|@addcslashes:'\''}{/addJsDefL} -{/strip} -{/if} \ No newline at end of file + {capture}{if $back}&mod={$back|urlencode}{/if}{/capture} + {capture name=addressUrl}{$link->getPageLink('address', true, NULL, 'back='|cat:$back_order_page|cat:'?step=1'|cat:$smarty.capture.default)|escape:'quotes':'UTF-8'}{/capture} + {addJsDef addressUrl=$smarty.capture.addressUrl} + {capture}{'&multi-shipping=1'|urlencode}{/capture} + {addJsDef addressMultishippingUrl=$smarty.capture.addressUrl|cat:$smarty.capture.default} + {capture name=addressUrlAdd}{$smarty.capture.addressUrl|cat:'&id_address='}{/capture} + {addJsDef addressUrlAdd=$smarty.capture.addressUrlAdd} + {addJsDef opc=$opc|boolval} + {capture}

    {l s='Your billing address' js=1}

    {/capture} + {addJsDefL name=titleInvoice}{$smarty.capture.default|@addcslashes:'\''}{/addJsDefL} + {capture}

    {l s='Your delivery address' js=1}

    {/capture} + {addJsDefL name=titleDelivery}{$smarty.capture.default|@addcslashes:'\''}{/addJsDefL} + {capture}{l s='Update' js=1}{/capture} + {addJsDefL name=liUpdate}{$smarty.capture.default|@addcslashes:'\''}{/addJsDefL} + {/strip} + {/if} +
    +
    +
    +
    \ No newline at end of file diff --git a/themes/hotel-reservation-theme/order-payment-classic.tpl b/themes/hotel-reservation-theme/order-payment-classic.tpl index b612eea1a..1955938ed 100644 --- a/themes/hotel-reservation-theme/order-payment-classic.tpl +++ b/themes/hotel-reservation-theme/order-payment-classic.tpl @@ -23,6 +23,17 @@ * International Registered Trademark & Property of PrestaShop SA *}
    + {include file="$tpl_dir./order-opc-advanced-payment-option.tpl"} + +
    +

    + + + {l s='(Read the Terms of Service)'} +

    +
    + +

    {l s='PAYMENT RESOURCE'}

    {$HOOK_TOP_PAYMENT}
    {if $HOOK_PAYMENT} {if !$opc} diff --git a/themes/hotel-reservation-theme/order-payment.tpl b/themes/hotel-reservation-theme/order-payment.tpl index f47501b49..ee6695337 100644 --- a/themes/hotel-reservation-theme/order-payment.tpl +++ b/themes/hotel-reservation-theme/order-payment.tpl @@ -33,8 +33,6 @@ {/if} -{else} -

    {l s='Payment methods'}

    {/if} {if !$opc} @@ -45,7 +43,6 @@
    {/if} - {if $advanced_payment_api} {include file="$tpl_dir./order-payment-advanced.tpl"} {else} diff --git a/themes/hotel-reservation-theme/shopping-cart.tpl b/themes/hotel-reservation-theme/shopping-cart.tpl index 192101e55..2a82936d2 100644 --- a/themes/hotel-reservation-theme/shopping-cart.tpl +++ b/themes/hotel-reservation-theme/shopping-cart.tpl @@ -41,7 +41,6 @@ {assign var='current_step' value='summary'} {include file="$tpl_dir./order-steps.tpl"} -{include file="$tpl_dir./errors.tpl"} {if isset($empty)}

    {l s='Your shopping cart is empty.'}

    @@ -78,375 +77,113 @@ {assign var='total_wrapping_taxes_num' value="{if $total_wrapping != 0}1{else}0{/if}"} {* eu-legal *} {hook h="displayBeforeShoppingCartBlock"} -
    - - - - - - - - - - - - - - - - - {assign var='rowspan_total' value=2+$total_discounts_num+$total_wrapping_taxes_num} - {if $use_taxes && $show_taxes && $total_tax != 0} - {assign var='rowspan_total' value=$rowspan_total+1} - {/if} - - {if $priceDisplay != 0} - {assign var='rowspan_total' value=$rowspan_total+1} - {/if} - - {*{if $total_shipping_tax_exc <= 0 && (!isset($isVirtualCart) || !$isVirtualCart) && $free_ship} - {assign var='rowspan_total' value=$rowspan_total+1} - {else} - {if $use_taxes && $total_shipping_tax_exc != $total_shipping} - {if $priceDisplay && $total_shipping_tax_exc > 0} - {assign var='rowspan_total' value=$rowspan_total+1} - {elseif $total_shipping > 0} - {assign var='rowspan_total' value=$rowspan_total+1} - {/if} - {elseif $total_shipping_tax_exc > 0} - {assign var='rowspan_total' value=$rowspan_total+1} - {/if} - {/if} *} - - {if $use_taxes} - {if $priceDisplay} - - - - - - {else} - - - - - - {/if} - {else} - - - - - - {/if} - - - - {*{if $total_shipping_tax_exc <= 0 && (!isset($isVirtualCart) || !$isVirtualCart) && $free_ship} - - - - - {else} - {if $use_taxes && $total_shipping_tax_exc != $total_shipping} - {if $priceDisplay} - - - - - {else} - - - - - {/if} - {else} - - - - - {/if} - {/if} - *} - {if isset($customer_adv_dtl)} - - - - - {/if} - - - - - - - {if isset($customer_adv_dtl)} - - - - - {/if} - - {if $use_taxes && $show_taxes && $total_tax != 0 } - {if $priceDisplay != 0} - - - - - {/if} - - - - - {/if} - - - {if $use_taxes} - - {else} - - {/if} - - - {if isset($customer_adv_dtl)} - - - - - {/if} - - - {if isset($cart_htl_data)} - {foreach from=$cart_htl_data key=data_k item=data_v} - {foreach from=$data_v['date_diff'] key=rm_k item=rm_v} - - - - - - - - - - - - - {/foreach} - {/foreach} - {/if} - - - {if sizeof($discounts)} - - {foreach $discounts as $discount} - {if ((float)$discount.value_real == 0 && $discount.free_shipping != 1) || ((float)$discount.value_real == 0 && $discount.code == '')} - {continue} - {/if} - - - - - - - - - {/foreach} - - {/if} -
    {l s='Room Image'}{l s='Room Description'}{l s='Hotel Name'}{l s='Room Capacity'}{l s='Unit Price'}{l s='Rooms'}{l s='Check-in Date'}{l s='Check-out Date'} {l s='Total'}
    - {if $voucherAllowed} - {if isset($errors_discount) && $errors_discount} -
      - {foreach $errors_discount as $k=>$error} -
    • {$error|escape:'html':'UTF-8'}
    • - {/foreach} -
    - {/if} -
    -
    -

    {l s='Vouchers'}

    - - - -
    -
    - {if $displayVouchers} -

    {l s='Take advantage of our exclusive offers:'}

    -
    - {foreach $displayVouchers as $voucher} - {if $voucher.code != ''}{$voucher.code|escape:'html':'UTF-8'} - {/if}{$voucher.name}
    - {/foreach} -
    - {/if} - {/if} -
    {if $display_tax_label}{l s='Total Rooms Cost (tax excl.)'}{else}{l s='Total Rooms Cost'}{/if}{displayPrice price=$total_products}
    - {if $voucherAllowed} - {if isset($errors_discount) && $errors_discount} -
      - {foreach $errors_discount as $k=>$error} -
    • {$error|escape:'html':'UTF-8'}
    • - {/foreach} -
    - {/if} -
    -
    -

    {l s='Vouchers'}

    - - - -
    -
    - {if $displayVouchers} -

    {l s='Take advantage of our exclusive offers:'}

    -
    - {foreach $displayVouchers as $voucher} - {if $voucher.code != ''}{$voucher.code|escape:'html':'UTF-8'} - {/if}{$voucher.name}
    - {/foreach} -
    - {/if} - {/if} -
    {if $display_tax_label}{l s='Total Rooms Cost (tax incl.)'}{else}{l s='Total Rooms Cost'}{/if}{displayPrice price=$total_products_wt}
    - {if $voucherAllowed} - {if isset($errors_discount) && $errors_discount} -
      - {foreach $errors_discount as $k=>$error} -
    • {$error|escape:'html':'UTF-8'}
    • - {/foreach} -
    - {/if} -
    -
    -

    {l s='Vouchers'}

    - - - -
    -
    - {if $displayVouchers} -

    {l s='Take advantage of our exclusive offers:'}

    -
    - {foreach $displayVouchers as $voucher} - {if $voucher.code != ''}{$voucher.code|escape:'html':'UTF-8'} - {/if}{$voucher.name}
    - {/foreach} -
    - {/if} - {/if} -
    {l s='Total Rooms Cost'}{displayPrice price=$total_products}
    - {if $use_taxes} - {if $display_tax_label}{l s='Total gift wrapping (tax incl.)'}{else}{l s='Total gift-wrapping cost'}{/if} - {else} - {l s='Total gift-wrapping cost'} - {/if} - - {if $use_taxes} - {if $priceDisplay} - {displayPrice price=$total_wrapping_tax_exc} - {else} - {displayPrice price=$total_wrapping} - {/if} - {else} - {displayPrice price=$total_wrapping_tax_exc} - {/if} -
    {l s='Total shipping'}{l s='Free shipping!'}
    {if $display_tax_label}{l s='Total shipping (tax excl.)'}{else}{l s='Total shipping'}{/if}{displayPrice price=$total_shipping_tax_exc}
    {if $display_tax_label}{l s='Total shipping (tax incl.)'}{else}{l s='Total shipping'}{/if}{displayPrice price=$total_shipping}
    {l s='Total shipping'}{displayPrice price=$total_shipping_tax_exc}
    - {l s='Advance Payment Amount'} - - {displayPrice price=$adv_amount} -
    - {if $display_tax_label} - {if $use_taxes && $priceDisplay == 0} - {l s='Total vouchers (tax incl.)'} - {else} - {l s='Total vouchers (tax excl.)'} - {/if} - {else} - {l s='Total vouchers'} - {/if} - - {if $use_taxes && $priceDisplay == 0} - {assign var='total_discounts_negative' value=$total_discounts * -1} - {else} - {assign var='total_discounts_negative' value=$total_discounts_tax_exc * -1} - {/if} - {displayPrice price=$total_discounts_negative} -
    - {l s='Due Amount'} - - {displayPrice price=$customer_adv_dtl['due_amount']} -
    {if $display_tax_label}{l s='Total (tax excl.)'}{else}{l s='Total'}{/if}{displayPrice price=$total_price_without_tax}
    {l s='Tax'}{displayPrice price=$total_tax}
    - {l s='Total'} -
    - {hook h="displayCartTotalPriceLabel"} -
    -
    - {displayPrice price=$total_price} - - {displayPrice price=$total_price_without_tax} -
    - {l s='Total To Be Paid'} - - {displayPrice price=$customer_adv_dtl['total_to_be_paid']} -
    +
    +

    {l s='rooms information'}

    + {foreach from=$cart_htl_data key=data_k item=data_v} + {foreach from=$data_v['date_diff'] key=rm_k item=rm_v} +
    -

    - - {$data_v['name']} - -

    -
    {$data_v['hotel_name']} -

    - {$data_v['adult']} {l s='Adults'}, {$data_v['children']} {l s='Children'} -

    -
    -

    -   - - {displayPrice price=$rm_v['feature_price']|floatval|round:2} - + +

    + {if isset($data_v['hotel_info']['location'])} +

    +  {$data_v['hotel_info']['location']}

    -
    -

    - {$rm_v['num_rm']} -

    -
    -

    - {$rm_v['data_form']|date_format:"%d-%m-%Y"} -

    -
    -

    - {$rm_v['data_to']|date_format:"%d-%m-%Y"} -

    -
    - - -

    + {/if} + + + {if isset($data_v['hotel_info']['room_features'])} +

    + {foreach $data_v['hotel_info']['room_features'] as $feature} + + {$feature['name']} + + {/foreach} +
    + {/if} +
    +
    +

    {l s='CHECK IN'}

    +

    {$rm_v['data_form']|date_format:"%d %b, %a"}

    +
    +
    +

    {l s='CHECK OUT'}

    +

    {$rm_v['data_to']|date_format:"%d %b, %a"}

    +
    +
    +

    {l s='ROOMS'}

    +

    + {if {$rm_v['num_rm']} <= 9}0{$rm_v['num_rm']}{else}{$rm_v['num_rm']}{/if} +

    +
    +
    +

    {l s='NO. OF GUESTS'}

    +

    + {if {$data_v['adult']} <= 9}0{$data_v['adult']}{else}{$data_v['adult']}{/if} {l s='Adults'}, {if {$data_v['children']} <= 9}0{$data_v['children']}{else}{$data_v['children']}{/if} {l s='Child'} +

    +
    +
    +
    +
    +

    + {displayPrice price=$rm_v['amount']} + +

    +

    + {l s='Prices for'} {$rm_v['num_days']} {l s='Night(s) stay'}{if $use_taxes} {l s='(Included'} {else}{l s='(Excluded)'}{/if} {l s='all taxes.)'} +

    +
    +
    +
    +

    + {if $rm_v['feature_price_diff'] > 0} + {if $use_taxes}{displayPrice price=$data_v['unit_price_without_reduction']}{else}{displayPrice price=$data_v['unit_price']}{/if} + {/if} {displayPrice price=$rm_v['feature_price']}/{l s='Per Night'}

    -
    {$discount.name} - - {if !$priceDisplay}{displayPrice price=$discount.value_real*-1}{else}{displayPrice price=$discount.value_tax_exc*-1}{/if} - - 1 - {if strlen($discount.code)} - - - - {/if} - - {if !$priceDisplay}{displayPrice price=$discount.value_real*-1}{else}{displayPrice price=$discount.value_tax_exc*-1}{/if} -
    -
    + {if $rm_v['feature_price_diff'] > 0} +

    {l s='You save'} {displayPrice price=($rm_v['feature_price_diff'])} {l s='per night'}

    + {/if} +
    +
    +
    +
    +
    +
    + {/foreach} + {/foreach} + + {if $show_option_allow_separate_package}

    @@ -555,9 +292,9 @@

    {if isset($HOOK_SHOPPING_CART_EXTRA)}{$HOOK_SHOPPING_CART_EXTRA}{/if}
    -{strip} -{addJsDef deliveryAddress=$cart->id_address_delivery|intval} -{addJsDefL name=txtProduct}{l s='product' js=1}{/addJsDefL} -{addJsDefL name=txtProducts}{l s='products' js=1}{/addJsDefL} -{/strip} + {strip} + {addJsDef deliveryAddress=$cart->id_address_delivery|intval} + {addJsDefL name=txtProduct}{l s='product' js=1}{/addJsDefL} + {addJsDefL name=txtProducts}{l s='products' js=1}{/addJsDefL} + {/strip} {/if} \ No newline at end of file diff --git a/themes/hotel-reservation-theme/themeconfigurator.php b/themes/hotel-reservation-theme/themeconfigurator.php deleted file mode 100644 index b760f5188..000000000 --- a/themes/hotel-reservation-theme/themeconfigurator.php +++ /dev/null @@ -1,851 +0,0 @@ - -* @copyright 2007-2015 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class ThemeConfigurator extends Module -{ - protected $max_image_size = 1048576; - protected $default_language; - protected $languages; - - public function __construct() - { - $this->name = 'themeconfigurator'; - $this->tab = 'front_office_features'; - $this->version = '2.1.0'; - $this->bootstrap = true; - $this->secure_key = Tools::encrypt($this->name); - $this->default_language = Language::getLanguage(Configuration::get('PS_LANG_DEFAULT')); - $this->languages = Language::getLanguages(); - $this->author = 'PrestaShop'; - parent::__construct(); - $this->displayName = $this->l('Theme configurator'); - $this->description = $this->l('Configure the main elements of your theme.'); - $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_); - $this->module_path = _PS_MODULE_DIR_.$this->name.'/'; - $this->uploads_path = _PS_MODULE_DIR_.$this->name.'/img/'; - $this->admin_tpl_path = _PS_MODULE_DIR_.$this->name.'/views/templates/admin/'; - $this->hooks_tpl_path = _PS_MODULE_DIR_.$this->name.'/views/templates/hooks/'; - } - - public function createAjaxController() - { - $tab = new Tab(); - $tab->active = 1; - $languages = Language::getLanguages(false); - if (is_array($languages)) - foreach ($languages as $language) - $tab->name[$language['id_lang']] = 'themeconfigurator'; - $tab->class_name = 'AdminThemeConfigurator'; - $tab->module = $this->name; - $tab->id_parent = - 1; - return (bool)$tab->add(); - } - - private function _removeAjaxContoller() - { - if ($tab_id = (int)Tab::getIdFromClassName('AdminThemeConfigurator')) - { - $tab = new Tab($tab_id); - $tab->delete(); - } - return true; - } - - public function install() - { - $themes_colors = array( - 'theme1', - 'theme2', - 'theme3', - 'theme4', - 'theme5', - 'theme6', - 'theme7', - 'theme8', - 'theme9' - ); - $themes_fonts = array( - 'font1' => 'Open Sans', - 'font2' => 'Josefin Slab', - 'font3' => 'Arvo', - 'font4' => 'Lato', - 'font5' => 'Volkorn', - 'font6' => 'Abril Fatface', - 'font7' => 'Ubuntu', - 'font8' => 'PT Sans', - 'font9' => 'Old Standard TT', - 'font10' => 'Droid Sans' - ); - - if (!parent::install() - || !$this->installDB() - || !$this->installFixtures(Language::getLanguages(true)) || - !$this->registerHook('displayHeader') || - !$this->registerHook('displayTopColumn') || - !$this->registerHook('displayLeftColumn') || - !$this->registerHook('displayRightColumn') || - !$this->registerHook('displayHome') || - !$this->registerHook('displayFooter') || - !$this->registerHook('displayBackOfficeHeader') || - !$this->registerHook('actionObjectLanguageAddAfter') || - !Configuration::updateValue('PS_TC_THEMES', serialize($themes_colors)) || - !Configuration::updateValue('PS_TC_FONTS', serialize($themes_fonts)) || - !Configuration::updateValue('PS_TC_THEME', '') || - !Configuration::updateValue('PS_TC_FONT', '') || - !Configuration::updateValue('PS_TC_ACTIVE', 1) || - !Configuration::updateValue('PS_SET_DISPLAY_SUBCATEGORIES', 1) || - !$this->createAjaxController() - ) - return false; - - return true; - } - - private function installDB() - { - return ( - Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'themeconfigurator`') && - Db::getInstance()->Execute(' - CREATE TABLE `'._DB_PREFIX_.'themeconfigurator` ( - `id_item` int(10) unsigned NOT NULL AUTO_INCREMENT, - `id_shop` int(10) unsigned NOT NULL, - `id_lang` int(10) unsigned NOT NULL, - `item_order` int(10) unsigned NOT NULL, - `title` VARCHAR(100), - `title_use` tinyint(1) unsigned NOT NULL DEFAULT \'0\', - `hook` VARCHAR(100), - `url` int(11), - `target` tinyint(1) unsigned NOT NULL DEFAULT \'0\', - `image` VARCHAR(100), - `image_w` VARCHAR(10), - `image_h` VARCHAR(10), - `html` TEXT, - `description_side` VARCHAR(50), - `active` tinyint(1) unsigned NOT NULL DEFAULT \'1\', - PRIMARY KEY (`id_item`) - ) ENGINE = '._MYSQL_ENGINE_.' DEFAULT CHARSET=UTF8;') - ); - - } - - protected function installFixture($hook, $id_image, $id_shop, $id_lang) - { - $result = true; - - $sizes = @getimagesize((dirname(__FILE__).DIRECTORY_SEPARATOR.'img'.DIRECTORY_SEPARATOR.'banner-img'.(int)$id_image.'.jpg')); - $width = (isset($sizes[0]) && $sizes[0])? (int)$sizes[0] : 0; - $height = (isset($sizes[1]) && $sizes[1])? (int)$sizes[1] : 0; - - $result &= Db::getInstance()->Execute(' - INSERT INTO `'._DB_PREFIX_.'themeconfigurator` ( - `id_shop`, `id_lang`, `item_order`, `title`, `title_use`, `hook`, `url`, `target`, `image`, `image_w`, `image_h`, `html`, `active` - ) VALUES ( - \''.(int)$id_shop.'\', - \''.(int)$id_lang.'\', - \''.(int)$id_image.'\', - \'\', - \'0\', - \''.pSQL($hook).'\', - \'http://www.prestashop.com/\', - \'0\', - \'banner-img'.(int)$id_image.'.jpg\', - '.$width.', - '.$height.', - \'\', - 1) - '); - - return $result; - } - - public function installFixtures($languages = null) - { - $result = true; - - if ($languages === null) - $languages = Language::getLanguages(true); - - foreach ($languages as $language) - { - for ($i = 1; $i < 6; $i++) - $result &= $this->installFixture('home', $i, $this->context->shop->id, $language['id_lang']); - - for ($i = 6; $i < 8; $i++) - $result &= $this->installFixture('top', $i, $this->context->shop->id, $language['id_lang']); - } - - return $result; - } - - - public function uninstall() - { - $images = array(); - if (count(Db::getInstance()->executeS('SHOW TABLES LIKE \''._DB_PREFIX_.'themeconfigurator\''))) - $images = Db::getInstance()->executeS('SELECT image FROM `'._DB_PREFIX_.'themeconfigurator`'); - foreach ($images as $image) - $this->deleteImage($image['image']); - - if (!Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'themeconfigurator`') || !$this->_removeAjaxContoller() || !parent::uninstall()) - return false; - - return true; - } - - public function hookDisplayBackOfficeHeader() - { - if (Tools::getValue('configure') != $this->name) - return; - - $this->context->controller->addCSS($this->_path.'css/admin.css'); - $this->context->controller->addJquery(); - $this->context->controller->addJS($this->_path.'js/admin.js'); - } - - protected function checkEnvironment() - { - $cookie = new Cookie('psAdmin', '', (int)Configuration::get('PS_COOKIE_LIFETIME_BO')); - return isset($cookie->id_employee) && isset($cookie->passwd) && Employee::checkPassword($cookie->id_employee, $cookie->passwd); - } - - public function hookdisplayHeader() - { - $this->context->controller->addCss($this->_path.'css/hooks.css', 'all'); - - if ((int)Configuration::get('PS_TC_ACTIVE') == 1 && Tools::getValue('live_configurator_token') && Tools::getValue('live_configurator_token') == $this->getLiveConfiguratorToken() && $this->checkEnvironment()) - { - $this->context->controller->addCSS($this->_path.'css/live_configurator.css'); - $this->context->controller->addJS($this->_path.'js/live_configurator.js'); - - if (Tools::getValue('theme')) - $this->context->controller->addCss($this->_path.'css/'.Tools::getValue('theme').'.css', 'all'); - - if (Tools::getValue('theme_font')) - $this->context->controller->addCss($this->_path.'css/'.Tools::getValue('theme_font').'.css', 'all'); - } - else - { - if (Configuration::get('PS_TC_THEME') != '') - $this->context->controller->addCss($this->_path.'css/'.Configuration::get('PS_TC_THEME').'.css', 'all'); - - if (Configuration::get('PS_TC_FONT') != '') - $this->context->controller->addCss($this->_path.'css/'.Configuration::get('PS_TC_FONT').'.css', 'all'); - } - - if (isset($this->context->controller->php_self) && $this->context->controller->php_self == 'category') - { - $this->context->smarty->assign(array( - 'display_subcategories' => (int)Configuration::get('PS_SET_DISPLAY_SUBCATEGORIES') - )); - - return $this->display(__FILE__, 'hook.tpl'); - } - } - - public function hookActionObjectLanguageAddAfter($params) - { - return $this->installFixtures(array(array('id_lang' => (int)$params['object']->id))); - } - - public function hookdisplayTopColumn() - { - return $this->hookdisplayTop(); - } - - public function hookdisplayTop() - { - if (!isset($this->context->controller->php_self) || $this->context->controller->php_self != 'index') - return ; - $this->context->smarty->assign(array( - 'htmlitems' => $this->getItemsFromHook('top'), - 'hook' => 'top' - )); - - return $this->display(__FILE__, 'hook.tpl'); - } - - public function hookDisplayHome() - { - $this->context->smarty->assign(array( - 'htmlitems' => $this->getItemsFromHook('home'), - 'hook' => 'home' - )); - - return $this->display(__FILE__, 'hook.tpl'); - } - - public function hookDisplayLeftColumn() - { - $this->context->smarty->assign(array( - 'htmlitems' => $this->getItemsFromHook('left'), - 'hook' => 'left' - )); - - return $this->display(__FILE__, 'hook.tpl'); - } - - public function hookDisplayRightColumn() - { - $this->context->smarty->assign(array( - 'htmlitems' => $this->getItemsFromHook('right'), - 'hook' => 'right' - )); - - return $this->display(__FILE__, 'hook.tpl'); - } - - public function hookDisplayFooter() - { - $html = ''; - - if ((int)Configuration::get('PS_TC_ACTIVE') == 1 && Tools::getValue('live_configurator_token') && Tools::getValue('live_configurator_token') == $this->getLiveConfiguratorToken() && Tools::getIsset('id_employee') && $this->checkEnvironment()) - { - if (Tools::isSubmit('submitLiveConfigurator')) - { - Configuration::updateValue('PS_TC_THEME', Tools::getValue('theme')); - Configuration::updateValue('PS_TC_FONT', Tools::getValue('theme_font')); - } - - $ad_image = $this->_path.'img/'.$this->context->language->iso_code.'/advertisement.png'; - - if (!file_exists($ad_image)) - $ad_image = $this->_path.'img/en/advertisement.png'; - - $this->smarty->assign(array( - 'themes' => Tools::unserialize(Configuration::get('PS_TC_THEMES')), - 'fonts' => Tools::unserialize(Configuration::get('PS_TC_FONTS')), - 'theme_font' => Tools::getValue('theme_font', Configuration::get('PS_TC_FONT')), - 'live_configurator_token' => $this->getLiveConfiguratorToken(), - 'id_shop' => (int)$this->context->shop->id, - 'id_employee' => is_object($this->context->employee) ? (int)$this->context->employee->id : - Tools::getValue('id_employee'), - 'advertisement_image' => $ad_image, - 'advertisement_url' => 'http://addons.prestashop.com/en/205-premium-templates?utm_source=back-office' - .'&utm_medium=theme-configurator' - .'&utm_campaign=back-office-'.Tools::strtoupper($this->context->language->iso_code) - .'&utm_content='.(defined('_PS_HOST_MODE_') ? 'ondemand' : 'download'), - 'advertisement_text' => $this->l('Over 800 PrestaShop premium templates! Browse now!') - )); - - $html .= $this->display(__FILE__, 'live_configurator.tpl'); - } - - $this->context->smarty->assign(array( - 'htmlitems' => $this->getItemsFromHook('footer'), - 'hook' => 'footer' - )); - - return $html.$this->display(__FILE__, 'hook.tpl'); - } - - protected function getItemsFromHook($hook) - { - if (!$hook) - return false; - - return Db::getInstance()->ExecuteS(' - SELECT * - FROM `'._DB_PREFIX_.'themeconfigurator` - WHERE id_shop = '.(int)$this->context->shop->id.' AND id_lang = '.(int)$this->context->language->id.' - AND hook = \''.pSQL($hook).'\' AND active = 1 - ORDER BY item_order ASC'); - } - - protected function deleteImage($image) - { - $file_name = $this->uploads_path.$image; - - if (realpath(dirname($file_name)) != realpath($this->uploads_path)) - Tools::dieOrLog(sprintf('Could not find upload directory')); - - if ($image != '' && is_file($file_name) && !strpos($file_name, 'banner-img') && !strpos($file_name, 'bg-theme') && !strpos($file_name, 'footer-bg')) - unlink($file_name); - } - - protected function removeItem() - { - $id_item = (int)Tools::getValue('item_id'); - - if ($image = Db::getInstance()->getValue('SELECT image FROM `'._DB_PREFIX_.'themeconfigurator` WHERE id_item = '.(int)$id_item)) - $this->deleteImage($image); - - Db::getInstance()->delete(_DB_PREFIX_.'themeconfigurator', 'id_item = '.(int)$id_item); - - if (Db::getInstance()->Affected_Rows() == 1) - { - Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'themeconfigurator` - SET item_order = item_order-1 - WHERE ( - item_order > '.(int)Tools::getValue('item_order').' AND - id_shop = '.(int)$this->context->shop->id.' AND - hook = \''.pSQL(Tools::getValue('item_hook')).'\')' - ); - Tools::redirectAdmin('index.php?tab=AdminModules&configure='.$this->name.'&conf=6&token='.Tools::getAdminTokenLite('AdminModules')); - } - else - $this->context->smarty->assign('error', $this->l('Can\'t delete the slide.')); - } - - protected function updateItem() - { - $id_item = (int)Tools::getValue('item_id'); - $title = Tools::getValue('item_title'); - $content = Tools::getValue('item_html'); - - if (!Validate::isCleanHtml($title, (int)Configuration::get('PS_ALLOW_HTML_IFRAME')) || !Validate::isCleanHtml($content, (int)Configuration::get('PS_ALLOW_HTML_IFRAME'))) - { - $this->context->smarty->assign('error', $this->l('Invalid content')); - return false; - } - - $new_image = ''; - $image_w = (is_numeric(Tools::getValue('item_img_w'))) ? (int)Tools::getValue('item_img_w') : ''; - $image_h = (is_numeric(Tools::getValue('item_img_h'))) ? (int)Tools::getValue('item_img_h') : ''; - - if (!empty($_FILES['item_img']['name'])) - { - if ($old_image = Db::getInstance()->getValue('SELECT image FROM `'._DB_PREFIX_.'themeconfigurator` WHERE id_item = '.(int)$id_item)) - if (file_exists(dirname(__FILE__).'/img/'.$old_image)) - @unlink(dirname(__FILE__).'/img/'.$old_image); - - if (!$image = $this->uploadImage($_FILES['item_img'], $image_w, $image_h)) - return false; - - $new_image = 'image = \''.pSQL($image).'\','; - } - - if (!Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'themeconfigurator` SET - title = \''.pSQL($title).'\', - title_use = '.(int)Tools::getValue('item_title_use').', - hook = \''.pSQL(Tools::getValue('item_hook')).'\', - url = \''.pSQL(Tools::getValue('item_url')).'\', - target = '.(int)Tools::getValue('item_target').', - '.$new_image.' - image_w = '.(int)$image_w.', - image_h = '.(int)$image_h.', - content_side = \''.pSQL(Tools::getValue('description_side')).'\', - active = '.(int)Tools::getValue('item_active').', - html = \''.pSQL($this->filterVar($content), true).'\' - WHERE id_item = '.(int)Tools::getValue('item_id') - )) - { - if ($image = Db::getInstance()->getValue('SELECT image FROM `'._DB_PREFIX_.'themeconfigurator` WHERE id_item = '.(int)Tools::getValue('item_id'))) - $this->deleteImage($image); - - $this->context->smarty->assign('error', $this->l('An error occurred while saving data.')); - - return false; - } - - $this->context->smarty->assign('confirmation', $this->l('Successfully updated.')); - - return true; - } - - protected function uploadImage($image, $image_w = '', $image_h = '') - { - $res = false; - if (is_array($image) && (ImageManager::validateUpload($image, $this->max_image_size) === false) && ($tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS')) && move_uploaded_file($image['tmp_name'], $tmp_name)) - { - $salt = sha1(microtime()); - $pathinfo = pathinfo($image['name']); - $img_name = $salt.'_'.Tools::str2url($pathinfo['filename']).'.'.$pathinfo['extension']; - - if (ImageManager::resize($tmp_name, dirname(__FILE__).'/img/'.$img_name, $image_w, $image_h)) - $res = true; - } - - if (!$res) - { - $this->context->smarty->assign('error', $this->l('An error occurred during the image upload.')); - return false; - } - - return $img_name; - } - - public function getContent() - { - if (Tools::isSubmit('submitModule')) - { - Configuration::updateValue('PS_QUICK_VIEW', (int)Tools::getValue('quick_view')); - Configuration::updateValue('PS_TC_ACTIVE', (int)Tools::getValue('live_conf')); - Configuration::updateValue('PS_GRID_PRODUCT', (int)Tools::getValue('grid_list')); - Configuration::updateValue('PS_SET_DISPLAY_SUBCATEGORIES', (int)Tools::getValue('sub_cat')); - foreach ($this->getConfigurableModules() as $module) - { - if (!isset($module['is_module']) || !$module['is_module'] || !Validate::isModuleName($module['name']) || !Tools::isSubmit($module['name'])) - continue; - - $module_instance = Module::getInstanceByName($module['name']); - if ($module_instance === false || !is_object($module_instance)) - continue; - - $is_installed = (int)Validate::isLoadedObject($module_instance); - if ($is_installed) - { - if (($active = (int)Tools::getValue($module['name'])) == $module_instance->active) - continue; - - if ($active) - $module_instance->enable(); - else - $module_instance->disable(); - } - else - if ((int)Tools::getValue($module['name'])) - $module_instance->install(); - } - } - - if (Tools::isSubmit('newItem')) - $this->addItem(); - elseif (Tools::isSubmit('updateItem')) - $this->updateItem(); - elseif (Tools::isSubmit('removeItem')) - $this->removeItem(); - - $html = $this->renderConfigurationForm(); - $html .= $this->renderThemeConfiguratorForm(); - - return $html; - } - - protected function addItem() - { - $title = Tools::getValue('item_title'); - $content = Tools::getValue('item_html'); - $content_side = Tools::getValue('description_side'); - if (!Validate::isCleanHtml($title, (int)Configuration::get('PS_ALLOW_HTML_IFRAME')) - || !Validate::isCleanHtml($content, (int)Configuration::get('PS_ALLOW_HTML_IFRAME'))) - { - $this->context->smarty->assign('error', $this->l('Invalid content')); - return false; - } - - if (!$current_order = (int)Db::getInstance()->getValue(' - SELECT item_order + 1 - FROM `'._DB_PREFIX_.'themeconfigurator` - WHERE - id_shop = '.(int)$this->context->shop->id.' - AND id_lang = '.(int)Tools::getValue('id_lang').' - AND hook = \''.pSQL(Tools::getValue('item_hook')).'\' - ORDER BY item_order DESC' - )) - $current_order = 1; - - $image_w = is_numeric(Tools::getValue('item_img_w')) ? (int)Tools::getValue('item_img_w') : ''; - $image_h = is_numeric(Tools::getValue('item_img_h')) ? (int)Tools::getValue('item_img_h') : ''; - - if (!empty($_FILES['item_img']['name'])) - { - if (!$image = $this->uploadImage($_FILES['item_img'], $image_w, $image_h)) - return false; - } - else - { - $image = ''; - $image_w = ''; - $image_h = ''; - } - - if (!Db::getInstance()->Execute(' - INSERT INTO `'._DB_PREFIX_.'themeconfigurator` ( - `id_shop`, `id_lang`, `item_order`, `title`, `title_use`, `hook`, `url`, `target`, `image`, `image_w`, `image_h`, `html`, `content_side`, `active` - ) VALUES ( - \''.(int)$this->context->shop->id.'\', - \''.(int)Tools::getValue('id_lang').'\', - \''.(int)$current_order.'\', - \''.pSQL($title).'\', - \''.(int)Tools::getValue('item_title_use').'\', - \''.pSQL(Tools::getValue('item_hook')).'\', - \''.pSQL(Tools::getValue('item_url')).'\', - \''.(int)Tools::getValue('item_target').'\', - \''.pSQL($image).'\', - \''.pSQL($image_w).'\', - \''.pSQL($image_h).'\', - \''.pSQL($this->filterVar($content), true).'\', - \''.pSQL($content_side).'\', - 1)' - )) - { - if (!Tools::isEmpty($image)) - $this->deleteImage($image); - - $this->context->smarty->assign('error', $this->l('An error occurred while saving data.')); - return false; - } - - $this->context->smarty->assign('confirmation', $this->l('New item successfully added.')); - return true; - } - - public function renderConfigurationForm() - { - $inputs = array(); - - foreach ($this->getConfigurableModules() as $module) - { - $desc = ''; - - if (isset($module['is_module']) && $module['is_module']) - { - $module_instance = Module::getInstanceByName($module['name']); - if (Validate::isLoadedObject($module_instance) && method_exists($module_instance, 'getContent')) - $desc = ''.$this->l('Configure').' '; - } - if (!$desc && isset($module['desc']) && $module['desc']) - $desc = $module['desc']; - - $inputs[] = array( - 'type' => 'switch', - 'label' => $module['label'], - 'name' => $module['name'], - 'desc' => $desc, - 'values' => array( - array( - 'id' => 'active_on', - 'value' => 1, - 'label' => $this->l('Enabled') - ), - array( - 'id' => 'active_off', - 'value' => 0, - 'label' => $this->l('Disabled') - ) - ), - ); - } - - $fields_form = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Settings'), - 'icon' => 'icon-cogs' - ), - 'input' => $inputs, - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default pull-right' - ) - ), - ); - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $this->fields_form = array(); - - $helper->identifier = $this->identifier; - $helper->submit_action = 'submitModule'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - return $helper->generateForm(array($fields_form)); - } - - protected function renderThemeConfiguratorForm() - { - $id_shop = (int)$this->context->shop->id; - $items = array(); - $hooks = array(); - - $this->context->smarty->assign('htmlcontent', array( - 'admin_tpl_path' => $this->admin_tpl_path, - 'hooks_tpl_path' => $this->hooks_tpl_path, - - 'info' => array( - 'module' => $this->name, - 'name' => $this->displayName, - 'version' => $this->version, - 'psVersion' => _PS_VERSION_, - 'context' => (Configuration::get('PS_MULTISHOP_FEATURE_ACTIVE') == 0) ? 1 : ($this->context->shop->getTotalShops() != 1) ? $this->context->shop->getContext() : 1 - ) - )); - - foreach ($this->languages as $language) - { - $hooks[$language['id_lang']] = array( - 'home', - 'top', - 'left', - 'right', - 'footer' - ); - - foreach ($hooks[$language['id_lang']] as $hook) - $items[$language['id_lang']][$hook] = Db::getInstance()->ExecuteS(' - SELECT * FROM `'._DB_PREFIX_.'themeconfigurator` - WHERE id_shop = '.(int)$id_shop.' - AND id_lang = '.(int)$language['id_lang'].' - AND hook = \''.pSQL($hook).'\' - ORDER BY item_order ASC' - ); - } - $this->context->smarty->assign('htmlitems', array( - 'items' => $items, - 'theme_url' => $this->context->link->getAdminLink('AdminThemeConfigurator'), - 'lang' => array( - 'default' => $this->default_language, - 'all' => $this->languages, - 'lang_dir' => _THEME_LANG_DIR_, - 'user' => $this->context->language->id - ), - 'postAction' => 'index.php?tab=AdminModules&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&tab_module=other&module_name='.$this->name.'', - 'id_shop' => $id_shop - )); - $all_products = Product::getSimpleProducts((int)Configuration::get('PS_LANG_DEFAULT')); - $this->context->smarty->assign('all_products',$all_products); - $this->context->controller->addJqueryUI('ui.sortable'); - return $this->display(__FILE__, 'views/templates/admin/admin.tpl'); - } - - protected function getConfigurableModules() - { - // Construct the description for the 'Enable Live Configurator' switch - if ($this->context->shop->getBaseURL()) - { - $request = - 'live_configurator_token='.$this->getLiveConfiguratorToken() - .'&id_employee='.(int)$this->context->employee->id - .'&id_shop='.(int)$this->context->shop->id - .(Configuration::get('PS_TC_THEME') != '' ? '&theme='.Configuration::get('PS_TC_THEME') : '') - .(Configuration::get('PS_TC_FONT') != '' ? '&theme_font='.Configuration::get('PS_TC_FONT') : ''); - $url = $this->context->link->getPageLink('index', null, $id_lang = null, $request); - - $desc = '' - .$this->l('View').'
    ' - .$this->l('Only you can see this on your front office - your visitors will not see this tool.'); - } - else - $desc = $this->l('Only you can see this on your front office - your visitors will not see this tool.'); - - return array( - array( - 'label' => $this->l('Display links to your store\'s social accounts (Twitter, Facebook, etc.)'), - 'name' => 'blocksocial', - 'value' => (int)Validate::isLoadedObject($module = Module::getInstanceByName('blocksocial')) && $module->isEnabledForShopContext(), - 'is_module' => true, - ), - array( - 'label' => $this->l('Display your contact information'), - 'name' => 'blockcontactinfos', - 'value' => (int)Validate::isLoadedObject($module = Module::getInstanceByName('blockcontactinfos')) && $module->isEnabledForShopContext(), - 'is_module' => true, - ), - array( - 'label' => $this->l('Display social sharing buttons on the product\'s page'), - 'name' => 'socialsharing', - 'value' => (int)Validate::isLoadedObject($module = Module::getInstanceByName('socialsharing')) && $module->isEnabledForShopContext(), - 'is_module' => true, - ), - array( - 'label' => $this->l('Display the Facebook block on the home page'), - 'name' => 'blockfacebook', - 'value' => (int)Validate::isLoadedObject($module = Module::getInstanceByName('blockfacebook')) && $module->isEnabledForShopContext(), - 'is_module' => true, - ), - array( - 'label' => $this->l('Display the custom CMS information block'), - 'name' => 'blockcmsinfo', - 'value' => (int)Validate::isLoadedObject($module = Module::getInstanceByName('blockcmsinfo')) && $module->isEnabledForShopContext(), - 'is_module' => true, - ), - array( - 'label' => $this->l('Display quick view window on homepage and category pages'), - 'name' => 'quick_view', - 'value' => (int)Tools::getValue('PS_QUICK_VIEW', Configuration::get('PS_QUICK_VIEW')) - ), - array( - 'label' => $this->l('Display categories as a list of products instead of the default grid-based display'), - 'name' => 'grid_list', - 'value' => (int)Configuration::get('PS_GRID_PRODUCT'), - 'desc' => $this->l('Works only for first-time users. This setting is overridden by the user\'s choice as soon as the user cookie is set.'), - ), - array( - 'label' => $this->l('Display top banner'), - 'name' => 'blockbanner', - 'value' => (int)Validate::isLoadedObject($module = Module::getInstanceByName('blockbanner')) && $module->isEnabledForShopContext(), - 'is_module' => true, - ), - array( - 'label' => $this->l('Display logos of available payment methods'), - 'name' => 'productpaymentlogos', - 'value' => (int)Validate::isLoadedObject($module = Module::getInstanceByName('productpaymentlogos')) && $module->isEnabledForShopContext(), - 'is_module' => true, - ), - array( - 'label' => $this->l('Display Live Configurator'), - 'name' => 'live_conf', - 'value' => (int)Tools::getValue('PS_TC_ACTIVE', Configuration::get('PS_TC_ACTIVE')), - 'hint' => $this->l('This customization tool allows you to make color and font changes in your theme.'), - 'desc' => $desc - ), - array( - 'label' => $this->l('Display subcategories'), - 'name' => 'sub_cat', - 'value' => (int)Tools::getValue('PS_SET_DISPLAY_SUBCATEGORIES', Configuration::get('PS_SET_DISPLAY_SUBCATEGORIES')), - ) - ); - } - - public function getConfigFieldsValues() - { - $values = array(); - foreach ($this->getConfigurableModules() as $module) - $values[$module['name']] = $module['value']; - - return $values; - } - - public function getLiveConfiguratorToken() - { - return Tools::getAdminToken($this->name.(int)Tab::getIdFromClassName($this->name) - .(is_object(Context::getContext()->employee) ? (int)Context::getContext()->employee->id : - Tools::getValue('id_employee'))); - } - - protected function filterVar($value) - { - if (version_compare(_PS_VERSION_, '1.6.0.7', '>=') === true) - return Tools::purifyHTML($value); - else - return filter_var($value, FILTER_SANITIZE_STRING); - } -}