• Namespace
  • Class
  • Tree
  • Deprecated
  • Hook Reference

Namespaces

  • None
  • PaymentPlugins

Classes

  • Braintree_Gateway_Manager
  • PaymentPlugins\WC_Braintree_Admin_Meta_Box_Product_Data
  • PaymentPlugins\WC_Braintree_Constants
  • WC_Braintree_3ds_Validation
  • WC_Braintree_Admin_Assets
  • WC_Braintree_Admin_List_Table_Subscriptions
  • WC_Braintree_Admin_Menus
  • WC_Braintree_Admin_Order_Metaboxes
  • WC_Braintree_Admin_Settings
  • WC_Braintree_Admin_User_Edit
  • WC_Braintree_Advanced_Fraud_Settings
  • WC_Braintree_Advanced_Settings_API
  • WC_Braintree_Alipay_Payment_Gateway
  • WC_Braintree_API_Settings
  • WC_Braintree_ApplePay_Payment_Gateway
  • WC_Braintree_Bancontact_Payment_Gateway
  • WC_Braintree_CC_Payment_Gateway
  • WC_Braintree_Condition_Evaluator
  • WC_Braintree_Context_Stack
  • WC_Braintree_Controller_3ds
  • WC_Braintree_Controller_ApplePay
  • WC_Braintree_Controller_Cart
  • WC_Braintree_Controller_Checkout
  • WC_Braintree_Controller_Client_Token
  • WC_Braintree_Controller_Data_Migration
  • WC_Braintree_Controller_Frontend
  • WC_Braintree_Controller_GooglePay
  • WC_Braintree_Controller_Kount
  • WC_Braintree_Controller_Local_Payment
  • WC_Braintree_Controller_Merchant_Accounts
  • WC_Braintree_Controller_Order_Actions
  • WC_Braintree_Controller_Payment_Tokens
  • WC_Braintree_Controller_PayPal
  • WC_Braintree_Controller_Plan
  • WC_Braintree_Controller_Product
  • WC_Braintree_Controller_Settings
  • WC_Braintree_Controller_Webhook
  • WC_Braintree_Customer_Manager
  • WC_Braintree_Deprecated_Filter_Hooks
  • WC_Braintree_Descriptor_Settings
  • WC_Braintree_EPS_Payment_Gateway
  • WC_Braintree_Fee_Settings
  • WC_Braintree_Field_Manager
  • WC_Braintree_Form_Handler
  • WC_Braintree_Frontend_Scripts
  • WC_Braintree_Giropay_Payment_Gateway
  • WC_Braintree_GooglePay_Payment_Gateway
  • WC_Braintree_IDEAL_Payment_Gateway
  • WC_Braintree_Install
  • WC_Braintree_Local_Payment_Gateway
  • WC_Braintree_Manager
  • WC_Braintree_Merchant_Account_Settings
  • WC_Braintree_Meta_Box_Coupons
  • WC_Braintree_Meta_Box_Subscription_Order_Data
  • WC_Braintree_MyBank_Payment_Gateway
  • WC_Braintree_P24_Payment_Gateway
  • WC_Braintree_Payment_Gateway
  • WC_Braintree_Payment_Method_Conversion
  • WC_Braintree_PayPal_Payment_Gateway
  • WC_Braintree_Post_Types
  • WC_Braintree_Product_Gateway_Option
  • WC_Braintree_Query
  • WC_Braintree_Rest_API
  • WC_Braintree_Rest_Controller
  • WC_Braintree_Rest_Webook_Authentication
  • WC_Braintree_Sepa_Payment_Gateway
  • WC_Braintree_Settings_API
  • WC_Braintree_Shortcode_Payment_Buttons
  • WC_Braintree_Shortcodes
  • WC_Braintree_Sofort_Payment_Gateway
  • WC_Braintree_Subscription
  • WC_Braintree_Subscription_Data_Store_CPT
  • WC_Braintree_Subscription_Settings
  • WC_Braintree_Subscriptions_Cart
  • WC_Braintree_Subscriptions_Checkout
  • WC_Braintree_Update
  • WC_Braintree_Venmo_Payment_Gateway
  • WC_Braintree_WeChat_Payment_Gateway
  • WC_Meta_Box_Braintree_Subscription_Data
  • WC_Payment_Token_Braintree
  • WC_Payment_Token_Braintree_ApplePay
  • WC_Payment_Token_Braintree_CC
  • WC_Payment_Token_Braintree_GooglePay
  • WC_Payment_Token_Braintree_Local_Payment
  • WC_Payment_Token_Braintree_PayPal
  • WC_Payment_Token_Braintree_Venmo
  • WC_Product_Braintree_Subscription
  • WC_Product_Braintree_Subscription_Variation
  • WC_Product_Braintree_Variable_Subscription
  • WCS_Braintree_Subscription_Controller

Traits

  • WC_Braintree_Controller_Cart_Trait
  • WC_Braintree_Settings_Trait

Functions

  • bfwc_add_body_class
  • bfwc_billing_periods_string
  • bfwc_can_delete_payment_method
  • bfwc_copy_address_from_order
  • bfwc_error_code_type_nicename
  • bfwc_get_combined_error_messages
  • bfwc_get_error_message
  • bfwc_get_error_messages
  • bfwc_get_gateway_timezone
  • bfwc_get_product_descriptors
  • bfwc_get_subscription_status_name
  • bfwc_get_subscription_statuses
  • bfwc_get_template
  • bfwc_get_timezones
  • bfwc_register_subscription_status
  • bfwc_subscription_length_string
  • bfwc_subscription_user_actions
  • bfwcs_billing_interval_string
  • bfwcs_billing_intervals
  • bfwcs_calculate_end_date
  • bfwcs_calculate_first_payment_date
  • bfwcs_calculate_next_payment_date
  • bfwcs_calculate_order_total
  • bfwcs_calculate_start_date
  • bfwcs_can_combine_subscriptions
  • bfwcs_cart_contains_subscriptions
  • bfwcs_cart_formatted_date
  • bfwcs_cart_recurring_total_html
  • bfwcs_cart_shipping_total
  • bfwcs_cart_subtotal_string
  • bfwcs_cart_tax_total_html
  • bfwcs_copy_order_meta
  • bfwcs_create_order_from_subscription
  • bfwcs_create_renewal_order
  • bfwcs_create_subscription
  • bfwcs_frontend_interval_string
  • bfwcs_get_currency_symbol
  • bfwcs_get_interval_string
  • bfwcs_get_length_string
  • bfwcs_get_period_string
  • bfwcs_get_plan_from_product
  • bfwcs_get_price_string
  • bfwcs_get_product_price_html
  • bfwcs_get_related_orders
  • bfwcs_get_subscription
  • bfwcs_get_subscription_actions
  • bfwcs_get_subscription_statuses
  • bfwcs_get_subscriptions_for_order
  • bfwcs_get_subscriptions_for_user
  • bfwcs_is_change_payment_method
  • bfwcs_is_pay_for_subscription_request
  • bfwcs_order_contains_subscription
  • bfwcs_order_is_subscription
  • bfwcs_product_is_subscription
  • bfwcs_subscription_link_active
  • braintree
  • braintree_delete_user_payment_method
  • braintree_delete_user_payment_methods
  • braintree_device_data_field
  • braintree_get_customer_id
  • braintree_get_default_method
  • braintree_get_method_uris
  • braintree_get_method_url
  • braintree_get_payment_method_formats
  • braintree_get_payment_method_from_token
  • braintree_get_payment_method_title_from_array
  • braintree_get_payment_method_title_from_method
  • braintree_get_payment_method_title_from_method_details
  • braintree_get_payment_method_title_from_transaction
  • braintree_get_payment_title_from_token
  • braintree_get_payment_token_from_transaction
  • braintree_get_user_payment_methods
  • braintree_hidden_field
  • braintree_nonce_field
  • braintree_payment_method_to_array
  • braintree_payment_token_field
  • braintree_save_payment_method_from_transaction
  • braintree_save_user_payment_method
  • braintree_save_user_payment_methods
  • bt_manager
  • bwc_3ds_no_action_needed
  • bwc_3ds_verify_vaulted_methods
  • bwc_add_allowed_html
  • bwc_add_notice
  • bwc_applepay_cart_checkout_enabled
  • bwc_applepay_checkout_banner_enabled
  • bwc_applepay_get_line_items
  • bwc_applepay_product_checkout_enabled
  • bwc_calculate_fee
  • bwc_can_refund_order
  • bwc_card_payments_enabled
  • bwc_custom_form_text
  • bwc_cvv_field_enabled
  • bwc_display_icons_on_payment_methods_page
  • bwc_display_save_payment_method
  • bwc_dropin_v2_enabled
  • bwc_dropin_v3_enabled
  • bwc_enable_signup_from_checkout
  • bwc_execute_conditional_statement
  • bwc_fail_on_duplicate
  • bwc_fee_enabled_for_gateway
  • bwc_fees_enabled
  • bwc_get_3_0_0_deprecated_order_prop
  • bwc_get_3_0_0_updated_props
  • bwc_get_3ds_modal_html
  • bwc_get_billing_agreement_desc
  • bwc_get_comma_separated_product_names
  • bwc_get_conditional_values
  • bwc_get_custom_form
  • bwc_get_custom_form_fields
  • bwc_get_custom_forms
  • bwc_get_default_method
  • bwc_get_enclosed_icon_url
  • bwc_get_fees_for_gateway
  • bwc_get_gateway_fees
  • bwc_get_gateway_id
  • bwc_get_googlepay_methods
  • bwc_get_loader_file
  • bwc_get_merchant_account
  • bwc_get_merchant_accounts
  • bwc_get_option_text
  • bwc_get_order_property
  • bwc_get_payment_gateways
  • bwc_get_paypal_button
  • bwc_get_paypal_credit_button
  • bwc_get_paypal_credit_html
  • bwc_get_paypal_html
  • bwc_get_product_property
  • bwc_get_save_method_template
  • bwc_get_smartbutton_style
  • bwc_get_template
  • bwc_get_template_html
  • bwc_get_user_applepay_payment_methods
  • bwc_get_user_payment_methods
  • bwc_get_user_paypal_payment_methods
  • bwc_googlepay_enabled
  • bwc_is_3ds_active
  • bwc_is_3ds_enabled
  • bwc_is_admin_webhook_request
  • bwc_is_advanced_fraud_tools
  • bwc_is_applepay_enabled
  • bwc_is_checkout
  • bwc_is_custom_form
  • bwc_is_descriptors_enabled
  • bwc_is_dynamic_card_display
  • bwc_is_paypal_enabled
  • bwc_is_wc_3_0_0_or_more
  • bwc_kount_enabled
  • bwc_kount_send_processing_email
  • bwc_locate_template
  • bwc_output_checkout_error
  • bwc_payment_icons_enclosed_type
  • bwc_payment_icons_outside
  • bwc_payment_icons_type
  • bwc_payment_loader_enabled
  • bwc_payment_method_token_field
  • bwc_payment_token_field
  • bwc_paypal_cart_checkout_enabled
  • bwc_paypal_checkout_banner_enabled
  • bwc_paypal_checkout_flow
  • bwc_paypal_credit_active
  • bwc_paypal_credit_conditions
  • bwc_paypal_credit_enabled
  • bwc_paypal_credit_send_shipping
  • bwc_paypal_send_shipping
  • bwc_postal_code_enabled
  • bwc_refresh_payment_fragments
  • bwc_saved_payment_method_style
  • bwc_saved_payment_methods_list
  • bwc_set_checkout_error
  • bwc_smart_buttons_enabled
  • bwc_use_admin_text_for_custom_form
  • bwcs_braintree_subscriptions_active
  • bwcs_calculate_order_total
  • bwcs_can_combine_subscriptions
  • bwcs_can_delete_payment_method
  • bwcs_cart_item_contains_subscription
  • bwcs_get_cart_item_key
  • bwcs_get_current_date_time
  • bwcs_get_num_of_billing_cycles
  • bwcs_get_plan_from_product
  • bwcs_get_product_from_subscription
  • bwcs_get_start_date_in_utc
  • bwcs_get_subscription_date
  • bwcs_is_braintree_subscription
  • bwcs_is_change_payment_method
  • bwcs_is_paid_for_failed_renewal_request
  • bwcs_is_woocommerce_change_payment
  • bwcs_order_contains_subscription
  • bwcs_order_has_coupon
  • bwcs_order_is_subscription
  • bwcs_product_is_subscription
  • bwcs_retry_after_exception
  • bwcs_start_date_in_site_timezone
  • bwcs_subscription_has_trial
  • bwcs_subscription_is_synched
  • bwcs_subscriptions_active
  • wc_braintree_add_allowed_html
  • wc_braintree_add_body_class
  • wc_braintree_banner_checkout_template
  • wc_braintree_card_loader_options
  • wc_braintree_cart_checkout_template
  • wc_braintree_connection_settings
  • wc_braintree_create_payment_token
  • wc_braintree_create_payment_token_from_transaction
  • wc_braintree_custom_form_active
  • wc_braintree_custom_form_options
  • wc_braintree_delete_customer
  • wc_braintree_deprecated_template_check
  • wc_braintree_device_data_field
  • wc_braintree_display_prices_including_tax
  • wc_braintree_enqueue_local_payments
  • wc_braintree_environment
  • wc_braintree_errors_from_object
  • wc_braintree_evaluate_condition
  • wc_braintree_filter_customer_payment_tokens
  • wc_braintree_filter_payment_tokens
  • wc_braintree_generate_client_token
  • wc_braintree_get_3ds_actions
  • wc_braintree_get_card_type_icons
  • wc_braintree_get_checkout_fields
  • wc_braintree_get_conditional_values
  • wc_braintree_get_currency
  • wc_braintree_get_custom_form
  • wc_braintree_get_customer_id
  • wc_braintree_get_error_messages
  • wc_braintree_get_fee_gateways
  • wc_braintree_get_file_data
  • wc_braintree_get_local_gateways
  • wc_braintree_get_merchant_account
  • wc_braintree_get_merchant_accounts
  • wc_braintree_get_order_environment
  • wc_braintree_get_order_for_payment_id
  • wc_braintree_get_payment_method_format
  • wc_braintree_get_payment_tokens
  • wc_braintree_get_products_for_conditions
  • wc_braintree_get_response_code_message
  • wc_braintree_get_template
  • wc_braintree_get_template_html
  • wc_braintree_hidden_field
  • wc_braintree_local_payment_completed
  • wc_braintree_local_payment_params
  • wc_braintree_log
  • wc_braintree_log_error
  • wc_braintree_log_info
  • wc_braintree_merchant_id
  • wc_braintree_merge_order_statuses
  • wc_braintree_move_translations
  • wc_braintree_nonce_field
  • wc_braintree_order_statuses
  • wc_braintree_order_statuses_for_registration
  • wc_braintree_output_checkout_error
  • wc_braintree_parse_xml_contents
  • wc_braintree_payment_complete_order_status
  • wc_braintree_payment_gateways
  • wc_braintree_payment_method_formats
  • wc_braintree_payment_method_title
  • wc_braintree_payment_token_field
  • wc_braintree_pre_orders_active
  • wc_braintree_private_key
  • wc_braintree_process_scheduled_local_payment
  • wc_braintree_production_active
  • wc_braintree_public_key
  • wc_braintree_save_cc_enabled
  • wc_braintree_save_customer
  • wc_braintree_set_checkout_error
  • wc_braintree_show_product_checkout_gateways
  • wc_braintree_spam_bot_field
  • wc_braintree_subscriptions_active
  • wc_braintree_update_customer_location
  • wc_braintree_webhook_check
  • wc_braintree_woocommerce_payment_token_deleted
  • wcs_braintree_account_menu_items
  • wcs_braintree_active
  • wcs_braintree_before_delete_order_item
  • wcs_braintree_billing_interval_string
  • wcs_braintree_billing_intervals
  • wcs_braintree_billing_periods
  • wcs_braintree_billing_periods_string
  • wcs_braintree_calculate_end_date
  • wcs_braintree_calculate_first_payment_date
  • wcs_braintree_calculate_next_payment_date
  • wcs_braintree_calculate_start_date
  • wcs_braintree_cart_contains_subscription
  • wcs_braintree_cart_formatted_date
  • wcs_braintree_cart_recurring_tax_html
  • wcs_braintree_cart_recurring_total_html
  • wcs_braintree_cart_shipping_total
  • wcs_braintree_cart_subtotal_string
  • wcs_braintree_cart_tax_total_html
  • wcs_braintree_cart_totals_coupon_html
  • wcs_braintree_change_payment_method_template
  • wcs_braintree_copy_address_from_order
  • wcs_braintree_copy_order_meta
  • wcs_braintree_create_order_from_subscription
  • wcs_braintree_create_renewal_order
  • wcs_braintree_create_subscription
  • wcs_braintree_frontend_interval_string
  • wcs_braintree_get_billing_schedule_string
  • wcs_braintree_get_interval_string
  • wcs_braintree_get_length_string
  • wcs_braintree_get_period_string
  • wcs_braintree_get_plan_from_product
  • wcs_braintree_get_plan_options
  • wcs_braintree_get_plans
  • wcs_braintree_get_price_string
  • wcs_braintree_get_product_price_html
  • wcs_braintree_get_recurring_cart_key
  • wcs_braintree_get_recurring_total_text
  • wcs_braintree_get_related_orders
  • wcs_braintree_get_subscription
  • wcs_braintree_get_subscription_actions
  • wcs_braintree_get_subscription_from_recurring_cart_key
  • wcs_braintree_get_subscription_status_name
  • wcs_braintree_get_subscription_statuses
  • wcs_braintree_get_subscription_statuses_for_registration
  • wcs_braintree_get_subscriptions_for_order
  • wcs_braintree_get_subscriptions_for_user
  • wcs_braintree_is_change_payment_method_request
  • wcs_braintree_localize_scripts
  • wcs_braintree_order_contains_subscription
  • wcs_braintree_order_details
  • wcs_braintree_product_is_subscription
  • wcs_braintree_subscription_cancelled
  • wcs_braintree_subscription_length_string
  • wcs_braintree_subscription_user_actions
  • wcs_braintree_subscriptions_template
  • wcs_braintree_sync_subscription_with_gateway
  • wcs_braintree_view_subscription_template
  • wcs_braintree_webhook_subscription_cancelled
  • wcs_braintree_webhook_subscription_charged_successfully
  • wcs_braintree_webhook_subscription_expired
  • wcs_braintree_webhook_subscription_past_due
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 
<?php

/**
 *
 * @since 3.0.0
 * @package Braintree/Admin
 *
 */
class WC_Braintree_Meta_Box_Subscription_Order_Data {

    private static $processing_update = false;

    private static $calculating_totals = false;

    private static $_new_order_item = false;

    /**
     *
     * @var WC_Order
     */
    private static $current_order = null;

    public static function init() {
        add_action( 'woocommerce_process_shop_order_meta', array( __CLASS__, 'save' ), 60, 2 );
        add_action( 'woocommerce_order_before_calculate_taxes', array( __CLASS__, 'before_calculate_totals' ), 10, 2 );
        add_action( 'woocommerce_order_after_calculate_totals', array( __CLASS__, 'after_calculate_totals' ) );
        add_action( 'woocommerce_order_before_calculate_totals', array( __CLASS__, 'before_calculate_totals' ), 10, 2 );
        /*
         * add_action ( 'woocommerce_order_after_calculate_totals', array(
         * __CLASS__, 'after_calculate_totals'
         * ) );
         */
        add_action( 'woocommerce_ajax_add_order_item_meta', array( __CLASS__, 'validate_order_item' ), 10, 3 );
        add_action( 'add_meta_boxes', array( __CLASS__, 'add_meta_boxes' ), 40, 2 );
        add_action( 'woocommerce_new_order_item', array( __CLASS__, 'new_order_item' ), 10, 3 );
        add_action( 'woocommerce_update_order_item', array( __CLASS__, 'update_order_item' ), 10, 3 );
        add_action( 'woocommerce_before_delete_order_item', array( __CLASS__, 'delete_order_item' ) );
    }

    public static function add_meta_boxes( $post_type, $post ) {
        if ( $post_type === 'bfwc_subscription' ) {
            add_meta_box( 'wcs-braintree-related-orders', __( 'Related Orders', 'woo-payment-gateway' ), array( __CLASS__, 'subscription_related_orders_view' ), 'bfwc_subscription', 'normal', 'default' );
        }
        if ( $post_type === 'shop_order' ) {
            add_meta_box( 'wcs-braintree-related-orders', __( 'Related Subscriptions', 'woo-payment-gateway' ), array( __CLASS__, 'related_orders_view' ), 'shop_order', 'normal', 'default' );
        }
        add_filter( 'wc_order_statuses', array( __CLASS__, 'order_statuses' ) );
    }

    /**
     *
     * @param WP_Post $post
     */
    public static function subscription_related_orders_view( $post ) {
        $subscription = wcs_braintree_get_subscription( $post->ID );
        $orders       = wcs_braintree_get_related_orders( $subscription );
        include 'views/html-subscription-related-orders.php';
    }

    public static function related_orders_view( $post ) {
        $order           = wc_get_order( $post->ID );
        $subscription_id = $order->get_meta( '_subscription_id', true );
        if ( wcs_braintree_order_contains_subscription( $order ) || $subscription_id ) {
            $subscriptions = wcs_braintree_get_subscriptions_for_order( $order );
            if ( empty( $subscriptions ) ) {
                $subscriptions[] = wcs_braintree_get_subscription( $subscription_id );
            }
            include 'views/html-related-orders.php';
        }
    }

    public static function order_statuses( $statuses ) {
        if ( self::is_subscription_type() ) {
            $statuses = array_merge( $statuses, wcs_braintree_get_subscription_statuses() );
        }
        return $statuses;
    }

    private static function is_subscription_type() {
        $screen    = get_current_screen();
        $screen_id = $screen ? $screen->id : '';
        return $screen_id === 'bfwc_subscription';
    }

    /**
     *
     * @param WC_Order $order
     */
    private static function order_is_subscription( $order ) {
        return $order && 'bfwc_subscription' === $order->get_type();
    }

    /**
     *
     * @param bool $and_taxes
     * @param WC_order $order
     */
    public static function before_calculate_totals( $and_taxes, $order ) {
        self::$calculating_totals = true;
        self::$current_order      = $order;
        add_filter( 'woocommerce_order_item_get_total', array( __CLASS__, 'get_item_total' ), 10, 2 );
        add_filter( 'woocommerce_order_item_get_subtotal', array( __CLASS__, 'get_item_total' ), 10, 2 );
    }

    public static function after_calculate_totals() {
        self::$calculating_totals = false;
        remove_filter( 'woocommerce_order_item_get_total', array( __CLASS__, 'get_item_total' ) );
        remove_filter( 'woocommerce_order_item_get_subtotal', array( __CLASS__, 'get_item_total' ) );
    }

    /**
     *
     * @param float $total
     * @param WC_Order_Item $item
     */
    public static function get_item_total( $total, $item ) {
        if ( 'line_item' === $item->get_type() ) {
            if ( ! self::order_is_subscription( $item->get_order() ) ) {
                $product = $item->get_product();
                if ( wcs_braintree_product_is_subscription( $product ) ) {
                    if ( $product->has_trial() ) {
                        $total = 0;
                    }
                }
            }
        }
        return $total;
    }

    public static function save( $post_id, $post ) {
        $shop_order = wc_get_order( $post_id );
        if ( self::order_is_subscription( $shop_order ) ) {
            $subscription = wcs_braintree_get_subscription( $post_id );
            if ( ! $subscription->is_created() ) {
                // A subscription needs an order associated with it.
                $order_id = $subscription->get_parent_id();
                if ( ! $order_id ) {
                    $order = wc_create_order(
                        array(
                            'created_via' => 'admin',
                            'customer_id' => $subscription->get_customer_id(),
                        )
                    );
                    $order->set_address( $subscription->get_address( 'billing' ), 'billing' );
                    $order->set_address( $subscription->get_address( 'shipping' ), 'shipping' );
                    $order->set_status( wc_clean( $_POST['order_status'] ) );
                    $subscription->set_parent_id( $order->get_id() );
                    $subscription->save();
                } else {
                    $order = wc_get_order( $order_id );
                }
            }
        } else {
            if ( wcs_braintree_order_contains_subscription( $shop_order ) ) {
                foreach ( wcs_braintree_get_subscriptions_for_order( $shop_order ) as $subscription ) {
                    if ( $subscription->has_status( array( 'pending' ) ) ) {
                        WC_Meta_Box_Order_Data::save( $subscription->get_id() );
                    }
                }
            }
        }
    }

    /**
     *
     * @param WC_Braintree_Subscription $subscription
     * @param WC_Order_Item_Product $item
     */
    private static function add_subscription_props( $subscription, $item ) {
        $product            = $item->get_product();
        $start_date         = wcs_braintree_calculate_start_date();
        $first_payment_date = wcs_braintree_calculate_first_payment_date( $product->get_subscription_trial_period(), $product->get_subscription_trial_length() );
        $next_payment_date  = $product->has_trial() ? $first_payment_date : wcs_braintree_calculate_next_payment_date( $first_payment_date, $product->get_subscription_period(), $product->get_subscription_period_interval() );
        $end_date           = wcs_braintree_calculate_end_date( $product->get_subscription_length(), $product->get_subscription_period(), $product->get_subscription_trial_period(), $product->get_subscription_trial_length() );
        $subscription->set_props(
            array(
                'recurring_cart_key'           => wcs_braintree_get_recurring_cart_key( $product ),
                'start_date'                   => $start_date,
                'next_payment_date'            => $next_payment_date,
                'first_payment_date'           => $first_payment_date,
                'end_date'                     => $end_date,
                'trial_end_date'               => $first_payment_date,
                'subscription_trial_length'    => $product->get_subscription_trial_length(),
                'subscription_trial_period'    => $product->get_subscription_trial_period(),
                'braintree_plan'               => wcs_braintree_get_plan_from_product( $product ),
                'subscription_period'          => $product->get_subscription_period(),
                'subscription_period_interval' => $product->get_subscription_period_interval(),
                'subscription_length'          => $product->get_subscription_length(),
                'merchant_account_id'          => wc_braintree_get_merchant_account(),
                'created_in_braintree'         => false,
            )
        );
    }

    /**
     * Method that validates all order items in a subscription.
     * If un-like products are added to the subscription, the item is deleted from the
     * subscription and an error is triggered.
     *
     * @param WC_Order_Item[] $added_items
     * @param WC_Order $order
     */
    public static function validate_order_item( $item_id, $item, $order ) {
        try {
            if ( self::order_is_subscription( $order ) ) {
                foreach ( $order->get_items( 'line_item' ) as $line_item ) {
                    $keys = array(
                        wcs_braintree_get_recurring_cart_key( $item->get_product() ),
                        wcs_braintree_get_recurring_cart_key( $line_item->get_product() ),
                    );
                    if ( count( array_unique( $keys ) ) > 1 ) {
                        throw new Exception( sprintf( __( 'Product %1$s cannot be assigned to this subscription. Reason: the products do not have the same billing schedule.', 'woo-payment-gateway' ), $item->get_product()->get_name() ) );
                    }
                }
            }
        } catch ( Exception $e ) {
            wc_delete_order_item( $item_id );
            throw new Exception( $e->getMessage() );
        }
    }

    /**
     *
     * @param int $item_id
     * @param WC_Order_Item $item
     * @param int $order_id
     */
    public static function new_order_item( $item_id, $item, $order_id ) {
        if ( ! self::$_new_order_item && 'line_item' === $item->get_type() ) {
            /*
             * remove_action ( 'woocommerce_new_order_item', array(
             * __CLASS__, 'new_order_item'
             * ) );
             */
            self::$_new_order_item = true;
            $shop_order            = wc_get_order( $order_id );
            $item_order_id         = 0;
            if ( self::order_is_subscription( $shop_order ) ) {
                if ( ( $order = wc_get_order( $shop_order->get_parent_id() ) ) == false ) {
                    $order = wc_create_order( array( 'customer_id' => $shop_order->get_customer_id() ) );
                    $shop_order->set_parent_id( $order->get_id() );
                    $shop_order->save();
                }
                self::add_subscription_props( $shop_order, $item );
                $shop_order->save();
                $item_order_id = $order->get_id();
            } elseif ( is_a( $shop_order, 'WC_Order' ) ) {
                if ( wcs_braintree_product_is_subscription( $item->get_product() ) ) {
                    $cart_key     = wcs_braintree_get_recurring_cart_key( $item->get_product() );
                    $subscription = wcs_braintree_get_subscription_from_recurring_cart_key( $cart_key, $shop_order->get_id() );
                    if ( ! $subscription ) {
                        $subscription = new WC_Braintree_Subscription();
                        $subscription->set_customer_id( $shop_order->get_customer_id() );
                        $subscription->set_parent_id( $shop_order->get_id() );
                        $subscription->set_recurring_cart_key( $cart_key );
                        self::add_subscription_props( $subscription, $item );
                        $subscription->save();
                    }
                    $item_order_id = $subscription->get_id();
                }
            }
            if ( $item_order_id ) {
                // this is a subscription item
                /**
                 *
                 * @var WC_Order_Item_Data_Store $data_store
                 */
                $data_store = WC_Data_Store::load( 'order-item' );
                $new_item   = clone $item;
                $new_item->set_id( 0 );
                $new_item->set_order_id( $item_order_id );
                $new_item->add_meta_data( '_reference_item', $item->get_id() );
                $new_item->save();
                // save using data store so it's silent and update item hook isn't called.
                $data_store->update_metadata( $item_id, '_reference_item', $new_item->get_id() );
                $shop_order->calculate_totals();
                wc_get_order( $item_order_id )->calculate_totals();
            }
            self::$_new_order_item = false;
        }
    }

    /**
     *
     * @param int $item_id
     * @param WC_Order_Item $item
     * @param int $order_id
     */
    public static function update_order_item( $item_id, $item, $order_id ) {
        if ( self::$processing_update ) {
            return;
        }
        self::$processing_update = true;
        $shop_order              = wc_get_order( $order_id );
        $reference_item          = WC_Order_Factory::get_order_item( $item->get_meta( '_reference_item' ), true );
        if ( 'line_item' === $item->get_type() && $reference_item ) {
            $reference_item->set_props(
                array(
                    'quantity' => $item->get_quantity(),
                    'subtotal' => $item->get_subtotal(),
                    'total'    => $item->get_total(),
                )
            );
            $reference_item->save();
            $reference_item->get_order()->calculate_totals();
        }
        self::$processing_update = false;
    }

    /**
     *
     * @param int $item_id
     */
    public static function delete_order_item( $item_id ) {
        /**
         *
         * @var WC_Order_Item_Data_Store $data_store
         */
        $data_store = WC_Data_Store::load( 'order-item' );
        $item       = WC_Order_Factory::get_order_item( $item_id );
        if ( false === $item ) {
            return;
        }
        $shop_order        = $item->get_order();
        $reference_item_id = $item->get_meta( '_reference_item', true );
        if ( $reference_item_id ) {
            $reference_item = WC_Order_Factory::get_order_item( $reference_item_id );
            $order          = $reference_item->get_order();
            if ( self::order_is_subscription( $order ) ) {
                $order->set_recurring_cart_key( '' );
                $order->save();
            }
            $data_store->delete_order_item( $reference_item_id );
        }
        if ( self::order_is_subscription( $shop_order ) ) {
            $shop_order->set_recurring_cart_key( '' );
            $shop_order->save();
        }
    }
}
WC_Braintree_Meta_Box_Subscription_Order_Data::init();
Braintree API documentation generated by ApiGen