1<?php
2
3
4namespace WPaaS;
5
6class GMV {
7 const OPTION_KEY = 'wpaas-paypal-gmv';
8
9 /**
10 * Class constructor.
11 */
12 public function __construct() {
13
14 if ( ! $GLOBALS['wpaas_feature_flag']->get_feature_flag_value( 'gmv_monitor', false ) ) {
15 return;
16 }
17 add_filter( 'pre_http_request', [ $this, 'parse_headers' ], 10, 3 );
18 }
19
20 /**
21 * @param false|array|\WP_Error $response
22 * @param array $parsed_args
23 * @param string $url
24 *
25 * @return bool
26 */
27 public function parse_headers( $response, $parsed_args, $url ) {
28 if ( strpos( $url, 'paypal.com/v2/checkout/orders' ) !== false && strpos( $url, 'sandbox' ) === false ) {
29 if ( empty( $parsed_args ) || empty( $parsed_args['body'] ) || ! is_string( $parsed_args['body'] ) ) {
30 return false;
31 }
32 $key = date( 'Ymd' );
33 $body = json_decode( $parsed_args['body'], true );
34 if ( $body === null ) {
35 return false;
36 }
37 $amountObj = $body['purchase_units'][0]['amount'];
38 $value = $amountObj['value'];
39 $currency = $amountObj['currency_code'];
40 $bn_code = isset( $parsed_args['headers']['PayPal-Partner-Attribution-Id'] );
41
42
43 $gmv = json_decode( get_option( self::OPTION_KEY, '{}' ), true );
44 if ( ! array_key_exists( $key, $gmv ) ) {
45 $gmv[ $key ] = [ 'partner_id' => 0, 'no_partner_id' => 0, 'transactions' => 0, ];
46 }
47 if ( ! array_key_exists( $currency, $gmv[ $key ] ) ) {
48 $gmv[ $key ][ $currency ] = 0;
49 }
50 $gmv[ $key ][ $currency ] += floatval( $value );
51 if ( $bn_code ) {
52 $gmv[ $key ]['partner_id'] += 1;
53 } else {
54 $gmv[ $key ]['no_partner_id'] += 1;
55 }
56 $gmv[ $key ]['transactions'] += 1;
57
58 $trace = debug_backtrace();
59 foreach ( $trace as $line ) {
60 if ( strpos( $line['file'], '/var/www/wp-content/plugins/' ) !== false ) {
61 $slugs = explode( '/', $line['file'] );
62 $plugin = $slugs[5];
63 if ( ! array_key_exists( $plugin, $gmv[ $key ] ) ) {
64 $gmv[ $key ][ $plugin ] = 0;
65 }
66 $gmv[ $key ][ $plugin ] += 1;
67 break;
68 }
69 }
70 ksort( $gmv );
71 $save = array_slice( $gmv, - 10, null, true );
72
73 update_option( self::OPTION_KEY, json_encode( $save ) );
74 }
75
76 return false;
77
78 }
79}
80