Antes de integrar este fragmento de código en tu tienda, sigue estos pasos para configurarlo:
Accede a «Ajustes > Impuestos» y haz clic en la clase de impuesto para la cual deseas configurar tu Recargo de Equivalencia. Te proporciono un ejemplo de dónde encontrar el acceso a la configuración de las clases de impuestos (Ten en cuenta que podrías haber asignado un nombre diferente al que aparece en la captura).
Crea la tasa de impuesto para el Recargo de Equivalencia y asigna un valor de prioridad mayor que la tasa general de IVA. En el caso de una tasa general del 21% de IVA, podría ser algo similar a lo que se muestra en la siguiente imagen.
Marca la casilla en la columna «Compuesto» para el IVA general.
Copia el ID de la tasa de Recargo de Equivalencia recién creada y reemplaza el ID copiado por el número que se encuentra entre paréntesis en la línea 10 del código snippet. Si planeas crear varios Recargos de Equivalencia, agrega los IDs separados por comas dentro de los paréntesis.
Si trabajas con varias clases de impuestos en tu tienda (por ejemplo, IVA general e IVA reducido), puedes configurar un recargo de equivalencia diferente para cada clase de impuesto repitiendo los pasos anteriores.
Finalmente, añade el código snippet ya configurado a tu tema.
// Añade la opción de aplicar el impuesto de Recargo de Equivalencia al pedido if ( in_array( 'woocommerce/woocommerce.php', get_option( 'active_plugins' ) ) ){ class WC_Tax_Recargo_Equivalencia{ public $re_tax_ids = array(); public function __construct(){ $this->re_tax_ids = array( 8 ); // Aquí debes poner los IDs de tus tasas de Recargo de Equivalencia. add_filter( 'woocommerce_find_rates', array( $this, 'add_recargo_equivalencia_tax' ), 10, 2 ); add_filter( 'woocommerce_cart_get_taxes', array( $this, 'update_cart_rows_taxes' ), 10, 2 ); add_filter( 'woocommerce_default_address_fields' , array( $this, 'agrega_checkbox_re_pagina_pago' ) ); add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'recargo_equivalencia_field_update_order_meta' ) ); add_action( 'wp_footer', array( $this, 'add_js_script_for_re' ), 99 ); add_action( 'woocommerce_calculated_total', array( $this, 'update_cart_totals' ), 10 , 2 ); add_action( 'init', array( $this, 'myStartSession' ), 1, 1 ); add_action( 'wp_logout', array( $this, 'myEndSession' ) ); add_action( 'wp_login', array( $this, 'myEndSession' ) ); add_action( 'wp_ajax_woocommerce_apply_recargo_equivalencia', array( $this, 'save_re_field_value' ), 10 ); add_action( 'wp_ajax_nopriv_woocommerce_apply_recargo_equivalencia', array( $this, 'save_re_field_value' ), 10); } public function add_recargo_equivalencia_tax( $matched_tax_rates, $args ){ global $post; $activate_recargo_eq = isset( $_SESSION[ 'activate_recargo_equivalencia' ] )? $_SESSION[ 'activate_recargo_equivalencia' ] : false; if ( !$activate_recargo_eq ) { $this->exclude_re_tax_rates( $matched_tax_rates, $this->re_tax_ids ); } return $matched_tax_rates; } public function update_cart_rows_taxes( $taxes, $cart ){ if ( is_cart() ) { $this->exclude_re_tax_rates( $taxes, $this->re_tax_ids ); } return $taxes; } public function update_cart_totals( $total, $cart ){ if ( is_cart() ) { return; } $this->myStartSession(); if ( isset( $_SESSION[ 'activate_recargo_equivalencia' ] ) && $_SESSION[ 'activate_recargo_equivalencia' ] ) { foreach ( $this->re_tax_ids as $tax_id ) { $total += $cart->get_tax_amount( $tax_id ); } } return $total; } private function exclude_re_tax_rates( &$tax_rates ){ foreach ( $tax_rates as $key => $tax_rate ) { if ( !is_object( $tax_rate ) && in_array( $key, $this->re_tax_ids ) ) { unset( $tax_rates[ $key ] ); } if ( is_object( $tax_rate ) && in_array( $tax_rate->tax_rate_id, $this->re_tax_ids ) ) { unset( $tax_rates[ $key ] ); } } } // Añade checkbox en página de pago para solicitar recargo de equivalencia public function agrega_checkbox_re_pagina_pago( $fields ) { $fields['recargo_de_equivalencia'] = array( 'label' => 'Marca esta opción si necesitas aplicar <span style="font-weight:bold;">Recargo de Equivalencia</span>', 'type' => 'checkbox', 'required' => false, 'class' => array('form-row-wide update_totals_on_change recargo_equivalencia'), 'clear' => true, ); return $fields; } // Guarda el valor del checkbox de R.E. en el pedido public function recargo_equivalencia_field_update_order_meta( $order_id ) { if ( ! empty( $_POST[ 'billing_recargo_de_equivalencia' ] ) ) { update_post_meta( $order_id, 'recargo_de_equivalencia', sanitize_text_field( $_POST[ 'billing_recargo_de_equivalencia' ] ) ); } } // Script para actualizar totales cuando el checkbox de R.E. sea modificado public function add_js_script_for_re(){ // Solo carga el script en la página de pago if ( !is_checkout() ) return; ?> <script type="text/javascript"> jQuery( document ).ready( function( $ ) { $( 'form.checkout .update_totals_on_change input[type="checkbox"]' ).change( function (){ update_re_status(); }); // Ejecuta update_re_status cuando la página está cargada update_re_status(); // Función para actualizar el estado de la opción R.E. function update_re_status(){ // Inicializa la variable re var re = false; if ( $('.recargo_equivalencia input[type="checkbox"]')[0].checked ) { re = true; }; var data = { action: 'woocommerce_apply_recargo_equivalencia', security: wc_checkout_params.apply_recargo_equivalencia_nonce, recargo_equivalencia: re, }; jQuery.ajax({ type: 'POST', url: wc_checkout_params.ajax_url, data: data, success: function ( code ) { if ( code === '0' ) { jQuery( 'body' ).trigger( 'update_checkout' ); } }, dataType: 'html' }); return false; }; }); </script> <?php } // Inicia la variable global de sesión public function myStartSession() { if ( session_status() !== PHP_SESSION_ACTIVE ) { session_start(); } } public function myEndSession() { session_destroy (); } // Guarda el valor del checkbox de R.E. en la variable de sesión public function save_re_field_value() { if ( isset( $_POST[ 'recargo_equivalencia' ] ) ) { $_SESSION[ 'activate_recargo_equivalencia' ] = $_POST[ 'recargo_equivalencia' ] == 'true' ? true : false; } } } new WC_Tax_Recargo_Equivalencia(); }
Aquí tienes un ejemplo de cómo quedaría: