IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducció. Conceptes

TODO
  • Unitats organitzatives: en cada context poden ser coses diferents com departaments d'una empresa, famílies professionals d'un Institut de FP, departaments acadèmics, etc.

Requeriments

  • Servidor amb LAMP instal·lat
  • Base de dades Ldap si es vol treballar amb suport Ldap
  • CodeIgniter
  • CodeIgniter-Ion-Auth ([1],[2], vegeu Ion Auth). Important: TODO: S'utilitza una versió modificada integrada en el codi que es pot descarregar de l'aplicació ebre-inventory
  • Aplicacions de tercers/llibreries que cal instal·lar (carpeta application/third_party)
  • php-barcode: Integrat directament com a Helper de Code Igniter. S'utilitza però no cal baixa-lo
  • genbarcode: L'utilitza php-barcode. És una aplicació de línia de comandes per generar codis de barres.

Instal·lació de genbarcode

$ sudo apt-get install barcode
$ wget http://www.ashberg.de/php-barcode/download/files/genbarcode-0.4.tar.gz
$ tar xvzf genbarcode-0.4.tar.gz
$ cd genbarcode-0.4/
$ sudo apt-get install make
$ make
$ sudo make install

Enviament de correus electrònics per sendmail

Per tal de poder enviar la recuperació de paraules de pas per correu electrònics cal tenir un MTA instal·lat. A Ubuntu podeu instal·lar Postfix amb:

$ sudo tasksel

I Instal·leu el servidor de correu

Instal·lació

Llegiu primer l'apartat requeriments.

IMPORTANT: Des de l'agost de 2013, ebre-inventory no incorpora de sèrie code-igniter i per tant el pas previ és instal·lar codeigniter. Vegeu:

 Code igniter instal·lació per a múltiples aplicacions

També cal instal·lar el language pack en català seguint les passes de:

 Code Igniter traducció al català

Cal tenir un servidor amb LAMP instal·lat i un servidor Ldap si es vol utilitzar Ldap. Per instal·lar un servidor LAMP podeu executar:

$ sudo apt-get install tasksel
$ sudo tasksel install lamp-server

Vegeu LAMP, tasksel i Ubuntu Server per a més informació.

Per instal·lar un servidor Ldap us recomanem utilitzar OpenLdap. El podeu instal·lar sol seguint els passos de l'article Ldap () o podeu instal·lar un Ldap més l'aplició web Gosa. En aquest últim cas, l'aplicació installgosa seguint els passos de:

 Instal·lació d'install-gosa

NOTA: Per a més informació de com crear un servidor de gestió d'usuaris amb Ldap podeu consultar OpenFPnet. Servidor centralitzat de gestió d'usuaris

Escolliu una carpeta on fer la instal·lació, al nostre exemple:

/usr/share/ebre-inventory

La URL de l'exemple:

http://www.ebretic.com/ebre-inventory/

Com a requeriments també cal instal·lar la llibreria Ldap de PHP:

$ sudo apt-get install php5-ldap
$ sudo /etc/init.d/apache2 reload

També cal configurar Apache per tal d'apuntar la URL:

/ebre-inventory

Del vostre servidor web a la carpeta:

/usr/share/ebre-inventory

Per això poden crear un fitxer:

$ sudo joe /etc/apache2/conf.d/ebreinventory

NOTA: Si utilitzeu Virtual hosts d'Apache la configuració és lleugerament diferent

I poseu:

Alias /ebre-inventory /usr/share/ebre-inventory

I apliqueu els canvis:

$ sudo /etc/init.d/apache2 reload

Coloqueu-vos a la carpeta on voleu fer la instal·lació, per exemple:

$ cd /usr/share

Feu un clone del repositori git per obtenir la última versió:

$ sudo apt-get install git
$ sudo git clone https://github.com/acacha/ebre-inventory.git

NOTA: A la URL https://github.com/acacha/ebre-inventory es pot també obtenir un zip

.

Ara cal que instal·leu les llibreries de tercers que utilitza l'aplicació: grocery-crud, image-crud i qrcode

Aquestes llibreries s'instal·len a la carpeta application/third_party:

$ cd /usr/share/ebre-inventory/application/third_party

Heu de crear dos carpetes amb els noms grocery-crud i image-crud a on posar el codi d'estes llibreries. Es pot obtenir el codi des de les corresponents webs (fitxers zip i descomprimir) o es pot fer un clone dels repositoris git:

$ sudo git clone https://github.com/acacha/grocery-crud
$ sudo git clone https://github.com/scoumbourdis/image-crud
$ sudo git clone https://github.com/dwisetiyadi/CodeIgniter-PHP-QR-Code

NOTA: Si voleu fer modificacions a les llibreries de tercers potser preferireu fer el clone a un fork propi de github de les llibreries

Ara cal crear i configurar la base de dades:

Per crear la base de dades i l'usuari d'accés, primer obteniu una clau aleatòria:

$ mkpasswd

Per l'exemple suposem que ens dona:

6RqN5CCc1zuVE

Ara entreu al servidor de MySQL, heu de saber la paraula de pas de l'usuari root o d'un usuari amb permisos (a Debian per exemple es pot utilitzar l'usuari debian-sys-maint del fitxer /etc/mysql/debian.cnf )

$ sudo mysql -u root -p

Les comandes per crear la base de dades són:

mysql> CREATE DATABASE ebreinventory;
mysql> CREATE USER 'ebreinventory'@'localhost' IDENTIFIED BY '6RqN5CCc1zuVE';
mysql> GRANT ALL PRIVILEGES ON ebreinventory.* TO 'ebreinventory'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
mysql> exit;

o també podeu modificar el fitxer create_user_and_database.sql (poseu el password que pertoqui) i executar:

$ sudo mysql -p < create_user_and_database.sql

NOTA: Si us equivoqueu al establir la paraula de pas la podeu canviar amb:

SET PASSWORD FOR 'ebreinventory'@'localhost' = PASSWORD('cleartext password')

A l'arrel del projecte trobareu un fitxer mysql amb l'estructura:

$ cd /usr/share/ebre-inventory 
$ sudo mysql -p ebreinventory < inventory_only_structure.sql

Se us proporciona un fitxer de base de dades exemple, feu una còpia:

$ sudo cp application/config/database.php.example application/config/database.php

Ara poseu les dades de connexió al fitxer:

$ sudo joe application/config/database.php

Canvieu les dades:

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'ebreinventory';
$db['default']['password'] = '6RqN5CCc1zuVE';
$db['default']['database'] = 'ebreinventory';
$db['default']['dbdriver'] = 'mysql';

Ara cal configurar l'accés per Ldap. Teniu un fitxer d'exemple:

$ sudo cp application/config/auth_ldap.php.example application/config/auth_ldap.php

IMPORTANT: Els següents passos de configuració de Ldap "només" són necessaris per tal que funcioni l'autenticació d'usuaris per Ldap. És clar, és imprescindible que al servidor Ldap que us connecteu existeixin els usuaris adequats i que configureu els grups/rols d'accés per determinar quins permisos d'accés tindran els usuaris. Vegeu l'apartat Rols

Si voleu utilitzar el reialme d'autenticació Ldap editeu el fitxer i poseu les vostres dades de connexió al servidor Ldap:

$ sudo joe application/config/auth_ldap.php

Poseu els valors del vostre server Ldap. Un exemple:

$config['hosts'] =array('10.140.128.22');
$config['ports'] = array(389);
$config['basedn'] = 'dc=augute,dc=org';
$config['login_attribute'] = 'uid';
$config['proxy_user'] = 'cn=admin,dc=augute,dc=org';
$config['proxy_pass'] = 'PASSWORD';

canvieu les dades de l'exemple pel que us pertoqui.

IMPORTANT: Si utilitzeu git com a desenvolupadors, afegiu al fitxer .git/info/exclude els fitxers application/config/auth_ldap.php i application/config/database.php per tal d'ignorar-los per part de git. Consulteu Excloure els fitxers amb dades sensibles. És necessari fer això si feu commits al repositori git del projecte o a repositoris/forks propis sobretot si els repositoris són públics per tal d'evitar publicar dades sensibles com les paraules d'accés a les bases de dades

$ sudo joe .git/info/exclude

I afegiu les línies:

application/config/auth_ldap.php
application/config/database.php
application/logs/audit.log

NOTA: audit.log és un fitxer que guarda un registre dels accessos al sistema. No cal pujar-lo al repositori és informació diferent a cada instal·lació i a més no cal fer-la pública

Ara canvieu la URL:

$ sudo joe application/config/config.php

Canvieu:

$config['base_url']     = 'http://IP/codeigniter';

Per la vostra URL, al nostre exemple:

 $config['base_url']     = 'http://www.ebretic.com/ebre-inventory';

IMPORTANT: Modifiqueu el nom de màquina per el que correspongui en el vostre cas. Si esteu instal·lant l'aplicació a l'ordinador local poseu http://localhost/ebre-inventory

IMPORTANT: Si heu de fer commits git a repositoris remots és important que s'exclogui el fitxer config. Consulteu Git#Ignorar_canvis_a_un_fitxer_local_.28.git.2Finfo.2Fexclude.29_i_--assume-unchanged

$ sudo git update-index --assume-unchanged application/config/config.php

Finalment configureu el fitxer de configuració de l'aplicació d'inventari:

$ sudo joe application/config/inventory.php 

El més destacable es canviar el nom de la institució:

$config['institution_name']     = "EL NOM DE LA VOSTRE INSTITUCIÓ";

Un altre cop eviteu que git pugi els canvis dels vostres fitxers de configuració als repositoris remots amb:

$ sudo git update-index --assume-unchanged application/config/inventory.php

Ara cal configurar els permisos de carpetes:

Primer cal permetre crear els fitxers de log:

$ sudo chown -R www-data:www-data application/logs/

I també el upload de fitxers:

$ sudo chown www-data:www-data -R assets/uploads/

Finalment per tal que els usuaris de Ldap tinguin accés a l'aplicació d'inventari cal que pertanyin a un dels grups que assignen un rol vàlid al usuari. Els rols és defineixen al fitxer:

application/config/auth_ldap.php

Els rols són:

$config['roles'] = array(
   1 => 'inventory_readonly',
   3 => 'inventory_admin',
   5 => 'inventory_dataentry',
   7 => 'inventory_organizationalunit'
   );

Utilitzeu Gosa o ADS per afegir l'usuari Ldap al grup que pertoqui. Per exemple, per crear un usuari admin al grup inventory_admin:

dn: cn=inventory_admin,ou=groups,ou=maninfo,ou=Personal,ou=All,dc=augute,dc=org
objectClass: posixGroup
objectClass: top
cn: inventory 
gidNumber: 2082
memberUid: sergitur
memberUid: unaltreusuari
memberUid: unaltreusuari2

NOTA: L'anterior tros de text és un extracte LDIF d'un objecte posixGroup indicant quins usuaris (segons el seu uid) pertanyen al grup inventory_admin i pert tant tenen el rol d'administradors a l'aplicació d'inventari

Actualització

Aneu a la carpeta on teniu instal·lat l'aplicació d'inventari:

$ cd /usr/share/ebre-inventory
$ git pull origin master

TODO:

Es fa:

$ git remote -v
origin	https://github.com/acacha/ebre-inventory.git (fetch)
origin	https://github.com/acacha/ebre-inventory.git (push)

Si surt el origin és que està ok. Sinó cal afegir-lo

$ git remote add origin https://github.com/acacha/ebre-inventory.git

Migració de dades. Importació de dades

  • L'aplicació d'inventari utilitza una base de dades Mysql, per tal d'aprofitar les dades que contenen els antics fulls d'inventari amb format [.xlsx] i evitar el tenir introduir una l'altra vegada les mateixes una per una, passarem el full de càlcul amb format Microsoft Excel a CSV.
  • S'ha de tenir ben present que el format de les columnes del fitxers, coincideixi amb el format de les columnes de la taula de la base de dades.
  • A mode d'exemple descriurem els passos a seguir per a realitzar la importació des del full de càlcul location a la taula location de la base de dades ebreinventory :


# En primer lloc comprovem el tipus de dades i el format que conté cada camp de la taula location:

Rafelmelich location.png


Observem que la taula està implementada amb 11 camps:
1) locationId: composta per un número enter amb un màxim de 11 dígits (tindre present que qualsevol Id superior a 11 dígits quedarà estroncada a partir del onzè dígit)
2) name: composta per una cadena de caràcters variables (varchar) amb un màxim de 150 caràcters.(si el nom supera els 150 caràcters, quest quedarà truncat a partir del caràcter 150)
3) shortName: el mateix format de dades que el camp name.
4) description: Format de text
5) entryDate: ATENCIÓ!! El format del camp és datetime. Les dades introduïdes ha de seguir exactament aquest format. El tipus Datetime s'utilitza per valors que contenen tant una part de data com d'hora. MySQL recupera i mostra el valors DATETIME en el format 'YYYY-MM-DD HH:MM:SS'. El rang soportat és '1000-01-01 00:00:00' a '9999-12-31 23:59:59'. El format és descendent de Major a menor interval de temps: ANY(4 xifres)-MES(2 xifres)-DIA(2 xifres)-ESPAI-HORA(2 xifres i UTM: 0-24)-MINUTS(2 xifres)-SEGONS(2 xifres).
6) last_update: ATENCIÓ!! El format del camp és timestamp. Podem deixar buit aquest camp, en el cas de no contemplar aquest camp en el fitxer a importar, en aquest cas el registre del camp s'omplirà amb el següent valor 0000:00:00 00:00:00 per defecte. Si el fitxer a importar conté un camp amb timpestamp i desitgem conservar la data de la última actualització podem conservar aquesta introduint la data com si és tractés d'un datetime. Al modificar algun valor del registre, automàticament inserirà el la data i l'hora en que s'ha realitzat la modificació.
7) creationUserId: composta per un número enter amb un màxim de 11 dígits (tindre present que qualsevol Id superior a 11 dígits quedarà estroncada a partir del onzè dígit). (millor S'ha d'introduir un usuari que existeixi a la base de dades)
8) lastupdateUserId: Podem deixar aquest camp en blanc, ja que automàticament introduirà la ID de l'usuari que ha realitzat els canvis
9) parentLocation:
10) markedForDeletion:
11) markedForDeletiondate:


  • Exemple:
    • Format Excel:
  • Plantilla amb format Excel:

Fitxer taula location de la base de dades Inventory

Fitxer:Rafelmelichebreinventory location1.CSV

Codi font

Incidències/Issues

Test

Rols

Al fitxer de configuració application/config/auth_ldap.php es defineixen els rols Ldap de l'aplicació:

$ cat application/config/auth_ldap.php
...
$config['roles'] = array(
    1 => 'inventory_readonly',
    3 => 'inventory_admin',
    5 => 'inventory_dataentry',
    7 => 'inventory_organizationalunit'  
    );

Els rols estan associats a grups, o el que és el mateix utilitzarem sense distincions les paraules Rol i Grup. La següent és la descripció de l'objectiu de cada rol:

  • inventory_readonly: com diu el seu nom només és té accés de lectura.
  • inventory_admin: Aquest rol té tots els permisos
  • inventory_dataentry: Aquest rol només permet afegir dades
  • inventory_organizationalunit: Aquest rol només permet afegir dades al inventari i modificar les dades d'objectes inventariats pertanyents a la unitat organitzativa de l'usuari.

Si no s'assigna un dels rols a un usuari, l'usuari no podra entrar a l'aplicació.

IMPORTANT: No assigneu més d'un rol a un usuari. Només es pot assignar un rol. Si assigneu més d'un rol, l'aplicació no sabrà quin rol utilitzar i o bé no anirà o s'assignarà un dels rols aleatòriament

És important tenir en compte que els rols es guarden a la taula:

roles

de la base de dades MySQL. LA taula pot estar buida inicialment i un cop entri per primer cop un usuari Ldap, a més d'afegir aquest usuari (si no existia encara) a la base de dades MySQL, també s'afegeix el rol que porta associa a la taula (si no existia encara) i la relació n-n users-groups (si no existia encara també).

TODO

Millores:


Crear fitxer de config a la carpeta:

/application/config

El fitxer l'anomenem:

inventory.php

Al constructor del controlador:

$this->config->load('inventory');



Exemple de com mostrar un valor per defecte:

 ...
  $this->grocery_crud->callback_add_field('quantityInStock',array($this,'add_field_callback_quantityInStock'));
 ...
    
    function add_field_callback_quantityInStock()
    {
        return '<input id="field-quantityInStock" type="text" maxlength="6" value="1" name="quantityInStock">';
    }

Decidir el format dels identificadors públics

  • PublicId :
  • ExternalID :
  • Calen dos?

Pendent afegir camps:

  • FOTO: fàcil (només cal veure l'exemple de GroveryCrud). Lo guapo seria afegir múltiples fotos utilitzant imagecrud. La idea seria tenir una carpeta per cada objecte:
assets/id_objecte_a_la_base_de_dades/

Altres:

  • Becaris Institut:
  • Donar d'alta tots els departaments del centre
  • Donar d'alta esl espais (llocs/locations)
  • Traduir el fitxer al català
  • Fer que no aparegui "Add Record" sinó Afegir Objecte (afegir depèn de la traducció, lo altre és una funció de codi). Això per cada apartat (unitats organizationals, llocs, etc)
  • Canviar noms de les columnes per que no apareguin el nom del camp de la base de dades
  • Camps que s'han de mostrar a la llista
  • NO mostrar tots que sinó no caben a una pantalla. No mostrar:
  • TODO
  • Camps que no s'han de mostrar al afegir/editar registre:
  • EntryDate: camp automàtic, és registre de base de dades. No s'hauria de poder modificar.
  • Camps que són automàtics, s'han de mostrar però es modifiquen sols:
  • LastUpdate
  • Usuari de l'última modificació. LastupdateUserId

Camps automàtics:

  • EntryDate: camp automàtic, és registre de base de dades. No s'hauria de poder modificar.
  • ManualEntryDate: este no és automàtic. Els usuaris han de poder decidir quina és la data d'alta de l'objecte
  • Last update : s'ha de mostrar però no ha de ser editable. És un timestamp automà
  • markedForDeletionDate: No es pot modificar manualment, cal marcar markedForDeletionDate. Si es desmarca markedForDeletionDate, es guarda, es torna a entrar i es torna a marca cal tornar a actualitzar.
  • CreationUserId : usuari que va crear el objecte. S'ha de poder veure però no modificar. Un cop establert no es modifica mai
  • LastupdateUserId : usuari que va fer l'última modificació de l'objecte
  • Es podria programar un widget per tal de poder afegir/treure camps a mostrar?
  • Camps obligatoris:
  • Name/Nom
  • ShortName/Nom curt

Relacions entre taules:

  • OwnerOrganizationalUnit: un desplegable que mostri les unitats organitzatives (per exemple: departament de informàtica) a les que pertany el objecte. Ha de permetre múltiples opcions
  • Location: desplegable amb els espais. Només una opció a escollir (recrodeu que els espais poden ser subespais d'una altre espai, i si un objecte està al magatzem de l'aula 2 cal marcar "magatzem aula 2" i no pas aula2 o en tot cas mai les dos coses al mateix temps)
  • ProviderId : Un sol proveidor
  • MoneySourceId : Una sola font d'on provenen els diners o el objecte.

Valors per defecte o valors inicials:

  • Price: no posar res (no confondre amb posar 0 euros!)
  • MarkedForDeletion: No
  • PreservationState : Good
  • ProviderId: TODO, posar el més habitual
  • OwnerOrganizationalUnit : per defecte posar un valor genèric: Institut de l'Ebre
  • MoneySourceId : TODO, posar el més habitual
  • QuantityInStock : 1
  • Location : La location o lloc arrel/pare de tots els altres espais. Per exemple, Institut de l'Ebre
  • ManualEntryDate: Ha de ser la data i hora actual si s'esta afegint un registre. En edició no s'ha de poder modificar

Validacions:

  • QuantityInStock : és un camp que només ha de permetre números enters positius
  • Price: format en euros

Altres:

  • Afegir un desplegable que permeti canviar idioma des del programa (funció set_language)
  • Afegir un desplegable que permeti canviar el tema (set theme)

Base de dades

  • Afegir tipus de materials. A IES EBRE hi havia dos tipus
  • Etiquetes per espais (aules)

Millores

Objectes específics

  • La idea és que els objectes específics tenen més camps que els que hi ha a la taula inventory-object. Com s'implementa?
  • L'objectiu és implementar camps específics de només certs tipus d'objectes sense posar aquests camps a la taula inventory-object. Però on els posem?
  • Idees d'objectes:
  • Dispositius amb targetes/interfícies de xarxa:
  • MAC:
  • IP: pot ser IPv4 i IPv6
  • Els dispositius poden tenir múltiples interfícies de xarxa... S'implementa?

Qüestions a tenir en compte:

  • Tenim un camp tipus de material que podria ser més genèric: tipus d'objecte
  • També tenim identificadors interns i externs (també podríem anomenar identificador extern o intern)

Identificadors:

  • Donar d'alta per defecte una quants tipus d'identificadors?
  • Número de sèrie
  • ISBN
  • Afegir camp amb informació sobre el codi de barres:
  • Codi de barres sí/no?
  • Potser no cal booleà: directament camp opcional: tipus de codi de barres: si no està el camp no té codi de barres, sí el té aleshores és que sí
  • Codi de barres: són identificadors, al cap i a la fi solen ser números, o una forma només de representar un valor (per exemple pot ser la MAC o el número de sèrie):
  • Només guardar el número no: cal guardar el tipus de codi de barres?
  • Número de sèrie

Tracking del origen dels productes:

  • Preu de compra: és opcional, pot no ser útil, no saber-se, etc-
  • Preu de venta: Docs camps de preu? ara només tenim un. En tots cas opcional. Ha de ser un producte que és vulgui vendre per posar-li un preu
  • A qui s'ha comprat?: això és el proveidor. Ho tenim
  • Potser afegir opcions: URL, NIF, etc
  • Factura de compra
  • Albarà de compra: cal? Els albarans es tranformen en factures. Juntar am l'anterior (pot ser opcional)
  • Obliga a fer un manteniment de factures:

Factura:

  • Opció: utilitzar linvoice/ebreinvoice?
  • IdFactura
  • TipusFactura: Compra/Venta
  • Document adjunt

Informes

Informes

  • Imprimir inventari per família
  • Imprimir inventari per tipus material
  • Imprimir inventari per espai

Etiquetes: Abans hi havia:

  • Etiquetes de tot l'inventari
  • Etiquetes per unitat organitzativa (famílies/departaments)
  • Etiquetes per tipus de material (hi ha un tipus principal i un subtipus)

Base de dades

Taules

  • InventoryObject: guarda els objectes inventariats
  • OrganizationalUnit: guarda les unitats organitzatives de la institució o empresa (departaments/famílies)
  • ObjectorganizationalUnit: relaciona un objecte amb 0-n possibles unitats organitzatives
  • Location
  • Attachments
  • ObjectAttachment
  • Provider

inventory_object

  • Id: autoincremental sempre únic dins la taula
  • publicId: identificador públic propi de l'aplicació
  • externalID: ISBN/codi, etc
  • name
  • shortName
  • description
  • ownerOrganizationalUnit
  • EntryDate: Data d'alta (automàtic)
  • ManualEntryDate: Data d'alta (manual)
  • EntryUser: usuaris ha donat d'alta l'objecte
  • last_update
  • LastModificationsUser
  • location: buit o un id de location (mai dos possibles). Si és una sublocalització pels parents ids ja es podrà saber a on pertany
  • preservationState: múltiples opcions predefinides
  • price
  • MoneySourceId
  • moneySourceId: número d'elements iguals
  • ProviderId
  • MarkedForDeletion
  • MarkedForDeletionDate
  • Els objectes estan a 0 o una ubicacions possibles (mai poden estar a dos)
CREATE TABLE IF NOT EXISTS `inventory_object` (
  `inventory_objectId`int(11) NOT NULL AUTO_INCREMENT,
   `publicId` varchar(50) NOT NULL,
   `externalID` varchar(100) NOT NULL,
   `name` varchar(150) NOT NULL,
   `shortName` varchar(150) NOT NULL,
   `description` text,
   `ownerOrganizationalUnit` int(11) DEFAULT NULL,
   `entryDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   `manualEntryDate` datetime NOT NULL,
   `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   `creationUserId` int(11) DEFAULT NULL,
   `lastupdateUserId` int(11) DEFAULT NULL,
   `location` int(11) DEFAULT NULL,
   `preservationState` enum('Good','Regular,'Bad') NOT NULL,
   `quantityInStock` smallint(6) NOT NULL,
   `price` double NOT NULL,
   `moneySourceId` int(11) DEFAULT NULL,
   `ProviderId` int(11) DEFAULT NULL,
   `markedForDeletion` enum('n','y') NOT NULL,
   `markedForDeletionDate` datetime NOT NULL,
  PRIMARY KEY (`inventory_objectId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Locations

  • Id: autoincremental sempre únic dins la taula
  • parentId: Buit si és un element arrel o id de la location pare si és una sublocalització
  • publicId
  • name
  • shortName
  • description

Les localitzacions són jeràrquiques.

OrganizationalUnit

  • Id: autoincremental sempre únic dins la taula
  • parentId: Buit si és un element arrel o id de la unitat organitzativa pare si és una suborganització
  • publicId
  • name
  • shortName
  • description

Aquí es pot posar qualsevol cosa: departaments/famílies/seccions. Ha de ser configurable per a qualsevol institució/empresa.

ObjectorganizationalUnit

  • Id: autoincremental sempre únic dins la taula
  • objectId: id de l'objecte a inventariar
  • OrganizationalUnitId: Id de la unitat organitzativa

Porta les relacions 1-n (un objecte pot tenir de 0 a n unitats organitzacionals possibles)

Attachment

  • Id: autoincremental sempre únic dins la taula
  • publicId: URL del fitxer
  • name
  • shortName
  • description

Els attachments són objectes binaris/fitxers relacionats amb un objecte (fotos, PDFs, documents, etc). Cada objecte pot tenir de 0 a n attachments.

ObjectAttachment

  • Id: autoincremental sempre únic dins la taula
  • objectId: id de l'objecte a inventariar
  • attachmentId: Id del Attachment

Porta les relacions 1-n (un objecte pot tenir de 0 a n attachments possibles)

organizationalUnitsLocation TODO

Una unitat organitzativa pot tenir múltiples espais/localitzacions assignades

Camps configurables

  • TODO
  • Camps lliures per tal que cada organització pugui acabar de personalitzar

Camps que s'han de mantenir a part com opcionals

Traducció antic accés a nova aplicació:

Els noms dels camps de l'aplicació accés es mostre segon el nom que apareix al formulari principal

  • Codi departament: a quina unitat organitzativa pertany o està assignat l'objecte--> ownerOrganizationalUnit
  • Descripció Soft/Descripció Hard: descripció
  • Aula/lloc: es substitueix per una localització que s'haurà donat d'alta. Les localitzacions permeten sublocalitzacions per tant es suporta aula/lloc
  • Boto Fotos: canviar per un gestor de fitxers adjunts

Server API

La idea és implementar un servei web RESTful. Estaria fet amb Restler. HI ha un clar exemple de com implementar el CRUD i com fer-ho amb un backend MySQL. A més incorpora documentació "automàtica" a partir dels comentaris PHP

Vegeu també:

Clients

Web/Gosa

Idees:

  • Reutilitzar Gosa per a l'autenticació. Fer un plugin
  • El backend però no té per què ser Ldap
  • Opció de "maximitzar". Sortir de Gosa
  • Utilitzar un framework com CodeIginiter
  • Impressió d'etiquetes amb Dymo

Android

  • Accedir al server API
  • Lector de codis de barres i per fer fotogràfies.

Codis de barres

Generador de codis de barres

El generador el trobareu a la URL (si no heu instal·lat a localhost poseu el nom de màquin del vostre servidor):

 http://localhost/ebre-inventory/index.php/qr/barcode

Si no podeu res es mostra el codi 123456789012 en format CODE_128, l'escala és 2 i el mode és imatge en format PNG.

Cal indicar el codi i el tipus de codi de barres, un exemple:

http://localhost/ebre-inventory/index.php/qr/barcode?code=1234567891234&barcodetype=EAN

Els tipus de codis de barres els trobareu a:

:*http://www.ashberg.de/php-barcode/?code=1234567891234&scale=2&bar=EAN

Pensaments en alt...

Per que utilitzar QR, per que en menys espai es codifica més informació. Per exemple per codificar les URL d'objectes de l'inventari, per exemple la URL:

http://localhost/ebre-inventory/index.php/main/index/read/1

En un codi de barres de 1D seria:

CodiBarresEbreInventory.png

Díficil de llegir pel lector.

Amb URL més curta (http://localhost/ebre-inventory/Drewr43s):

CodiBarresEbreInventory2.png

Exemples

Ubiquiti:

  • Porten un codi Code 128 amb el nom del producte, per exemple NS2 EU
  • Després porten la MAC en Code 39

Els dos codis estan molt aprop i a vegades és llegeix el que no pertoca.

Procediment: inventariar per codi de barres

La idea és utilitzar una plantilla per que sigui el més ràpid possible.

Exemple: arriba un component ubiquiti

Formulari

  • Escollir el tipus de material: Nanostation 2/5, nanobridge/etc. En este cas es pot llegir per codi de barres de la propia caixa de la nano

NOTA: Si alguns components no tenen codi de barres amb el tipus però són comuns es pot crear un full "xuleta" amb els codis per escanejar

  • Introduir la MAC: també es pot llegir per codi de barres en el cas Ubiquiti
  • Introduir el Serial Number: en alguns casos és igual a la MAC (Ubiquiti) o sinó hi ha un codi propi al mateix dispositiu
  • Proveidor: és interessant indicar on es va comprar. Més idees sobre el proveïdor i compra:
  • Dades de la compra:
  • Factura (num de Factura del proveidor): que es pot guardar i com?

NOTA: Deixar sempre l'opció d'introduir a mà

Com implementar la plantilla

Que ens estalviem per plantilla?:

  • Objecte mateix:
  • Nom i Nom curt formarien part de la plantilla
  • ïdem marca i model
  • Ubicació i preu
  • No cal posar descripció o ja la té la plantilla: heretar del tipus de material?
  • Tipus de material ja esta donat d'alta amb els seus detalls i descripcións, dates, etc
  • Mantenir/Afegir un Quantity in Stock per tipus de material a més del que existeix per objecte
  • Afegir una plantilla a tipus de material: un cop escollit tipus de material aleshores omplir automaticàment:
  • Model/Marca
  • Les dates són automàtics (alta/última modificació) i el registre d'usuaris també (això amb tots els objectes)

IMPORTANT: Quan té sentit el tipus de material a nivell objecte: NO se ara un exemple però pot tenir sentit...

Concepte Comanda

  • Una nova taula:
  • NumComanda (numPedido) (obligatori?)
  • Proveidor (obligatori)
  • NumFactura
  • NumAlbaran

Objectes: Nou camp

  • Id de comanda: comanda en la que es va obtenir aquest producte

Exemples

Afegir un apartat/tab a l'aplicació

L'aplicació utilitza navbar un component de bootstrap.

Apartat obsolet/històric. Issues

Ara les incidències de l'aplicació es controlen a:

https://github.com/acacha/ebre-inventory/issues?state=open

Rafel

Errors

A PHP Error was encountered

   Severity: Notice 

   Message: Undefined index: homephone 

   Filename: libraries/Auth_Ldap.php

   Line Number: 292
A PHP Error was encountered

   Severity: Notice 

   Message: Undefined index: email
   
   Filename: libraries/Auth_Ldap.php
 
   Line Number: 314

A Database Error Occurred

Error Number: 1048

Column 'email' cannot be null

INSERT INTO `users` (`username`, `password`, `email`, `ip_address`, `created_on`, `last_login`, `active`) VALUES ('rafelmelich', '0f36a93353327b36a19367794e1d738b753f7093', NULL, '\n���', 1371467951, 1371467951, 1)

Filename: /usr/share/chroot_web/ebretic/ebre-inventory/models/ion_auth_model.php

Line Number: 824

Solucionat l'error de correu ens apreix el següent:

A Database Error Occurred

Error Number: 1452

Cannot add or update a child row: a foreign key constraint fails (`ebreinventory`.`users_groups`, CONSTRAINT `fk_users_groups_groups1` FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION)

INSERT INTO `users_groups` (`group_id`, `user_id`) VALUES (0, 27)

Filename: /usr/share/chroot_web/ebretic/ebre-inventory/models/ion_auth_model.php

Line Number: 1304

No apareix la imatge del codi QR al final de l'entrada del dispositiu (Inventari/objectes)

Rafelmelich error imatge qr.png




Resol·lució de problemes. Troubleshooting

Com fer canvis als fitxer --assume-unchanged (application/config/config.php i application/config/inventory.php)

Vegeu GIT#git_ls

Unable to load the requested class: grocery_crud

L'aplicació Grocery crud cal instal·lar-la com aplicació de tercers a la carpeta:

$ cd /usr/share/ebre-inventory/application/third_party

Heu de crear dos carpetes amb els noms grocery-crud i image-crud a on posar el codi d'estes llibreries. Es pot obtenir el codi des de les corresponents webs (fitxers zip i descomprimir) o es pot fer un clone dels repositoris git:

$ sudo git clone https://github.com/scoumbourdis/grocery-crud
$ sudo git clone https://github.com/scoumbourdis/image-crud
$ sudo git clone https://github.com/dwisetiyadi/CodeIgniter-PHP-QR-Code

Vegeu també Aplicació_inventari#Instal.C2.B7laci.C3.B3

Unable to load the requested language file: language/catalan/form_validation_lang.php

Cal instal·lar el suport d'idioma en català per a Code Iginiter. Vegeu:

Code_Igniter#Traducci.C3.B3ns_en_catal.C3.A0

The configuration file database.php does not exist.

Consulteu Instal·lació. Allà explica que cal crear un fitxer application/config/database.php. Teniu un exemple de fitxer a:

application/config/database.php.example

The configuration file auth_ldap.php does not exist.

Consulteu Instal·lació. Allà explica que cal crear un fitxer application/config/auth_ldap.php. Teniu un exemple de fitxer a:

application/config/auth_ldap.php.example

No deuen ser les correctes per connectar-se al servidor Ldap.

No s'ha pogut realitzar el bind per localitzar el identificador del usuari

Si us dona aquest error, aleshores les dades indicades al fitxer:

application/config/auth_ldap.php

El login és correcte però l'usuari no té un rol adequat per accedir a l'aplicació

En aquest cas l'usuari deLdap és correcte però no se li ha assignat cap rol. Consulteu l'apartat:

Aplicació_inventari#Rols

A l'apartat Instal·lació també s'indica quin és el pas a seguir per instal·lar correctamen l'aplciació i configurar els usuaris. Podeu utilitzar aplicacions com Apache Directory Studio per modificar l'arbre Ldap i crear el rol i/o assignar l'usuari al grup del rol.

Vegeu també

Enllaços externs