<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4927520572942889675</id><updated>2012-02-01T22:57:36.116-03:00</updated><category term='reportes'/><category term='ruby'/><category term='impuestos'/><category term='bejerman'/><category term='tango'/><category term='l10n_ar_invoice'/><category term='software libre'/><category term='remoto'/><category term='afip'/><category term='community'/><category term='production environment'/><category term='desarrollo'/><category term='cuit'/><category term='environment'/><category term='v6.0'/><category term='facturación'/><category term='l10n_chart_ar_generic'/><category term='asistencia'/><category term='bazaar'/><category term='clock_reader'/><category term='addons'/><category term='apaisado'/><category term='python'/><category term='gem'/><category term='oerpenv'/><category term='rails'/><category term='easysoft'/><category term='openerp'/><category term='internet'/><category term='debian'/><category term='windows'/><category term='aptitude'/><category term='instalación'/><category term='ambiente'/><category term='diarios analíticos'/><category term='development environment'/><category term='proxy reverso'/><category term='cherrypy-web'/><category term='openerp-argentina'/><category term='inososhi'/><category term='opencv'/><category term='iva'/><category term='diarios financieros'/><category term='formularios'/><category term='engine'/><category term='red social'/><category term='reconocimiento'/><category term='servidor'/><category term='treasury'/><category term='squid'/><category term='sap'/><category term='argentina'/><category term='l10n_ar_base_vat'/><category term='reportlab'/><category term='recursos humanos'/><category term='comunidad'/><category term='l10n_ar_states'/><category term='modulo'/><category term='rostro'/><category term='problema'/><category term='pygame'/><category term='network'/><category term='testing'/><category term='erp'/><category term='licencia'/><category term='reloj'/><category term='l10n_ar_partner_title'/><title type='text'>Experiencias con Software Libre</title><subtitle type='html'>Historias de vida, opiniones, y mucho más sobre software libre.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>26</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-4204168864511786596</id><published>2012-02-01T22:55:00.003-03:00</published><updated>2012-02-01T22:57:36.124-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='l10n_ar_base_vat'/><category scheme='http://www.blogger.com/atom/ns#' term='treasury'/><category scheme='http://www.blogger.com/atom/ns#' term='l10n_chart_ar_generic'/><category scheme='http://www.blogger.com/atom/ns#' term='openerp-argentina'/><category scheme='http://www.blogger.com/atom/ns#' term='l10n_ar_states'/><category scheme='http://www.blogger.com/atom/ns#' term='l10n_ar_invoice'/><category scheme='http://www.blogger.com/atom/ns#' term='afip'/><category scheme='http://www.blogger.com/atom/ns#' term='iva'/><category scheme='http://www.blogger.com/atom/ns#' term='l10n_ar_partner_title'/><category scheme='http://www.blogger.com/atom/ns#' term='impuestos'/><title type='text'>Localización Argentina v2.0</title><content type='html'>&lt;span style="font-size: x-large;"&gt;Localización Argentina v2.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En esta entrada voy a detallar el resultado del trabajo realizando en los últimos 6 meses. Esta implementación funciona para la versión 6.0 de OpenERP. Debo aclarar que todavía no la probé con la versión 6.1.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Instalación Inicial&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Las siguientes pantallas corresponden a la nueva forma de configurar la localización argentina.&lt;br /&gt;&lt;br /&gt;La primera pantalla con la que nos encontramos cuando instalamos la localización argentina en una base de datos vacía es la configuración de la cuenta contable,&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uOobyIzK4po/TyndQEmODaI/AAAAAAAAAEA/-ITyGq_2Le0/s1600/ConfigureYourAccountingChart.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://2.bp.blogspot.com/-uOobyIzK4po/TyndQEmODaI/AAAAAAAAAEA/-ITyGq_2Le0/s320/ConfigureYourAccountingChart.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;La siguiente pantalla que permite generar el Plan de Cuentas a partir de plantillas. Las plantillas disponibles son: &lt;b&gt;Plantilla para Cooperativas&lt;/b&gt;, &lt;b&gt;Plantilla para Responsable Inscripto&lt;/b&gt; y &lt;b&gt;Plantilla para Monotributistas&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Si elegimos el plan contable argentino aparecerá la pantalla donde nos listará los módulos disponibles,&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-NNVCx07DSxw/TynfLEPFCaI/AAAAAAAAAEQ/IXpkAda092A/s1600/ExtensionsForArgentinaLocalization.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-NNVCx07DSxw/TynfLEPFCaI/AAAAAAAAAEQ/IXpkAda092A/s320/ExtensionsForArgentinaLocalization.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Si elegimos el módulo de facturación argentina aparecerá la siguiente pantalla de configuración,&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-XrCncpoPsy4/TynfkUnLucI/AAAAAAAAAEY/tcmsisQ2-Xs/s1600/InvoiceConfigurationForArgentina.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="154" src="http://3.bp.blogspot.com/-XrCncpoPsy4/TynfkUnLucI/AAAAAAAAAEY/tcmsisQ2-Xs/s320/InvoiceConfigurationForArgentina.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;en esta pantalla van a poder configurar los diarios necesarios para trabajar con facturas, notas de crédito y notas de débito según la responsabilidad con respecto al IVA. También si se quiere operar con dólares, si se quiere realizar operaciones de exportación, se permite eliminar los diarios de facturación existentes y el número de punto de venta con el que se va a trabajar. Esta pantalla puede ejecutarse todas las veces que sea necesario para poder crear diarios diferentes para cada punto de venta.&amp;nbsp;Un tema que voy a dejar en la próxima versión menor es agregar la posibilidad de trabajar con talonarios multifunción.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Nuevos documentos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este proceso de configuración e instalación de los módulos va a traducir los menúes de facturación a términos argentinos.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-t3tYUu6lYkU/TynhBcLLOsI/AAAAAAAAAEg/0YiCbIqC5Gs/s1600/MenuContabilidad.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="173" src="http://3.bp.blogspot.com/-t3tYUu6lYkU/TynhBcLLOsI/AAAAAAAAAEg/0YiCbIqC5Gs/s320/MenuContabilidad.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Habilitar el módulo de cartera de chequera agregará el siguiente menú,&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DOB_bjFufbk/Tyni5jtsCoI/AAAAAAAAAEo/PwohDYXhO-8/s1600/MenuContabilidadBancoyCajaValores.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="173" src="http://1.bp.blogspot.com/-DOB_bjFufbk/Tyni5jtsCoI/AAAAAAAAAEo/PwohDYXhO-8/s320/MenuContabilidadBancoyCajaValores.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;El cual permitirá trabajar con valores,&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qzEzG2uE-3M/TynjCNQmEBI/AAAAAAAAAEw/ugT_ErSj5Ks/s1600/Valores.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="173" src="http://3.bp.blogspot.com/-qzEzG2uE-3M/TynjCNQmEBI/AAAAAAAAAEw/ugT_ErSj5Ks/s320/Valores.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;y asociarlos con pagos,&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-KJdBgKXE7Po/Tynjg7TayaI/AAAAAAAAAE4/DPGyro_OBCc/s1600/ReciboDeVentas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="173" src="http://3.bp.blogspot.com/-KJdBgKXE7Po/Tynjg7TayaI/AAAAAAAAAE4/DPGyro_OBCc/s320/ReciboDeVentas.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Planes contables&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uno de mis esfuerzos esta concentrado en los diversos planes contables. No están revisados y esa es la razón principal por la que no quiero publicar estos desarrollos en el branch principal de la localización.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Facturación&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La facturación electrónica no está implementada. Para su correcta implementación es necesario levantar todos los códigos del AFIP. Por ahora están cargadas las provincias. Hay que hacer un esfuerzo mayor para cargar el resto de las tablas. Ver Futuro.&lt;br /&gt;&lt;br /&gt;Con respecto a la impresión de la factura, pueden encontrar el archivo invoice.rml que yo uso, donde pueden ver como se puede implementar fácilmente la impresión de facturas de cualquier tipo (A,B,C,E,M, etc..) para cualquier operación (Factura, Nota de Crédito, Nota de Débito). Me queda pendiente habilitar la factura como demo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Impuestos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;He revisado los impuestos y puedo decir que están funcionando bien. Definitivamente necesiten más testing, pero todo es fácil de resolver ahora.&lt;br /&gt;&lt;br /&gt;Está implementado el IVA del 10.5%, 21% y 27%. También está implementado los Ingresos Brutos de Capital Federal, Buenos Aires, Córdoba y Santa Fé; tanto como retenciones como percepciones.&lt;br /&gt;&lt;br /&gt;El reporte de declaración jurada debería funcionar correctamente, generando la suma correcta a pagar de los impuestos. Digo debería porque para mi funcionó, pero nuevamente, esto necesita más testing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Cartera de Cheques&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El módulo que lo implementa es clásico y conocido treasury, aunque lo he adaptado a la versión 6.0 para que pueda funcionar con los recibos (vouchers). Además programé un simple workflow para determinar si se ha cobrado o no el cheque y su estado. También permite seguir el cheque desde su recepción hasta su emisión. Esta realmente interesante, aunque falta trabajar con la parte contable. Eso significa asentar las operaciones de cobro una vez que se cobro el dinero ya sea por depósito o por retiro en ventanilla. También hay que programar el caso en que el cheque es rechazado, donde se debería generar una nota de débito al partner con el valor del cheque, los gastos administrativos tanto del banco como del cobrador, y potencialmente el interés que provoque el atraso del pago.&lt;br /&gt;&lt;br /&gt;Algo que hay que trabajar también es con otras formas de pago como son las tarjetas de crédito y débito, y transferencias bancarias, que la cartera de cheques también funciona.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Otros detalles&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agregué más títulos de partners relacionados con Cooperativas y títulos de profesionales.&lt;br /&gt;&lt;br /&gt;Sigue funcionando el sistema de reconocimiento de CUIT.&lt;br /&gt;&lt;br /&gt;Sigue la lista de los bancos argentina. No tuve tiempo de verificar si este año existieron modificaciones.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Cómo trabajar con la localización 2.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Estoy preparando un video explicando como trabajar con esta configuración. Necesito un par de días para ello.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Descargar el desarrollo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para descargar esta versión hay que acceder a la mi repositorio de Launchpad&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: Ubuntu, 'Bitstream Vera Sans', 'DejaVu Sans', Tahoma, sans-serif; font-size: 14px; font-weight: bold; line-height: 18px; text-align: left;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span style="background-color: white; text-align: left;"&gt;$&lt;/span&gt;&lt;span style="background-color: white; color: #333333; font-family: Ubuntu, 'Bitstream Vera Sans', 'DejaVu Sans', Tahoma, sans-serif; font-size: 14px; font-weight: bold; line-height: 18px; text-align: left;"&gt;bzr branch&amp;nbsp;&lt;/span&gt;&lt;span class="branch-url" style="background-color: white; color: #333333; font-family: Ubuntu, 'Bitstream Vera Sans', 'DejaVu Sans', Tahoma, sans-serif; font-size: 14px; line-height: 18px; text-align: left;"&gt;lp:~cristian-rocha/openerp-argentina/6.0&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Futuro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En el futuro deberíamos concentrarnos en principio seguir la lista de tareas de pendientes de la localización, o en otras palabras los blueprint. Todavía seguimos muy desorganizados. A pesar de ello voy a enumerar que tareas quedan pendientes en mi implementación:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Revisar y confirmar las cuentas contables.&lt;/li&gt;&lt;li&gt;Permitir a los remitos ser pagados con múltiples formas de pago.&lt;/li&gt;&lt;li&gt;Cargar las tablas del AFIP para poder implementar la facturación electrónica on-line.&lt;/li&gt;&lt;li&gt;Habilitar la impresión de factura demo.&lt;/li&gt;&lt;li&gt;Programar asientos contables por cheques aceptados.&lt;/li&gt;&lt;li&gt;Programar generación de nota de débito por cheques rechazados.&lt;/li&gt;&lt;li&gt;Implementación de pagos con tarjetas de crédito y débito.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Eso es todo por ahora. Nos vemos pronto.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-4204168864511786596?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/4204168864511786596/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2012/02/localizacion-argentina-v20.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/4204168864511786596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/4204168864511786596'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2012/02/localizacion-argentina-v20.html' title='Localización Argentina v2.0'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/101644959275721241041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-g84iVijJGZg/AAAAAAAAAAI/AAAAAAAAACs/M_DitIMNofw/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-uOobyIzK4po/TyndQEmODaI/AAAAAAAAAEA/-ITyGq_2Le0/s72-c/ConfigureYourAccountingChart.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-3757497251098697686</id><published>2012-01-30T12:56:00.004-03:00</published><updated>2012-01-30T12:58:07.025-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='production environment'/><category scheme='http://www.blogger.com/atom/ns#' term='oerpenv'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='development environment'/><title type='text'>OERPenv, en busqueda de nuevas funcionalidades</title><content type='html'>Hoy quisiera comentar las funcionalidades en las que estoy trabajando para OERPenv. Para quienes no conozcan este desarrollo, este permite administrar ambientes de desarrollo para OpenERP de una forma sencilla.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Propuesta&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En esta entrada tengo como objetivo hablar de una nueva funcionalidad que permitirá trabajar más cómodamente con bugs y nuevas funcionalidades en un ambiente de producción usando dos nuevos comandos: &lt;b&gt;deploy&lt;/b&gt; y &lt;b&gt;fallback&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-qvZQKlcVfSw/Tya2lwHS4XI/AAAAAAAACe0/J14ZGbUf2Ww/s1600/OerpEnv-actores.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="261" src="http://1.bp.blogspot.com/-qvZQKlcVfSw/Tya2lwHS4XI/AAAAAAAACe0/J14ZGbUf2Ww/s640/OerpEnv-actores.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;En el diagrama muestro los actores a quienes está enfocado el OERPenv y los usos ya implementados (naranja) y los que estoy describiendo en esta entrada (verde)&lt;br /&gt;&lt;br /&gt;El ambiente de desarrollo y el de producción se diferencian principalmente por la estabilidad del software. En producción no debería ocurrir ningún error, y si ocurre hay que trasladar (&lt;i&gt;fallback&lt;/i&gt;) el código en producción a un ambiente de desarrollo que donde las modificaciones afecten al usuario hasta que se hayan arreglado. Una vez arreglado hay que actualizar (&lt;i&gt;deploy&lt;/i&gt;) el servidor en producción con un impacto mínimo el trabajo diario del usuario. Algo muy parecido ocurre en el caso de una nueva funcionalidad.&lt;br /&gt;&lt;br /&gt;Estos nuevos comandos tendrán un uso exhaustivo de sistemas de control de versiones.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-83-OrEik1jU/TyamZI223eI/AAAAAAAACes/tJFLzkn76gs/s1600/OerpEnv-deploy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="169" src="http://2.bp.blogspot.com/-83-OrEik1jU/TyamZI223eI/AAAAAAAACes/tJFLzkn76gs/s320/OerpEnv-deploy.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;El sistema de control de versiones, el cual mantiene diferentes versiones del software que desarrollamos, nos permite recuperar la versión que mejor funciona y desarrollar sobre otra. OERPenv actualmente soporta Subversion y Bazaar. Subversion nos permite trabajar con módulos exclusivo para nuestros clientes, evitando tener que publicar desarrollos sensibles al negocio. Bazaar, en cambio, nos permite acceder a launchpad, el ambiente principal de desarrollo de OpenERP y sus módulos.&lt;br /&gt;&lt;br /&gt;No quiero entrar en detalle de cómo usar un sistema de control de versiones, pero si puedo recomendar ver el siguiente URL:&amp;nbsp; http://blog.tfanshteyn.com/2009/08/source-control-management-201.html&lt;br /&gt;&lt;br /&gt;Otro punto importante es que el comando fallback debe copiar la base de datos del ambiente de producción al ambiente de desarrollo.&lt;br /&gt;&lt;br /&gt;Todo está listo para implementarse. Pero todavía estoy en proceso de discusión sobre la funcionalidad. Estoy abierto a cualquier opinión y observación.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Futuro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una funcionalidad que me gustaría agregar, y que va en dirección de esto pero que veo difícil de llevar a cabo es lograr "tomas/snapshots" de el estado del servidor de producción en un momento previo a que ocurra un bug. Por lo tanto se podría realizar un fallback del estado previo a la ocurrencia del bug, junto al conjunto de eventos que ocurrieron luego que provocaron el error.&lt;br /&gt;&lt;br /&gt;El problema de esto es poder conseguir el estado de la base de datos en ese momento. Para ello hay que combinar un log de commits con el log de openerp cuyo nivel de detalle debería ser lo suficientemente sensible para generar un script de testing.&lt;br /&gt;&lt;br /&gt;Si les interesa más sobre el futuro de OERPenv y la tecnología que debería usar pueden ver los siguientes links:&lt;br /&gt;&lt;br /&gt;http://www.mkyong.com/database/postgresql-point-in-time-recovery-incremental-backup/&lt;br /&gt;&lt;br /&gt;http://doc.openerp.com/v6.0/technical_guide/audittrail.html&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-3757497251098697686?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/3757497251098697686/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2012/01/oerpenv-en-busqueda-de-nuevas.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/3757497251098697686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/3757497251098697686'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2012/01/oerpenv-en-busqueda-de-nuevas.html' title='OERPenv, en busqueda de nuevas funcionalidades'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-qvZQKlcVfSw/Tya2lwHS4XI/AAAAAAAACe0/J14ZGbUf2Ww/s72-c/OerpEnv-actores.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-5643996588203689776</id><published>2011-10-31T01:06:00.001-03:00</published><updated>2011-10-31T01:09:36.155-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='ambiente'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='environment'/><title type='text'>Administrar ambientes OpenERP</title><content type='html'>Quizás una de las fallas más importantes que le he encontrado al desarrollo en OpenERP es la falta de herramientas de mantenimiento y desarrollo.&lt;br /&gt;&lt;br /&gt;Por ejemplo no es fácil migrar un módulo de una versión a otra de OpenERP. Tampoco es fácil encontrar errores en un ambiente retocado, y donde la única solución es empezar de cero con la base de datos y no hablar cuando se toca un poco del código original de OpenERP. Y no hablemos de estudiar el impacto que tiene un update del código de OpenERP en una base de datos conocida.&lt;br /&gt;&lt;br /&gt;Todo esto son simples tareas que trato de minimizar con mi último desarrollo &lt;b&gt;OERPEnv&lt;/b&gt;, o en otras palabras &lt;i&gt;OpenERP Environment Administrator&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;Esta herramienta puede crear un ambiente independiente del python, módulos y versiones instaladas en el sistema operativo. También puede descargar y actualizar los fuentes de openerp en las versiones 5.0 y 6.0 (hasta ahora), ejecutar test de unidad y ejecutar los clientes de acuerdo al testing funcional que se quiera ejecutar a mano.&lt;br /&gt;&lt;br /&gt;Como el desarrollo está en sus primeros pasos no recomiendo utilizarlo en un ambiente de producción. Pero está listo para empezar a usarse en un ambiente de desarrollo.&lt;br /&gt;&lt;br /&gt;Pueden encontrar el código fuente en &lt;a href="https://launchpad.net/oerpenv"&gt;bazaar&lt;/a&gt; donde encontrarán más documentación.&lt;br /&gt;&lt;br /&gt;Les doy un conjunto de comandos que pueden ejecutar una vez instalado el oerpenv. Con ellos pueden lograr tener un nuevo módulo funcional, listo a desarrollar en pocos pasos:&lt;br /&gt;&lt;br /&gt;Primero creo un ambiente que voy a llamar &lt;i&gt;foo&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ oerpenv init foo&lt;/div&gt;&lt;br /&gt;Terminado el comando se tendrá un directorio &lt;i&gt;foo&lt;/i&gt; en donde estará el código fuente del openerp v6.0 y todos sus addons dentro del directorio &lt;i&gt;foo/sources&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;Luego entro al directorio &lt;i&gt;foo&lt;/i&gt; e instalo en el ambiente python las aplicaciones cliente y servidor.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ cd foo&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ oerpenv install&lt;/div&gt;&lt;br /&gt;Terminada la instalación ya podemos crear un paquete vacío que llamaremos mymodule.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ oerpenv dummy mymodule&lt;/div&gt;&lt;br /&gt;El módulo creado es operativo, aunque no hace nada. Pero podemos probar que el servidor openerp puede cargarlo y ejecutar sus test. Pero antes debemos habilitar el módulo.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ oerpenv enable mymodule&lt;/div&gt;&lt;br /&gt;Ahora si, podemos ejecutar el servidor en modo de testing de unidad para el módulo mymodule.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ oerpenv test mymodule&lt;/div&gt;&lt;br /&gt;Este comando crea una base de datos vacía con el nombre &lt;i&gt;test_mymodule&lt;/i&gt; donde el servidor creará una instancia openerp. Hay que asegurarse que el postgresql esté corriendo con los permisos correspondientes.&lt;br /&gt;&lt;br /&gt;En una nueva terminal podemos ejecutar el cliente openerp donde vamos a ver el cliente funcionando:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ oerpenv client&lt;/div&gt;&lt;br /&gt;Con esto tenemos una vista rápida de las capacidades del administrador de ambientes de openerp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-5643996588203689776?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/5643996588203689776/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2011/10/administrar-ambientes-openerp.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/5643996588203689776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/5643996588203689776'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2011/10/administrar-ambientes-openerp.html' title='Administrar ambientes OpenERP'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-2811868317090031508</id><published>2011-08-09T10:44:00.000-03:00</published><updated>2011-08-09T10:44:31.651-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='clock_reader'/><title type='text'>Instalando el clock_reader</title><content type='html'>En la siguiente entrada voy a explicar rápidamente como descargar y hacer funcionar el sistema de reloj para OpenERP v5. La v6 todavía no fue testeada. En resumidos pasos hay que realizar:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Descargar e instalar Bazaar &lt;/b&gt;&lt;br /&gt;(ver http://wiki.bazaar.canonical.com/Download)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Descargar e instalar Mercurial &lt;/b&gt;&lt;br /&gt;(ver http://mercurial.selenic.com/wiki/Download)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Descargar e instalar el OpenERP&lt;/b&gt;&lt;br /&gt;(ver http://doc.openerp.com/v6.0/install/index.html)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Descargar módulo Zkemapi &lt;/b&gt;&lt;br /&gt;(ver hg clone https://bitbucket.org/johnmc/zkemapi)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Instalar el módulo Zkemapi &lt;/b&gt;&lt;br /&gt;(cd zkemapi; sudo python setup.py install - Solo en Cygwin y Linux) &lt;/li&gt;&lt;li&gt;&lt;b&gt;Descargar e instalar el branch de openerp-argentina de mi persona&lt;/b&gt;&amp;nbsp; &lt;br /&gt;(bzr branch &lt;span class="branch-url"&gt;lp:~cristian-rocha/openerp-argentina/5.0)&lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Copiar o Linkear el contenido de clock_reader al directorio addons de OpenErp&lt;/b&gt;&lt;br /&gt;(ln -s clock_reader $OPENERPROOT/addons - Solo en Linux)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Actualizar lista de módulos de OpenErp&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Instalar el módulo clock_reader&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;Con estos escuetos pasos se puede instalar el módulo. Ahora hay que configurarlo.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-VVU0Utj9YFU/TkE4O8aprkI/AAAAAAAABnk/TfSDNhD1GFA/s1600/Pantallazo-OpenERP.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://2.bp.blogspot.com/-VVU0Utj9YFU/TkE4O8aprkI/AAAAAAAABnk/TfSDNhD1GFA/s320/Pantallazo-OpenERP.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Identificar el IP del lector de asistencias.&lt;/li&gt;&lt;li&gt;Crear una entrada de reloj en la configuración de recursos humanos.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Configurar el reloj:&lt;/li&gt;&lt;/ol&gt;Aquí se tienen varias opciones. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LqjpmNDSDYk/TkE4GweJ30I/AAAAAAAABng/q9-Avn4gtoU/s1600/Pantallazo-OpenERP-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="136" src="http://4.bp.blogspot.com/-LqjpmNDSDYk/TkE4GweJ30I/AAAAAAAABng/q9-Avn4gtoU/s320/Pantallazo-OpenERP-1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;El IP del lector se asigna en el campo &lt;b&gt;URI&lt;/b&gt;. Si el reloj está en el IP 192.168.1.43 y el puerto de conexión es 4370 entonces el campo deberá contener: udp://192.168.1.43:4370&lt;br /&gt;&lt;br /&gt;Tilde el campo &lt;b&gt;Active&lt;/b&gt; y elija "Zkem" para el campo &lt;b&gt;Model&lt;/b&gt; que es el único modelo ahora soportado.&lt;br /&gt;&lt;br /&gt;En principio el clock_reader identifica a un personal a través del &lt;b&gt;Other-ID&lt;/b&gt; del objeto Employee. Si este no hay empleado con un ID leido desde el reloj se pueden hacer dos cosas: a) ignorar al empleado o 2) crear un empleado nuevo. Eso lo pueden configurar en la opción "&lt;b&gt;Create Unknown Employeers&lt;/b&gt;"&lt;br /&gt;&lt;br /&gt;No siempre los empleados se registran correctamente, y el sistema OpenERP exige que no puede existir una registración de salida si no existió una registración de entrada previamente. Si se quiere ignorar el cómo se registró el empleado puede confirmarlo en la opción "&lt;b&gt;Ignore sign in/out&lt;/b&gt;".&lt;br /&gt;&lt;br /&gt;En el caso que no quieran perder la información administrada por el empleado (una entrada o salida) el sistema puede agregar automáticamente registraciones en el medio de manera tal de mantener la restricción sin problemas. Eso se puede configurar con la opción "&lt;b&gt;Autocomplete sign in/out&lt;/b&gt;".&lt;br /&gt;&lt;br /&gt;A mi no me funcionaron ninguna de las dos opciones anteriores. Pero mejor me funcionó eliminar la restricción de OpenERP. Por lastima hay que tocar el archivo attendance.py para ello (es fácil de encontrarla). Si realizan esto podrán activar la opción "&lt;b&gt;Ignore DB restriction&lt;/b&gt;" para que no intente chequear que no se cumplen las restricciones.&lt;br /&gt;&lt;br /&gt;Si quiere eliminar todos los registros una ves leído el sistema pueden configurar la opción "&lt;b&gt;Clean Clock at the end&lt;/b&gt;". &lt;br /&gt;&lt;br /&gt;Otras opciones importantes a configurar son:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Timeout&lt;/b&gt;: cantidad de segundos hay que esperar al reloj para que de su respuesta. Un buen valor son 10 seg. Esto va a depender de la calidad de la red.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tolerance&lt;/b&gt;: si existen dos registraciones en el tiempo definido se toma como una sola. Un buen valor son 300 seg, o sea 5 minutos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Location&lt;/b&gt;: lugar físico donde se encuentra el reloj.&lt;br /&gt;&lt;br /&gt;Para probar el reloj puede apretar el boton de acción "Read clock". Aquí ya va a cargar todos los registros de asistencias (attendances) a la base de datos, por lo que recomiendo no hacerlo en el servidor de producción la primera prueba.&lt;br /&gt;&lt;br /&gt;El resultado de la lectura será una pantalla con los errores ocurridos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Recomendación. Una vez en producción es bueno leer el reloj en un lapso de tiempo predeterminado, eso puede hacerlo creando la siguiente entrada en el Planificador (Scheduler).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-sfrbm0iZ0Ao/TkE4BeDhXvI/AAAAAAAABnc/h3SQ2Z7WnEM/s1600/Pantallazo-OpenERP-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="136" src="http://4.bp.blogspot.com/-sfrbm0iZ0Ao/TkE4BeDhXvI/AAAAAAAABnc/h3SQ2Z7WnEM/s320/Pantallazo-OpenERP-2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Crear una nueva entrada por cada reloj conectado con los siguientes valores:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Nombre&lt;/b&gt;: Lectura del Reloj&lt;br /&gt;&lt;b&gt;Usuario&lt;/b&gt;: Administrador&lt;br /&gt;&lt;b&gt;Activo&lt;/b&gt;: Si&lt;br /&gt;&lt;b&gt;Prioridad&lt;/b&gt;: 5&lt;br /&gt;&lt;b&gt;Número de intervalo&lt;/b&gt;: 1&lt;br /&gt;&lt;b&gt;Unidad de intervalo&lt;/b&gt;: horas.&lt;br /&gt;&lt;b&gt;Próxima fecha de ejecución&lt;/b&gt;: Elegir alguna válida.&lt;br /&gt;&lt;b&gt;Número de ejecuciones&lt;/b&gt;: -1 (Infinitas veces)&lt;br /&gt;&lt;b&gt;Repetir perdidos&lt;/b&gt;: No&lt;br /&gt;&lt;br /&gt;Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-74EIYS3Id-I/TkE48mtUzWI/AAAAAAAABno/QMfssaoOEVo/s1600/Pantallazo-OpenERP-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="136" src="http://1.bp.blogspot.com/-74EIYS3Id-I/TkE48mtUzWI/AAAAAAAABno/QMfssaoOEVo/s320/Pantallazo-OpenERP-3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Eso es todo.&lt;br /&gt;&lt;br /&gt;Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-2811868317090031508?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/2811868317090031508/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2011/08/instalando-el-clockreader.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/2811868317090031508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/2811868317090031508'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2011/08/instalando-el-clockreader.html' title='Instalando el clock_reader'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-VVU0Utj9YFU/TkE4O8aprkI/AAAAAAAABnk/TfSDNhD1GFA/s72-c/Pantallazo-OpenERP.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-3865123401329389048</id><published>2011-06-04T22:02:00.001-03:00</published><updated>2011-06-04T22:02:35.213-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='v6.0'/><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='openerp-argentina'/><category scheme='http://www.blogger.com/atom/ns#' term='cuit'/><title type='text'>Modulo de CUIT para OpenERP 6.0</title><content type='html'>Hoy tengo dos novedades.&lt;br /&gt;&lt;br /&gt;Primero, he movido mi desarrollo de la versión 5.0 en un nuevo branch que llame &lt;i&gt;5.0&lt;/i&gt;. Y ahora el &lt;i&gt;trunk&lt;/i&gt; corresponde a la versión 6.0.&lt;br /&gt;&lt;br /&gt;Y con respecto a la segunda novedad, he implementado un nuevo módulo para soporte de CUIT argentino independiente del modulo original de openerp. Este nuevo se llama &lt;i&gt;base_vat_ar&lt;/i&gt;. Que ventajas tiene eso? Si se actualiza el módulo &lt;i&gt;base_vat&lt;/i&gt; en el trunk de openerp esta no afecta al sistema.&lt;br /&gt;&lt;br /&gt;Para usar este módulo en la versión 6 solo hay que instalar el módulo como cualquier otro y usar como prefijo &lt;i&gt;ar&lt;/i&gt; para indicar el originen del VAT, en nuestro caso CUIT. Ej: ar232X09X45X9&lt;br /&gt;&lt;br /&gt;Mis próximas actualizaciones se centrarán en &lt;i&gt;clock_reader&lt;/i&gt; y &lt;i&gt;hr_attendance_analysis&lt;/i&gt;, por lo que no se atrevan a usarlas.&lt;br /&gt;&lt;br /&gt;Mis módulos en la v5 están ahora en: &lt;i&gt;lp:~cristian-rocha/openerp-argentina/5.0&lt;/i&gt;&lt;br /&gt;y los módulos de la v6 están en: &lt;i&gt;lp:~cristian-rocha/openerp-argentina/trunk&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Advertencia&lt;/b&gt;: Si alguien está usando mis módulos, por favor tengan en cuenta de realizar actualizar las url de sus repositorios si no quieren perder los módulos, ya que estoy borrando algunos que encuentro obsoletos.&lt;br /&gt;&lt;br /&gt;Eso es todo por hoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-3865123401329389048?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/3865123401329389048/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2011/06/modulo-de-cuit-para-openerp-60.html#comment-form' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/3865123401329389048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/3865123401329389048'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2011/06/modulo-de-cuit-para-openerp-60.html' title='Modulo de CUIT para OpenERP 6.0'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-5781645289167294967</id><published>2011-05-26T10:38:00.000-03:00</published><updated>2011-05-26T10:38:12.675-03:00</updated><title type='text'>Samsung RF511 S01 y Debian</title><content type='html'>&lt;div&gt;Ayer en un ataque de locura y desesperación fui a Falabella y me conseguí una nueva notebook. Fui en contra de varios de mis principios.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Hay que comprar por Internet. En el negocio no solo perdes el tiempo en el viaje sino también discutiendo con el vendedor.&lt;br /&gt;El modelo tiene que ser de menos de 15''. Tiene que ser practica y no un mastodonte.&lt;/li&gt;&lt;li&gt;No DEBE tener lectora óptica de ningún tipo. No tiene sentido su existencia.&lt;/li&gt;&lt;li&gt;Pero claro, también queria algo poderoso para desarrollar y que sea lo mas compatible con linux.&lt;/li&gt;&lt;/ol&gt;Y terminé comprando en el negocio con 10% de descuento en Falabella, solo porque en las páginas web de las empresas no tienen ninguna opción (me fije en DELL, HP, Lenovo... nada!) De 15.6" y con un cacho de lectora grabadora Bluray compatible.&lt;br /&gt;&lt;br /&gt;Resultado: una increíblemente poderosa y apestosa máquina.&lt;br /&gt;&lt;br /&gt;Vayamos por parte.&lt;br /&gt;&lt;br /&gt;Esta maquina tiene uno de los mejores procesador i5 del mercado argentino. El i7 todavía sigue siendo raro en estas latitudes y muy caro.&lt;br /&gt;&lt;br /&gt;Lo que a mi mas me interesa es la placa gráfica. Y ahí me agarre un gran chasco! Definitivamente las placas nvidia siguen siendo las más poderosas y fácil de configurar en linux. Y esta maquina viene con una Gforge GT540M, una muy poderosa para notebooks. Pero... tambien trae una Intel! Si, tiene dos placas de video...&lt;br /&gt;&lt;br /&gt;Bue, el resumen es que esta nueva tecnología Optimus de Nvidia no esta oficialmente soportada para Linux. Entonces nació Bumblebee - Cortito, quien no sabe de los Tranformers, Optimus Prime es el héroe superpoderoso y Bumble Bee es el robotito mejor amigo de los humanos. La idea de esta tecnología es no comerse la batería con los 96 núcleos de la placa Nvidia, entonces la Nvidia solo se prende cuando hacemos lindos gráficos 3D.&lt;br /&gt;&lt;br /&gt;Bumblebee es un soporte de Optimus basado en la creación de dos instancias del X (El sistema core de la gráfica de Linux) uno donde corre la interface Intel oficial y otra donde corre la Gforge. El único problema que tiene es que no identifica automaticamente una aplicación 3D, sino que hay que indicarle con un comando al ejecutarla. Pero eso es lo de menos, porque la Intel también tiene su capacidad 3D. Es divertido ver a la Intel trabajando con Compiz y a la Gforge con biomoléculas de &amp;gt;32000 átomos.&lt;br /&gt;&lt;br /&gt;Bue, si quiren saber más de cómo configurar a &lt;a href="https://github.com/MrMEEE/bumblebee"&gt;Bumblebee debén ir a la página oficial&lt;/a&gt;. Pero antes le dejo dos tips:&lt;br /&gt;&lt;br /&gt;1) Descarga: git clone https://github.com/MrMEEE/bumblebee.git&lt;br /&gt;2) Usar la versión inestable de Debian.&lt;br /&gt;&lt;br /&gt;Eso es todo por hoy.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-5781645289167294967?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/5781645289167294967/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2011/05/samsung-rf511-s01-y-debian.html#comment-form' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/5781645289167294967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/5781645289167294967'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2011/05/samsung-rf511-s01-y-debian.html' title='Samsung RF511 S01 y Debian'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-7872533149662310090</id><published>2011-05-18T18:20:00.000-03:00</published><updated>2011-05-18T18:20:57.847-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proxy reverso'/><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='cherrypy-web'/><category scheme='http://www.blogger.com/atom/ns#' term='squid'/><title type='text'>Incompatibilidad de Squid y CherryPy</title><content type='html'>Esto va a ser rápido.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El Squid y el CherryPy no se llevan bien. La razón es porque CherryPy espera conocer la URL original a través de la cabecera de http "X-Forwarded-Host". Y claro, los únicos proxies reversos que añaden esa cabecera son Apache (mod_proxy) y Lighttp. Pero no ocurre eso con Squid. No es que Squid no publique esa información, sino que lo publica en la variable "Origin". El resultado es que pueden funcionar los dos sistemas al mismo tiempo excepto que modifiques parte del código el CherryPy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En archivo&amp;nbsp;lib/cptools.py, ubicado dentro de la raiz del CherryPy (v3) pueden encontrar la función proxy. Con solo modificar la variable de entrada de la función "local" que está seteada por defecto en "X-Forwarded-Host" a "Origin" es suficiente. Y se van a ahorrar un largo y sensible dolor de cabeza que me llevó unas 4hs resolver.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eso es todo, excepto que se pregunten a quien le sirve esta cháchara. Bue, en principio a quien quiera instalar el cliente Web del OpenERP detrás de un proxy reverso del tipo Squid.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-7872533149662310090?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/7872533149662310090/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2011/05/incompatibilidad-de-squid-y-cherrypy.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/7872533149662310090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/7872533149662310090'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2011/05/incompatibilidad-de-squid-y-cherrypy.html' title='Incompatibilidad de Squid y CherryPy'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-795017789930853669</id><published>2011-05-14T10:43:00.001-03:00</published><updated>2011-05-16T00:27:25.682-03:00</updated><title type='text'>Mi celular con Android</title><content type='html'>&lt;div&gt;&lt;p&gt;Luego de un tiempo largo buscando un celular con Sistema Operativo Linux he encontrado algo que me convence y mucho. Es verdad que la mayoria de los sistemas para celulares tiene alguna version de Unix, pero eso para mi no es sufiente. Es una necesidad absoluta tener la posibilidad de acceder al SDK en forma gratuita, y no hablar del c&amp;#243;digo fuente libre. Y Android cumple con todas estas pautas. Falta confirmar las licencias, pero por ahora no me parece relevante.&lt;/p&gt;&lt;p&gt;Sinteticamente, con una pobre experiencia de uso puedo decir que:&lt;/p&gt;&lt;p&gt;Ventajas:&lt;br&gt;1. Cantidad increible de aplicaci&amp;#243;nes.&lt;br&gt;2. Integraci&amp;#243;n al extremo con google.&lt;br&gt;3. SDK accesible.&lt;/p&gt;&lt;p&gt;Desventaja:&lt;br&gt;1. En mi modelo Motorola Slice se cuelga. La raz&amp;#243;n probable es que su memoria y procesador no son suficiente. Dicen que los modelos de Samsung son mucho mejores.&lt;br&gt;2. Usa mucho Internet para integrarse a google. Por suerte existe una aplicaci&amp;#243;n que previene a&amp;#160;las aplicaciones acceder a internet: apndroid.&lt;br&gt;3. La m&amp;#225;quina virtual SDK es increiblemente lenta en Linux, al menos.&lt;/p&gt;&lt;p&gt;La conclusi&amp;#243;n es que al fin alguien entendi&amp;#243; que un celular es parte de Internet. Sinceramente me sorprendi&amp;#243; la integraci&amp;#243;n, mucho mejor que iphone u otros. Quien quiera desarrollar para esta plataforma tiene que tener una perspectiva diferente.&lt;/p&gt;&lt;br/&gt;&lt;img src='http://lh4.ggpht.com/_1ulUI9kdwL8/TdCZmBJfhbI/AAAAAAAABdw/wnYmujN_wyM/1305516367439.png' /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-795017789930853669?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/795017789930853669/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2011/05/mi-celular-con-android.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/795017789930853669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/795017789930853669'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2011/05/mi-celular-con-android.html' title='Mi celular con Android'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_1ulUI9kdwL8/TdCZmBJfhbI/AAAAAAAABdw/wnYmujN_wyM/s72-c/1305516367439.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-2782771170629839598</id><published>2011-03-22T00:07:00.000-03:00</published><updated>2011-03-22T00:07:10.008-03:00</updated><title type='text'>Análisis de Asistencias, primera aproximación a la Liquidación de Sueldos</title><content type='html'>Luego de tres meses de intenso trabajo puedo decir que tengo listo mi próximo módulo: hr_attendance_analysis.&lt;br /&gt;&lt;br /&gt;Éste módulo permite realizar cálculos sobre las horas trabajadas por parte de los empleados. Acepta diversas fórmulas y cálculo de reglas para automatizar todo lo que más se pueda. Tanto que está pensado para trabajar (aunque no es necesario) con el módulo clock_reader.&lt;br /&gt;&lt;br /&gt;A pesar de ello el módulo tiene un workflow para ir confirmando la calidad de los datos de cada tipo de documentos: journal y payroll. El primer documento es la información diaria del empleado, mientras que payroll es el resumen del mes, quincena o jornada.&lt;br /&gt;&lt;br /&gt;Estos son los primeros screenshots del sistema.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-eaTp1tt0kTE/TYgPwC5q1SI/AAAAAAAABdU/OatNhHsKyhE/s1600/hraa_mainmenu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="194" src="https://lh3.googleusercontent.com/-eaTp1tt0kTE/TYgPwC5q1SI/AAAAAAAABdU/OatNhHsKyhE/s320/hraa_mainmenu.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;En esta imagen pueden ver el menú principal del manejo de recursos humanos. Ahí pueden ver las opciones para acceder a los documentos Payroll (el seleccionado) y Attendance Journals.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-cVo1cpsndAw/TYgQPXhTBcI/AAAAAAAABdg/0Ocrpv0kCRQ/s1600/hraa_payroll.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="https://lh5.googleusercontent.com/-cVo1cpsndAw/TYgQPXhTBcI/AAAAAAAABdg/0Ocrpv0kCRQ/s320/hraa_payroll.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Aquí pueden ver el documento con las horas resumidas de los empleados en un rango dado. Pueden dejarse notas por cada empleado y al documento completo. También se puede ver que&amp;nbsp; tiene dos estado básicos: draft y validado. Todavía falta desarrollar el workflow, para permitir cancelar y reiniciar el documento.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-8RuXZCyFCmo/TYgQN0F14GI/AAAAAAAABdc/dSIha8Aqgk8/s1600/hraa_journal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="https://lh5.googleusercontent.com/-8RuXZCyFCmo/TYgQN0F14GI/AAAAAAAABdc/dSIha8Aqgk8/s320/hraa_journal.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;En esta otra pantalla vemos la entrada del Journal del empleado. Aquí se ven en detalle las horas en que entró y salió en una fecha dada. También las licencias (Vacaciones, Licencias, Llegadas tarde, Salidas tempranas, Enfermedad, etc..). A la izquierda puede verse el resultado del cálculo de horas.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/--KEFSWg3sUk/TYgQM5km_UI/AAAAAAAABdY/3M-fA6MkyWw/s1600/hraa_payroll_formula.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="https://lh6.googleusercontent.com/--KEFSWg3sUk/TYgQM5km_UI/AAAAAAAABdY/3M-fA6MkyWw/s320/hraa_payroll_formula.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Esta es una fórmula de sumarización de los valores almacenados en el Journal, para ser mostrado por el documento Payroll.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-w2AGcr6TxRk/TYgQRE7vDFI/AAAAAAAABdk/BCZiwNVNo6M/s1600/hraa_journal_formula.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="https://lh4.googleusercontent.com/-w2AGcr6TxRk/TYgQRE7vDFI/AAAAAAAABdk/BCZiwNVNo6M/s320/hraa_journal_formula.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;En cambio esta es una fórmula para calcular las horas normales en un día determinado para un empleado determinado.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-Trs7yEnsoSs/TYgRmIe8GII/AAAAAAAABdo/93TWdWrgEkQ/s1600/hraa_action_reason_rule.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="https://lh5.googleusercontent.com/-Trs7yEnsoSs/TYgRmIe8GII/AAAAAAAABdo/93TWdWrgEkQ/s320/hraa_action_reason_rule.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;En esta captura, a diferencia de las dos anteriores, no se trata de una fórmula sino de una regla. Es una regla que asigna razones de acciones a las entradas y salidas de asistencias. En este caso podemos ver como calcular una salida temprano sin aviso.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Por ahora cuento esto. Todavía falta cerrar algunos puntos, pero me gustaría conocer opiniones y cambios que consideren importante a la hora de realizar Liquidación de Sueldos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-2782771170629839598?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/2782771170629839598/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2011/03/analisis-de-asistencias-primera.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/2782771170629839598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/2782771170629839598'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2011/03/analisis-de-asistencias-primera.html' title='Análisis de Asistencias, primera aproximación a la Liquidación de Sueldos'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-eaTp1tt0kTE/TYgPwC5q1SI/AAAAAAAABdU/OatNhHsKyhE/s72-c/hraa_mainmenu.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-5808447845918592277</id><published>2011-01-12T11:06:00.007-03:00</published><updated>2011-01-12T11:10:26.663-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='apaisado'/><category scheme='http://www.blogger.com/atom/ns#' term='reportlab'/><title type='text'>Reportes apaisados con OpenERP</title><content type='html'>Esta entrada tiene como objetivo explicar cómo apaisar un reporte ya generado con OpenERP y ReportLab. Si no sabes de que estoy hablando puedes, como mucho leer, los tres primeros parrafos, si ya sabes de que se trata pasa directamente al cuarto parrafo.&lt;br /&gt;&lt;br /&gt;OpenERP utiliza en su nucleo a ReportLab como generador de reportes. &lt;a href="http://www.reportlab.com/software/opensource/"&gt;ReportLab&lt;/a&gt; es un software capaz de generar archivos PDF a partir de funciones de python. Y una de esas funciones permite generar un reporte a partir una plantilla en XML, o en forma más específica RML.&lt;br /&gt;&lt;br /&gt;El lenguaje RML es en esencia muy parecido a XHTML. Tiene tags como TD, TR, PARA para describir la organización del documento, y tiene además otros tags ya más específicos de la impresión de la hoja. Si quiere aprender más de éste lenguaje recomiendo ller el &lt;a href="http://www.reportlab.com/docs/rml2pdf-userguide.pdf"&gt;User Guide de RML&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;El tag que nos incumbe es el &lt;template&gt; que justamente nos permite describir cómo se va imprimir el reporte. En la cabeza del archivo RML&amp;nbsp;existe una entrada &amp;nbsp;de template como la siguiente:&lt;/template&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;template allowsplitting="True" author="Cristian S. Rocha" pagesize="(595.0, 842.0)" title="Daily Report"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;que indica el tamaño de la página (pageSize), el título del reporte (title), el autor (author) y el reporte se va a dividir en varias páginas.&lt;br /&gt;&lt;br /&gt;Para lograr reportes apaisados hay que intercambiar el alto por el largo de la página, quedando la linea anterior cómo:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;template allowsplitting="True" author="Cristian S. Rocha" pagesize="&lt;/span&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;(842.0, 595.0)&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;" title="Daily Report"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pero con esto no es suficiente, debemos modificar el método de rendering de la página. Para ello la gente de OpenERP ha desarrollado el módulo "rml_parse.py" que justamente modifica la forma de leer el archivo para permitir la impresión apaisada.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Imaginemos que ya tenemos un reporte y lo queremos apaisar. Éste debería encontrarse en un directorio llamado report dentro de ótro directorio correspondiente a la extención de OpenERP que estamos modificando. Por supuesto, todo dentro del directorio addons. El primer paso seria copiar el archivo "rml_parse.py" al directorio report. Este archivo puede encontrarse en otros directorios reports de alguna extensión (&lt;span class="Apple-style-span" style="color: magenta;"&gt;locate rml_parse.py&lt;/span&gt; es una instrucción en BASH que va ayudar a localizarlo).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una vez copiado el archivo hay que modificar el método de rendering en el módulo de python asociado al reporte. Por ejemplo, si tienes un archivo &lt;span class="Apple-style-span" style="color: purple;"&gt;test.rml&lt;/span&gt; en el directorio report deberías tener otro archivo &lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;test.py&lt;/span&gt;&lt;/span&gt; con la siguiente linea en su interior:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;report_sxw.report_sxw('report.my_addon.test', 'hr.employee',&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'addons/my_addon/report/&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;test.rml&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;',parser=test_class, header=2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ese archivo debería tambien contener la siguiente linea&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;class test_class(report_sxw.rml_parse):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;que la debemos cambiar por&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;class test_class(&lt;/span&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;rml_parse&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;.rml_parse):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;y agregar al comienzo del archivo la linea:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;import rml_parse&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;y con eso ya podemos disfrutar del informe apaisado. Por supuesto, hay que acomodar las tablas y texto para que quede acorde a las nuevas coordenadas.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-5808447845918592277?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/5808447845918592277/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2011/01/reportes-apaisados-con-openerp.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/5808447845918592277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/5808447845918592277'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2011/01/reportes-apaisados-con-openerp.html' title='Reportes apaisados con OpenERP'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-3415678642502337166</id><published>2011-01-05T11:50:00.002-03:00</published><updated>2011-01-05T11:52:28.988-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='recursos humanos'/><category scheme='http://www.blogger.com/atom/ns#' term='modulo'/><category scheme='http://www.blogger.com/atom/ns#' term='argentina'/><category scheme='http://www.blogger.com/atom/ns#' term='asistencia'/><category scheme='http://www.blogger.com/atom/ns#' term='reloj'/><title type='text'>Nuevo módulo para conectar relojes de control de personal con OpenERP</title><content type='html'>Aquí vamos de nuevo, pero esta vez con algo original desarrollado por mis socios y yo.&amp;nbsp; Luego de un par de semanas tenemos el agrado de comunicarles que ya tenemos la versión Beta del módulo "clock_reader". Éste permite conectarse con el reloj &lt;a href="http://www.digitouno.com.ar/f5.html"&gt;F5&lt;/a&gt; distribuido por Dígito-Uno en Buenos Aires, y aparentemente con el modelo de reloj G3T de &lt;a href="http://www.asensiosistemas.net/VerProducto.php?Producto=G3T"&gt;Asensio Sistemas&lt;/a&gt; que se puede encontrar en Rosario. &lt;br /&gt;&lt;br /&gt;El módulo está preparado para leer más de un reloj, que pueden estar conectados en diferentes lugares de la empresa o incluso tener varios en una entrada en el caso que se quiera tener un backup o simplemente se quiera contabilizar el acceso de muchos empleados en un lapso más corto.&lt;br /&gt;&lt;br /&gt;Aquí les presento algunas pantallas, empezando la solapa del módulo. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_1ulUI9kdwL8/TSSCR6UARjI/AAAAAAAABcM/S1ge4uMrWrY/s1600/Pantallazo-OpenERP-ClockReader.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://3.bp.blogspot.com/_1ulUI9kdwL8/TSSCR6UARjI/AAAAAAAABcM/S1ge4uMrWrY/s320/Pantallazo-OpenERP-ClockReader.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;El módulo crea un nuevo objeto "clock" que puede listarse desde la opción "Clock" del menú "Recursos Humanos" opción "Configuración".&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_1ulUI9kdwL8/TSSDzZKlWXI/AAAAAAAABcQ/_I8wlBbOI1o/s1600/Pantallazo-OpenERP-RH.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://1.bp.blogspot.com/_1ulUI9kdwL8/TSSDzZKlWXI/AAAAAAAABcQ/_I8wlBbOI1o/s320/Pantallazo-OpenERP-RH.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Éste objeto tiene como atributos el nombre del reloj, la URI al reloj (ver más adelante), el modelo o driver a utilizar, una localización y si está activo o no.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_1ulUI9kdwL8/TSSECKtHnHI/AAAAAAAABcU/QFkGltu4HEc/s1600/Pantallazo-OpenERP-Clock.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://2.bp.blogspot.com/_1ulUI9kdwL8/TSSECKtHnHI/AAAAAAAABcU/QFkGltu4HEc/s320/Pantallazo-OpenERP-Clock.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Y para realizar la lectura hay que acceder al menú "Recursos Humanos" y presionar la copión "Clock read" dentro de la opción "Asistencias".&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_1ulUI9kdwL8/TSSEe4BLRSI/AAAAAAAABcY/T4f81O5MRDw/s1600/Pantallazo-OpenERP-ExecRead.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://3.bp.blogspot.com/_1ulUI9kdwL8/TSSEe4BLRSI/AAAAAAAABcY/T4f81O5MRDw/s320/Pantallazo-OpenERP-ExecRead.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;La ejecución solo presenta una ventana donde se confirma que se quiere leer el reloj. Y una vez leído, presenta una ventana con la cantidad de asistencias leídas y los errores que se cometieron.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;He preparado todo para aceptar más de un modelo de reloj, pero como solo tengo acceso a un modelo F5 solo pude programar ese módulo. Si quieren agregar un nuevo modelo hay que desarrollar una clase python que tenga la siguiente interface:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;def __init__(self, uri)&lt;/b&gt;: Permite iniciar la clase del reloj. El URI es un string que describe el puerto donde uno se conecta. Por ejemplo, como el reloj permite conección por UDP el URI que usamos es: udp://192.168.1.20:9999&lt;/li&gt;&lt;li&gt;&lt;b&gt;def test(self): &lt;/b&gt;Chequea que se puede conectar al reloj. Devuelve False si no es posible. En la clase para el reloj F5 es conveniente indicar un timeout, porque si el reloj no está conectado puede que entre en un loop infinito. Yo estoy usando un timeout de 3 seg. Y todo esto por usar un protocolo como el UDP. &lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;def connect(self)&lt;/b&gt;: Prepara la clase para que pueda realizar las próximas operaciones. Puede también devolver información del dispositivo. Por ejemplo, en mi clase devuelve la versión del Firmware.&lt;/li&gt;&lt;li&gt;&lt;b&gt;def attendance(self):&lt;/b&gt; Es una función de iteración que devuelve en cada iteración cada asistencia con información del identificador del reloj, la hora y si es entrada o salida. También puede devolver el método de entrada que realizó: por el teclado, con tarjeta o con huellas digitales.&lt;/li&gt;&lt;li&gt;&lt;b&gt;def clean(self):&lt;/b&gt; Borra los registros almacenados en el reloj. &lt;/li&gt;&lt;li&gt;&lt;b&gt;def disconnect(self):&lt;/b&gt; Se desconecta del reloj.&lt;/li&gt;&lt;/ul&gt;Con una clase que cumpla con esta interface, el sistema de lectura ejecuta cada reloj activo y agrega las asistencias al módulo hr_attendance de OpenERP.&lt;br /&gt;&lt;br /&gt;Con respecto a agregar asistencias, el OpenERP tiene en cuenta que no se pueda ingresar sin antes haber salido, y al revés. Pero muchas veces los relojes no pueden controlar la situación, los empleados tienen muchas escusas para no registrarse en el reloj (el trabajo manual les elimina las huellas digitales, por ejemplo) por lo tanto es difícil complacer las restricciones del OpenERP. Una solución que estoy estudiando poder crear automáticamente las salidas y las entradas según el turno que debe cumplir el empleado para luego ser modificadas manualmente.&lt;br /&gt;&lt;br /&gt;Con respecto a la ingeniería inversa necesaria para desarrollar más controladores de reloj, pueden buscar en el directorio &lt;b&gt;test&lt;/b&gt; dos interesantes archivos de python.&lt;br /&gt;&lt;br /&gt;El primero, &lt;b&gt;research.py&lt;/b&gt;, tiene una función para leer capturas realizadas con Wireshark o cualquier otro que exporte las capturas en XML PDML (readpackets). También tiene funciones para chequear que la conexión no es encriptada (plothistogram) como también para buscar patrones (dotplot y align) &lt;br /&gt;&lt;br /&gt;El segundo, &lt;b&gt;server_f5.py&lt;/b&gt;, es un reloj virtual que toma una captura (deje tres en el directorio data) y se queda escuchando para que el cliente que ustedes programen se conecte y le realice las consultas.&lt;br /&gt;&lt;br /&gt;Si alguno de ustedes necesita ayuda para desarrollar un nuevo módulo, no duden en pedir ayuda. Incluso si el reloj se conecta por RS232 o USB.&lt;br /&gt;&lt;br /&gt;Me olvidaba, el módulo lo pueden obtener en Launchpad:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://code.launchpad.net/%7Ecristian-rocha/openerp-argentina/trunk/clock-reader"&gt;https://code.launchpad.net/~cristian-rocha/openerp-argentina/trunk/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-3415678642502337166?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/3415678642502337166/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2011/01/nueva-modulo-para-conectar-relojes-de.html#comment-form' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/3415678642502337166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/3415678642502337166'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2011/01/nueva-modulo-para-conectar-relojes-de.html' title='Nuevo módulo para conectar relojes de control de personal con OpenERP'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_1ulUI9kdwL8/TSSCR6UARjI/AAAAAAAABcM/S1ge4uMrWrY/s72-c/Pantallazo-OpenERP-ClockReader.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-5424641179127525760</id><published>2011-01-05T10:58:00.000-03:00</published><updated>2011-01-05T10:58:15.291-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='addons'/><category scheme='http://www.blogger.com/atom/ns#' term='argentina'/><category scheme='http://www.blogger.com/atom/ns#' term='bazaar'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Módulos no oficiales de OpenERP para Windows, ó simplemente Bazar en Windows</title><content type='html'>OpenERP tiene varios módulos no oficiales. La mayoría de ellos se encuentran en un sistema de repositorios conocido como &lt;a href="http://launchpad.net/"&gt;Launchpad&lt;/a&gt;, un repositorio de código fuente pensado para  aplicaciones opensource. Ahí podemos encontrar OpenERP en su forma más pura en su última versión. Pero no voy hablar de OpenERP en este post, sino de otros módulos, como son los de OpenERP Argentina.&lt;br /&gt;&lt;br /&gt;Launchpad funciona con un sistema de control de versiones (CVS) distribuido conocido como &lt;a href="https://launchpad.net/bzr"&gt;Bazaar&lt;/a&gt;. Este sistema es un tanto complicado de usar, especialmente para un desarrollador, pero para un usuario con seguir los pasos básicos es suficiente.&lt;br /&gt;&lt;br /&gt;Bazaar y Lauchpad ya tiene suficiente soporte en Unix (Linux en particular), por lo tanto decidí realizar el post para Windows y por suerte tengo VirtualBox.&lt;br /&gt;&lt;br /&gt;Primero tienen que descargar el Bazaar para Windows &lt;a href="http://wiki.bazaar.canonical.com/WindowsDownloads"&gt;aquí&lt;/a&gt;. Si no saben manejarse con Python les recomiendo que descarguen el paquete completo de la versión estable&amp;nbsp;2.2. Una vez descargado ejecuten e instalen.&lt;br /&gt;&lt;br /&gt;Una vez instalado ya podrán ejecutar el "Bazaar Explorer", que le abre una primera pantalla tal como se ve en la siguiente imagen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_1ulUI9kdwL8/TSR4fV63CXI/AAAAAAAABcE/WYHl0uH-fH4/s1600/bazaar01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="224" src="http://2.bp.blogspot.com/_1ulUI9kdwL8/TSR4fV63CXI/AAAAAAAABcE/WYHl0uH-fH4/s320/bazaar01.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Lo que vamos a hacer en este caso es descargar el OpenERP-Argentina. Éste se encuentra en el repositorio OpenERP lp:openerp-argentina, y lo vamos a descargar dentro del directorio Sources. Esto se hace desde a opción "Obtener fuente del proyecto.." de la imagen anterior, en donde se abrirán otras dos opciones: "Rama" u "Obtener". Lo que queremos hacer, ya que estamos interesados en usar el módulo y no en desarrollar, elegimos la opción "Obtener". Ahí indicamos el repositorio y el destino del fuente como se ve en la próxima imagen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_1ulUI9kdwL8/TSR4mdIIBDI/AAAAAAAABcI/K7Kxb-QmmYU/s1600/bazaar02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="269" src="http://4.bp.blogspot.com/_1ulUI9kdwL8/TSR4mdIIBDI/AAAAAAAABcI/K7Kxb-QmmYU/s320/bazaar02.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Aceptamos y empieza la descarga del código fuente. Gracias a que el código está en Python no va a ser necesario compilar por lo que una vez terminada la descarga solo tenemos que copiar el módulo al directorio addons del OpenERP.&lt;br /&gt;&lt;br /&gt;Con esto tienen suficiente para divertirse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-5424641179127525760?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/5424641179127525760/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2011/01/modulos-no-oficiales-de-openerp-para.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/5424641179127525760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/5424641179127525760'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2011/01/modulos-no-oficiales-de-openerp-para.html' title='Módulos no oficiales de OpenERP para Windows, ó simplemente Bazar en Windows'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_1ulUI9kdwL8/TSR4fV63CXI/AAAAAAAABcE/WYHl0uH-fH4/s72-c/bazaar01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-8225941032690926937</id><published>2010-12-24T20:46:00.001-03:00</published><updated>2010-12-24T20:46:57.294-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='argentina'/><category scheme='http://www.blogger.com/atom/ns#' term='reportes'/><category scheme='http://www.blogger.com/atom/ns#' term='facturación'/><title type='text'>Diseño de Facturas en OpenERP</title><content type='html'>Acabo de darme cuenta que uno de los problemas más complicados de resolver sin ayuda en OpenERP es el diseño de Facturas.&lt;br /&gt;&lt;br /&gt;Las facturas en OpenERP son reportes, eso significa que si modificamos el diseño de una factura, los reportes sufrirán su suerte. Que quiero decir con esto? Que si utiliza facturas pre-impresas, los reportes deberán perder toda su gracia, llámese cabeza y pie de página. Lo que no se si es válido es pedir a la imprenta que no sean ellos quienes impriman la cabeza y el pie de página, sino apenas el número y letra de la factura, y como mucho el encuadre.&lt;br /&gt;&lt;br /&gt;Pero supongamos que queremos quedarnos con las facturas ya impresas. Entonces hay que eliminar lo dicho previamente. Eso se logra en el árbol&amp;nbsp; de &lt;span style="color: red;"&gt;Administración&lt;/span&gt;, opción &lt;span style="color: orange;"&gt;Usuarios&lt;/span&gt;/&lt;span style="color: orange;"&gt;Estructura de la Compañía&lt;/span&gt;/&lt;span style="color: orange;"&gt;Compañías&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_1ulUI9kdwL8/TRT-hRXRWaI/AAAAAAAABcA/rhn2Zm6t51o/s1600/Pantallazo-OpenERP.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://4.bp.blogspot.com/_1ulUI9kdwL8/TRT-hRXRWaI/AAAAAAAABcA/rhn2Zm6t51o/s320/Pantallazo-OpenERP.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Ahí habrá que seleccionar nuestra compañía y modificar en la pestañas &lt;span style="color: orange;"&gt;Cabecera / Pie de página&lt;/span&gt; la entrada en XML al siguiente XML:&lt;br /&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;header&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;/header&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para la primera página ya hemos limpiado la cabeza y pie de página. Si se quiere lo mismo para el resto de las páginas habrá que modificar el XML en la pestaña &lt;span style="color: orange;"&gt;Cabera / Pie de página interna&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Esto eliminará en todos los informes el texto de cabeza y pie de página. Lo que no eliminará es el logo. Tendremos que ir a la pestaña &lt;span style="color: orange;"&gt;Información General&lt;/span&gt; y eliminar la imagen presionando sobre el icono de la escoba.&lt;br /&gt;&lt;br /&gt;Ahora el tema se complica. Eliminado el texto molesto, hay que generar el informe. El diseño del mismo está en el código XML que describe el reporte, y éste se encuentra en el sistema de archivos del servidor OpenERP.&lt;br /&gt;&lt;br /&gt;Una vez dentro del servidor hay que acceder a ese archivo que se llama &lt;span style="color: blue;"&gt;invoice.rml&lt;/span&gt;. Y se encuentra en el directorio &lt;span style="color: blue;"&gt;addons/account/report&lt;/span&gt; a partir del raíz del servidor. En mi sistema Debian lo encuentro en forma absoluta en &lt;span style="color: blue;"&gt;/usr/share/pyshared/openerp-server/addons/account/report&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;Este archivo ya tiene información, en general mucha, y sobra si tenemos la factura preimpresa. Una buena práctica es copiar el archivo en el mismo directorio a algún nombre tipo &lt;span style="color: blue;"&gt;invoice.rml.ori&lt;/span&gt; para no perder el archivo que sabemos que funciona. Y luego editar en el.&lt;br /&gt;&lt;br /&gt;El formato de estos archivos es RML, o sea, un XML diseñado para Reportes por el grupo de desarrolladores de &lt;a href="http://www.reportlab.com/software/opensource/"&gt;ReportLab&lt;/a&gt;. Para leer más detalles de éste formato pueden encontrarlo en este &lt;a href="http://www.reportlab.com/docs/rml2pdf-ds.pdf"&gt;documento&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Este archivo contiene tres marcadores importantes: &lt;span style="color: cyan;"&gt;template&lt;/span&gt;, &lt;span style="color: cyan;"&gt;stylesheet&lt;/span&gt; e &lt;span style="color: cyan;"&gt;story&lt;/span&gt;. Y de las tres, la que nos interesa son &lt;span style="color: cyan;"&gt;template&lt;/span&gt; y &lt;span style="color: cyan;"&gt;story&lt;/span&gt;.&amp;nbsp; En &lt;span style="color: cyan;"&gt;template&lt;/span&gt; describiremos como se distribuye el texto en la página y en &lt;span style="color: cyan;"&gt;story&lt;/span&gt; definiremos el texto en si.&lt;br /&gt;&lt;br /&gt;Por ejemplo podemos definir secciones para la fecha, el cliente y su dirección de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;pageTemplate&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;id=&lt;/span&gt;&lt;span style="color: green;"&gt;"first"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;frame&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;id=&lt;/span&gt;&lt;span style="color: green;"&gt;"date"&lt;/span&gt;      &lt;span style="color: #2040a0;"&gt;x1=&lt;/span&gt;&lt;span style="color: green;"&gt;"13.5cm"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;y1=&lt;/span&gt;&lt;span style="color: green;"&gt;"21.5cm"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;width=&lt;/span&gt;&lt;span style="color: green;"&gt;"5.5cm"&lt;/span&gt;  &lt;span style="color: #2040a0;"&gt;height=&lt;/span&gt;&lt;span style="color: green;"&gt;"1.2cm"&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;frame&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;id=&lt;/span&gt;&lt;span style="color: green;"&gt;"partner"&lt;/span&gt;   &lt;span style="color: #2040a0;"&gt;x1=&lt;/span&gt;&lt;span style="color: green;"&gt;"3.5cm"&lt;/span&gt;  &lt;span style="color: #2040a0;"&gt;y1=&lt;/span&gt;&lt;span style="color: green;"&gt;"18.9cm"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;width=&lt;/span&gt;&lt;span style="color: green;"&gt;"15.5cm"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;height=&lt;/span&gt;&lt;span style="color: green;"&gt;"1.2cm"&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;frame&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;id=&lt;/span&gt;&lt;span style="color: green;"&gt;"address"&lt;/span&gt;   &lt;span style="color: #2040a0;"&gt;x1=&lt;/span&gt;&lt;span style="color: green;"&gt;"4.0cm"&lt;/span&gt;  &lt;span style="color: #2040a0;"&gt;y1=&lt;/span&gt;&lt;span style="color: green;"&gt;"18.0cm"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;width=&lt;/span&gt;&lt;span style="color: green;"&gt;"15.0cm"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;height=&lt;/span&gt;&lt;span style="color: green;"&gt;"1.2cm"&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/pageTemplate&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;y la forma de asignarle un texto a cada sección es:&lt;br /&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;story&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;para&lt;/font&gt; &lt;font color="#2040a0"&gt;style=&lt;/font&gt;&lt;font color="#008000"&gt;'body'&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;31/12/2010&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;/para&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;nextFrame/&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;condPageBreak&lt;/font&gt; &lt;font color="#2040a0"&gt;height=&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;12&amp;quot;&lt;/font&gt;&lt;font color="#2040a0"&gt;/&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;para&lt;/font&gt; &lt;font color="#2040a0"&gt;style=&lt;/font&gt;&lt;font color="#008000"&gt;'body'&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;Cristian Sebastian Rocha&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;/para&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;nextFrame/&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;condPageBreak&lt;/font&gt; &lt;font color="#2040a0"&gt;height=&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;12&amp;quot;&lt;/font&gt;&lt;font color="#2040a0"&gt;/&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;para&lt;/font&gt; &lt;font color="#2040a0"&gt;style=&lt;/font&gt;&lt;font color="#008000"&gt;'body'&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;Av. Rivadavia 555&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;/para&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;/story&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Por supuesto que si escribimos ese texto, siempre imprimiremos el mismo cliente con la misma dirección. Aquí hay que poner texto python de la siguente manera:&lt;br /&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;story&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;para&lt;/font&gt; &lt;font color="#2040a0"&gt;style=&lt;/font&gt;&lt;font color="#008000"&gt;'body'&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;[[ formatLang(o.date_invoice,date=True) ]]&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;/para&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;nextFrame/&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;condPageBreak&lt;/font&gt; &lt;font color="#2040a0"&gt;height=&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;12&amp;quot;&lt;/font&gt;&lt;font color="#2040a0"&gt;/&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;para&lt;/font&gt; &lt;font color="#2040a0"&gt;style=&lt;/font&gt;&lt;font color="#008000"&gt;'body'&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;[[ o.partner_id.title or '' ]] [[ o.partner_id.name ]]&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;/para&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;nextFrame/&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;condPageBreak&lt;/font&gt; &lt;font color="#2040a0"&gt;height=&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;12&amp;quot;&lt;/font&gt;&lt;font color="#2040a0"&gt;/&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;para&lt;/font&gt; &lt;font color="#2040a0"&gt;style=&lt;/font&gt;&lt;font color="#008000"&gt;'body'&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;[[ o.address_invoice_id.street ]]&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;/para&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;&lt;strong&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;/story&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Con esto ya es suficiente para empezar a imprimir en todas las facturas preimpresas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-8225941032690926937?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/8225941032690926937/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/diseno-de-facturas-en-openerp.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/8225941032690926937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/8225941032690926937'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/diseno-de-facturas-en-openerp.html' title='Diseño de Facturas en OpenERP'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_1ulUI9kdwL8/TRT-hRXRWaI/AAAAAAAABcA/rhn2Zm6t51o/s72-c/Pantallazo-OpenERP.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-2601299869420247641</id><published>2010-12-18T10:58:00.002-03:00</published><updated>2010-12-18T11:28:06.585-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='openerp-argentina'/><category scheme='http://www.blogger.com/atom/ns#' term='diarios financieros'/><category scheme='http://www.blogger.com/atom/ns#' term='diarios analíticos'/><category scheme='http://www.blogger.com/atom/ns#' term='facturación'/><title type='text'>Facturación en Argentina con OpenERP, primera aproximación</title><content type='html'>Luego de un tiempo largo estudiando cómo permitir la facturación en OpenERP he logrado llegar a algunas conclusiones. Aquí voy a describir primero que casos existen en argentina y como se podría llegar a encarar cada uno de ellos.&lt;br /&gt;&lt;h4&gt;Modos de facturación.&lt;/h4&gt;En Argentina se trabaja con cinco tipo de facturas diferentes: A, B, C, M y E. Éstas están grabadas de diferente manera con el IVA y su emisión depende del emisor y receptor de la misma. Incluso podría haber otro impuesto que desconozco.&lt;br /&gt;&lt;br /&gt;Aquí hay varios puntos importantes para quien quiera facturar:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Informes de IVA ventas y compras:&lt;/b&gt; El usuario debe poder identificar cuanto tiene que pagar al AFIP según lo que se vendió y compró. Eso sale de éste informe. Para generar este informe hay que identificar los impuestos gravados en cada operación. El &lt;i&gt;OpenERP &lt;/i&gt;permite asignar los impuestos desde la emisión de la factura o desde la definición del producto. La solución a este punto es crear el Diario de IVA ventas y compras. Éste está incluido en la localización argentina.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Impresión de Facturas:&lt;/b&gt; Aquí hay cuatro casos disjuntos en la Argentina:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Se imprime los detalles sobre una factura &lt;/i&gt;&lt;b&gt;&lt;i&gt;preimpresa&lt;/i&gt;&lt;/b&gt;&lt;i&gt;, y &lt;/i&gt;&lt;b&gt;&lt;i&gt;NO&lt;/i&gt;&lt;/b&gt;&lt;i&gt; hay interés de &lt;/i&gt;&lt;b&gt;&lt;i&gt;asociar el # de factura al # de asiento&lt;/i&gt;&lt;/b&gt;&lt;i&gt;:&lt;/i&gt; Este caso es el más sencillo ya que casi no hay que&amp;nbsp;modificar&amp;nbsp;la configuración inicial de&amp;nbsp;OpenERP. Simplemente se utiliza un único diario donde se asientan los movimientos.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Se imprime los detalles sobre una factura &lt;/i&gt;&lt;b&gt;&lt;i&gt;preimpresa&lt;/i&gt;&lt;/b&gt;&lt;i&gt;, y &lt;/i&gt;&lt;b&gt;&lt;i&gt;SI&lt;/i&gt;&lt;/b&gt;&lt;i&gt; hay interés de&lt;/i&gt;&lt;b&gt;&lt;i&gt; asociar el # de factura al # de asiento&lt;/i&gt;&lt;/b&gt;: Para este caso hay que asociar un diario por cada tipo de factura y al configurar por primera vez hay que indicar cual es el número de factura se va a imprimir en el próximo movimiento. Esto es fácil, el OpenERP tiene la posibilidad de armar tantos Diarios como sean necesarios, y también asociar a cada diario con una secuencia diferente. Por lo tanto solo hay que generar tantos diarios de comprar y venta como sean necesarios para cada tipo de factura, e igual manera con las secuencias.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Se imprime la factura completa, no hay preimpresión&lt;/i&gt;. En éste caso se usa una &lt;b&gt;impresora homologada&lt;/b&gt; por la AFIP ya que hay que garantizar que no se puede saltear o duplicar el número de factura. En el caso que se quiera hacer hay que configurar el OpenERP tal como se explica en el caso anterior y mandar a imprimir con el número de factura generada por OpenERP.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Se realiza &lt;b&gt;factura electrónica&lt;/b&gt;.&lt;/i&gt;&amp;nbsp;Este sistema permite imprimir la factura y asentar el documento fiscal en el servidor de la AFIP. Es realmente cómodo ya que uno está declarando de forma automática las operaciones realizadas. Para ello hay que estar constantemente conectado a Internet, donde la comunicación al servidor es a través de WebServices, dando la opción de trabajar con diversas tecnologías. Si todavía hay preguntas sobre esto, como son : Qué es? Cómo se implementa? Cuándo tiene lógica usarla? Quién puede usarla? pueden buscar más información &lt;a href="http://www.afip.gob.ar/fe/"&gt;aquí&lt;/a&gt;. Cabe aclarar que existe un módulo publicado en la localización de OpenERP para Argentina. Todavía no lo implementé, pero leyendo la &lt;a href="http://www.afip.gob.ar/eFactura/documentos/manual_desarrollador_COMPG_v1.pdf"&gt;documentación para desarrolladores&lt;/a&gt; de facturación electrónica, se puede llegar a adaptar fácilmente a los requerimientos del cliente.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Devoluciones&lt;/b&gt;, tanto por parte del cliente como por parte del proveedor. El usuario debería poder asentar estos movimientos, y el OpenERP lo permite. No me queda claro&amp;nbsp; si está implementado tal como se tiende a usar en la Argentina, especialmente con varios tipos de facturas. Si la devolución es de una facturación de tipo A, debería asentarse en el diario asociado a la factura de tipo A? O es otro diario complemente diferente?&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;Secuencias, Diarios y Asientos&lt;/h4&gt;&lt;div&gt;El manejo de finanzas en OpenERP se manejan a través de estas tres entidades. Las secuencias manejan la numeración de los asientos en los diarios. El diario es donde se colectan los asientos, y los asientos son cada movimiento fiscal: emisión de facturas, devoluciones, pagos, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Se pueden crear tantas secuencias como se quiera, es una entidad base de OpenERP y también puede asociarse a movimientos de stock u otra entidad que necesite enumerar las "operaciones".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Existen dos tipos de Diarios, el primero asociado a asientos legales (Diario financiero) y el otro a asientos internos (Diarios Analíticos). El OpenERP permite cruzar estos diarios y así poder tener diferentes vistas de un movimiento fiscal. Por ejemplo un movimiento de facturación se va a asentar en el "Diario Ventas" en la cuenta "Ingreso por Ventas" y se podría asentar también en el "Diario Vendedores" como una cuenta de "Ventas realizadas por Cristian", como también en el "Diario de Productos" como una cuenta de "Camisetas". La primer diario es financiero, mientras que los dos últimos son analíticos. De esta manera se va a poder observar las ventas realizadas por Cristian y las Ventas totales realizadas del producto Camiseta.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Los asientos ya son entidades bastante complejas porque no solo permiten aparecer en varios diarios al mismo tiempo y con diferente numeración, sino también porque permite tener información del tipo de movimiento. Un tema escabroso pero no imposible de abordar son las cuentas asociadas a los diferentes diarios. En general éstos son los que marcan&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Entonces, ya se pueden imaginar como trabajar con las facturas? Bien, el secreto está en crear tantos diarios como vistas de movimientos se quiera realizar. Sencillo? No tanto, porque puede que necesiten agregar diarios a las facturas ya que necesitan realizar muchas vistas, Pero no asustarse, todo puede arreglarse por el lado de la programación.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eso es todo por ahora. Espero en la próxima entrega trabajar ya con automatización de procesos.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-2601299869420247641?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/2601299869420247641/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/facturacion-en-argentina-con-openerp.html#comment-form' title='6 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/2601299869420247641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/2601299869420247641'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/facturacion-en-argentina-con-openerp.html' title='Facturación en Argentina con OpenERP, primera aproximación'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-2061569471601635884</id><published>2010-12-04T01:10:00.001-03:00</published><updated>2010-12-04T01:12:21.699-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><category scheme='http://www.blogger.com/atom/ns#' term='licencia'/><title type='text'>Licencia OpenERP</title><content type='html'>Lo poco que voy a comentar ahora es el resultado de leer detalladamente las licencias del desarrollador de OpenERP. Las mismas puedes leerlas &lt;a href="http://doc.openerp.com/legal/license.html"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para OpenERP existes dos licencias que se pueden aplicar.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Empezando por el &lt;b&gt;servidor de openerp&lt;/b&gt; nos encontramos con la famosa y bien querída GPL V3. Ésta licencia no existe en español, nadie la ha traducido en términos oficiales y la razón principal es la pérdida del espíritu de la licencia al traducirla. Es por ello que no es bien vista la traducción, y si se tiene que defender legalmente solo queda hacerlo en ingles. No quiero entrar en detalles muy técnicos, pero la licencia se aplica a software libre. Asegura que todo software liberado podrá ser compartido y modificado por la comunidad (usted es parte de esa comunidad) sin necesidad de retribuir a nadie. Los autores mantienen su caracter de tal y eso nunca se pierde. O sea, los autores ceden el derecho de copia y modificación, pero nunca la autoría. [&lt;a href="http://gugs.sindominio.net/licencias/gpl-2-es_MX.html"&gt;traducción no oficial de la licencia GPL al español&lt;/a&gt;] Esta licencia también protege a las &lt;b&gt;extensiones&lt;/b&gt; y al &lt;b&gt;cliente GTK&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;En cambio el&lt;b&gt; cliente web&lt;/b&gt; no tiene esa misma libertad. Tal como dice la documentación, la licencia se conoce como "OpenERP Public License", que es equivalente a la&amp;nbsp;&lt;a href="http://www.mozilla.org/MPL/MPL-1.1.html"&gt;Mozilla Public License (MPL) v1&lt;/a&gt;, pero con algunas modificaciones. La MPL es una licencia también para software libre, pero libera a los desarrolladores y usuarios explotar económicamente el software. Las salvedades que hablabamos corresponde a promocionar a las empresas que desarrollaron el soft imposibilitando eliminar sus logos de las páginas generadas por el cliente web. En si, se puede quitar algunas, pero no todas. Lean bien el documento que dejé al principio si están interesados en hacer algo equivalente.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Myriad Pro', 'Lucida Grande', 'Lucida Sans Unicode', sans-serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Si no sabes que significa software libre, aquí transcribo las cuatro libertades del software libre:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-size: 10px; line-height: 15px;"&gt;&lt;span class="Apple-style-span" style="font-family: Sans;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate; font-size: small; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-size: 10px; line-height: 15px;"&gt;&lt;span class="Apple-style-span" style="font-family: Sans;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate; font-size: small; line-height: normal;"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Libertad 0&lt;/b&gt;:&amp;nbsp;Ejecutar el programa con cualquier propósito (privado, educativo, público, comercial, militar, etc.)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Libertad 1&lt;/b&gt;:&amp;nbsp;Estudiar y modificar el programa (para lo cual es necesario poder acceder al código fuente)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Libertad 2&lt;/b&gt;:&amp;nbsp;Distribuir el programa de manera que se pueda ayudar al prójimo&lt;/li&gt;&lt;li&gt;&lt;b&gt;Libertad 3&lt;/b&gt;:&amp;nbsp;Distribuir las versiones modificadas propias&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;Las licencias que dicen ser de software libre deben garantizar estas cuatro libertades.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-2061569471601635884?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/2061569471601635884/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/licencia-openerp.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/2061569471601635884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/2061569471601635884'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/licencia-openerp.html' title='Licencia OpenERP'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-4741623125229392218</id><published>2010-12-02T23:12:00.002-03:00</published><updated>2010-12-02T23:20:35.741-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='sap'/><category scheme='http://www.blogger.com/atom/ns#' term='argentina'/><category scheme='http://www.blogger.com/atom/ns#' term='easysoft'/><category scheme='http://www.blogger.com/atom/ns#' term='openerp-argentina'/><category scheme='http://www.blogger.com/atom/ns#' term='erp'/><category scheme='http://www.blogger.com/atom/ns#' term='tango'/><category scheme='http://www.blogger.com/atom/ns#' term='bejerman'/><title type='text'>Enterprise Resource Planning o simplemente ERP</title><content type='html'>La segunda guerra mundial generó muchas de las tecnologías y metodologías que usamos actualmente. Quizás deba decir que todo surgió durante la revolución industrial, pero en aquellas épocas los conceptos no cerraban correctamente y apenas solucionaban problemas comerciales de formas muy intuitiva. Con la llegada definitiva de&amp;nbsp;la matemática a la milicia y su posterior aplicación en los negocios, se logró unificar criterios ya con un sentido lógico y matemático adaptándolos a una nueva era. Y justo a tiempo llegó la computadora para automatizar las tareas que implicaba esta nueva forma de pensar.&lt;br /&gt;&lt;br /&gt;Podemos identificar varias etapas en durante el proceso de automatización. Comenzando en la década del 50 al 80 el estudio se centraba el flujo de los materias o logística. Incluso las empresas que todavía no adaptaron todos los avances de esa época mantienen estos procesos sub-optimizados e inclusive precariamente conectados los diferentes interesados en el proceso. Algo tan sencillo como la disponibilidad de un producto ya es un problema difícil de manejar si no se tiene una comunicación interna pulida, y no hablar de la relación entre sus proveedores y clientes.&lt;br /&gt;&lt;br /&gt;Las computadoras se introdujeron durante la década del 60 en lo que se conoció como &lt;i&gt;Material Requirement Planning&lt;/i&gt; (MRP) ó &lt;i&gt;Planificación de los requerimientos de material&lt;/i&gt;. La traducción es un tanto desagradable, y preferiría llamarlo Administrador de Requerimientos de Materiales. Eso es lo de menos, lo importante es que se empezó a registrar y administrar los pedidos, ventas, entradas y salidas de los materiales a través&amp;nbsp;de un sistema automático.&lt;br /&gt;&lt;br /&gt;En la década del 80 ya el cambio se centró en aumentar la robustez de éstos sistemas y en los 90 nacieron los primeros ERP donde centraban todo el proceso de una empresa en una computadora.&lt;br /&gt;&lt;br /&gt;Los procesos pueden ser muchos, pero podemos nombrar algunos pocos como son Administración de Persona, Administración de Clientes y Proveedores, Administración de Stock, Administración de Proyectos, Administración Financiera, etc... todo en una única aplicación e interactuando todas las partes entre si. Justamente esa interacción hace difícil su configuración y posterior puesta en marcha. &lt;span style="font-size: x-small;"&gt;[1]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En la Argentina podemos encontrar varios ERP, desde los históricos &lt;i&gt;Tango y Bejerman&lt;/i&gt;, pasando por &lt;i&gt;EasySoft&lt;/i&gt; y terminando en el todopoderoso &lt;i&gt;SAP&lt;/i&gt;. No vengo a promocionar ninguna de éstas, ni mucho menos. La realidad es que yo trabajo con &lt;a href="http://www.openerp.com/"&gt;&lt;b&gt;OpenERP&lt;/b&gt;&lt;/a&gt; por una razón muy simple, libertad. Tanta libertad para el cliente como para el proveedor. En que sentido? En el sentido más puro de la palabra. El cliente puede elegir el proveedor y el proveedor puede elegir al cliente. Somos varios en argentina que estamos implementando este tipo de soluciones. Thymbra es la más antigua y con más experiencia y seguro que soy injusto con otras. Y muchos otros estamos haciendo los primeros pasos. Lo que si es verdad que el código de esta solución tiene una licencia sin costo, &amp;nbsp;y cualquiera puede intentar instalarlo y hacerlo funcionar. Pero si necesita ayuda pueden contar con los cuantos que estamos dispuesto a ayudar. Un primer paso sería contactarse con el grupo de &lt;b&gt;openerp-argentina&lt;/b&gt; de google y buscar algún proveedor, no de software, sino de soporte técnico o instalación.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://groups.google.com/group/openerp-argentina"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_1ulUI9kdwL8/TPhKsgCKC5I/AAAAAAAABbQ/luLLtG1wKac/s1600/openerp-logo.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Si surgen preguntas como: puede el OpenERP satisfacer todas mis necesidades? La respuesta es; si no puede hoy, podrá mañana y si contrata programadores puede hacer que se satisfagan mucho antes.&lt;br /&gt;&lt;br /&gt;En mi empresa, Moldeo Interactive CT, nos estamos centrándonos en ayudar a instalar, dar soporte técnico como también un poco de docencia. También tenemos nuestros proyectos relacionados, como una nube de servicios OpenERP, osea un lugar centralizado en la WEB donde pueden acceder varias empresas a su propio ERP. También estamos iniciando ya proyecto más avanzados como lectores de código de barra y QR, y quizás a mediados del año que viene logremos liberar el código para reconocimiento de rostro para control de personal. Eso si sería todo un chiche.&lt;br /&gt;&lt;br /&gt;Terminando, existen muchas razones para pasarse a &lt;i&gt;OpenERP&lt;/i&gt;. La mejor de todas es la &lt;i&gt;libertad&lt;/i&gt;. Quizás sea más barato, aunque no lo aseguro. Pero lo más importante es su flexibilidad y su futuro.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Referencia:&lt;/b&gt; [1] &lt;a href="http://www.amazon.com/gp/product/0471392081"&gt;E-bussines and ERP: Transforming the Enterprise.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-4741623125229392218?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/4741623125229392218/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/enterprise-resource-planning-o.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/4741623125229392218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/4741623125229392218'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/enterprise-resource-planning-o.html' title='Enterprise Resource Planning o simplemente ERP'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_1ulUI9kdwL8/TPhKsgCKC5I/AAAAAAAABbQ/luLLtG1wKac/s72-c/openerp-logo.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-6068910801228424497</id><published>2010-12-01T22:13:00.001-03:00</published><updated>2010-12-04T00:35:43.393-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='erp'/><category scheme='http://www.blogger.com/atom/ns#' term='formularios'/><title type='text'>Llenando formularios en OpenERP</title><content type='html'>En general, las cosas en OpenERP son &lt;i&gt;Listas&lt;/i&gt; y &lt;i&gt;Formularios&lt;/i&gt;. Las listas no son más que una lista de cosas que puedes ver o editar, mientras que los formularios son solo de edición. Digamos, hasta aquí no hay mucho secreto. Pero si puede ser difícil de entender como llenar los formularios.&lt;br /&gt;&lt;br /&gt;Me gustaría comenzar con los botones que nos podemos encontrar en un formulario. La imagen a continuación muestra un formulario tradicional de &lt;i&gt;persona&lt;/i&gt; o &lt;i&gt;partner&lt;/i&gt; en el entorno web.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_1ulUI9kdwL8/TPbrr46Q5-I/AAAAAAAABa8/SmZydR5EXcc/s1600/Pantallazo-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://1.bp.blogspot.com/_1ulUI9kdwL8/TPbrr46Q5-I/AAAAAAAABa8/SmZydR5EXcc/s320/Pantallazo-1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Empezando de arriba para abajo podemos encontrar el nombre del tipo de formulario que estamos editando un &lt;i&gt;partner&lt;/i&gt; en este caso. A su derecha se encuentran los botones &lt;b&gt;Buscar&lt;/b&gt;, &lt;b&gt;Formulario&lt;/b&gt;, &lt;b&gt;Calendario&lt;/b&gt;, &lt;b&gt;Gantt&lt;/b&gt;, &lt;b&gt;Gráfico&lt;/b&gt; y &lt;b&gt;Proceso&lt;/b&gt;. Estos botones identifican un cambio de estado del entorno. Que quiero decir con esto? Bue! Simplemente que cambia la pantalla. Si presionan alguno de ellos van a perder lo que cargaron y van a otra parte. En otra entrada describiré en más detalle cada punto.&lt;br /&gt;&lt;br /&gt;Bajemos una linea y nos encontramos con tres botones &lt;b&gt;Guardar&lt;/b&gt;, &lt;b&gt;Guardar &amp;amp; Editar&lt;/b&gt; y &lt;b&gt;Cancelar&lt;/b&gt;. Estos guardan lo que hemos hecho o lo cancelamos. El primero y el último te envían a la lista de este tipo de entradas, mientras que el del medio permite seguir editando. Estos botones están orientados a cambiar el estado de la entrada del formulario. Y a su derecha podemos ver algo extraño, ya que uno no esperaría encontrar signos menos y mas y otros números. En verdad estos controles no son extraños. Simplemente nos permite navegar en las diferentes entradas de este mismo tipo de entradas. Uno esperaría presionas &lt;b&gt;&amp;lt;&amp;lt; &lt;/b&gt;e ir a la primera entrada del partner, por ejemplo.&amp;nbsp; Recomiendo experimentar, pero sin antes haber presionado &lt;b&gt;Guardar &amp;amp; Editar&lt;/b&gt; para no perder los cambios.&lt;br /&gt;&lt;br /&gt;Luego empieza el formulario de verdad. Los formularios tienen una estructura jerárquica. Entradas &lt;b&gt;principales&lt;/b&gt; y entradas &lt;b&gt;secundarias&lt;/b&gt;. Dentro de estas entradas podemos distinguir las obligatorias y las no obligatorias. Obligatorias significa que no se puede grabar un formulario sin antes haber llenado la entrada. Éstas son de color &lt;b style="color: #6fa8dc;"&gt;celeste claro&lt;/b&gt; y se vuelven &lt;span style="color: red;"&gt;rojas&lt;/span&gt; si no están bien cargadas. Las otras son de color &lt;span style="color: white;"&gt;blanca&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Las entradas secundarias se distribuyen en solapas dentro del&lt;br /&gt;formulario. Por ejemplo el Partner tiene las solapas: &lt;b&gt;General&lt;/b&gt;, &lt;b&gt;Venta&lt;/b&gt; y&lt;br /&gt;&lt;b&gt;Compra&lt;/b&gt;, &lt;b&gt;Historial&lt;/b&gt;, &lt;b&gt;Notas&lt;/b&gt;, &lt;b&gt;Contabilidad&lt;/b&gt; y &lt;b&gt;Avisos&lt;/b&gt;. Recomiendo por ahora&lt;br /&gt;revisar todas las entradas antes de seguir con el formulario.&lt;br /&gt;&lt;br /&gt;Van a encontrar&amp;nbsp; un ícono con forma de discorígido con una flecha apuntandole enalgunas entradas.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_1ulUI9kdwL8/TPbx4ei0WGI/AAAAAAAABbE/VC-St5b1VAc/s1600/botones-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_1ulUI9kdwL8/TPbx4ei0WGI/AAAAAAAABbE/VC-St5b1VAc/s1600/botones-2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Éste ícono indica que hay que grabar el formulario antes de seguir con esa entrada (con presionar el ícono es suficiente). Las entradas con estas flechas son listados. Por ejemplo el &lt;i&gt;partner&lt;/i&gt; puede tener varios contactos asociados, y llenando esta parte del formulario se puede ir generando más contactos para un solo partner.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_1ulUI9kdwL8/TPbyf51cgpI/AAAAAAAABbI/0yQiSBjtS40/s1600/botones-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="21" src="http://1.bp.blogspot.com/_1ulUI9kdwL8/TPbyf51cgpI/AAAAAAAABbI/0yQiSBjtS40/s320/botones-3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Otró ícono importante es el de la carpeta, que siempre está acompañado con el de la lupa. Éste esta asociado a entradas del tipo &lt;u&gt;referencias&lt;/u&gt;. Esto significa que debería existir la entrada en la base de datos para poder referenciarlo. Si no hay referencia y se quiere asignar se puede optar por escribir parte del &lt;u&gt;nombre&lt;/u&gt; y cambiar de entrada o &amp;nbsp;que presionar sobre la lupa. Si el sistema encuentra una única referencia con ese nombre la asigna, sino lista las posibles. Esto puede verse nuevamente en la carga de un &amp;nbsp;partner, que cuando se escribe "Arg" en el país aparecen Argelia y Argentina en una lista; en cambio si se escribe "Argen" se asigna directamente "Argentina". Ahora, si se quiere ir a la referencia, tanto para ver más detalles o para editarla, se debe presionar sobre la carpeta.&lt;br /&gt;&lt;br /&gt;Hay que tener en cuenta que según se habiliten o deshabiliten módulos&lt;br /&gt;puede aparecer o desaparecer entradas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-6068910801228424497?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/6068910801228424497/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/llenando-formularios-en-openerp.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/6068910801228424497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/6068910801228424497'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/llenando-formularios-en-openerp.html' title='Llenando formularios en OpenERP'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_1ulUI9kdwL8/TPbrr46Q5-I/AAAAAAAABa8/SmZydR5EXcc/s72-c/Pantallazo-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-8057988727911665724</id><published>2010-12-01T21:29:00.000-03:00</published><updated>2010-12-01T21:29:54.290-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='servidor'/><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='remoto'/><title type='text'>Servicio OpenERP en Intenet</title><content type='html'>En mi búsqueda de nuevas oportunidades y escuchando las recomendaciones de mis pares he decidido abrir un sitio OpenERP en Internet. Por ahora el acceso es restringido, pero que quieran probarlo no duden contactarse conmigo.&lt;br /&gt;&lt;br /&gt;Y por supuesto voy a seguir publicando en el blog temas de OpenERP que pueda interesarle a los novicios del tema.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-8057988727911665724?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/8057988727911665724/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/servicio-openerp-en-intenet.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/8057988727911665724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/8057988727911665724'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2010/12/servicio-openerp-en-intenet.html' title='Servicio OpenERP en Intenet'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-8915655659970770717</id><published>2010-11-06T07:54:00.000-03:00</published><updated>2010-11-06T07:54:09.283-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pygame'/><category scheme='http://www.blogger.com/atom/ns#' term='rostro'/><category scheme='http://www.blogger.com/atom/ns#' term='reconocimiento'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='opencv'/><title type='text'>Reconocimiento de Rostros con OpenCV</title><content type='html'>En esta ocación me tomé un tiempo para estudiar como capturar video usando OpenCV y me atrevía ir un poco más (y no mucho más) para ver como reconocer rostros. El código lo hice en Python usando el módulo/wrapper de OpenCV y con la ayuda de pycam, un código que encontré en googlecode.&lt;br /&gt;&lt;br /&gt;Capturar de la cámara.&lt;br /&gt;&lt;br /&gt;Las funciones que se usan se encuentran en el módulo &lt;i&gt;highgui&lt;/i&gt; de opencv. La que configura la cámara es la función&amp;nbsp;&lt;i&gt;cvCreateCameraCapture&lt;/i&gt;, que devuelve un objeto tipo cvCamera. Luego se captura la imagen con la función &lt;i&gt;cvQueryFrame&lt;/i&gt;. Aquí un pequeño ejemplo de un código que solo captura 30 frames por segundo y lo muestra en un ventana.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;"""&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;from opencv.highgui import&amp;nbsp;cvCreateCameraCapture, cvQueryFrame&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;from opencv.adaptors import&amp;nbsp;Ipl2PIL&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;import pygame&lt;br /&gt;&lt;div&gt;&lt;div&gt;from pygame.locals import *&lt;/div&gt;&lt;/div&gt;&lt;div&gt;import sys&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;camera = &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;cvCreateCameraCapture&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;(0)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;def get_image():&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;im = &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;cvQueryFrame&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;(camera)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return Ipl2PIL(im)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;div&gt;fps = 30.0&lt;/div&gt;&lt;div&gt;pygame.init()&lt;/div&gt;&lt;div&gt;window = pygame.display.set_mode((640,480))&lt;/div&gt;&lt;div&gt;pygame.display.set_caption("WebCam Demo")&lt;/div&gt;&lt;div&gt;screen = pygame.display.get_surface()&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;while True:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;events = pygame.event.get()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for event in events:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if event.type == QUIT or event.type == KEYDOWN:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sys.exit(0)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;im = get_image()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;pg_img = pygame.image.frombuffer(im.tostring(), im.size, im.mode)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;screen.blit(pg_img, (0,0))&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;pygame.display.flip()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;pygame.time.delay(int(1000 * 1.0/fps))&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;"""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este código podemos ver que no solo estoy usando el módulo&amp;nbsp;&lt;b&gt;opencv&lt;/b&gt; sino tambien &lt;b&gt;pygame&lt;/b&gt;. Éste último permite crear una ventana y renderear la imagen capturada. En el código podemos observar que existen varias partes que no tengo tiempo de discutir como es el loop infinito con captura de eventos de &amp;nbsp;pygame y cómo realiza el rendering usando funciones de transformaciones del buffer. Ahora solo quiero concentrarme en OpenCV.&lt;br /&gt;&lt;br /&gt;Con esta parte del código ya podemos ver cómo se selecciona la cámara 0 y luego se toma la imagen y se la transforma en un formato PIL. La función get_image es la que modificaremos para realizar llamará a las próximas dos funciones que permitirán donde está en la imagen un rostro.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;"""&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;def detectObject(im):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;gray = cv.cvCreateImage( cv.cvSize(im.width,im.height), 8, 1 )&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;small_img = cv.cvCreateImage(cv.cvSize(cv.cvRound (im.width/image_scale),&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cv.cvRound (im.height/image_scale)),&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 8, 1)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print small_img.width, small_img.height&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cv.cvCvtColor( im, gray, cv.CV_BGR2GRAY )&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cv.cvResize( gray, small_img, cv.CV_INTER_LINEAR )&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cv.cvEqualizeHist( small_img, small_img )&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cv.cvClearMemStorage(storage)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;faces = cv.cvHaarDetectObjects(small_img, cascade, storage,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; haar_scale, min_neighbors, haar_flags,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; min_size);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return faces&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;"""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En esta primera función se realiza todo lo necesario para identificar los rostros usando un detector de Haar. Si quieres conocer más de esta método &lt;a href="http://www.codeproject.com/KB/audio-video/haar_detection.aspx"&gt;aquí&lt;/a&gt; encontré una buena referencia.&lt;br /&gt;&lt;br /&gt;Muy bien, este método require para ser increíblemente rápido que se reduzca la imagen tanto en tamaño como en cantidad de colores (a grises!). Luego se utiliza el detector de Haar para reconocer las caras.&lt;br /&gt;&lt;br /&gt;El detector de Haard necesita previamente un par de configuraciónes para conocer el patron que se requiere para detectar diferentes objetos. Esta información es:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;"""&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;cascade_name = "haarcascade_frontalface_alt.xml"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;cascade = cv.cvLoadHaarClassifierCascade(cascade_name, cv.cvSize(1,1))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;storage = cv.cvCreateMemStorage(0)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;min_size = cv.cvSize(20,20)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;image_scale = 2.4&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;haar_scale = 1.1&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;min_neighbors = 3&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;haar_flags = 0&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;"""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El &lt;i&gt;cascade_name&lt;/i&gt; es un path a un archivo que lo pueden bajar de &lt;a href="http://www-ctp.di.fct.unl.pt/%7Enmc/2Semestre0910/cm/haarcascade_frontalface_alt.xml"&gt;aquí&lt;/a&gt;. Con esto pueden crear el clasificador en &lt;i&gt;cascade&lt;/i&gt; para el método Haar. Éste clasificador necesita conocer el tamaño en que fue entrenado el archivo, en este caso lo definimos en 1x1 pixels. Construimos un espacio de memoria para que pueda trabajar el clasificador (&lt;i&gt;storage&lt;/i&gt;) y definimos los tamaños mínimos del rostro a detectar en pixels (&lt;i&gt;min_size&lt;/i&gt;) y el factor de reducción de la imagen a clasificar (&lt;i&gt;image_scale&lt;/i&gt;). El factor de reducción de la ventana para la clasificación (&lt;i&gt;haar_scale&lt;/i&gt;) y la cantidad de vecinos que se agrupan para identificar un rostro (&lt;i&gt;min_neighbors&lt;/i&gt;) son parámetros del clasificador. Con éstos hay que jugar para poder mejorar el rendimiento de la busqueda. Las banderas (haar_flags) por ahora solo acepta un solo valor, con lo que no recomiendo cambiar nada de todo esto. Si quieren ver en detalle estos valores puede ir &lt;a href="http://opencv.willowgarage.com/documentation/c/cascade_classification.html"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Una vez que se configura esto y se definen la función de reconocimiento solo falta dibujar la caja con el rostro.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;"""&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;def detect_and_draw(im):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;faces = detectObject(im)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if faces:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for r in faces:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print "Una cara en (x,y) = (%i,%i)" % (r.x*image_scale,r.y*image_scale)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pt1 = cv.cvPoint( int(r.x*image_scale), int(r.y*image_scale))&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pt2 = cv.cvPoint( int((r.x+r.width)*image_scale), int((r.y+r.height)*image_scale) )&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cv.cvRectangle( im, pt1, pt2, cv.CV_RGB(255,0,0), 3, 8, 0 )&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return im&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;"""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si integramos el código en forma correcta podemos llegar a obtener el siguiente resultado.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_1ulUI9kdwL8/TNUzjl1qlFI/AAAAAAAABaU/rdTOm_l24tQ/s1600/Faces.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_1ulUI9kdwL8/TNUzjl1qlFI/AAAAAAAABaU/rdTOm_l24tQ/s320/Faces.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-8915655659970770717?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/8915655659970770717/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2010/11/reconocimiento-de-rostros-con-opencv.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/8915655659970770717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/8915655659970770717'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2010/11/reconocimiento-de-rostros-con-opencv.html' title='Reconocimiento de Rostros con OpenCV'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_1ulUI9kdwL8/TNUzjl1qlFI/AAAAAAAABaU/rdTOm_l24tQ/s72-c/Faces.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-3297477448395197912</id><published>2010-11-02T10:29:00.001-03:00</published><updated>2010-12-04T00:34:22.495-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='openerp-argentina'/><category scheme='http://www.blogger.com/atom/ns#' term='instalación'/><title type='text'>Iniciandose en OpenERP para Argentina</title><content type='html'>Estos últimos días me concentré en instalar y configurar una herramienta ERP opensource para una empresa y para mi Cooperativa de Trabajo en formación. Su nombre es OpenERP aunque&amp;nbsp;previamente se conocía como TinyERP. La herramienta es desarrollada por OpenERP S.A. y se maneja bajo la licencia AGPL (http://www.gnu.org/licenses/agpl.html). Si quieres conocer el modelo de negocio de OpenERP puedes ir a (http://www.openerp.com/products/business-model)&lt;br /&gt;&lt;br /&gt;Bien, ya definiendo las bases del modelo de negocio ahora continuo con la parte más técnica. Empiezo desde el principio: la instalación.&lt;br /&gt;&lt;br /&gt;OpenERP esta accesible en plataformas Debian y Ubuntu desde hace poco tiempo. Es más, solo lo puedes encontrar en la versión inestable de Debian. Ubuntu, al tener otra filosofía sobre la estabilidad ya lo tiene incorporado. Si tienes una de estas plataformas directamente puedes realizar un "aptitude install openerp-server". En caso contrario te recomiendo obtener el código fuente.&lt;br /&gt;&lt;br /&gt;Esta herramienta depende principalmente de Python-2.5 y PostgreSQL. Una vez instalado todo habrá que preparar la base de datos. Eso se hace creando un usuario postgresql y creandole una base de datos. Esto último es necesario porque sino los clientes Postgresql no van a poder conectarse.&lt;br /&gt;&lt;br /&gt;Una vez que se tenga todo instalado y corriendo se va a necesitar un cliente. OpenERP tiene dos clientes oficiales: openerp-cliente, basado en GTK y openerp-web basado en HTML. Ambos se conectan por Socket y XML-RPC al servidor. El primer cliente puede bajarse de los repositorios de Debian y Ubuntu, en cambio el segundo solo puede instalarse por easy_install. (http://doc.openerp.com/install/linux/web/index.html) También se puede configurar para que pueda ser accesido desde la web.&lt;br /&gt;&lt;br /&gt;Una vez instalado el cliente es momento de configurar las tablas para luego configurar el sistema. Eso se puede hacer desde ambos clientes en la opción crear base de datos.&lt;br /&gt;&lt;br /&gt;El puntos más conflictivo de la instalación es la configuración del postgresql. Confunde mucho los permisos de usuario y las claves, ya que tenemos que manejarnos con al menos 5 pares: El administrador del sistema unix, el administrador del postgresql, el usuario de la base de datos del openerp, el usuario administrador del openerp y el usuario del openerp. Lo mejor es identificar estos usuarios, eso significa tener una lista de ellos y saber cuando usar sus claves. Eso si, el administrador de la base de datos postgresql y el usuario de la base de datos del openerp en postgres no requieren de clave! Y esa configuración viene por defecto. Traten de no cambiar nada de eso. Debería funcionar. Cualquier cosa pregunten.&lt;br /&gt;&lt;br /&gt;Ya todo instalado hay que empezar a configurar el OpenERP para funcionar con nuestra empresa. Para ello podemos instalar los módulos de argentina (https://launchpad.net/openerp-argentina). Para la instalación es necesario usar las herramientas de launchpad. Las instalamos primero para luego ejecutar el comando de descarga:&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #484848; font-family: UbuntuBeta, Ubuntu, 'Bitstream Vera Sans', 'DejaVu Sans', Tahoma, sans-serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #484848; font-size: 13px; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ sudo aptitude install bzr&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #484848; font-size: 13px; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ bzr branch&amp;nbsp;&lt;/span&gt;&lt;span class="branch-url"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;lp:openerp-argentina&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esto nos dejo en el directorio donde estemos parado un directorio con los módulos a activar. Esos se copian en el directorio de módulos de openerp, pero eso hablaremos en el próximo capítulo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-3297477448395197912?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/3297477448395197912/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2010/11/iniciandose-en-openerp-para-argentina.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/3297477448395197912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/3297477448395197912'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2010/11/iniciandose-en-openerp-para-argentina.html' title='Iniciandose en OpenERP para Argentina'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-931630625153367965</id><published>2008-12-08T23:08:00.001-02:00</published><updated>2010-12-04T00:36:53.428-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='servidor'/><category scheme='http://www.blogger.com/atom/ns#' term='community'/><category scheme='http://www.blogger.com/atom/ns#' term='engine'/><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='instalación'/><title type='text'>Instalando Community Engine (3)</title><content type='html'>Luego de una larga investigación he llegado a la conclusión que todos mis problemas se debían a un detalle pasado por alto. El &lt;span style="font-style: italic;"&gt;Community Engine&lt;/span&gt; necesita de &lt;span style="font-style: italic;"&gt;Rails 2.1.0&lt;/span&gt;. Y por supuesto esto trae varios problemas.&lt;br /&gt;&lt;br /&gt;En principio, aparenta haber varias incompatibilidades, entre ellas el manejo de idiomas. Aunque muchas funcionalidades nuevas en el Rails que no son aprovechadas en el Community Engine la situación no es drástica. Habrá que esperar un par de meses para que Community Engine esté listo para 2.2.0 ya que existe un branch del engine donde ya hay gente trabajando.&lt;br /&gt;&lt;br /&gt;Ahora, ¿cómo instalar entonces el Rails viejo para que todo empiece a funcionar? En principio hay que empezar de cero y cambiar algunos comandos.&lt;br /&gt;&lt;br /&gt;En el &lt;span style="font-weight: bold;"&gt;paso 1&lt;/span&gt; el comando &lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ sudo gem install rails&lt;/blockquote&gt;hay que cambiarlo a&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ sudo gem install rails --version 2.1.0&lt;/blockquote&gt;Ahora eso no es suficiente. El plugin&lt;span style="font-style: italic;"&gt; engines&lt;/span&gt; también hay que desactualizarlo, pero de otra manera. El comando &lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ script/plugin install git://github.com/lazyatom/engines.git&lt;/blockquote&gt;sigue en pie, pero hay que ejecutar algo más en el directorio &lt;span style="color: #000099;"&gt;vendor/plugins/community_engine/&lt;/span&gt;, el comando: &lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ git checkout -b 2.1.0&lt;/blockquote&gt;Con estos cambios ya podemos seguir adelante.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 12) Generamos los pasos del esquema de Community engine.&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ script/generate plugin_migration&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Paso 13) Generamos el esquema de la base de datos.&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ rake db:migrate&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Paso 14) Probamos la instalación.&lt;/span&gt; Los siguientes comandos, ejecutados siempre uno detrás del otro, ejecutan test funcional y de unidad de cada característica del sitio.&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ rake test&lt;/blockquote&gt;&lt;blockquote style="font-family: courier new;"&gt;$ rake community_engine:test&lt;/blockquote&gt;Yo he logrado hacer funcionar el sistema con unos 16 errores. Ahora, si llegan a los ~200 errores más vale que reevean todos los pasos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 15) Ejecutar el Server.&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ ./script/server&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Paso 16) Acceder a la página web principal.&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ http://localhost:3000/&lt;/blockquote&gt;A partir de ahora es cuestión de experimentar. En la próxima entrada me voy a concentrar en los roles. Por lo que he leído ya están implementados y pueden modificarse directamente en la base de datos (&lt;a href="http://github.com/bborn/communityengine/commit/0f6d1e6a0cb5f85f512feadae7320d18d0d72675#diff-0"&gt;link&lt;/a&gt;).  Tengan en cuenta que esto permite definir permisos y así limitar el acceso a la información en el sitio. Esto tiene como consecuencia inmediata una independencia de la interface con las reglas de negocio. Espero que vean la utilidad en mi próxima entrada.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;Referencias:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.communityengine.org/documentation.html"&gt;http://www.communityengine.org/documentation.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-931630625153367965?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/931630625153367965/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2008/12/instalando-community-engine-3.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/931630625153367965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/931630625153367965'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2008/12/instalando-community-engine-3.html' title='Instalando Community Engine (3)'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-3263275476686836281</id><published>2008-12-08T18:49:00.000-02:00</published><updated>2008-12-08T19:00:30.189-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='inososhi'/><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='community'/><category scheme='http://www.blogger.com/atom/ns#' term='engine'/><title type='text'>Inososhi - Otro framework para redes sociales</title><content type='html'>Insistiendo en redes sociales, y también sobre ruby (ruby on rails) he encontrado una alternativa a Community Engine. Fue relativamente fácil de instalar ya que aparenta estar realmente actualizada. El único problema existe en que no tiene suficiente flexibilidad, o por lo menos no he encontrado suficiente documentación.&lt;br /&gt;&lt;br /&gt;El sitio oficial es: http://portal.insoshi.com/&lt;br /&gt;Y algunos tips necesarios para la instalación es: http://www.sphinxsearch.com/forum/view.html?id=1419 que va a permitir instalar sphinxsearch necesario para inososhi en debian.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-3263275476686836281?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/3263275476686836281/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2008/12/inososhi-otro-framework-para-redes.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/3263275476686836281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/3263275476686836281'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2008/12/inososhi-otro-framework-para-redes.html' title='Inososhi - Otro framework para redes sociales'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-355348993388250056</id><published>2008-12-05T10:37:00.000-02:00</published><updated>2008-12-05T12:09:52.997-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='comunidad'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='red social'/><title type='text'>Instalando Community Engine (2)</title><content type='html'>Hoy voy a mostrarles como instalar la extensión para armar redes sociales a partir de lo escrito en la entrada anterior. Partimos del sexto paso.&lt;br /&gt;&lt;br /&gt;Paso 6) Instalar el plugin. Existe varias formas de instalar la extensión, todas descriptas en el documento &lt;a href="http://github.com/bborn/communityengine/tree/master"&gt;oficial&lt;/a&gt;. Pero por una cuestión de gusto y comodidad voy a elegir la instalación por &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Nos paramos en el directorio principal donde tenemos instalado nuestro sitio y ejecutamos el siguiente comando.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;git clone --depth 1 git://github.com/bborn/communityengine.git vendor/plugins/community_engine&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;En unos pocos minutos tenemos los archivos de la extensión en vendor/plugins.&lt;br /&gt;&lt;br /&gt;Paso 7) Configurar la base de datos. Solo hay que tocar el archivo config/database.yml , que condiciones de prueba no es necesario tocar. Por defecto usa una base de datos sqlite que si bien no es un motor de base de datos muy poderoso es suficiente para almacenar las entidades de una red básica de unas 100 personas. Se pueden usar otras bases de datos como por ejemplo MySql y Postgresql. Más información puede verse &lt;a href="http://wiki.rubyonrails.org/rails/pages/DatabaseDrivers"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Paso 8) Deshacerse de la página principal. Para acceder a la página del sitio comunitario hay que eliminar el public/index.html (Digo borrarlo, moverlo, cambiar de nombre, ...)&lt;br /&gt;&lt;br /&gt;Paso 9) Habilitar el sitio comunitario. Es momento de habilitar el sitio comunitario agregando parámetros al archivo de configuración config/environment.rb . Los cambios son los siguientes:&lt;br /&gt;&lt;br /&gt;Debajo de &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;require File.join(File.dirname(__FILE__), 'boot')&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;agregar la linea&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;require File.join(File.dirname(__FILE__), '../vendor/plugins/engines/boot')&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Y debajo del texto (o parecido, lo importante es el config.plugins)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;# Only load the plugins named here, in the order given. By default, all plugins &lt;br /&gt;  # in vendor/plugins are loaded in alphabetical order.&lt;br /&gt;  # :all can be used as a placeholder for all plugins not explicitly named&lt;br /&gt;  # config.plugins = [ :exception_notification, :ssl_requirement, :all ]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;hay que agregar la linea&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;config.plugins = [:engines, :community_engine, :white_list, :all]&lt;br /&gt;  config.plugin_paths += ["#{RAILS_ROOT}/vendor/plugins/community_engine/engine_plugins"]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;y por último, hay que agregar al final del archivo, luego del &lt;blockquote&gt;end&lt;/blockquote&gt; la siguente linea que va a levantar la configuración del plugin.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;require "#{RAILS_ROOT}/vendor/plugins/community_engine/engine_config/boot.rb"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Paso 10) Configurar la URL. Eso se hace retocando los archivos development.rb, test.rb, y production.rb en el directorio config/environments . Cada uno de estos archivos configura el entorno donde estamos ejecutando nuestro sitio, permitiendo tener tres sitios diferentes según sea de desarrollo, de testing o el sitio de producción. Entonces hay que agregarle la siguiente linea:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;APP_URL = "http://localhost:3000"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Como estoy testeando la URL donde correrá el sitio indica que va a ser mi máquina y en el puerto 3000.&lt;br /&gt;&lt;br /&gt;Paso 11) Configurar las rutas. La verdad que no tengo idea de que tratan esas rutas, pero si hay que hacerlo, hagamoslo. Al final, antes de las rutas definidas por defecto, en el archivo config/routes.rb hay que agregar:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;# Add this after any of your own existing routes, but before the default rails routes: &lt;br /&gt;  map.from_plugin :community_engine&lt;br /&gt;  # Install the default routes as the lowest priority.&lt;br /&gt;  map.connect ':controller/:action/:id'&lt;br /&gt;  map.connect ':controller/:action/:id.:format'&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Paso 12) Migrar el sitio rails. Ahora el sitio está configurado en la base de datos para funcionar en el sitio de prueba de rails, con lo que hay que adaptar todo al sitio comunitario. Para ello ejecutamos el comando:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;script/generate plugin_migration&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;ERROR!: Puede que apareciera el siguiente error en la ejecución&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;uninitialized class variable @@default_error_messages in ActiveRecord::Errors&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;No pude pasar de este error. Espero en la próxima entrada haber resuelto este paso. (Me deprimí)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-355348993388250056?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/355348993388250056/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2008/12/instalando-community-engine-2.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/355348993388250056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/355348993388250056'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2008/12/instalando-community-engine-2.html' title='Instalando Community Engine (2)'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-5527960678586131331</id><published>2008-12-04T10:43:00.000-02:00</published><updated>2008-12-09T05:03:35.618-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='instalación'/><category scheme='http://www.blogger.com/atom/ns#' term='red social'/><category scheme='http://www.blogger.com/atom/ns#' term='gem'/><category scheme='http://www.blogger.com/atom/ns#' term='aptitude'/><title type='text'>Instalando Community Engine (1)</title><content type='html'>&lt;span style="font-style: italic;"&gt;Community Engine&lt;/span&gt; es un plugin de &lt;span style="font-style: italic;"&gt;Ruby On Rails&lt;/span&gt;. En otras palabras, es una extensión de Redes Sociales para un Framework Web programado por completo en &lt;span style="font-style: italic;"&gt;Ruby&lt;/span&gt;. Y Ruby, es un lenguaje de programación derivado de &lt;span style="font-style: italic;"&gt;SmallTalk&lt;/span&gt;, con lo que quienes saben la implicancia de la programación orientada a objeto pura entenderán que tiene muchas prestaciones a la hora del diseño y la extensibilidad del software. Pero no quiero hablar de esto, sino del hecho de la instalación. Luego si tengo tiempo podré describir en detalle que se puede hacer con esta herramienta tan poco conocida en la web, ya que Ruby está en la sombra de &lt;span style="font-style: italic;"&gt;Python&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;PHP&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Quiero destacar, antes de empezar, que la instalación está pensado en &lt;span style="font-style: italic;"&gt;Debian&lt;/span&gt; y que esta puede cambiar dentro de unos pocos meses, siempre pensando que cambiará hacia la sencillez.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 0) Precondición.&lt;/span&gt; hay que tener instalado los paquetes ruby1.8, rubygems1.8, libopenssl-ruby que se encuentran en los repositorios Debian.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 1) Instalar el ruby-on-rails.&lt;/span&gt; En si es un paso sencillo gracias a Gems.&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ sudo gem install rails&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Paso 2) Creando sitio Ruby on Rails.&lt;/span&gt; Ahora, bajo los manuales de rails, solo es necesario ejecutar en un directorio donde tendremos el código de nuestro sitio el siguiente comando:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ rails $HOME/mi_sitio&lt;/blockquote&gt;donde &lt;span style="font-style: italic;"&gt;mi_sitio&lt;/span&gt; es el nombre del directorio donde ustedes quieren que se almacene el código fuente resultante.&lt;br /&gt;&lt;blockquote style="color: rgb(153, 51, 0);"&gt;Sino encuentran el ejecutable rails deberían solucionarlo con una de las siguientes opciones:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Agregar el directorio &lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;/var/lib/gems/1.8/bin&lt;/span&gt; al &lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;PATH&lt;/span&gt; del sistema.&lt;/li&gt;&lt;li&gt;Realizar un link a un directorio de los ejecutables (&lt;span style="color: rgb(0, 0, 153);"&gt;~/bin/&lt;/span&gt; , &lt;span style="color: rgb(0, 0, 153);"&gt;/usr/local/bin&lt;/span&gt; , &lt;span style="color: rgb(0, 0, 153);"&gt;/usr/bin&lt;/span&gt; ; en orden de preferencia y según si se va a instalar para un solo usuario o para todos)&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Paso 3) Ejecutando del servidor.&lt;/span&gt; Terminada la construcción del código fuente del sitio ya está todo listo para poder testear un sitio básico ejecutando:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ ruby script/server&lt;/blockquote&gt;&lt;blockquote style="color: rgb(153, 51, 0);"&gt;Aquí se pueden encontrar con que la versión de &lt;span style="font-style: italic;"&gt;gems&lt;/span&gt; no es la adecuada. Si es así les recomiendo ejecutar el siguiente comando:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ sudo gem install rubygems-update&lt;/blockquote&gt;para luego actualizar el &lt;span style="font-style: italic;"&gt;gems&lt;/span&gt; con el comando:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ sudo /var/lib/gems/1.8/bin/update_rubygems&lt;/blockquote&gt;Ojo! Este error implica reinstalar el rails (volver al paso 1)&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Paso 4) Veamos el sitio!&lt;/span&gt; Ahora nos queda acceder en la dirección &lt;span style="color: rgb(0, 0, 153);"&gt;http://localhost:3000/&lt;/span&gt; desde nuestro navegador favorito. Si está realizando la instalación en otra máquina debería colocar el nombre de la misma en vez de &lt;span style="color: rgb(0, 0, 153);"&gt;localhost&lt;/span&gt;.&lt;br /&gt;&lt;blockquote style="color: rgb(153, 51, 0);"&gt;Podemos leer un poco lo que dice la página de presentación para informarnos un poco más de lo que estamos haciendo para luego seguir con la instalación.&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Paso 5) Instalar el plugin engines.&lt;/span&gt; Esto nos va a permitir instalar plugins en nuestro sitio.&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;$ script/plugin install git://github.com/lazyatom/engines.git&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Paso 6) Instalar el plugin Community Engine.&lt;/span&gt; Ahora podemos instalar el plugin para armar nuestra comunidad.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="color: rgb(51, 102, 102);"&gt;Este paso lo vamos a dejar para la próxima entrada porque ya estoy muy cansado el día de hoy.&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Referencias:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.rubyonrails.org/down"&gt;http://www.rubyonrails.org/down&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.communityengine.org"&gt;http://www.communityengine.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/bborn/communityengine/tree/master"&gt;http://github.com/bborn/communityengine/tree/master&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://intertwingly.net/blog/2008/11/23/RubyGems-1-3-1-on-Ubuntu-8-10"&gt;http://intertwingly.net/blog/2008/11/23/RubyGems-1-3-1-on-Ubuntu-8-10&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-5527960678586131331?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/5527960678586131331/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2008/12/instalando-community-engine-1.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/5527960678586131331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/5527960678586131331'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2008/12/instalando-community-engine-1.html' title='Instalando Community Engine (1)'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-2145168578330270931</id><published>2008-08-13T19:20:00.000-03:00</published><updated>2008-08-13T20:15:19.034-03:00</updated><title type='text'>Presentaciones con Latex (Parte I)</title><content type='html'>Latex es un lenguaje de documentación que no cumple con la filosofía WYWISING, sino con la filosofía "El contenido es primero". En este sentido la idea es describir el contenido, luego la presentación se resuelve de forma automática. Esto se aproxima múcho a usar el World de M$ con hojas de estilo. La diferencia mayor es que el contenido debe editarse con un editor de texto plano, como el &lt;span style="font-style: italic;"&gt;notepad&lt;/span&gt;, el &lt;span style="font-style: italic;"&gt;vim&lt;/span&gt; u otro.&lt;br /&gt;&lt;br /&gt;Aunque Latex sirve para editar cualquier tipo de documentos imprimible, aquí voy a presentar el beamer, un estilo de documentos para realizar presentaciones.&lt;br /&gt;&lt;br /&gt;En principio para empezar es recomendable empezar con una plantilla. La siguiente es con la que yo siempre empiezo, donde trabajo con el idioma en castellano y una presentación común. Luego agrego y modifico según las referencias de beamer.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;\documentclass[utf8]{beamer}&lt;br /&gt;&lt;br /&gt;\usepackage{beamerthemesplit}&lt;br /&gt;\usepackage[utf8]{inputenc}&lt;br /&gt;\usepackage{multimedia}&lt;br /&gt;&lt;br /&gt;%% Theme %%&lt;br /&gt;&lt;br /&gt;\usetheme{Frankfurt}&lt;br /&gt;&lt;br /&gt;%% Info %%&lt;br /&gt;&lt;br /&gt;\title{Título de la presentación}&lt;br /&gt;\author[tu email]{Tu nombre completo}&lt;br /&gt;\date{Donde estas presentando\\\today}&lt;br /&gt;\institute{Y el instituto donde perteneces}&lt;br /&gt;&lt;br /&gt;%% Document %%&lt;br /&gt;&lt;br /&gt;\begin{document}&lt;br /&gt;&lt;br /&gt;\frame{\titlepage}&lt;br /&gt;&lt;br /&gt;\section[Outline]{}&lt;br /&gt;\frame{\tableofcontents}&lt;br /&gt;&lt;br /&gt;\section{Introducción}&lt;br /&gt;&lt;br /&gt;\begin{frame}&lt;br /&gt;\frametitle{La introducción de la presentación}&lt;br /&gt;&lt;br /&gt;\begin{itemize}&lt;br /&gt;\item Primer punto de la introducción&lt;br /&gt;\item Sengundo punto de la introducción&lt;br /&gt;\item y el tercero&lt;br /&gt;\end{itemize}&lt;br /&gt;&lt;br /&gt;\end{frame}&lt;br /&gt;&lt;br /&gt;\end{document}&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Para entender un poco más de latex, hay que identificar algunos elementos de sintaxis. El primer elemento y el más sencillo de entender es % que son comentarios. El resto de los elementos podemos identificar secciones empiezan con \begin y terminan con \end, y el nombre de las secciones se encuentran entre llaves "{}".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-2145168578330270931?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/2145168578330270931/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2008/08/presentaciones-con-latex-parte-i.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/2145168578330270931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/2145168578330270931'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2008/08/presentaciones-con-latex-parte-i.html' title='Presentaciones con Latex (Parte I)'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4927520572942889675.post-601516938850709385</id><published>2008-03-18T16:27:00.000-03:00</published><updated>2008-03-19T10:05:26.425-03:00</updated><title type='text'>Cómo cambiar contenidos de archivos con el SED</title><content type='html'>El sed es una de las herramientas de edición basadas en "corrientes" de caracteres. ¿Qué es eso?&lt;br /&gt;Bue, una aplicación que es capaz de modificar archivos en batch de forma muy sencilla. ¿Y a quien le gustaría hacer eso? Quienes necesiten editar gran cantidad de archivos con alguna tarea repetitiva ¿Cómo cual? Y cambiar una palabra en todos los archivos que están en un directorio. Y éste pequeño tutorial es para mostrar cómo realizar esta tarea. Aquí vamos.&lt;br /&gt;&lt;blockquote&gt;Nota 1: Si eres usuario de windows, te recomiendo bajarte el &lt;a href="http://www.cygwin.com/"&gt;cygwin&lt;/a&gt; donde podrás encontrar esta herramienta y muchas más. Todas gratuitas... o mejor dicho: libres!&lt;/blockquote&gt;&lt;blockquote&gt;Nota 2: Antes de empezar quisiera advertirte que si nunca oíste hablar de "expresiones regulares" te recomiendo que leas algo en la red. Podrías buscar una descripción en &lt;a href="http://es.wikipedia.org/wiki/Expresiones_regulares"&gt;Wikipedia&lt;/a&gt;.&lt;/blockquote&gt;Vamos por pasos, primero definimo la expresión regular que describirá la modificación que queremos realizar en cada uno de los archivos. En éste caso queremos cambiar la palabra "librería" por "biblioteca". Eso en expresiones regulares puede escribirse como: &lt;blockquote style="font-family: courier new;"&gt;s/librería/biblioteca/ &lt;/blockquote&gt;Y puede ejecutarse con el siguiente comando de sed:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;sed -e 's/librería/biblioteca/' MiArchivo&lt;/blockquote&gt;Eso es lo fácil, ahora hay que modificar el archivo, porque ésto solo va a devolver en la consola el archivo modificado. Y nada de redireccionar la salida directamente a 'MiArchivo' porque perderás tu querido archivo. Lo mejor es usar un archivo temporal:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;sed -e 's/librería/biblioteca/' MiArchivo &gt; $$.tmp ; mv $$.tmp MiArchivo&lt;/blockquote&gt;Si lo que nos gustaría hacer es modificar todos los archivos dentro de un directorio hay que utilizar la herramienta find que nos permitirá ejecutar un comando a cada archivo. El problema que tenemos aquí es que hay dos comandos a ejecutar y escribir esto en el find es un tanto complicado, con lo que una excelente opción es escribir un sencillo script que nos resolverá futuros problemas:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;#!/bin/bash&lt;br /&gt;#-- recomiendo almacenar el archivo en ~/bin/overwrite&lt;br /&gt;#-- darle permisos de ejecución con chmod +x ~/bin/overwrite&lt;br /&gt;#-- y agregar a ~/bin a la variable PATH con&lt;br /&gt;#-- echo export PATH=$PATH:~/bin &gt;&gt; ~/.bashrc&lt;br /&gt;#-- Salir de la seción y volver a entrar para que los comandos&lt;br /&gt;#-- almacenados en el directorio ~/bin puedan ejecutarse sin&lt;br /&gt;#-- hacer malavares con los nombres de directorios.&lt;br /&gt;&lt;br /&gt;file=$1&lt;br /&gt;shift&lt;br /&gt;$* &lt; $file &gt; /tmp/$$.tmp&lt;br /&gt;chmod --reference=$file /tmp/$$.tmp&lt;br /&gt;chown --reference=$file /tmp/$$.tmp&lt;br /&gt;mv /tmp/$$.tmp $file&lt;/blockquote&gt;Este nuevo comando nos va a permitir ejecutar el mismo comando sed pero mucho más corto&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;overwrite MiArchivo sed -e 's/librería/biblioteca/'&lt;/blockquote&gt;Ahora la modificación de archivos dentro de un directorio se puede hacer fácilmente con el comando find de la siguiente manera:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;find ./ -type f -exec overwrite {} sed -e 's/librería/biblioteca/' \;&lt;br /&gt;&lt;/blockquote&gt;Ésto ejecuta el comando a todos los archivos, que no son directorios y otras cosas raras, que se encuentran en directorio local y todos sus hijos. Notar el {} que es una macro del nombre del archivo donde ejecutar el comando, y el \; indica el fin del comando.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4927520572942889675-601516938850709385?l=cristiansrocha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cristiansrocha.blogspot.com/feeds/601516938850709385/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://cristiansrocha.blogspot.com/2008/03/cmo-cambiar-contenidos-de-archivos-con.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/601516938850709385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4927520572942889675/posts/default/601516938850709385'/><link rel='alternate' type='text/html' href='http://cristiansrocha.blogspot.com/2008/03/cmo-cambiar-contenidos-de-archivos-con.html' title='Cómo cambiar contenidos de archivos con el SED'/><author><name>Cristian Sebastian Rocha</name><uri>https://profiles.google.com/108784463064291955425</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-vW39ayXBLg8/AAAAAAAAAAI/AAAAAAAACV0/TuwrDjr7Yeo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
