Descargas ilimitadas y Licencias Originales

Suscríbete o Inicia Sesión y descarga todos los recursos que quieras sin coste adicional. Todos los Plugins y Themes de WordPress en un clic. Además podrás acceder a Licencias Originales y API Keys.

Habilita la opción de aplicar Recargo de Equivalencia al pedido en la página de pago

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).

Enlaces Configuracion Clases De Impuesto Woocommerce -

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.

Anadir Recargo De Equivalencia Impuesto Woocommerce -

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:

Demo Aplicar Recargo Equivalencia Woocommerce -

Productos destacados