Implementar ‘Recargo de Equivalencia” en Woocommerce


En la web PluginWP expliquen com implementar el Recàrrec d’Equivalència o Recargo de Equivalencia de forma fàcil a Woocommerce.

Primer cal afegir un nou Impost en Woocommerce, tant en les tarifes Estàndard com a les reduïdes, anomenat R.E:

Recargo Equivalencia

Inspeccionant el codi podem traure el ID d’eixe impost. El número que identifica el RE a Woocommerce:

Screenshot

Finalment, afegim els IDS separats per comes al codi. Aquest codi va al “functions.php” o en un plugin propi:

// 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();
}

El resultat seria una casella per marcar si la teua compra té R.E. o no:

Recargo Equivalencia Woocommerce

Deixa un comentari

L’adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Información básica sobre protección de datos Ver más

  • Responsable: Jordi Juan Pérez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a NICALIA que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Ver Política de cookies
Privacidad