Publicado el Deja un comentario

Cómo crear facturas y presupuestos con WordPress

Gestiona tu empresa desde WordPress con Gestión-Pymes

Como autónomos o pequeños empresarios necesitamos generar nuestras facturas y presupuestos de forma rápida y sencilla. Normalmente se opta o bien por un software sencillo de facturación, o la típica plantilla Excel que vamos modificando con cada factura.

Problema de ello, que si nos vamos del taller/oficina, en casa lo tenemos complicado para generarlas, y es justo al final del día cuando nos solemos poner a “ajustar cuentas”.

Solución, usar la nube para ello.

Problema, coste adicional cada mes, y dependemos de un tercero para ello.

¿Y si cogemos las ventajas de trabajar en la nube y le quitamos los posibles problemas?

Eso pensé yo cuando me puse manos a la obra, y creé el plugin Gestion-Pymes.

Se trata de un plugin para que podamos tener a nuestros clientes, gestionar presupuestos y facturas, todo desde nuestra página web. Es como tener nuestra propia nube, y así sacar mayor provecho a la web, para que no sea una simple tarjeta de visita.

El plugin actualmente (versión 1.2) se compone de tres módulos:

  • Clientes: Para la gestión de nuestros clientes.
  • Presupuestos: Para la generación de presupuestos.
  • Facturas: para la generación de facturas.

Permitiéndonos exportarlas a PDF, para imprimirlas, enviarlas por email o simplemente guardarlas en nuestro PC.

En unos días haré un video sobre la instalación y manejo del plugin, asi que lo dejo en la lista de ToDo.

He encontrado un video que tenía del plugin, no es la versión actual, en la que se han corregido fallos de traducciones y se han añadido mejoras, pero como “primeros pasos” nos vale:

Teneis disponible desde este enlace una web demo donde podeis trastear el plugin.

De momento esta es la introducción sobre este plugin y su utilidad, así que say goodbye to Excel !!

Publicado el Deja un comentario

Cómo montar una versión b2b de tu tienda

WooCommerce B2B

Vamos a ver cómo montar una versión b2b de tu tienda online, con las siguientes características:

  • Queremos que se puedan ver los productos, por tema SEO, pero que sólo los usuarios registrados puedan ver el precio del producto, y poder comprarlos.
  • Tenemos los productos ya precargados de la tienda «normal», y no queremos tener que editarlos uno a uno, sino que tengan ya directamente un precio reducido por defecto.

Para ello vamos a usar el plugin Woocommerce Role Pricing, ya que cubre exactamente ambos requisitos.

Una vez instalado, nos vamos a la parte de configuración, desde Woocommerce > Role Pricing.

Con la última de las opciones «Hide prices», conseguiremos que en nuestra tienda online sólo se muestren los precios de los productos y la opción de comprar a los usuarios registrados. Con lo que cuando un nuevo usuario nos visita, podrá ver la tienda completa, lo cual es genial a nivel SEO, ya que mantenemos todas las urls, descripciones, títulos, …

Un usuario no registrado vería:

Pero sin embargo si está registrado, su vista es:

Ya tenemos la tienda con nuestro modelo b2b disponible, en la que sólo los usuarios registrados (establecimientos, representantes, clientes VIP, ….) tienen la opción de ver precios y poder comprar en ella.

En este supuesto que estamos planteando, tenemos una tienda que viene de ser abierta, con muchas referencias y queremos poder reutilizar la información, y no tener que cambiar todos los precios uno a uno. Pongamos que queremos ofrecer a nuestra versión b2b los precios, un 15% más barato que en la versión b2c.

Como vimos arriba, ya tenemos establecido «rate» como método de descuento, y que se aplicará sobre los precios «regulares» de los productos, es decir, que si un producto está en oferta, ese precio no se varía, y como tenemos muchas referencias, por seguridad, lo vamos a dejar así.

Desde la pestaña de «Roles«, aplicaremos el rate de descuento según los distintos roles. En este caso aplicaremos 0.15 a todos los roles, que equivale al 15%.

Y con esto ya tendríamos nuestra tienda b2b configurada según las especificaciones iniciales.

WooCommerce Role Pricing PRO

Vamos a ver algunas características PRO que nos ofrece Woocommerce Role Pricing PRO y que nos pueden ser útil en algunas configuraciones de tiendas.

  • Descuentos por producto: Podemos aplicar descuento específico por producto, teniendo la tienda completa a un descuento, y ciertos productos a otro.
  • Mostrar precio original y el descontado: Hacer saber a tus clientes el precio original, les hará valorar realmente lo que la versión b2b les ofrece, incrementando su posible intención de compra.

Consigue la versión PRO del plugin.

Publicado el Deja un comentario

How to add menu in Prestashop

Vamos a añadir elementos en el menú principal de Prestashop.

Enlaces personalizados

El primer paso es ver y crear enlaces personalizados que podamos usar en el menú.

Desde la sección de Shop Parameters -> Traffic and SEO podemos ver un listado de direcciones preconfiguradas (contacto, marca, etc …), así como crear direcciones personalizadas.

 

 

Como ejemplo vamos a enlazar el área de afiliados del módulo Affiliates Pro, para posteriormente añadirlo al menú.

Seleccionamos la página del módulo, el título, la descripción, keywords y URL.

Una vez añadida, ya la tenemos disponible para añadirla al menú con un pretty link.

Añadir items al menú

Desde la sección de módulos, buscamos el módulo «Main menu».

 

En la configuración podemos añadir elementos entre los disponibles, así como eliminar alguno existente o cambiar el orden.

En los elementos disponibles, tenemos enlaces a lás páginas del CMS, categorías de productos, podemos buscar por productos, etc. Pero si necesitamos alguna más adicional, podemos usar la función de «Add a new link», para crear las nuestras propias.

Por ejemplo, para añadir un enlace al área de afiliados creada anteriormente, indicamos una etiqueta, y una url, donde la dirección será la usada cuando creamos los enlaces personalizados.

 

Una vez añadido, ya lo tenemos disponible en el listado superior para añadirlo al menú.

Tras guardar, ya podemos verlo en el menú.

 

The affiliates module used in this article is Affiliates Pro, available in the Addons Prestashop Store.

Publicado el Deja un comentario

Montar un sistema incremental de comisiones para afiliados

Sistema de afiliados

En este caso de uso vamos a ver cómo montar un sistema incremental de comisiones para afiliados en WordPress / Woocommerce.

Quien dice incremental, dice decremental, ya que podremos cambiar los porcentajes de comisiones según querramos.

¿Qué vamos a necesitar?

Para ello necesitaremos:

Vamos a ello

Primero

Primero montamos los grupos necesarios con Groups. En esta página de la documentación oficial podéis ver cómo hacerlo.

Segundo

A continuación, desde Affiliates, creamos los distintos ‘rates’ para los grupos. Esto lo haremos desde la sección Rates.

Tercero

Como último paso, vamos a configurar la integración Affiliates Groups by referrals. Para ello, desde Affiliates->Groups by referrals, elegimos el número de niveles, y para cada nivel, el grupo al que el usuario será añadido, y los límites monetarios que marcan cada nivel.

 

Affiliates Groups by referrals

 

Usando la imagen como referencia, podemos ver que se han definido 3 niveles:

Nivel 0: Cuando las ganancias son de 0€ a 1000€, el afiliado será añadido al grupo ‘Registered’.

Nivel 1: Para ganancias entre 1000€ y 2000€, el afiliado será automaticamente añadido a ‘Premium’

Nivel 2: Para ganacias mayores a 2000€, el afiliado será añadido a ‘VIP’

 

Con todo ellos, el afiliados irá pasando por los distintos grupos conforme vaya ganando comisiones, y según nuestra tabla de Rates en Affiliates, sus comisiones variarán. Ya tenemos montado nuestro sistema incremental de comisiones para afiliados, motivándolos a que generen más comisiones.

 

Publicado el Deja un comentario

Acciones Bulk para las categorías de productos de woocommerce

Groups Woocommerce Categories Bulk

Hoy he necesitado crear para una duda de un cliente, poder asignar grupos a categorías de productos en Woocommerce, que en principio, es sencillo, se van editando las categorías una por una, y se van asignando los grupos. El problema llega cuando el cliente me dice que tiene más de 200 categorías, e ir una a una es una pesadilla.
Por cierto, en este caso estoy hablando del plugin Groups de @itthinx.

Mirando documentación oficial y no oficial de WordPress, veo que hay filtros que podemos usar para añadir Bulk Actions a artículos y post types, pero no para las categorías (taxonomías).
La solución que opto, es crear un submenú en la administración de WordPress, mostrar ahí las categorías, los grupos, y que el usuario pueda seleccionarlos, para luego indicar si añadirlos o eliminarlos.

El plugin creado es: Groups Woo Categories Bulk, disponible en github.

Publicado el Deja un comentario

Descuentos en woocommerce según el tipo de cliente

Woocommerce Roles Pricing

Caso de uso: Descuentos en Woocommerce según el tipo de cliente.

Todos sabemos que no todos nuestros clientes son iguales. Tenemos el cliente que compra por primera vez, el que es reincidente, nuestra red de tiendas, si somos distribuidores, los comerciales, y un largo etcétera, en el que podemos meter familia y amigos.
Si queremos aplicar descuentos, o distintos precios a nuestros productos, según el tipo de cliente que nos compre, podemos agruparlos, según roles o grupos, y mediante el plugin Woocommerce Role Pricing Pro (para roles) o Woocommerce Groups Pricing Pro (para grupos), aplicar descuentos a los distintos productos.

En el siguiente video podemos ver la solución de este caso de uso usando el plugin Woocommerce Groups Pricing Pro. En el que disponemos de 2 grupos, Premium y VIP. Aplicamos un 10% de descuento al grupo Premium y un 15% al grupo VIP.

En este video podemos ver una configuración sencilla de Woocommerce Role Pricing:

Tanto el plugin basado en roles, como el basado en grupos, disponen de opciones de configuración muy similares, por lo que se pueden usar indistintamente según nuestro entorno.
En sus páginas de documentación ( roles y grupos ) se pueden consultar las distintas opciones de configuración.

¿Cómo crear roles personalizados?

WordPress viene con un conjunto reducido de roles predefinidos, por lo que si estamos usando la alternativa de Woocommerce Role Pricing Pro, basada en roles, necesitaremos crear algunos roles adicionales. Aunque hay muchas soluciones para crearlo, normalmente sugiero usar User Role Editor, plugin potente a la vez que sencillo de usar.

¿Cómo crear grupos?

En el caso de estar usando Woocommerce Groups Pricing Pro, los usuarios no serán agrupados según sus roles, sino por grupos, pudiendo crear tantos grupos como necesitemos. Necesitaremos del plugin Groups de itthinx. Aunque se trata de un plugin muy sencillo de utilizar, recomendamos echar un vistazo a la página de documentación de Groups.

Si necesitas ayudas con la instalación o configuración, no dudes en usar el sistema de comentarios e intentaré ayudarte en lo que pueda.

Publicado el Deja un comentario

Usando groups_can y groups_can_not con Visual Composer

Vamos a extender el elemento ‘vc_row’ para poder aplicar los shortcodes ‘groups_can’ y ‘groups_can_not’ del plugin Groups.

Ajustando la plantilla

Añadiremos las siguientes líneas al fichero functions.php de nuestro tema hijo de WordPress.

[php]
vc_add_param("vc_row", array(
"type" => "textfield",
"group" => "Groups",
"class" => "",
"heading" => "groups_can",
"param_name" => "groups_can",
‘description’ => ‘The capability attribute is required and is used to indicate one or more capabilities separated by comma.’
));
vc_add_param("vc_row", array(
"type" => "textfield",
"group" => "Groups",
"class" => "",
"heading" => "groups_can_not",
"param_name" => "groups_can_not",
‘description’ => ‘The capability attribute is required and is used to indicate one or more capabilities separated by comma.’
));
[/php]

Ahora, el elemento Columna tiene dos nuevos parámetros dentro de la pestaña ‘Groups’:

Cada elemento de Visual Composer tiene su plantilla de representación. En este caso vamos a sobrescribir vc_row.php desde nuestra plantilla hija.

1.- Crea una nueva carpeta “vc_templates” en tu tema hijo.

2.- Copia vc_row.php desde /wp-content/plugins/js_composer/includes/templates/shortcodes/ a la nueva carpeta creada en el tema hijo.

3.- Ahora vamos a cambiar el archivo vc_row.php, con este código:

[php]
<?php
if ( ! defined( ‘ABSPATH’ ) ) {
die( ‘-1’ );
}

/**
* Shortcode attributes
* @var $atts
* @var $el_class
* @var $full_width
* @var $full_height
* @var $equal_height
* @var $columns_placement
* @var $content_placement
* @var $parallax
* @var $parallax_image
* @var $css
* @var $el_id
* @var $video_bg
* @var $video_bg_url
* @var $video_bg_parallax
* @var $parallax_speed_bg
* @var $parallax_speed_video
* @var $content – shortcode content
* @var $css_animation
* Shortcode class
* @var $this WPBakeryShortCode_VC_Row
*/
$el_class = $full_height = $parallax_speed_bg = $parallax_speed_video = $full_width = $equal_height = $flex_row = $columns_placement = $content_placement = $parallax = $parallax_image = $css = $el_id = $video_bg = $video_bg_url = $video_bg_parallax = $css_animation = »;
$disable_element = »;
$output = $after_output = »;
$atts = vc_map_get_attributes( $this->getShortcode(), $atts );
extract( $atts );

wp_enqueue_script( ‘wpb_composer_front_js’ );

$el_class = $this->getExtraClass( $el_class ) . $this->getCSSAnimation( $css_animation );

$css_classes = array(
‘vc_row’,
‘wpb_row’,
//deprecated
‘vc_row-fluid’,
$el_class,
vc_shortcode_custom_css_class( $css ),
);

if ( ‘yes’ === $disable_element ) {
if ( vc_is_page_editable() ) {
$css_classes[] = ‘vc_hidden-lg vc_hidden-xs vc_hidden-sm vc_hidden-md’;
} else {
return »;
}
}

if ( vc_shortcode_custom_css_has_property( $css, array(
‘border’,
‘background’,
) ) || $video_bg || $parallax
) {
$css_classes[] = ‘vc_row-has-fill’;
}

if ( ! empty( $atts[‘gap’] ) ) {
$css_classes[] = ‘vc_column-gap-‘ . $atts[‘gap’];
}

$wrapper_attributes = array();
// build attributes for wrapper
if ( ! empty( $el_id ) ) {
$wrapper_attributes[] = ‘id="’ . esc_attr( $el_id ) . ‘"’;
}
if ( ! empty( $full_width ) ) {
$wrapper_attributes[] = ‘data-vc-full-width="true"’;
$wrapper_attributes[] = ‘data-vc-full-width-init="false"’;
if ( ‘stretch_row_content’ === $full_width ) {
$wrapper_attributes[] = ‘data-vc-stretch-content="true"’;
} elseif ( ‘stretch_row_content_no_spaces’ === $full_width ) {
$wrapper_attributes[] = ‘data-vc-stretch-content="true"’;
$css_classes[] = ‘vc_row-no-padding’;
}
$after_output .= ‘<div class="vc_row-full-width vc_clearfix"></div>’;
}

if ( ! empty( $full_height ) ) {
$css_classes[] = ‘vc_row-o-full-height’;
if ( ! empty( $columns_placement ) ) {
$flex_row = true;
$css_classes[] = ‘vc_row-o-columns-‘ . $columns_placement;
if ( ‘stretch’ === $columns_placement ) {
$css_classes[] = ‘vc_row-o-equal-height’;
}
}
}

if ( ! empty( $equal_height ) ) {
$flex_row = true;
$css_classes[] = ‘vc_row-o-equal-height’;
}

if ( ! empty( $content_placement ) ) {
$flex_row = true;
$css_classes[] = ‘vc_row-o-content-‘ . $content_placement;
}

if ( ! empty( $flex_row ) ) {
$css_classes[] = ‘vc_row-flex’;
}

$has_video_bg = ( ! empty( $video_bg ) && ! empty( $video_bg_url ) && vc_extract_youtube_id( $video_bg_url ) );

$parallax_speed = $parallax_speed_bg;
if ( $has_video_bg ) {
$parallax = $video_bg_parallax;
$parallax_speed = $parallax_speed_video;
$parallax_image = $video_bg_url;
$css_classes[] = ‘vc_video-bg-container’;
wp_enqueue_script( ‘vc_youtube_iframe_api_js’ );
}

if ( ! empty( $parallax ) ) {
wp_enqueue_script( ‘vc_jquery_skrollr_js’ );
$wrapper_attributes[] = ‘data-vc-parallax="’ . esc_attr( $parallax_speed ) . ‘"’; // parallax speed
$css_classes[] = ‘vc_general vc_parallax vc_parallax-‘ . $parallax;
if ( false !== strpos( $parallax, ‘fade’ ) ) {
$css_classes[] = ‘js-vc_parallax-o-fade’;
$wrapper_attributes[] = ‘data-vc-parallax-o-fade="on"’;
} elseif ( false !== strpos( $parallax, ‘fixed’ ) ) {
$css_classes[] = ‘js-vc_parallax-o-fixed’;
}
}

if ( ! empty( $parallax_image ) ) {
if ( $has_video_bg ) {
$parallax_image_src = $parallax_image;
} else {
$parallax_image_id = preg_replace( ‘/[^d]/’, », $parallax_image );
$parallax_image_src = wp_get_attachment_image_src( $parallax_image_id, ‘full’ );
if ( ! empty( $parallax_image_src[0] ) ) {
$parallax_image_src = $parallax_image_src[0];
}
}
$wrapper_attributes[] = ‘data-vc-parallax-image="’ . esc_attr( $parallax_image_src ) . ‘"’;
}
if ( ! $parallax && $has_video_bg ) {
$wrapper_attributes[] = ‘data-vc-video-bg="’ . esc_attr( $video_bg_url ) . ‘"’;
}
$css_class = preg_replace( ‘/s+/’, ‘ ‘, apply_filters( VC_SHORTCODE_CUSTOM_CSS_FILTER_TAG, implode( ‘ ‘, array_filter( array_unique( $css_classes ) ) ), $this->settings[‘base’], $atts ) );
$wrapper_attributes[] = ‘class="’ . esc_attr( trim( $css_class ) ) . ‘"’;

$output .= ‘<div ‘ . implode( ‘ ‘, $wrapper_attributes ) . ‘>’;

// @eggemplo changes
if ( isset ( $groups_can ) && ( strlen( trim( $groups_can ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can capability="’ . $groups_can . ‘"]’ . ( $content ) . ‘[/groups_can]’ );
}
if ( isset ( $groups_can_not ) && ( strlen( trim( $groups_can_not ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can_not capability="’ . $groups_can_not . ‘"]’ . ( $content ) . ‘[/groups_can_not]’ );
}
// end – @eggemplo changes

$output .= wpb_js_remove_wpautop ($content);
$output .= ‘</div>’;
$output .= $after_output;

echo $output;
[/php]

Esta es la parte de código que hemos cambiado:
[php]
// @eggemplo changes
if ( isset ( $groups_can ) && ( strlen( trim( $groups_can ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can capability="’ . $groups_can . ‘"]’ . ( $content ) . ‘[/groups_can]’ );
}
if ( isset ( $groups_can_not ) && ( strlen( trim( $groups_can_not ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can_not capability="’ . $groups_can_not . ‘"]’ . ( $content ) . ‘[/groups_can_not]’ );
}
// end – @eggemplo changes
[/php]

Espero que sirva de ayuda !!!

Publicado el Deja un comentario

Mostrar precio original y con descuento

Si estás usando Woocommerce Role Pricing o Woocommerce Groups Pricing, para aplicar descuentos en tu tienda Woocommerce según roles/grupos, y necesitas mostrar tanto el precio original como el descontado, puedes añadir este código a tu fichero functions.php:

Si estás usando Woocommerce 2.5.x


add_filter( 'woocommerce_get_price_html', 'your_own_price_html', 100, 2 );
function your_own_price_html( $price, $product ){
  $result = $price;

  if ( get_option( "wgp-baseprice", "regular" ) == "sale" ) {
    $price_key = '_price';
  } else {
    $price_key = '_regular_price';
  }

  if ( $product->product_type == 'variable' ) {

    $children = $product->get_children(true);

    $original_prices = array();
    $commission = 0;
    foreach ( $children as $child ) {
      $original_prices[] = get_post_meta( $child, $price_key, true );
      if ( $commission == 0 ) {
        $commission = WGP_Variations_Admin::get_commission( $product, $child );
      }
    }

    if ( $commission > 0 ) {
      $min_price = min( $original_prices );
      $max_price = max( $original_prices );
      $original_price = $min_price !== $max_price ? sprintf( _x( '%1$s–%2$s', 'Price range: from-to', 'woocommerce' ), wc_price( $min_price ), wc_price( $max_price ) ) : wc_price( $min_price );
    }
  } else {
    $commission = WooGroupPricing::get_commission( $product );
    if ( $commission ) {
      $original_price = woocommerce_price(get_post_meta( $product->id, $price_key, true ));
    }
  }

  if ( $commission ) {
    $result =  'Was:' . $original_price . " Now:" . $price;
  }
  return $result;
}

Si estás usando Woocommerce < 2.5.0


add_filter( 'woocommerce_get_price_html', 'your_own_price_html', 100, 2 );
function your_own_price_html( $price, $product ){
  $result = $price;
  if ( $product->is_type( 'variation' ) ) {
     $commission = WGP_Variations_Admin::get_commission( $product, $product->variation_id );
  } else {
     $commission = WooGroupPricing::get_commission( $product );
  }
  if ( $commission ) {
     $result =  'Was:' . woocommerce_price(get_post_meta( $product->id, '_price', true )) . " Now:" . $price;
  }
  return $result;
}
Publicado el Deja un comentario

Obtener nueva firma SHA-256 en TPVs Redsys

Los chicos de Redsys han decidido usar una firma más segura para sus conexiones, pasando a SHA-256. Para los que teníamos ya nuestros sistema usando el antiguo sistema SHA-1, tenemos hacer dos cosas:

– Actualizar nuestro plugin a una versión compatible. Nuestro plugin ya ha sido actualizado en la versión 2.0
– Obtener la nueva clave SHA-256 (de esto va este artículo)

Accedemos al portal del TPV.

redsys-login

Y al apartado de «Adm. TPV virtual»

redsys-panel

Accedemos a «Comercios»->Ver clave-> Mostrar clave

redsys-menu

Y la obtenemos de la ventana emergente que nos sale:

redsys-claves

Ya sólo tenemos que ponerla en la configuración del tpv, y estamos listos para usar nuestro sistema Redsys en Woocommerce.