mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-08-30 05:00:51 +08:00
Fix code review changes
Add ppcp_ditch_items_breakdown support
This commit is contained in:
parent
4338b9879c
commit
d48c2f60c6
7 changed files with 86 additions and 41 deletions
|
@ -29,6 +29,7 @@
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"WooCommerce\\PayPalCommerce\\": "src",
|
"WooCommerce\\PayPalCommerce\\": "src",
|
||||||
|
"WooCommerce\\PayPalCommerce\\Isolated\\": "lib/isolated/",
|
||||||
"WooCommerce\\PayPalCommerce\\Vendor\\": "lib/packages/"
|
"WooCommerce\\PayPalCommerce\\Vendor\\": "lib/packages/"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace WooCommerce\PayPalCommerce\Vendor\Pattern;
|
namespace WooCommerce\PayPalCommerce\Isolated\Pattern;
|
||||||
|
|
||||||
class SingletonDecorator {
|
class SingletonDecorator {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace WooCommerce\PayPalCommerce\Vendor\Pattern;
|
namespace WooCommerce\PayPalCommerce\Isolated\Pattern;
|
||||||
|
|
||||||
trait SingletonTrait {
|
trait SingletonTrait {
|
||||||
/**
|
/**
|
|
@ -9,22 +9,13 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace WooCommerce\PayPalCommerce\ApiClient;
|
namespace WooCommerce\PayPalCommerce\ApiClient;
|
||||||
|
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\BillingSubscriptions;
|
use WooCommerce\PayPalCommerce\Isolated\Pattern\SingletonDecorator;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\CatalogProducts;
|
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\BillingPlans;
|
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\BillingCycleFactory;
|
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentPreferencesFactory;
|
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PlanFactory;
|
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ProductFactory;
|
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingOptionFactory;
|
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderTransient;
|
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Helper\PurchaseUnitSanitizer;
|
|
||||||
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
|
||||||
use WooCommerce\PayPalCommerce\Vendor\Pattern\SingletonDecorator;
|
|
||||||
use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface;
|
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer;
|
use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Authentication\PayPalBearer;
|
use WooCommerce\PayPalCommerce\ApiClient\Authentication\PayPalBearer;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\BillingAgreementsEndpoint;
|
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\BillingAgreementsEndpoint;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\BillingPlans;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\BillingSubscriptions;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\CatalogProducts;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\IdentityToken;
|
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\IdentityToken;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\LoginSeller;
|
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\LoginSeller;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
|
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
|
||||||
|
@ -37,6 +28,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Factory\AddressFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\AmountFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\AmountFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ApplicationContextFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\ApplicationContextFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\AuthorizationFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\AuthorizationFactory;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\BillingCycleFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\CaptureFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\CaptureFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ExchangeRateFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\ExchangeRateFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\FraudProcessorResponseFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\FraudProcessorResponseFactory;
|
||||||
|
@ -46,26 +38,34 @@ use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PatchCollectionFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\PatchCollectionFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PayeeFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\PayeeFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentPreferencesFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentsFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentsFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentSourceFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentSourceFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentTokenActionLinksFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentTokenActionLinksFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentTokenFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentTokenFactory;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\PlanFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PlatformFeeFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\PlatformFeeFactory;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\ProductFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\SellerReceivableBreakdownFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\SellerReceivableBreakdownFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\SellerStatusFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\SellerStatusFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingFactory;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingOptionFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingPreferenceFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingPreferenceFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookEventFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookEventFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
|
use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper;
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderTransient;
|
||||||
|
use WooCommerce\PayPalCommerce\ApiClient\Helper\PurchaseUnitSanitizer;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\ApplicationContextRepository;
|
use WooCommerce\PayPalCommerce\ApiClient\Repository\ApplicationContextRepository;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\CustomerRepository;
|
use WooCommerce\PayPalCommerce\ApiClient\Repository\CustomerRepository;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\OrderRepository;
|
use WooCommerce\PayPalCommerce\ApiClient\Repository\OrderRepository;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\PartnerReferralsData;
|
use WooCommerce\PayPalCommerce\ApiClient\Repository\PartnerReferralsData;
|
||||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\PayeeRepository;
|
use WooCommerce\PayPalCommerce\ApiClient\Repository\PayeeRepository;
|
||||||
|
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
||||||
|
use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface;
|
||||||
use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
|
use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
|
|
|
@ -339,6 +339,30 @@ class PurchaseUnit {
|
||||||
$purchase_unit = ( $this->sanitizer->sanitize( $purchase_unit, $allow_ditch_items ) );
|
$purchase_unit = ( $this->sanitizer->sanitize( $purchase_unit, $allow_ditch_items ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $this->apply_ditch_items_mismatch_filter(
|
||||||
|
$this->sanitizer->has_ditched_items_breakdown(),
|
||||||
|
$purchase_unit
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function apply_ditch_items_mismatch_filter( bool $ditched_items_breakdown, array $purchase_unit ): array
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The filter can be used to control when the items and totals breakdown are removed from PayPal order info.
|
||||||
|
*/
|
||||||
|
$ditch = apply_filters( 'ppcp_ditch_items_breakdown', $ditched_items_breakdown, $this );
|
||||||
|
|
||||||
|
if ( $ditch ) {
|
||||||
|
unset( $purchase_unit['items'] );
|
||||||
|
unset( $purchase_unit['amount']['breakdown'] );
|
||||||
|
|
||||||
|
if ( isset( $this->sanitizer ) ) {
|
||||||
|
$this->sanitizer->set_last_message(
|
||||||
|
__( 'Ditch items breakdown filter. Items and breakdown ditched.', 'woocommerce-paypal-payments' )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $purchase_unit;
|
return $purchase_unit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,13 @@ class PurchaseUnitSanitizer {
|
||||||
*/
|
*/
|
||||||
private $last_message = '';
|
private $last_message = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the items and breakdown has been ditched.
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private $has_ditched_items_breakdown = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PurchaseUnitSanitizer constructor.
|
* PurchaseUnitSanitizer constructor.
|
||||||
*
|
*
|
||||||
|
@ -88,24 +95,6 @@ class PurchaseUnitSanitizer {
|
||||||
$this->extra_line_name = $extra_line_name;
|
$this->extra_line_name = $extra_line_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates if mode is ditch.
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
private function is_mode_ditch(): bool {
|
|
||||||
return $this->mode === self::MODE_DITCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates if mode is adding extra line.
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
private function is_mode_extra_line(): bool {
|
|
||||||
return $this->mode === self::MODE_EXTRA_LINE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The purchase_unit amount.
|
* The purchase_unit amount.
|
||||||
*
|
*
|
||||||
|
@ -163,8 +152,9 @@ class PurchaseUnitSanitizer {
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function sanitize( array $purchase_unit, bool $allow_ditch_items = true ): array {
|
public function sanitize( array $purchase_unit, bool $allow_ditch_items = true ): array {
|
||||||
$this->purchase_unit = $purchase_unit;
|
$this->purchase_unit = $purchase_unit;
|
||||||
$this->allow_ditch_items = $allow_ditch_items;
|
$this->allow_ditch_items = $allow_ditch_items;
|
||||||
|
$this->has_ditched_items_breakdown = false;
|
||||||
|
|
||||||
$this->sanitize_item_amount_mismatch();
|
$this->sanitize_item_amount_mismatch();
|
||||||
$this->sanitize_item_tax_mismatch();
|
$this->sanitize_item_tax_mismatch();
|
||||||
|
@ -180,14 +170,18 @@ class PurchaseUnitSanitizer {
|
||||||
private function sanitize_item_amount_mismatch(): void {
|
private function sanitize_item_amount_mismatch(): void {
|
||||||
$item_mismatch = $this->calculate_item_mismatch();
|
$item_mismatch = $this->calculate_item_mismatch();
|
||||||
|
|
||||||
if ( $this->is_mode_extra_line() ) {
|
if ( $this->mode === self::MODE_EXTRA_LINE ) {
|
||||||
if ( $item_mismatch < 0 ) {
|
if ( $item_mismatch < 0 ) {
|
||||||
|
|
||||||
// Do floors on item amounts so item_mismatch is a positive value.
|
// Do floors on item amounts so item_mismatch is a positive value.
|
||||||
foreach ( $this->purchase_unit['items'] as $index => $item ) {
|
foreach ( $this->purchase_unit['items'] as $index => $item ) {
|
||||||
// Get a more intelligent adjustment mechanism.
|
// Get a more intelligent adjustment mechanism.
|
||||||
$increment = ( new MoneyFormatter() )->minimum_increment( $item['unit_amount']['currency_code'] );
|
$increment = ( new MoneyFormatter() )->minimum_increment( $item['unit_amount']['currency_code'] );
|
||||||
$this->purchase_unit['items'][ $index ]['unit_amount']['value'] = ( (float) $item['unit_amount']['value'] ) - $increment;
|
|
||||||
|
$this->purchase_unit['items'][ $index ]['unit_amount'] = ( new Money(
|
||||||
|
( (float) $item['unit_amount']['value'] ) - $increment,
|
||||||
|
$item['unit_amount']['currency_code']
|
||||||
|
) )->to_array();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,7 +193,9 @@ class PurchaseUnitSanitizer {
|
||||||
$roundings_money = new Money( $item_mismatch, $this->currency_code() );
|
$roundings_money = new Money( $item_mismatch, $this->currency_code() );
|
||||||
$this->purchase_unit['items'][] = ( new Item( $line_name, $roundings_money, 1 ) )->to_array();
|
$this->purchase_unit['items'][] = ( new Item( $line_name, $roundings_money, 1 ) )->to_array();
|
||||||
|
|
||||||
$this->last_message = __( 'Item amount mismatch. Extra line added.', 'woocommerce-paypal-payments' );
|
$this->set_last_message(
|
||||||
|
__( 'Item amount mismatch. Extra line added.', 'woocommerce-paypal-payments' )
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$item_mismatch = $this->calculate_item_mismatch();
|
$item_mismatch = $this->calculate_item_mismatch();
|
||||||
|
@ -209,7 +205,9 @@ class PurchaseUnitSanitizer {
|
||||||
// Ditch items.
|
// Ditch items.
|
||||||
if ( $this->allow_ditch_items && isset( $this->purchase_unit['items'] ) ) {
|
if ( $this->allow_ditch_items && isset( $this->purchase_unit['items'] ) ) {
|
||||||
unset( $this->purchase_unit['items'] );
|
unset( $this->purchase_unit['items'] );
|
||||||
$this->last_message = __( 'Item amount mismatch. Items ditched.', 'woocommerce-paypal-payments' );
|
$this->set_last_message(
|
||||||
|
__( 'Item amount mismatch. Items ditched.', 'woocommerce-paypal-payments' )
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -252,7 +250,10 @@ class PurchaseUnitSanitizer {
|
||||||
unset( $this->purchase_unit['amount']['breakdown'] );
|
unset( $this->purchase_unit['amount']['breakdown'] );
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->last_message = __( 'Breakdown mismatch. Items and breakdown ditched.', 'woocommerce-paypal-payments' );
|
$this->has_ditched_items_breakdown = true;
|
||||||
|
$this->set_last_message(
|
||||||
|
__( 'Breakdown mismatch. Items and breakdown ditched.', 'woocommerce-paypal-payments' )
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,6 +338,16 @@ class PurchaseUnitSanitizer {
|
||||||
return $amount_str - $amount_total_str;
|
return $amount_str - $amount_total_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates if the items and breakdown were ditched.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function has_ditched_items_breakdown(): bool
|
||||||
|
{
|
||||||
|
return $this->has_ditched_items_breakdown;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the last sanitization message.
|
* Returns the last sanitization message.
|
||||||
*
|
*
|
||||||
|
@ -346,4 +357,13 @@ class PurchaseUnitSanitizer {
|
||||||
return $this->last_message;
|
return $this->last_message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the last sanitization message.
|
||||||
|
*
|
||||||
|
* @param string $message
|
||||||
|
*/
|
||||||
|
public function set_last_message( string $message ): void {
|
||||||
|
$this->last_message = $message;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -504,7 +504,7 @@ return function ( ContainerInterface $container, array $fields ): array {
|
||||||
'default' => 'vertical',
|
'default' => 'vertical',
|
||||||
'desc_tip' => true,
|
'desc_tip' => true,
|
||||||
'description' => __(
|
'description' => __(
|
||||||
'Differences between WooCommerce and PayPal roundings may give origin to a mismatch in order items subtotal calculations. If not handled these mismatches will cause the PayPal transaction to fail.',
|
'Differences between WooCommerce and PayPal roundings may cause mismatch in order items subtotal calculations. If not handled, these mismatches will cause the PayPal transaction to fail.',
|
||||||
'woocommerce-paypal-payments'
|
'woocommerce-paypal-payments'
|
||||||
),
|
),
|
||||||
'options' => array(
|
'options' => array(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue