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": {
|
||||
"psr-4": {
|
||||
"WooCommerce\\PayPalCommerce\\": "src",
|
||||
"WooCommerce\\PayPalCommerce\\Isolated\\": "lib/isolated/",
|
||||
"WooCommerce\\PayPalCommerce\\Vendor\\": "lib/packages/"
|
||||
},
|
||||
"files": [
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
namespace WooCommerce\PayPalCommerce\Vendor\Pattern;
|
||||
namespace WooCommerce\PayPalCommerce\Isolated\Pattern;
|
||||
|
||||
class SingletonDecorator {
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
namespace WooCommerce\PayPalCommerce\Vendor\Pattern;
|
||||
namespace WooCommerce\PayPalCommerce\Isolated\Pattern;
|
||||
|
||||
trait SingletonTrait {
|
||||
/**
|
|
@ -9,22 +9,13 @@ declare(strict_types=1);
|
|||
|
||||
namespace WooCommerce\PayPalCommerce\ApiClient;
|
||||
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\BillingSubscriptions;
|
||||
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\Isolated\Pattern\SingletonDecorator;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Authentication\PayPalBearer;
|
||||
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\LoginSeller;
|
||||
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\ApplicationContextFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\AuthorizationFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\BillingCycleFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\CaptureFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ExchangeRateFactory;
|
||||
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\PayeeFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentPreferencesFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentsFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentSourceFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentTokenActionLinksFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentTokenFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PlanFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PlatformFeeFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ProductFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\SellerReceivableBreakdownFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\SellerStatusFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingOptionFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingPreferenceFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookEventFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
|
||||
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\CustomerRepository;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\OrderRepository;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\PartnerReferralsData;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\PayeeRepository;
|
||||
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
||||
use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface;
|
||||
use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
|
||||
|
||||
return array(
|
||||
|
|
|
@ -339,6 +339,30 @@ class PurchaseUnit {
|
|||
$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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -68,6 +68,13 @@ class PurchaseUnitSanitizer {
|
|||
*/
|
||||
private $last_message = '';
|
||||
|
||||
/**
|
||||
* If the items and breakdown has been ditched.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
private $has_ditched_items_breakdown = false;
|
||||
|
||||
/**
|
||||
* PurchaseUnitSanitizer constructor.
|
||||
*
|
||||
|
@ -88,24 +95,6 @@ class PurchaseUnitSanitizer {
|
|||
$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.
|
||||
*
|
||||
|
@ -165,6 +154,7 @@ class PurchaseUnitSanitizer {
|
|||
public function sanitize( array $purchase_unit, bool $allow_ditch_items = true ): array {
|
||||
$this->purchase_unit = $purchase_unit;
|
||||
$this->allow_ditch_items = $allow_ditch_items;
|
||||
$this->has_ditched_items_breakdown = false;
|
||||
|
||||
$this->sanitize_item_amount_mismatch();
|
||||
$this->sanitize_item_tax_mismatch();
|
||||
|
@ -180,14 +170,18 @@ class PurchaseUnitSanitizer {
|
|||
private function sanitize_item_amount_mismatch(): void {
|
||||
$item_mismatch = $this->calculate_item_mismatch();
|
||||
|
||||
if ( $this->is_mode_extra_line() ) {
|
||||
if ( $this->mode === self::MODE_EXTRA_LINE ) {
|
||||
if ( $item_mismatch < 0 ) {
|
||||
|
||||
// Do floors on item amounts so item_mismatch is a positive value.
|
||||
foreach ( $this->purchase_unit['items'] as $index => $item ) {
|
||||
// Get a more intelligent adjustment mechanism.
|
||||
$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() );
|
||||
$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();
|
||||
|
@ -209,7 +205,9 @@ class PurchaseUnitSanitizer {
|
|||
// Ditch items.
|
||||
if ( $this->allow_ditch_items && isset( $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'] );
|
||||
}
|
||||
|
||||
$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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
|
@ -346,4 +357,13 @@ class PurchaseUnitSanitizer {
|
|||
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',
|
||||
'desc_tip' => true,
|
||||
'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'
|
||||
),
|
||||
'options' => array(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue