Professional Documents
Culture Documents
FP Dam m10 Material Paper
FP Dam m10 Material Paper
FP Dam m10 Material Paper
Sistemes de gestió
empresarial
CFGS.DAM.M10/0.13
Generalitat de Catalunya
Departament d’Ensenyament
Aquesta col·lecció ha estat dissenyada i coordinada des de l’Institut Obert de Catalunya.
Coordinació de continguts
Joan Carles Pérez Vázquez
Redacció de continguts
Isidre Guixà Miranda
Llicenciat Creative Commons BY-NC-SA. (Reconeixement-No comercial-Compartir amb la mateixa llicència 3.0 Espanya).
http://creativecommons.org/licenses/by-nc-sa/3.0/es/legalcode.ca
Desenvolupament d’aplicacions multiplataforma 5 Sistemes de gestió empresarial
Introducció
Avui dia molta part de la competitivitat d’una empresa passa per tenir optimitzats i
integrats els seus fluxos/processos interns i les seves relacions comercials externes,
per aconseguir objectius bàsics com son les millores de la productivitat, la qualitat,
el servei al client i la reducció de costos. Les organitzacions necessiten integració
interna i col·laboració externa per augmentar les oportunitats de sobreviure en un
mercat global, cada cop més competitiu.
Aquesta és la raó de la cerca d’un sistema que permeti assolir totes les necessitats
del negoci, des de el control de les operacions financeres i la generació d’informes,
les relacions i vendes amb els clients, la planificació i programació de la producció,
fins al control d’inventari i costos. En l’actualitat, les organitzacions busquen
implementar sistemes que els permeti controlar totes les àrea del negoci, de
forma integral. Així, amb un sistema integrat, tota l’empresa, els seus sistemes
i processos, es centralitzen i integren per al benefici de tota l’organització.
Com a conseqüència de tot aquest sistema integrat l’organització ha de veure com
es generaren millors resultats, sempre que s’implanti el programari adequadament,
oferint com a benefici el control i la monitorització de les operacions, l’eficiència
administrativa, una productivitat més adequada, un servei al client més eficient,
estalvi de costos i recolzament més fiable per a la pressa de decisions.
En aquest sentit, els sistemes ERP, de l’anglès Enterprise Resource Planning,
coneguts àmpliament com a sistemes de planificació de recursos empresarials o
sistemes de gestió empresarial, són sistemes que integren o pretenen integrar totes
les dades i processos d’una organització en un sistema unificat.
Aquest mòdul té com a finalitat inicial l’aproximació conceptual al món dels
sistemes de gestió empresarial i la seva implantació a l’empresa.
Al començament de la unitat “Sistemes ERP. Implantació”, i des de un punt
de vista teòric, s’examinen els diferents tipus de llicenciament de programaris
ERP-CRM i els diferents tipus de desplegament de programari. També es veurà
què són els sistemes ERP-CRM i les solucions BI i s’identifiquen els principals
productes existents en l’actualitat. D’altra banda, s’identifiquen els punts a tenir
en compte en la implantació tècnica d’un sistema ERP-CRM. A continuació es fa
la instal·lació i configuració d’un ERP-CRM, en concret el programari OpenERP.
L’altra gran finalitat d’aquest mòdul és l’explotació i adequació dels sistemes de
gestió empresarial desenvolupant components específics segons les necessitats i
requeriments plantejats.
En la unitat “Sistemes ERP. Explotació i adequació”, s’estudia el desenvolupament
de nous mòduls que es puguin integrar al sistema, amb el programari i llenguatges
específics. A continuació, aprendrem a ampliar i modificar mòduls existents,
traduccions idiomàtiques, aspectes relatius a la seguretat, dissenyar i modificar
informes
Els continguts d’aquest mòdul tenen una orientació bàsicament professionalitza-
Desenvolupament d’aplicacions multiplataforma 6 Sistemes de gestió empresarial
dora, es proposa una formació pràctica i aplicable amb l’objectiu que l’alumnat
aprengui a saber fer. Un cop llegits detingudament els continguts de cada apartat,
cal realitzar les activitats i els exercicis d’autoavaluació per tal de posar en pràctica
i comprovar l’assoliment dels coneixements adquirits. I, sobretot en les unitats
referides a l’explotació i adequació dels sistemes ERP, és molt important la
pràctica, en els propis ordinadors, dels exemples que es descriuen en el material
docent.
Desenvolupament d’aplicacions multiplataforma 7 Sistemes de gestió empresarial
Resultats d’aprenentatge
Continguts
Unitat 1
Sistemes ERP-CRM. Implantació
Unitat 2
Sistemes ERP-CRM. Explotació i adequació - I
Unitat 3
Sistemes ERP-CRM. Explotació i adequació - II
2. Reporting & BI
Sistemes ERP-CRM.
Implantació
Isidre Guixà Miranda
Índex
Introducció 5
Resultats d’aprenentatge 7
Introducció
Les empreses necessiten, per a una òptima gestió empresarial, un suport informàtic
adequat a les seves necessitats. Per aquest motiu hi ha en el mercat diversos
programes informàtics: gestió comercial, compravenda, facturació, comptabilitat,
nòmines, producció, relació amb els clients... molts d’ells englobats en paquets
que es distribueixen a unitats o de forma modular. El conjunt de programes que
una empresa utilitza per acompanyar la seva gestió diària constitueixen el seu
sistema de gestió empresarial.
Per una banda tenim els sistemes ERP que engloben o pretenen englobar totes
les dades i processos d’una organització en un sistema integrat. Per altra banda,
tenim els sistemes CRM ideats per donar suport a la gestió de les relacions amb
els clients, a la venda i al màrqueting. Si ens fixem en la definició dels sistemes
ERP, la gestió que faciliten els sistemes CRM hauria d’estar inclosa en els sistemes
ERP i la realitat és que la majoria dels actuals ERP incorporen una gestió completa
CRM. Però també és veritat que encara hi ha moltes PIME que no tenen implantat
un ERP o que tenen un ERP no actual i que, per elles, la implantació d’un sistema
CRM pot portar a una millora substancial de la seva gestió. Per això és important
conèixer també els sistemes CRM actuals.
La segona part del títol de la unitat formativa (implantació) porta a dues interpre-
tacions. Una, d’abast molt ampli, que fa referència a tot el procés d’implantació
d’un sistema ERP-CRM, dirigit per experts consultors. L’altre, d’abast més reduït,
es refereix a la instal·lació, configuració i posada en marxa d’un sistema ERP-
CRM, que podríem anomenar implantació tècnica del sistema ERP-CRM. El
mot implantació en el títol d’aquesta unitat formativa fa referència a la segona
interpretació.
Sistemes de gestió empresarial 6 Sistemes ERP-CRM. Implantació
Per tal d’assolir un bon aprenentatge cal estudiar els continguts en l’ordre indicat,
sense saltar-se cap apartat i, quan es fa referència a algun annex del web, adreçar-
s’hi i estudiar-lo. En els materials web trobareu molts vídeos referents a sistemes
ERP-CRM i solucions BI; visualitzeu-los per fer-vos una idea dels productes que
hi ha en el mercat. Una vegada estudiats els continguts del material paper i del
material web, desenvolupeu les activitats web.
Resultats d’aprenentatge
• Verifica les configuracions del sistema operatiu i del gestor de dades per
garantir la funcionalitat de l’ERP-CRM.
• Comprova l’ERP-CRM.
Les empreses necessiten, per a una òptima gestió empresarial, un suport informàtic
adequat a les necessitats de l’empresa. Per aquest motiu hi ha en el mercat diversos
programes informàtics: gestió comercial, compravenda, facturació, comptabilitat,
nòmines, producció, relació amb els clients... molts d’ells englobats en paquets
que es distribueixen com a unitats o de forma modular.
En el mercat actual trobem un gran nombre d’aplicacions que poden tenir utilitat
a les empreses. Totes elles van acompanyades d’un determinat tipus de llicència.
Sistemes de gestió empresarial 10 Sistemes ERP-CRM. Implantació
Per altra banda, ha proliferat una gran nombre de tipus de llicències de programari.
En conseqüència, ens cal poder reconèixer la llicència que acompanya cada
programari i les seves implicacions.
A causa que els drets i deures que els autors poden assignar a les seves obres són de
diversos tipus, han aparegut un gran nombre de tipus de llicències que, bàsicament,
podem classificar en dos grans grups: programari privatiu i programari lliure.
El nostre objectiu no és conèixer l’evolució que han tingut els conceptes progra-
mari lliure i programari privatiu, sinó conèixer els conceptes existents i utilitzats
Programari privatiu
en el moment actual.
Hi ha força controvèrsia pel que
fa a la nomenclatura de Pel que fa al programari lliure, ens cal saber que, segons la Free Software
programari privatiu. Així, altres
termes que s’utilitzen són Foundation, un programari és lliure quan garanteix les quatre llibertats següents
programari propietari,
programari esclau, programari (enumerades a partir del valor zero):
tancat, programari privat i
programari no lliure. El motiu de
la controvèrsia radica en les
connotacions dels diversos mots. 1. Llibertat d’utilitzar el programa per a qualsevol propòsit.
La confusió entre programari lliure i codi obert (open source) és simple d’explicar,
ja que el programari lliure, per tal de garantir les llibertats 1 i 3, obliga a tenir accés
al codi del programari, és a dir, el programari lliure té el codi obert. Però darrere
Sistemes de gestió empresarial 11 Sistemes ERP-CRM. Implantació
dels mots programari lliure i codi obert hi ha dos moviments ben diferenciats des
del punt de vista filosòfic.
La utilització del concepte de codi obert va aparèixer per primera vegada l’any
1998, quan alguns usuaris del moviment pel programari lliure el van utilitzar per
substituir el nom programari lliure a causa de l’ambigüitat del terme free en la
llengua anglesa. Però per alguns seguidors del moviment pel programari lliure
la substitució no es va considerar adequada ja que es perdia el sentit ètic i moral
implícit en el mot llibertat utilitzat en la definició del programari lliure. Així es
va produir una escissió del moviment pel programari lliure, apareixent la Open
Source Initiative, fundada per Bruce Perens i Eric S. Raymond.
La iniciativa pel codi obert exigeix que la distribució del programari de codi obert Logotip de Open Source Initiative
ha de verificar el següent decàleg:
2. Codi font: el codi font ha d’estar inclòs o s’ha de poder obtenir lliurement.
4. Integritat del codi font de l’autor: les llicències poden requerir que les
modificacions siguin redistribuïdes només com a pegats.
El decàleg del codi obert és compatible amb les quatre llibertats del programari
lliure i, des d’un punt de vista pràctic, ambdós moviments són equivalents, però
són totalment incompatibles des d’un punt de vista filosòfic.
Pels defensors del codi obert, el fet de tenir accés total al codi font del programari
és una qüestió pràctica que possibilita que el programari evolucioni, es desenvolu-
pi i millori a una alta velocitat, més alta que la que es pot assolir en els processos
Sistemes de gestió empresarial 12 Sistemes ERP-CRM. Implantació
Pels defensors del programari lliure allò que importa és la defensa de les llibertats;
l’accés al codi és conseqüència de les llibertats 1 i 3 i la qualitat del codi tancat
no té perquè ser inferior a la del codi obert.
2. Programari sota copyleft (còpia permesa): les llicències copyleft són aque-
lles que exerceixen els autors del programari, emparats en la legislació de
copyright, per permetre la lliure distribució de còpies i versions modificades
d’una determinada obra. La majoria de les llicències copyleft exigeixen que
els drets concedits es mantinguin en les versions modificades del producte.
Per saber on som ens convé, en un primer lloc, conèixer els tipus de desplegament
que hi ha hagut al llarg de la història i, per poder dur a terme desplegaments en el
moment actual, ens cal poder distingir els requeriments associats.
En la primera època (la dècada dels 60 i dels 70) les aplicacions residien en
grans ordinadors (mainframes) ubicats en les dependències de l’organització i els
usuaris disposaven de terminals (pantalles sense memòria ni capacitat de procés)
connectades amb l’ordinador central.
La segona època arriba en la dècada dels 80, amb l’eclosió dels ordinadors
personals. Les aplicacions empresarials van anar adoptant l’arquitectura de dues
capes (client-servidor), en les quals continua existint l’ordinador central (servidor
–un o diversos–) que conté les bases de dades i en la qual la terminal de l’anterior
Sistemes de gestió empresarial 14 Sistemes ERP-CRM. Implantació
Per aquest motiu, s’adopta ben aviat l’arquitectura de tres capes (presentació-
negoci-dades) il·lustrada a la figura 1.2, en la qual els clients tenen aplicacions
senzilles que únicament presenten les dades subministrades per un o diversos
servidors d’aplicacions, contenidors de la capa de negoci, que confeccionen
aquelles dades a partir de la informació subministrada pels servidors de la capa de
dades.
Fig ur a 1 . 2 . Arquitectura de tres capes
Durant la primera dècada del segle XXI, encara dins la tercera època, les apli-
cacions empresarials es van acomodant a la nova situació tecnològica i faciliten
solucions accessibles des dels navegadors web. L’arquitectura de tres capes
continua sent vàlida per a la nova situació. Simplement cal afegir un servidor
web davant el(s) servidor(s) d’aplicacions per permetre la connexió des dels
Sistemes de gestió empresarial 15 Sistemes ERP-CRM. Implantació
Els models IaaS i PaaS ja fa temps que s’estan utilitzant (des que l’ample de banda
ho ha fet possible) i el model SaaS també en aplicacions vinculades a Internet, com
per exemple el correu electrònic. En canvi, fins fa ben poc (cap a l’any 2010) no
han començat a aparèixer aplicacions empresarials (ERP/CRM/BI) sota el model
SaaS.
Sembla que el model SaaS és una tendència de futur, sobretot per petites i mitjanes
empreses que no disposen de recursos informàtics adequats per poder respondre al
repte d’adquirir llicències d’una aplicació empresarial (ERP/CRM/BI) i procedir
a la seva instal·lació/configuració/personalització (ja sigui sota model on-premise
o sota models IaaS/PaaS). Llavors, endinsar-nos en la implementació, explotació
i adequació dels sistemes de gestió empresarial sembla una incongruència, oi?
Prenguem-nos-ho per la banda positiva: ens convé introduir-nos en els sistemes
de gestió empresarial per poder assessorar a les petites i mitjanes empreses que
ens demanin consell i per dur a terme un correcte desplegament en aquelles
organitzacions per optin pels models on-premise o IaaS/PaaS.
Els desplegaments d’aplicacions empresarials avui en dia poden tenir lloc sota
dos models: on-premise (a casa del comprador de les llicències) o IaaS/PaaS
(dues modalitats d’informàtica en núvol). En qualsevol cas, hem de pensar que
l’aplicació empresarial està desenvolupada sota l’arquitectura web de tres capes i,
per tant, cal disposar de:
• Servidor d’aplicacions.
Per atendre a aquestes necessitats, cal avaluar què necessitem i què tenim. Aquesta
tasca, però, s’escapa de les capacitats d’un desenvolupador de programari i són
tasques per encomanar a consultors i administradors de sistemes. Però, és possible
que ens toqui fer-ho en una PIME que ens hagi demanat consell i no hi hagi
consultors ni administradors de sistemes. En un cas així, caldrà:
• Identificar l’SGBD amb el que pot treballar el programari que s’ha d’ins-
tal·lar. Algunes vegades, un mateix programari de gestió empresarial
permet utilitzar diferents SGBD, situació en la qual cal analitzar quin d’ells
és millor en funció de les necessitats de l’empresa i del seu cost, tenint
en compte que n’hi ha de molt potents amb versions gratuïtes. Així,
per exemple, una botiga de bicicletes que adquireixi un ERP per dur la
gestió informatitzada dels circuits compravenda, inventari i comptabilitat
és possible que en tingui prou amb un SGBD ofimàtic, com ara Microsoft
Access, mentre que un supermercat, amb el mateix ERP, és possible que no
en tingui prou amb un SGBD ofimàtic i en precisi un de major potència.
Administració o configuració
• Definir les dades de l’organització (nom, raó social, domicili fiscal, NIF...)
El concepte tercer és més genèric i engloba tots els ens amb els quals l’empresa
pot mantenir una relació: clients, proveïdors, empleats, bancs i qualsevol altre
tipus d’ens que pugui aparèixer. D’aquesta manera, si un empleat passa a ser, en
un moment donat, client no tindrà informació duplicada en el sistema.
• Tot allò que l’empresa ven (bé o servei) i que hagi estat adquirit o produït
per l’empresa.
• Tot allò que l’empresa adquireix per poder satisfer les necessitats de
producció (primeres matèries).
Els articles també acostumen a tenir una casella de verificació per ser marcats
com a article de compra, article de venda, article de consum en fabricació o bé
article de producció. Segons tingui activades les diferents caselles de verificació,
s’activen diferents pantalles per informar de les dades corresponents.
Una altra característica molt important i que no tots els ERP permeten és el poder
gestionar l’article sota diferents tipus d’unitats. Així, per exemple, és possible
que comprem l’article en litres i el venguem en quilos o que el tipus d’unitat a
utilitzar estigui en funció del client, en el cas de venda, o del proveïdor, en el cas
de compra.
Les existències mínimes i màximes que es desitgen tenir d’un producte al ma-
gatzem és també una dada fonamental. Per una banda, en articles amb molta
Sistemes de gestió empresarial 23 Sistemes ERP-CRM. Implantació
rotació pot interessar garantir una existència mínima, per tal de poder efectuar un
servei ràpid en cas de venda o utilització en cas de producció (matèria de consum
en processos de fabricació). I, per altra banda, pot interessar tenir assignada
una existència màxima a cobrir en el cas que l’estoc de l’article sigui inferior a
l’existència mínima. És molt interessant que l’ERP tingui mecanismes d’alerta
per detectar els productes que, a causa d’un moviment de sortida (venda, consum
de fabricació, regularització), passen a tenir un estoc inferior a l’existència mínima
indicada, així s’avisa al responsable per tal que iniciï el procés de reposició
que pertoqui (comprar-lo o fabricar-lo); el fet que l’article tingui assignada una
existència màxima, pot servir per indicar la quantitat a reposar. Un bon ERP hauria de
permetre gestionar
existències dels articles en
Molts ERP també contemplen, a títol informatiu a la fitxa del producte, les diversos magatzems i
indicar existències mínimes
quantitats pendents de recepció (comandes de compra), les quantitats pendents i màximes per a cada
magatzem.
de servir (comandes de venda), les quantitats pendents de consumir (en ordre
de fabricació on el producte intervingui com a primera matèria) i les quantitats
pendents de fabricar (quan es tracta d’un producte que fabriquen). Aquestes
quantitats, que mai són modificables per l’usuari i que, en cas d’existir, són només
de visualització, són redundants ja que els seus valors són calculables a partir de
comandes de compra, comandes de venda i ordres de fabricació, però el seu càlcul
és costós (implicaria fer un recorregut per totes les comandes de compravenda i
ordres de fabricació) i, per això, és possible que l’ERP les contempli a la fitxa
de producte i les actualitzi de forma automàtica en els processos de gestió dels
circuits de compravenda i fabricació.
Això implica que l’ERP ha de facilitar la possibilitat d’introduir, per als clients o
proveïdors que interessi, la codificació i denominació dels articles que ens compra
o ven. Normalment els ERP faciliten dos programes tal com mostra la figura 1.4.
Sistemes de gestió empresarial 24 Sistemes ERP-CRM. Implantació
F igu r a 1. 4 . Pantalles facilitades pels ERP per relacionar la nostra codificació d’articles amb la codificació
dels proveïdors o clients
Taules bàsiques
Les taules bàsiques són fitxers de pocs registres i amb poca volatilitat (es modi-
fiquen molt poc) que contenen definicions codificades de conceptes a utilitzar en
molts dels programes de l’ERP.
Compres
que provenien de la comanda, en cas que la fitxa del producte contempli aquest
camp (alguns ERP el contemplen).
Vendes
Aquest apartat comprèn els programes necessaris per cobrir el circuit de vendes:
tarifes a clients, ofertes a clients, comandes de clients, lliurament de mercaderia i
facturació.
Factura proforma En ocasions, tant per les ofertes com per les comandes, els clients poden demanar
Una factura proforma és un
document basat en una oferta
la generació de l’anomenada factura proforma.
comercial amb la indicació
exacta que tindrà la factura final.
No té cap valor comptable ni A l’hora d’introduir la comanda de venda, l’ERP acostuma a proposar, per defecte,
com a justificant; s’utilitza
principalment en comerç
els valors que es tenen pactats amb el client, que es troben a la seva fitxa
internacional per obtenir
llicències d’importació, per
(manteniment de tercers – pestanya de clients). L’usuari simplement els haurà
obertura de crèdits documentaris de validar.
o per enviaments de mostres
comercials. Acostuma a incloure
la data màxima de validesa. S’ha de tenir en compte que el programa de gestió de comandes de client modifica
el camp quantitat pendent de servir de la fitxa dels productes que intervenen a la
comanda, en cas que la fitxa de producte contempli aquest camp (alguns ERP el
contemplen).
Sistemes de gestió empresarial 27 Sistemes ERP-CRM. Implantació
Si la comanda del client s’ha rebut per telèfon i no n’ha quedat constància
documental en la nostra organització és altament recomanable enviar-ne una còpia
(per fax o correu electrònic) al client per sol·licitar-li la seva conformitat escrita.
En canvi, si la comanda del client s’ha rebut amb un document del client, cal
registrar a la nostra comanda l’identificador de comanda del client per facilitar-ne
la localització davant de qualsevol incidència.
Fabricació
Els components que formen la llista van acompanyats de les quantitats necessàries
per a la fabricació d’una determinada quantitat de producte final. En el cas que
els components apareguin en quantitats molt petites, les quantitats es basen en la
fabricació d’una quantitat superior a la unitat. La taula 1.1 mostra dos exemples
Sistemes de gestió empresarial 29 Sistemes ERP-CRM. Implantació
Les llistes de materials de la taula 1.1 són molt simples; en realitat les llistes de
materials acostumen a incorporar més dades, com per exemple:
Producte: Ordinador X Quant.: 1u. Producte: Adob CKT Quant.: 100 Kg.
Memòria RAM E 2 u.
DVD G 1 u.
Caixa H 1 u.
Cargols I 20 u.
Monitor J 1 u.
Teclat K 1 u.
Ratolí L 1 u.
Cable alimentació 2 u.
Serveis
Hi ha organitzacions en les quals el seu negoci està basat en els serveis, com per
exemple, els serveis d’atenció tècnica (SAT), els serveis de consultoria, els serveis
de gestoria, etc.
• Definir el servei amb les diferents fases, les hores d’operari de cada fase
(amb l’assignació de l’operari concret o simplement de la categoria d’ope-
rari que haurà de dur a terme la fase) i, si s’escau, els materials necessaris.
• En els serveis de llarga durada, cal poder controlar el cost del servei a
cada moment, per tal de detectar possibles desviacions respecte els costos
previstos inicialment.
A Internet es poden trobar
molts materials
introductoris referents a
comptabilitat. Als annexos Comptabilitat i finances
del web trobareu l’apartat
“On adquirir coneixements
de gestió empresarial?”
amb alguna recomanació. La presentació de les funcionalitats bàsiques dels ERP que fan referència a fitxers
mestres, taules de suport, compres, vendes, producció i serveis es pot dur a terme
Una vegada coneguda la utilitzant un llenguatge no gaire tècnic.
teoria de les principals
funcionalitats que ens
hauríem de trobar en un El mòdul de comptabilitat i finances ja no és tan fàcil d’introduir si no es tenen
ERP, convé tenir un primer
contacte amb els ERP coneixements al respecte i no és l’objectiu d’aquest material introduir-lo. Els
actuals. Als annexos del
web trobareu l’apartat tècnics informàtics programadors que hagin d’adequar un ERP a les necessitats
“Actualitat del programari
de gestió empresarial” de l’empresa, desenvolupant-hi mòduls específics o utilitzant eines BI per obtenir
que presenta els
principals ERP del mercat informació per als responsables de l’empresa, han de tenir uns coneixements
amb enllaços a vídeos en
els quals se’n mostra el mínims de comptabilitat i finances per poder donar resposta a les necessitats que
funcionament. sorgeixin en aquest àmbit.
Sistemes de gestió empresarial 31 Sistemes ERP-CRM. Implantació
“If it’s not broken, don’t fix it” diuen els anglosaxons, en una frase que podria
traduir-se a si funciona, no ho toquis i que en l’àmbit de la implantació d’ERP
s’acostuma a sentir molt sovint.
Les empreses li tenen por, per no dir pànic, a un canvi en el seu programari de
gestió empresarial, sigui o no ERP, i no els falta raó, ja que se sent parlar molt
d’experiències negatives.
L’anàlisi dels problemes que provoquen el fracàs de la implantació d’un ERP ajuda
a definir els punts a tenir en compte per aconseguir una bona implantació. Hi ha
nombrosos estudis al respecte i, encara que tots volen el mateix (aconseguir una
bona implantació), no tots defineixen el mateix nombre de punts a tenir en compte.
Com que el mot decàleg, a banda d’indicar 10 punts, connota un conjunt de punts
bàsics per al desenvolupament d’una activitat, intentarem recollir en un decàleg
adreçat als dirigents de l’organització on implantar un ERP els punts clau a tenir
en compte:
Sistemes de gestió empresarial 32 Sistemes ERP-CRM. Implantació
9. Màxima atenció als usuaris. Una implantació d’ERP pot suposar un xoc
pels usuaris, que hauran de canviar de pantalles i, en molts casos, la forma
de fer les coses. Per tant, cal aconseguir la màxima col·laboració dels
usuaris, havent-los fet participar en els processos de preimplantació (anàlisi
de les operacions que s’efectuen i informació que es gestiona i anàlisi dels
productes candidats). Una vegada iniciada la implantació, han de rebre la
formació i acompanyament adequats.
Aquest decàleg està adreçat als dirigents de l’organització en la qual s’ha d’implan-
tar l’ERP. El tècnic informàtic que està llegint aquests materials no acostumarà a
ser dirigent de l’organització, però convé que en sigui coneixedor ja que:
• En petites empreses, pot haver esdevingut el cap del departament TIC i pot
haver d’erigir-se en el responsable intern de la implantació.
Fixem-nos que els punts del decàleg es poden agrupar en tres fases:
1. Anàlisi
2. Plantejament i disseny
3. Implantació
Un cop tenim l’ERP implantat i en funcionament amb total èxit cal passar
a una quarta fase:
4. Postimplantació
• Per les hores que sobrepassin el conjunt anterior, descompte sobre el preu
de venda.
Fins fa uns anys, els grans fabricants d’ERP dirigien els seus productes a grans
empreses i el mercat de les PIME quedava per a fabricants d’aplicacions de gestió
(moltes vegades suite) que cobrien les necessitats de l’empresa sense que el seu
producte pogués ser catalogat com un ERP. De fet en parlar d’un ERP es tendeix
a pensar en un sistema desenvolupat per a la gran empresa i amb un cost excessiu
Consulteu l’apartat “Els per a la PIME, tant en l’econòmic del producte com en el d’implantació.
ERP a les PIME” dels
annexos del web.
Aquesta situació s’ha vist alterada en els darrers anys, en el quals els grans
fabricants d’ERP han dirigit la seva mirada cap a les PIME i els ofereixen versions
dels seus productes.
Sistemes de gestió empresarial 35 Sistemes ERP-CRM. Implantació
• Els sistemes ERP, com a programari de gestió integrada, integren totes les
dades i processos d’una organització en un sistema unificat.
• Els sistemes CRM donen suport a la gestió de les relacions amb els clients,
a la venda i al màrqueting.
• Les solucions BI són eines destinades a facilitar dades als dirigents em-
presarials, obtingudes a partir de les dades dels sistemes ERP-CRM, amb
l’objectiu de facilitar la presa de decisions.
Segons la definició d’ERP, aquests sistemes integren totes les dades i processos de
l’organització i, en conseqüència, han d’incorporar la gestió de les relacions amb
els clients (CRM) i podrien incorporar eines d’intel·ligència de negoci. Per tant,
una organització amb ERP no s’hauria de plantejar la implantació de CRM i de
solucions BI.
Pel que fa a les solucions BI, els ERP actuals també incorporen eines que permeten
obtenir informes per analitzar i que acostumen a formar part de la base de l’ERP.
Però per segons quin tipus d’informe o anàlisi a efectuar és possible que el mòdul
BI integrat a l’ERP encara no en faciliti l’adequada funcionalitat, tot i que molt
probablement els ERP aniran evolucionant en la línia de la solució total. Així
doncs, actualment és força usual adquirir una solució BI per obtenir resultats
complementaris a la informació que facilita l’ERP.
Per tot això es pot respondre afirmativament a la pregunta que encapçala aquest
apartat: els sistemes CRM i les solucions BI són companys de viatge dels ERP.
Els CRM independents aporten, també, els mòduls que faciliten les accions
pròpies del programari de gestió comercial i que són necessàries de controlar per
poder tenir tota la informació al voltant dels clients. Per això, la llista de mòduls
anteriors es pot veure ampliada amb:
1. Mòdul d’ofertes.
4. Mòdul de facturació.
Els sistemes ERP, CRM, HRM (Human Resource Management) són alguns dels
innumerables tipus d’aplicacions implantades a les empreses, que es troben, en
moltes ocasions, en plataformes diferents. A totes aquestes se sumen els docu-
ments impresos, arxius de diverses eines ofimàtiques, etc. cosa que converteix
l’organització en un mar d’informació en el qual és difícil de trobar aquella que és
determinant a l’hora de prendre decisions per al negoci. A vegades, pitjor que no
tenir informació és tenir-ne molta.
Per altra banda, en les organitzacions acostuma a existir una jerarquia que
determina el tipus d’accions que es realitzen dins d’ella i, en conseqüència, el tipus
de decisions que s’han de prendre. Tradicionalment s’han establert tres nivells
jeràrquics:
Aquests model tradicional de tres nivells s’ha vist ampliat darrerament per l’arriba-
da de les TIC, amb un quart nivell que s’ubica entre el tàctic i l’operatiu, anomenat
Sistemes de gestió empresarial 39 Sistemes ERP-CRM. Implantació
el nivell del coneixement, en el qual ubiquem tots els professionals que afegeixen
valor a l’empresa per mitjà de les seves habilitats en les TIC.
Els diferents nivells, que també podríem anomenar rols, tenen diferents necessitats
d’accés a les dades (el director general no té perquè conèixer com s’introdueix en
el sistema una oferta a client i en canvi sí que pot necessitar conèixer si s’està
assolint els objectius de vendes per a l’exercici actual, mentre que la situació és
totalment inversa per a un auxiliar administratiu del departament comercial). Els
actors de tots els nivells necessiten informes, però la complexitat d’elaboració
és molt diferent (l’auxiliar del departament comercial pot necessitar un simple
llistat de les ofertes diàries, mentre que el director general necessita gràfiques
que pugui visualitzar des de diferents dimensions). Per tant, es necessiten eines
informàtiques per elaborar informes adequats per a tots els nivells i la complexitat
de les eines és molt diferent segons el nivell al qual han de servir.
F igur a 1.5 . Correspondència entre els nivells de l’empresa i els tipus de sistemes de gestió de la
informació
La figura 1.5 incorpora conceptes (OLTP, data mining, data warehouse) que hem
de reconèixer juntament amb d’altres que estan vinculats al món BI: ETL, OLAP,
KPI, data mart, dashboard i cubs multidimensionals.
Una eina BI ha de ser capaç de reunir informació dispersa per tota la companyia i,
fins i tot, de diferents fonts, per tal de proporcionar als departaments l’accessibili-
tat, poder i flexibilitat necessaris per analitzar la informació. La figura 1.6 mostra
tots els components que poden intervenir en una solució BI. La part esquerra de
la figura mostra els diversos orígens de dades d’on pot provenir la informació que
la solució BI reunirà en el repositori de la solució.
Sistemes de gestió empresarial 40 Sistemes ERP-CRM. Implantació
• Integrada: conté les dades de tots els orígens de dades possibles, de forma
consistent.
• Variable en el temps: els canvis produïts en les dades al llarg del temps hi
queden registrats per tal que els informes puguin reflectir les variacions.
La taula 1.2 mostra les principals diferències entre les bases de dades dels sistemes
OLTP, dedicades a les operacions del dia a dia, i un data warehouse, dedicat a
concentrar informació completament orientada a l’anàlisi.
Taul a 1. 2. Comparació entre les BD dels sistemes OLTP i els data warehouse
El data warehouse pot estar organitzat en data marts. Un data mart (aparador de
dades) és un subconjunt de dades del data warehouse, corresponent a una unitat
de negoci (àrea) de l’organització. Té l’objectiu de solucionar la problemàtica
d’anàlisi de la corresponent àrea.
Avui en dia les eines analítiques es tipifiquen en: query&reporting, data mining,
KPI i anàlisi OLAP.
Les eines query&reporting (consultes i informes) són les tradicionals eines que
permeten dissenyar i executar consultes sobre una base de dades i formatar el
resultat en informes. La figura 1.6 mostra que aquestes eines s’apliquen sobre
les bases de dades del sistemes OLTP i sobre el data warehouse i data marts.
Els dissenyadors del data warehouse han decidit que a nivell d’anàlisi no interessa mantenir
el client, ni el producte ni la data però sí que es necessita incorporar el tipus de client, la
família de producte i el mes i any en què s’ha efectuat les vendes. Per tant, en el data
warehouse s’ha dissenyat la taula següent, que agrupa les quantitats i la mitjana dels preus
de venda:
El procés ETL que emplena la taula VENDA_DW es preocupa de cercar totes les
vendes del període que correspongui, agrupant-les per tipus de client, família de
producte i mes o any, tot sumant les quantitats de producte venudes i calculant la
mitjana dels preus aplicats.
Amb aquest disseny, dins el data warehouse s’ha perdut la informació de detall
de client, producte i data de venda. És a dir, s’ha disminuït la granularitat i, en
conseqüència, l’anàlisi basada en el data warehouse podrà donar resultats a nivell
de tipus de producte, tipus de clients i intervals mensuals, però no pas a nivell de
client, de producte i de data de venda. Si en el data warehouse s’hagués decidit
emmagatzemar les dades en una estructura similar a la de la taula VENDA del nostre
ERP, l’eina d’anàlisi tindria majors possibilitats analítiques, ja que podria analitzar
les dades a nivell de detall i també als nivells del resum que facilita VENDA_DW però
per fer això és necessari més espai en el data warehouse.
En terminologia de BI, la taula VENDA és una taula de fets (enregistra els fets que
s’han produït) i la taula VENDA_DW és una taula agregada de fets. Les anàlisis a
nivell resum s’executaran més ràpidament si disposem en el data warehouse de
taules agregades de fets adequades al resum que cal analitzar. No és gens senzill
decidir quines dades s’emmagatzemen en el data warehouse i amb quin nivell de
granularitat.
Les dades de la taula VENDA_DW ens permeten construir diversos cubs muldimen-
sionals, en els quals els atributs per analitzar es representen en els diversos eixos
(dimensions) del cub.
Sistemes de gestió empresarial 43 Sistemes ERP-CRM. Implantació
Així, si volem analitzar la quantitat de vendes per tipus de producte, tipus de client
i mesos, podem construir el cub tridimensional de la figura 1.7. Observem que en
el punt v hi haurà el valor corresponent a la quantitat de venda del tipus de producte
tp efectuada per clients del tipus tc en el mes m.
És molt comú que la informació del data warehouse s’estructuri en cubs multi-
mensionals, ja que aquests preparen la informació per respondre a consultes dinà-
miques amb un bon rendiment (temps de resposta). Els cubs multidimensionals
no són, però, les úniques estructures de dades que utilitzen els data warehouse.
Per finalitzar amb la percepció dels conceptes més utilitzats al voltant de les solu-
cions BI, apareguts tots ells en la figura 1.6, ens manca presentar els dashboards
i els KPI.
La llista d’operacions anteriors es pot veure ampliada amb dues operacions més:
Per executar aquestes operacions pot ser necessari l’ajut de dos perfils professio-
nals diferents al nostre i que en moltes ocasions recauen en un mateix professional:
Tot procés d’implantació tècnica d’un ERP-CRM consta de les operacions anteri-
ors. En les diverses combinacions possibles de sistema ERP-CRM amb sistema
operatiu i amb sistema gestor de bases de dades, hi intervenen tantes variables
que cada combinació necessitaria el seu propi aprenentatge. És a dir, a diferència
del procés d’aprendre a conduir, que ens serveix gairebé per a qualsevol cotxe,
la implantació tècnica d’un sistema ERP-CRM no és estàndard i, per tant, un
implantador necessita l’aprenentatge concret per a cada combinació possible. Per
altra banda, l’experiència acumulada d’un implantador en diverses situacions
ajuda que cada nova situació necessiti d’un aprenentatge més curt.
• Desplegaments possibles:
• Sistema operatiu:
– Versió Enterprise:
∗ 1-10 usuaris 1.950 A
C / any
∗ 10-25 usuaris: 3.950 A
C / any
∗ 25-70 usuaris: 9.950 A
C / any
∗ més usuaris: consultar.
– Versió SaaS: 39 A
C cada usuari/mes
– No incorpora suport.
– No incorpora migracions.
– No incorpora pegats.
– No permet dissenyar mòduls privats (per tant, estarem obligats a
facilitar el codi font dels mòduls que desenvolupem).
• Client web, que permet la connexió via protocol HTTP des de qualsevol
navegador.
• Client GTK, que s’ha d’instal·lar a cada màquina des d’on es vulgui accedir
a OpenERP.
Ja que totes les màquines actuals incorporen algun navegador, és útil l’existència
del client web, ja que facilita l’ús de l’OpenERP des de qualsevol màquina, sense
haver de procedir a instal·lar-hi cap programari. No obstant això, els usuaris
acostumats al client GTK són reticents al canvi cap al client web perquè es perden
El client GTK es basa en les dreceres de teclat.
el projecte GTK+
(www.gtk.org), un conjunt
d’eines multiplataforma Per tal d’arribar a ser capaços d’efectuar instal·lacions reals de l’OpenERP cal
per a la creació
d’interfícies d’usuari, sota començar realitzant implantacions de l’OpenERP en un sistema proper en el qual
llicència GNU LGPL.
ens moguem amb facilitat.
Ja que el servidor OpenERP
pot instal·lar-se sobre
Windows i Linux cal Per altra banda, abans de planificar l’aprenentatge, és altament recomanable
decidir-se per un dels dos.
S’escull Windows per ser el
conèixer les possibilitats d’instal·lació que facilita el producte. Per aquest motiu,
sistema més conegut pels
usuaris.
cal fer una visita a la pàgina web oficial d’OpenERP (www.openerp.com) i
observar les diverses distribucions que facilita (a data d’agost del 2012), recollides
a la taula 2.1, taula 2.2 i taula 2.3.
Taul a 2. 1. Distribucions d’OpenERP disponibles l’agost del 2012 per OpenERP 6.1
Taul a 2. 2. Distribucions d’OpenERP disponibles l’agost del 2012 per OpenERP 6.0
Taul a 2. 3. Distribucions d’OpenERP disponibles l’agost del 2012 per OpenERP 5.0.14
Les distribucions All-In-One (tot en un) incorporen totes les peces imprescindibles
per poder instal·lar un servidor OpenERP, incloent, fins i tot, una versió de l’SGBD
PostgreSQL. Com que se suposa que no som experts en instal·lació i configuració
de l’SGBD PostgreSQL i ja que se’ns facilita la distribució All-In-One que inclou
la instal·lació d’una versió de PostgreSQL, la lògica ens diu que comencem per
instal·lar aquesta distribució en un sistema operatiu conegut (Windows).
Les distribucions All-In-One incorporen totes les peces necessàries per la ins-
tal·lació d’un servidor OpenERP i, en ocasions, també el client GTK. Però no
totes les distribucions All-In-One incorporen les mateixes peces.
dir, no permet la no instal·lació del client web i no facilita la instal·lació del client
GTK. Cal recordar que la versió 7.0 d’OpenERP elimina el client GTK.
La barra superior blava de la figura 2.1 ens dóna també una informació important.
Destaca que es tracta de la versió 6.0–subversió del 9 de març del 2012. Això
és important tenir-ho present, perquè OpenERP publica periòdicament una nova
versió de la versió vigent i al web d’OpenERP només es pot descarregar la darrera.
De fet, el procés de descàrrega facilita un arxiu amb nom openerp-allinone-setup-
6.1-latest.exe i només podrem saber de quina subversió es tracta quan comencem
la instal·lació.
iocioc. Aquesta informació és crítica i, per tant, cal tenir-la anotada en un lloc ben
segur.
Un cop fet això, se’ns permet indicar el directori d’instal·lació i procedim. Després
d’uns minuts, el procés finalitza. El propi procés, en la darrera pantalla, ens facilita
una casella de verificació anomenada Start OpenERP per començar a treballar amb
OpenERP immediatament, a través d’una connexió HTTP. Si manteniu l’opció
activada i finalitzeu el procés, veureu com s’obre el navegador que tingueu per
defecte i intenta connectar a la URL localhost:8069/web/webclient/ com mostra
la figura 2.4. Fixem-nos que el servidor web que instal·la OpenERP 6.1 escolta
pel port 8069. En canvi, el servidor OpenERP de la versió 6.0 escolta pel port
8080.
• Server, que conté tot el que fa referència al servidor OpenERP (client web
inclòs).
Sistemes de gestió empresarial 53 Sistemes ERP-CRM. Implantació
Des d’una altra màquina de la xarxa podem provar d’utilitzar qualsevol navegador
per treballar amb el client web d’OpenERP. Només caldrà canviar la paraula
localhost de la URL pel nom o adreça IP de la màquina on tenim el servidor
OpenERP instal·lat.
En aquests moments no tenim cap empresa creada i, per tant, no podem entrar
encara. El propi client GTK facilita l’opció de menú Fitxer | Base de dades per
gestionar empreses: crear-ne, eliminar-ne, fer-ne còpia de seguretat i restaurar-ne
des de còpia de seguretat, accions que també podrem executar des del client web.
Sistemes de gestió empresarial 55 Sistemes ERP-CRM. Implantació
Com que la base de dades es troba implementada en un SGBD concret, ens convé
conèixer les eines bàsiques de què disposem per moure’ns amb facilitat dins de
l’SGBD. La majoria d’SGBD actuals faciliten dos tipus d’eines per accedir a les
bases de dades i facilitar la gestió:
• Eines gràfiques web: permeten l’accés des de navegadors i, per tant, eviten
el fet d’haver d’instal·lar cap programari client.
Per accedir a PostgreSQL disposem de moltes eines. Entre elles, cal conèixer
l’existència de:
Si fem una ullada a l’arbre de programes del sistema operatiu Windows hi trobarem
la opció de menú anomenada PostgreSQL 8.3 que conté:
4. L’opció Stop service que permet aturar el servidor PostgreSQL sense haver
d’anar al panell de control de serveis del sistema operatiu.
5. L’opció Command Prompt que obre una consola de sistema i ens situa en
el directori on hi ha els programes executables de PostgreSQL, per si cal
utilitzar-ne algun, destinats habitualment als administradors de PostgreSQL.
L’eina pgAdmin és una de les eines més habituals d’utilitzar per accedir a un
servidor PostgreSQL (local o remot) i es pot instal·lar a qualsevol màquina.
La podem baixar de la pàgina oficial (www.pgadmin.org) i és tan habitual que
l’OpenERP la incorpora en la instal·lació del servidor PostgreSQL que facilita.
La figura 2.7, que correspon a l’eina pgAdmin que instal·la l’OpenERP, ens
permet observar que pgAdmin ja té registrat el servidor PostgreSQL instal·lat per
OpenERP a la màquina i el veiem acompanyat d’una creu vermella que indica que
no hi estem connectats. Per establir connexió i poder gestionar el seu contingut
cal situar-nos al damunt i prémer amb doble clic del ratolí. Apareixerà la finestra
de diàleg per establir connexió similar a la que mostra la figura 2.8.
Observem que la finestra de diàleg de la figura 2.8 ens indica que ens estem a
punt de connectar-nos amb l’usuari ioc que havíem indicat com a superusuari
del servidor PostgreSQL en el procés d’instal·lació. Si no s’havia canviat, us
proposarà l’usuari openpg.
Observem que en aquesta pàgina de propietats podrem canviar l’usuari per defecte
i també podrem enregistrar la contrasenya, una vegada connectats, per evitar haver
d’introduir-la cada vegada que accedim al servidor PostgreSQL.
S’ha d’anar amb molt de compte a l’hora de deixar les contrasenyes enregistrades;
això només s’hauria de fer en màquines de les quals tenim la seguretat que només
hi tindran accés usuaris que, a la vegada, hagin de tenir accés als servidors
PostgreSQL enregistrats en pgAdmin.
Contrasenyes
1 ...\users\nomUsuari\AppData\Roaming\postgresql
F igu r a 2. 1 0 . Pantalla de pgAdmin amb una connexió oberta amb una base de dades
Cal recordar que aquesta eina està destinada a tot tipus d’usuaris informàtics,
siguin o no administradors de bases de dades. Allò que bàsicament cal saber
d’aquests eina és:
1 begin;
2 <instruccions SQL−DML>
3 <finalització de la transacció amb commit o rollback>
Així, tant si utilitzen el client OpenERP web com el client GTK, aquests es
connecten amb el servidor OpenERP que resideix a la mateixa màquina que el
servidor PostgreSQL i, per tant, les connexions sempre s’efectuen en local, cosa
que vol dir que no cal tenir configurat el servidor PostgreSQL per tal que admeti
connexions remotes.
Sistemes de gestió empresarial 62 Sistemes ERP-CRM. Implantació
És molt possible, però, que vulguem accedir directament a les bases de dades del
servidor PostgreSQL des d’altres eines clients, com per exemple:
Per aconseguir-ho ens cal retocar alguns paràmetres de configuració del servidor
PostgreSQL i, per entendre la utilitat de cadascun, cal intentar la connexió remota,
veure els errors que es produeixen i anar aplicant les solucions que pertoquin
fins aconseguir la connectivitat. Ens cal, per tant, una aplicació instal·lada
remotament que vulgui connectar amb el servidor PostgreSQL. Podem utilitzar
l’eina pgAdmin instal·lada en una altra màquina de la xarxa (baixeu-la de la pàgina
Als annexos del web oficial www.pgadmin.org).
trobareu l’apartat
“Recursos de programari”
que inclou les versions La instal·lació de l’eina pgAdmin és molt simple. El paquet de distribució no
dels programes als quals
fem referència en aquests inclou tots els llenguatges però, una vegada instal·lat, es poden afegir seguint les
materials.
instruccions indicades a la pàgina web de pgAdmin.
Una vegada instal·lada l’eina pgAdmin en una màquina diferent de la que conté
l’SGBD, intentem la gestió del servidor PostgreSQL des d’aquest pgAdmin. El
primer que hem de fer és enregistrar un servidor a través de l’opció File | Add
Server. Ens apareix la pantalla de propietats de la connexió en la qual ens cal
introduir:
3. Port: ens proposa 5432 que és el port pel qual acostumen a escoltar els
servidors PostgreSQL.
Per aconseguir que el servidor PostgreSQL escolti per unes determinades adre-
ces IP cal retocar, en el fitxer de configuració postgresql.conf, el paràmetre
listen_addresses. Veurem que el paràmetre està configurat de la forma:
1 #listen_addresses = ’localhost’
2 # what IP address(es) to listen on;
3 # comma−separated list of addresses;
4 # (change requires restart)
Fixem-nos amb l’única línia no comentada, que permet l’accés a totes les bases
de dades de qualsevol usuari connectat a la pròpia màquina (127.0.0.1/32) i que
utilitza una contrasenya encriptada amb el mètode md5.
o equivalentment:
o equivalentment:
L’SGBD PostgreSQL facilita una consola textual (aplicació de nom psql) per
permetre efectuar un gran nombre d’operacions sobre el servidor. El servidor
PostgreSQL que instal·la l’OpenERP per a Windows no instal·la aquesta consola
ja que incorpora l’eina pgAdmin i considera que ja és suficient.
Suposant que hem instal·lat l’eina pgAdmin en una màquina qualsevol, podrem
comprovar el funcionament de la consola psql. Així doncs, ens situem en una
consola de sistema i ens situem a la subcarpeta on hem instal·lat l’eina pgAdmin.
Comprovem que hi resideix el programa psql.exe (en Linux s’anomenaria psql).
Intentem executar-lo sense cap paràmetre. Ens trobem l’error similar a:
L’eina psql admet molts paràmetres, que podem conèixer executant psql -h
o psql –-help. Per utilitzar aquesta eina per connectar-nos amb un servidor
PostgreSQL, ens cal utilitzar els paràmetres:
Sistemes de gestió empresarial 66 Sistemes ERP-CRM. Implantació
• -U, per indicar un usuari del servidor PostgreSQL (si no s’indica, agafa
l’usuari que té oberta la sessió en el sistema operatiu).
• -d, per indicar el nom de la base de dades a la qual ens volem connectar
(si no s’indica, intenta connectar amb una base de dades de nom igual al de
l’usuari indicat en el paràmetre -U).
Fixem-nos que:
• Informa que l’eina psql és de la versió 9.1.4 mentre que ens estem connec-
tant a un servidor PostgreSQL 8.3. Per tant, hi pot haver alguna funcionalitat
que no s’executi correctament.
• Informa que el codi de pàgina de la consola DOS (850) és diferent del codi
de pàgina de Windows (1252). Això provoca que caràcters especials com les
vocals accentuades, el símbol ç i similars, ben enregistrats a la base de dades,
no es vegin correctament a la consola DOS i que els caràcters especials
correctament introduïts des de la consola DOS quedin mal enregistrats a
la base de dades, de manera que quan els consultem des d’una eina com
pgAdmin, són erronis. La solució a aquest inconvenient consisteix, com
indica la documentació de psql per als usuaris de Windows, a canviar el codi
de pàgina de la consola DOS abans de posar en marxa la consola textual psql,
tot executant chcp 1252, i a canviar la font de la consola a Lucide Console.
• Informa que podem teclejar help per aconseguir ajuda. Si ho fem, veurem
que l’ordre \q permet abandonar la consola textual de PostgreSQL i tornar a
la consola del sistema operatiu; veurem també que l’ordre \h informa sobre
les ordres SQL que podem executar i que l’ordre \? informa sobre les ordres
pròpies de la consola psql.
L’execució de l’ordre \? dins la consola psql ens permet conèixer que l’ordre \dt
mostra totes les taules de la base de dades i que l’ordre \d, seguida d’un nom de
taula, permet obtenir la descripció detallada de l’estructura de la taula. Així, per
exemple, per conèixer les taules de la base de dades a la que estem connectats,
executem:
1 postgres=# \dt;
2 No relations found.
La resposta del servidor és que no es troba cap taula, ja que en aquest moment, la
base de dades postgres no en conté cap.
1 postgres=# \q
Quan s’utilitza la consola psql s’ha de tenir en compte que està configurada amb
el comportament autocommit on, és a dir, qualsevol operació de modificació
de dades sobre la base de dades és automàticament validada sense que l’usuari
hagi d’efectuar “commit” i, en conseqüència, no és possible invocar un rollback.
En cas de voler canviar aquest comportament, cal executar la instrucció de psql
següent, indicant la paraula AUTOCOMMIT en majúscules:
1 begin;
2 <instruccions SQL−DML>
3 <finalització de la transacció amb commit o rollback>
4. Indicar el port pel qual escoltarà el servidor PostgreSQL que estem ins-
tal·lant (normalment 5432 tot i que caldria indicar un altre port si ja hi
hagués algun servidor PostgreSQL instal·lat i escoltant per aquest port).
Una vegada instal·lat el servidor PostgreSQL haurem de configurar-lo per tal que
admeti connexions remotes i per això ens cal saber que els fitxers de configuració
postgresql.conf i pg_hba.conf que s’han de retocar resideixen en el directori on
s’ha instal·lat les dades del servidor PostgreSQL.
Una vegada disposem d’un servidor PostgreSQL instal·lat (versió 9.1.5), la ins-
tal·lació del servidor OpenERP a partir de la versió All-In-One 6.1-YYYYMMDD
és idèntica a la instal·lació completa amb l’única diferència que no marcarem
l’opció d’instal·lar el servidor PostgreSQL i que a la pantalla de configuració de la
connectivitat amb el servidor PostgreSQL hi indicarem les dades que pertoquin:
• Username: un usuari del servidor PostgreSQL amb el rol ‘pot crear bases
de dades’.
Una vegada tenim el nou usuari creat en el servidor PostgreSQL podem instal·lar
el servidor OpenERP. Quan finalitzem la instal·lació, haurem de fer els mateixos
retocs de configuració que vam efectuar en la instal·lació completa, en els fitxers
openerp-server.conf. Una vegada enregistrats els canvis que correspongui, cal
reiniciar el servidor OpenERP (en el panell de control dels serveis del sistema).
En el client web, des de la pantalla inicial, per l’opció Manage Databases, tal com
mostra la figura 2.13.
Sistemes de gestió empresarial 70 Sistemes ERP-CRM. Implantació
F igu ra 2 .1 3 . Pantalla inicial del client web d’OpenERP amb l’enllaç que
permet gestionar empreses
Des del client GTK, per l’opció Fitxer | Bases de dades, tal com mostra la figura
2.14.
Fig u ra 2. 14 . Pantalla inicial del client GTK d’OpenERP amb l’opció que permet
gestionar empreses
Per crear una nova empresa (base de dades, segons terminologia OpenERP), sigui
quin sigui el client d’OpenERP que utilitzem, haurem d’introduir:
Així doncs, seleccioneu l’idioma que cregueu oportú, assigneu la contrasenya per
l’usuari admin de la nova base de dades i procediu a executar la creació. El procés
pot durar uns minuts.
Una vegada finalitzat, si entrem a l’empresa des del client web amb l’usuari
admin ens apareix una pantalla com la de la figura 2.15, amb una única pestanya,
Configuració, i una llista dels mòduls que podem instal·lar a la pantalla.
Fi g ura 2.1 5 . Pantalla inicial des del client web quan es connecta amb una empresa
com a usuari admin
Sistemes de gestió empresarial 72 Sistemes ERP-CRM. Implantació
L’entrada des del client GTK sembla diferent però és totalment equivalent, ja que
ens mostra el contingut del menú Configuració idèntic al que veiem des del client
web si escollim la pestanya Configuració. La figura 2.16 ens mostra la pantalla
del client GTK.
Fig u ra 2 . 16 . Pantalla inicial des del client GTK quan ens connectem amb una empresa
com a usuari admin
Observem que tant en el client web com en el client GTK hi ha una zona de
dreceres per contenir les opcions més habituals i, en aquest moment, únicament
hi ha l’opció Clients. Si la seleccionem des de qualsevol dels dos clients veurem
que la nostra empresa ja té un seguit de socis de negocis introduïts (OpenERP els
anomena Clients). La figura 2.17 ens mostra la visualització dels clients des del
client GTK.
F igu r a 2 . 17 . Visualització dels clients que carrega OpenERP en crear una empresa, si així se li indica
Sistemes de gestió empresarial 73 Sistemes ERP-CRM. Implantació
Si tanquem la connexió (des del client web amb l’enllaç Logout de la part superior
dreta de la pantalla o bé amb el client GTK des de l’opció de menú Fitxer |
Desconnecta) i procedim a entrar com a usuari demo amb contrasenya demo,
veurem que la connexió s’estableix però que no hi ha cap opció de menú ni drecera
disponible.
Situant-nos damunt una taula i prement el botó secundari del ratolí podem executar
diverses accions: crear noves taules, eliminar la taula, veure el contingut de la
taula, etc.
Sistemes de gestió empresarial 74 Sistemes ERP-CRM. Implantació
1. Des del client web, executant l’opció Manage Databases de la pàgina inicial.
Per poder eliminar una base de dades d’un servidor OpenERP haurem d’indicar
la contrasenya del superadministrador del servidor OpenERP (admin, si no s’ha
canviat) i no hi pot haver cap connexió oberta contra la base de dades (si hi fos,
l’eliminació no es duria a terme).
La figura 2.19 mostra les opcions possibles en una empresa acabada de crear. Hi
veiem l’opció de menú Configuració que conté diverses opcions de configuració
(Mòduls, Configuració, Companyies, Usuaris, Traduccions, Garantia) i la drecera
Clients. Fixem-nos que la majoria d’opcions són en català, però hi trobem algunes
paraules en anglès (Sequences&Identifiers...). OpenERP es desenvolupa en anglès
i permet incorporar traduccions a diferents idiomes, però en ocasions aquestes
traduccions no són completes o no evolucionen tant ràpidament com evoluciona
l’ERP i quan una opció de l’aplicació no té definida la traducció en l’idioma actiu,
OpenERP en mostra la versió anglesa.
Arribats aquí, per poder utilitzar significativament l’OpenERP ens cal saber:
• Com configurar les dades bàsiques d’una empresa (companyies, nom, logo,
etc).
L’execució d’aquesta opció facilita una pantalla com la de la figura 2.20, que
conté el desplegable idioma que ens permet escollir un dels idiomes que incorpora
OpenERP.
per:
El procés de creació d’una empresa no demana cap dada de l’empresa i, per tant,
pertoca fer a posteriori el procés de configuració. Aquest procés es pot dur a terme
a través de qualsevol dels clients OpenERP, establint connexió amb l’usuari admin
i navegant fins l’opció Configuració | Companyies | Companyies.
OpenERP permet que una empresa estigui estructurada en moltes companyies, fet
que s’anomena gestió multicompanyia.
La gestió multicompanyia es troba en empreses grans (hi pot haver PIMES amb
gran implantació en les quals aquesta situació també sigui normal). OpenERP no
limita l’estructura multicompanyia a dos nivells, sinó que permet més nivells.
• Quan es gestionin els tercers (Clients d’OpenERP), cal assignar cada soci
(client o proveïdor) a la companyia que correspongui. S’ha de tenir clar que
l’assignació d’un tercer a una companyia implica l’accés des de qualsevol
companyia filla a la companyia a la qual està assignat.
Si un tercer l’assignem a X-Esp-Catalunya, podrà ser gestionat pels usuaris amb accés a
les companyies X, X-Espanya i X-Esp-Catalunya, però en canvi no podrà ser gestionat pels
usuaris que només tinguin accés a X-França o X-Bèlgica o X-Esp-Euskadi.
Cada companyia pot tenir el seu propi pla comptable i es pot, si es desitja, vincular
a un tercer pla comptable per tal d’efectuar una consolidació de les diverses
companyies.
OpenERP permet establir valors per defecte en camps de formularis diferents per a
cada companyia, de manera que quan un usuari utilitza el formulari, els valors que
se li presenten són els que corresponen a la companyia amb la qual està treballant
l’usuari.
Cal tenir clar, però, que cada companyia (inclosa la companyia mare) ha de ser
convenientment configurada. La figura 2.24 mostra la vista del formulari de la
companyia mare (inicialment anomenada Your company) una vegada configurada
amb les dades de l’IOC.
Sistemes de gestió empresarial 80 Sistemes ERP-CRM. Implantació
A banda de les dades que mostra la figura 2.24, cal tenir en compte:
• El botó Set Bank Accounts que ens remet a un formulari on podem donar
d’alta els comptes bancaris de la nostra companyia.
Fixem-nos que el camp Província està buit. Si premem la lupa que l’acompanya,
podrem constatar que la nostra empresa no conté les províncies de l’estat espanyol
de la mateixa manera que tampoc conté moltes de les dades necessàries per
a la gestió d’una empresa espanyola. Podem anar incorporant les dades a
mesura que les necessitem, però no és una pràctica aconsellable. Els grups de
treball d’OpenERP dels diversos països han desenvolupat mòduls de localització
específics de cada país que incorporen la majoria de dades específiques bàsiques
per a la gestió d’empreses. Per tant, ens caldrà instal·lar el mòdul de localització
espanyola. De moment, però, deixem el camp província en blanc.
El botó Preview Header ens permet generar un informe que mostra com es visualit-
zarà la informació introduïda en els diversos documents que generi OpenERP. Si
l’executeu podreu observar que la capçalera (figura 2.25) i el peu (figura 2.26)
mostren la informació introduïda en el formulari acompanyada d’uns títols en
llengua anglesa que no han estat traduïts a l’idioma actiu (català). Un usuari
que tingui activada la casella Usability | Extended view de la pestanya Permisos
d’accés de la seva fitxa (figura 2.30), té accés a modificar la plantilla (capçalera i
peu) dels informes.
Sistemes de gestió empresarial 81 Sistemes ERP-CRM. Implantació
Suposem que pel tipus de negoci de la nostra organització és força comú que
una mateixa persona pugui ser contacte de diversos socis de negocis. En aquesta
situació, hauríem de donar d’alta la mateixa persona com a contacte en diferents
socis i no tindríem manera de, donada una persona d’alta, introduir les seves dades
personals (úniques) i les seves dades professionals (diferents per a cada soci de
negoci).
F igu r a 2. 27 . Formulari Clients en el seu estat inicial, en el qual cada contacte només pot tenir una
adreça
Suposem que el Sr. Pepe Gotera és un assessor d’empreses i presta els seus serveis
d’assessoria a l’empresa Agrolait i a l’empresa Axelor. Suposem que disposem de dades
personals del Sr. Pepe Gotera (foto, telèfon, mòbil) i que també disposem de dades
específiques quan actua com a assessor de cada empresa. OpenERP en el seu estat
inicial no ens permet introduir les dades personals del Sr. Pepe Gotera, hauríem de donar
d’alta el Sr. Pepe Gotera de cada una de les dues empreses i no tindríem manera de saber
que el mateix Sr. Pepe Gotera és contacte de diversos socis de negocis. La instal·lació del
mòdul base_contact ens solucionarà el problema.
Recordeu que en entrar amb el client web, OpenERP ens mostra una pantalla
inicial amb una llista de mòduls a instal·lar. Fixeu-vos que aquella llista conté
19 mòduls, que es corresponen amb els mòduls Apps de la llista de mòduls
instal·lables.
Fig u ra 2. 28 . Llista de mòduls Apps oficials d’OpenERP 6.1
OpenERP classifica els mòduls oficials (203 en la versió 6.1) entre Apps, corres-
ponents a mòduls que per si sols es poden considerar com a aplicacions (gestió de
vendes, gestió de compres, CRM, MRP, recursos humans...) i Extra, corresponents
a mòduls que afegeixen funcionalitats extres.
1. Amb vista de llista cal utilitzar el botó Install que hi ha a la columna de més
Sistemes de gestió empresarial 84 Sistemes ERP-CRM. Implantació
a la dreta.
La vista formulari ens facilita informació que pot ser del nostre interès:
Si premem el botó Install per al nostre mòdul ens apareix la pantalla de la figura
2.29, que ens informa de tots els mòduls que s’instal·laran o actualitzaran. Hi
veiem el mòdul que volem instal·lar (base_contact), el mòdul depenent process
i d’altres mòduls que alguna dependència deuen tenir però que no ens ha estat
informada en el mòdul base_contact ni en el mòdul process. La pantalla ens
informa que l’actualització pot trigar alguns minuts i ens facilita dos botons:
Una vegada cancel·lada l’actualització, tots els mòduls que havien estat selec-
cionats per ser instal·lat o actualitzats continuen en estat de ser instal·lats o
actualitzats, fet que es pot observar a la columna Estat de la llista de mòduls.
Per tal que l’usuari admin pugui engegar el procés d’actualització de mòduls quan
ho cregui convenient, ha de tenir activada la casella Usability | Extended view
de la pestanya Permisos d’accés de la seva fitxa (figura 2.30), accessible des de
Configuració | Usuaris | Usuaris.
Fi gura 2.3 0 . Casella de la fitxa d’usuari per permetre la visió d’opcions de menú no
visibles normalment
2.29, que inclou totes les instal·lacions i/o actualitzacions pendents d’executar i
que podem posar en marxa prement el botó Actualitza. El premem i esperem a la
finalització.
• Els contactes previs en cada soci de negoci ja no són actualitzables des del
formulari dels socis de negocis i són accessibles per la nova opció Contactes.
Per introduir el Sr. Pepe Gotera com a assessor per les empreses Agrolait i Axelor, donarem
d’alta el contacte utilitzant el formulari mestre-detall de la nova opció Contactes. A la
zona de detall donem d’alta les dues empreses de les quals és assessor amb les dades
professionals de contacte corresponents, tal com mostra la figura 2.32.
Podem comprovar que la informació introduïda pel formulari mestre detall de la opció
Contactes que facilita el mòdul base_contact, és accessible des del formulari de gestió
dels socis de negocis. En efecte, si consultem els clients Agrolait i Axelor hi veurem el Sr.
Pepe Gotera com a assessor.
Una vegada conegut el procés a seguir per instal·lar els mòduls, si suposem que la
nostra organització compra i ven i necessita portar la comptabilitat, sembla lògic
procedir a instal·lar els mòduls oficials següents:
Sistemes de gestió empresarial 87 Sistemes ERP-CRM. Implantació
Fixeu-vos que tots aquests mòduls són dels considerats Apps per OpenERP. Podeu,
si ho desitgeu, instal·lar la resta de mòduls Apps facilitats per OpenERP.
Des del desplegable per seleccionar el tipus d’IVA tenim la possibilitat, si tenim
coneixements clars de comptabilitat, de definir tota la informació necessària per
donar resposta als requeriments impositius que entren en vigor l’1 de setembre del
2012. Però en cas de no tenir els coneixements de comptabilitat necessaris i de no
disposar d’un consultor, cal confiar que en les properes versions d’OpenERP ja hi
haurà els nous tipus impositius.
En el moment actual disposem d’una versió actualitzada del mòdul Spanish Charts
of Accounts i, per tant, l’opció 3 és la més còmoda. Avortem, el procés de
Sistemes de gestió empresarial 90 Sistemes ERP-CRM. Implantació
Si fem una ullada a la llista de mòduls instal·lats (sigui Apps o Extra), hi trobarem
el mòdul Spanish Charts of Accounts (PCGE 2008), sota el nom l10n_es. En
OpenERP, tots els mòduls de localització tenen el prefix l10n_seguit de les sigles
del país i, si cal, un sufix per distingir diversos mòduls de localització d’un mateix
país. Si mirem la llista de mòduls no instal·lats, veurem una llarga llista de mòduls
Cerqueu amb el prefix l10n_.
Internacionalització i
Localització a la
Viquipèdia per conèixer el Com podem aconseguir una versió actualitzada d’un mòdul? Hi ha dos camins:
significat dels prefixos
numerònims l10n_ i i18n_.
F igu r a 2 . 3 5. Contingut del mòdul l10n_es en la pàgina de complements d’OpenERP a finals d’agost
del 2012
• 1 versió del mòdul per la versió 6.1 d’OpenERP, amb data de 23-08-2012
(actual) ubicada en el repositori “lp:openerp-spain/6.1” (branca 6.1 del
projecte ubicat a https://launchpad.net/openerp-spain)
Sistemes de gestió empresarial 91 Sistemes ERP-CRM. Implantació
En el cas que ens ocupa, després d’actualitzar el mòdul l10n_es, ens interessa
tornar a engegar el procés de configuració de l’aplicació de comptabilitat, fet que
aconseguim via l’opció Comptabilitat | Configuració | Comptabilitat financera
| Configuració financera per una nova companyia (cal tenir instal·lat el mòdul
Accounting and Finance). El procés torna a començar amb la pantalla de la figura
2.33, que emplenem convenientment i continua amb la pantalla de la figura 2.34,
on ja podem assignar els tipus impositius del 21% com a valors per defecte per les
vendes i les compres, si aquest és el cas. Continuem amb el procés i la configuració
de l’aplicació comptable finalitza.
• Les dades han estat obtingudes de les dades públiques de l’Institut Nacional
d’Estadística (INE).
l’empresa. L’administrador té tots els privilegis sobre l’empresa i pot crear usuaris,
grups de privilegis sobre els objectes de l’empresa (tercers, productes, comandes,
albarans, factures...) i assignar usuaris als diversos grups de privilegis.
Obriu sessió en una empresa amb dades de demostració i amb el mòdul Recursos
Humans (hr) instal·lat. Aneu a Configuració|Usuaris|Usuaris. Observeu que a
més de l’usuari Administrador i l’usuari Demo User, hi ha una sèrie d’usuaris.
Consulteu-ne qualsevol d’ells. Veureu que la seva fitxa conté una capçalera amb
el seu nom real, el nom d’usuari per establir connexió i un espai per assignar-li
una nova contrasenya i tres pestanyes (Usuari, Permisos d’accés i Companyies
permeses) com mostra la figura 2.37.
La pestanya Usuaris conté camps per introduir informació diversa, com l’idioma,
la zona horària, la companyia de treball per defecte, el departament, l’acció inicial
que s’ha d’executar quan l’usuari obre sessió en OpenERP i el correu electrònic.
La pestanya Permisos d’accés, visible a la figura 2.37, conté tres apartats: Ap-
plication, Usability i Altre. L’apartat Usability conté un conjunt de caselles de
verificació per facilitar a l’usuari diverses funcionalitats. L’apartat Application
mostra, per cadascun dels mòduls app d’OpenERP instal·lats a l’empresa, un
apartat amb una llista desplegable amb diverses possibilitats, específiques de cada
Sistemes de gestió empresarial 95 Sistemes ERP-CRM. Implantació
app. Així, la figura 2.37 mostra les aplicacions Sales Management, Project Mana-
gement, Warehouse Management, Accounting & Finance, Purchase Management,
Human Resources i Administració, que corresponen a sis mòduls app instal·lats
més l’apartat Administració (Configuració) per administrar l’OpenERP. Cadascun
d’aquests apartats conté uns determinats conjunts de permisos, anomenats grups
de privilegis, dels quals n’haurem d’assignar algun a l’usuari que hagi de poder
utilitzar el mòdul.
La definició de l’entorn de seguretat es pot consultar i/o modificar i/o ampliar per
l’opció Configuració|Usuaris|Grups, que facilita la llista de totes les aplicacions
amb els seus grups de privilegis, com mostra la figura 2.38. La nomenclatura
utilitzada (Applicació|Grup de privilegis) permet distingir, amb rapidesa, els
diversos grups de privilegis de cada aplicació.
• Els grups de privilegis que s’hereten en cas de tenir assignat el grup actual.
• Menús als quals dóna accés el fet de tenir assignat el grup actual.
Sistemes de gestió empresarial 96 Sistemes ERP-CRM. Implantació
Ubuntu 12.04 LTS (Long Term Suport) tot i que la instal·lació dels paquets
subministrats per la distribució de Linux Ubuntu 12.04 LTS pot ser lleugerament
diferent a la que efectuarem aquí, basada en el paquet per a Ubuntu subministrat
per OpenERP (versió 6.1-YYYYMMDD).
El paquet subministrat per OpenERP, tot i portar el sufix _all, conté únicament
Sistemes de gestió empresarial 98 Sistemes ERP-CRM. Implantació
1 root@Ubuntu:/etc/init.d# ./openerp
2 Usage: openerp−server {start|stop|restart|force−reload}
1 /usr/bin/python /usr/bin/openerp−server
2 −−config=/etc/openerp/openerp−server.conf
3 −−logfile=/var/log/openerp−server.log
Podem assegurar-nos que s’ha aturat comprovant que ja no hi ha cap procés que
contingui el nom openerp engegat.
Modifiqueu els paràmetres per connectar amb qualsevol dels servidors Post-
greSQL que tingueu instal·lats (siguin en sistema Linux o en sistema Windows).
Recordeu que l’usuari que utilitza OpenERP per connectar amb PostgreSQL ha
de tenir el rol Pot crear bases de dades.
Recordem que l’ordre ps aux | grep openerp ens permet veure si tenim algun
procés engegat que contingui el nom openerp. És recomanable també fer una
ullada al fitxer log on queda constància de si l’engegada és correcta o detecta algun
problema. Cal tenir present que el servei pot quedar engegat però amb errors que
no permetin la utilització d’OpenERP.
Pel que fa al client GTK per a Linux cal tenir en compte que:
OpenERP facilita al web de descàrrega el codi font per al servidor OpenERP i per
al client GTK. Veurem, a continuació, com procedir per aconseguir la instal·lació,
a Ubuntu 12.04 LTS, d’un servidor OpenERP 6.1 i d’un client GTK.
Als annexos del web
trobareu l’apartat
“Recursos de programari”
que inclou una versió dels
codis font del servidor Instal·lació del servidor OpenERP
OpenERP 6.1 i del client
GTK, per ser instal·lats en
qualsevol sistema
operatiu. Per instal·lar un servidor OpenERP a partir dels codis font descarregats del web
de descàrrega d’OpenERP (fitxer de nom similar a openerp-6.1-YYYYMMDD-
RELEASE.tar.gz) seguim el següent procés:
Modifiqueu els paràmetres per connectar amb qualsevol dels servidors Post-
greSQL que tingueu instal·lats (siguin en sistema Linux o en sistema Windows).
Sistemes de gestió empresarial 101 Sistemes ERP-CRM. Implantació
Recordeu que l’usuari que utilitza OpenERP per a connectar amb PostgreSQL ha
de tenir el rol Pot crear bases de dades.
1 ./openerp−server −c ./install/openerp−server.conf
En aquest cas apareixen les mateixes línies informatives i sembla que el procés
quedi esperant, però prement return apareix pareix el prompt del sistema.
5. Comprovem la connexió amb els clients web i GTK (des del SO Windows).
Edició de guions
Per entorns de producció és aconsellable disposar d’un guió que permeti engegar, L’edició de guions per gestionar
aturar i reiniciar el servidor OpenERP amb comoditat, guió que ha de residir dins els serveis i la instal·lació
d’aquests guions de manera que
/etc/init.d. l’engegada i aturada dels serveis
sigui automàtica és tasca dels
administradors del sistema
operatiu.
Sistemes de gestió empresarial 102 Sistemes ERP-CRM. Implantació
Per instal·lar un client GTK a partir dels codis font descarregats del web de des-
càrrega d’OpenERP (fitxer de nom similar a openerp-client-6.1-YYYYMMDD-
RELEASE.tar.gz), seguim el següent procés:
Índex
Introducció 5
Resultats d’aprenentatge 7
Introducció
Per aquest motiu, per a tots els ERP es necessiten professionals programadors que
siguin capaços d’adequar-los a les necessitats de l’organització. Com que hi ha
un gran ventall d’ERP-CRM i és impossible abastar les tecnologies que cadascun
d’ells utilitza, hem hagut de decidir-nos per un, per dur a la pràctica allò que cal fer
en qualsevol posada en explotació d’un ERP-CRM. El producte escollit ha estat
l’ERP-CRM de codi obert OpenERP, en la seva versió 6.1.
Amb tot això no es pot dir que ja s’és expert en OpenERP, ni molt menys. S’està
en disposició de dissenyar mòduls adaptables a un OpenERP estàndard, però
manquen altres funcionalitats facilitades per OpenObject: herència —utilitzada
per a l’adaptació de mòduls existents—, seguretat, càrrega massiva de dades,
desenvolupament d’assistents, generació de traduccions idiomàtiques, disseny
d’informes, disseny de quadres de comandament i altres.
• El llenguatge Python.
Per tal d’assolir un bon aprenentatge cal estudiar els continguts en l’ordre indicat,
sense saltar-se cap apartat. Quan es fa referència a algun annex del web, cal
adreçar-s’hi i estudiar-lo. Una vegada estudiats els continguts del material paper i
del material web, s’han de desenvolupar les activitats web.
Sistemes de gestió empresarial 7 Sistemes ERP-CRM. Explotació i adequació - I
Resultats d’aprenentatge
• Dissenyadors d’informes.
Tal com es pot observar, són molts els components d’OpenObject a conèixer
per poder adequar l’OpenERP a les necessitats de l’organització, en cas que les
funcionalitats que aporta l’OpenERP, tot i ser moltes, no siguin suficients.
Sistemes de gestió empresarial 10 Sistemes ERP-CRM. Explotació i adequació - I
• Conèixer la relació existent entre els seus elements (taules i columnes) i els
elements que observem en qualsevol dels formularis i informes d’OpenERP.
Una vegada coneguda l’estructura d’una base de dades d’OpenERP, ens podem
endinsar en el disseny del model en OpenERP i ho fem en dues fases:
El fet de que l’empresa canviï el seu funcionament per adaptar-se a l’ERP, tot
i semblar molt brusc, és una solució que s’adopta en moltes ocasions, sobretot
quan els consultors són capaços de demostrar als responsables de l’organització
que el nou funcionament té clars avantatges respecte als mètodes emprats en aquell
moment per l’empresa. Cal tenir en compte que, en ocasions, l’empresa pot haver
establert els seus funcionaments –en temps passats– coaccionada per les possi-
bilitats del sistema informàtic vigent en aquell moment, i aquests funcionaments
han esdevingut, amb el pas del temps, maneres de fer fonamentals i intocables en
l’organització. En aquestes ocasions, la mà esquerra dels consultors i implantadors
és fonamental per dur a terme la implantació de l’ERP amb èxit.
Tot i això, no sempre es pot adequar els mètodes de l’empresa a les funcionalitats
facilitades per l’ERP i, en conseqüència, cal adequar l’ERP, fet que pot comportar
Sistemes de gestió empresarial 11 Sistemes ERP-CRM. Explotació i adequació - I
Cal tenir en compte, també, que en ocasions pot ser convenient accedir a les
dades en mode consulta per a extreure’n informació. En aquests casos, tenint
coneixement de l’estructura de la base de dades, l’accés directe a la base de
dades pot ser adequat, amb la precaució que l’estructura pot canviar en futures
actualitzacions de l’ERP.
Si la necessitat dels informes és periòdica, és lògic desenvolupar-los amb les eines que
faciliti l’ERP, utilitzant les seves regles de negoci, i incorporant-los com a noves opcions de
menú dins l’ERP. En aquest cas, davant una actualització de l’ERP, és molt possible que
Sistemes de gestió empresarial 12 Sistemes ERP-CRM. Explotació i adequació - I
les regles de negoci evocades continuïn existint (malgrat que hagi canviat l’estructura de la
base de dades) i, en conseqüència, el nostre informe continuï funcionant.
• Cal conèixer les eines recomanades pel fabricant de l’ERP per al desenvo-
lupament i/o retoc de mòduls de l’ERP, fet que pot anar acompanyat del
coneixement de llenguatges de programació.
1.2 La BD d’OpenERP
Als annexos del web En conseqüència, l’OpenERP no facilita cap disseny entitat-relació sobre la base
trobareu l’apartat “Eines
per ajudar-nos a conèixer de dades d’una empresa ni tampoc cap diagrama del model relacional. No obstant
la BD d’OpenERP”. Amb
aquestes eines podreu això, si ens interessa disposar d’un model relacional, es troben moltes eines que
obtenir diagrames parcials
relacionals de la base de ens el poden construir a partir de la base de dades implementada en el SGBD
dades d’OpenERP.
PostgreSQL.
Sistemes de gestió empresarial 13 Sistemes ERP-CRM. Explotació i adequació - I
• Els noms dels atributs d’una classe Python sempre són en minúscula
(s’utilitza el guió baix per fer llegible els mots compostos). Cada dada
membre d’una classe Python d’OpenERP que sigui persistent (una classe
pot tenir dades membres calculades no persistents) és mapat com un atribut
en la corresponent taula de PostgreSQL amb el mateix nom.
La classe Python sale.order d’OpenERP està pensada per descriure la capçalera de les
comandes de venda i la corresponent taula a PostgreSQL és sale_order.
La classe Python sale.order.line d’OpenERP està pensada per descriure les línies de
les comandes de venda i la corresponent taula a PostgreSQL és sale_order_line.
• En el client GTK cal activar l’opció Ajuda | Activa les ajudes del mode de
depuració.
• En el client web de la versió 6.0 no calia activar res i sempre que l’usuari
situava el punter del ratolí damunt les etiquetes del camp, apareixia la
Sistemes de gestió empresarial 14 Sistemes ERP-CRM. Explotació i adequació - I
informació d’ajuda, fet que era de gran ajuda per als desenvolupadors però
que confonia als usuaris finals. Per això, la versió 6.1 del client web és
similar al client GTK i cal activar la funcionalitat amb l’opció Activar mode
de desenvolupador de la pantalla de diàleg que apareix en prémer el botó
Quant a de la part superior dreta del client web.
La figura 1.1 mostra la informació que facilita el client GTK en posar el ratolí sobre
l’etiqueta de dos camps del formulari Comandes de Venda. Podem observar-hi
que:
• Per l’etiqueta Data obtenim que es tracta del camp data_order de l’objecte
sale.order i, per tant, si necessitem efectuar una consulta sobre la base de
dades accedint a la data de la comanda, sabem que haurem d’anar al camp
data_order de la taula sale_order de la base de dades de PostgreSQL.
• Per l’etiqueta Tenda tenim molta més informació ja que es tracta del camp
relacional shop_id de l’objecte sale.order que fa referència a la relació
sale.shop. Amb aquesta informació, si necessitem efectuar una consulta
a la base de dades per accedir a la descripció de la botiga corresponent
a la comanda sabem que haurem d’anar al camp shop_id de la taula
sale_order i a través d’aquest camp, establir un join amb la clau primària
de la taula sale_shop.
F igu r a 1 . 1 . Ajuda del mode de depuració que facilita el client GTK en situar el ratolí damunt les etiquetes
dels camps en un formulari
La figura 1.2 mostra com, per defecte, l’opció del desplegable que apareix en tenir
el mode desenvolupador activat és Debug View #... amb un valor al costat del
símbol coixinet que correspon al número identificador de la vista activa. La resta
d’opcions són:
• View Fields que permet obtenir una llista dels camps de la vista actual, amb
els paràmetres corresponents.
• Fields View Get que mostra l’XML generat per la vista actual. Cal tenir en
compte que si la vista s’ha generat a partir de diverses vistes XML heretant
les unes de les altres, aquí se’n mostra el resultat final.
• Manage Views que mostra un llistat de les vistes relacionades amb la vista
actual. Des d’aquest punt es poden crear noves vistes, eliminar-les o editar-
les, encara que és recomanable utilitzar aquesta funcionalitat només per
consultar. Es recomana realitzar les modificacions creant nous mòduls, per
no perdre les modificacions davant actualitzacions de l’ERP.
• Edit TreeView, Edit SearchView, Edit Action i Edit Workflow que serveixen
per accedir a l’edició de les vistes relacionades amb la vista actual.
Les empreses acostumen a tenir, entre els seus responsables, usuaris finals que
poden efectuar consultes no previstes a la base de dades i que, per aconseguir-
Sistemes de gestió empresarial 16 Sistemes ERP-CRM. Explotació i adequació - I
ho, poden utilitzar eines gràfiques per elaborar consultes o, fins i tot, si són prou
espavilats, executar consultes SQL des d’una consola d’accés.
L’accés a la base de dades per part d’usuaris finals ha de ser de només lectura.
En aquesta situació, cal facilitar als usuaris que calgui, un usuari per accedir a
l’SGBD PostgreSQL amb els privilegis d’accés, en mode consulta, als objectes
de la base de dades que correspongui. S’aconsella seguir dos passos:
Per tal de crear els usuaris d’SGBD utilitzem una eina d’administració de Post-
greSQL (pgAdmin o la pròpia consola textual psql si ens hi movem amb soltesa).
Hem de connectar-nos al SGBD PostgreSQL amb un usuari amb privilegi de
creació d’usuaris (rol CREATEROLE) de l’SGBD. Amb aquestes dues coses, podem
crear els usuaris d’SGBD amb les contrasenyes que corresponguin.
La figura 1.3 mostra la pantalla que facilita pgAdmin per crear un nou usuari (botó
secundari del ratolí damunt del node Login Roles de l’Object Browser i seleccionar
l’opció New Login Role).
L’eina pgAdmin no mostra, per enlloc, els conceptes usuari i grups d’usuaris i en canvi
mostra els termes Login Role i Group Role. Si fem una ullada a la documentació del
llenguatge SQL de PostgreSQL veiem l’existència de les instruccions create user (per a
la creació d’usuaris) i create group (per a la creació de grups d’usuaris).
PostgreSQL utilitzava els conceptes usuaris i grups d’usuaris en versions anteriors a la 8.1,
versió en la qual va substituir aquests conceptes pel concepte de rol amb dues variants (rol
que pot iniciar sessió, Login Role, i rol que no pot iniciar sessió Group Role) i va introduir la
nova instrucció SQL create role. Per mantenir la compatibilitat amb el joc d’instruccions
SQL de les versions anteriors a la 8.1 va mantenir l’existència de les instruccions create
user i create group, de manera que create user equival a la creació d’un Login Role i
create group equival a la creació d’un Group Role.
L’eina pgAdmin (la versió 1.8.4 de 8 de juny de 2008 instal·lada per OpenERP 6.1
i la versió 1.14.3 de 1 de juny del 2012) té certes limitacions a l’hora d’assignar
privilegis, ja que no permet l’assignació a Login Role i, en conseqüència, si
utilitzem aquesta versió ens veiem obligats a crear un Group Role al qual assignem
els Login Role i concedim privilegis als Group Role. Un altre funcionament
una mica defectuós en aquestes versions de pgAdmin es troba en el fet que una
vegada creat un Group Role cal situar-se damunt el node de definició del servidor
i refrescar les dades, per tal que els objectes de les diverses bases de dades del
servidor puguin concedir privilegis al nou Group Role.
La figura 1.4 mostra la limitació de pgAdmin per concedir privilegis als Login
Role. Podem observar-hi la concessió de privilegis a nivell de la base de dades
Empresa_IOC i veiem que hi ha dos Login Role creats (ioc i pgotera) i, en canvi,
en el desplegable Role de la pestanya Privileges de la base de dades Empresa_IOC
només apareix el rol public (que es refereix a tothom). Si tinguéssim Group Role
definits, aquests sí que hi apareixerien.
Per tant, si volem assignar privilegis directament a un usuari (Login Role) haurem
És altament recomanable d’utilitzar la instrucció SQL grant des de la consola textual psql.
fer una ullada a la part de
la documentació de
PostgreSQL referent a Una manera ràpida de veure, des de pgAdmin, els privilegis concedits a un objecte,
l’assignació de privilegis.
La documentació de és situar-nos damunt de l’objecte i veure, a la part dreta de la pantalla, el contingut
PostgreSQL es troba a
www.postgresql.org/docs i
de la propietat ACL (Access Control List), tal com mostra la figura 1.5.
per nosaltres té interès fer
una ullada als capítols 20
(Database Roles) i 5.6 La figura 1.5 mostra el contingut de la llista ACL sobre la base de dades
(Privileges), així com a les
ordres SQL grant, revoke
Empresa_IOC. Podem situar-nos damunt de qualsevol objecte de la base de dades
i create role. (esquema, taula, vista, columna...) i tindrem accés a la llista ACL dels privilegis
concedits sobre aquell objecte.
• La base de dades es crea amb ACL no definida, fet que permet que qualsevol
usuari del servidor PostgreSQL pugui obrir sessió en aquella base de dades.
• PostgreSQL facilita el rol public que engloba a tots els usuaris de forma
automàtica.
Un usuari qualsevol, pel fet de pertànyer al rol public, té accés UC sobre l’esquema
public de qualsevol base de dades. Això implica que pot veure la relació (noms)
de tots els objectes existents a l’esquema (taules, vistes...), veure la descripció de
qualsevol objecte (taules, vistes...) i crear nous objectes dins l’esquema, però no
Sistemes de gestió empresarial 20 Sistemes ERP-CRM. Explotació i adequació - I
pot accedir als continguts de les taules ni vistes, a no ser que el propietari d’aquests
objectes li concedixi accés.
Suposem que tenim l’usuari pgotera acabat de crear; per tant, encara no se li ha concedit
cap privilegi. Suposem també que hem eliminat l’accés public a l’esquema public.
Mirem la seqüència d’instruccions SQL, des de la consola psql, per aconseguir que l’usuari
pgotera pugui veure, per les comandes de venda, el número, la data de la comanda i el
nom de la botiga que ha efectuat cada comanda. Suposem que es tracta d’un servidor
PostgreSQL 9.1 resident a la màquina d’IP 10.200.190.207, que ioc és un superusuari i
que la base de dades s’anomena Empresa_IOC.
Ja hem establert connexió amb l’usuari ioc. Per donar permís de connexió a l’usuari pgotera
cal fer:
Per donar permisos d’utilització de l’esquema public a l’usuari pgotera (això és necessari
ja que s’ha eliminat l’accés public a l’esquema public):
Per donar permís de lectura a les columnes id (número de comanda), date_order (data
de comanda) i shop_id (identificador de la botiga que ha efectuat la comanda), de la taula
sale_order (comandes), a l’usuari pgotera:
S’ha decidit donar únicament accés a les tres columnes per fer notar que en ocasions pot
ser necessari donar permís a nivell de columnes perquè hi pot haver altres columnes amb
informació confidencial a les quals no ha de tenir accés l’usuari pgotera. Recordem que
això només és possible a partir de la versió 8.4 de PostgreSQL i, per tant, en versions
anteriors ens veuríem obligats a donar permís d’accés a tota la taula sale_order.
1 =# \q
2
3 C:\...>
Cal anar amb compte amb la definició de vistes dins l’esquema public, ja que cohabitaran
amb vistes de mòduls de l’OpenERP. En cas de fer-ho és altament recomanable utilitzar
una nomenclatura que ens permeti identificar les vistes afegides que no formen part
de l’OpenERP; així, a l’exemple, fixem-nos que hem utilitzat el prefix ioc_ per a la
vista creada. També és possible crear esquemes diferenciats de l’esquema public que
utilitza PostgreSQL i crear-hi les vistes necessàries, però això ja són conceptes avançats
d’administració de PostgreSQL que no tractarem ara.
En moltes ocasions serà precís configurar estacions de treball per tal que algunes
aplicacions instal·lades puguin connectar amb l’SGBD PostgreSQL per accedir Als annexos del web
trobareu l’apartat “Accés a
a les dades emmagatzemades. Aquest és el cas de les eines ofimàtiques actuals, SGBD corporatives des
d’eines ofimàtiques” en el
que acostumen a facilitar la connectivitat amb els SGBD a través de connectors qual es mostra com
ODBC o JDBC que cal tenir instal·lats a la màquina des d’on es vol utilitzar l’eina instal·lar i utilitzar
connectors ODBC i JDBC.
ofimàtica.
Sistemes de gestió empresarial 22 Sistemes ERP-CRM. Explotació i adequació - I
Per desenvolupar mòduls Dia és una aplicació gràfica de propòsit general per a la creació de diagrames,
d’OpenERP és necessari
el coneixement del desenvolupada com a part del projecte GNOME. Està construïda de forma
llenguatge Python. Als
annexos de la pàgina web modular, amb diferents paquets de formes per a diferents necessitats.
trobareu l’apartat
“Llenguatge Python” amb
recomanacions per a A nosaltres ens interessa aquesta eina per dissenyar els diagrames UML dels
l’aprenentatge.
mòduls OpenERP que volem desenvolupar i generar-ne, posteriorment, el mòdul
per a OpenERP. Per fer això, haurem d’instal·lar Dia amb Python amb l’opció de
Als annexos del web generació de mòduls OpenERP.
trobareu l’apartat
“Instal·lació de Dia amb
Phyton (PyDia) a El procés d’instal·lació de Dia amb Python amb l’opció de generació de mòduls
Windows per
desenvolupar mòduls OpenERP incorpora un exemple de diagrama UML desenvolupat amb Dia (arxiu
OpenERP”.
uml_test.dia facilitat per OpenERP) que correspon a un senzill mòdul de gestió
escolar per a OpenERP. Utilitzarem aquest diagrama per iniciar-nos en el disseny
Trobareu el fitxer de mòduls OpenERP mitjançant l’eina de diagramació Dia.
uml_test.dia dins l’apartat
“Diagrames Dia” dels
annexos del web.
Disseny de classes amb Dia
Posem en marxa l’eina Dia i obrim el fitxer uml_test.dia. La figura 1.6 correspon
al disseny UML del diagrama de classes emmagatzemat.
L’eina Dia permet desenvolupar diversos tipus de diagrama i, com que ens
interessen els diagrames UML, caldrà tenir seleccionada l’opció UML a la caixa
d’eines de la part esquerra de la pantalla de Dia.
L’exemple de la figura 1.6 correspon a un model per gestionar, en una escola que
facilita cursos (en diverses edicions) i disposa de professors, els estudiants dels
diversos cursos. El disseny d’aquest model, tal com veurem, pot no semblar molt
“lògic” i l’hem de considerar com un exemple que ens permet introduir diversos
conceptes bàsics per la generació de mòduls OpenERP amb Dia.
Una primera ullada al diagrama permet introduir els següents conceptes per
mòduls OpenERP:
• Tots els elements d’un diagrama cal escriure’ls en anglès (fins i tot les
etiquetes i els textos informatius). Si ens interessa tenir-lo en català
o castellà, utilitzarem posteriorment les eines de traducció que facilita
OpenERP.
• Els noms de mòduls, classes i membres de les classes han de ser escrits en
minúscula amb guions baixos per fer llegibles els noms compostos.
La nomenclatura indicada
Com que els noms de les classes de la figura 1.6 tenen el prefix school, deduïm és la que marca OpenERP i,
com possiblement sabreu,
que es tracta del diagrama d’un mòdul anomenat school. S’aconsella batejar el és diferent de les
nomenclatures
diagrama Dia amb el nom del corresponent mòdul, ja que en el procés de generació recomanades en altres
entorns de POO, com és el
del mòdul a partir del diagrama, Dia proposa el nom del diagrama com a nom del cas del llenguatge Java.
mòdul, tot i que es pot canviar.
En aquests materials
Observem el diagrama de la figura 1.6. Per a la classe school.event del evolucionarem el diagrama
uml_test amb l’objectiu
mòdul school, en tractar-se del model per a les edicions dels cursos potser d’obtenir un mòdul de nom
school i, per coherència,
hagués estat més encertat el nom school.course.event, de forma similar a la utilitzarem noms school##
per les successives versions
nomenclatura utilitzada per OpenERP per a les comandes de venda i les seves de diagrames
desenvolupats.
línies (sale.order i sale.order.line).
A UML, l’estereotip és un
En el diagrama UML de la figura 1.6, school.professor és una classe abstracta mecanisme d’extensibilitat
que permet indicar una
i school.student és una plantilla de classe. A l’hora de generar els mòduls per distinció d’ús de l’objecte
sobre el qual es defineix.
OpenERP, això no té cap efecte i podrien estar dissenyades com a classes normals.
Sistemes de gestió empresarial 24 Sistemes ERP-CRM. Explotació i adequació - I
Fixem-nos que cada classe del diagrama de la figura 1.6 incorpora un estereotip
(nom encerclat entre els símbols << >> per sobre del nom de la classe). El procés
de generació de mòduls OpenERP a partir de diagrames Dia interpreta el contingut
del camp estereotip com la jerarquia de menús, dins OpenERP, en la qual ubicar els
formularis generats a partir del diagrama i utilitza el símbol / per separar els diver-
sos nivells. És a dir, segons el diagrama de la figura 1.6, el formulari corresponent
al manteniment dels cursos estarà en una opció de menú anomenada Courses, dins
el submenú Configuration del menú principal Courses (ja que l’estereotip de la
classe school.course és <<Courses/Configuration/Courses>>). La figura
1.7 mostra la jerarquia de menús esperada a partir del diagrama de la figura 1.6.
És aconsellable instal·lar el
mòdul uml_test original
facilitat per OpenERP, per
poder comparar el disseny En el diagrama de la figura 1.6 observem que entre les classes hi ha uns connectors
efectuat mitjançant l’eina
Dia amb el resultat final dins (associacions entre classes) que són únicament de caire informatiu i no tenen cap
OpenERP.
incidència en la generació del mòdul OpenERP. Les relacions entre les classes es
Instal·leu el mòdul defineixen a través d’atributs relacionals dins de cada classe; la facilitat de dia-
uml_test original facilitat
per OpenERP, seguint les gramació d’associacions entre classes que facilita l’eina Dia no és aprofitada pel
indicacions finals de
l’annex “Instal·lació de Dia mòdul uml_dia quan genera els mòduls OpenERP; en conseqüència, la utilització
amb Phyton (PyDia) a
Windows per dels connectors associatius de Dia serveixen, únicament, com a documentació
desenvolupar mòduls
OpenERP”. gràfica.
3. Un curs pot tenir diversos estudiants i un estudiant pot cursar diversos cursos
(fletxa amb doble sentit entre school.course i school.student).
El diagrama de classes de les figura 1.6 i figura 1.8 mostra únicament la capçalera
de les classes (nom i estereotip) i aquestes classes poden contenir membres (dades
i mètodes). Per visualitzar dades i/o mètodes (atributs i/o operacions, segons
nomenclatura de l’eina Dia) d’una classe, cal seleccionar la classe i editar les seves
propietats (botó secundari del ratolí), i activar les caselles de verificació Atributs
visibles i Operacions visibles. En activar-les per a totes les classes, obtenim la
visualització de la figura 1.9.
Una ullada ràpida al diagrama de la figura 1.9 ens permet afirmar que les seves
classes no incorporen cap operació i únicament contenen atributs. Aprofitarem
les classes d’aquest diagrama per exemplificar els diversos tipus d’atributs de les
classes d’un mòdul OpenERP i com es defineixen en un diagrama dissenyat amb
l’eina Dia.
F ig ur a 1 . 9. Diagrama UML amb la visualització d’atributs i operacions activades
Sistemes de gestió empresarial 26 Sistemes ERP-CRM. Explotació i adequació - I
Els atributs de les classes d’un mòdul OpenERP són bàsicament de tres categories:
bàsicsosimples, relacionals i funcionals.
Els atributs simples o bàsics són aquells destinats a contenir un valor concret
(enter, real, booleà, cadena...). Els atributs relacionals són aquells destinats
a representar les relacions entre classes. Els atributs funcionals són uns
camps especials perquè no s’emmagatzemen a la base de dades i es calculen
en temps real a partir d’altres atributs.
4. Símbol =.
La taula 1.1 presenta, amb detall, els diversos tipus de dades possibles pels atributs
simples o bàsics.
Taul a 1. 1. Tipus de dades pels atributs simples o bàsics en mòduls OpenERP
selection Un valor d’una llista de valors En aquest cas, abans del valor de
possibles predefinits l’etiqueta del camp, cal indicar la
llista de valors possibles, com a
seqüència de parelles (valor,
etiqueta):
[(valor1, etiqueta1),
(valor2, etiqueta2)...].
La taula 1.2 presenta, amb detall, els paràmetres que poden acompanyar als
atributs, distingint si són obligatoris o optatius i si són comuns o específics d’algun
tipus de dada.
Taul a 1. 2. Paràmetres que poden acompanyar els atributs bàsics
En el client web, els camps amb l’atribut translate a True presenten, en mode
edició, una banderola al final de la caixa de text que conté el valor del camp, per
indicar que el camp és traduïble. Prement el ratolí damunt la banderola, s’obre una
pantalla que recull tots els camps traduïbles del formulari i ens permet traduir-los.
Podeu comprovar-ho en el camp Nom del formulari de productes d’OpenERP. En
el client GTK, també hi ha una banderola, però la funcionalitat de traducció no
funciona en la versió 6.1.
La introducció dels diversos valors per definir un atribut simple des de l’eina Dia,
s’efectua des de la pestanya Atributs de les propietats de la classe, seguint els
criteris següents:
Podeu comprovar l’aplicació dels criteris anteriors tot editant les propietats de
qualsevol dels atributs bàsics de les classes del diagramauml_test. La figura
1.11 mostra la definició de l’atribut name de la classe school.course.
Us heu adonat que, en els paràmetres presentats, no n’hi ha cap que faci referència
a la definició d’un camp identificador de la classe? OpenObject és el framework
sobre el qual està
F ig ur a 1. 11. Exemple de definició d’atribut bàsic de classe de mòdul OpenERP des de Dia desenvolupat OpenERP, de
manera que en parlar de
facilitats de
desenvolupament, ens hem
de referir a l’OpenObject.
Es pot utilitzar OpenObject
per desenvolupar altres
aplicacions que no tinguin
res a veure amb OpenERP.
mostra el contingut de l’atribut name del país al qual pertany el client. Si anem a
la base de dades a consultar el contingut de la taula res_partner_address (que
conté les adreces dels clients), hi veurem el camp country_id, com a clau forana
de l’atribut id de la taula res.country. A la llista de clients, però, no veiem el
contingut de l’atribut country_id (que és el que relaciona el client amb el país)
sinó el contingut de l’atribut name del país referenciat.
OpenERP té moltes classes que contenen l’atribut active, com per exemple la
classe res.users (taula res_users). Així, per exemple, podeu anar a Settings
/ Usuaris, editar el registre Demo User, desmarcar la casella Actiu per deixar-lo
no actiu i enregistrar el canvi. Podreu observar com el registre Demo User ha
desaparegut de la llista d’usuaris i ja no sortirà mai més fins que el fem actiu. Per
fer actiu un registre inactiu hem d’aconseguir accedir-hi per canviar el valor de
la casella Actiu. Per aconseguir-ho ens hem de valer de la recerca avançada dels
formularis. Per fer-ho cal seleccionar el camp Actiu i indicar que volem veure els
registres que el tenen en valor fals.
1 [(’draft’, ’Quotation’),
2 (’waiting_date’, ’Waiting Schedule’),
3 (’manual’, ’To Invoice’),
4 (’progress’, ’In Progress’),
5 (’shipping_except’, ’Shipping Exception’),
6 (’invoice_except’, ’Invoice Exception’),
7 (’done’, ’Done’),
8 (’cancel’, ’Cancelled’)
9 ]
Atributs relacionals
Entre les classes d’OpenObject es pot establir tres tipus de relacions, de manera
similar a les relacions entre les entitats en un model entitat-relació per a bases
de dades. Es defineixen via atributs relacionals dins les classes. Tenim, en
conseqüència, tres tipus d’atributs relacionals: molts a un, un a molts, molts
a molts.
L’atribut relacional “molts a un” (many2one) s’utilitza per representar una relació
cap a una classe pare, de molts a un, és a dir, molts objectes de la classe que conté
l’atribut poden estar relacionats amb un mateix objecte de la classe pare.
OpenERP mostra els camps many2one acompanyats per una llista per seleccionar
l’objecte de la classe pare. És a dir, en el formulari per gestionar els cursos
(objectes de la classe school.event), el camp course_id, amb etiqueta Course,
estarà acompanyat d’un desplegable per seleccionar el curs que correspongui
d’entre els objectes de la classe school.course). Això obliga que la classe
referenciada pel camp many2one contingui el camp name.
Per definir un atribut many2one en l’eina Dia, cal crear l’atribut indicant que és
del tipus many2one i a l’espai valor introduir:
1 ’classeReferenciada’,’etiquetaDelCamp’...
Els punts suspensius del final indiquen que es pot utilitzar alguns paràmetres
opcionals. Concretament:
• ondelete: per indicar com actuar quan l’objecte referenciat per l’atribut
sigui eliminat. Valors possibles: cascade, set null. Valor per defecte:
set null.
1 ’school.course’,’Course’,required=True
Un atribut relacional “un a molts” (one2many) s’utilitza per representar una relació
cap a una classe filla, d’un a molts, és a dir, un objecte de la classe que conté
l’atribut pot estar relacionat amb molts objectes de la classe filla.
Sistemes de gestió empresarial 33 Sistemes ERP-CRM. Explotació i adequació - I
1 ’classeReferenciada’,’nomAtributClasseReferenciada’,’etiquetaDelCamp’...
Els punts suspensius del final indiquen que es pot utilitzar alguns paràmetres
opcionals. Concretament:
• invisible: per impedir que el seu contingut sigui visible en els formularis
corresponents a la classe a la qual pertany el camp. Valors possibles: True,
False. Valor per defecte: False.
El desenvolupament de
mètodes (lògica de
negoci) en OpenERP es
troba a l’apartat El paràmetre invisible=True en un atribut one2many provoca que cap formulari
“OpenERP: la vista i el
controlador” en el qual aparegui l’atribut incorpori la llista dels objectes referenciats. D’aquesta
manera, l’atribut únicament pot servir per facilitar l’accés als objectes referenciats
en els mètodes desenvolupats sobre la classe.
1 ’res.partner’,’Professor’,required=True
1 ’school.professor’,’Professor’,required=True
La figura 1.12 també ens permet observar l’efecte dels atributs many2one. Ob-
servem que els camps etiquetats per Associated Partner i Private Address van
acompanyats per dues icones: una icona lupa, que permet accedir a la llista dels
objectes de la classe referenciada per aquests camps, i una icona carpeta que
permet accedir a la fitxa de l’objecte referenciat. Si observem els corresponents
atributs dins la classe school.professor veurem que es tracta dels camps
partner_id i address_id, de tipus many2one.
Sistemes de gestió empresarial 35 Sistemes ERP-CRM. Explotació i adequació - I
Per definir un atribut many2many en l’eina Dia cal crear l’atribut en alguna de les
dues classes que relaciona, o en ambdues, indicant el tipus many2many i, a l’espai
valor, introduir:
1 ’classeReferenciada’,’nomTaulaRelacional’,’nomCampFKPropi’,’
nomCampFKAltraClasse’,’etiquetaDelCamp’
• Els noms assignats als tercer i quart paràmetres del contingut de l’espai
valor haurien d’estar a l’inrevés, de manera que course_id fos el nom per
fer referència a la classe school.course i student_id fos el nom per fer
referència a la classe school.student.
Així doncs, seria millor redefinir l’atribut subscriptions, canviant-li el nom per
course_ids i amb el següent contingut a l’espai valor:
Sistemes de gestió empresarial 36 Sistemes ERP-CRM. Explotació i adequació - I
1 ’school.course’,’school_student_course_rel’,’student_id’,
2 ’course_id’,’Subscriptions to courses’
Figu r a 1. 13 . Formulari per al manteniment d’estudiants amb els cursos on estan subscrits
Fig ur a 1 . 14 . Formulari per al manteniment de cursos amb els estudiants que hi estan subscrits
Sistemes de gestió empresarial 37 Sistemes ERP-CRM. Explotació i adequació - I
En cas que interessi que en el formulari dels cursos hi aparegui una zona de
tipus llista per accedir als estudiants subscrits al curs, caldrà definir un atribut
many2many a la classe school.course, en el qual el nom de la taula relacional i
els noms dels seus camps han de coincidir amb la definició de l’atribut many2many
de la classe school.student. Així, per exemple, podem definir-hi l’atribut
student_ids amb el següent contingut a l’espai valor:
1 ’school.student’,’school_student_course_rel’,’course_id’,’student_id’,’Students
’
L’eina Dia permet generar, a partir d’un diagrama dissenyat per a un mòdul
OpenERP, el corresponent mòdul per ser instal·lat seguint el procediment habitual. A l’annex “Instal·lació de
Dia amb Phyton (PyDia) a
Windows per
Per aconseguir el mòdul OpenERP, cal haver incorporat a l’eina Dia el guió desenvolupar mòduls
OpenERP” trobareu les
codegen_openerp.py de Python i, en tal situació, l’opció Fitxer | Exportar de indicacions per
aconseguir que Dia pugui
Dia mostra l’opció d’exportació PyDia Code Generation (OpenERP) (*.zip) que generar mòduls OpenERP
per a la seva instal·lació.
és la que hem d’utilitzar per aconseguir el mòdul per ser instal·lat en OpenERP.
Entre generació i generació de mòdul OpenERP des de l’eina Dia cal reiniciar l’eina, ja que
sembla que, en algunes ocasions, la generació no parteix de zero, sinó que afegeix el codi
generat al codi de la generació prèvia. Amb motiu de tenir accés a
la història de les diverses
millores incorporades al
Cal generar el mòdul en el mateix directori en el qual es troba el diagrama Dia, ja que del diagrama Dia,
contrari es genera un mòdul buit. corresponents al mòdul
school, afegirem un sufix
numèric _## a les diverses
Cal tenir en compte que el guió codegen_openerp.py, facilitat en el mòdul uml_dia per versions que anem
la versió 5.0 d’OpenERP, no genera correctament l’arbre de menús adequat a la versió generant.
6.1 d’OpenERP. Recordem que el menú en el qual havia d’estar ubicat el manteniment
corresponent a una classe s’indicava en el camp estereotip de les propietats de la Per a poder instal·lar el
mòdul school aquí
classe. En conseqüència, abans d’instal·lar un mòdul generat per Dia amb el guió generat, cal retocar els
codegen_openerp.py de la versió 5.0, en un servidor OpenERP 6.1, caldrà retocar la menús tal com s’indica al
final de l’annex
definició de menús en el mòdul generat. “Instal·lació de Dia amb
Phyton (PyDia), en
Windows, per
Suposant que hem incorporat els diversos retocs indicats fins ara al diagrama desenvolupar mòduls
OpenERP”, utilitzant els
uml_dia original, procedim a enregistrar-lo amb nom school_01.dia i procedim menús indicats en
school_01_menus.txt,
a generar el mòdul school. fitxer ubicat a l’apartat
“Diagrames Dia” dels
annexos del web. També
Abans d’instal·lar el nou mòdul school, si a l’empresa on pensem instal·lar- trobareu el mòdul ja
preparat sota el nom
lo hi ha instal·lat el mòdul uml_test cal desinstal·lar-lo, ja que ambdós mò- school_01.zip dins
l’apartat “Mòduls
duls tenen taules coincidents i són incompatibles. Posteriorment, haurem OpenERP” dels annexos
d’establir una connexió amb la base de dades de PostgreSQL i eliminar les del web.
Sistemes de gestió empresarial 38 Sistemes ERP-CRM. Explotació i adequació - I
L’eina de diagramació Dia, amb l’extensió per generar mòduls per a OpenERP,
facilita el disseny de mòduls per OpenERP. Les possibilitats que permet l’eina Dia
són, però, limitades i, en conseqüència, ens cal aprendre com escriure directament
els mòduls utilitzant els llenguatges Python i XML.
Un mòdul d’OpenERP incorpora, en el seu interior, tots els elements del patró
model-vista-controlador en el qual es basa el desenvolupament d’OpenObject.
L’eina Dia permet definir el model via diagrama UML i l’extensió per generar
mòduls per a OpenERP ens facilita el mòdul que conté:
• Una vista, definida a través del llenguatge XML, generada de forma auto-
màtica.
1 camíOnÉsUbicatOpenERP\Server\addons
1 camíOnÉsUbicatOpenERP\Server\server\openerp\addons
4. Crear els fitxers Python que han de contenir les classes, amb els atributs
i els mètodes. En aquests fitxers es defineix el model i el controlador
(arquitectura MVC).
5. Crear els fitxers XML per la gestió de les dades (vistes, accions, menús,
dades d’exemple...). En aquests fitxers es defineix la vista (arquitectura
MVC).
En aquest fitxer cal situar tots els imports de fitxers Python que cal carregar per a
l’execució del programa.
Així, si el mòdul conté un fitxer de nom module.py que conté la descripció de les
classes, caldrà incorporar, dins el fitxer __init__.py la instrucció:
1 import module
Observeu el contingut del
fitxer __init__.py de
qualsevol dels mòduls que
incorpora OpenERP o del
Descripció del mòdul: fitxer __openerp__.py mòdul school generat.
• depends: llista Python de mòduls dels quals depèn aquest mòdul. El mòdul
base s’acostuma a afegir perquè conté dades utilitzades en vistes, informes...
Les classes Python que permeten definir objectes (classes) d’OpenERP tenen dos
atributs obligatoris i altres opcionals. Els atributs obligatoris són:
L’aplicació de l’atribut
Els atributs opcionals són: _auto queda palesa en el
disseny d’informes i
quadres de comandament.
• _auto: els valors possibles són True i False. Per defecte True. Determina
si s’ha de generar la taula PostgreSQL a partir de la definició de l’objecte
OpenERP. El valor False s’utilitza per objectes OpenERP no persistents
que es basen en vistes definides en PostgreSQL.
• _defaults: diccionari Python que conté els valors per defecte per les dades
(definides a _columns) de l’objecte (classe) d’OpenERP que ho precisin.
1 {’nom_objecte_pare’:’nom_de_camp’,...}
• _order: nom dels atributs utilitzats per ordenar els resultats dels mètodes
de cerca i lectura. Per defecte, s’utilitza el camp _id generat automàtica-
ment en totes les taules de PostgreSQL corresponents a objectes (classes)
d’OpenERP. Exemples:
1 _order = ’name’
• _sql: codi SQL a executar en la creació de l’objecte, en cas que _auto sigui
True.
• _table: nom de la taula SQL si es vol que sigui diferent del nom automàtic
a partir del nom de l’objecte substituint els punts per guions baixos.
Una vegada presentats els possibles atributs de les classes Python dissenyades
per generar objectes (classes) d’OpenERP, ens cal endinsar-nos en els possibles
continguts d’alguns d’aquests atributs.
Tipus de camps
L’atribut _columns de la classe Python que defineix l’objecte (classe) d’OpenERP
ha de contenir un diccionari Python amb la definició dels atributs de l’objecte
d’OpenERP, a partir dels camps (fields) predefinits a la classe osv.
1 ’nom_camp’:fields.tipus_de_camp(paràmetres)
• Camps function.
• Camps property.
Sistemes de gestió empresarial 43 Sistemes ERP-CRM. Explotació i adequació - I
Els camps related permeten accedir a un camp d’un altre objecte referenciat des
del propi objecte; és a dir, com si es tractés de camps encadenats.
Com a exemple, suposem que en un mòdul d’OpenERP tenim les classes exem-
plificades en el diagrama UML de la figura 1.15. En un mòdul per a OpenERP, a
la classe City hi haurà un camp relacional many2one cap a la classe State, i a la
classe State hi haurà un camp relacional many2one cap a la classe Country. Un
camp related ens permet accedir des de la classe City a la classe Country via
la classe State.
Figu ra 1 . 1 5. Disseny UML amb dues relacions many2one
Els punts suspensius del final indiquen que hi pot haver més paràmetres segons el
tipus del camp. Així, en els camps de tipus many2one, caldrà afegir un paràmetre
relation per indicar el nom de la classe relacionada. El paràmetre store (per
defecte False) permet indicar si el valor accedit ha de quedar enregistrat a la
base de dades (cas clar de redundància) per tal de facilitar una major eficiència
d’OpenERP en els processos de recerca i de lectura. En cas d’activar aquesta
redundància, els valors sempre són mantinguts per OpenERP i mai pels usuaris.
Així, per aconseguir que la classe City de la figura 1.15 pugui accedir a
l’identificador de la classe Country via la classe State, hauríem de tenir:
1 # Dins la classe module.state:
2 _columns: {
3 ...
Sistemes de gestió empresarial 44 Sistemes ERP-CRM. Explotació i adequació - I
4 ’country_id’: fields.many2one(’module.country’,’Country’),
5 ...
6 }
7
8 # Dins la classe module.city:
9 _columns: {
10 ...
11 ’state_id’: fields.many2one(’module.state’,’State’),
12 ’country_id’: fields.related(’state_id,’country_id’,
13 type=’many2one’,
14 relation=’module.country’,
15 string=’Country’,store=False),
16 ...
17 }
Imaginem-nos que és important, per a nosaltres, que el telèfon de cada professor es vegi
directament a la fitxa del professor, sense haver d’accedir a la fitxa de l’adreça.
1 ’phone’:fields.related(’address_id’,’phone’,type=’char’,size=64,
2 string=’Phone’,store=False,readonly=True),
Podeu aprofitar aquesta actualització per canviar l’arxiu __terp__.py per __openerp__.py i
actualitzar el seu contingut (autor, versió...) Per poder instal·lar el
mòdul school generat cal
retocar els menús tal com
Tipus function s’indica al final de l’annex
“Instal·lació de Dia amb
Python (PyDia) a
Els camps function simulen camps reals però es calculen mitjançant una funció Windows, per
desenvolupar mòduls
Python enlloc d’emmagatzemar-se a la base de dades PostgreSQL. En casos espe- OpenERP”, utilitzant els
menús indicats a
cials, per augmentar la velocitat de consulta d’OpenERP i facilitar les consultes, school_02_menus.txt,
es fan redundants a la base de dades, és a dir, s’emmagatzemen a la base de dades, fitxer ubicat a l’apartat
“Diagrames Dia” dels
però sempre són calculats i actualitzats a través de funcions i mai pels usuaris. annexos del web. També
trobareu el mòdul ja
preparat sota el nom
La definició d’una columna function ha de seguir la sintaxi: school_02.zip dins
l’apartat “Mòduls
OpenERP” dels annexos
1 ’nom’: fields.function(fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, del web.
2 type=’Float’, fnct_search=None,
3 string=’etiquetaNouCamp’, store=False,
4 multi=False [,...]),
en la qual:
• Els paràmetres que van acompanyats d’un símbol =Valor no són obligatoris
i el valor indicat és el que es considera en cas de no explicitar el paràmetre.
• type: és el tipus de camp retornat per la funció. Pot ser qualsevol tipus
excepte function. Els punts suspensius del final indiquen que hi pot haver
més paràmetres segons el tipus del camp. Així, en els camps de tipus
’many2one’ caldrà afegir un paràmetre obj per indicar el nom de la classe
relacionada.
• multi: per indicar que el càlcul de la funció s’efectuï per a diversos camps,
a causa que la mateixa funció és invocada en diferents camps (veure, com
exemple, el mòdul auction d’OpenERP).
Si utilitzeu el mòdul, observareu que permet gestionar, per cada empleat, els
dies d’absència i els dies treballats fora del calendari laboral. Cada recurs
(objecte) de l’objecte (classe) hr.holidays d’OpenERP correspon a un dels dos
tipus possibles (add o remove) segons la definició de l’atribut type. L’atribut
number_of_days_temp conté el nombre de dies afectats, sempre en positiu. En
canvi, l’atribut number_of_days vol contenir el nombre de dies afectats, en
positiu si es tracta de dies de treball addicional, i en negatiu si es tracta de dies
d’absència.
Tipus property
Els camps property són camps dinàmics amb drets d’accés específics, que
permeten contenir diferents valors en funció de la companyia.
• Cal tenir més d’una companyia a la nostra empresa. Per exemple, suposem
que a l’empresa que hem anat utilitzant (Empresa_IOC) hi tenim creades
les companyies ESO, BAT i CF dedicades als corresponents estudis.
Si editem qualsevol dels vuit paràmetres observarem (figura 1.17) que el formulari
conté el camp Valor amb un contingut que podem modificar. Podem observar que
el contingut pel camp Valor és idèntic en les quatre companyies per a un mateix
paràmetre, ja que és el valor que el procés de configuració de comptabilitat assigna
(compte comptable 410000 per a proveïdors i compte comptable 430000 per a
clients), però podem modificar-lo per a la companyia que interessi.
A més, per cada tercer al qual, per un d’aquests camps property, s’assigni un
valor diferent del que li pertoca segons la companyia, OpenERP afegeix un nou
registre en el formulari de la figura 1.16, tot indicant a la columna Recurs el nom
de l’objecte que té un valor diferent. Els registres que tenen buida la columna
Recurs són els que contenen el valor per defecte a assignar al camp property.
Sembla clar que el lloc on hem de cercar aquests camps té a veure amb l’objecte
(classe) res.partner d’OpenERP. Si fem una ullada a aquesta classe, definida
dins el mòdul base d’OpenERP (fitxer res_partner.py) no hi trobarem cap
dels dos camps property indicats. Els camps que cerquem es troben dins
l’objecte res.partner definit dins el mòdul account (fitxer partner.py del
mòdul account) que és una classe derivada de la classe res.partner principal
(l’existent en el mòdul base). Vegem la part corresponent als dos camps
property de la definició d’aquesta classe derivada:
1 class res_partner(osv.osv):
2 _name = ’res.partner’
3 _inherit = ’res.partner’
4 _description = ’Partner’
5 ...
6 _columns = {
7 ...
8 ’property_account_payable’:
9 fields.property(’account.account’, type=’many2one’,
10 relation=’account.account’, string="Account Payable",
11 view_load=True, domain="[(’type’, ’=’, ’payable’)]",
12 help="This account will be used instead of the default
one as the payable account for the current partner",
required=True),
13 ’property_account_receivable’:
14 fields.property(’account.account’, type=’many2one’,
15 relation=’account.account’, string="Account Receivable",
16 view_load=True, domain="[(’type’, ’=’, ’receivable’)]",
17 help="This account will be used instead of the default
one as the receivable account for the current
partner", required=True),
18 ...
19 }
Els valors per defecte dels camps d’un objecte d’OpenERP es defineixen en un
diccionari de la forma:
1 _defaults = {
2 ’nom_del_camp1’: funció1 o valor1,
3 ’nom_del_camp2’: funció2 o valor2,
4 ...
5 }
Observem que els valors per defecte (sempre corresponents a tipus de dades
simples) poden ser valors estàtics o valors dinàmics resultants de la crida de
funcions que han d’estar declarades amb anterioritat a la definició del diccionari
_defaults.
Les funcions per ser invocades en un valor per defecte dinàmic, han de contenir
obligatòriament 4 paràmetres:
Els mòduls d’OpenERP estan plens d’exemples d’utilització de valors per defecte.
Així, per exemple, observem els valors per defecte de l’objecte res.users (definit
en el fitxer res_users.py dins el mòdul base) ideat per gestionar els usuaris de
l’empresa gestionada per OpenERP:
1 _defaults = {
2 ’password’ : ’’, ’context_lang’: ’en_US’,
3 ’active’ : True, ’menu_id’: _get_menu,
4 ’company_id’: _get_company, ’company_ids’: _get_companies,
5 ’groups_id’: _get_group, ’menu_tips’: False
6 }
En algunes ocasions, la definició d’un valor per defecte estàtic s’efectua amb la
crida a una funció lambda de Python sense paràmetres. La definició dels valors
per defecte estàtics a l’anterior exemple s’hagués pogut efectuar com:
1 _defaults = {
2 ’password’: lambda *a: ’’, ’context_lang’: lambda *a: ’en_US’,
3 ’active’: lambda *a: True, ’menu_id’: _get_menu,
4 ’company_id’: _get_company, ’company_ids’: _get_companies,
5 ’groups_id’: _get_group, ’menu_tips’: lambda *a: False
6 }
Per últim, per no veure’s obligats a crear funcions que només siguin invocades
en un valor _defaults, es pot utilitzar les funcions lambda de Python en el
mateix moment d’efectuar la crida, estalviant-nos la definició de la funció amb
nom. En el següent codi corresponent al diccionari _defaults de la classe
document.directory (fitxer document_directory.py del mòdul document) ob-
servem la definició de dues funcions lambda:
1 _defaults = {
2 ’company_id’: lambda s,cr,uid,c:
3 s.pool.get(’res.company’)._company_default_get(cr, uid, ’document.directory
’, context=c),
4 ’user_id’: lambda self,cr,uid,ctx: uid,
5 ’domain’: ’[]’,
6 ’type’: ’directory’,
7 ’ressource_id’: 0,
8 ’storage_id’: _get_def_storage,
9 ’resource_find_all’: True,
10 }
Sistemes de gestió empresarial 51 Sistemes ERP-CRM. Explotació i adequació - I
L’objecte (classe) school.professor del mòdul school que estem millorant, incorpora
l’atribut contract que consisteix en una selecció entre dos possibles valors. En el procés
de creació d’un nou professor podem observar que el camp contract apareix sense valor
per defecte. Volem definir que el valor per defecte d’aquest camp sigui trainee.
1 class school_professor(osv.osv):
2 """Professors"""
3 _name = ’school.professor’
4 _columns = {
5 ’name’: fields.char(’Professor Name’, size=64,required=True),
6 ’contract’: fields.selection([(’trainee’,’Trainee’),
7 (’named’,’Named’)],’Contract’),
8 ’partner_id’: fields.many2one(’res.partner’,
9 ’Associated Partner’),
10 ’address_id’: fields.many2one(’res.partner.address’,
11 ’Private Address’),
12 ’phone’: fields.related(’address_id’,’phone’, type=’char’,
13 string=’Phone’, store=False,
14 readonly=True),
15 ’hours_available’: fields.integer(’Hours Per Week’),
16 ’course_ids’: fields.one2many(’school.course’, ’prof_id’,
17 ’Courses’),
18 ’active’: fields.boolean(’Active’),
19 }
20 _defaults = {
21 ’contract’: lambda *a: ’trainee’,
22 ’active’: lambda *a: 1,
23 }
24 school_professor()
Observem que en la definició dels valors per defecte, hem utilitzat una funció lambda de
Python, però no hagués estat necessari.
Una vegada actualitzat el mòdul school amb les noves millores, si obrim el formulari de
manteniment de professors observarem que en donar d’alta un professor, en el camp
Contract apareix per defecte el valor Trainee. En canvi, no apareix el nou camp Active,
a causa que no hem modificat encara el formulari XML, però sí que podem veure la seva
existència a la taula school_professor de la base de dades, amb valor True per tots els
professors que ja existien a la taula i també pels nous professors.
Podeu trobar la versió
millorada del mòdul
school a l’arxiu
school_03.zip dins
Restriccions l’apartat “Mòduls
OpenERP” dels annexos
Els objectes (classes) d’OpenERP poden incorporar, de forma opcional, restricci- del web.
ons d’integritat, addicionals a les que es puguin establir sobre la pròpia base de
dades. OpenERP valida aquestes restriccions en les modificacions de dades i, en
cas de violació, OpenERP mostra una pantalla d’error.
Els tuples corresponents a una restricció venen definits per tres camps:
El codi IBAN (International Bank Account Number ) s’utilitza per a identificar a nivell
internacional un compte bancari. Sempre comença per dos caràcters que identifiquen el
país i va seguit d’una seqüència de dígits. En el cas dels comptes bancaris espanyols,
comença per ES i va seguit de 22 dígits, dels quals, els 2 primers són dígits de control
i els altres 20 corresponen al CCC (Codi Compte Client) utilitzat des de molt de temps a
Espanya.
El codi BIC (Bank Identifier Code) serveix per identificar una entitat bancària.
A la xarxa trobareu gran
quantitat de documentació
relativa als codis IBAN i Fixem-nos en el següent fragment de codi de la classe Python res_partner_bank
BIC.
definida en el mòdul base_iban (fitxer base_iban.py):
1 _constraints = [
2 (check_iban, _construct_constraint_msg, ["iban"]),
3 (_check_bank, ’\nPlease define BIC/Swift code on bank for bank type IBAN
Account to make valid payments’, [’bic’])
4 ]
4. Procediu a Desar i Tancar, fet que us portarà de nou a la fitxa del client, on
veureu el compte bancari introduït i procediu a intentar enregistrar el client.
En aquest moment, OpenERP comprova les restriccions introduïdes i, en
aquest cas, com que els codis IBAN i BIC són erronis, apareix la pantalla
d’error de la figura 1.18. Hi observem dos errors: el primer que ens informa
de l’error en validar el camp iban i ens explica com ha de ser el contingut
d’aquest camp. El segon ens informa que s’ha produït un error en validar el
camp bic.
F igu ra 1 . 1 8 . Pantalla d’error d’OpenERP quan els codis IBAN i BIC són
erronis
Sistemes de gestió empresarial 55 Sistemes ERP-CRM. Explotació i adequació - I
Una vegada es domina el disseny del model de dades d’una aplicació desenvolu-
pada sobre OpenObject, com és el cas d’OpenERP, cal entrar en el coneixement
del disseny de la vista i del controlador.
2.1 Menús
Els menús d’un mòdul OpenObject es dissenyen en arxius XML i han d’estar
referenciats des de l’apartat update_xml del fitxer descriptor del mòdul __ope-
nerp__.py. Els arxius XML acostumen a incorporar les pantalles (views) i els
menús que permeten accedir a les pantalles. Els dos tipus d’elements, però,
podrien residir en fitxers XML específics (un per menús i un per views).
Sistemes de gestió empresarial 56 Sistemes ERP-CRM. Explotació i adequació - I
Com a exemple, podem analitzar el mòdul school generat per l’eina Dia, en el
qual observem la presència del fitxer anomenat school_view.xml:
1 "update_xml" : [’school_view.xml’],
Els menús d’OpenObject i les seves opcions han de tenir una declaració similar a:
1 <menuitem id="menuitem_id"
2 name="títol_del_menú"
3 action="action_id"
4 icon="nom_de_icona"
5 web_icon="nom_icona_web"
6 web_icon_hover="nom_icona_web_flotant"
7 parent="menuitem_id"
8 groups="grups_usuaris"
9 sequence="<integer>"
10 />
• Atribut id: conté l’identificador XML del menú, únic dins el mòdul.
• Atribut parent: especifica l’identificador del menú pare del qual depèn. Si
no es defineix, indica que es tracta d’un menú arrel (menú principal).
• Atribut sequence: és un enter que s’utilitza per ordenar el menú dins l’arbre
de menús, de manera que a major valor, més avall apareix el menú. Aquest
valor no és obligatori i per defecte pren el valor 10. Els menús que tinguin
el mateix valor s’ordenen per moment temporal de creació.
Sistemes de gestió empresarial 57 Sistemes ERP-CRM. Explotació i adequació - I
2.2 Vistes
Les vistes d’OpenERP són les pantalles que faciliten l’accés de l’usuari a la infor-
mació, tant per consultar-la com per modificar-la (altes, baixes i modificacions).
En cas que una vista es modifiqui en temps d’execució (des del client web
activant el mode de desenvolupament, o des del client GTK, pel menú Settings
| Personalització | Interfície d’usuari | Vistes), simplement cal tancar-la i reobrir-
la per observar els canvis.
1 "update_xml" : [’school_view.xml’],
Podeu trobar la versió
vigent del mòdul school a
l’arxiu school_04.zip dins
l’apartat “Mòduls El nom del fitxer XML en el qual resideixen les vistes pot ser qualsevol, però és
OpenERP” dels annexos
del web. altament aconsellable utilitzar alguna combinació en la qual aparegui el nom del
mòdul i quelcom que indiqui el seu contingut (com per exemple el mot view).
• Element record que conté l’atribut model amb valor ir.ui.view obliga-
tori per a les vistes, i l’atribut id amb l’identificador XML de la vista dins
el mòdul.
Així doncs, cal endinsar-nos en l’estructura dels diversos tipus de vista i en els
mecanismes (accions) que possibiliten a l’usuari la seva execució. En el Technical Memento
d’OpenERP disponible a
doc.openerp.com/memento
hi trobareu el recordatori
sobre el disseny de vistes
i accions.
• Accions que executen vistes (pot ser única i que accioni diverses vistes).
Hi observem:
• Una acció: action_school_professor, que no està associada a cap de les dues vistes.
Quina s’executa, doncs, en activar l’acció?
En executar, des d’OpenERP, l’opció de menú Professors, observem com apareixen els
professors en format llista (tree) i que la vista formulari (form) també es pot seleccionar.
OpenObject categoritza totes les vistes (tree, form, calendar, search, graph,
gantt i kanban) en dos grans grups:
• tree per les vistes jeràrquiques, que permeten la visualització de dos tipus
de vistes:
Els valors de view_mode, separats per comes, han de ser coherents amb el valor de
view_type i, a més, el mòdul ha d’incorporar alguna vista per cadascun dels tipus
indicats a la seqüència de view_mode. En cas que per algun tipus de vista dels
indicats a view_mode, hi hagi diverses vistes definides en el mòdul, OpenObject
escollirà la vista més prioritària (element priority de la definició de les vistes).
1 <record model="ir.actions.act_window"
2 id="action_school_professor">
3 <field name="name">Professors</field>
4 <field name="res_model">school.professor</field>
5 <field name="view_type">form</field>
6 <field name="view_mode">tree,form</field>
7 </record>
En aquest cas, a causa que view_type té el valor form, l’element view_mode podria
contenir, en principi, qualsevol seqüència ordenada dels valors tree, form, calendar,
search, graph, gantt i kanban. Fixem-nos que la seqüència és "tree,form" i, en
conseqüència, en executar l’acció (manteniment de professors), les dues vistes possibles
són llista i formulari i el manteniment s’obre en vista llista. Si el contingut de view_mode
hagués estat "form, tree" les vistes possibles haguessin estat les mateixes, però el
manteniment s’obriria en mode formulari buit. Per tal que tot funcioni, el mòdul facilita
per a l’objecte school.professor, com a mínim, una vista de tipus form i una vista de
tipus tree no jeràrquica:
1 <record model="ir.actions.act_window"
2 id="action_school_course">
3 <field name="name">Courses</field>
4 <field name="res_model">school.course</field>
5 <field name="view_type">form</field>
6 <field name="view_mode">tree,form,calendar</field>
7 </record>
Aquest és un altre cas en el qual view_type té el valor form, però, en canvi, l’element
view_mode conté la seqüència "tree,form,calendar" i, en conseqüència, en executar
l’acció (manteniment de cursos), tenim tres vistes possibles (llista, formulari i calendari) i
el manteniment s’obre en vista llista. Ja que l’acció indica tres vistes possibles, el mòdul
hauria de contenir, com a mínim, una vista de cada tipus, i en aquest cas, l’eina Dia, que
ha generat l’element view_mode amb els tres tipus de vista, només facilita dues vistes:
F ig u ra 2. 1 . Pantalla d’OpenERP en
intentar mostrar una vista Calendar errònia
Caldrà, doncs, dissenyar vistes calendar per aconseguir el funcionament desitjat o eliminar
el valor calendar de l’element view_mode.
2 <field name="name">action.name</field>
3 <field name="view_type">form|tree</field>
4 <field name="view_mode">...</field>
5 <!−− combinació ordenada dels tipus de vista
6 possible, coherent amb el contingut de
7 l’element view_type −−>
8 <field name="view_id" ref="nomVista"/>
9 <field name="search_view_id" ref="nomVistaDeCerca"/>
10 <field name="domain">
11 ["list of 3−tuples (max 250 characters)"]
12 </field>
13 <field name="context">
14 {"context dictionary (max 250 characters)"}
15 </field>
16 <field name="res_model">Open.object</field>
17 <field name="target">new</field>
18 </record>
• Element domain amb una llista Python de condicions utilitzada per refinar
els resultats d’una selecció i, en conseqüència, mostrar menys recursos a la
vista. Les condicions de la llista s’enllacen amb una clàusula AND i són
tuples Python de tres valors (’camp’,’condició’,’valor’).
• Per defecte cada camp va precedit d’una etiqueta que és el seu nom.
• Les zones 1 contenen les etiquetes dels camps ubicats a les zones 2.
OpenObject permet:
• Que un camp pugui ocupar més d’una columna, tot utilitzant l’atribut
colspan.
• Distribuir els camps d’un objecte en diverses pestanyes, tot utilitzant les
etiquetes notebook i page.
1 class school_professor(osv.osv):
2 _name = ’school.professor’
3 _columns = {
4 ’name’: fields.char(...),
5 ’contract’: fields.selection(...),
6 ’partner_id’: fields.many2one(...),
7 ’address_id’: fields.many2one(...),
8 ’phone’: fields.related(...),
9 ’hours_available’: fields.integer(...),
10 ’course_ids’: fields.one2many(...),
11 ’active’: fields.boolean(’Active’),
12 }
13 ...
Suposem que volem situar el camp active, que correspon a una casella de
verificació, a la 4a fila del formulari. Simplement l’haurem de situar en 7è lloc dins
l’XML de l’element arch, entre els camps hours_available i course_ids. Si
efectuem la modificació en el fitxer school_view.xml caldrà actualitzar el mòdul;
en canvi, si efectuem la modificació des dels clients web o GTK només cal
recarregar el formulari. Sigui quin sigui el camí, observarem el camp active
amb etiqueta Active a la 4a línia de la pantalla.
que indica que el camp (conjuntament amb la seva etiqueta Courses) ha d’ocupar
les 4 columnes de la pantalla.
Atribut Utilització
1 <field name="name"
2 attrs="{’readonly’:[(’state’,’!=’,’draft’),
3 (’state’,’!=’,’confirm’)]}"/>
El camp name serà de només lectura quan el camp state no tingui els valors draft ni
confirm.
1 <field name="category_id"
2 attrs="{’required’:[(’holiday_type’,’=’,’category’)],
3 ’readonly’:[(’state’,’!=’,’draft’)]}"/>
Element Utilització
Taul a 2. 3. Relació d’atributs específics per l’element field en la definició d’un form
Atribut Significat
Atribut Significat
Taul a 2. 4. Relació d’atributs específics per l’element button en la definició d’un form
Atribut Significat
F ig ur a 2 .6 . Giny datetime
Ens proposem millorar les vistes form del mòdul school vigent (versió school_04).
En tots els camps de les vistes form eliminem –per obsolets– els atributs select amb valor
0 o 2. Hi mantenim els atributs select="1" mentre no incorporem cap vista search.
• Fem visible el camp active en la tercera fila del formulari, a la dreta del camp
hours_avalilable, de manera que els dos camps (active i hours_available) ocupin les
columnes 3 i 4 del formulari.
• Fem desaparèixer l’etiqueta Courses del sotsformulari i afegim un separador, amb etiqueta
Courses, just abans del sotsformulari.
• Millorem el camp website de manera que es pugui navegar fins l’adreça que conté.
La vista arbre mostra els recursos de l’objecte seguint una estructura jeràrquica,
mentre que la vista llista mostra els recursos en seqüència, sense cap jerarquia.
En OpenERP tenim una gran quantitat de vista llista com, per exemple, en accedir
a l’accés directe Clients, en el qual se’ns presenta els clients en vista llista.
OpenERP també inclou exemples de vista arbre; un exemple el trobem en accedir a
l’opció de menú Magatzem | Productes | Productes per categoria, com ens mostra
la figura 2.17.
Sistemes de gestió empresarial 73 Sistemes ERP-CRM. Explotació i adequació - I
Figur a 2.1 7. Exemple de vista en arbre, amb desplegable per escollir el recurs de primer nivell de la
jerarquia
La vista arbre de la figura 2.17 presenta un desplegable que ens permet escollir
entre les categories de primer nivell (Tots els productes, Productes negociables,
Altres productes). La figura 2.17 mostra la jerarquia de categories per sota de Tots
els productes. En executar l’opció de menú, per a Tots els productes únicament
se’ns presenten les dues categories filles: Privat i Vendible. La categoria Vendible,
com que té categories filles, va precedida d’un símbol en forma de triangle amb
vèrtex cap a la dreta que, en prémer-lo, desplega les categories filles: Complements
d’ordinador i Serveis. I així successivament. L’elecció de qualsevol de les Símbol utilitzat en les vistes arbre
1 <field name="type">tree</field>
1 <field name="field_parent">camp_one2many</field>
Les vistes arbre/llista són més simples que les vistes formulari i tenen menys
opcions. De manera similar a les vistes formulari, incorporen en la seva estructura
elements field. La taula 2.5 recull els atributs que poden acompanyar l’element
arrel tree.
Sistemes de gestió empresarial 74 Sistemes ERP-CRM. Explotació i adequació - I
Atribut Significat
1 class product_category(osv.osv):
2 ...
3 _name = "product.category"
4 _description = "Product Category"
5 _columns = {
6 ...
7 ’parent_id’:
8 fields.many2one(’product.category’, ’Parent Category’,
9 select=True, ondelete=’cascade’),
10 ’child_id’:
11 fields.one2many(’product.category’, ’parent_id’,
12 string=’Child Categories’),
13 ...
Quan accedim a Productes (ja sigui amb la drecera o des de l’opció de menú), apareixen
els productes en vista llista. La majoria dels productes apareixen de color negre, però n’hi
ha alguns en vermell i alguns en blau. Això és a causa que s’està utilitzant l’atribut colors
en la definició de l’element tree.
1 <record id="product_product_tree_view"
2 model="ir.ui.view">
3 <field name="name">product.product.tree</field>
4 <field name="model">product.product</field>
5 <field name="type">tree</field>
6 <field eval="7" name="priority"/>
7 <field name="arch" type="xml">
8 <tree
9 colors="red:virtual_available<0;
10 blue:virtual_available>=0 and
11 state in (’draft’,’end’,’obsolete’);
12 black:virtual_available>=0 and
13 state not in (’draft’,’end’,’obsolete’)"
14 string="Products">
15 <field name="default_code"/>
16 <field name="name"/>
17 <field name="categ_id" invisible="1"/>
18 <field name="variants"
19 groups="product.group_product_variant"/>
20 <field name="uom_id" string="UoM"/>
21 <field name="type"/>
22 <field name="qty_available"/>
23 <field name="virtual_available"/>
24 <field name="lst_price"/>
25 <field name="price"
26 invisible="not context.get(’pricelist’,False)"/>
27 <field name="standard_price" groups="base.group_extended"/>
28 <field name="state" groups="base.group_extended"/>
29 <field name="company_id"
30 groups="base.group_multi_company"
31 invisible="1"/>
32 </tree>
33 </field>
34 </record>
Si voleu que la llista sigui editable només heu d’afegir l’atribut editable a l’element tree,
amb el valor top o bottom segons vulgueu que els nous registres s’afegeixin per dalt o per
baix. Podeu comprovar-ho, de manera ràpida, modificant la vista des del client web.
Els ginys one2many i many2many emprats en les vistes form mostren la informació
de la vista llista associada als objectes referenciats pels camps one2many i
many2many.
Però, i si volem mantenir la vista llista sota una determinada estructura i, en canvi, ens
interessa que en un camp one2many o many2many la visualització sigui diferent?
L’element tree també s’utilitza per modificar l’estructura dels ginys one2many i
many2many en una vista form. Per aconseguir-ho, a l’element field corresponent
al camp one2many o many2many se li ha d’afegir un element fill tree, que haurà
de contenir els elements fields que es vulguin visualitzar en el giny. És a dir,
mentre que el funcionament automàtic dels ginys one2many i many2many mostra
la vista llista associada a l’objecte referit en el camp one2many i many2many, amb
l’element tree podem alterar-la i mostrar aquells camps que interessi i amb les
característiques adequades (ordre, color...).
Cal tenir en compte, també, que si en un element tree explicita una columna
one2many o many2many, OpenERP hi visualitzarà el nombre de recursos (regis-
tres) que en aquell moment estan referenciats.
Ens proposem millorar les vistes tree del mòdul school vigent (versió school_05).
En la vista llista dels professors fem que els professors amb contract ’named’ es
visualitzin de color blau i els professors amb contract ’trainee’ es visualitzin de color
verd.
Com a exemple, fixem-nos que en la situació actual del mòdul school (versió 06)
en editar un professor, l’apartat de detall Courses no és editable a la pròpia graella
i, per tant, quan editem un dels cursos existents o creem un nou curs, se’ns obre la
vista form de manteniment dels cursos, en la qual el camp Professor és editable.
Això suposa un problema greu, ja que si hem arribat a aquest manteniment des de
l’edició d’un professor, és clar que el camp Professor no ha de ser modificable i,
en crear un curs, el camp Professor ja ha d’aparèixer emplenat amb el valor del
professor pel que estem creant els cursos.
Les vistes calendari per a un objecte d’OpenObject són possibles quan l’objecte
conté camps date o datetime que permeten situar cada recurs en un interval de
Sistemes de gestió empresarial 78 Sistemes ERP-CRM. Explotació i adequació - I
La figura 2.19 mostra un exemple de vista calendar visualitzada des del client
GTK corresponent al calendari de cursos (objecte school.course.event) del
mòdul school. Hi podem veure, a la zona esquerra, un giny corresponent al mes
actual (novembre del 2012) amb el dia actual marcat i, a sota, la llista de tots els
recursos de l’objecte school.course.event situats en aquest mes. Fixem-nos
que hi ha tres recursos, amb diferent color i amb una llegenda explicativa. A la part
dreta podem observar com el recurs 1 DAM-M10 Semestre 1 apareix en tots els
dies del mes (a causa que es desenvolupa des del 20 de setembre del 2012 fins el 19
de gener del 2013) mentre que el recurs 5 SI Opcio 1 s’ubica des del 12 fins el 16
de novembre i el recurs 6 SI Opció 2 des del 19 fins el 23 de novembre. La vista
calendari permet editar qualsevol recurs fent doble clic damunt i també permet
l’arrossegament per canviar-los d’ubicació. Així mateix, si el calendari mostra
molts recursos i la visibilitat és difícil, sempre podem seleccionar els recursos que
volem visualitzar a la llista de recursos de la part esquerra.
La visualització de les vistes calendar des del client web de la versió 6.1
d’OpenERP presenta alguna anomalia, com ara no mostrar, en un mes, els recursos
que s’han iniciat en el mes anterior. Així, per exemple, la visualització de la vista
calendar de la figura ?? des del client web, no mostra el recurs 1 DAM-M10
Semestre 1 ja que s’ha iniciat en un mes anterior. Esperem que aquest bug se
solucioni en posteriors versions.
La figura 2.20 mostra un altre exemple de vista calendar. En aquest cas es tracta
de la vista calendar per a l’objecte school.course que conté una data del curs i,
Sistemes de gestió empresarial 79 Sistemes ERP-CRM. Explotació i adequació - I
la vista, situa cada recurs en la seva data. Observem com el recurs SI està ubicat en
el dia 12 de novembre. El recurs DAM-M10, que té com a data el 20 de setembre,
lògicament no apareix en el mes de novembre.
1 <field name="type">calendar</field>
• color: per indicar el camp del model utilitzat per distingir, amb colors, els
recursos mostrats a la vista.
Sistemes de gestió empresarial 80 Sistemes ERP-CRM. Explotació i adequació - I
Els elements fills de l’element arrel calendar s’utilitzen per mostrar el seu
contingut dins la barra acolorida que ubica cada recurs dins el calendari.
Ens proposem definir dues vistes calendar en el mòdul school vigent (versió school_07 ).
1 <record model="ir.ui.view"
2 id="view_school_course_event_calendar">
3 <field name="name">school.course.event.calendar
4 </field>
5 <field name="model">school.course.event</field>
6 <field name="type">calendar</field>
7 <field name="arch" type="xml">
8 <calendar color="full_name" date_start="date"
9 date_stop="date_end">
10 <field name="id"/>
11 <field name="course_id"/>
12 <field name="name"/>
13 </calendar>
14 </field>
15 </record>
Fixem-nos que els elements fills de l’element calendar són els camps id, course_id, name,
i són els camps que es visualitzen, separats per comes, a l’interior de les barres acolorides
que mostren cada recurs dins el calendari. L’atribut color de l’element calendar conté el
camp full_name que pretén mostrar la concatenació dels camps id, nom corresponent
a course_id i name. Per aconseguir-ho, hem hagut d’ampliar el model de l’objecte
school.course.event amb el camp funcional full_name que es basa en el mètode
_full_name definit a la pròpia classe.
1 class school_course_event(osv.osv):
2 def _full_name(self, cr, uid, ids, field_name, arg, context):
3 result = {}
4 for r in self.browse(cr, uid, ids, context=context):
5 result[r.id]=str(r.id)+’\t’+str(r.course_id.name) \
6 +’\t’+r.name
7 return result
8 ...
9 _columns = {
10 ...
11 ’full_name’: fields.function(_full_name,type=’char’,
12 size=60,readonly=’True’,
13 string=’Full name’)
14 }
1 <record model="ir.ui.view"
2 id="view_school_course_calendar">
3 <field name="name">school.course.calendar</field>
El disseny de mètodes es 4 <field name="model">school.course</field>
troba al subapartat “Els 5 <field name="type">calendar</field>
mètodes”. 6 <field name="arch" type="xml">
7 <calendar color=’name’ date_start=’date’>
Podeu trobar la versió
8 <field name="name"/>
millorada del mòdul
school a l’arxiu 9 <field name="subject"/>
school_08.zip dins 10 </calendar>
l’apartat “Mòduls
11 </field>
OpenERP” dels annexos
del web. 12 </record>
Sistemes de gestió empresarial 81 Sistemes ERP-CRM. Explotació i adequació - I
Les vistes gràfic són un tipus de vista que permeten la visualització de gràfics
construïts a partir de les dades contingudes en els recursos.
1 <field name="type">graph</field>
• type: per al tipus de gràfic. Per defecte és un gràfic de sectors (figura 2.21).
Cal indicar el valor bar per un gràfic de barres verticals (figura 2.22).
A cadascun dels camps que determinen els eixos se’ls pot aplicar els atributs
següents:
• group="True", per utilitzar en el segon o tercer camp per tal d’indicar que
cal agrupar els recursos d’igual valor que hi ha en aquest camp. El primer
camp sempre actua amb group="True".
• operator, per indicar l’operador que cal utilitzar per calcular el valor en
la resta dels camps, com a conseqüència de l’agrupació indicada a l’atribut
group. Els operadors permesos són: + (suma), *(producte), **(exponent),
min i max (menor i major valors de la llista de valors de l’agrupació). Per
defecte, actua l’operador +.
La visualització de les vistes graph que utilitzen l’atribut group, des del client
web de la versió 6.1 d’OpenERP, presenta alguna anomalia. Esperem que aquest
bug se solucioni en posteriors versions.
Ens proposem definir una vista graph en el mòdul school vigent (versió school_08).
1 <record model="ir.ui.view"
2 id="view_school_course_graph">
3 <field name="name">school.course.graph</field>
4 <field name="model">school.course</field>
5 <field name="type">graph</field>
6 <field name="arch" type="xml">
7 <graph string="Percentage of hours">
8 <field name="name"/>
9 <field name="hours_total"/>
10 </graph>
11 </field>
12 </record>
Es tracta d’un gràfic de sectors (bidimensional) en el qual el camp que facilita la llegenda
(eix horitzontal en cas d’un gràfic de barres) és name de l’objecte school.course i el
camp que facilita el valor per calcular els sectors (eix vertical en un gràfic de barres) és
hours_total.
Cal tenir present que l’actual mòdul school permet tenir diversos cursos amb el mateix
nom i que el gràfic anterior agrupa els cursos amb igual name (agrupació automàtica pel
primer field de l’element graph). Si interessa no poder tenir diferents cursos amb igual
nom, cal definir una restricció d’unicitat (_sql_constraint) sobre el camp name de l’objecte
school.course. En canvi, si interessa permetre diferents cursos amb igual nom però
en el gràfic anterior no volem que s’agrupin, caldrà crear un camp function a l’objecte
school.course, que serà la concatenació dels camps id i name, i utilitzar aquest nou camp
en el gràfic en lloc del camp name. Podeu trobar la versió
millorada del mòdul
school a l’arxiu
La manera més eficient per generar gràfics estadístics sobre objectes d’OpenERP school_09.zip dins
l’apartat “Mòduls
és: OpenERP” dels annexos
del web.
El disseny d’objectes
2. Crear una vista llista i una vista gràfic sobre l’objecte estadístic. estadístics es troba a
l’apartat “Reporting & BI”
Les vistes search són una nova funcionalitat d’OpenObject des de la versió 6.0
que consisteixen en la possibilitat de personalitzar el panell de cerca en les vistes
no formulari.
Si observem qualsevol de les vistes llista del mòdul school que estem millorant,
veurem que apareix un panell de cerca similar al de la figura 2.23. Hi veiem
un desplegable Filters que ens permet afegir filtres per acotar els registres per
visualitzar i els botons Search per executar la cerca i Clear per netejar els filtres.
Aquesta vista search és la que incorpora OpenObject quan no se n’indica cap,
i incorpora el camp de filtre Professor Name perquè la vista form de la classe
school.professor té el camp name amb l’atribut select="1". OpenERP a
partir de la versió 6.0 té en compte l’atribut select quan el model no incorpora
cap vista search.
Sistemes de gestió empresarial 84 Sistemes ERP-CRM. Explotació i adequació - I
• Una zona expandible Agrupa per... que mostra el botó Venedor per facilitar
veure els registres resultants dels filtres agrupats per venedor.
1 <field name="type">search</field>
l’existència del títol. També admet l’atribut expand (valors possibles: 0/1
– per defecte: 1) per indicar si el grup ha d’aparèixer expandit (1) o no (0).
• filter: per situar un botó que permet filtrar i/o agrupar sota unes determi-
nades condicions definides en el botó.
en la qual:
• L’atribut domain serveix per indicar el filtre i és, com en les accions, una llis-
ta Python de condicions que s’enllacen amb una clàusula AND; les condici-
ons són tuples Python de tres elements: (’camp’,’condició’,’valor’).
L’element filter es pot ubicar com a fill d’un element field per indicar que
el seu filtre s’aplica específicament sobre el camp. En aquest cas, el botó és més
petit i s’adequa a l’altura d’un camp field.
Per finalitzar amb les vistes search recordeu que el nom de la vista search que es
vol utilitzar s’ha d’indicar a l’element search_view_id de l’acció window que
invoca la vista.
Fixem-nos que aquesta vista té dos grups, separats per un salt de línia (newline). A la
figura 2.24 observem perfectament el primer grup, format pels botons Clients i Proveïdors i
els camps Nom, Contactes, País, Venedor i un darrer botó enganxat al camp Venedor. Del
segon grup només se’n veu el títol Agrupat per... ja que no està expandit (expand="0").
• Els dos primers botons es corresponen a dos elements filter. Observem que la condició
del botó Clients és [(’customer’,’=’,1)] i que la condició pel botó Proveïdors és
[(’supplier’,’=’,1)].
• Els quatre camps que vénen a continuació es corresponen a elements field. El camp
user_id, que és de tipus many2one, podria portar l’atribut widget="selection" i llavors
l’usuari visualitzaria una llista desplegable.
• El darrer element, el botó petit, correspon a un element filter, fill del darrer element field,
ja que es tracta d’un filtre sobre el mateix camp user_id.
Sistemes de gestió empresarial 87 Sistemes ERP-CRM. Explotació i adequació - I
Situem-nos en el darrer grup. Si l’expandim, veurem que conté un únic botó, que es
correspon amb l’element filter string "Salesman" del codi anterior. Aquest element
no incorpora cap filtre (domain=[]) però en canvi incorpora l’atribut context amb la clau
group_by acompanyada del valor user_id que provoca que, en cas que l’usuari premi el
botó, els socis de negocis apareixeran agrupats per venedor (user_id).
Ens proposem incorporar una vista search en el mòdul school vigent (versió school_09).
• Afegir dos botons de filtre Named i Trainee per seleccionar els professors de cada tipus de
contracte.
• Afegir un camp de filtre Partner per permetre seleccionar els professors associats a un
determinat soci de negocis.
• Afegir un botó de filtre, associat al camp anterior, per permetre seleccionar els professors
associats a la companyia principal d’OpenERP.
• Afegir un camp de filtre per permetre seleccionar els professors la dedicació horària setmanal
(en hores) dels quals estigui per sobre del valor a introduir per l’usuari.
La vista és:
1 <record model="ir.ui.view"
2 id="view_school_professor_search">
3 <field name="name">school.professor.search</field>
4 <field name="model">school.professor</field>
5 <field name="type">search</field>
6 <field name="arch" type="xml">
7 <search>
8 <group>
9 <filter string="Trainees" name="contract"
10 icon="terp−personal"
11 domain="[(’contract’,’=’,’trainee’)]"/>
12 <filter string="Nameds" name="contract"
13 icon="terp−personal"
14 domain="[(’contract’,’=’,’named’)]"/>
15 <separator orientation="vertical"/>
16 <field name="partner_id">
17 <filter help="Principal Company Professors’s"
18 icon="terp−personal+"
19 domain="[(’partner_id’,’=’,1)]"/>
20 </field>
21 <field name="hours_available"
22 string="Hours per Week >="
23 operator=">="/>
24 </group> Podeu trobar la versió
25 </search> millorada del mòdul
26 </field> school a l’arxiu
school_10.zip dins
27 </record> l’apartat “Mòduls
OpenERP” dels annexos
del web.
Fixeu-vos en el domini [(’partner_id’,’=’,1)] utilitzat per filtrar els professors associats
a la companyia principal d’OpenERP. Aquest filtre funciona perquè la companyia principal
sempre és la primera inserció a res_partner i, en conseqüència, sempre té id=1.
Sistemes de gestió empresarial 88 Sistemes ERP-CRM. Explotació i adequació - I
2.3 Mètodes
En ocasions, però, pot ser necessari alterar l’acció automàtica de cerca – creació
– modificació – eliminació facilitada per OpenObject i, llavors, haurem de sobre-
escriure els corresponents mètodes en les nostres classes.
• Poder definir l’acció que cal executar en modificar el contingut d’un field
Als annexos del web hi d’una vista form (atribut on_change del field)
trobareu l’annex
“Depuració de codi Python
en OpenERP”,
imprescindible a l’hora de
desenvolupar mètodes.
• Poder alterar les accions automàtiques de cerca, creació, modificació i
eliminació de recursos.
• ids: llista d’enters amb els identificadors dels recursos als quals s’aplica el
mètode
Recordem que OpenObject té, per cada classe Python, un únic objecte en memòria
per gestionar tots els recursos del model associat a la classe. Per això, un mètode
s’invoca sempre sobre l’únic objecte en memòria i rep, a través del paràmetre ids,
la llista dels identificadors dels recursos sobre els quals actuar.
Per ajudar a entendre la necessitat del paràmetre ids, obrim la vista tree de professors.
Suposem que tenim diversos professors i n’efectuem una selecció (un o més d’un)
per eliminar-los. En el moment que premem el botó Delete i confirmem l’eliminació,
OpenObject invoca el mètode unlink sobre l’únic objecte school_professor existent en
memòria i li passa la llista dels identificadors dels professors seleccionats, de manera que
el mètode unlink pot eliminar-los.
El paràmetre context és un calaix de sastre ideat per OpenObject per ficar-hi tots
aquells paràmetres que el mètode pot necessitar i que en canvi no s’ha previst en
el prototipus del mètode.
Per veure el contingut dels paràmetres uid, ids i context en algun mètode, sobreescrivim
el mètode unlink (eliminació) a la classe school.professor:
Aquest mètode unlink mostra per la consola del sistema el contingut dels paràmetres
uid, ids i context i invoca el mètode unlink de la capa ORM per procedir a l’eliminació.
Observem el contingut en cas que s’hagi seleccionat l’eliminació de 3 professors:
1 Contingut de uid : 1
2 Llista ids amb ’3’ valors:
Sistemes de gestió empresarial 90 Sistemes ERP-CRM. Explotació i adequació - I
3 ’16’
4 ’17’
5 ’18’
6 Diccionari context amb ’4’ tuples:
7 ’(’lang’, u’ca_ES’)’
8 ’(’tz’, False)’
9 ’(’uid’, 1)’
10 ’(’section_id’, False)’
L’ uid 1 és l’identificador de l’usuari que està eliminant els professors; els uids dels
professors per eliminar són 16, 17 i 18; el context conté 4 tuples: lang actiu, timezone
activa, uid i section_id.
• Mètode read
• Mètode name_get
• Mètode browse
• Mètode self.pool.get
• Mètode search
• Mètode create
• Mètode write
fields : llista de camps dels quals es vol obtenir el contingut. Per defecte, tots
els camps.
Mètode name_get
Retorna una llista de tuples (id, valor) amb la representació textual dels
recursos d’ ids. Recordem que la representació textual d’un recurs és, en principi,
el contingut del camp name (camp especial de l’atribut _columns de la classe
Python) o, si està definit, el camp indicat a l’atribut _rec_name de la classe
Python. Quan OpenObject necessita la representació textual d’un recurs, invoca
automàticament el mètode name_get.
En ocasions, pot interessar que la representació textual d’un recurs sigui el resultat
d’un determinat càlcul i llavors caldrà sobreescriure aquest mètode.
Sistemes de gestió empresarial 91 Sistemes ERP-CRM. Explotació i adequació - I
Fixem-nos que per poder generar la concatenació indicada ens cal per a cada recurs
conèixer el cognom i el nom, i per aconseguir-ho hem utilitzat el mètode read. Observem,
també, que name_get ha de retornar una llista de tuples i, per això, en invocar la funció
append de Python, en el seu interior construïm el tuple (r[’id’],...).
Per finalitzar l’exemple, comentar que sembla recomanable afegir l’atribut _order a la
classe school_student per visualitzar els estudiants ordenats per cognom.
Podeu trobar la versió
Per comprovar la visualització de la columna Full Name en la vista tree de millorada del mòdul
school a l’arxiu
school.student, cal retocar la vista. school_11.zip dins
l’apartat “Mòduls
OpenERP” dels annexos
Mètode browse del web.
Recupera els recursos de la llista ids com a llista d’objectes sobre els quals és
possible utilitzar la notació de punt per accedir a qualsevol dels seus camps i, en
el cas de camps relacionals, navegar cap als objectes apuntats. Si ids és un únic
recurs (no llista), facilita el corresponent objecte (no llista d’objectes).
Sistemes de gestió empresarial 92 Sistemes ERP-CRM. Explotació i adequació - I
Aquest és un mètode fantàstic, a causa de la potència que facilita per poder navegar
entre els objectes mitjançant els camps relacionals.
Mètode self.pool.get
self.pool.get (’nom_objecte’)
Mètode especial que permet obtenir l’objecte Python que gestiona els recursos del
model associat a qualsevol classe.
Mètode search
• order: columnes sobre les quals ordenar el resultat. Per defecte, utilitza les
columnes indicades a l’atribut _order de la definició de la classe Python i,
en el seu defecte, la columna id de tota classe Python.
Retorna una llista dels identificadors dels recursos que verifiquen els criteris de
cerca o, si count=True, el nombre de registres.
Les condicions que cal introduir en els criteris de cerca han de verificar:
1 prof = self.pool.get(’school.professor’)
2 ids = prof.search(cr,uid,[’&’,(’contract’,’=’,’named’),
3 (’name’,’ilike’,’Rodriguez’)])
1 ids = self.search(cr,uid,[’&’,(’contract’,’=’,’named’),
2 (’name’,’ilike’,’Rodriguez’)])
Per obtenir els professors el nom dels quals no contingui el text Rodríguez i que tenen
contracte named, escriuríem:
1 ids = self.search(cr,uid,[’&’,(’contract’,’=’,’named’),
2 ’!’,(’name’,’ilike’,’Rodriguez’)])
Mètode create
Crea un nou registre amb els valors especificats en el paràmetre values, de tipus
diccionari. Retorna l’identificador del registre creat.
Mètode write
Modifica els registres especificats a la llista ids, amb els valors indicats en el
paràmetre values, de tipus diccionari. Retorna True.
Mètode unlink
Els mètodes create, write i unlink són candidats a ser sobreescrits quan interes-
si alterar el seu funcionament habitual. En tal situació, la seva sobreescriptura ha
d’incloure, en algun punt, la crida als mètodes create, write i unlink de la
classe osv.osv. És a dir, la sobreescriptura de qualsevol d’aquests mètodes seria
quelcom similar a:
Les vistes form faciliten, en els camps editables, l’atribut on_change per indicar
una acció a executar quan l’usuari canvia el valor del camp. El contingut d’aquest
atribut ha de ser la crida a un mètode de la classe, amb els paràmetres que
corresponguin (normalment el nou valor que ha pres el camp i, eventualment,
valors d’altres camps).
i ha de retornar, sempre:
1 <field name="address_id"
2 on_change="address_id_change(address_id)"/>
Així, en canviar l’adreça del professor, el telèfon canvia automàticament, sense haver
d’esperar a enregistrar el canvi. En cas de deixar el professor sense adreça, el telèfon
hauria de passar a estar en blanc. Aquest és el funcionament correcte des del client GTK,
però en el client web d’OpenERP v.6.1 no funciona.
Podeu trobar la versió
millorada del mòdul
school a l’arxiu
school_12.zip dins
Per finalitzar amb els mètodes on_change, considerem la següent situació com-
l’apartat “Mòduls plexa. Suposem una vista form A des de la qual s’invoca una altra vista form B en
OpenERP” dels annexos
del web. què un atribut on_change invoca un mètode al qual s’ha de passar algun(s) valor(s)
del formulari B (cap problema) i l’identificador del recurs actiu en el formulari A.
Per solucionar aquesta situació, OpenObject ens facilita la sintaxi parent.id. En
els mòduls OpenERP de la versió 6.1, aquesta situació únicament es presenta en
dos mòduls:
Sistemes de gestió empresarial 95 Sistemes ERP-CRM. Explotació i adequació - I
Índex
Introducció 5
Resultats d’aprenentatge 7
2 Reporting & BI 29
2.1 Reporting extern a l’ERP: JasperReports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1.1 Instal·lació i configuració de JasperReports Server Community 5.0 . . . . . . . . . . . 32
2.1.2 Utilització d’iReport Designer 5.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.2 Reporting en OpenERP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.2.1 Disseny d’informes RML a través d’OpenOffice/LibreOffice . . . . . . . . . . . . . . 44
2.2.2 Disseny d’informes JRXML a través d’iReport Designer . . . . . . . . . . . . . . . . 50
2.3 Solucions BI en OpenERP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
2.3.1 Vistes basades en objectes no persistents . . . . . . . . . . . . . . . . . . . . . . . . 54
2.3.2 Quadres de comandament . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Sistemes de gestió empresarial 5 Sistemes ERP-CRM. Explotació i adequació - II
Introducció
5. El llenguatge Python.
Per tal d’assolir un bon aprenentatge, cal estudiar els continguts en l’ordre indicat,
sense saltar-se cap apartat. Quan es fa referència a algun annex del web, adreçar-
s’hi i estudiar-lo. Una vegada estudiats els continguts del material paper i del
material web, cal desenvolupar les activitats web.
Sistemes de gestió empresarial 7 Sistemes ERP-CRM. Explotació i adequació - II
Resultats d’aprenentatge
1.1 Herència
Per últim, comentar que el fitxer __openerp__.py d’un mòdul que contingui
herència respecte altres mòduls n’haurà d’incloure els noms a l’apartat depends,
per garantir que, en instal·lar el mòdul que hereta, els mòduls dels quals s’hereta
ja estiguin instal·lats o s’instal·lin prèviament.
1 _inherit = ’nom.objecte.del.que.es.deriva’
2 _inherits = {’nom.objecte1’:’nom_camp_FK1’, ...}
L’herència de classe la trobem en molts mòduls que afegeixen dades i mètodes a objectes
ja existents, com per exemple, el mòdul comptabilitat (account) que afegix dades i mètodes
a l’objecte res.partner. Fixem-nos en el contingut del mòdul account:
1 class res_partner(osv.osv):
2 _name = ’res.partner’
3 _inherit = ’res.partner’
4 _columns = {
5 ...
6 ’debit_limit’: fields.float(’Payable limit’),
7 ...
Podeu comprovar que la taula res_partner d’una empresa sense el mòdul account
instal·lat no conté el camp debit_limit, que en canvi sí que hi apareix una vegada instal·lat
el mòdul.
L’herència per prototip és difícil de trobar en els mòduls que incorpora OpenERP. Un
exemple el tenim en el mòdul base_calendar en el qual podem observar el mòdul
comptabilitat (account) que afegix dades i mètodes a l’objecte res.partner. Fixem-nos
en el contingut del mòdul account:
1 class res_alarm(osv.osv):
2 _name = ’res.alarm’
3 ...
4 class calendar_alarm(osv.osv):
5 _name = ’calendar.alarm’
6 _inherit = ’res.alarm’
7 ...
En una empresa que tingui el mòdul base_calendar instal·lat podeu comprovar l’existència
de la taula res_alarm amb els camps definits a l’apartat _atributs de la classe res_alarm
i la taula calendar_alarm amb camps idèntics als de la taula res_alarm més els camps
definits a l’apartat _atributs de la classe calendar_alarm.
L’herència per delegació no és molt utilitzada en els mòduls que incorpora OpenERP. Un
exemple el trobem en el mòdul product en el qual l’objecte product.product deriva per
delegació de l’objecte product.template:
1 class product_template(osv.osv):
2 _name = "product.template"
3 ...
4 class product_product(osv.osv):
5 _name = "product.product"
6 _inherits = {’product.template’: ’product_tmpl_id’}
7 _columns = {
8 ...
9 ’product_tmpl_id’:
10 fields.many2one (’product.template’, ’Product Template’,
11 required=True, ondelete="cascade"),
12 ...
Tot i que _inherits està pensat per possibilitar l’herència múltiple, en aquest cas l’objecte
product.product únicament deriva de l’objecte product.template. A nivell de la base
de dades, la taula product_template conté els camps definits a l’atribut _columns de
l’objecte template.product i la taula product_product conté els camps definits a l’atribut
Trobareu el mòdul
delegation_inheritance _columns de l’objecte product.product, entre els quals hi ha el camp producte_tmpl_id,
dins l’apartat “Mòduls de tipus many2one, utilitzat en la declaració de l’herència a _inherits. Cada recurs de
OpenERP i fitxers
auxiliars” dels annexos del product.product penja obligatòriament d’un recurs de product.template i per un recurs
web. de product.template podem tenir diversos recursos de product.product que hi pengin.
Sistemes de gestió empresarial 13 Sistemes ERP-CRM. Explotació i adequació - II
Feu una ullada a la definició de les classes i comproveu els següents funcionaments.
La vista tree, que és editable, permet afegir recursos a l’objecte subclass. Fixeu-vos
que les dues primeres columnes corresponen a continguts dels objectes superclass1 i
superclass2 i que per cada registre que afegim a través d’aquesta vista es genera un
registre a cadascuna de les taules: di_subclass, di_superclass1 i di_superclass2, de
manera que el recurs de di_subclass referencia als altres recursos.
Per esborrar un camp d’una vista s’utilitza un element buit amb l’atribut
position="replace":
Per afegir camps dins de l’element especificat d’una vista s’utilitzen els valors
inside, after o before. Les següents plantilles mostren com s’inseriria
nou_camp abans i després de camp:
Per efectuar canvis en més d’un lloc, cal combinar les plantilles anteriors dins un
element data:
1 <field name="arch"type="xml">
2 <data>
3 <field name="camp1" position="after">
4 <field name="nou_camp1"/>
5 </field>
6 <field name="camp2" position="replace"/>
7 <field name="camp3" position="before">
8 <field name="nou_camp3"/>
9 </field>
10 </data>
11 </field>
Per últim, s’ha decidit que no és necessari incorporar un formulari específic per
donar d’alta els colors ni una opció de menú a l’apartat de configuració, ja que en el
Sistemes de gestió empresarial 16 Sistemes ERP-CRM. Explotació i adequació - II
La figura 1.2 correspon a una sessió de l’usuari admin en la qual podem observar
que hi ha set mòduls instal·lats, corresponents a les pestanyes de la part superior,
més l’opció Settings. Observem com la pestanya Permisos d’accés conté set
apartats a la zona Application, un per cada mòdul instal·lat excepte pel mòdul
Sistemes de gestió empresarial 17 Sistemes ERP-CRM. Explotació i adequació - II
School. Les zones Usability i Altre tampoc tenen cap referència al mòdul School.
Si obrim una sessió amb l’usuari demo comprovarem que no li apareix el mòdul
School, tot i estar instal·lat a l’empresa.
F ig ur a 1. 3. Grups de privilegis definits per als mòduls instal·lats en una empresa d’OpenERP
• Fitxer XML que conté la definició dels grups (i de forma opcional: usuaris,
menús i regles de negoci assignats a cada grup) que acostuma a anomenar-se
nomModul_security.xml.
• Fitxer CSV que conté els privilegis de cada grup sobre els diferents objectes
del mòdul i que s’anomena obligatòriament ir.model.access.csv. Aquest
fitxer podria ser en format XML (llavors podria tenir qualsevol nom), però,
a causa que la informació que conté es correspon amb el contingut d’una
taula que sempre té el mateix format, és molt més senzill que sigui CSV ja
que es pot emplenar ràpidament amb qualsevol full de càlcul.
L’atribut noupdate de l’element data acostuma a tenir el valor 1 per indicar que
en cas d’actualització de mòdul no s’instal·li l’esquema de seguretat que incorpora
el mòdul, ja que podria sobreescriure l’esquema configurat per l’administrador
de l’empresa, i el valor 0 per tal que s’instal·li sempre, sobreescrivint l’esquema
existent. En cas que hi hagi parts de l’esquema de seguretat que no s’hagin de
sobreescriure i altres que sí, es separen en dos elements data diferents, un amb
noupdate="1" i l’altre amb noupdate="0".
cosa que també es pot aconseguir des de la definició de menús. La resta de tipus
d’elements record són complicats per una introducció al disseny d’esquemes de
seguretat en OpenERP.
L’atribut id de l’element record del model res.groups, que ha de ser únic dins
el mòdul, és un identificador XML per al grup, al qual es pot fer referència des
del propi mòdul a través del seu nom o des de qualsevol altre mòdul a través de la
sintaxi nomMòdul.identificador. Els atributs id dels elements record que no
són del model res.groups poden ser nous (provocaran la creació d’un nou recurs)
o existents (provocaran la seva modificació). Si ja existeixen i estan declarats en
altres mòduls, cal introduir el nom del mòdul com a prefix: nomMòdul.idRecurs.
El valor de l’element field amb atribut name="name" és el nom del grup que es
mostra a Settings | Usuaris | Grups.
1 eval="[(4,ref(’idGrup1’)),
2 (4,ref(’idGrup2’)),
3 ...
4 ]"
L’escassa documentació
sobre les combinacions
Els grups de privilegis de cadascuna de les categories de l’apartat Application de que OpenObject facilita
per poder assignar
la figura 1.2 tenen definida aquesta relació d’inclusió. Així, a la categoria Sales recursos existents en
relacions one2many o
Management el grup User - All Leads inclou el grup User - Own Leads Only i el many2many es troba, en
OpenERP 6.1, a partir de
grup Manager inclou el grup User - All Leads. S’acostuma a anomenar Manager la línia 3807 del fitxer
pathServer/openerp/osv
el grup de privilegis que conté privilegis totals sobre tots els objectes del mòdul. /orm.py.
Si entre els grups d’una categoria es dóna una relació d’inclusió com A ⊃ B ⊃
C ⊃ ... no existirà mai la necessitat d’assignar a un usuari més d’un grup de
privilegis. En tal situació, OpenERP ubica la categoria a la que pertanyin els grups
de privilegis, a l’apartat Application (figura 1.2) en la posició que indiqui l’atribut
sequence de la categoria. En canvi, si no tots els grups de la categoria estan
relacionats sota una relació d’inclusió com A ⊃ B ⊃ C ⊃ ... OpenERP ubica
la categoria amb tots els seus grups de manera similar a la categoria Usability de
la figura 1.2 que permet assignar diversos grups a un mateix usuari. Així, si els
grups no s’assignen a cap categoria, OpenERP ubica els grups a la zona Altre de
la figura 1.2.
Sistemes de gestió empresarial 20 Sistemes ERP-CRM. Explotació i adequació - II
1 eval="[(4,ref(’idUsuari1’)),
2 (4,ref(’idUsuari2’)),
3 ...
4 ]"
1 eval="[(4, ref(’base.user_root’))]"/>
1 "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create",
"perm_unlink"
Les següents línies contenen les diverses assignacions de privilegis. Cal saber
que:
permisos totals sobre tots els objectes del mòdul i Subscriptions, amb permisos adequats
per poder assignar estudiants als cursos. Cal assignar l’usuari admin al grup Manager.
Si instal·leu la versió 13 del mòdul school podreu comprovar com a la llista de categories
sota l’apartat Application de la figura 2 hi apareix la nova categoria School amb dos grups
de privilegis (Manager i Subscriptions). Podreu comprovar que l’usuari admin té assignat
el privilegi Manager i que cap altre usuari té assignat cap privilegi.
Assigneu el grup de privilegis Subscriptions a l’usuari demo i procediu a obrir una sessió
amb aquest usuari per efectuar subscripcions d’alumnes als cursos. Observeu que,
d’entrada, només veu els menús que contenen opcions que gestionen objectes als quals té
algun privilegi d’accés: Configuration | Courses amb permís de lectura als cursos i Students
amb permisos per modificar el contingut d’estudiants i assignar-los cursos dels existents
(vegeu les dues darreres línies de privilegis del fitxer ir.model.access.csv). Observeu,
també, que per tal que el grup de privilegis Subscriptions permeti assignar cursos als
estudiants, és necessari facilitar-li permís de lectura sobre els cursos.
Podeu trobar la versió
millorada del mòdul
school a l’arxiu
school_13.zip dins
l’apartat “Mòduls
OpenERP i fitxers
auxiliars” dels annexos del
web.
1.3 Càrrega de dades
A vegades cal poder executar una càrrega massiva de dades en els objectes
d’un mòdul. Algunes d’aquestes ocasions poden ser les migracions de dades
en l’arrencada d’un OpenERP quan se substitueix un sistema informàtic; o bé la
càrrega de dades de demostració quan s’instal·la qualsevol mòdul, si en el procés
de creació de l’empresa es va indicar la càrrega de dades de demostració; i també
la incorporació de dades inicials per al funcionament del mòdul.
En tots els casos és important efectuar la càrrega a través dels mecanismes facilitats
per OpenERP i no intentar, de cap de les maneres, la introducció de dades a través
d’instruccions SQL directes a la base de dades, ja que fent-ho a través d’OpenERP
tindrem la seguretat que la lògica de negoci s’aplica en totes les operacions.
OpenERP permet preparar les dades a carregar en fitxers CSV i en fitxers XML.
La principal diferència entre ambdós mètodes és que un fitxer CSV només permet
la introducció de recursos (registres) d’un mateix objecte (taula), mentre que un
fitxer XML permet la introducció de dades que afecten a diversos objectes (taules).
Pels fitxers CSV, el nom del fitxer ha de coincidir amb el nom de l’objecte (taula)
on s’afegiran/actualitzaran els recursos (registres). La seva primera línia ha de
contenir, obligatòriament, els noms dels camps de cada columna, i les següents
línies han de contenir les dades dels recursos que s’han d’introduir. Un exemple
és el fitxer ir.model.access.csv de la carpeta security dels mòduls que incorporen
un esquema de seguretat.
Els fitxers XML segueixen una plantilla com la següent, en la qual cada element
record conté les dades d’un recurs i el model al qual pertany, podent incorporar
dades de recursos de diversos models.
Sistemes de gestió empresarial 22 Sistemes ERP-CRM. Explotació i adequació - II
Els fitxers amb dades de demostració a carregar (siguin CSV o XML) s’han
d’indicar a l’apartat demo_xml del fitxer __openerp__.py del mòdul. Els fitxers
amb dades a carregar únicament en la instal·lació del mòdul (siguin CSV o XML)
A l’apartat “Mòduls s’han d’indicar a l’apartat init_xml del fitxer __openerp__.py del mòdul.
OpenERP i fitxers
auxiliars” dels annexos del
web trobareu el fitxer Exemple de càrrega de dades de demostració en el mòdul school
school_dades.xls.
Interessa incorporar un conjunt de dades de demostració en el vigent mòdul school (versió
school_13) i el cap d’estudis d’un centre educatiu que ens vol ajudar, ens facilita informació
en el fitxer school_dades.xls, que conté:
• Un full de càlcul anomenat Organització, amb tota la informació organitzativa sobre tres
cicles formatius de la família professional d’Informàtica i comunicacions, amb els mòduls de
cada cicle, les seves hores, la seva ubicació a primer o a segon curs, el nom del professor
responsable de cada mòdul, amb el tipus de contracte (nomenat – interí) que assimilarem als
conceptes que admet el camp Contract de l’objecte Professor del mòdul school (named –
trainee). També conté dues columnes Categoria i Subcategoria corresponents al tipus de
matèria dels mòduls, que no hem d’utilitzar.
• El full de càlcul Alumnat que conté les dades dels alumnes matriculats a cadascun dels cicles
indicats en el full de càlcul anterior.
Per practicar els dos tipus de fitxers (CSV i XML) per introduir les dades de demostració,
decidim utilitzar un fitxer XML per a les dades corresponents a cursos (cada mòdul de cada
cicle el considerarem un curs) amb els seus professors i un fitxer CSV per introduir les
dades corresponents als alumnes i als cursos assignats, considerant que un alumne ha de
tenir assignats els cursos corresponents als mòduls del cicle-curs en el qual està matriculat.
Sistemes de gestió empresarial 23 Sistemes ERP-CRM. Explotació i adequació - II
En la introducció de professors, decidim que tots ells dediquen 20 hores a la docència i que
tots tenen per Associated Partner la companyia principal de l’empresa (Empresa_IOC).
La introducció de dades en el fitxer XML (professors i cursos) es pot fer manualment, amb
un editor de textos pla, i no té gaire sentit muntar cap procés que, a partir del full de càlcul
Organització generi el fitxer XML. Seria més costós muntar el procés que no pas introduir
manualment les dades. Per aconseguir assignar la companyia principal de l’empresa a
cada professor, anem a cercar al mòdul base, l’identificador XML de la companyia principal,
que resulta ser main_company.
La versió 14 del mòdul school es correspon a la versió millorada incorporant les dades de
demostració aquí descrites. Per instal·lar-la, procediu prèviament a desinstal·lar la versió
existent i instal·leu-la de nou, no actualitzant, ja que les dades de demostració només es
carreguen en el procés d’instal·lació.
Observeu com, en el fitxer CSV, destinat a incloure els estudiants, s’indica, en una columna
(course_ids:id) el conjunt de cursos que té assignat cada estudiant.
Per últim, cal comentar com seria un fitxer XML per a la inclusió dels estudiants, ja que per
cada estudiant cal introduir el conjunt de cursos assignats. El contingut hauria de seguir la
plantilla:
Els fitxers .py i XML corresponents als assistents d’un mòdul s’acostumen a
ubicar en una carpeta anomenada wizard situada dins la carpeta del mòdul. El
fitxer __init__.py del mòdul ha de contenir una sentència import wizard i la
carpeta wizard ha de contenir un fitxer __init__.py amb la sentència import per
al fitxer .py que conté les classes necessàries per a l’assistent. Els fitxers XML
de l’assistent, ubicats normalment dins la carpeta wizard, han de ser referenciats
des de l’apartat update_xml del fitxer __openerp__.py del mòdul.
Ja que els assistents defineixen una seqüència de passos, la classe que en defineix el
model acostuma a tenir el camp especial state, de tipus selection, que permet
definir els diversos estats pels quals passa l’assistent. El contingut d’aquest camp
s’acostuma a utilitzar en la vista formulari per fer visibles i/o invisibles altres
camps en funció del seu valor, de manera que l’usuari té la percepció que hi ha
una successió de pantalles quan, en molts casos, és la mateixa però amb camps
que canvien el seu estat de visibilitat.
Interessa incorporar uns assistents, en el vigent mòdul school (versió school_14), que
permeti omplir el camp First Date d’alguns cursos existents (o de tots), amb una data
introduïda per l’usuari.
En el menú School | Configuration es vol habilitar una nova opció de menú, de nom Wizards,
que contingui dues opcions:
• Assignació d’una First Date comuna per tots els cursos, que ha de permetre que l’usuari
introdueixi la data a assignar a tots els cursos existents a l’empresa, tinguin o no data
introduïda.
• Assignació d’una First Date comuna per cursos filtrant per nom, que ha de permetre que
l’usuari introdueixi la data a assignar a tots els cursos que el seu nom contingui un determinat
text introduït per l’usuari.
En qualsevol cas, el procés ha de facilitar dos botons: Cancel, per cancel·lar el procés i
Assign, per procedir a l’assignació. En cas d’executar l’assignació, l’assistent ha de mostrar
una pantalla en la qual s’informi del nombre de cursos actualitzats amb un únic botó Close
per tancar l’assistent.
La versió 15 del mòdul school es correspon a la versió millorada incorporant els assistents
indicats. Observeu que conté una carpeta wizard amb els nous fitxers .py i XML.
La versió 15 incorpora, en les vistes, a la part inferior esquerra, el camp state per tal que
puguem veure com canvia el seu valor segons el moment en el qual es troba l’assistent.
En la situació presentada, no té gaire sentit que el camp state sigui visible, però com que
en altres casos sí que en pot tenir, l’hem incorporat per a veure’n la seva utilització, amb
widget="statusbar".
Per últim, una observació important sobre el contingut dels mètodes de la classe
school_manage_course_date invocats pel botó Assign de les dues vistes. Fixeu-vos que
aquests mètodes criden en dues ocasions el mètode write:
• Una, sobre l’objecte course_obj que gestiona els recursos del model school.course,
indicant-li el conjunt de cursos a actualitzar (course_ids) i els camps a modificar (values):
1 values = {’date’:new_date}
2 course_obj.write(cr, uid, course_ids, values)
• L’altra, sobre l’objecte self, és a dir, sobre l’objecte vinculat al formulari actiu, per actualitzar
el contingut dels camps info_udpates i state del formulari i així aconseguir, en el formulari,
la transició de la pantalla en què es demana la nova data (state=’init’) a la pantalla en què
s’informa del nombre de cursos actualitzats (state=’done’):
1 values = {’state’:’done’,’info_updates’:len(course_ids),}
2 self.write(cr, uid, ids, values)
Podeu trobar la versió 15
del mòdul school (arxiu
Persistència del model dels assistents en versions 6.1 i 7.0 d’OpenERP school_15.zip) dins
l’apartat “Mòduls
La documentació d’OpenERP afirma que el model que defineix un assistent, en derivar de OpenERP i fitxers
la classe osv.osv_memory, no es fa persistent a la base de dades, com ha de ser, ja que auxiliars” dels annexos del
web.
no té cap sentit emmagatzemar les dades que l’usuari introdueix en l’assistent.
Les versions 6.1 i 7.0 d’OpenERP, però, fan persistents els models que deriven de la
classe osv.osv_memory i les corresponents taules van enregistrant els valors introduïts pels
usuaris en els assistents, fet que és totalment anòmal. Fins la versió 6.0 el funcionament
era com ho documenta OpenERP. Sembla que és un error de les versions 6.1 i 7.0, ja que
és una persistència mancada de sentit.
1.5 Traducció
Per procedir a la traducció d’un mòdul que s’hagi elaborat en anglès, cal seguir
els següents passos:
4. Per cada idioma al que vulguem traduir el mòdul, s’ha de copiar el fitxer
nomModul.pot a un fitxer isoIdioma.po dins la mateixa carpeta i18n.
Els fitxers .po són fitxers de text pla que es poden editar amb qualsevol editor de
textos. Un expert en fitxers .po podria efectuar la traducció amb qualsevol editor
de textos, però si hem generat l’exportació en un fitxer .po en lloc d’un fitxer
CSV, que és més fàcil d’editar, és perquè hi ha eines de traducció, com Poedit
(www.poedit.net) que gestionen fitxers .po i que faciliten moltes funcionalitats.
En català, la forma verbal que s’ha d’utilitzar en les situacions en les quals l’usuari s’adreça
a l’ordinador per executar alguna acció (traducció de Cancel, Exit, Close, Assign, Execute...)
és l’imperatiu en segona persona del singular (que correspon al tractament de “tu”, com per
exemple: Cancel·la, Surt, Tanca, Assigna, Executa...), mentre que en castellà és l’infinitiu
(Cancelar, Salir, Cerrar, Asignar, Ejecutar...).
En català, la forma verbal que s’ha d’utilitzar en les situacions en les quals l’ordinador
s’adreça a l’usuari per informar-lo o per fer-li alguna pregunta, és l’imperatiu en segona
persona del plural (que correspon al tractament de “vós”, com per exemple: Seleccioneu,
Voleu, Imprimiu, Assigneu...), mentre que en castellà és l’imperatiu en segona persona del
singular corresponent al tractament de “usted” (Seleccione, Quiere, Imprima, Asigne...).
Amb l’eina Poedit instal·lada, obrim el fitxer .po que interessi i procedim a la seva
traducció. La utilització de l’eina Poedit és molt simple i intuïtiva, com mostra la
figura 1.5.
Sistemes de gestió empresarial 28 Sistemes ERP-CRM. Explotació i adequació - II
• Permet marcar la traducció d’un terme com a difusa quan no n’estem con-
vençuts, de manera que en un altre moment la podem identificar fàcilment.
• Permet saber el punt del mòdul del qual s’ha extret el text, fet que en ocasions
ens pot ajudar a efectuar la traducció del terme en funció del seu context.
• Permet incorporar traduccions d’una nova versió de fitxer .pot al fitxer .po
actual, fet que és molt d’agrair quan es retoca un mòdul pel qual ja hi havia
una traducció efectuada.
Podeu trobar la versió 15
del mòdul school,
traduïda al català, en
l’arxiu school_15t.zip, dins L’eina d’extracció de textos d’OpenERP extrau, erròniament, els noms dels
l’apartat “Mòduls
OpenERP i fitxers models que es creen en els fitxers .py, que no hem de traduir.
auxiliars” dels annexos del
web.
Exemple de textos extrets per OpenERP que no es poden traduir
Si editeu amb Poedit el fitxer ca.po de l’arxiu school_15t.zip, hi veureu els textos
corresponents als models definits en el mòdul, que no s’ha traduït:
1 school.course
2 school.course.event
3 school.manage.course_date
4 school.professor
5 school.student
2. Reporting & BI
JasperReports (community.jaspersoft.com/project/jasperreports-library) és un
motor de generació d’informes molt potent, sota llicència LGPL (programari
lliure) proveït per Jaspersoft Corporation i escrit totalment en Java, que presenta
les característiques següents:
• Permet dirigir els informes cap a pantalla o cap a impressora o cap a fitxer
en múltiples formats (PDF, RTF, XML, XLS, CSV, HTML, XHTML, text,
DOCX o OpenOffice).
per generar informes. Els llenguatges Java i PHP són un exemple d’aquesta
possibilitat.
Pels programadors té molt
d’interès conèixer un motor
d’informes com
JasperReports que pot ser El motor JasperReports genera l’informe a partir d’un document que conté el
invocat des d’aplicacions
desenvolupades en disseny de l’informe i d’un origen de dades al qual es connecta per anar a cercar
diferents llenguatges.
les dades que bolca a l’informe. Ens convé, doncs, saber elaborar els documents
que contenen el disseny dels informes en el format indicat per JasperReports.
Els documents que contenen el disseny d’un informe per a JasperReports són
fitxers XML amb extensió .jrxml que podrien ser confeccionats amb qualsevol
editor de textos, en cas de ser profunds coneixedors del “llenguatge JRXML”. Per
sort, en el mercat hi ha diferents eines de disseny d’informes per a JasperReports,
que permeten dissenyar els informes des d’una interfície gràfica. Una d’aques-
tes eines és iReport Designer (http://community.jaspersoft.com/project/ireport-
El motor JasperReports designer), proveït per Jaspersoft Corporation.
llegeix el fitxer .jrxml i en fa
una compilació, generant un
fitxer .jasper a partir del L’eina iReport Designer, sota llicència AGPL, facilita una interfície gràfica que
qual genera l’informe
desitjat. L’execució és més permet:
ràpida si es facilita el fitxer
JASPER.
Dissenyar informes Sí No
Una empresa que vulgui utilitzar JasperReports Server com a nucli d’informació
en el qual ubicar un conjunt d’informes i quadres de comandament de l’empresa,
amb accés diferenciat segons els usuaris, ha de seguir, com a mínim, els següents
passos:
2. Instal·lar iReport Designer en les màquines dels usuaris que hagin de poder
dissenyar informes amb aquesta eina.
– Start or Stop Services: amb les opcions per engegar o aturar els serveis
jasperreports instal·lats.
– JasperReports ServerDocumentation: que ens obre una carpeta del
sistema d’arxius en la qual ha instal·lat diversos documents.
Sistemes de gestió empresarial 34 Sistemes ERP-CRM. Explotació i adequació - II
amb permisos d’usuari final. Obriu sessió amb els usuaris jasperadmin i joeuser
per apreciar les diferents opcions disponibles en cada cas. Llegiu la documentació
que incorpora
JasperReports Server
En aquest moment, com a desenvolupadors d’informes, ens convé fer una ullada Community per obtenir un
coneixement acurat de
als exemples que conté JasperReports Server Community, per fer-nos una idea de totes les seves
possibilitats.
la tipologia d’informes que podem desenvolupar. No entrarem en qüestions pura-
ment administratives (gestió d’usuaris, rols i assignació de privilegis) destinades
als administradors del sistema.
• Nom de l’informe.
Si executeu aquest informe, que pel títol i la descripció sembla que ha de ser un llistat de
clients, veureu que correspon a un llistat de les comandes de clients, agrupades per client,
amb uns imports sumaritzats a peu de cada client.
En ser un informe de moltes pàgines, a la part superior esquerra de la interfície se’ns facilita
un control per poder moure’ns per les diferents pàgines.
La part superior dreta de la interfície mostra diversos botons, alguns activats i altres
desactivats. Entre els activats, disposem del botó Back que serveix per tirar enrere
(abandonar l’informe) i del botó Export que permet obtenir el llistat en diversos formats
(PDF, Excel, CSV, DOCx, RTF, Flash, ODT, ODS i XLSX).
La descripció d’aquest informe ens diu que es tracta d’una llista dels comptes (clients) per
empleat. Amb aquesta informació podem pensar que es tracta d’un llistat similar a l’anterior,
en el qual apareixen els clients de l’empresa agrupats per empleat.
L’execució d’aquest informe ens mostra una pantalla amb el missatge The report is empty.
Bé, podem pensar que la base de dades no té empleats introduïts. Però, a la part superior
dreta de la interfície, observem el botó Options actiu. Si el premem, ens mostra una llista
desplegable dels empleats, amb l’empleat jim seleccionat. Seleccioneu un altre empleat
Sistemes de gestió empresarial 36 Sistemes ERP-CRM. Explotació i adequació - II
i executeu de nou el llistat, prement el botó OK sota la llista desplegable. Proveu amb
els empleats jaime i matt. Per cadascun d’aquests empleats es genera el corresponent
informe.
Fixeu-vos en un greu error de disseny per aquest informe: no mostra, per enlloc, la
informació de l’empleat pel qual s’està mostrant la llista de clients. Normalment, a la
capçalera de l’informe s’introdueix informació explicativa sobre el contingut de l’informe,
així com el moment temporal (data i hora) en la qual l’informe ha estat generat.
Aquest informe, pel seu nom, sembla que ha de ser un simple llistat dels empleats de
l’empresa i, si l’executeu, veureu que així és.
Fixeu-vos, però, en la darrera columna Accounts, que fa referència als clients que té
cada empleat, visualitzats en l’informe anterior. El valor d’aquesta columna per a cada
empleat és un enllaç anomenat view que, si el premem, ens executa l’informe anterior per
a l’empleat seleccionat. És a dir, JasperReports Server proporciona navegabilitat entre
informes.
La descripció d’aquest informe ens diu que conté input controls (camps de filtre) i per això
és del nostre interès.
En executar-lo, sense aparèixer cap camp de filtre, se’ns mostra una determinada
informació. A la part superior dreta de la interfície observem el botó Options actiu. Si
el premem, s’obre la finestra Input Controls amb tres possibilitats de filtre:
En executar aquest informe, a la part esquerra de la interfície apareix la zona Options que
permet efectuar una selecció en cascada.
En segon lloc, una llista multiselecció d’estats, en la qual només apareixen els estats dels
països seleccionats en l’anterior camp de filtre.
En tercer lloc, una llista desplegable per seleccionar un client, en la qual només apareixen
els clients dels estats seleccionats en l’anterior camp de filtre.
L’informe mostra, pels estats seleccionats, els primers quinze clients incloent-hi el client
indicat en el tercer camp de filtre, malgrat que no estigui entre els primers quinze clients.
L’eina iReport Designer és la que utilitzarem per dissenyar informes que posterior-
ment pujarem al servidor JasperReports Server. Aquesta eina pot estar instal·lada
a qualsevol màquina. És una aplicació Java que necessita disposar d’un entorn
JDK de Java per al seu funcionament.
Sistemes de gestió empresarial 37 Sistemes ERP-CRM. Explotació i adequació - II
Definició d’un Report Datasource per connectar amb la base de dades Empresa_IOC
del servidor OpenERP
Es desitja utilitzar iReport Designer per obtenir informes sobre la base de dades
Empresa_IOC del servidor OpenERP i, per aquest motiu, ens cal definir, dins l’iReport
Designer, el connector Report Datasource adequat.
iReport Designer ens permet deixar enregistrada la contrasenya, de manera que no ens la
demani en les successives ocasions en què la necessiti, però ens avisa del perill que hi ha
ja que la contrasenya no queda encriptada. Tot i així, com que no estem en un entorn real
de producció, és aconsellable deixar-la enregistrada ja que del contrari iReport Designer
ens demanarà la contrasenya contínuament.
La pantalla que ens permet introduir aquestes dades, facilita un botó Test per comprovar la
connectivitat del nou Datasource.
Cal tenir present que els diversos informes d’una organització han de seguir la
imatge corporativa (disseny similar, amb logo de l’empresa a la capçalera de
l’informe) i no hem d’oblidar-nos:
• Columnes: nom, contracte, nombre d’hores que treballa setmanalment, telèfon, correu
electrònic i adreça (carrer, codi postal i ciutat).
• Data i hora d’execució del llistat a la part superior esquerra de cada pàgina.
• Número de pàgina acompanyat del total de pàgines a la part superior dreta de cada pàgina.
Per comprovar l’execució de l’informe des d’iReport Designer, heu de tenir seleccionat un
Datasource que apunti a la base de dades d’OpenERP en la qual teniu instal·lat el mòdul
school. A més, el logo de l’informe (fitxer LogoIOC.png) ha de residir a la mateixa carpeta
en la qual estigui ubicat l’informe.
Observeu que l’execució de l’informe provoca la generació d’un fitxer compilat anomenat
nomInforme.jasper.
Sistemes de gestió empresarial 39 Sistemes ERP-CRM. Explotació i adequació - II
• Tot i que iReport Designer permet indicar ordenacions dels registres, és millor indicar la
clàusula ORDER BY a la sentència SQL, ja que del contrari, el motor JasperReports ha
d’esperar a tenir tots els registres que li subministra l’SGBD per efectuar-ne una ordenació
en memòria i posteriorment confeccionar l’informe. En canvi, si l’SGBD facilita els registres ja
ordenats, el motor d’informes pot anar confeccionant l’informe malgrat que no tingui tots els
registres.
Les eines de reporting poden facilitar dos mecanismes de disseny per aconseguir
informes mestre-detall:
• Per a cada professor interessa visualitzar la seva informació personal i la relació de cursos
que imparteix.
• Informació personal d’un professor: nom, contracte, nombre d’hores que treballa
setmanalment, telèfon, correu electrònic i adreça (carrer, codi postal i ciutat).
• Data i hora d’execució del llistat a la part inferior esquerra de cada pàgina.
L’informe demanat es pot plantejar de dues formes: una, amb un únic informe que
contingui una sentència SQL que proporcioni les files resultants d’un join entre les taules
school_professor i school_course, de manera que l’informe incorpori la definició d’un
Sistemes de gestió empresarial 40 Sistemes ERP-CRM. Explotació i adequació - II
grup per professor; l’altra, amb un informe encarregat de mostrar els professors, que
incorpori un subinforme amb els cursos del professor.
Per incorporar un grup en un informe JasperReports, ens situem en el node principal del
report (Report Inspector), premem el botó secundari del ratolí i en el menú contextual
seleccionem l’opció Add Report Group i indiquem qualsevol dels camps que han d’anar en
el grup. Això provoca que apareguin dues bandes (capçalera i peu) pel grup. Hi ubiquem
els camps adequats. Si interessa, en les propietats del grup indiquem que comenci en una
nova pàgina.
• ID: nom que ens permeti identificar el servidor, ja que podem tenir connexions establertes
amb diversos servidors.
Si la connexió s’estableix sense problema, veurem que ens mostra la mateixa informació
que visualitzem des de l’apartat View|Repository de la interfície web. Quan ens situem
Sistemes de gestió empresarial 41 Sistemes ERP-CRM. Explotació i adequació - II
damunt del nom del servidor i, premem el botó secundari del ratolí, ens apareix un menú
contextual amb diverses possibilitats, entre les quals ens interessa l’opció Add.
L’opció Add apareix en els menús contextuals de gairebé tots els apartats que conté el
repositori i l’executarem allà on ens interessi afegir elements. En la creació de qualsevol
element, cal assignar-li un identificador (alfanumèric sense espais ni caràcters especials),
un nom i, de forma opcional, una descripció. El nom i la descripció podran canviar en
qualsevol moment, però l’identificador restarà immodificable per sempre més.
Per ser organitzats, el primer que farem és crear una nova carpeta a l’arrel del repositori,
de nom Empresa IOC en el qual ubicarem tots els informes.
Per últim, situats a la carpeta Empresa IOC, procedim a afegir els tres informes, un a un,
assignant-los un ID i un nom. El procés d’agregació d’un informe detecta altres recursos
que utilitza l’informe (imatges i subinformes, per exemple) i en proposa la càrrega a partir
del sistema de fitxers local, pujant-ne una còpia al servidor JasperReports.
Una vegada pujats els informes, ja són accessibles i executables des de la interfície web.
En moltes ocasions, els informes dissenyats han de mostrar únicament una part de
la informació que poden mostrar i, per aconseguir-ho, cal afegir filtres en els quals
l’usuari pugui introduir les dades de filtratge just abans de l’execució de l’informe.
Les dades introduïdes per l’usuari en els filtres, s’afegeixen de manera adequada
a la clàusula WHERE de la sentència SQL en la qual es basa l’informe.
• Introduir els valors possibles a introduïr per l’usuari (atòmics o llistes, fixos
o dinàmics, a partir del resultat d’una consulta SQL sobre la base de dades)
Volem retocar qualsevol dels dos informes de professors amb els seus cursos, de manera
que en executar-los aparegui una llista multiselecció que mostri els diversos professors i
permeti seleccionar els professors dels quals es vol generar l’informe.
En comprovar l’execució de l’informe des d’iReport Designer, apareix una pantalla per
tal que introduïm un valor pel paràmetre pProfessors. Si volem veure l’informe d’algun
professor, hem d’introduir el seu identificador dins la taula school_professor de la base
de dades, que podem reconèixer amb qualsevol eina que ens permeti connectar amb un
SGBD PostgreSQL (consola psql o eina pgAdmin, per exemple).
Una vegada hem comprovat la correcta execució des d’iReport Designer, volem pujar-lo
a un servidor JasperReports en el qual, evidentment, no podem pretendre que els usuaris
sàpiguen l’identificador del professor de qui vol obtenir l’informe i, en conseqüència, haurem
de definir un Input control en el servidor, de tipus llista desplegable, que mostri els profesors
de la base de dades.
El servidor JasperReport permet definir Input controls que puguin ser utilitzats en diversos
informes. D’aquesta manera, pot ser adequat disposar d’una llista desplegable amb els
professors de la base de dades. Per tal que l’usuari pugui escollir-ne un, podríem decidir
crear un Input control genèric; del contrari, la lògica ens porta a crear-lo localment en
l’informe que el necessiti.
La definició d’un Input control (genèric o local) obliga a indicar el tipus de control (hi ha
diverses possibilitats) i les característiques d’obligatorietat, només lectura i visibilitat del
control. A més, hi ha altres característiques per definir, en funció del tipus de control.
En un control Single Select Query, igual que en el nostre exemple, cal definir la Query
Resource (que també pot ser genèrica o local al control), les columnes visibles per a l’usuari
i la columna que cal tenir en compte per emplenar el paràmetre de l’informe. En el nostre
exemple, la Query Resource és una consulta similar a:
Una vegada definit l’Input control, ja s’està en condicions d’executar l’informe des de la
interfície web, tal com mostra la figura 2.2.
Fi g ura 2 .3. Pantalla que mostra els informes existents sobre un objecte d’OpenERP
Sistemes de gestió empresarial 44 Sistemes ERP-CRM. Explotació i adequació - II
• La barra de menús conté la nova opció Open ERP Report amb un conjunt
d’opcions que ens permeten dissenyar els informes.
Per iniciar el disseny d’un informe, ja sigui nou o, fins i tot, d’un informe instal·lat
en el servidor, el primer que cal fer és establir connexió amb el servidor, fet que
podem assolir amb el primer botó de la barra d’eines o amb l’opció Open ERP
Report | Server parameters. Apareix la pantalla de connexió (figura 2.4) que
intenta connectar amb un servidor a la mateixa màquina. Si el troba, no apareix el
Sistemes de gestió empresarial 45 Sistemes ERP-CRM. Explotació i adequació - II
missatge Could not connect to the server!, sinó que la llista desplegable de l’apartat
Database mostra les bases de dades existents en el servidor.
Fig ur a 2 . 4. Pantalla de connexió des de Writer cap a un
servidor OpenERP
Una vegada introduït el valor adequat a l’apartat Server URL, s’estableix connexió
amb el servidor OpenERP i se selecciona la base de dades que correspongui,
indicant un usuari i contrasenya adequats per l’empresa. Si l’empresa selec-
cionada no ha tingut mai una connexió des de Writer, apareixerà l’error de
la figura 2.5, que ens indica que a l’empresa ha d’existir el grup d’usuaris
OpenOfficeReportDesigner, al qual hauran de pertànyer els usuaris de l’em-
presa amb permís per dissenyar informes.
Una vegada tenim establerta una connexió, podem optar per crear un nou informe
(Open ERP Report | Open a new report) o modificar un informe del servidor (Open
ERP Report | Modify Existing Report). En escollir l’opció de modificació, al cap
d’uns segons, ens apareix una pantalla amb tots els informes RML existents en el
servidor i ens permet seleccionar-ne qualsevol, per modificar-lo i, posteriorment,
tornar-lo a enviar al servidor. Abans, però, de modificar-ne cap, ens convé conèixer
l’estructura dels informes RML generats amb Writer i, n’aprendrem tot creant nous
informes.
Sistemes de gestió empresarial 46 Sistemes ERP-CRM. Explotació i adequació - II
Volem dissenyar un informe dels professors pel mòdul school d’OpenERP, amb les
següents característiques:
• Columnes: nom, contracte, nombre d’hores que treballa setmanalment, telèfon, correu
electrònic i adreça (carrer, codi postal i ciutat).
Per aconseguir-ho, creem un nou informe amb l’opció Open ERP Report | Open a new
report i ens apareix una llista dels objectes existents a l’empresa i seleccionem l’objecte
school.professor (al capdavall de la llista). Amb aquesta acció hem indicat que l’informe
està vinculat a l’objecte school.professor, però no apareix res en pantalla. Aquest vincle
queda a nivell intern i el podem veure a Fitxer | Propietats | Propietats personalitzades |
Informació 4. Observeu, també, en les propietats personalitzades, el servidor OpenERP al
que us connecteu (Informació 1) i l’usuari (Informació 2).
L’acció següent és definir un bucle (opció Open ERP Report | Add a loop) ja que tot informe
es basa en un bucle sobre el recursos de l’objecte que l’usuari seleccionarà en el moment
d’executar l’informe. En executar aquesta opció, ens apareix una pantalla en la qual hem
de seleccionar l’objecte sobre el qual es basa el bucle (school.professor) i el camp sobre
el qual iterarà el bucle, que en aquest cas, és objects (no se’ns facilita altra possibilitat),
com mostra la part esquerra de la figura 2.6. Una vegada escollit objects, en el document
en el qual estem dissenyant l’informe apareix el codi:
1 |−.professor.−|
El text anterior indica un bucle i es correspon a una instrucció de RML. Les instruccions
RML s’escriuen entre dobles claudàtors i el connector instal·lat en Writer ens permet veure
la visualització amb claudàtors tot seleccionant el corresponent botó de la barra d’eines o
amb l’opció Open ERP Report | Conversions Fields -> Brackets. Si ho fem, veurem com el
codi anterior canvia per:
1 [[repeatIn(objects,’professor’)]]
La instrucció anterior indica que s’executarà un procés iteratiu sobre tots els recursos de
l’objecte school.professor (camp Informació 4 de les propietats personalitzades del fitxer
ODT) i la paraula professor és un àlies per referir-nos a cada recurs. Podem, si voleu,
posar un nom més curt, com prof o pr.
A continuació hem de seleccionar els camps que ens interessa obtenir a cada iteració, i això
ho fem amb l’opció Open ERP Report | Add a field que ha de presentar-nos una pantalla
com la part dreta de la figura 2.6, en la qual es facilita la llista dels camps accessibles des
de l’objecte school.professor (triga a facilitar-se, cal tenir paciència) i com que aquest
objecte conté camps many2one, OpenERP facilita els camps accessibles a través dels
objectes referenciats pels camps many2one, fet que ens va molt bé per poder seleccionar
correu electrònic i adreça. Seleccionem els camps:
1 [[ professor.name ]]
2 [[ professor.contract ]]
3 [[ professor.hours_available ]]
4 [[ professor.phone ]]
5 [[ professor.address_id.email ]]
6 [[ professor.address_id.street ]]
7 [[ professor.address_id.zip ]]
8 [[ professor.address_id.city ]]
La selecció dels camps no és obligatori fer-la a través d’Open ERP Report | Add a field i
podem escriure’ls directament tenint en compte la sintaxi a utilitzar.
Per ubicar correctament els camps en columnes d’un llistat, ens cal crear una taula
de 8 columnes i ubicar cada camp en una columna. El camp corresponent al bucle
Sistemes de gestió empresarial 47 Sistemes ERP-CRM. Explotació i adequació - II
En la solució facilitada, observeu el camp [[time.ctime()]] que mostra la data i hora del
sistema en el moment d’execució de l’informe. Trobareu una possible
solució en el fitxer
F igur a 2. 6. Pantalles de Writer per seleccionar l’objecte sobre el qual s’itera i els camps a visualitzar professors.odt dins
l’apartat “Mòduls
OpenERP i informes” dels
annexos del web.
• Report name: per introduir el nom amb el qual l’informe apareixerà en els
clients web i GTK.
• Select Rpt. Type: per seleccionar la sortida del fitxer, que pot ser PDF, ODT
o HTML (normalment PDF).
Volem dissenyar un informe mestre-detall de professors amb els cursos que imparteixen,
pel mòdul school d’OpenERP, amb les següents característiques:
• Per a cada professor interessa visualitzar la seva informació personal i la relació de cursos
que imparteix.
• Informació personal d’un professor: nom, contracte, nombre d’hores que treballa
setmanalment, telèfon, correu electrònic i adreça (carrer, codi postal i ciutat).
1 [[ professor.name ]]
2 [[ professor.contract ]]
3 [[ professor.hours_available ]]
4 [[ professor.phone ]]
5 [[ professor.address_id.email ]]
6 [[ professor.address_id.street ]]
7 [[ professor.address_id.zip ]]
8 [[ professor.address_id.city ]]
La zona de línies conté la informació dels cursos que imparteix el professor, basat en
un bucle sobre els recursos accessibles des del camp professor.course_ids. Podem
introduir aquest bucle escrivint [[repeatIn(professor.course_ids,’course_ids’)]] o
executant Open ERP Report | Add a loop, fet que ens mostra tots els camps many2one
i many2many de l’objecte school.professor, camps susceptibles de proporcionar nous
bucles. La línia prèvia a la taula que conté la definició del bucle està formatada amb
lletra de mida 2 (mínim possible en Writer), per tal que ocupi el mínim d’espai possible
en l’informe.
La definició del bucle course_ids ha d’estar abans que la taula que conté els camps
accedits a través de course_ids, i ambdós (bucle i taula) cal ubicar-los en una secció.
En l’exemple que es proposa, s’ha creat una secció anomenada Courses (el nom pot ser
qualsevol, però millor introduir un nom amb significat adequat).
El bucle a través del camp professor.course_ids ens permet incorporar les dades dels
cursos en una taula amb tres columnes:
part de cap mòdul i és molt possible que els desenvolupadors de mòduls vulguin
dissenyar informes que s’instal·lin a l’empresa quan s’instal·la el mòdul. En aquest
cas, els informes cal dissenyar-los en llengua anglesa, com la resta del mòdul, ja
que el mecanisme de traducció d’OpenERP també té en compte els textos dels
informes RML.
• Nom del servei: amb el nom que OpenERP ha de proposar pel fitxer que
generi la impressió.
En el nou recurs cal afegir-hi els fitxers necessaris per executar l’informe: fitxer
JRXML de l’informe, fitxers d’imatges inclosos a l’informe, altres fitxers JRXML
incrustats dins l’informe principal... El fitxer principal ha de portar activada la
casella Per defecte.
Una vegada enregistrat l’informe, podrem comprovar la seva aparició en els clients
web i GTK al situar-nos en el formulari que correspon a l’objecte en el qual es basa
l’informe. També podrem observar la seva existència a Settings | Personalització
Trobareu una possible | Objectes de baix nivell | Accions | Informes.
solució en el fitxer
professors.jrxml dins
l’apartat “Mòduls Disseny d’un informe de professors pel mòdul school d’OpenERP
OpenERP i informes” dels
annexos del web. També Volem dissenyar un informe dels professors pel mòdul school d’OpenERP, amb les
hi trobareu la plantilla
professors.xml utilitzada i següents característiques:
el logo LogoIOC.png.
• Columnes: nom, contracte, nombre d’hores que treballa setmanalment, telèfon, correu
electrònic i adreça (carrer, codi postal i ciutat).
• Data i hora d’execució del llistat a la part superior esquerra de cada pàgina.
• Número de pàgina acompanyat del total de pàgines a la part superior dreta de cada pàgina.
La plantilla XML per obtenir l’informe demanat s’ha generat sobre l’objecte
Trobareu una possible school.professor amb profunditat 2 ja que calia accedir a valors de l’objecte
solució en el fitxer
professor_with_courses res.partner.address apuntat pel camp address_id de school.professor.
.jrxml dins l’apartat
“Mòduls OpenERP i
informes” dels annexos Per obtenir informes Jasper amb estructura mestre-detall, cal utilitzar la definició
del web. També hi
trobareu la plantilla de grups, segons la forma habitual d’iReport Designer, i afegir la següent property
professors.xml utilitzada i
el logo LogoIOC.png. al report (node principal del report | Properties | Properties):
Sistemes de gestió empresarial 53 Sistemes ERP-CRM. Explotació i adequació - II
1 Name: OPENERP_RELATIONS
2 Value: [’nomCamp_One2Many_o_Many2Many’]
Disseny d’un informe mestre-detall de professors amb els cursos que imparteixen,
pel mòdul school d’OpenERP
Volem dissenyar un informe mestre-detall de professors amb els cursos que imparteixen,
pel mòdul school d’OpenERP, amb les característiques següents:
• Cada professor ha de començar en una nova pàgina i han d’aparèixer ordenats per nom.
• Per a cada professor interessa visualitzar la seva informació personal i la relació de cursos
que imparteix.
• Informació personal d’un professor: nom, contracte, nombre d’hores que treballa
setmanalment, telèfon, correu electrònic i adreça (carrer, codi postal i ciutat).
• Data i hora d’execució del llistat a la part inferior esquerra de cada pàgina.
1 Name: OPENERP_RELATIONS
2 Value: [’course_ids’]
1 <record model="ir.ui.view"
2 id="view_school_professor_graph">
3 <field name="name">school.professor.graph</field>
4 <field name="model">school.course</field>
5 <field name="type">graph</field>
6 <field name="arch" type="xml">
7 <graph string="Number of courses by professor">
8 <field name="prof_id"/>
9 <field name="id" operator="count"/>
10 </graph>
11 </field>
12 </record>
Una altra possibilitat de solució és crear una classe no persistent, basada en una vista de
PostgreSQL, que ens faciliti el càlcul desitjat, i desenvolupar la vista graph sobre la nova
classe.
La solució també incorpora un parell de vistes (tree i graph) dins el fitxer school_view.xml i
l’acció i opció de menú adequades per poder invocar les vistes. Si voleu, podeu incorporar-
hi vistes search per facilitar les recerques.
• En el client web, queden situades, inicialment, una sota l’altra dins la zona
a la qual han estat assignades. L’usuari les pot reubicar amb el mecanisme
drag & drop, i disposa d’un botó reset per tornar a la ubicació original.
De fet, no s’ubiquen vistes, sinó accions (que han d’existir) que invoquen una o
diverses vistes. En cas que l’acció invoqui diverses vistes (apartat view_mode
amb diverses opcions tree, form, graph...):
• El client GTK mostra, per cada acció, la primera de les vistes que indica
l’apartat view_mode de l’acció i presenta un botó que permet anar alternant
amb les altres vistes definides a l’apartat view_mode.
• El client web mostra, per cada acció, la primera de les vistes que indica
l’apartat view_mode de l’acció i no permet navegar pels diferents tipus de
vista definits a l’apartat view_mode.
Suposem que l’usuari vol crear un quadre de comandament que incorpori la vista tree dels
professors i la vista graph del nombre de cursos per professor. Fixem-nos que es tracta de
dues vistes sobre diferents objectes d’OpenERP.
Executem l’opció Settings | Personalització | Informe | Definició taulell per crear un nou
quadre de comandament i emplenem els camps:
• Vista taulell: en blanc, que crearà una vista amb el mateix nom que l’indicat a Taulell quan
l’enregistrem.
• A la graella Vista taulell: afegim les accions que invoquen les vistes que volem visualitzar, i
n’indiquem la ubicació a l’esquerra o a la dreta de la pantalla.
Per a la vista tree dels professors no tenim cap acció que la invoqui unívocament;
disposem, però, de l’acció Professors (identificador action_school_professor) que
invoca les vistes tree i form, que ens serveix per qualsevol dels dos clients, ja que en
primer lloc està el mode tree. Seleccionem aquesta acció, la ubiquem a la zona esquerra
de la pantalla i per títol introduïm el text que es desitja que aparegui al capdamunt de la
vista (per exemple, Professors).
Sistemes de gestió empresarial 56 Sistemes ERP-CRM. Explotació i adequació - II
Per a la vista graph del nombre de cursos per professor tampoc tenim cap acció que invoqui
unívocament aquesta vista, però disposem de l’acció Nombre de cursos per professor
(identificador action_school_professor_nbr) que invoca les vistes tree i graph. Pel client
GTK ens pot servir, perquè aquest client ens permet alternar entre els diferents modes, però
el client web només permet veure la vista tree que està en primera posició i no és el que
interessa. Fem-ho, però, per veure’n el funcionament i posteriorment ja ho retocarem.
Tenim el quadre de comandament definit, però no tenim cap opció de menú per invocar-
lo. La definició del taulell incorpora un botó Crea menú que permet crear una opció
de menú que invoqui el taulell. Només cal indicar el nom de la nova opció (Quadres
de comandament) i seleccionar el menú pare (Escola, si volem que el menú principal
tingui una nova opció de menú Quadres de comandament per incloure tots els quadres
de comandament del mòdul Cursos).
Refresquem el menú i comprovem el funcionament des dels dos clients. Tal com hem
avançat, el client web no permet alternar entre les diferents vistes associades a les accions
invocades.
Per incorporar la vista view_school_professor_nbr_graph cal crear una nova acció, fet
que es pot fer en el mateix punt en el qual es selecciona l’acció a assignar al taulell. Cal
anar a modificar el taulell, eliminar de la graella l’acció Nombre de cursos per professor i
afegir una vista creant una acció que invoqui la vista desitjada.
Podeu trobar la versió 20
del mòdul school, que
incorpora una possible
solució, a l’arxiu Disseny d’un quadre de comandament en un mòdul
school_20.zip, dins
l’apartat “Mòduls Es vol incorporar, en el mòdul school, un quadre de comandament que incorpori la vista
OpenERP i informes” dels
tree dels professors i la vista graph del nombre de cursos per professor. Fixem-nos que
annexos del web.
es tracta de dues vistes sobre diferents objectes d’OpenERP.
La definició d’un quadre de comandament consisteix en crear una vista form especial, una
acció que invoqui la vista i una opció de menú que invoqui l’acció.
La vista form és especial perquè es defineix sobre el model board.board, específic per
als quadres de comandament, amb arquitectura específica com podeu comprovar a la
vista board_school_professor_01 de la solució proposada. Aquesta vista form conté
dos elements column (esquerra/dreta) en els quals cal ubicar les diverses accions que
invocaran les vistes que ha de mostrar el quadre de comandament.
Per cada acció que cal incorporar en els elements column, cal tenir en compte que:
• En l’atribut name cal indicar l’identificador numèric de l’acció que s’invoca, que és desconegut
(pot variar a cada instal·lació), però que en sabem el seu identificador XML i per això s’utilitza
la sintaxi "%(id)d" en la qual id és l’identificador XML indicat dins el fitxer XML on resideix
la declaració de l’acció.
• L’atribut view_mode permet canviar l’ordre de visualització de les vistes invocades per l’acció,
cosa que no és possible quan el quadre de comandament es crea manualment des d’un
client.
• L’atribut creatable="true" possibilita que des de la vista es pugui afegir registres, cosa que
no és possible quan el quadre de comandament es crea manualment des d’un client.
• L’atribut domain permet indicar el domini de valors sobre els quals s’executa la vista.