viernes, 26 de enero de 2024

AGM (1) Territorio y personas

1. Municipios (MUNICIPIOS.xls)


/*==========================================================

* 1. MUNICIPIOS

*==========================================================*/

SELECT DISTINCT

TO_CHAR(MUNE.COD_PROV,'00') AS COD_PROVINCIA,

TO_CHAR(MUNE.ID_MUNE_INE,'00000') AS COD_MUNICIPIO,

MUNE.NOMBRE_MUNE_INE AS NOMBRE,

TO_CHAR(DIRE.DISTRITO_POSTAL_DIRE,'00000') AS CODIGO_POSTAL

FROM OPS$GTTORA.MUNE_MUNICIPIOS_ESPANA MUNE

LEFT JOIN OPS$GTTORA.DIRE_DIRECCIONES DIRE ON DIRE.COD_CAT_MUNE = MUNE.COD_CAT

AND NOT EXISTS (SELECT DIRE1.* FROM OPS$GTTORA.DIRE_DIRECCIONES DIRE1 WHERE DIRE1.COD_CAT_MUNE=DIRE.COD_CAT_MUNE AND DIRE1.DISTRITO_POSTAL_DIRE<>DIRE.DISTRITO_POSTAL_DIRE)

ORDER BY TO_CHAR(MUNE.ID_MUNE_INE,'00000');


2. Provincias (PROVINCIAS.xls) 


/*==========================================================

* 2. PROVINCIAS

*==========================================================*/

SELECT DISTINCT

TO_CHAR(PROV.COD_PROV,'00') AS COD_PROVINCIA,

PROV.NOMBRE_PROV AS NOMBRE

FROM OPS$GTTORA.PROV_PROVINCIAS PROV;


3. Terceros


/*==========================================================

* 3. TERCEROS

*==========================================================*/

SELECT DISTINCT

PERS.ID_PERS AS ID_SUJETO,

PERS.NOMBRE_DESGLOSADO_PERS AS NOMBRE,

'' AS AP2_PART,

PERS.APELLIDO2_PERS AS APELLIDO2,

'' AS AP1_PART,

PERS.APELLIDO1_PERS AS APELLIDO1,

PERS.NOMBRE_PERG AS RAZONSOCIAL,

PERS.NIF_PERG AS NIF,

PERS.COD_TPER AS FIS_JUR,

'' AS DF_MEMO,

DIRE.NUM_DIRE AS DF_NUMERO,

DIRE.BLOQUE_DIRE AS DF_PORTAL,

DIRE.ESCALERA_DIRE AS DF_ESCALERA,

DIRE.PLANTA_DIRE AS DF_PISO,

DIRE.PUERTA_DIRE AS DF_PUERTA,

TO_CHAR(DIRE.DISTRITO_POSTAL_DIRE,'00000') AS DF_CODIGO_POSTAL,

DIRE.ID_CALL AS ID_VIA,

TO_CHAR(DIRE.COD_CAT_MUNE,'00000') AS COD_MUNICIPIO,

TO_CHAR(DIRE.COD_PROV,'00') AS COD_PROVINCIA,

PERS.TELEFONO_PERS AS TELEFONO,

PERS.TELEFONO2_PERS AS MOVIL,

PERS.FAX_PERS AS FAX,

PERS.EMAIL_PERS AS E_MAIL,

PERS.NOMBRE_PERG AS TX_NOMBRE_COMPLETO,

DIRE.CALLE_DIRE AS TX_DF_COMPLETA,

DIRE.POBLACION_DIRE AS TX_DF_MUNICIPIO,

DIRE.PROVINCIA_DIRE AS TX_DF_PROVINCIA,

CASE

WHEN PPPP.ID_EPER IS NULL THEN 'N'

ELSE 'S'

END AS PAGO_FRACCIONADO,

CASE

WHEN PPPP.ID_EPER IS NULL THEN NULL

ELSE PPPP.FECHA_PPPP

END AS F_PAGO_FRACCIONADO,

CASE

WHEN NVL(PERS.CONC_ACRE_PERS,0) >0 THEN 'S'

ELSE 'N'

END AS ESTA_CONCURSO_ACREEDORES,

CASE

WHEN NVL(PERS.FALLECIDO_PERS ,0) >0 THEN 'S'

ELSE 'N'

END AS ESTA_FALLECIDO,

'N????' AS ES_RGAP,

SUBSTR(NVL(REGE.IBAN_REGE,DOMI.IBAN_DOMI), 5, 4) AS DOM_ENTIDAD,

SUBSTR(NVL(REGE.IBAN_REGE,DOMI.IBAN_DOMI), 9, 4) AS DOM_OFICINA,

SUBSTR(NVL(REGE.IBAN_REGE,DOMI.IBAN_DOMI),13, 2) AS DOM_DC,

SUBSTR(NVL(REGE.IBAN_REGE,DOMI.IBAN_DOMI),15,10) AS DOM_CUENTA,

SUBSTR(NVL(REGE.IBAN_REGE,DOMI.IBAN_DOMI), 1, 2) AS DOM_COD_PAIS,

SUBSTR(NVL(REGE.IBAN_REGE,DOMI.IBAN_DOMI), 3, 2) AS DOM_IBAN_DC,

CASE

WHEN (NVL(PERS.CONSENT_ELECTR_PERS,0)>0 AND LENGTH(TRIM(NVL(PERS.EMAIL_PERS,'')))>0) OR NVL(PERS.OBLIGADO_PERS,1) >0 THEN 'S'

ELSE 'N'

END AS NOTIFICACION_ELECTRONICA,

NULL AS F_INI_ACREEDOR,

NULL AS F_FIN_ACREEDOR

FROM OPS$GTTORA.PERS_PERSONAS PERS

JOIN OPS$GTTORA.EPER_ELEMENTOS_PERSONA EPER_DIRE ON EPER_DIRE.ID_PERS = PERS.ID_PERS AND EPER_DIRE.TIPO_EPER ='DI'

JOIN OPS$GTTORA.DIRE_DIRECCIONES DIRE ON DIRE.ID_EPER =EPER_DIRE.ID_EPER

LEFT JOIN OPS$GTTORA.EPER_ELEMENTOS_PERSONA EPER_PPP ON EPER_PPP.ID_PERS = PERS.ID_PERS AND EPER_PPP.TIPO_EPER ='PP'

LEFT JOIN OPS$GTTORA.PPPP_PAGO_PLAZOS PPPP ON PPPP.ID_EPER=EPER_PPP.ID_EPER

LEFT JOIN OPS$GTTORA.REGE_REGISTRO_ENTRADA REGE ON REGE.ID_EPER_SP= PPPP.ID_EPER_SP

LEFT JOIN OPS$GTTORA.EPER_ELEMENTOS_PERSONA EPER_DOMI ON EPER_DOMI.ID_PERS = PERS.ID_PERS AND EPER_DOMI.TIPO_EPER ='DM'

LEFT JOIN OPS$GTTORA.DOMI_DOMICILIACIONES DOMI ON DOMI.ID_EPER=EPER_DOMI.ID_EPER AND DOMI.ESTADO_DOMI='A'

ORDER BY PERS.NOMBRE_PERG;


4. Terceros Pago Fraccionado (TERCEROSPAGOFRACCIONADO.xls)


/*==========================================================

* 4. TERCEROS PAGO FRACCIONADO

*==========================================================*/

SELECT DISTINCT

PERS.ID_PERS AS ID_SUJETO,

PERS.NOMBRE_DESGLOSADO_PERS AS NOMBRE,

'' AS AP2_PART,

PERS.APELLIDO2_PERS AS APELLIDO2,

'' AS AP1_PART,

PERS.APELLIDO1_PERS AS APELLIDO1,

PERS.NOMBRE_PERG AS RAZONSOCIAL,

PERS.NIF_PERG AS NIF,

PERS.COD_TPER AS FIS_JUR,

'' AS DF_MEMO,

DIRE.NUM_DIRE AS DF_NUMERO,

DIRE.BLOQUE_DIRE AS DF_PORTAL,

DIRE.ESCALERA_DIRE AS DF_ESCALERA,

DIRE.PLANTA_DIRE AS DF_PISO,

DIRE.PUERTA_DIRE AS DF_PUERTA,

TO_CHAR(DIRE.DISTRITO_POSTAL_DIRE,'00000') AS DF_CODIGO_POSTAL,

DIRE.ID_CALL AS ID_VIA,

TO_CHAR(DIRE.COD_CAT_MUNE,'00000') AS COD_MUNICIPIO,

TO_CHAR(DIRE.COD_PROV,'00') AS COD_PROVINCIA,

PERS.TELEFONO_PERS AS TELEFONO,

PERS.TELEFONO2_PERS AS MOVIL,

PERS.FAX_PERS AS FAX,

PERS.EMAIL_PERS AS E_MAIL,

PERS.NOMBRE_PERG AS TX_NOMBRE_COMPLETO,

DIRE.CALLE_DIRE AS TX_DF_COMPLETA,

DIRE.POBLACION_DIRE AS TX_DF_MUNICIPIO,

DIRE.PROVINCIA_DIRE AS TX_DF_PROVINCIA,

CASE

WHEN PPPP.ID_EPER IS NULL THEN 'N'

ELSE 'S'

END AS PAGO_FRACCIONADO,

SUBSTR(REGE.IBAN_REGE, 5, 4) AS DOM_ENTIDAD,

SUBSTR(REGE.IBAN_REGE, 9, 4) AS DOM_OFICINA,

SUBSTR(REGE.IBAN_REGE,13, 2) AS DOM_DC,

SUBSTR(REGE.IBAN_REGE,15,10) AS DOM_CUENTA,

SUBSTR(REGE.IBAN_REGE, 1, 2) AS DOM_COD_PAIS,

SUBSTR(REGE.IBAN_REGE, 3, 2) AS DOM_IBAN_DC

--

FROM OPS$GTTORA.PERS_PERSONAS PERS

LEFT JOIN OPS$GTTORA.EPER_ELEMENTOS_PERSONA EPER_DIRE ON EPER_DIRE.ID_PERS = PERS.ID_PERS AND EPER_DIRE.TIPO_EPER ='DI'

LEFT JOIN OPS$GTTORA.DIRE_DIRECCIONES DIRE ON DIRE.ID_EPER =EPER_DIRE.ID_EPER

LEFT JOIN OPS$GTTORA.EPER_ELEMENTOS_PERSONA EPER_PPP ON EPER_PPP.ID_PERS = PERS.ID_PERS AND EPER_PPP.TIPO_EPER ='PP'

JOIN OPS$GTTORA.PPPP_PAGO_PLAZOS PPPP ON PPPP.ID_EPER=EPER_PPP.ID_EPER

LEFT JOIN OPS$GTTORA.REGE_REGISTRO_ENTRADA REGE ON REGE.ID_EPER_SP= PPPP.ID_EPER_SP

ORDER BY PERS.NOMBRE_PERG;


5. Tipo de Vía (TIPO_VIA.xls)


/*==========================================================

* 5. TIPOS DE VIA

*==========================================================*/

SELECT

COD_SIGL AS COD_Z_VIA,

DESCR_SIGL AS Z_VIA

FROM OPS$GTTORA.SIGL_SIGLAS

ORDER BY COD_SIGL;


6. Vías (VIAS.xls)


/*==========================================================

* 6. VIAS

*==========================================================*/

SELECT

COD_PROV AS COD_PROVINCIA,

TO_CHAR(COD_CAT_MUNE,'00000') AS COD_MUNICIPIO,

ID_CALL AS ID_VIA,

COD_SIGL AS COD_Z_VIA,

NOMBRE_CALL AS NOMBRE,

TO_CHAR(COD_CAT_MUNE,'00000') AS COD_DGC,

NULL AS CP

FROM OPS$GTTORA.CALL_CALLEJERO CALL

ORDER BY COD_PROV, COD_CAT_MUNE, NOMBRE ;








martes, 16 de enero de 2024

Odoo (XIV) . Servidor de correo. etc






servidor de correo 


Iniciar una reunion (en menu conversaciones)

Se puede enviar enlace de invitación a personas que no estan dadas de alta en Odoo.

Se pueden hacer canales por departamentos, y cuando se inicie la sesion se pueden ver los mensajes al igual que un grupo de whasapp. Para el tema de audio y video puede que no nos podamos conectar con gente del exterior por tema del firewall.


Para el tema de soporte se puede utilizar.





martes, 9 de enero de 2024

ODOO (XIII) Configurar add-ons importantes en la primera instalacion de Odoo16

 esquema

fi esquema

1. El modo administrador

Para saber si estamos en modo administrador tiene que verse el insecto  en la parte superior derecha de la pantalla.

Para poder seleccionar el modo administrador, debe de haberse instalado una aplicacion anteriormente. Para instalar una aplicacion hay que ir al menu aplicaciones y activar una.


Una vez activada la aplicacion 


lunes, 8 de enero de 2024

ODOO (XII) Configurar nginx con Odoo16 en Debian 12. Problemas con el firewall. Crear servidores simples http y https

 Créditos:

https://github.com/odoomates/odoosamples/blob/main/odoo_nginx_conf

https://www.youtube.com/watch?v=-hVYQd7A7PQ


1. Conseguir y adaptar los certificados al formato requerido por Nginx

Se opera igual que en el post anterior para conseguir cambiar el formato de los certificados, cuyo texto copio a continuacion:

En este caso disponemos de un certificado en formato pkcs#12 (extension ".p12"). Parece ser que Nginx prefiere tener el certificado en ficheros, uno con extensión ".crt" y otro, la clave , con extensión ".key". 

Para convertir de format pkcs#12 al último formato ejecutamos:

#1. Extract certificate in crt format
openssl pkcs12 -in ./MyCert.p12 -clcerts -nokeys -out wildcard2023Nginx.crt

#2. Extract key in rsa format
openssl pkcs12 -in ./MyCert.p12 -nocerts -nodes  -out wildcard2023Nginx.rsa

En este caso, el nombre se debe a que es un certificado wildcard que valida cualquier ordenador con el dominio "poblacion.es", como por ejemplo "odoo.poblacion.es" . En el proceso anterior nos pide la contraseña, por tanto ya tenemos este par de certificado y clave:

  • wildcard2023Nginx.crt y 
  • wildcard2023Nginx.rsa

2. Crear una carpeta en el servidor remoto y copiar dentro los certificados

Creamos la carpeta 

/etc/nginx/certs

y copiamos dentro los dos ficheros anteriores


3. Configurar nginx

El fichero /etc/nginx/sites-available/default esta interfiriendo en la configuracion de nginx. por tanto o hay que borrarlo (opcion drastica) o trasladarlo a una carpeta fuera de nginx donde guardar archivos por si acaso. 

En otro post anterior se vio como configurar nginx con docker, pero aqui cambian algunos detalles.

Ahora se crea el fichero /etc/nginx/conf.d/odoo.conf y se le da este contenido. Observar que no controla para nada el puerto 80 (cosa poco recomendable, pues habria que redirigirlo a un puerto https) y como puerto https se usa el 443 

Como el mismo servidor de Odoo tambien tiene instalado el nginx, entonces reconoce las perticiones a odoo al puerto 8069 (upstream odoo) y las del chat odoo del puerto 8072 (upstream odoochat)

Con el listen 443 ssl se permite la escucha oir dicho puerto con el esquema ssl (https para entendernos), y le indicamos la IP (en ester caso 192.168.28.139) o el alias si hubiera (server_name 192.168.28.139)

Se describe donde se guardan los logs y diversos parametros para la redireccion (location), cabeceras (proxy_set_header ...)


#odoo server
upstream odoo {
server 127.0.0.1:8069;
}

#Se tiene que abrir el puerto en el firewall.!!!!!
upstream odoochat {
server 127.0.0.1:8072;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
server_name odoo.localidad.es 192.168.28.139;
rewrite ^(.*) https://$host$1 permanent;
}

server {
#listen 443 ssl;
listen 8443 ssl;
server_name odoo.localidad.es 192.168.28.139;

# 2.1.2 certificados obtenidos en el punto 2
ssl_certificate /etc/nginx/certs/wildcard2023Nginx.crt;
ssl_certificate_key /etc/nginx/certs/wildcard2023Nginx.rsa;

proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;

# Add Headers for odoo proxy mode
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
add_header X-debug-message "1. Passing to odoo16 host=$host ,remote_addr=$remote_addr ,proxy_add_x_forwarded_for=$proxy_add_x_forwarded_for ,scheme=$scheme server_port=$server_port ,http_upgrade=$http_upgrade ,request_uri=$request_uri" always;

# log
access_log /var/log/nginx/odoo.access.log;
error_log /var/log/nginx/odoo.error.log;
location /websocket {
proxy_pass http://odoochat;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}

location / {
proxy_redirect off;
proxy_pass http://odoo;
}

# common gzip
gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
gzip on;
}





#odoo server
upstream odoo {
server 127.0.0.1:8069;
}

upstream odoochat {
server 127.0.0.1:8072;
}


server {
#listen 80;
listen 443 ssl;
server_name 192.168.28.139;
#odoo.localidad.es www.odoo.localidad.es;

# 2.1.2 certificados obtenidos en el punto 2
ssl_certificate /etc/nginx/certs/wildcard2023Nginx.crt;
ssl_certificate_key /etc/nginx/certs/wildcard2023Nginx.rsa;


proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;


# Add Headers for odoo proxy mode
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;

# log
access_log /var/log/nginx/odoo.access.log;
error_log /var/log/nginx/odoo.error.log;

# Redirect requests to odoo backend server
location / {
proxy_redirect off;
proxy_pass http://odoo;
}
location /longpolling {
proxy_pass http://odoochat;
}

# common gzip
gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
gzip on;


client_body_in_file_only clean;
client_body_buffer_size 32K;
client_max_body_size 500M;
sendfile on;
send_timeout 600s;
keepalive_timeout 300;
}


En un post anterior se explicó un poco como podemos hacer un debug de las variables de nginx usando las herramientas de desarrollador de los navegadores. En concreto se uso esta definicion de cabecera:

add_header X-debug-message "2. Passing to odoo16 host=$host ,remote_addr=$remote_addr ,proxy_add_x_forwarded_for=$proxy_add_x_forwarded_for ,scheme=$scheme server_port=$server_port ,http_upgrade=$http_upgrade ,request_uri=$request_uri" always;

Siendo las variables de nginx las que comienzan por "$"

4. Rearrancar el servicio de nginx


sudo service nginx stop
sudo service nginx start

5. Dar un nombre de dominio

Como se ha instalado un certificado wildcard que se aplica a "*.localidad.es", se le puede dar el nombre de dominio "odoo.localidad.es".
Para ello, se deben dar de alta estos dominios a los "domain servers" que tengamos en nuestra red y ya se abren mediante un firewall a la internet general.

6. Problemas con el firewall

OJO:  
  • Verificar que NO se utilizan los puertos 80 ni 443 en nginx!! 
  • Utilizar 8080 o 8443 
  • Tras la instalación del servidor https/https "twisted" y su ejecución, parece ser que inexplicablemente deja de haber problemas de rechazo de conexión!


Si queremos testear nuestra IP de salida que esta filtrada por el firewall, hay que hacerlo desde una maquina remota, para ello podemos hacer uso de killercoda.com


Entramos en Playgrounds y seleccionamos una maquina ubuntu y podemos testear desde esta maquina externa nuestros puertos.

6.1 Herramientas disponibles

Para escanear los puertos abiertos de una IP remota se puede hacer de varias maneras:

6.1.1 Utilizando netcat

Instalar net cat : apt-get install netcat -y
nc -zv IP puerto (ejemplo nc -zv 46.24.94.100 443) y devuelve:
  • Si esta abierto: Connection to 46.24.94.100 443 port [tcp/http] succeeded!
  • Si esta cerrado: Se queda en espera eternamente y no contesta.
  • Si rechaza la conexion: nc: connect to 46.24.94.60 port 7324 (tcp) failed: Connection refused
Siendo
-z : escanea daemos de esclucha (listening daemons).
-v : Muestra salida detallada(output in verbose mode).

6.1.2 Utilizando nmap

Instalar net cat : apt-get install nmap -y
nmap IP (escanea todos los puertos que sean estandard !!!) 
nmap IP -p puerto 

Si hacemos nmap 46.24.94.100 contesta:

Starting Nmap 7.80 ( https://nmap.org ) at 2024-01-10 07:07 UTC
Nmap scan report for static-60-94-24-100.ipcom.comunitel.net (46.24.94.100)
Host is up (0.034s latency).
Not shown: 989 filtered ports
PORT     STATE  SERVICE
25/tcp   open   smtp
80/tcp   open   http
465/tcp  open   smtps
587/tcp  open   submission
981/tcp  closed unknown
2222/tcp open   EtherNetIP-1
8088/tcp open   radan-http
8099/tcp open   unknown
8443/tcp open   https-alt
9090/tcp open   zeus-admin
9943/tcp open   unknown

Pero si hacemos nmap 46.24.94.100 -p 19444 contesta:
  • Si esta abierto19444/tcp open  unknown
  • Si esta cerrado19444/tcp filtered unknown
  • Si rechaza la conexion: 19444/tcp closed swx.

6.1.3 Utilizando telnet

Instalar net cat : apt-get install telnet -y

telnet IP puerto (por ejemplo telnet 46.24.94.100 443)

Y contesta

Pero si hacemos nmap 46.24.94.100 -p 19444 contesta:
  • Si esta abiertoConnected to 46.24.94.60. Escape character is '^]'.
  • Si esta cerrado: Se queda en espera..
  • Si rechaza la conexion: telnet: Unable to connect to remote host: Connection refused

6.1.4 Utilizar un escaneador de puertos por internet

Por ejemplo https://dnschecker.org y le damos la IP y el puerto o puertos.


6.2 Crear un servidor http/https de pruebas interno


Veamos como crear un servidor http simple

python3 -m http.server <port>  (por ejemplo python3 -m http.server 8080)

Y si queremos crear un servidor https simple , tenemos que instalar el servidor twisted

pip3 install twisted

Y ejecutar 

# Definicion del comado
sudo twistd web --https=<port> --path=. -c </path/to/cert.pem> -k </path/to/privatekey.pem> 

# Ejemplo de uso
sudo twistd web --https=8443 --path=. -c /etc/nginx/certs/wildcard2023Nginx.crt -k /etc/nginx/certs/wildcard2023Nginx.rsa

Donde se definen las rutas al certificado y la clave


y si entramos en un navegador vemos:





miércoles, 3 de enero de 2024

ODOO (XI) Resumen apuntes Jaume II

1. Instalación (Resumen)

Sobre un servidor ubuntu se realizan los siguientes pasos
  1. Hacer los clásicos: sudo apt-get update y sudo apt-get dist-upgrade.
  2. Crear el usuario:  sudo adduser --system --quiet --shell=/bin/bash --home=/opt/odoo --group odoo. Dar un password: sudo passwd odoo.
  3. Instalar postgres: sudo apt-get install postgresql postgresql-server-dev-12.
  4. Crear el usuario odoo en postgres. Entramos como usuario postgres y ejecutmos: createuser --createdb --username odoo --no-createrole --no-superuser --pwprompt odoo.
  5. Descargar el odoo 15.0: Entrar en el directorio /opt/odoo con e usuario odoo y clonar el repositorio: su odoo ; cd /opt/odoogit clone https://www.github.com/odoo/odoo --depth 1 --branch 15.0 --single-branch.
  6. Insalación de librerías necesarias:
    1. python3-pip instalador de librerías python. (se utiliza como pip3)
    2. gdebi-core, gdebi le permite instalar paquetes deb locales resolviendo e instalando sus dependencias. apt hace lo mismo, pero solo para paquetes remotos (http, ftp). También puede resolver las dependencias de compilación de los archivos locales de debian/control. Este paquete contiene las bibliotecas y la utilidad de línea de comandos.
    3. libxml2-dev: Archivos de desarrollo para la biblioteca XML de GNOME.
    4. libjpeg-dev: es una biblioteca C ampliamente utilizada para leer y escribir archivosde imagen JPEG.
    5. Libxslt-dev: XSLT es un lenguaje XML para definir transformaciones de archivos XML a algún otro formateo arbitrario, como XML, HTML, texto plano, etc. utilizando hojas de estilo XSLT estándar. LibXSLT se una biblioteca en C que implementa XSLT.
    6. libldap2-dev: librerías de openldap
    7. libsasl2-dev: Cyrus SASL: archivos de desarrollo para la biblioteca de abstracción de autenticación.
    8. Build-essential: Se trata de un paquete que contiene una lista informativa de los paquetes que seconsideran esenciales para la creación de paquetes Debian.
    9. python3-pillow: es una biblioteca de procesamiento de imágenes potente y conveniente dePython.
    10. python3-lxml: es una biblioteca de Python que permite un fácil manejo de archivos XML y HTML, y también se puede utilizar para web scraping.
    11. python3-dev: contiene los archivos de encabezado que necesita para crear extensiones de Python.
    12. python3-setuptools: le permite instalar un paquete sin copiar ningún archivo a su directorio de intérprete. Esto le permite modificar su código fuente y hacer que los cambios surtan efecto sin tener que reconstruir y reinstalar. 
    13. Libpq-dev: contiene un conjunto mínimo de binarios y encabezados `PostgreSQL`_ requeridos para crear aplicaciones de terceros para PostgreSQL. 
    14. npm: administrador de paquetes de node. Cuando está trabajando en un proyecto de JavaScript, puede usar npm para instalar paquetes de código de otras personas en su propio proyecto. 
    15. nodejs: es un entorno en tiempo de ejecución multiplataforma, de código abierto, para la capa del servidor (pero no limitándose a ello) basado en el lenguaje de programación javascript.
    16. Apache2: servidor web. 
  7.  sudo apt-get install build-essential python3-pillow python3-lxml python3-dev python3-pip python3-setuptools libpq-dev npm nodejs git gdebi libldap2-dev libsasl2-dev libxml2-dev libxslt1-dev libjpeg-dev apache2 -y  
  8.  Instalación de dependencias con PIP3. Actualizamos pip: pip3 install --upgrade pip y hacemos: sudo pip3 install -r /opt/odoo/odoo/requirements.txt  y para ver las librerías que hemos instalado ejecutamos: pip freeze que nos debe mostrar un listado que debe coincidir con requeriments.txt.
  9. Arrancar odoo: Con usuario odoo, entramos a la carpeta /opt/odoo/odoo/ que es donde tenemos insalado y ejecutamos el fichero odoo-bin.
  10. Si da errores se puede hacer lo siguiente:
    1. sudo apt install -y npm 
    2. sudo ln -s /usr/bin/nodejs /usr/bin/node
    3. sudo npm install -g less less-plugin-clean-css rtlcss  
    4. sudo apt install node-less 
    5. sudo python3 -m pip install libsass
  11. Instalar librerías pdf: 
    1. wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.bionic_amd64.deb 
    2. sudo gdebi -n wkhtmltox_0.12.5-1.bionic_amd64.deb
    3. rm wkhtmltox_0.12.5-1.bionic_amd64.deb
    4. sudo ln -s /usr/local/bin/wkhtmltopdf /usr/bin/
    5. sudo ln -s /usr/local/bin/wkhtmltoimage /usr/bin/

2. Configuración (Resumen)

Ficheros logs:
  1. sudo mkdir /var/log/odoo
  2. chown odoo:root /var/log/odoo

Fichero de configuración de odoo:
  1. cp /opt/odoo/odoo/debian/odoo.conf /etc/odoo.conf 
  2. chown odoo: /etc/odoo.conf 
  3. chmod 640 /etc/odoo.conf 
  4. nano /etc/odoo.conf con este contenido:
db_user = odoo
db_password = false
addons_path = /opt/odoo/odoo/addons
logfile = /var/log/odoo/odoo-server.log

Arranque automático de odoo (como servicio):
  1. sudo cp /opt/odoo/odoo/debian/odoo.service /etc/systemd/system/odoo.service 
  2. sudo nano /etc/systemd/system/odoo.service con este contenido:
[Service]
Type= simple
User=odoo
Group= odoo
6ExecStart=/opt/odoo/odoo/odoo-bin --config /etc/odoo.conf
  1. Activar el servicio:  sudo systemctl enable odoo.service  
  2. Arrancar el servicio: sudo systemctl start odoo 
  3. Parar el servicio: sudo systemctl stop odoo 
  4. Ver estado del servicio: sudo systemctl status odoo 
  5. Rearrancar el servicio: sudo systemctl restart odoo 
Para poder acceder desde el navegador: http://IP_server:8069 y sale




3. Conocimientos previos

Instaladores pip y pipx

Estos instaladores permiten instalar las dependencias. Pero cuando se instalan dependencias con distintas versiones aparece el "dependency hell” que provoca fallos de ejecución muy complicados. Esta experiencia la sufrí con el lenguaje java.
Para ello aparece pipx para instalar de forma aislada (y no global como hace pip) de las librerías.
En Pyton-Land se explica claramente para que se utiliza pipx y ademas hace una lista de las librerías que si se aconseja instalarlas en un entorno global. Es muy recomendable su lectura.

1. Los módulos internos (estándar)

Los módulos se pueden instalar desde el cliente web


Para instalar desde el servidor:

  1. El fichero odoo.conf indica la ruta de los módulos
  2. Los módulos estándar suelen estar en la carpeta addons (cuya ruta és  /opt/odoo/odoo/addons /opt/odoo/addons pero también puede ser /usr/lib/..../addons)
  3. Para instalar un módulo se ejecuta:   

./odoo-bin -c /etc/odoo-server.conf -d DBNAME -u module_name/all

Siendo:

  • DBNAME el nombre de la base dedatos
  • module_name el nombre del módulo a cargar

2. Los módulos externos (de un github)

Los repositorios más utilizados son:
  • https://github.com/OCA
  • https://apps.odoo.com/apps
Se puede instalar de dos maneras:

1. Instalación por descarga:

1. Para descargar, lo normal es crear una carpeta dentro del home del usuario para no tener problemas de permisos dentro del servidor y copiar a dicha carpeta el módulo del repositorio con alguno de estos métodos
  • git clone ruta_módulo (dentro del github remoto)
  • wget (apuntado la página oficial de odoo)
2. Para copiar desde nuestra máquina local al servidor, se puede hacer por ssh o por ftp si el servidor tiene instalado ese módulo. Por ejemplo en ssh se puede hacer

scp nombre_archivo_a_subir usuario@servidor:ruta_servidor_donde_colocar_archivo

3. Una vez copiado, hay que indicar en el fichero de configuración odoo.conf y en addons_path hay que añadir la ruta de la carpeta donde se ha descargado el módulo. Las rutas se separarán por comas. 

4. Hay que instalar las librerías que necesite dicho módulo. Para ver las dependencias:
  • Hay un archivo requirements.txt dentro del módulo copiado al servidor que contiene la relación de dependencias. 
  • Seleccionando el módulo en el cliente web y dándole al boton derecho del mouse sobre el módulo y seleccionar Más-Información.

Dichas dependencias se instalaráncon pip o pipx (preferentemente)
5. Actualizar la lista de aplicaciones para ver el nuevo módulo instalado.

2. Instalación por pipx:


pipx install odoo16-addon 





martes, 2 de enero de 2024

ODOO (X) Comandos básicos de Visual Studio

Funciones generales


Ampliar Fuente (Ver-Apariencia-Zoom In) Ctrl Shift 0

Reducir Fuente (Ver-Apariencia-Zoom Out)  Ctrl Shift -

Guardar Crtl S

Ir a línea/Columna  Ctrl G

Dividir el editor de un mismo fichero  (En la parte superior derecha)

Ver varias filas o columnas de editores (Ver Diseño del editor (Editor Layout) ...)

Si apretamos sobre espacios (barra de estado) se puede definir la anchira de los tabuladores

Paleta de comandos (Ver Paleta de comandos)

Workspace: idea por la que se puede tener varias carpetas enuna miosma area de trabajo. Para ello en Fichero Añadir carpeta al workspace

Auto Save (Configuración Autosave ) Y le damos si/no y el intervalo de tiempo para guardar en ms.

Funciones de código

Ir a la definición de una función : Ctrl click 

Cambiar el nombre de una función y a todas sus llamadas (F2, o boton derecho Rename(cambiar el nombre del símbolo)

Búsqueda por caracteres, palabras, mayúsculas y minúsculas y expresiones regulares

Atajos: Abrimos la paleta de comandos y le damos shotcuts y nos da una url de atajos o una pantalla de atajos. Tambi'en se puede cambiar los atajos cosa poco recomendable por si cambiamos de oprdenador.

Seleccionar multiples líneas no consecutivas y modificar ( Alt Click)