Magento 1: listar clientes con más actividad en los últimos meses

2018-02-26 - Categorías: Magento
eCommerce clientes y ventas

Una información muy interesante para el equipo directivo de una empresa, puede ser simplemente el saber qué clientes son los más activos. Quizá queremos calcular un promedio de pedidos por cliente, cuántos intentos de pedido ha habido sin llegar a éxito, terminados en cancelación o no. Quizá sólo hacen un pedido y no vuelven más a la web. O quizá no suelen hacer ni un pedido, pero los que hacen pedidos suelen repetir…

Esta información, y mucha más, es información necesaria para lo llamado como: Inteligencia de Negocio. Esta información, muchas veces no es suficiente con los reportes del panel del control, pero es bastante sencillo de sacar a partir de scripts en PHP.

En el panel de control de Magento, podemos ir a la sección de Informes > Clientes > Clientes por total de pedidos, o a Informes > Clientes > Clientes por número de pedidos y veremos listados exportables como el siguiente:

Los subreportes en Magento de casa están limitados a 5, por esto que sólo verás 5 resultados por día o por mes. Lo que no veo, por ejemplo, es que no salen los clientes con 0 pedidos, tampoco tengo emails ni teléfonos para arrancar acciones comerciales. Esto es un problema, porque aunque puedo ver cierta información, y la puedo exportar a CSV, no tengo casi información reutilizable.

Así que aquí abajo dejo el script que saca el 100% de los resultados. Editarlo para añadir la información de los clientes y sus pedidos no es complicado.

Listando clientes

Vamos con el simple caso de sacar un listado de los clientes y su número de pedidos. Primero que todo necesitaremos los clientes, vamos a sacar sólo los creados este año:

$customers = Mage::getModel('customer/customer')->getCollection()
    ->addFieldToFilter('created_at', array(
        'from' => '2018-01-01 00:00:00',
    ));

Dentro de $customers tendremos un array de clientes. Luego vamos a necesitar los pedidos para cada uno de ellos.

Listando pedidos

Así tenemos los pedidos de un sólo cliente desde una fecha:

$orderCollection = Mage::getResourceModel('sales/order_collection')
    ->addFieldToFilter('customer_id', $customerId)
    ->addFieldToFilter('created_at', array(
        'from' => '2018-01-01 00:00:00',
    ))
    ->setOrder('created_at', 'desc');

..donde $customerId es el identificador del cliente dentro de Magento.

Todo junto

Juntando todo en un sólo script nos puede quedar algo así:

<?php

require_once __DIR__.'/app/Mage.php';

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

$customers = Mage::getModel('customer/customer')->getCollection()
    ->addFieldToFilter('created_at', array(
        'from' => '2018-01-01 00:00:00',
    ));

echo 'ID,TAXVAT,EMAIL,NOMBRE,APELLIDOS,PEDIDOS'.PHP_EOL;

foreach ($customers as $customer) {
    $customer = Mage::getModel('customer/customer')->load($customer->getId());

    echo $customer->getId().','
        .trim($customer->getTaxvat()).','
        .trim($customer->getEmail()).',"'
        .trim($customer->getFirstname()).'","'
        .trim($customer->getLastname()).'",';

    $orderCollection = Mage::getResourceModel('sales/order_collection')
        ->addFieldToFilter('customer_id', $customer->getId())
        ->addFieldToFilter('created_at', array(
            'from' => '2018-01-01 00:00:00',
        ))
        ->setOrder('created_at', 'desc');

    echo $orderCollection->count();

    echo PHP_EOL;
}

Este script lo podemos meter dentro de un fichero .php, por ejemplo llamado customersAndOrders.php, y lo ponemos en el directorio raíz del proyecto. Ahora lo ejecutamos desde línea de comandos:

$ php customersAndOrders.php

Y deberemos de ver un listado de estos clientes en formato .csv

ID,TAXVAT,EMAIL,NOMBRE,APELLIDOS,PEDIDOS
76022,1231321E,afasf.asfafsaf@gdfgfdg.com,"Nombre1","Apellidos1",1
76023,,asdasd@dfgdfg.com,"Nombre2","Apellidos2",3
76025,54566654F,sadsadasd@dfgdfg.com,"Nombre3","Apellidos3",1

Que de igual manera podemos guardarlo a un fichero .csv para luego estudiarlo en LibreOffice o similar como un Excel, así:

$ php customersAndOrders.php > customersAndOrders.csv

¿Sencilllo verdad? Espero que sirva.

Un saludo.


GNU/Linux: bloqueando visitas por país

2018-02-21 - Categorías: GNU/Linux
Internet Firewall

Siguiendo con el post anterior de bloqueo de IPs usando el cortafuegos integrado en el núcleo de Linux, llegamos a la necesidad de por ejemplo bloquear a cierto país. Hay negocios, o páginas web, que han recibido quizás ataques automáticos desde IPs que residen en Rusia, Rumanía o China. Si cerramos dicha entrada al servidor nos evitaríamos muchos problemas.

Tengamos en cuenta que si nuestro servidor trabaja con servidores que residen en estos países, podremos encontrarnos con conexiones que no se hacen, no dan respuesta al conectar, denegación de conexión.. Es complicado si nos olvidamos de que hemos bloqueado, por ejemplo, a Rusia. Si luego resulta que contratamos un servicio ruso, cuyos servidores residen en Rusia, estaremos contratando un servicio que no nos va a poder conectar.

Obteniendo IPs registradas por país

El primera paso es tener un listado de IPs del país en concreto que queremos bloquear. Para esto tenemos varias páginas que nos los sirven sin cargo. Por ejemplo:

http://www.ip2location.com/free/visitor-blocker
https://www.countryipblocks.net/country_selection.php
https://www.nirsoft.net/countryip/
http://www.ipdeny.com/ipblocks/
..

Mejor coge los rangos de IPs del país que quieras bloquear usando el formato en CIDR. Es decir de la forma red/máscara, son así:

2.136.0.0/13
2.152.0.0/14

Tienes entonces que guardarte este listado de CIDRs de forma que tengas 1 CIDR por línea del fichero. Lo guardas en un fichero de texto, y se lo subes al servidor.

Metiendo el bloqueo en el firewall de Iptables

Para esto, desde un servidor GNU/Linux, bastará con ejecutar lo siguiente:

$ while read line; do sudo ufw deny from $line; done < IPsCountryCIDR.txt

Ahora hay que esperar mientras que se cargan todos los bloqueos en el cortafuegos. Tardará un buen rato porque UFW se encarga de transformar, línea a línea, al formato de Iptables.

Sólo nos quedará comprobar que está activo y con las reglas de bloqueo funcionando. Simulando una visita desde dicho país podremos comprobarlo.

Simulando visita desde cierto país

Para esto puedes usar el TorBrowser, del enrutamiento cebolla. Puedes descargártelo aquí:

https://www.torproject.org/

El navegador de la red Tor es un proyecto, que usando Firefox, hace que podamos navegar anónimamente. Esta anonimización la hace creando un camino de conexiones de varios nodos, desde nuestro PC, a la página destino. De esta manera podemos decirle al TorBrowser que queremos que el último nodo sea en un país concreto. Para esto abrimos el fichero este:

Browser/TorBrowser/Data/Tor/torrc

..y ponemos lo siguiente:

ExitNodes {es} 
StrictNodes 1

El código entre llaves es el código del nodo final. Con esta configuración podemos visitar y ver esto en el navegador:

Tor navegando desde España

Terminando

Esto es todo, si has seguido todos los pasos, debes de haber podido bloquear el acceso a cierto país y comprobarlo con el TorBrowser.


GNU/Linux: bloqueando visitas por IPs

2018-02-19 - Categorías: GNU/Linux
Internet Firewall

Cuando tenemos un servidor visible desde Internet, desde cualquier lugar del mundo, recibimos visitas constantemente. Esperamos que estas visitas siempre sean las deseadas, pero quizá no lo son. No sólo hay personas y ordenadores con buenas intenciones conectados a Internet. También puede incluso haber sistemas informáticos mal configurados, que involuntariamente, ocasionen problemas a tus sistemas informáticos.

Por ejemplo, nos podemos encontrar con casos como estos:

  • Una araña de un buscador, que escanea los contenidos de tu web con muy buenas intenciones, pero se engancha y no deja de escanearte llegando a bloquearte.
  • Registro de usuarios ficticios, a modo de SPAM.
  • Comentarios de SPAM con contenidos que enlazan a otras webs.
  • Una web que se copia tus contenidos tratando de posicionarse en buscadores antes que tú.
  • Y un largo etcétera.

Debemos de tener siempre nuestros servidores lo más actualizados posibles. Y sólo permitir la escucha en los puertos totalmente necesarios. Además de que sólo debemos de abrir los puertos para las IPs, o países que sean extrictamente necesarios.

Los escaneos automáticos en busca de vulnerabilidades en nuestros servidores va a ser constante, dalo por hecho. Si no lo haces, te arrepentirás más pronto que tarde, cuando la catástrofe haya acontecido. Así que los simples mortales como yo, que no somos expertos en ciberseguridad, debemos dejar trabajar a los que saben aplicando todas las actualizaciones lo antes posible, y sólo abriendo los puertos de escucha de los servicios estrictamente necesarios.

Cómo bloquear a estos visitantes

Ahora es cuando llegamos a Iptables. Iptables es un cortafuegos integrado en el núcleo de Linux. Es bastante engorroso de configurar así que han desarrollado utilizades que automatizan su configuración. Una utilidad muy interesante en GNU/Linux para manejar este cortafuegos es el UFW, que son las siglas de Uncomplicated FireWall.

Es bien sencillo de usar, por ejemplo para bloquear todas las conexiones que vengan de una IP basta con hacer lo siguiente:

$ sudo ufw deny from IP

También tenemos incluso una interfaz gráfica del UFW, es el llamado GUFW, que se ve tal que así si tienes escritorio gráfico en el servidor:

GUFW

Ahora bien, veamos los primeros pasos con este UFW desde línea de comandos. Ya que suponemos que estamos configurando un Servidor Ubuntu o basado en la distribución Debian.

Instalación

En Ubuntu 16 viene instalado por defecto. Si por lo que sea no lo tienes puedes hacer lo siguiente:

$ sudo apt-get install ufw

Para ver el estado en el que está podemos hacer:

$ sudo ufw status
Estado: inactivo

Perfecto, ya lo tenemos instalado, listo para activarlo.

Las configuraciones por defecto

Para hacer las primeras configuraciones tenemos el fichero /etc/default/ufw en donde tenemos estas dos configuraciones principales:

DEFAULT_INPUT_POLICY="DROP"
DEFAULT_OUTPUT_POLICY="ACCEPT"

Cuidado con esto, porque de estar configurando remotamente el cortafuegos, y no darte acceso a ti mismo, te puedes autodenegar el acceso y ya la hemos liado parda. El DEFAULT_INPUT_POLICY es la configuración de denegar por defecto las conexiones entrantes. Así que, podemos aceptar por defecto las configuraciones entrantes antes de activarlo si son las primeras pruebas que estamos haciendo.

Así que ponemos DEFAULT_INPUT_POLICY=»ACCEPT», o añadimos el permitir la entrada al puerto 22 para poder seguir trabajando remotamente. Si estas ya conectado a un servidor remoto, y quieres configurar esto, mejor dale una leída rápida a todo el post, para luego ir al grano de lo que necesites.

Algunas configuraciones

Así que vamos a arrancarlo:

$ sudo ufw enable
El cortafuegos está activo y habilitado en el arranque del sistema

Ahora vemos el estado de nuevo así:

$ sudo ufw status
Estado: activo

Ya lo tenemos en marcha. Vamos ahora con las configuraciones. Vamos a denegar el acceso a una IP:

$ sudo ufw deny from 1.2.3.4

Ahora vamos a aceptar todas las conexiones entrantes en los puertos 22, 80 y 443:

$ sudo ufw allow 22
$ sudo ufw allow 80
$ sudo ufw allow 443

Ok, ¿sencillo verdad? la verdad es que es mucho más sencillo que usar las tradicionales Iptables. Así que ahora listamos todo lo configurado:

$ sudo ufw status
Estado: activo

Hasta Acción Desde
----- ------ -----
Anywhere DENY 1.2.3.4
22 ALLOW Anywhere 
80 ALLOW Anywhere 
443 ALLOW Anywhere 
22 (v6) ALLOW Anywhere (v6) 
80 (v6) ALLOW Anywhere (v6) 
443 (v6) ALLOW Anywhere (v6)

Imagina que ahora queremos borrar una regla. Lo más sencillo es listar numeradas las reglas y borramos:

$ sudo ufw status numbered
Estado: activo

Hasta Acción Desde
 ----- ------ -----
[ 1] Anywhere DENY 1.2.3.4
[ 2] 22 ALLOW IN Anywhere 
[ 3] 80 ALLOW IN Anywhere 
[ 4] 443 ALLOW IN Anywhere 
[ 5] 22 (v6) ALLOW IN Anywhere (v6) 
[ 6] 80 (v6) ALLOW IN Anywhere (v6) 
[ 7] 443 (v6) ALLOW IN Anywhere (v6)

Ahora borramos la regla que permite conexiones entrantes al puerto 80 en el IPv4 así:

$ sudo ufw delete 3

Volvemos a listar para asegurarnos:

$ sudo ufw status numbered
Estado: activo

Hasta Acción Desde
 ----- ------ -----
[ 1] Anywhere DENY IN 1.2.3.4 
[ 2] 22 ALLOW IN Anywhere 
[ 3] 443 ALLOW IN Anywhere 
[ 4] 22 (v6) ALLOW IN Anywhere (v6) 
[ 5] 80 (v6) ALLOW IN Anywhere (v6) 
[ 6] 443 (v6) ALLOW IN Anywhere (v6)

Borramos ahora las conexiones al puerto 80 en IPv6:

$ sudo ufw delete 5

Cómo hubiera sido con Iptables

Sólo como curiosidad, si quieres ver la configuración tradicional mediante Iptables, ejecuta lo siguiente para ver la tonelada de configuraciones que te has ahorrado mantener:

$ sudo iptables --list

Terminando

Espero que sirva como introducción, ya que el siguiente paso es bloquear las visitas por país. Si la has liado con alguna de las configuraciones, o simplemente quieres resetear todo, ejecutas esto y todo limpio:

$ sudo ufw reset

GNU/Linux: automatizar backups de Mariadb/Mysql

2018-02-16 - Categorías: GNU/Linux
Historial

El software de gestión de servidores te puede automatizar esta y otras tareas. Pero si estas haciendo artesanalmente un servidor, para no gastar ni un bit innecesariamente en correr software de gestión de servidores, tendrás que automatizar esta tarea: el hacer copias de seguridad de la base de datos.

Sí, más vale prevenir que curar. Da por hecho que tarde o temprano los sistemas se rompen, así que más te vale haberte prevenido y tener una copia de seguridad por si acaso. Como me ha llevado un rato buscar entre los foros para construir esto, aquí que lo dejo por si a algún ubuntero le sirve.

Creando el script

Le idea es crear un sencillo Shell Script que automatice la copia de seguridad. Así que creo el fichero /home/ubuntu/backup.db.sh siguiente:

#!/bin/bash
mysqldump -h localhost -u usuario -pcontraseña nombre_base_de_datos | gzip > ~/backups/backup.db.$(date +%Y%m%d).sql.gz
find /home/ubuntu/backups/ -type f -mtime +30 -name 'backup.db.*.gz' -execdir rm {} \;

Este script hace 2 cosas. La primera es sacar una copia de la BD y la comprime a un fichero .gz. Lo segundo es que revisa si hay ficheros .gz de más de 30 días en el directorio de copias de seguridad, borrándolos.

Creando carpeta que almacenará los ficheros

De esta manera necesitaremos crear el directorio para alojar las copias de seguridad:

$ mkdir /home/ubuntu/backups/

Permisos de ejecución del script

Para poder ejecutar este script tendremos que darle permisos de ejecución así:

$ chmod +x /home/ubuntu/backup.db.sh

Ejecutando el script cada día

Sólo falta ejecutar este script cada día. Para esto ejecutamos desde el usuario ubuntu lo siguiente:

$ crontab -e

Nos saldrá una pantalla en donde podemos editar cada tarea programada. Cada línea de este fichero es una tarea programada. Así que tenemos que añadir aquí esta línea:

0 2 * * * /home/ubuntu/backup.db.sh > backup.db.lastLog

Guardamos y salimos del editor. Con esto ya se ejecutará dicho Shell Script cada noche a las 2:00 AM, dejando registro en el fichero backup.db.lastLog.

Terminando

Sólo me queda añadir que quizá quieres añadir a lo anterior una copia de ficheros. Para esto no tienes más que añadir en el script las líneas que te hagan dicha copia de ficheros. Puedes probar el script en cualquier momento así desde línea de comandos, como si fuera un .bat:

$ /home/ubuntu/backup.db.sh

Espero que sirva.
Un saludo.


PrEDA: cálculo empírico del coste temporal de Binomial

2018-02-04 - Categorías: PHP / PrEDA
Números

El coeficiente binomial es una función muy utilizada en combinatoria. Sirve para saber el número de combinaciones de elementos que podemos hacer. Se utiliza mucho en computación para estudiar la estrategia de programación dinámica, porque ejemplifica muy bien la mejora que supone utilizar dicha estrategia. Por ejemplo, la forma de escoger de entre 6 elementos 2 de ellos, es igual al coeficiente binomial (6 2).

Continuar leyendo..


PrEDA: esquemas de programación genéricos avanzados

2018-02-03 - Categorías: PHP / PrEDA
PrEDA algoritmos genericos

Otro HOWTO, code-kata, a traer vengo hoy..

XDD vengo con este post cargado de esquemas algorítmicos para programar. Estos esquemas algorítmicos son los que nos ayudan a programar las mejores soluciones. Así conseguimos llegar a las soluciones que a veces tenemos que encontrar, pero quizá no vemos en un principio cómo. Quizá el problema lo tenemos en que tarda mucho, o necesitamos demasiado espacio de almacenamiento.

Continuar leyendo..

© 2024 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.